MCP 协议本身没毛病,毛病出在把协议当 REST 外包工;把接口拆成“外卖三件套”让 AI 自己跑腿,结果 AI 跑断腿、用户等成望夫石;
正确姿势是把三趟腿合并成一趟“闪送”,参数拍扁成选择题,错误提示写成“下一题提示”,工具名自带“品牌+动作+对象”防重名,分页自带“还有几页”小票,让 AI 一次拿到热乎结果;
Skills 与 MCP 不是擂台 PK,而是火锅配菜,一个负责涮肉一个负责调酱,企业里把自家服务先 MCP 化,再用 Skills 教 AI 什么时候涮哪盘菜,整套流程下来,AI 从“迷路小孩”升级成“自带导航的外卖骑士”,开发者从“背锅侠”升级成“产品经理”,服务器从“背锅侠”升级成“印钞机”。
MCP热潮之后的真实落差从哪里来
一年前 MCP 像火箭一样蹿红,各路码农连夜搓服务器,搓完发现 AI 嫌弃到翻白眼,于是朋友圈开始唱衰“协议要凉”!
MCP在大约一年前快速扩散,开发者、团队、公司几乎同时入场,服务器项目数量呈爆发式增长,集成速度极快,部署规模持续扩大。从表面看,协议已经进入成熟阶段。但使用体验却频繁出现落差,社交平台上开始出现“协议无效”“方向错误”等情绪性判断。
企业侧的现实情况却完全不同。大量MCP服务器已经上线运行,业务系统已经连通,流程已经跑通。
结果生产线天天报警,用户吐槽“这 AI 是树懒转世”,真正的问题集中在结果质量、交互效率与智能体稳定性。换句话说,连接成功了,执行却不理想。这一现象清晰指向同一个原因:协议承担的职责被理解错位,服务器的设计对象被认成了人类,而真实使用者其实是智能体。
MCP真正承担的角色是什么
Model Context Protocol 的核心作用始终明确:为大模型提供一种通用、标准化方式,去访问外部工具、数据源与服务。在它出现之前,每一次集成都需要定制连接方式,维护成本极高,协作效率极低。
MCP通过三类原语解决这一问题。
工具,用来执行动作,例如搜索文档、创建工单。
资源,用来读取信息,例如文件、数据库记录。
提示,用来封装可复用流程,让用户或智能体直接触发。
整个设计目标始终围绕“一次实现,多端复用”,一个服务器能够同时服务不同模型、不同智能体、不同应用场景。
REST 与 AI 的代沟:人类一次看懂,AI 每次重新背字典
人类开发者看一遍文档就能写脚本,AI 每调一次接口都要把 schema 全量背一遍,背完还要做阅读理解,背字典成本比跑接口还高;
REST 崇尚“乐高小积木”,人类爱怎么拼怎么拼,AI 拿到一堆积木直接晕头转向,拼错一步就 hallucinate 给你看;
REST 喜欢“选项越多越自由”,AI 面对一百个参数直接选择“我全都要”,结果把上下文窗口撑成怀孕十个月,于是“自由”变成“灾难”,
结论:REST 是给人用的,MCP 是给 AI 用的,用户不同,设计思路得换血。
因此,把REST接口原样暴露给智能体,等价于让智能体在对话中实时阅读并理解一整套SDK文档。
REST强调可组合性、小而美的端点、灵活的参数结构。这些特性在程序员世界里价值极高,在智能体世界里却持续放大成本。
发现成本方面,人类只需要读一次文档,智能体却需要在每次请求中看到完整schema。
组合成本方面,人类可以写循环、条件、缓存逻辑,智能体需要多轮工具调用才能拼装结果。
灵活性方面,参数越多、结构越深,智能体产生幻觉的概率越高。
当这些原则原封不动进入MCP服务器,结果自然偏离预期。
订单追踪案例把问题讲得足够直观
假设一个系统需要追踪用户订单。
给人类开发者时,流程非常自然:
- 先根据邮箱查用户 get_user_by_email
- 再根据用户ID查订单 list_orders
- 再根据订单ID查物流 get_order_status
如果把这三个接口直接暴露成三个MCP工具,订单追踪拆成“外卖三件套”,智能体每次都需要加载三个描述、执行三次调用、保存中间结果、再进行推理整合:
把 get_user_by_email、list_orders、get_order_status 一字排开,AI 先拿 email 换 user_id,再拿 user_id 换 order_id,最后拿 order_id 换快递小哥名字,三趟 HTTPS 跑完,上下文里塞满中间废品,用户问“我的快递到哪了”,AI 回答“请稍等,我正在跑第三趟”,这体验堪比“外卖骑手先回家洗个澡再给你送饭”,用户不掀桌才怪。
上下文消耗上升,失败点同步增加。
正确做法:
三趟腿捏成一趟“闪送”:直接甩给 AI 一个 track_latest_order(email),服务器后台秒变贴心小秘书,三趟调用内部秒掉,返回一句“订单 12345 已由顺丰小哥揽收,周四送到你家门口”,AI 只跑一次、用户一眼看懂、上下文只留干货,服务器从“外包工”升级成“闪送骑士”,开发者从“背锅侠”升级成“产品经理”,这波操作叫“Outcome > Operation”,翻译成大白话:别让 AI 跑腿,让服务器跑完再给 AI 送外卖。
也就是说:如果服务器提供一个结果导向工具,例如 track_latest_order(email),所有内部流程由服务器完成,智能体一次调用即可得到最终结论。这种设计直接将负担从模型上下文转移到代码执行层,稳定性与效率同时提升。
MCP服务器设计的第一原则:工具设计要围绕结果,而不是操作步骤
工具的存在价值来自结果,而不是操作步骤。
智能体真正关心的是“订单状态”,而不是“用户表”“订单表”“物流表”的访问顺序。
当工具围绕用户目标设计,服务器自然承担起流程编排的职责,模型上下文只保留必要决策信息。结果导向的工具直接减少轮次、降低推理复杂度、提升成功率。
参数设计决定智能体执行质量:参数要扁平化,类型要严格约束!
嵌套结构、动态字典、可选字段过多的参数形式,会显著增加智能体的猜测空间。
压平参数结构,把所有关键信息放在顶层,配合清晰类型与枚举约束,智能体的决策空间会自然收敛。
Literal枚举为模型提供明确选项,默认值减少决策分支,类型提示降低歧义风险。
参数结构越接近自然语言决策,工具调用就越接近一次性成功。
文档字符串和错误信息就是Agent的操作指南
在MCP体系中,所有文字都会进入模型上下文。
函数说明并不是给人类看的注释,而是直接参与推理的指令文本。
明确说明使用场景、参数要求、返回结构,相当于在工具层为智能体提供行动指南。
错误信息同样重要。可读、可执行的错误描述,会引导模型在下一轮进行自我修正。
当错误信息表达清晰,智能体会自然形成“尝试—反馈—调整”的闭环行为。
工具数量与返回内容需要极度克制
上下文窗口始终有限。每一个工具描述、每一个字段、每一条记录,都会与当前任务竞争注意力。
控制工具数量、限制单一服务器的职责范围、删除长期未使用能力,这些行为直接提升发现效率。
返回内容只保留可行动信息,其余信息在服务器侧完成筛选。
智能体并不需要看到全部数据,只需要看到下一步该做什么。
命名方式影响工具被选中的概率
在多服务器并存环境中,工具名称本身就是搜索关键词。
清晰、具象、带服务前缀的命名方式,会显著提升命中率。
service_action_resource 结构让智能体无需额外推理即可判断用途。
当命名具备区分度,智能体选择行为会自然稳定。
大结果集始终需要分页语义
一次性返回大量记录,会快速消耗上下文并引发推理偏移。
分页参数、总量提示、是否还有下一页,这些元信息帮助智能体形成持续行动路径。
智能体不需要一次看完世界,只需要知道下一步还能不能继续。
Gmail案例展示设计思路的转变
传统方式把Gmail API完整暴露,嵌套结构复杂、编码规则繁琐、命名抽象。
智能体需要理解MIME、Base64、payload结构,推理负担极高。
结果导向设计把复杂性全部留在服务器侧,智能体只面对搜索、阅读、发送三个清晰动作。
参数直接表达意图,返回结构直接服务决策。
这种差异正是“接口”与“用户界面”的本质区别。
Skills与MCP形成互补关系
最近社区热议“Skills将取代MCP”,其实这是个美丽的误会。
Skills和MCP根本不在同一个赛道:
Skills是一套基于文件系统的指令包,包含YAML元数据、SKILL.md说明文档和本地脚本资源。Agent在启动时加载Skills的元数据(约100个token),需要时才读取详细指令(<5k tokens),执行时通过bash等通用工具调用本地脚本。
MCP则提供结构化的远程工具接口,带参数验证和类型化响应。
Skills适合封装复杂工作流,比如“写一篇产品评测”,内部可能调用多个MCP工具;MCP适合暴露原子服务能力,比如“查订单状态”。
两者完全可以互补:MCP服务器由各业务团队维护,提供标准化接口;Skills由Agent训练师编写,教Agent如何组合这些接口完成特定任务。就像厨房里既有标准化的电器(MCP),也有厨师写的菜谱(Skills),电器负责加热搅拌,菜谱告诉厨师什么时候用哪个电器。没有谁取代谁,只有配合默契才能做出好菜。
MCP 端上肥牛卷,Skills 告诉你“涮 8 秒蘸麻酱”,企业里先让各团队把自家服务 MCP 化,再用 Skills 教 AI 什么时候涮哪盘菜,结果 AI 从“无头苍蝇”升级成“自带导航的吃货”,开发成本直线下降,老板笑得合不拢嘴。
最终结论回到最初那一句
MCP从来不是问题源头。
真正决定效果的是服务器是否意识到服务对象已经发生变化。
当服务器被当作智能体界面来设计,结果导向、参数清晰、指令明确、上下文克制,MCP会自然发挥设计初衷。
六条铁律一口闷:Outcome、Flat、Context、Curate、Name、Paginate
Outcome 让服务器跑腿,AI 吃现成;
Flat 把填空变选择,hallucinate 滚粗;
Context 把 docstring 当小抄,错误当提示;
Curate 把工具砍到 5~15 个,一个服务器只干一件大事;
Name 把品牌贴脸上,防重名打架;
Paginate 把数据砍成一页页,内存不爆炸;
六条一起下锅,MCP 服务器瞬间从“背锅侠”变身“印钞机”,AI 从“树懒”变身“闪送骑士”,用户从“暴走”变身“五星好评”,开发者终于可以在凌晨两点安心睡觉,再也不用被报警短信炸醒,这就是“把服务器当 UI 做”的终极奥义。