大模型集成远程MCP服务

大模型集成远程MCP服务,通常是指让本地的大模型应用(如OpenAI、Qwen等)能够自动调用远程的MCP(Multi-Component Platform,多组件平台)服务,实现多轮对话和多函数自动调用。下面我将详细解释其实现原理和步骤,并给出简明的实现流程。


一、核心思路

  1. 本地注册远程MCP服务:将远程MCP服务以“函数”形式注册到本地大模型的函数调用系统中。
  2. 自动多轮调用:大模型根据用户输入,自动决定调用本地函数还是远程MCP服务,并能多轮交互。
  3. 支持多种远程协议:如SSE(Server-Sent Events)和HTTP,适配不同的MCP服务端实现。

二、实现步骤

1. 定义远程MCP服务的注册方法

MCPMultiFunctionCaller 类中,register_remote_mcp_server 方法用于注册远程MCP服务。
核心参数包括服务名、URL、服务类型(如ssehttp),以及参数描述。

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

四、常见问题与注意事项

  1. 参数格式:远程MCP服务的参数需与本地注册时的参数描述一致。
  2. 异步与同步:SSE通常为异步调用,需注意事件循环的管理。
  3. 多轮调用次数:可通过 max_rounds 控制最大多轮调用次数,防止死循环。
  4. 错误处理:需对远程服务异常、超时等情况做容错处理。

五、总结

只需三步即可集成远程MCP服务到大模型应用:

  1. register_remote_mcp_server 注册远程服务;
  2. 在对话流程中自动调用远程服务;
  3. 处理好参数和返回值的格式。

如需扩展更多远程服务,只需多次调用注册方法即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容