从Tool Calling到“AI时代USB-C”的底层逻辑
MCP,它的全称是Model Context Protocol,中文一般可以理解为“模型上下文协议”。如果只看名字,可能会觉得它又是一个很抽象的协议概念。但如果把它放到Agent工程化落地的语境里看,MCP其实非常具体。它想解决的问题很简单:AI应用到底应该用什么统一方式,去连接外部工具、数据源和业务系统?
以前我们做Agent,模型只是负责回答问题。现在不一样了,Agent需要查数据库、读文件、访问GitHub、调用搜索、操作浏览器、连接企业内部系统,甚至进一步执行自动化流程。
这时候问题就来了,每接一个工具,都手写一套适配? 每换一个模型,都重新做一遍集成? 每个Agent框架,都维护自己的一套工具协议?如果继续这样做,Agent系统很快就会变成一堆胶水代码。看起来功能很多,实际上每一处都脆弱,每一次迁移都痛苦。
MCP的出现,正是为了把这件事标准化。它不是一个新的大模型,也不是一个新的Agent框架,而是一套让AI应用连接外部世界的开放协议。官方文档里有一个非常形象的比喻:MCP就像AI应用的USB-C接口。USB-C让电脑可以用统一接口连接显示器、硬盘、充电器和各种外设;MCP则希望让AI应用用统一协议连接工具、数据和上下文。
这个比喻很妙,因为Agent真正缺的,从来不只是“大脑”,还缺一套可靠的“接口”。
Agent不缺想法,缺的是连接真实世界的方式
如果只是在聊天窗口里回答问题,大模型已经足够强了。 但Agent不一样,Agent不是只负责“说”,它还要“做”。
比如一个开发类Agent,可能需要读取项目目录、理解README、修改代码、运行测试、查看报错、继续修复。一个数据分析Agent,可能需要连接数据库、读取表结构、执行查询、生成图表、解释结果。一个企业办公Agent,可能需要访问文档、日历、工单、CRM、知识库和审批系统。
这就带来了一个很现实的问题:模型怎么知道自己能用哪些能力?怎么知道某个工具需要什么参数?怎么安全地访问外部数据?怎么避免不同工具之间互相污染上下文?
早期的做法通常比较粗暴:开发者自己把工具封装成函数,然后在模型侧声明这些函数。也就是我们熟悉的Tool Calling或Function Calling。这个方案当然有用,而且非常关键。它让模型不再只会输出文本,而是可以选择调用某个函数来完成具体动作。但Tool Calling解决的是“模型如何调用一个工具”, 它没有完整解决“工具生态如何被统一接入”,这两者差别很大。
Tool Calling解决了调用,MCP解决了连接
Tool Calling更像是在单个应用内部,给模型挂几个函数。 MCP更像是在应用和外部系统之间,定义一套通用连接协议。举个简单例子。
如果你自己做一个Agent,让它调用天气API、数据库API、GitHub API,你当然可以一个个封装工具。短期看没问题。但如果你有十几个Agent、几十个工具、多个模型供应商、多个运行环境,这套方式就会变得很难维护。
每个工具都要重复描述。 每个系统都要重新适配。 每个框架都要写一遍胶水代码。 权限、安全、上下文、日志也容易散落在各处。
MCP想做的,是把这些能力包装成标准化的MCP Server。AI应用不再直接和各种外部系统乱连,而是通过MCP Client与MCP Server通信。这样一来,工具、数据源、提示模板、上下文资源,都可以用相对统一的方式暴露给AI应用。MCP的架构本身就是Host、Client、Server这种分层模型,并基于JSON-RPC提供有状态会话能力。
所以,MCP不是要取代Tool Calling。 它更像是Tool Calling往工程化、生态化方向继续走了一步。Tool Calling让模型可以“伸手调用工具”。 MCP让工具可以“以标准方式接入Agent世界”。
MCP这套架构,核心其实并不复杂
理解MCP,不需要一开始就陷进协议细节里,它最核心的角色大概可以分成三类:
Host:承载AI应用的地方,比如一个桌面客户端、IDE、Agent平台、聊天应用。Client: Host里面负责和MCP Server通信的组件。Server:真正暴露能力的一端,比如文件系统服务、数据库服务、GitHub服务、浏览器服务、企业知识库服务。这套结构有点像你电脑上的应用和外设。
应用本身不需要知道每一种外设底层怎么实现,它只要通过统一协议去连接。MCP Server则负责把外部系统的能力整理好,告诉Agent:我这里有哪些资源,能提供哪些工具,可以使用哪些提示模板。这也是MCP里几个很重要的概念:
Tools:可以被模型调用的动作,比如查询数据库、创建issue、读取网页、执行搜索。Resources:可以提供上下文的数据,比如文件内容、数据库schema、项目文档、配置项。Prompts:可复用的提示模板或工作流入口,用来帮助模型以更稳定的方式完成某类任务。
Resources这一层尤其容易被忽略。很多人一谈MCP,只想到“接工具”。但对Agent来说,能不能拿到正确上下文,往往比能不能调用工具更重要。MCP的Resources允许Server以URI的方式暴露文件、数据库结构或应用相关信息,让模型不只是“能做事”,而是“知道基于什么信息做事”。
为什么说MCP是Agent架构里的关键拼图
我觉得MCP真正有价值的地方,不是它让某个Demo更酷,而是它把Agent架构里的一个关键问题拆出来了:外部能力应该如何被标准化接入?
在没有MCP之前,Agent系统里经常会出现几种混乱。
第一种是工具定义混乱。 同一个能力,在不同项目里被封装成不同工具,参数命名、返回格式、错误处理都不一样。
第二种是上下文来源混乱。 模型到底能看到哪些数据,哪些数据是实时的,哪些数据是从缓存来的,哪些数据需要权限,往往没有统一边界。
第三种是运行环境混乱。 某些工具能读文件,某些工具能执行命令,某些工具能访问远程服务。如果缺少统一治理,Agent很容易从“助手”变成一个权限过大的黑盒。
MCP至少提供了一个更清晰的方向:让外部能力以Server的形式被组织起来,让AI应用通过Client连接它们,让工具、资源、提示模板有统一的描述和交互方式。这也是为什么它和Agent系统架构关系很深。 一个成熟的Agent,不应该把所有能力都硬编码在自己体内。更合理的做法是:模型负责推理,Agent Runtime负责调度,MCP负责连接外部能力,权限和评估系统负责兜底。换句话说,MCP更像是Agent的“接口层”。 它不决定模型有多聪明,但它决定模型能不能稳定地接触真实系统。
“AI时代USB-C”这个比喻,哪里准确,哪里不准确
我很喜欢“AI时代USB-C”这个说法,因为它一下子抓住了MCP的核心价值:统一连接方式。
没有USB-C之前,各种设备有各种接口,转接头一堆,兼容性很差。USB-C普及之后,不同设备之间的连接成本明显下降。MCP想做的事情也类似:让AI应用不必为每个工具和数据源都重新发明一套连接方式。
但这个比喻也不能理解得太简单,USB-C连接的是硬件外设,而MCP连接的是工具、数据、权限和行为。后者复杂得多。因为Agent不是被动读取数据,它还可能执行动作;不是只接一个设备,而是可能同时接很多系统;不是所有调用都安全,有些工具一旦误用,可能直接造成数据泄露、误删文件、越权操作,甚至执行高风险命令。
所以,MCP像USB-C,但它不是一个“插上就完事”的接口。 它更像是一个带安全边界、权限治理和上下文管理要求的AI连接标准。
这也是很多人容易误解MCP的地方:以为装几个MCP Server,Agent就自动变强了。实际上,如果权限设计、工具描述、日志审计、调用确认都没做好,MCP反而会把风险放大。MCP官方安全实践也明确把授权、令牌校验、提示注入、工具投毒等问题列为实现时需要重点考虑的风险。
MCP对开发者意味着什么
从开发者角度看,MCP最大的变化,是把“写工具”这件事从单个Agent项目里抽出来,变成可以复用的服务。以前你为某个Agent写了一个GitHub工具,大概率只能在这个项目里用。换个框架、换个模型、换个客户端,可能又要重写。
有了MCP的思路以后,你更像是在写一个标准化能力服务。只要MCP Server设计得足够清晰,它就可以被不同Host接入,被不同Agent使用。这会带来几个很实际的变化。
第一,工具会更像基础设施。 数据库访问、文件读取、浏览器控制、代码仓库操作,这些能力不应该散落在每个Agent项目里,而应该被抽象成稳定服务。
第二,Agent开发会更关注编排。 开发者不必每次都从零封装工具,而是更多思考:当前任务应该接哪些Server?开放哪些Tools?暴露哪些Resources?哪些调用需要人工确认?
第三,企业内部系统更容易被Agent接入。 很多企业真正有价值的数据都在内部系统里。MCP的价值,不只是让Agent接互联网工具,更重要的是让它以更规范的方式接企业知识库、文档系统、工单系统、代码仓库和业务数据库。
这也解释了为什么MCP会和Agent落地强绑定。 因为Agent一旦走向生产,就一定会遇到外部系统集成问题。谁能把连接层做好,谁的Agent就更容易从玩具变成生产力工具。
但MCP不是万能药,它不能解决所有问题
MCP能解决“统一连接”的问题,但它不能自动解决所有工程问题。尤其是在安全和治理上,MCP只是提供协议基础,真正能不能安全落地,还要看实现者怎么设计。
比如工具权限。如果一个MCP Server暴露了删除文件、执行命令、访问数据库这类高风险能力,就必须有非常清楚的权限边界。不能因为模型“看起来理解了”,就默认它永远不会误调。
再比如工具描述。Agent很依赖工具描述来判断什么时候调用哪个工具。如果工具描述被污染,或者某个恶意Server伪装成正常工具,模型就可能被诱导去执行错误动作。这类问题不是传统API安全能完全覆盖的,因为攻击面已经进入了自然语言语义层。OWASP的MCP安全清单也提醒,不应盲目信任工具描述,不应在不展示完整参数的情况下自动批准工具调用,也不应让MCP Server拥有过大的主机权限。
还有供应链问题。MCP Server未来很可能会像插件一样被大量分发和安装。如果开发者随手装一个来源不明的Server,就等于把一个新执行入口接进了自己的Agent系统。这个入口能读什么、写什么、调用什么,都需要被审查。
所以,真正生产可用的MCP,不应该只是“能连上”。 更应该做到:可授权、可审计、可隔离、可回滚。
如果自己要做MCP,应该从哪里开始
如果你准备在项目里尝试MCP,我建议不要一上来就做很大的系统。我的建议是从更稳的路线、更低的风险能力开始。比如先做只读型Resources:项目文档、接口说明、数据库schema、日志摘要、配置说明。让Agent先获得更稳定的上下文,而不是马上给它开放写操作。
然后再逐步加入低风险Tools:查询状态、搜索文档、读取issue、获取构建结果。等调用链路、日志、权限、错误处理都跑顺了,再考虑更高风险的写操作,比如创建工单、提交代码、修改配置。对于高风险工具,最好默认加入人工确认。 尤其是涉及删除、支付、发消息、改权限、执行命令、写数据库这类动作,不要轻易全自动。
另外,MCP Server的返回结果也要设计好。不要只返回一段随意文本,而应该尽量结构化,让Agent更容易判断下一步。错误信息也应该可读、可恢复,不要把所有异常都变成“调用失败”。一个好的MCP Server,不只是“把API包了一层”。 它应该像一个面向Agent的产品:能力边界清楚,输入输出稳定,错误信息友好,权限模型明确,调用过程可追踪。
MCP和Harness Engineering的关系
如果你之前关注过Harness Engineering(可以看我之前的那篇文章一文讲透 Harness Engineering 的底层逻辑),那MCP很容易理解。
Harness Engineering讨论的是:如何给Agent搭一套可控、可验证、可恢复的外层工程系统。 MCP则更聚焦其中一块:如何把外部工具和上下文,以标准化方式接进这个系统。也就是说,Harness是更大的控制平面,MCP是连接层的一种关键协议。
没有Harness,MCP接进来的工具可能会失控。 没有MCP,Harness里的工具生态又容易变成一堆定制胶水。这两者不是竞争关系,而是互补关系。
如果说模型是Agent的大脑,Harness是它的控制系统,那么MCP就像它连接外部世界的神经接口。它负责让Agent不再只停留在对话框里,而是能进入真实系统、读取真实上下文、调用真实工具、完成真实任务。
最后聊聊我的判断
我觉得MCP之所以值得关注,不是因为它现在热,而是因为它踩中了Agent工程化的一个必然方向。未来的Agent不可能只靠一个聊天框解决所有问题。但它一定要连接代码仓库、知识库、数据库、浏览器、业务系统和企业内部工作流。连接越多,越需要统一协议;能力越强,越需要边界和治理。
所以MCP不是终点,但它很可能会成为Agent生态里一个非常重要的基础接口。从短期来看,它能减少重复集成。 从中期来看,它能推动工具生态标准化。 从长期来看,它可能会影响AI应用和外部系统的连接方式。
所以,“AI时代USB-C”这个比喻虽然有点传播味,但并不夸张。 因为AI真正走向生产之后,最缺的往往不是一个更会聊天的模型,而是一套能让模型安全、稳定、标准化接入真实世界的接口。