很多人在接入大模型能力时会卡在同一个问题上:手里已经有一堆能用的 HTTP 接口,为什么还要再套一层 MCP?反过来,也有人先接了 MCP 服务器,却发现有的活它根本干不了。这篇不讲概念史,只给两边的能力边界对照表、选型判断顺序,以及两边混用时的分工方式,帮你在动手前把方案定下来。
接入大模型能力时,很多人会卡在同一个岔路口:手里已经有一堆能跑通的 HTTP 接口,为什么还要再套一层 MCP?另一边也有人先接了 MCP 服务器,结果发现有些活它压根干不了,比如批量拉数据、严格按顺序跑五步。这篇不讲概念史,只给两边的能力边界对照,以及动手前怎么把方案定下来。
先把一个容易混的说法摆正:MCP 工具和 API 接口不是同层级的东西,也不是二选一的替代关系。它们解决的是「这一步由谁决定」的问题——是你的代码决定,还是模型在对话里自己挑。搞清楚这条线,后面选型基本不会跑偏。
先把两者的位置摆正:它们不是同类东西
API 接口是服务端对外暴露的调用契约,谁调、什么时候调、调几次,全由你的代码说了算。它不管你后面接的是模型还是定时任务,输入输出都是确定的。MCP 更像一层面向模型的工具描述与调用协议,核心作用是把一个能力包装成模型能自己挑、自己填参数的形式。
所以真正要对比的不是「哪个更强」,而是「这个动作该由代码决定还是由模型决定」。如果你的流程是固定的几步,参数全部来自程序内部或表单,那引入 MCP 只会多一层不确定性,收益很小。
- 调用发起方
- API 由你的代码触发;MCP 由模型在对话中自行决定是否触发
- 参数来源
- API 参数通常由程序拼装;MCP 参数由模型按工具描述生成
- 典型场景
- 固定批处理走 API;需要临场判断选哪个动作走 MCP
能力边界对照:四个维度逐个看
把两者放在同一张表里对比,比抽象讨论有用得多。下面四个维度基本覆盖了接入方最常踩的坑:调用由谁发起、参数从哪来、连接活多久、出错好不好查。沿着这四条逐个问自己的场景,答案会清晰不少。
| 维度 | API 接口 | MCP 工具 |
|---|---|---|
| 调用发起方 | 你的代码按逻辑触发 | 模型在对话里自行判断是否触发 |
| 参数来源 | 程序拼装,结构可控 | 模型生成,需要额外的类型与必填校验 |
| 状态与生命周期 | 一次请求一次响应,短平快 | 会话有连接和工具列表的存活期,断连表现不同 |
| 可控性 | 限流、重试、审计都好加 | 要在工具描述和调用次数上限上做约束 |
| 排查难度 | 看请求日志基本能定位 | 要同时看请求侧和工具侧标识 |
其中「状态与生命周期」这一条最容易被低估。纯接口断连就是一次失败,重试即可;MCP 会话断掉可能连工具列表都要重新拉,模型之前的判断上下文也可能失效。接入前建议先到站内的 MCP 服务器清单页看现成工具是怎么描述和分类的,参考别人踩过的坑,比自己从零设计快得多。
- 参数校验:MCP 工具必须自己补类型检查、必填校验,别指望模型一定填对
- 幂等设计:模型可能重复触发同一个工具,写操作要能扛住重复调用
- 失败回传:给模型返回结构化错误,而不是一句「失败」,它才知道要不要换工具
- 审计留痕:记录每次工具调用的入参和结果,出问题时有据可查
选型判断顺序:按这四个问题依次回答
选型不是拍脑袋,按顺序问自己四个问题就行。顺序很重要,因为后面的问题要建立在前面答案之上。四个问题答案互相冲突时,优先满足可复现和可审计那一条,这两点在出了问题之后最难补救。
- 步骤一:步骤是否固定流程固定、每一步的先后顺序可提前写死,走 API;需要模型根据用户说的话临场决定下一步做什么,走 MCP。验证方式:把对话里可能出现的分支列出来,超过三条就倾向 MCP。
- 步骤二:参数从哪来参数来自用户自然语言、需要模型理解意图再转换,倾向 MCP;参数来自数据库字段或表单提交,倾向 API。验证方式:看参数能否在调用前完全确定。
- 步骤三:出错要不要可复现要求严格可复现、可回放的链路,比如对账、批量导出,用 API 更稳;允许一定概率的路径差异、以最终结果为准的,可以用 MCP。权衡点:MCP 的调用路径每次可能不同,排查成本更高。
- 步骤四:谁来维护工具清单工具只有两三个且长期不变,怎么接都行;工具数量多、还会不断新增,MCP 的集中描述方式更省事。验证方式:算一下未来半年预计新增多少工具。
两边混用的落地做法与检查清单
实际项目里很少纯用一边。更常见的分工是:外层用 API 做编排、鉴权和重试,内层把真正需要模型判断的那几个动作包成 MCP 工具。这样既保留了链路的可控性,又让模型在关键节点有发挥空间。
工具描述是这套分工里最容易被糊弄的一环。用途、参数含义、不适用场景都要写清楚,描述越含糊,模型越容易乱调。给工具调用设上限也很必要:单轮最多几步、单次会话最多几次,避免一个模糊需求引发长链调用,把账单和延迟一起拉高。
- 描述写全:用途、参数含义、什么情况下别用这个工具,三样都写
- 设调用上限:单轮步数上限、单会话次数上限,两个都要有
- 双标识日志:请求侧和工具侧各记一个标识,出问题才能分清是哪边挂了
- 先验后接:不确定某个工具行为时,先用接口单独跑一遍,确认返回结构再交给模型调
- 灰度接入:新工具先开放给小范围会话,观察调用分布再全量
还有一点经常被忽略:MCP 服务器本身是否可信、工具清单会不会被悄悄改动,直接影响你的调用结果。这类信息不适合靠记忆,接入前到站内的 MCP 服务器可信度检测和工具目录页面核对当时的清单与状态更稳妥。价格和调用配额相关的数字同理,去 /price-watch 看当时的数字,别用别人截图里的旧数据做决策。
下一步先把你要接的能力按上面四个问题过一遍,再去站内 MCP 服务器清单页挑现成工具对照,比从零设计省一半时间。→常见问题
已经有 REST 接口了,是不是一定要再包一层 MCP?
不一定。如果调用时机和参数都由你的程序决定,直接调接口更简单也更好排查。只有当你希望模型在对话里自己判断该不该调、该传什么参数时,MCP 这层包装才有价值,否则它只是增加了一个会出错的环节。
MCP 工具能做的事,普通 API 是不是都能做?
能力上大体重叠,差别在触发方式和约束方式。API 靠代码控制顺序,MCP 靠模型在描述引导下自主选择。反过来说,需要严格顺序、严格幂等的操作,放在 API 侧更合适,不要指望靠工具描述去约束模型的每一步。
两者混用时,最容易在哪个环节出问题?
多在参数和错误语义上。模型生成的参数类型或必填项可能不符,接口返回的错误码又未必能被模型理解成「该放弃」。建议在工具层做一层参数校验和错误翻译,把失败原因转成模型能读懂的话,再决定重试还是收手。