news 2026/3/4 5:32:45

FastMCP高级特性之Proxy Servers(代理服务)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastMCP高级特性之Proxy Servers(代理服务)

概述

FastMCP的代理,就是给其他 MCP 服务器当个中间人,转发请求&转发响应。

FastMCP 提供了强大的代理功能,使得一个 FastMCP 服务器实例可以作为另一个 MCP 服务器(该服务器可以是远程的、运行在不同传输协议上的,甚至可以是另一个 FastMCP 实例)的前端。

这是通过 FastMCP.as_proxy () 类方法实现的。

一、什么是代理

代理是指设置一个 FastMCP 服务器,该服务器不直接实现工具或资源。相反,当它收到请求(如tools/callresources/read)时,会将该请求转发给其它 MCP 服务器,并接收响应,然后将该响应回复给原始客户端。

主要优势

  • 会话隔离:每个请求都有自己的独立会话,确保并发操作的安全性
  • 传输桥接:通过不同的传输方式暴露在一种传输方式上运行的服务器
  • 高级 MCP 功能:自动转发采样、启发、日志记录和进度信息
  • 安全性:充当后端服务器的受控网关
  • 简洁性:即使后端位置或传输方式发生变化,也只需单一端点

性能考量
使用代理服务器时,尤其是连接到基于 HTTP 的后端服务器时,要注意延迟可能会很显著。
list_tools ()这样的操作可能需要数百毫秒,而本地工具只需 1-2 毫秒。
挂载代理服务器时,这种延迟会影响父服务器上的所有操作,而不仅仅是与被代理工具的交互。
如果你的使用场景要求低延迟,可以考虑在启动时使用import_server ()来复制工具,而不是在运行时对它们进行代理。

二、快速开始

创建代理的推荐方式是使用 ProxyClient,它提供完整的 MCP 功能支持,并具有自动会话隔离功能:
后端服务(as_proxy_backend_server.py")
必须以标准输入输出模式启动,代理时才可以使用ProxyClient("as_proxy_backend_server.py")。

# coding=utf-8''' @File :proxy_mcp.py @Author :juxuan2 @Date :2025/12/17 14:49 '''fromfastmcpimportFastMCPimportasyncio# Define subserversweather_mcp=FastMCP(name="WeatherService")@weather_mcp.tooldefget_forecast(city:str)->dict:"""Get weather forecast."""return{"city":city,"forecast":"Sunny"}@weather_mcp.resource("data://cities/supported")deflist_supported_cities()->list[str]:"""List cities with weather support."""return["London","Paris","Tokyo"]# Define main servermain_mcp=FastMCP(name="MainApp")# Import subserverasyncdefsetup():awaitmain_mcp.import_server(weather_mcp,prefix="weather")# Result: main_mcp now contains prefixed components:# - Tool: "weather_get_forecast"# - Resource: "data://weather/cities/supported"if__name__=="__main__":asyncio.run(setup())main_mcp.run()

代理服务(as_proxy_mcp_server.py)

# coding=utf-8''' @File :proxy_mcp_client2.py @Author :juxuan2 @Date :2025/12/17 15:45 '''fromfastmcpimportFastMCPfromfastmcp.server.proxyimportProxyClient# Create a proxy with full MCP feature supportproxy=FastMCP.as_proxy(ProxyClient("as_proxy_backend_server.py"),name="MyProxy")# Run the proxy (e.g., via stdio for Claude Desktop)if__name__=="__main__":proxy.run(transport="http",# 使用HTTP传输host="127.0.0.1",# 绑定本地地址,外部访问可改为 0.0.0.0port=8000,# 服务端口)

客户端服务(as_proxy_mcp_client.py)

importasynciofromfastmcpimportClient client=Client("http://localhost:8000/mcp")asyncdefcall():asyncwithclient:result=awaitclient.call_tool("weather_get_forecast",{"city":"西安"})print(result)result=awaitclient.read_resource("data://weather/cities/supported")print(result)asyncio.run(call())

一次配置、全程受用

  • 安全的并发请求处理
  • 高级 MCP 功能(采样、启发等)的自动转发
  • 防止上下文混合的会话隔离
  • 与所有 MCP 客户端的完全兼容性

您还可以将 FastMCP 客户端传输(或可推断为传输的参数)传递给as_proxy ()。这将自动为您创建一个 ProxyClient 实例。

最后,您可以将常规的 FastMCP 客户端实例传递给as_proxy ()。这适用于许多使用场景,但如果服务器调用了采样或启发等高级 MCP 功能,可能会出现问题。

三、会话隔离与并发

FastMCP 代理提供会话隔离,以确保安全的并发操作。会话策略取决于代理的配置方式:

Fresh Sessions
当你传递一个断开连接的客户端(这是正常情况)时,每个请求都会获得自己独立的后端会话:

fromfastmcp.server.proxyimportProxyClient# Each request creates a fresh backend session (recommended)proxy=FastMCP.as_proxy(ProxyClient("backend_server.py"))# Multiple clients can use this proxy simultaneously without interference:# - Client A calls a tool -> gets isolated backend session# - Client B calls a tool -> gets different isolated backend session# - No context mixing between requests

Session Reuse with Connected Clients
当你传递一个已连接的客户端时,代理将为所有请求重用该会话:

fromfastmcpimportClient# Create and connect a clientasyncwithClient("backend_server.py")asconnected_client:# This proxy will reuse the connected session for all requestsproxy=FastMCP.as_proxy(connected_client)# ⚠️ Warning: All requests share the same backend session# This may cause context mixing in concurrent scenarios

重要提示:在多个客户端并发请求时使用共享会话可能会导致上下文混淆和竞争条件。这种方法仅应在单线程场景中使用,或者在你有明确同步机制的情况下使用。

四、桥接传输

一个常见的用例是桥接传输 —— 通过不同的传输方式暴露在一种传输方式上运行的服务器。

例如,通过标准输入输出使远程的 SSE 服务器在本地可用:

fromfastmcpimportFastMCPfromfastmcp.server.proxyimportProxyClient# Bridge remote SSE server to local stdioremote_proxy=FastMCP.as_proxy(ProxyClient("http://example.com/mcp/sse"),name="Remote-to-Local Bridge")# Run locally via stdio for Claude Desktopif__name__=="__main__":remote_proxy.run()# Defaults to stdio transport

或者通过 HTTP 暴露本地服务器以进行远程访问:

# Bridge local server to HTTPlocal_proxy=FastMCP.as_proxy(ProxyClient("local_server.py"),name="Local-to-HTTP Bridge")# Run via HTTP for remote clientsif__name__=="__main__":local_proxy.run(transport="http",host="0.0.0.0",port=8080)

五、高级MCP特性

ProxyClient 会自动在后端服务器和连接到代理的客户端之间转发高级 MCP 协议功能,确保完全的 MCP 兼容性。
支持的功能

  • 根目录:将文件系统根目录访问请求转发给客户端
  • 采样:将大语言模型补全请求从后端转发给客户端
  • 启发:将用户输入请求转发给客户端
  • 日志记录:将日志消息从后端转发至客户端
  • 进度:在长时间操作期间转发进度通知
fromfastmcp.server.proxyimportProxyClient# ProxyClient automatically handles all these featuresbackend=ProxyClient("advanced_backend.py")proxy=FastMCP.as_proxy(backend)# When the backend server:# - Requests LLM sampling -> forwarded to your client# - Logs messages -> appear in your client# - Reports progress -> shown in your client# - Needs user input -> prompts your client

5.1 自定义功能支持

你可以通过为特定处理器传递 None 来有选择地禁用转发:

# Disable sampling but keep other featuresbackend=ProxyClient("backend_server.py",sampling_handler=None,# Disable LLM sampling forwardinglog_handler=None# Disable log forwarding)

当你直接将传输字符串与FastMCP.as_proxy ()一起使用时,它会在内部自动创建一个ProxyClient,以确保全面的功能支持。

六、基于配置的代理

你可以直接根据遵循 MCPConfig 模式的配置字典创建代理。这对于快速设置连接远程服务器的代理非常有用,无需手动配置每个连接细节。

fromfastmcpimportFastMCP# Create a proxy directly from a config dictionaryconfig={"mcpServers":{"default":{# For single server configs, 'default' is commonly used"url":"https://example.com/mcp","transport":"http"}}}# Create a proxy to the configured server (auto-creates ProxyClient)proxy=FastMCP.as_proxy(config,name="Config-Based Proxy")# Run the proxy with stdio transport for local accessif__name__=="__main__":proxy.run()

MCPConfig 格式遵循一种新兴的 MCP 服务器配置标准,并且可能会随着该规范的成熟而发展。尽管 FastMCP 旨在保持与未来版本的兼容性,但请注意,字段名称或结构可能会发生变化。

6.1 多服务器配置

你可以通过在配置中指定多个条目来创建一个指向多个服务器的代理。这些条目会自动以其配置名称作为前缀进行挂载:

# Multi-server configurationconfig={"mcpServers":{"weather":{"url":"https://weather-api.example.com/mcp","transport":"http"},"calendar":{"url":"https://calendar-api.example.com/mcp","transport":"http"}}}# Create a unified proxy to multiple serverscomposite_proxy=FastMCP.as_proxy(config,name="Composite Proxy")# Tools, resources, prompts, and templates are accessible with prefixes:# - Tools: weather_get_forecast, calendar_add_event# - Prompts: weather_daily_summary, calendar_quick_add# - Resources: weather://weather/icons/sunny, calendar://calendar/events/today# - Templates: weather://weather/locations/{id}, calendar://calendar/events/{date}

组件前缀

  • 代理一个或多个服务器时,组件名称的前缀方式与挂载和导入时相同:
  • 工具:{prefix}_{tool_name}
  • 提示词:{prefix}_{prompt_name}
  • 资源:protocol://{prefix}/path/to/resource(默认路径格式)
  • 资源模板:protocol://{prefix}/...

无论你处于以下哪种情况,这些规则都统一适用:

  • 在另一台服务器上挂载代理
  • 通过MCPConfig创建多服务器代理
  • 直接使用FastMCP.as_proxy ()

七、镜像组件

当你从代理服务器访问工具、资源或提示词时,它们是从远程服务器 “镜像” 过来的。镜像组件无法直接修改,因为它们反映的是远程服务器的状态。例如,你不能简单地 “禁用” 一个镜像组件。

不过,你可以创建一个镜像组件的副本,并将其存储为新的本地定义组件。本地组件总是优先于镜像组件,因为代理服务器在尝试连接远程服务器之前,会先检查自己的注册表。

因此,要启用或禁用代理工具、资源或提示词,你应该先创建一个本地副本并将其添加到你自己的服务器中。以下是针对工具执行此操作的示例:

# Create your own servermy_server=FastMCP("MyServer")# Get a proxy serverproxy=FastMCP.as_proxy("backend_server.py")# Get mirrored components from proxymirrored_tool=awaitproxy.get_tool("useful_tool")# Create a local copy that you can modifylocal_tool=mirrored_tool.copy()# Add the local copy to your servermy_server.add_tool(local_tool)# Now you can disable YOUR copylocal_tool.disable()

八、FastMCPProxy类

在内部,FastMCP.as_proxy ()会使用FastMCPProxy类。通常情况下,你无需直接与此类进行交互,但如果有高级场景需要,它是可以使用的。

fromfastmcp.server.proxyimportFastMCPProxy,ProxyClient# Provide a client factory for explicit session controldefcreate_client():returnProxyClient("backend_server.py")proxy=FastMCPProxy(client_factory=create_client)

参数

  • client_factory:一个可调用对象,调用时会返回一个 Client 实例。这使你能够完全控制会话的创建和重用策略。

8.1 显式会话管理

FastMCPProxy需要明确的会话管理 —— 不会执行自动检测。你必须选择你的会话策略:

# Share session across all requests (be careful with concurrency)shared_client=ProxyClient("backend_server.py")defshared_session_factory():returnshared_client proxy=FastMCPProxy(client_factory=shared_session_factory)# Create fresh sessions per request (recommended)deffresh_session_factory():returnProxyClient("backend_server.py")proxy=FastMCPProxy(client_factory=fresh_session_factory)

对于自动会话策略选择,请改用便捷方法 FastMCP.as_proxy ()。

# Custom factory with specific configurationdefcustom_client_factory():client=ProxyClient("backend_server.py")# Add any custom configuration herereturnclient proxy=FastMCPProxy(client_factory=custom_client_factory)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 3:13:39

弹窗遮罩不滚动背景?前端开发者必学的实战技巧(附完整方案)

弹窗遮罩不滚动背景?前端开发者必学的实战技巧(附完整方案)弹窗遮罩不滚动背景?前端开发者必学的实战技巧(附完整方案)当弹窗遇上滚动,页面“抖”得你心慌弹出遮罩与背景滚动冲突的底层原理主流…

作者头像 李华
网站建设 2026/3/4 2:06:54

新库上线 | CnOpenData中国财经报刊新闻文本数据

一、数据简介本数据库系统收录了来自国内37家主流财经及综合类报刊电子版的公开新闻文本数据,覆盖站点中文名、发文时间、板块名称、首标题、标题、尾标题、作者、图片、正文等关键字段,提供全面结构化的新闻内容。数据持续实时更新,截至2025…

作者头像 李华
网站建设 2026/3/4 2:58:50

新库上线 | CnOpenData 1989-2025.10月全球企业社会责任报告数据

一、数据简介C企业社会责任报告是企业将其履行社会责任的理念、战略及其经营活动在经济、社会、环境等维度产生的影响,定期向利益相关方进行披露的沟通方式。本数据库系统性地收集与整理了来自全球多家企业发布的此类报告,每条记录不仅包含详尽的报告元数…

作者头像 李华
网站建设 2026/2/28 14:28:22

AI Agent上下文管理革命:从记忆碎片到智能连续体的技术突破

AI Agent上下文管理革命:从记忆碎片到智能连续体的技术突破 【免费下载链接】adk-python 一款开源、代码优先的Python工具包,用于构建、评估和部署灵活可控的复杂 AI agents 项目地址: https://gitcode.com/GitHub_Trending/ad/adk-python 在当今…

作者头像 李华
网站建设 2026/3/4 3:38:27

Valetudo扫地机器人选购终极指南:47款机型全解析

Valetudo扫地机器人选购终极指南:47款机型全解析 【免费下载链接】Valetudo Cloud replacement for vacuum robots enabling local-only operation 项目地址: https://gitcode.com/gh_mirrors/va/Valetudo 还在为扫地机器人的云服务限制和隐私问题烦恼吗&…

作者头像 李华