大模型集成远程MCP服务,通常是指让本地的大模型应用(如OpenAI、Qwen等)能够自动调用远程的MCP(Multi-Component Platform,多组件平台)服务,实现多轮对话和多函数自动调用。下面我将详细解释其实现原理和步骤,并给出简明的实现流程。
一、核心思路
- 本地注册远程MCP服务:将远程MCP服务以“函数”形式注册到本地大模型的函数调用系统中。
- 自动多轮调用:大模型根据用户输入,自动决定调用本地函数还是远程MCP服务,并能多轮交互。
- 支持多种远程协议:如SSE(Server-Sent Events)和HTTP,适配不同的MCP服务端实现。
二、实现步骤
1. 定义远程MCP服务的注册方法
在 MCPMultiFunctionCaller 类中,register_remote_mcp_server 方法用于注册远程MCP服务。
核心参数包括服务名、URL、服务类型(如sse或http),以及参数描述。
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. 实现远程调用逻辑
-
SSE协议:通过
aiohttp异步流式读取远程服务返回的数据。 -
HTTP协议:通过
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. 多轮对话与自动函数调用
mcp_chat 方法会自动根据大模型的输出,决定调用本地函数还是远程MCP服务,并将结果反馈给大模型,支持多轮自动调用。
三、典型调用流程图

image.png
四、常见问题与注意事项
- 参数格式:远程MCP服务的参数需与本地注册时的参数描述一致。
- 异步与同步:SSE通常为异步调用,需注意事件循环的管理。
-
多轮调用次数:可通过
max_rounds控制最大多轮调用次数,防止死循环。 - 错误处理:需对远程服务异常、超时等情况做容错处理。
五、总结
只需三步即可集成远程MCP服务到大模型应用:
- 用
register_remote_mcp_server注册远程服务; - 在对话流程中自动调用远程服务;
- 处理好参数和返回值的格式。
如需扩展更多远程服务,只需多次调用注册方法即可。