这道题其实问的是,当大模型需要跟外部工具交互时,我们到底是在哪个层面做这件事。[[MCP]] 和 [[Function Calling]] 本质上是两个不同层级的方案:MCP 是应用层的开放协议,像 AI 世界的 USB-C 接口,标准化、可插拔;而 Function Calling 是模型层的原生能力,更像内置工具箱,简单直接但各玩各的。
具体说一下架构。MCP 走的是 Client-Server 模式,Host 比如 Claude Desktop 通过 Client 跟 Server 通信,Server 可以动态暴露自己的能力,通过 tools/list 这样的接口让客户端发现。好处是工具提供方和 AI 应用方可以解耦,Server 热更新,客户端不用重启。而 Function Calling 是把工具 schema 直接塞进 prompt,模型输出结构化调用指令,没有额外服务层,延迟更低,但工具定义跟模型推理是紧耦合的。你换个模型,schema 语法可能就变了,得重新适配。
再来看功能特性。MCP 最大的优势是跨模型兼容,你实现一个 MCP Server,各个模型都能用,社区已经有很多现成的,比如 GitHub、Slack 的官方 MCP。而且支持运行时动态发现工具,增减不用改代码。Function Calling 的优势是简单直接,延迟少一跳,调试也方便,直接在模型厂商的 playground 就能测。但它的工具生态是割裂的,你得为每个模型单独实现,或者依赖平台封装。
说到场景选型,这里有个清晰的分界线。如果你的场景是多 [[Agent]] 协作,工具需要被多个模型复用,或者工具提供方跟 AI 应用方是不同团队,那 MCP 是更合适的选择,因为它明确了边界。反过来,如果你追求极致延迟,比如车载语音助手,或者工具少且固定,深度绑定单一厂商,那 Function Calling 更合适。
但真正落地时,这两者往往不是二选一,而是结合。举个例子,一个电商客服系统,你需要调用订单查询、退款、物流多个工具,可能底层用 Function Calling 触发模型决策,但上层用 MCP 把这些工具包装成标准接口,这样模型切换时不用改工具层,也方便接入第三方服务。
这里有个坑,就是 MCP 会引入额外的网络或进程通信延迟,对毫秒级响应的场景不友好。而且如果 MCP Server 不稳定,整个链路会断。上线前我会特别关注 Server 的可用性和超时策略,必要时做缓存或降级。反过来,Function Calling 虽然快,但容易锁定厂商,哪天你想换模型,工具适配成本很高。
所以我的判断是,MCP 更适合做工具层的标准化封装,而 Function Calling 更适合做模型触发的内联决策。有个值得深入的点是,当 MCP 和 Function Calling 结合时,MCP 的标准输出怎么跟不同模型的 Function Calling schema 对齐?这其实是个协议转换的工程问题,处理不好会引入额外复杂度。
总的来说,我更倾向于把 MCP 看成基础设施,Function Calling 看成能力入口,两者配合使用。如果团队有长期生态建设需求,我会优先推 MCP;如果只是快速验证原型,Function Calling 就够了。