MCP 是 Anthropic 推出的开放标准,目标是统一大型语言模型与外部数据源、工具的通信。资料中反复出现的核心概念包括 MCP 主机、MCP 客户端和 MCP 服务器;传输方式分为 stdio 与 sse 两类,其中 stdio 更常用。对 AI Agent 系统而言,这意味着工具不再只是绑定在某个模型或某个应用里的函数声明,而是可以被独立封装、复用和治理的协议端点。资料还提到,MCP 能降低 Agent 迁移成本、提高插件复用性,并带来“一次接入,处处可用”的效果。需要区分的是,这些是资料给出的定位;具体到多服务器服务发现、通信治理,资料没有给出完整规范,本文后半部分属于工程分析。
一、从 Function Calling 到 MCP 的架构差异
Function Calling 的常见做法是:在模型请求里声明工具名称、参数 schema 和描述,模型返回调用意图,应用侧执行函数并回填结果。它足够直接,但工具定义与模型平台、应用代码耦合较深。资料中的对比指出,MCP 通过统一协议降低接入成本。工程上可以这样理解:Function Calling 是“模型侧的调用约定”,MCP 是“工具侧的接入协议”。MCP 客户端负责连接服务器、发现工具、转发调用;MCP 服务器负责真正执行工具并返回结果;主机则是承载 Agent 与多个客户端的应用。
迁移时不必把 Function Calling 全部推翻。更现实的做法是保留模型侧的工具调用能力,在应用内部把工具执行层替换为 MCP 客户端。这样模型仍然看到工具描述,但实际执行走 MCP 协议,获得复用与解耦收益。
二、迁移路径:把现有工具包装成 MCP Server
第一步是盘点。列出当前 Function Calling 中每个工具的名称、参数、返回值、副作用、鉴权方式和调用频率。重点标记有副作用、涉及敏感数据、需要人工确认的工具。
第二步是抽象能力边界。不要简单把内部 CRUD 接口全部暴露成 MCP 工具;应按 Agent 任务封装成更高层的操作,减少工具数量和参数复杂度。
第三步是选择传输。资料显示 MCP 分 stdio 和 sse 两类,常用 stdio。工程上,本地单机、生命周期随客户端启动的工具适合 stdio;需要跨客户端共享、远程部署的工具适合 sse。选择时还要考虑进程管理、网络鉴权和故障隔离。
第四步是实现 MCP Server。服务器需要暴露工具列表和调用入口。工程建议:优先无状态设计;有副作用的操作增加幂等键或二次确认;输出结构保持稳定,避免把调试日志混入协议通道。
第五步是在支持 MCP 的客户端中注册。资料提到可以通过 JSON 配置、uvx 指令拉起 MCP 服务,也提到 Claude Desktop、VS Code 通义灵码、Cherry Studio、Cursor 等使用场景。具体配置字段应以对应客户端文档为准,这里不展开。
第六步是灰度迁移。让 Function Calling 与 MCP 并行运行一段时间,对比工具选择、参数生成和执行结果;确认稳定后再切流,并保留回滚开关。
三、多 MCP 服务器:服务发现、通信与治理
当前资料没有给出多 MCP 服务器的服务发现规范,以下是工程分析。
服务发现方面,客户端需要维护服务器清单,并按能力或工具名建立索引。多个服务器可能暴露同名工具,建议在路由层加服务器前缀或命名空间,避免歧义。工具描述要精炼,否则工具过多会推高模型选择难度。
通信方面,stdio 服务器要管理子进程生命周期,防止启动失败、崩溃后僵尸进程、标准输出污染协议;sse 服务器要处理网络抖动、重连、鉴权过期和证书问题。统一超时、重试、熔断和限流是必要的,但重试只适用于幂等操作。
治理方面,至少包括最小权限、鉴权、审计、工具白名单和危险操作确认。MCP 服务器如果继承了过高权限,可能被提示注入诱导执行危险动作。建议按服务器隔离权限,记录每次工具调用的输入、输出和调用方,并对文件、网络、数据库等资源设置边界。
路由方面,可以由 Agent 根据工具描述选择,也可以由路由器按规则决定。工程上建议先规则后模型:高频、关键路径用显式路由,长尾工具再交给模型选择。
四、边界条件与失败模式
常见失败包括:stdio 进程启动失败或中途退出;sse 连接断开;工具 schema 漂移导致参数不匹配;多个服务器工具名冲突;权限过大导致越权;工具输出过大撑爆上下文。应对方式包括:健康检查、超时与熔断、schema 版本管理、工具名命名空间、输出截断和分页。迁移期间还要注意双跑带来的重复副作用,必须用幂等键或人工确认兜底。
五、工程取舍
MCP 的统一协议降低了工具接入成本,提高了插件复用性,但引入了客户端、服务器和传输层,治理复杂度上升。stdio 简单、低延迟,适合本地工具;sse 便于共享,但需要网络与安全设计。迁移不必一次到位,可以先从跨客户端复用价值高的工具开始,保留 Function Calling 作为降级路径。最终目标不是消灭 Function Calling,而是让工具集成从模型绑定转向协议绑定,使 Agent 架构更可扩展、更可治理。