MCP 与函数调用、RAG 等方案怎么选:一份基于场景的对比清单
MCP(Model Context Protocol)不是用来替代所有工具接入方式的万能协议。
它主要解决的是“模型如何以统一方式发现、调用外部工具和数据源”的问题。
如果你只接两三个固定 API,函数调用足够;
如果只是让模型回答基于静态文档的问题,RAG 更直接。
MCP 的价值在工具数量多、需要跨客户端复用、并且要求统一权限边界的时候才会明显。
先固定比较条件,再谈谁更好
比较协议最容易犯的错是拿不同场景下的优点互相打架。
下面四个条件建议先写清楚,再判断:
- 工具规模:是 2~3 个固定接口,还是几十个需要动态发现的工具?
- 客户端数量:只有一个应用调用,还是多个客户端(IDE、聊天工具、自建 Agent)都要复用同一套工具?
- 维护成本:工具变更时,改一处配置还是改每个客户端的代码?
- 访问控制:是否需要统一的认证、授权和审计边界?
这四个条件不同,答案会完全不同。
MCP 与函数调用的边界
函数调用(Function Calling)是模型厂商提供的“让模型输出结构化调用参数”的能力。
它的优点是直接:在代码里定义工具 schema,模型返回参数,你的程序执行并回传结果。
MCP 则是在函数调用之上多了一层“工具服务”的抽象:工具由 MCP Server 暴露,客户端通过标准协议发现和调用。
判断条件可以简化为:
- 工具数量少、调用方只有一个、不需要跨客户端复用:优先函数调用,少一层协议就少一层排错点。
- 工具数量多、多个客户端要共享、希望工具提供方和调用方解耦:考虑 MCP,把工具收敛到 Server 侧统一维护。
一个具体例子:你在一个内部机器人里接天气查询和工单创建两个接口,函数调用写两个 schema 就能跑。
但如果你有二十个内部系统,且 IDE 插件、客服机器人和自建 Agent 都要用,每个客户端重复实现一遍工具发现和鉴权,维护成本会迅速超过引入 MCP 的成本。
MCP 与 RAG 解决的不是同一类问题
RAG(检索增强生成)解决的是“模型不知道的知识,通过检索补进来”。
MCP 解决的是“模型如何调用外部能力”。
两者经常配合,但不是二选一。
- 用户问“公司报销标准是什么”,需要的是检索文档,RAG 更直接。
- 用户说“帮我把这张发票录入报销系统”,需要的是调用工具,函数调用或 MCP 更合适。
- 如果既要查制度又要提交单据,常见做法是 RAG 负责知识检索,MCP 负责工具调用。
所以对比 MCP 和 RAG 时,先问一句:这个需求是“找信息”还是“做动作”。
找信息优先 RAG,做动作才进入工具调用的比较范围。
多智能体协作为什么会提到 A2A
A2A(Agent-to-Agent)关注的是多个智能体之间如何委托任务和交换结果,而 MCP 关注的是单个智能体如何调用工具和数据源。
两者层次不同:MCP 是“智能体到工具”,A2A 是“智能体到智能体”。
如果你的系统只有一个 Agent 调工具,不需要引入 A2A。
如果多个 Agent 需要互相派活,才需要评估 A2A 这类协议。
不要因为名字里都有“协议”就放在同一层比较。
选型时容易踩的坑
- 为了统一而统一:工具只有两三个时引入 MCP,排错链路变长,收益不明显。
- 把 RAG 当工具调用用:让模型“检索”一个会改变状态的接口,容易产生不可控的写操作。
- 忽略认证边界:MCP Server 暴露工具后,谁可以调用、调用哪些工具需要明确,不能默认全部开放。
- 跨客户端复用想当然:不同客户端对 MCP 的支持程度和配置方式有差异,接入前要确认目标客户端是否支持你选择的传输方式。
一个可执行的判断顺序
- 先确认需求是“找信息”还是“做动作”。找信息优先评估 RAG。
- 做动作且工具少于 5 个、调用方单一,先用函数调用跑通。
- 工具数量增长或多客户端复用出现重复开发时,再评估 MCP。
- 出现多 Agent 互相委托任务时,单独评估 A2A 类协议。
- 任何阶段都先明确认证和授权边界,再谈工具开放。
MCP 与其他协议对比,结论不是谁更先进,而是谁更匹配当前的工具规模、维护成本和访问控制要求。
条件变了,选择也应该跟着变。