快速手搓一个MCP服务指南(八):FastMCP 代理服务器:构建灵活的 MCP 服务中介层

在分布式系统和微服务架构日益普及的今天,服务间的通信与集成变得至关重要。FastMCP 从 2.0.0 版本引入的代理服务器功能,为 MCP (Model Context Protocol) 生态提供了强大的服务中介能力。本文将深入解析 FastMCP 代理服务器的核心概念、应用场景与实践方法,帮助开发者构建更灵活、更具扩展性的 MCP 服务架构。

代理服务器核心概念与价值

什么是 MCP 代理服务器

FastMCP 代理服务器是一种特殊的 MCP 服务器实例,它不直接实现工具或资源,而是作为中介将接收到的请求转发给后端 MCP 服务器,并将响应回传给原始客户端。这种设计实现了服务的透明转发,使客户端无需关心后端服务的具体位置或传输协议。

代理服务器的核心工作流程如下:

  1. 接收客户端的 MCP 请求(如工具调用、资源读取)
  2. 将请求转发给配置的后端 MCP 服务器
  3. 接收后端服务器的响应
  4. 将响应中继回原始客户端

核心应用场景

1. 传输协议桥接

将运行在一种传输协议上的服务器通过另一种协议暴露,实现不同传输层的互联互通:

  • 将远程 SSE 服务器通过本地 Stdio 传输暴露给桌面应用
  • 将 HTTP 传输的服务器转换为 SSE 流模式
2. 功能增强层

在现有服务器前插入中间层,添加额外功能:

  • 缓存常用请求结果,提升响应速度
  • 统一日志记录与监控
  • 实现认证授权与请求过滤
  • 修改请求/响应数据格式
3. 安全边界控制

作为受控网关保护内部服务器:

  • 限制外部对内部服务的直接访问
  • 实现请求频率限制与流量监控
  • 过滤敏感操作或参数
4. 服务抽象与简化

提供统一稳定的端点,屏蔽后端服务的变化:

  • 后端服务器位置变更时不影响客户端配置
  • 聚合多个后端服务为统一接口
  • 简化客户端对多服务的调用复杂度

代理服务器的创建与基本用法

基于 as_proxy 方法的快速创建

FastMCP 提供了简洁的 FastMCP.as_proxy() 类方法用于创建代理服务器,支持多种后端配置方式:

from fastmcp import FastMCP# 方式1:通过后端服务器地址创建代理
proxy1 = FastMCP.as_proxy("backend_server.py",  # 后端服务器文件路径name="FileBackendProxy"
)# 方式2:通过远程URL创建代理(如HTTP/SSE服务器)
proxy2 = FastMCP.as_proxy("http://example.com/mcp/sse",  # 远程SSE服务器URLname="RemoteSSEProxy"
)# 方式3:通过已有的FastMCP实例创建内存代理
original_server = FastMCP(name="OriginalServer")@original_server.tool
def sample_tool() -> str:return "Sample Response"proxy3 = FastMCP.as_proxy(original_server,  # 内存中的FastMCP实例name="InMemoryProxy"
)

as_proxy 方法的内部实现逻辑:

  1. 使用提供的客户端连接到后端服务器
  2. 发现后端服务器的所有工具、资源、模板和提示
  3. 创建对应的"代理"组件,负责请求转发
  4. 返回标准的 FastMCP 服务器实例

传输协议桥接示例

以下示例展示了如何将远程 SSE 服务器通过本地 Stdio 传输暴露,实现传输协议的桥接:

from fastmcp import FastMCP# 创建代理,将远程SSE服务器桥接到本地Stdio
proxy = FastMCP.as_proxy("http://remote-server.com/mcp/sse",  # 远程SSE服务器URLname="SSEToStdioProxy"
)# 运行代理服务器,使用Stdio传输
if __name__ == "__main__":proxy.run()

客户端可以像连接普通本地服务器一样连接此代理,无需关心后端实际上是通过 SSE 协议通信的远程服务器。

基于配置字典的代理创建

从 2.4.0 版本开始,FastMCP 支持通过配置字典创建代理,简化多服务器配置:

from fastmcp import FastMCP# 单服务器配置
single_config = {"mcpServers": {"default": {"url": "https://api.example.com/mcp","transport": "http"}}
}proxy_single = FastMCP.as_proxy(single_config,name="SingleConfigProxy"
)# 多服务器配置
multi_config = {"mcpServers": {"weather": {"url": "https://weather-api.com/mcp","transport": "http"},"calendar": {"url": "https://calendar-api.com/mcp","transport": "http"}}
}proxy_multi = FastMCP.as_proxy(multi_config,name="MultiServiceProxy"
)

多服务器代理会自动将后端服务按配置名称添加前缀:

  • 天气服务工具:weather_get_forecast
  • 日历服务工具:calendar_add_event
  • 资源访问:weather://weather/icons/sunny

高级代理功能与定制

代理服务器的组件发现机制

代理服务器在启动时会主动发现后端服务器的所有组件,并在本地建立映射:

  1. 工具发现:获取所有工具的签名、描述和参数
  2. 资源发现:读取资源URI和访问方式
  3. 模板发现:获取参数化资源模板
  4. 提示发现:获取预定义的LLM提示词

这些信息会被缓存,客户端可以通过标准的发现接口(如list_tools)获取代理服务器的组件列表,就像访问本地服务器一样。

子类化 FastMCPProxy 实现自定义逻辑

对于需要更精细控制的场景,可以直接子类化 FastMCPProxy 类,重写请求转发前后的处理逻辑:

from fastmcp import FastMCP
from fastmcp.server.proxy import FastMCPProxyclass CustomProxy(FastMCPProxy):async def before_forward(self, request):"""请求转发前的预处理"""# 添加全局请求头request.headers["X-Proxy-Header"] = "FastMCP"# 记录请求日志print(f"[Proxy] Forwarding request: {request.method}")return requestasync def after_forward(self, response):"""响应接收后的后处理"""# 过滤响应中的敏感数据if "sensitive_data" in response.data:response.data["sensitive_data"] = "[REDACTED]"# 记录响应时间print(f"[Proxy] Received response in {response.elapsed_time}ms")return response# 使用自定义代理
backend_client = ...  # 后端客户端配置
custom_proxy = CustomProxy(backend=backend_client,name="CustomProcessingProxy"
)

代理服务器的限制与注意事项

当前版本的代理服务器主要支持核心 MCP 组件(工具、资源、模板、提示)的转发,以下功能尚未完全支持:

  • 完整的通知机制(Fire-and-Forget 请求)
  • LLM 采样功能的完整代理
  • 复杂的流处理场景

这些功能将在未来版本中逐步完善,使用时需注意当前限制。

实战案例:构建安全网关与服务聚合代理

案例1:构建带认证的安全代理网关

以下示例展示了如何创建一个带认证功能的代理网关,保护后端服务:

import httpx
from fastmcp import FastMCP
from fastmcp.client import Client# 配置认证信息的HTTP客户端
authenticated_client = Client("https://internal-server.com/mcp",transport="http",headers={"Authorization": "Bearer SECURE_TOKEN","X-Proxy-ID": "gateway-001"}
)# 创建带认证的代理服务器
security_proxy = FastMCP.as_proxy(authenticated_client,name="SecureGatewayProxy"
)# 添加请求过滤中间件
from fastmcp.server.middleware import Middleware, MiddlewareContextclass RequestFilterMiddleware(Middleware):async def on_call_tool(self, context: MiddlewareContext, call_next):# 禁止调用危险工具if context.message.name == "dangerous_tool":raise ValueError("Access to dangerous_tool is prohibited")return await call_next(context)security_proxy.add_middleware(RequestFilterMiddleware())# 运行安全代理网关
if __name__ == "__main__":security_proxy.run()

案例2:聚合多服务的统一代理

以下示例展示了如何创建一个聚合多个后端服务的统一代理:

from fastmcp import FastMCP# 多服务配置字典
multi_service_config = {"mcpServers": {"user_service": {"url": "https://user-api.com/mcp","transport": "http"},"order_service": {"url": "https://order-api.com/mcp","transport": "http"},"product_service": {"url": "https://product-api.com/mcp","transport": "http"}}
}# 创建聚合代理
aggregator_proxy = FastMCP.as_proxy(multi_service_config,name="ServiceAggregator"
)# 运行聚合代理,提供统一接口
if __name__ == "__main__":aggregator_proxy.run()

客户端可以通过统一接口访问不同服务:

  • 用户服务:user_service_get_profile
  • 订单服务:order_service_create_order
  • 产品服务:product_service_search

总结与最佳实践

代理服务器的核心优势

  1. 传输透明性:客户端无需关心后端服务的具体传输协议
  2. 架构灵活性:轻松实现服务的迁移与扩展
  3. 功能复用性:通过代理层添加通用功能而不修改后端服务
  4. 安全可控性:作为统一入口实现细粒度的安全控制

最佳实践建议

  1. 分层设计:按功能职责设计多层代理,如安全层、缓存层、聚合层
  2. 配置中心化:使用配置字典管理多服务代理,便于维护
  3. 监控与日志:在代理层添加全面的请求监控与日志记录
  4. 版本兼容:关注代理功能的版本更新,确保后端兼容性
  5. 限流与容错:在代理层实现请求限流与故障转移机制

未来发展方向

FastMCP 代理服务器将在后续版本中持续增强以下能力:

  • 完善对通知机制和采样功能的支持
  • 增加负载均衡与故障转移策略
  • 优化大规模服务聚合的性能
  • 增强代理层的请求转换与数据映射能力

通过 FastMCP 代理服务器,开发者能够构建更加灵活、可扩展的 MCP 服务架构,轻松实现服务间的通信与集成,为复杂应用场景提供强大的中介支持。无论是传输协议桥接、功能增强还是服务聚合,代理服务器都已成为现代 MCP 服务架构中不可或缺的重要组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912705.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20下安装SAMBA服务

1、安装Samba: 在 Ubuntu 上,打开终端,并运行以下命令以安装 Samba sudo apt update sudo apt install samba 2、配置共享目录 修改共享目录的权限,我的共享目录是samba_share sudo chmod -R 777 ./samba_share 创建Samba用户账号 sud…

Python 数据分析与机器学习入门 (一):环境搭建与核心库概览

Python 数据分析与机器学习入门 (一):环境搭建与核心库概览 本文摘要 本文是 Python 数据分析与机器学习入门系列的第一篇,专为初学者设计。文章首先阐明了 Python在数据科学领域的优势,然后手把手指导读者如何使用 Anaconda 搭建一个无痛、专…

编译UltraleapTrackingWebSocket

最近要在项目中用到 Leap Motion,无意中发现了一个 Go 语言的 Leap Motion 库: https://gobot.io/documentation/platforms/leapmotion/ 示例代码看起来很简单,但是要实际运行起来还需要一些条件。 在示例代码中,我们看到它连接…

[ linux-系统 ] 磁盘与文件系统

1.认识磁盘结构 机械键盘是计算机中唯一的机械设备,磁盘是外设,容量大,速度慢,价格便宜 物理结构: 磁头是一面一个,左右摆动,两个整体移动的,有磁头停靠点磁头和盘面不接触&#x…

Spring AI RAG

目录 Spring AI 介绍 Spring AI 组件介绍 Spring AI 结构化输出 Srping AI 多模态 Spring AI 本地Ollama Spring AI 源码 Spring AI Advisor机制 Spring AI Tool Calling Spring AI MCP Spring AI RAG Spring AI Agent 一、技术架构与核心流程‌ 检索增强生成 (RA…

深入Linux开发核心:掌握Vim编辑器与GCCG++编译工具链

文章目录 一、Vim:终端环境下的编辑艺术1.1 Vim设计哲学:模态编辑的终极实践1.2 高效导航:超越方向键的移动艺术1.3 定制化开发环境:从基础到专业IDE1.4 调试集成:Vim作为调试前端 二、GCC/G:Linux编译基石…

阿里云-spring boot接入arms监控

目标:在ecs中启动一个java应用,且携带arms监控 原理:在java应用启动时,同时启动一个agent探针,时刻监控java应用变化(如:接口调用、CPU、线程池状态等) 1.arms接入中心添加java应用…

昆泰芯3D霍尔磁传感器芯片在汽车零部件中的应用

HUD即抬头显示系统(Head-Up Display),HUD 是一种将重要的车辆或飞行等相关信息(如速度、导航指示、警告信息等)投射到驾驶员或操作员前方视野范围内的透明显示屏或直接投射到风挡玻璃上的技术。 HUD即抬头显示系统(Head-Up Display)&#xff…

new Vue() 的底层工作原理

当你调用 new Vue() 时,Vue.js 会执行一系列复杂的初始化过程。让我们深入剖析这个看似简单的操作背后发生的事情: 1. 初始化阶段 (1) 内部初始化 function Vue(options) {if (!(this instanceof Vue)) {warn(Vue is a constructor and should be cal…

最简安装SUSE15SP7导致大部分命令缺失

我嘞个去~~~明明选择Enable了ssh,结果也没给装。 俺习惯使用NetworkManager管理网络,没给装,用不了nmcli和nmtui。不高兴归不高兴,最简安装的话,也情有可原。我嘞个去去~~连ping、vi都没有装,这也太简了。…

Vue-14-前端框架Vue之应用基础嵌套路由和路由传参

文章目录 1 嵌套路由1.1 News.vue1.2 Detail.vue1.3 router/index.ts2 路由传参2.1 query参数2.1.1 News.vue(传递参数)2.1.2 Detail.vue(接收参数)2.2 params参数2.2.1 router/index.ts(需要提前占位)2.2.2 News.vue(传递参数)2.2.3 Detail.vue(接收参数)2.3 props配置2.3.1 r…

Python网安-ftp服务暴力破解(仅供学习)

目录 源码在这里 需要导入的模块 连接ftp,并设置密码本和线程 核心代码 设置线程 源码在这里 https://github.com/Wist-fully/Attack/tree/cracker 需要导入的模块 import ftplib from threading import Thread import queue 连接ftp,并设置密码…

ES6数组的`flat()`和`flatMap()`函数用法

今天给大家分享ES6中两个超实用的数组函数:flat()和flatMap(),学会它们能让数组处理变得更轻松! 1. flat()函数 1.1 基本介绍 flat()用于将嵌套数组"拍平",即将多维数组转换为一维数组。 1.2 语法 const newArray …

upload-labs靶场通关详解:第15-16关

第十五关 getimagesize函数验证 一、分析源代码 function isImage($filename){$types .jpeg|.png|.gif;if(file_exists($filename)){$info getimagesize($filename);$ext image_type_to_extension($info[2]);if(stripos($types,$ext)>0){return $ext;}else{return false…

【Linux】基础IO流

好的代码自己会说话,清晰的逻辑与优雅的结构,是程序员与世界对话的方式。 前言 这是我自己学习Linux系统编程的第五篇笔记。后期我会继续把Linux系统编程笔记开源至博客上。 上一期笔记是关于进程: 【Linux】进程-CSDN博客https://blog.csdn…

【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(二)

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为…

AD8021ARZ-REEL7【ADI】300MHz低噪声运放放大器,高频信号处理的性价比之选!

AD8021ARZ-REEL7(ADI)产品解析与推广文案 1. 产品概述 AD8021ARZ-REEL7 是 Analog Devices Inc.(ADI) 推出的一款 高速、低噪声运算放大器(Op-Amp),属于 ADI的高性能放大器系列,专为…

WPF学习笔记(11)数据模板DataTemplate与数据模板选择器DataTemplateSelector

数据模板DataTemplate与数据模板选择器DataTemplateSelector 一、DataTemplate1. DataTemplate概述2. DataTemplate详解 二、DataTemplateSelector1. DataTemplateSelector概述2. DataTemplateSelector详解 总结 一、DataTemplate 1. DataTemplate概述 DataTemplate 表示数据…

【V6.0 - 听觉篇】当AI学会“听”:用声音特征捕捉视频的“情绪爽点”

系列回顾: 在上一篇 《AI的“火眼金睛”:用OpenCV和SHAP洞察“第一眼缘”》 中,我们成功地让AI拥有了视觉,它已经能像一个严苛的“质检员”一样,评判我视频的画质和动态感。 但我的焦虑并没有完全消除。因为我发现&a…

(5)pytest-yield操作

1. 简介 上一篇中,我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要清除数据(或还原)操作,可以使用 yield 来实现。fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操…