从 MCP 到 A2A:Agent 项目里“通信协议”到底在解决什么问题?
从 MCP 到 A2A:Agent 项目里“通信协议”到底在解决什么问题?
最近学习 Agent 的时候,我发现一个问题:
以前我以为 Agent 的重点就是:
大模型 + Prompt + Tool + RAG。但继续往下看会发现,真正做 Agent 项目时,还有一个非常关键的问题:
Agent 到底怎么和外部世界通信?
比如:
Agent 怎么调用工具?
Agent 怎么访问本地文件?
Agent 怎么连接第三方 API?
Agent 和另一个 Agent 怎么协作?
MCP、A2A、SSE、Streamable HTTP 又分别是什么?
大模型网关在这里到底有没有必要?
这些问题看起来分散,但其实都围绕一个核心:
Agent 不是一个孤立的大模型,而是一个需要连接工具、系统、数据和其他 Agent 的执行体。
所以今天这篇文章,我想从通信协议的角度,重新梳理一下 Agent 项目的底层逻辑。
一、先说结论:Agent 项目不只是“调大模型接口”
很多刚开始学习 Agent 的同学,容易把 Agent 理解成:
用户输入问题
↓
调用大模型
↓
大模型返回答案
但这其实更像普通 ChatBot,不是真正意义上的 Agent。
Agent 更完整的流程应该是:
用户输入目标
↓
Agent 理解任务
↓
判断是否需要工具
↓
调用外部工具 / API / 数据源
↓
根据工具结果继续推理
↓
必要时多轮调用工具
↓
最终给出答案或执行结果
也就是说,Agent 和普通 LLM 应用最大的区别在于:
普通 LLM 应用偏“问答”;
Agent 偏“理解目标 + 调用工具 + 执行任务”。
这里就会出现一个很现实的问题:
工具怎么接进来?工具调用怎么规范化?不同 Agent 之间怎么协作?
这就是 MCP 和 A2A 这类协议出现的背景。
二、Function Calling 解决的是“模型怎么表达我要调用工具”
在说 MCP 之前,先要理解 Function Calling。
Function Calling 可以理解为:
大模型不只是返回自然语言,还可以返回一个结构化的工具调用意图。
比如用户问:
帮我查一下北京今天的天气。
如果模型判断这个问题需要调用天气工具,它可能不会直接回答,而是返回类似这样的结构:
{
"name": "getWeather",
"arguments": {
"city": "北京"
}
}
这表示:
模型想调用 getWeather 这个工具,
并且参数是 city = 北京。
然后由框架来真正执行这个方法:
weatherTool.getWeather("北京");
执行完之后,再把工具返回结果交给大模型,让它组织成自然语言回答。
所以 Function Calling 解决的是:
大模型如何表达“我要调用哪个工具”
大模型如何生成工具调用参数
框架如何识别模型返回的 tool_call
但是它没有完全解决另一个问题:
这些工具从哪里来?
不同工具怎么统一暴露?
本地工具、远程工具、第三方服务工具怎么标准化接入?
这就引出了 MCP。
三、MCP 解决的是“Agent 怎么标准化连接工具和数据源”
MCP,全称是 Model Context Protocol。
它可以理解为:
给大模型应用连接外部工具、数据源和上下文的一套标准协议。
Anthropic 在介绍 MCP 时,把它定义为一种开放标准,用于在 AI 应用和数据源之间建立安全的双向连接;开发者可以构建 MCP Server 暴露数据,也可以构建 MCP Client 去连接这些 Server。
如果用更项目化的话说:
MCP Client:通常在 Agent 应用这一侧
MCP Server:负责暴露工具、资源、数据源
Tool:具体能被 Agent 调用的能力
Resource:可读取的上下文资源
Prompt:可复用的提示模板
可以画成这样:
用户
↓
Agent 应用 / MCP Client
↓
连接 MCP Server
↓
获取工具列表 / 资源列表
↓
大模型决定是否调用工具
↓
MCP Server 执行工具
↓
返回结果给 Agent
↓
Agent 继续推理并回答
所以 MCP 的意义不是“让大模型更聪明”,而是让 Agent 更容易连接外部世界。
四、MCP 和普通 API 调用有什么区别?
很多人会问:
MCP Server 最后不也是调用 API 吗?
那我直接在后端写 API 不就行了吗?
这个问题非常关键。
答案是:
底层确实还是 API、数据库、文件系统、脚本、服务调用。
但是 MCP 的价值在于:它把这些能力统一包装成 Agent 可以理解和调用的工具。
普通 API 更像这样:
后端开发者知道接口地址
后端开发者知道请求参数
后端开发者手动写调用逻辑
MCP 更像这样:
MCP Server 暴露工具定义
Agent / MCP Client 获取工具描述
大模型根据工具描述判断是否调用
框架负责发起工具调用
也就是说,MCP 不是替代 API,而是把 API 包装成 Agent 生态里的标准工具。
举个例子。
你原来有一个接口:
GET /api/order/{orderId}
普通后端项目里,需要你手写代码调用它。
但是如果做成 MCP Tool,它可能会变成:
工具名:queryOrder
描述:根据订单 ID 查询订单状态
参数:orderId
返回:订单详情
这样大模型在看到工具描述后,就有可能自己判断:
用户问的是订单状态,需要调用 queryOrder 工具。
这就是 MCP 和普通 API 的区别。
五、MCP 的通信方式:stdio、SSE 和 Streamable HTTP
今天聊天里还提到了一个重点:MCP 到底用什么通信方式?
根据 MCP 官方规范,MCP 使用 JSON-RPC 编码消息,并定义了标准传输机制,其中包括 stdio 和 Streamable HTTP。
可以简单理解为:
stdio:适合本地进程通信
Streamable HTTP:适合远程服务通信
SSE:早期常见的流式传输方式,现在更多作为历史方案或兼容方案理解
1. stdio:适合本地工具
stdio 就是标准输入输出。
比如 Claude Desktop 调用本地 MCP Server,本质上可以启动一个本地进程,然后通过标准输入输出传 JSON-RPC 消息。
它适合:
本地文件工具
本地脚本工具
本地数据库工具
开发环境工具
IDE 辅助工具
可以理解成:
Agent Client
↓ stdio
本地 MCP Server
↓
本地文件 / 本地命令 / 本地工具
优点是简单,适合本地环境。
缺点也明显:
不太适合大规模远程部署
权限管理和服务治理能力有限
不太适合企业级多用户场景
2. SSE:服务端向客户端持续推送
SSE,全称 Server-Sent Events。
它是基于 HTTP 的一种单向流式推送方式。
你平时看到大模型一个字一个字输出,很大概率就是类似 SSE 的流式效果。
它的特点是:
客户端发起请求
服务端持续返回数据流
适合大模型流式输出
它不像 WebSocket 那样是全双工通信。
WebSocket 更像:
客户端可以随时发
服务端也可以随时发
双方保持一条长连接
SSE 更像:
客户端问一句
服务端沿着这条响应流持续输出
所以你之前提出的疑问很有价值:
为什么大模型输出过程中,我不能随时打断并改变它的回答?
这里不仅是协议问题,还涉及产品设计、服务端中断机制、上下文管理和模型推理状态。
WebSocket 确实更适合双向实时通信,但 SSE 更简单,更适合“服务端持续输出文本”的大模型问答场景。
3. Streamable HTTP:MCP 现在更重要的远程通信方式
Streamable HTTP 可以理解为 MCP 更现代的 HTTP 传输方式。
根据 MCP 官方文档,Streamable HTTP 中,服务端可以作为独立进程处理多个客户端连接,并通过 HTTP POST 和 GET 请求通信;服务端也可以选择使用 SSE 来流式发送多条消息。
它比单纯 SSE 更适合 MCP 的原因在于:
可以更自然地支持远程 MCP Server
更适合企业级部署
更容易结合 HTTP 鉴权、网关、审计、负载均衡
可以支持流式能力
所以可以这样理解:
早期理解 MCP:stdio + SSE
现在理解 MCP:stdio + Streamable HTTP
如果是本地开发,stdio 很方便。
如果是企业级 Agent 平台,远程 MCP Server、大模型网关、权限认证、日志审计都要考虑,那么 Streamable HTTP 就更重要。
六、那 A2A 又是什么?
MCP 主要解决的是:
Agent 怎么连接工具和数据源。
而 A2A 解决的是另一个问题:
Agent 和 Agent 之间怎么通信、协作和互操作。
A2A,全称是 Agent2Agent Protocol。
Google 在 2025 年发布 A2A 时,将它定位为让 AI Agent 能够相互通信、安全交换信息,并在不同企业平台或应用之上协调行动的协议。
它的重点不是“工具调用”,而是“Agent 协作”。
例如:
一个采购 Agent
一个财务 Agent
一个审批 Agent
一个库存 Agent
它们可能分别属于不同系统、不同团队、不同平台。
如果没有统一协议,就需要大量定制集成。
A2A 想解决的问题就是:
不同框架开发的 Agent 怎么互相发现?
不同平台上的 Agent 怎么交换任务?
一个 Agent 怎么把任务委托给另一个 Agent?
Agent 之间怎么传递状态和结果?
A2A 官方 GitHub 介绍里也强调,它面向的是让不同公司、不同框架、不同服务器上的生成式 AI Agent 能够有效通信和协作,而不只是把对方当工具调用。
七、MCP 和 A2A 的区别
这两个很容易混。
可以用一句话区分:
MCP 是 Agent 连接工具。
A2A 是 Agent 连接 Agent。
更具体一点:
| 对比项 | MCP | A2A |
|---|---|---|
| 核心对象 | 工具、资源、数据源 | 另一个 Agent |
| 主要关系 | Agent → Tool | Agent → Agent |
| 解决问题 | 工具标准化接入 | Agent 互操作与协作 |
| 常见场景 | 查数据库、读文件、调 API、执行脚本 | 多 Agent 协作、跨平台任务委托 |
| 更像什么 | 工具协议 | Agent 通信协议 |
举个例子。
如果你的 Agent 要查数据库:
Agent → MCP Server → 数据库
这更适合 MCP。
如果你的 Agent 要把任务交给另一个专门的 Agent:
Planner Agent → Executor Agent
或者:
客服 Agent → 订单 Agent → 售后 Agent
这更接近 A2A 的场景。
八、那多 Agent 项目里,一定要用 A2A 吗?
不一定。
如果你的多 Agent 是在同一个项目内部实现的,比如使用 Spring AI Alibaba Graph、LangGraph、AutoGen 这类框架,很多时候不需要上来就用 A2A。
因为框架内部已经可以通过状态对象、节点编排、消息传递来完成协作。
比如:
用户输入
↓
Planner Agent 生成计划
↓
Executor Agent 执行工具
↓
Reviewer Agent 检查结果
↓
Supervisor 判断是否结束
在这种项目里,Agent 之间的通信可能只是:
共享状态 State
消息列表 Messages
节点输出 outputKey
框架内部事件流
这时候并不一定需要 A2A。
A2A 更适合的是:
跨系统 Agent 协作
跨公司 Agent 协作
不同框架 Agent 协作
远程 Agent 服务互相调用
Agent 生态互操作
所以不能简单理解成:
只要是多 Agent,就必须用 A2A。
更准确的理解是:
项目内部多 Agent 编排,可以用框架自己的 State / Graph / Message 机制;
跨平台、跨系统、跨组织的 Agent 协作,才更需要 A2A 这类协议。
九、大模型网关在 Agent 项目里解决什么?
今天还聊到了“大模型网关”。
这个概念可以类比后端里的 API 网关。
普通后端网关解决的是:
统一入口
鉴权认证
限流
路由
日志
监控
熔断
灰度发布
而大模型网关解决的是 LLM 调用层面的统一治理。
比如:
统一接入 OpenAI、DeepSeek、通义千问、Claude 等模型
统一 API 格式
统一鉴权
统一限流
统一日志审计
统一费用统计
统一模型路由
统一降级策略
统一 Prompt 管理
统一内容安全过滤
在 Agent 项目里,大模型网关不是必须的,但在企业级项目里很有价值。
如果只是个人学习项目:
Spring AI → DeepSeek API
这样就可以跑起来。
但如果是企业级平台,可能就变成:
Agent 应用
↓
大模型网关
↓
不同模型厂商
这样做的好处是:
模型可以动态切换
调用成本可以统计
异常可以统一监控
不同业务可以配置不同模型
敏感内容可以统一过滤
Token 消耗可以统一管理
所以大模型网关更像是 Agent 平台化之后的基础设施,而不是每个小项目一开始就必须要做的东西。
十、把这些概念放到一张图里
可以这样理解整个 Agent 通信体系:
用户
↓
Agent 应用
↓
┌──────────────────────────────┐
│ Agent 核心层 │
│ 任务理解 / 规划 / 记忆 / 工具决策 │
└──────────────────────────────┘
↓ ↓
↓ ↓
MCP Client A2A Client
↓ ↓
MCP Server 其他 Agent
↓ ↓
工具 / API / DB 专业 Agent 服务
↓
外部系统
如果再加上大模型网关:
Agent 应用
↓
大模型网关
↓
LLM 服务商
如果再加上 RAG:
Agent 应用
↓
RAG 检索链路
↓
向量库 / ES / 知识库
这里 RAG 只是 Agent 获取知识的一种方式。
MCP 是 Agent 连接工具的方式。
A2A 是 Agent 连接其他 Agent 的方式。
大模型网关是 Agent 调用模型时的治理入口。
十三、今天的总结
今天这部分学习让我意识到:
Agent 的核心不只是“会不会调用大模型”,而是它能不能连接外部世界。
Function Calling 解决的是:
大模型如何表达工具调用意图
MCP 解决的是:
Agent 如何标准化连接工具、资源和数据源
A2A 解决的是:
Agent 如何和其他 Agent 通信协作
Streamable HTTP 解决的是:
MCP 在远程服务场景下如何更好地传输消息
SSE 解决的是:
服务端如何向客户端持续流式输出
大模型网关解决的是:
企业级场景下模型调用如何统一治理
RAG 在这里也很重要,但它不是今天的主角。
它更像是 Agent 的一种知识获取能力:
Agent 需要知识 → 调用 RAG 检索工具 → 获取上下文 → 再调用大模型生成答案
而 MCP、A2A、Streamable HTTP、大模型网关这些内容,则是在回答另一个更底层的问题:
当 Agent 不再只是聊天,而是要执行任务、调用工具、连接系统、协作完成复杂目标时,它们之间到底靠什么通信?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)