大模型集成遠程MCP服務,通常是指讓本地的大模型應用(如OpenAI、Qwen等)能夠自動調(diào)用遠程的MCP(Multi-Component Platform,多組件平臺)服務,實現(xiàn)多輪對話和多函數(shù)自動調(diào)用。下面我將詳細解釋其實現(xiàn)原理和步驟,并給出簡明的實現(xiàn)流程。
一、核心思路
- 本地注冊遠程MCP服務:將遠程MCP服務以“函數(shù)”形式注冊到本地大模型的函數(shù)調(diào)用系統(tǒng)中。
- 自動多輪調(diào)用:大模型根據(jù)用戶輸入,自動決定調(diào)用本地函數(shù)還是遠程MCP服務,并能多輪交互。
- 支持多種遠程協(xié)議:如SSE(Server-Sent Events)和HTTP,適配不同的MCP服務端實現(xiàn)。
二、實現(xiàn)步驟
1. 定義遠程MCP服務的注冊方法
在 MCPMultiFunctionCaller 類中,register_remote_mcp_server 方法用于注冊遠程MCP服務。
核心參數(shù)包括服務名、URL、服務類型(如sse或http),以及參數(shù)描述。
def register_remote_mcp_server(self, name: str, url: str, server_type: str = "sse", ...):
...
def remote_func(input: str, **kwargs):
if server_type == "sse":
return asyncio.run(self._call_sse(url, input))
else:
return self._call_http(url, input)
...
self.functions[name] = FunctionDefinition(
name=name,
description=func_description,
parameters=parameters,
function=remote_func,
is_remote=True
)
2. 實現(xiàn)遠程調(diào)用邏輯
-
SSE協(xié)議:通過
aiohttp異步流式讀取遠程服務返回的數(shù)據(jù)。 -
HTTP協(xié)議:通過
requests直接POST請求獲取結果。
async def _call_sse(self, url: str, input_text: str) -> str:
async with aiohttp.ClientSession() as session:
async with session.post(url, json={"input": input_text}) as resp:
result = ""
async for line in resp.content:
...
return result or "遠程MCP服務無返回"
3. 在主流程中注冊遠程MCP服務
caller.register_remote_mcp_server(
name="12306-mcp",
url="https://mcp.api-inference.modelscope.net/xxxxxxxxxxxx/sse",
server_type="sse"
)
4. 多輪對話與自動函數(shù)調(diào)用
mcp_chat 方法會自動根據(jù)大模型的輸出,決定調(diào)用本地函數(shù)還是遠程MCP服務,并將結果反饋給大模型,支持多輪自動調(diào)用。
三、典型調(diào)用流程圖

image.png
四、常見問題與注意事項
- 參數(shù)格式:遠程MCP服務的參數(shù)需與本地注冊時的參數(shù)描述一致。
- 異步與同步:SSE通常為異步調(diào)用,需注意事件循環(huán)的管理。
-
多輪調(diào)用次數(shù):可通過
max_rounds控制最大多輪調(diào)用次數(shù),防止死循環(huán)。 - 錯誤處理:需對遠程服務異常、超時等情況做容錯處理。
五、總結
只需三步即可集成遠程MCP服務到大模型應用:
- 用
register_remote_mcp_server注冊遠程服務; - 在對話流程中自動調(diào)用遠程服務;
- 處理好參數(shù)和返回值的格式。
如需擴展更多遠程服務,只需多次調(diào)用注冊方法即可。