New in version: 2.0.0

FastMCP提供强大的代理能力,允许一个FastMCP服务器实例作为另一个MCP服务器(可能是远程的、运行在不同传输协议上、甚至是另一个FastMCP实例)的前端。这一功能通过FastMCP.from_client()类方法实现。

什么是代理?

代理意味着设置一个不直接实现自身工具或资源的FastMCP服务器。当它收到请求(如tools/callresources/read)时,会将请求转发至后端MCP服务器,接收响应后再将该响应传回原始客户端。

使用场景

  • 传输桥接: 通过不同的传输方式(如本地Stdio用于Claude桌面版)暴露运行在一种传输方式上的服务器(如远程SSE服务器)。
  • 添加功能: 在现有服务器前插入一个层级,用于添加缓存、日志记录、身份验证,或修改请求/响应(但直接修改需要继承FastMCPProxy类)。
  • 安全边界: 将代理作为内部服务器的受控网关使用。
  • 简化客户端配置: 即使后端服务器的位置或传输方式发生变化,也能提供单一稳定的端点(代理)。

创建代理

创建代理的最简单方法是使用FastMCP.from_client()类方法。这会创建一个标准的FastMCP服务器,将请求转发到另一个MCP服务器。

from fastmcp import FastMCP, Client

# Create a client configured to talk to the backend server
# This could be any MCP server - remote, local, or using any transport
backend_client = Client("backend_server.py")  # Could be "http://remote.server/sse", etc.

# Create the proxy server with from_client()
proxy_server = FastMCP.from_client(
    backend_client,
    name="MyProxyServer"  # Optional settings for the proxy
)

# That's it! You now have a proxy FastMCP server that can be used
# with any transport (SSE, stdio, etc.) just like any other FastMCP server

from_client 的工作原理:

  1. 它使用提供的客户端连接到后端服务器。
  2. 它能发现后端服务器上所有可用的工具、资源、资源模板和提示词。
  3. 它会创建对应的"代理"组件,将请求转发到后端。
  4. 它返回一个标准的FastMCP服务器实例,可以像其他实例一样使用。

目前,代理功能主要侧重于暴露主要的MCP对象(工具、资源、模板和提示)。在当前版本中,代理尚未完全支持通知和采样等高级MCP功能。这些附加功能的支持可能会在未来的版本中添加。

桥接传输

一个常见的使用场景是桥接传输协议。例如,通过Stdio使远程SSE服务器在本地可用:

from fastmcp import FastMCP, Client

# Client targeting a remote SSE server
client = Client("http://example.com/mcp/sse")

# Create a proxy server - it's just a regular FastMCP server
proxy = FastMCP.from_client(client, name="SSE to Stdio Proxy")

# The proxy can now be used with any transport
# No special handling needed - it works like any FastMCP server

内存代理

你也可以代理一个内存中的FastMCP实例,这对于调整你无法完全控制的服务器配置或行为非常有用。

from fastmcp import FastMCP, Client

# Original server
original_server = FastMCP(name="Original")

@original_server.tool()
def tool_a() -> str: 
    return "A"

# To proxy an in-memory server, first create a Client to it.
client_to_original = Client(original_server)

# Create a proxy of the original server using the client.
proxy = FastMCP.from_client(
    client_to_original,
    name="Proxy Server"
)

# proxy is now a regular FastMCP server that forwards
# requests to original_server

FastMCPProxy

在内部,FastMCP.from_client()使用了FastMCPProxy类。通常您不需要直接与此类交互,但在需要时可以使用。

在高级场景中可能需要直接使用该类,例如继承FastMCPProxy以在转发请求前后添加自定义逻辑。