1. 这场“泼冷水”到底在吵什么
Amadeus 的 CTO 最近对 MCP 泼了一盆冷水,这事在圈子里传得挺开。我先把结论摆前面:他说的那些问题,大部分是对的,但被很多人翻译成了“MCP 要凉了”,这就属于过度解读。MCP 全称 Model Context Protocol,是一个让大模型跟外部工具、数据源打交道的开放协议。你可以把它理解成 AI 世界里的“USB-C 接口标准”——以前每个模型想调个数据库、读个文件、跑个命令,都得自己写一套私有对接,现在大家约定一个统一的插头形状,谁都能插。
这波争议的核心其实就一句话:MCP 解决的是“连接标准化”问题,但它没解决“工作流编排”问题,更没解决“可靠性”问题。Amadeus 的 CTO 大概率是在提醒大家,别把 MCP 当成万能药,以为接上它 AI 就能自动干活了。实际上,MCP 只是把“手”接上了,脑子怎么想、活怎么排、错了怎么办,那是另一回事。
我写这篇东西,是想帮那些被各种“MCP 教程”“MCP 工作流”刷屏但还没搞明白的人,把概念理清楚。适合谁看?如果你是刚接触 AI 工具链的开发者、正在选型的技术负责人,或者只是被 coze 工作流、dify 工作流、comfyui 工作流这些词绕晕的普通用户,这篇应该能帮你省下不少查资料的时间。我会从协议本质、工作流区别、实操踩坑几个角度拆开讲,尽量说人话。
先给个最直白的类比:MCP 像是给你家所有电器统一了插座标准,但“先开空调还是先烧水”“跳闸了怎么办”“电费超了怎么省”,这些是工作流和策略层面的事,插座标准管不着。Amadeus 的 CTO 泼的冷水,本质就是在说:别把插座标准吹成智能家居。
2. MCP 协议到底是个什么东西
2.1 从“私有对接”到“统一插头”的演进逻辑
在 MCP 出现之前,AI 应用要接外部能力,基本是三种做法。第一种是硬编码,直接在代码里写死调用某个 API,改起来要命。第二种是插件机制,比如某些平台自己定义一套插件规范,但每家规范都不一样,你给 A 平台写的插件搬到 B 平台就废了。第三种是函数调用,模型输出一个结构化 JSON,由外层程序去执行,这个已经比较接近 MCP 的思路了,但依然缺少统一的发现和描述机制。
MCP 的价值在于它定义了一套标准的客户端-服务器交互模型。MCP Server 负责暴露能力,比如“读文件”“查数据库”“调某个 API”;MCP Client 负责连接这些 Server,把能力列表告诉模型;模型决定调哪个,Client 去执行,再把结果喂回模型。整个过程有统一的 JSON-RPC 消息格式,有标准的工具描述结构,有资源、提示、工具这几类原语。
为什么这个设计重要?因为它把“能力提供方”和“能力消费方”解耦了。你写一个 MCP Server 查天气,理论上任何支持 MCP 的客户端都能用,不用为每个 AI 应用重写一遍。这就是标准化的力量,跟当年 USB 统一各种接口是一个道理。
但这里有个关键点很多人忽略:MCP 是软件协议,不是硬件协议。热搜里有人问“mcp 是软件协议 硬件协议那个概念叫什么来着”,答案是硬件那边对应的概念叫总线协议或接口协议,比如 UART、SPI、I2C、CAN 这些。MCP 跟 CAN 协议、Modbus、OPC UA 完全不是一个层面的东西。CAN 协议报文解析、锁控板协议、CPHY 协议这些是物理层和链路层的活,MCP 是应用层的约定。把它们混为一谈,说明很多人对协议分层没概念。
2.2 MCP 的能力边界:它能做什么,不能做什么
MCP 能做的,是让模型以一种可发现、可描述的方式调用外部工具。比如 playwright mcp 让模型能操控浏览器,chrome devtools mcp 让模型能看网络请求和调试信息,unity mcp 让模型能操作游戏引擎,同花顺 mcp 让模型能查行情。这些都是“把某个软件的能力暴露给模型”。
MCP 不能做的,是替你决定什么时候调、按什么顺序调、调失败了怎么重试、多个工具怎么协同。这些属于工作流编排的范畴。你可能会说,那我在提示词里写清楚步骤不就行了?可以,但那是“提示词编排”,不是“工作流引擎”。提示词编排的问题是脆弱、不可观测、难以复用,步骤一多模型就晕。
这就是 Amadeus CTO 那盆冷水的真正指向:MCP 让工具接入变简单了,但工具接入简单不等于任务完成简单。很多人看到“AI 能调浏览器了”就兴奋,觉得自动化指日可待,结果真上手发现,模型调是调了,但调得乱七八糟,该点的地方没点,该等的地方没等,报错了也不知道怎么处理。这不是 MCP 的锅,是工作流设计的锅。
我打个比方。MCP 像是给一个实习生配了全套工具,螺丝刀、扳手、电钻都有,而且工具摆放位置标准化了,他伸手就能拿到。但实习生会不会用、先拧哪个螺丝、拧滑丝了怎么办,那是培训和流程的事。你不能因为实习生把活干砸了,就说工具标准没用。
2.3 为什么现在 MCP 这么火,又为什么争议这么大
火的原因很直接:大模型能力到瓶颈了,大家发现光靠模型自己“想”解决不了实际问题,必须让它“动手”。而动手就需要接工具,接工具就需要标准,MCP 正好卡在这个时间点上。加上几家大厂和主流工具链陆续支持,生态一下就起来了。trae ide 搭载 burp suite mcp server、ruoyi-vue-pro 合并 mcp 功能、codex 接入蓝湖 mcp,这些案例都在说明 MCP 正在从概念走向落地。
争议大的原因也很直接:期望值被拉太高了。各种“MCP 工作流”“AI 自动干活”的宣传铺天盖地,导致很多人以为接上 MCP 就万事大吉。结果实际一用,发现模型还是会犯错,工具还是会超时,流程还是会卡住。这时候就有人跳出来说“MCP 是伪需求”“MCP 被高估了”。Amadeus 的 CTO 大概就是在这个背景下发声的。
我的判断是:MCP 会活下来,而且会成为基础设施,但它不会像有些人吹的那样“改变一切”。它就是个协议,跟 HTTP、TCP/IP 一样,重要但不神奇。真正决定 AI 能不能干活的,是工作流设计、错误处理、可观测性这些“脏活累活”。协议只是入场券,不是终点线。
3. 工作流才是真正的战场
3.1 MCP 工作流和传统工作流的本质区别
现在市面上“工作流”这个词被用得很泛。coze 工作流、dify 工作流、comfyui 工作流、camunda 工作流,这些说的其实不是一回事。我按我的理解分个类。
第一类是可视化编排工作流,代表是 coze、dify、comfyui。你在画布上拖节点、连线、配参数,形成一个有向图。这类工作流的优点是直观、门槛低,非程序员也能搭。缺点是灵活性受限,复杂逻辑表达起来别扭,调试也麻烦。comfyui 在图像生成领域把这套玩得很溜,minimax h3 comfyui 工作流、毛坯房拍照生成效果图的扣子工作流,都是这个路子。
第二类是代码化工作流引擎,代表是 camunda、轻量级工作流框架。这类是给工程师用的,用代码或配置定义流程,支持复杂的分支、循环、补偿、超时。camunda 工作流开发步骤网上一搜一大把,说明企业级需求很旺。优点是强大可控,缺点是学习曲线陡。
第三类是AI 原生工作流,也就是 MCP 参与进来的这种。它的特点是流程的某些环节由模型动态决定,而不是预先写死。比如模型看到用户问题后,自己决定先查数据库还是先搜网页。这类工作流最灵活,但也最不可预测。
MCP 工作流和传统工作流的本质区别就在这:传统工作流的路径是人预先定义的,MCP 工作流的路径是模型运行时决定的。前者确定性高但僵化,后者灵活但难控。Amadeus CTO 的冷水,我理解就是在提醒:别以为把 MCP 接进工作流就自动智能了,模型决策的不确定性会带来一堆新问题。
3.2 一个真实的工作流拆解:从需求到落地
我拿一个具体场景来说,比如“简历筛选工作流”。这个需求很典型:HR 收到一堆简历,想自动筛出符合要求的。
如果用传统工作流做,流程大概是:读取简历文件 → 解析文本 → 按关键词匹配 → 打分排序 → 输出结果。每一步都是确定的,关键词列表是人配的,打分规则是人定的。好处是稳定、可解释、可审计。坏处是僵化,简历里写“精通 Java”和“Java 开发经验丰富”,关键词匹配可能就漏了。
如果用 MCP 工作流做,流程会变成:读取简历 → 调用模型理解内容 → 模型决定调用哪些工具(比如查学历验证接口、查项目经历匹配度)→ 综合打分。好处是能理解语义,坏处是模型可能抽风,今天给这个人打 80 分,明天同样的简历打 60 分。而且模型调用工具的顺序不固定,有时候先查学历有时候先看项目,导致结果不可复现。
我的经验是:关键决策环节用传统工作流兜底,语义理解环节用模型增强。比如硬性条件(学历、年限)用规则筛,软性条件(项目匹配度、潜力)用模型评。这样既保证了下限,又提升了上限。纯靠 MCP 工作流一把梭,风险太大。
再举个技术向的例子,playwright mcp 和 browser use mcp 的区别。这两个都是让 AI 操控浏览器的,但定位不同。playwright mcp 更偏向“精确控制”,你告诉它点哪个选择器、填什么值,它执行;browser use mcp 更偏向“目标驱动”,你告诉它“帮我登录并下单”,它自己规划步骤。前者适合流程固定的场景,后者适合探索性任务。选哪个,取决于你的工作流需要多少确定性。
3.3 工作流编码:为什么“让 AI 自己排”往往不靠谱
“工作流编码”这个词最近也热,说的是用代码来定义工作流,而不是画布拖拽。这其实是回归工程常识:复杂逻辑就该用代码表达。画布适合演示和简单场景,真上生产还得靠代码。
但“让 AI 自己排工作流”是另一回事。有些工具宣传说,你只要描述目标,AI 自动帮你生成工作流。我试过几个,结论是:演示可以,生产不行。原因有三。
第一,AI 生成的工作流缺少边界处理。它不知道某个接口会超时,不知道某个页面会弹广告,不知道某个字段可能为空。这些边界情况,只有踩过坑的人才知道要处理。
第二,AI 生成的工作流难以调试。出错了,你看那一堆自动生成的节点,根本不知道哪步出了问题。手写的工作流,至少你知道每行代码的意图。
第三,AI 生成的工作流不好维护。需求变了,你得重新生成一遍,之前的手动调整全白费。手写的工作流,改哪补哪,可控。
所以我的建议是:把 AI 用在“生成单个节点的逻辑”上,而不是“生成整个工作流”上。比如让 AI 帮你写一个解析简历的脚本,这个可以;让 AI 帮你设计整个招聘系统的工作流,这个不行。粒度很重要。
4. 实操:把 MCP 接进工作流的正确姿势
4.1 环境准备与工具选型
假设你要搭一个带 MCP 的工作流,第一步是选型。我按经验给个决策路径。
先问自己:你的工作流是确定性为主还是探索性为主?如果是确定性为主,比如每天定时抓数据、生成报表,那 MCP 只是其中一个工具调用环节,主体用传统工作流引擎(camunda 或代码)就行。如果是探索性为主,比如让 AI 帮你调研一个话题、操作一个陌生网站,那 MCP 的比重可以大一些,但依然要有兜底。
工具选型上,客户端这边,如果你用 Claude 桌面版或某些 IDE 插件,它们内置了 MCP 支持,开箱即用。如果你要自己写,可以用官方 SDK,Python 和 TypeScript 都有。服务端这边,优先用现成的 MCP Server,比如 playwright mcp、chrome devtools mcp、unity mcp,这些社区维护得不错。没有现成的,再自己写。
这里有个坑:别一上来就自己写 MCP Server。我见过太多人,需求还没理清楚,先花一周写了个 Server,结果发现现成的就能用。先去 MCP 的官方仓库或社区列表里翻一翻,大概率有你要的。
环境准备清单我列一下:
- 运行时:Node.js 18+ 或 Python 3.10+,看 SDK 要求
- 客户端:支持 MCP 的 AI 应用,或自己写的 Client
- 服务端:现成 Server 或自研 Server
- 调试工具:MCP Inspector,官方出的,能看消息往来,强烈建议装
- 日志:所有 MCP 调用都要打日志,不然出问题你两眼一抹黑
4.2 配置一个 MCP Server 的完整过程
我拿配置一个文件系统 MCP Server 举例,这是最基础的,适合练手。
第一步,安装 Server。假设用 npx,命令大概是这样:
npx -y @modelcontextprotocol/server-filesystem /path/to/allowed/dir这个命令启动一个 MCP Server,暴露文件读写能力,但限制在指定目录内。为什么要限制目录?安全。你不想让模型能读你整个硬盘吧。
第二步,配置客户端连接。不同客户端配置方式不同,但核心都是告诉它“有个 Server,怎么启动,叫什么名字”。以某个支持 MCP 的客户端为例,配置文件里加一段:
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"] } } }第三步,验证连接。重启客户端,看工具列表里有没有出现文件相关工具。没有的话,看日志。常见问题是路径写错、npx 没装、权限不够。
第四步,测试调用。让模型读一个文件,看能不能成功。成功的话,再试写文件。写文件要小心,先在一个测试目录里试,别直接往重要目录写。
这个过程看着简单,但坑不少。我踩过的:npx 第一次运行会下载包,慢,容易超时,建议先手动跑一遍让它缓存好。还有路径里的空格,某些客户端解析会出问题,尽量用无空格路径。再有就是权限,macOS 上某些目录需要额外授权,不然 Server 启动就失败。
4.3 参数计算与关键配置项说明
MCP 配置里有几个参数值得单独说。
超时时间。MCP 调用默认超时可能很短,几十秒。但有些工具,比如 playwright 打开一个慢网站,可能要一两分钟。超时设太短,任务老失败;设太长,卡住了你也不知道。我的经验是:按工具类型分别设。读文件这种快的,10 秒够了;浏览器操作这种慢的,给 120 秒;网络请求这种不确定的,给 60 秒并加重试。
并发数。如果你的工作流会同时调多个 MCP 工具,要注意并发限制。有些 Server 不支持并发,你同时发两个请求,第二个会排队或报错。配置里如果有并发相关参数,先设成 1,稳定了再往上加。
重试策略。MCP 调用失败很常见,网络抖动、工具内部错误、超时都会失败。重试是必须的,但不能无脑重试。我的做法是:只对幂等操作重试,比如读文件、查数据;写操作不自动重试,因为可能已经写成功了,重试会写两遍。重试次数 2 到 3 次,间隔用指数退避,第一次等 1 秒,第二次等 2 秒,第三次等 4 秒。
日志级别。调试时开 debug,能看到完整的 JSON-RPC 消息。生产环境开 info,只记关键事件。别一直开 debug,日志文件会爆炸。
这些参数没有标准答案,得根据你的场景调。我给的是起点,不是终点。
4.4 实操现场:一次失败的 MCP 调用排查记录
说个我真实遇到的。有次我搭了个工作流,用 playwright mcp 自动填一个表单。测试的时候好好的,一上生产就时不时失败。失败现象是:模型说“已填写完成”,但实际表单是空的。
排查过程是这样的。第一步,看 MCP 日志。发现模型确实调了“填写”工具,参数也对,Server 也返回了成功。那问题在哪?第二步,看浏览器截图。发现表单页面加载慢,模型在页面还没渲染完的时候就调了填写工具,填到了一个还不存在的元素上,但工具没报错,因为选择器匹配到了某个占位元素。
第三步,定位根因。是工作流里缺少“等待页面加载完成”的步骤。模型不知道要等,它看到工具返回成功就以为完事了。第四步,修复。在填写之前加一个“等待某元素出现”的步骤,超时 30 秒。改完之后,稳定了。
这个案例的教训是:MCP 工具返回成功,不代表业务成功。工具层面的成功只是“我执行了”,业务层面的成功是“结果符合预期”。工作流里必须有校验环节,不能光看工具返回值。
类似的问题还有:点击按钮后页面跳转,模型没等跳转就进行下一步;上传文件后没等上传完成就提交;调用接口后没等回调就继续。这些都是“时序问题”,是 MCP 工作流最常见的坑。
5. 常见问题与排查技巧实录
5.1 MCP 连接类问题速查
连接问题是最基础的,也是最容易卡住新手的。我整理了个速查表。
| 现象 | 可能原因 | 排查方法 | 解决 |
|---|---|---|---|
| 客户端看不到工具 | Server 没启动 | 手动跑 Server 命令看报错 | 修启动命令 |
| 连接超时 | 网络或路径问题 | 检查 Server 地址和端口 | 改配置 |
| 认证失败 | token 过期或错误 | 看日志里的认证信息 | 更新 token |
| 工具列表为空 | Server 启动但没注册工具 | 用 MCP Inspector 连上看 | 检查 Server 代码 |
| 调用报方法不存在 | 版本不匹配 | 对比 Client 和 Server 版本 | 统一版本 |
这里重点说 token 问题。MCP 的认证方式有好几种,有的是启动参数传 token,有的是环境变量,有的是 OAuth 流程。token 过期是高频问题,尤其是那种带有效期的。我的做法是:把 token 刷新逻辑写进工作流,快过期了自动刷,别等失败了再处理。
还有个隐蔽的坑:多个 MCP Server 名字冲突。你配了两个 Server 都叫“filesystem”,客户端可能只认一个。配置时给每个 Server 起唯一名字,比如“fs-project”“fs-temp”。
5.2 工具调用失败的典型场景
工具调用失败,原因五花八门。我按频率排个序。
第一,参数格式不对。模型生成的参数,有时候类型不对,比如该传数字传了字符串,该传数组传了对象。MCP 有 schema 校验,但校验失败的信息模型不一定能理解。我的做法是:在工具描述里把参数格式写清楚,给例子。模型看到例子,生成正确参数的概率高很多。
第二,工具不存在或没权限。模型调了一个没注册的工具,或者调了但当前用户没权限。这个要在工作流里做前置检查,别等调用了才发现。
第三,工具内部错误。工具本身有 bug,或者依赖的外部服务挂了。这种只能重试或降级。降级的意思是:主工具失败,用备用工具。比如主搜索接口挂了,用备用搜索。
第四,结果太大。工具返回的数据量超过模型上下文限制,模型处理不了。这个要在工具层面做截断或分页,别一次返回几兆数据。
第五,模型理解错结果。工具返回了正确结果,但模型理解偏了。这个最难排查,因为工具和模型都没报错。我的做法是:在关键步骤后加“确认”环节,让模型复述它理解的结果,不对就重来。
5.3 性能与稳定性优化心得
MCP 工作流跑起来后,性能和稳定性是下一个坎。
性能方面,最大的瓶颈往往是串行调用。模型调完一个工具,等结果,再调下一个,一来一回延迟叠加。能并行的就并行。比如要查三个数据源,让模型同时发三个调用,而不是一个一个来。当然,前提是这些调用互不依赖,且 Server 支持并发。
另一个瓶颈是上下文膨胀。每次工具调用的结果都塞进上下文,几轮下来上下文就满了,模型开始遗忘或变慢。解决办法是:工具结果做摘要,只保留关键信息;或者用外部存储,模型需要时再查。
稳定性方面,核心是幂等和补偿。任何可能失败的操作,都要想好失败了怎么办。写操作要幂等,重复执行不出错。跨多个步骤的操作,要有补偿逻辑,前面成功了后面失败了,前面的要能回滚。
我个人的经验是:别追求 100% 自动化。关键节点留个人工确认,比全自动但老出错强。比如发邮件、下单、删数据这种不可逆操作,让模型准备好,人点一下确认。这样既省事又安全。
5.4 独家避坑清单
最后分享几个我踩过的坑,都是文档里不会写的。
坑一:别在提示词里写“如果失败就重试”。模型会真的无限重试,把额度耗光。重试逻辑放在工作流引擎里,别交给模型。
坑二:MCP Server 的日志要单独存。跟应用日志混在一起,排查时找死人。单独存,按 Server 名分文件。
坑三:测试环境用 mock Server。别老连真实服务,又慢又不稳定。写个 mock,返回固定数据,先把工作流逻辑跑通,再接真实服务。
坑四:注意工具的副作用。有些工具看着是读,实际有写副作用,比如“获取”操作会更新访问时间。接之前把工具文档读透。
坑五:版本锁定。MCP 生态变化快,今天能用的配置明天可能就废了。把 Server 版本锁死,升级前先测试。
坑六:别信“一键接入”。任何宣传一键接入的,实际都有隐藏配置。老老实实按文档一步步来。
坑七:模型选择影响很大。同一个 MCP 工作流,换个模型效果可能天差地别。工具调用能力强的模型,成功率明显高。选型时把模型也当成一个变量。
这些坑,有些是我花了好几天才搞明白的,希望你看完能少走点弯路。MCP 这东西,说复杂也复杂,说简单也简单,核心就是把它当成一个标准接口,别神化,也别轻视。工作流设计才是真正见功力的地方,协议只是工具。