快速手搓一個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
英文地址,請注明出處:http://en.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作為用例之前前的操…