个人简介
作者简介:全栈研发,具备端到端系统落地能力,专注大模型的压缩部署、多模态理解与 Agent 架构设计。 热爱“结构”与“秩序”,相信复杂系统背后总有简洁可控的可能。
我叫观熵。不是在控熵,就是在观测熵的流动
个人主页:观熵
个人邮箱:privatexxxx@163.com
座右铭:愿科技之光,不止照亮智能,也照亮人心!
专栏导航
观熵系列专栏导航:
AI前沿探索:从大模型进化、多模态交互、AIGC内容生成,到AI在行业中的落地应用,我们将深入剖析最前沿的AI技术,分享实用的开发经验,并探讨AI未来的发展趋势
AI开源框架实战:面向 AI 工程师的大模型框架实战指南,覆盖训练、推理、部署与评估的全链路最佳实践
计算机视觉:聚焦计算机视觉前沿技术,涵盖图像识别、目标检测、自动驾驶、医疗影像等领域的最新进展和应用案例
国产大模型部署实战:持续更新的国产开源大模型部署实战教程,覆盖从 模型选型 → 环境配置 → 本地推理 → API封装 → 高性能部署 → 多模型管理 的完整全流程
TensorFlow 全栈实战:从建模到部署:覆盖模型构建、训练优化、跨平台部署与工程交付,帮助开发者掌握从原型到上线的完整 AI 开发流程
PyTorch 全栈实战专栏: PyTorch 框架的全栈实战应用,涵盖从模型训练、优化、部署到维护的完整流程
深入理解 TensorRT:深入解析 TensorRT 的核心机制与部署实践,助力构建高性能 AI 推理系统
Megatron-LM 实战笔记:聚焦于 Megatron-LM 框架的实战应用,涵盖从预训练、微调到部署的全流程
AI Agent:系统学习并亲手构建一个完整的 AI Agent 系统,从基础理论、算法实战、框架应用,到私有部署、多端集成
DeepSeek 实战与解析:聚焦 DeepSeek 系列模型原理解析与实战应用,涵盖部署、推理、微调与多场景集成,助你高效上手国产大模型
端侧大模型:聚焦大模型在移动设备上的部署与优化,探索端侧智能的实现路径
行业大模型 · 数据全流程指南:大模型预训练数据的设计、采集、清洗与合规治理,聚焦行业场景,从需求定义到数据闭环,帮助您构建专属的智能数据基座
机器人研发全栈进阶指南:从ROS到AI智能控制:机器人系统架构、感知建图、路径规划、控制系统、AI智能决策、系统集成等核心能力模块
人工智能下的网络安全:通过实战案例和系统化方法,帮助开发者和安全工程师识别风险、构建防御机制,确保 AI 系统的稳定与安全
智能 DevOps 工厂:AI 驱动的持续交付实践:构建以 AI 为核心的智能 DevOps 平台,涵盖从 CI/CD 流水线、AIOps、MLOps 到 DevSecOps 的全流程实践。
C++学习笔记?:聚焦于现代 C++ 编程的核心概念与实践,涵盖 STL 源码剖析、内存管理、模板元编程等关键技术
AI × Quant 系统化落地实战:从数据、策略到实盘,打造全栈智能量化交易系统
大模型运营专家的Prompt修炼之路:本专栏聚焦开发 / 测试人员的实际转型路径,基于 OpenAI、DeepSeek、抖音等真实资料,拆解 从入门到专业落地的关键主题,涵盖 Prompt 编写范式、结构输出控制、模型行为评估、系统接入与 DevOps 管理。每一篇都不讲概念空话,只做实战经验沉淀,让你一步步成为真正的模型运营专家。
《不是竞争,而是协同:A2A × MCP 双协议协作机制全解析》
一文看懂 Agent 通信与工具调用的职责分界与融合路径
📄 摘要
在智能体(AI Agent)系统日益复杂化的今天,Google 发布的 A2A 协议与 Anthropic 主导的 MCP 协议,分别在智能体间通信与外部资源连接领域构建了开放协议标准。
这两套协议并不对立,而是从不同维度出发,针对智能体协作系统中的关键环节进行补全与优化:
- A2A 解决 Agent ↔ Agent 间的“能力发现 + 任务协作”问题;
- MCP 解决 Agent ↔ 外部工具 / 数据的“结构化访问 + 调用执行”问题。
本文将基于最新发布的协议规范,客观对比两者在设计理念、结构模型、典型场景中的应用差异,并以真实开发流程为蓝本,演示如何将 A2A 与 MCP 联合使用,构建一套可扩展、高可维护的智能体系统。
A2A × MCP详细:
一文搞懂 MCP 协议:多模态大模型的“神经调度中枢”是怎么工作的?【篇幅略长建议先收藏】
Google 正式发布 A2A 协议:构建多智能体协同生态的关键一步
📚 目录
一、为什么需要两个协议?智能体系统中的协作与连接双难题
- 协作问题:Agent 间无法标准对话
- 连接问题:Agent 无法标准调用工具
二、职责边界与设计出发点
- A2A:智能体间的任务调度 + 状态追踪
- MCP:模型与外部资源的接口桥梁
- 不同角色 → 不同设计原则
三、结构对比:A2A 与 MCP 各自的核心构件
- A2A 五要素:AgentCard / Task / Message / Artifact / SSE
- MCP 四组件:Resource / Tool / PromptTemplate / Context
四、典型使用场景对照分析
- 单一 Agent 调工具(适合 MCP)
- 多 Agent 协同工作(适合 A2A)
- 混合场景:Agent 联动 + 工具编排(A2A + MCP 协同)
五、协同演示:一次跨系统“出差审批流程”的完整调用链
- 出差申请 Agent → 调用 OA 系统(MCP)
- 审批流转 Agent → 通知财务 Agent(A2A)
- 财务 Agent → 查询报销政策(MCP)
六、开发视角:如何搭建兼容 A2A + MCP 的智能体平台
- 接入结构设计:Agent Registry + MCP Resource Layer
- 调度机制拆解:谁发起任务?谁执行?谁生成成果?
- 安全认证 / 权限隔离 / 日志追踪的协同建议
七、小结:A2A × MCP 是 AI Agent 工程系统的“协作 × 执行”双基建
- 不重叠、不冲突,各取所长
- 真正可扩展的智能体系统,应同时拥有通信协议与调用接口
一、为什么需要两个协议?智能体系统中的协作与连接双难题
在构建多智能体(Multi-Agent)系统的过程中,开发者往往会遇到两种最具挑战性的场景:
- 一类问题是:如何让多个 Agent 像团队成员一样协同完成一个任务?
- 另一类问题是:如何让某个 Agent 能高效、安全地调用外部工具或数据库,完成复杂的执行?
这两类问题背后的工程诉求非常不同,前者关乎通信与任务流转,后者关乎能力连接与执行控制。
这也正是 A2A 与 MCP 各自出现的历史背景:
协议 | 目标 | 解决的问题类型 | 发起方 |
---|---|---|---|
A2A (Agent-to-Agent) | 构建智能体间通用协作协议 | Agent ↔ Agent 的通信、任务协同、进度同步 | Google(2025年发布) |
MCP (Model Context Protocol) | 让 LLM/Agent 标准化连接外部资源 | Agent ↔ 工具 / 数据 / 外部系统 的能力调用与结构化输入输出 | Anthropic(2024年发布) |
这两个协议不是竞争,而是分别出现在两个不同维度的工程盲区上。
🧩 盲区一:Agent 系统之间“不会说话”
过去我们在开发多个 Agent 协同系统时,比如让“日报生成 Agent”调用“日报调度 Agent”,需要开发者:
- 自定义接口;
- 写 prompt glue 来桥接意图;
- 确定状态转换与反馈逻辑;
- 再写一堆监控代码跟踪每个 Agent 的执行状态。
更糟的是,每个 Agent 可能来自不同开发框架(LangChain、AutoGen、Python 脚本、Node.js 工具),通信语义全靠人为约定。这导致:
- 重复工作量大;
- 接口不通用;
- Agent 不可组合、不易移植。
**A2A 就是为了解决“智能体之间的沟通壁垒”**而生:
让每个 Agent 都有身份证(AgentCard)、通用任务语言(Task)、结构化成果报告(Artifact),还能异步地给彼此发消息(Message)和推送状态(SSE)。
🔧 盲区二:Agent 本身“不会动手”
另一方面,即使你有一个能力极强的语言模型 Agent,它也未必“能干实事”:
- 想调用一个搜索引擎?得写插件;
- 想查数据库?得拼接 SQL + 格式校验;
- 想访问第三方接口?得写网关 + 认证 + 统一返回结构……
大模型本身没有“结构化接口调用能力”,它擅长理解,但不擅长对接系统化资源。
MCP(Model Context Protocol)就是解决这个问题的:
把工具、数据、服务,封装为 MCP Server,所有 Agent 只需发起标准请求,就能调用这些能力,像接上 USB-C 一样无感知接入外部系统。
🧭 协作与连接:智能体系统的两块拼图
可以这样理解:
层级 | 目标 | 协议 |
---|---|---|
协作层 | Agent ↔ Agent,任务流转、状态协同、通信结构化 | ✅ A2A |
连接层 | Agent ↔ 工具/服务/知识源,结构化调用、接口抽象 | ✅ MCP |
构建一个智能体系统,就像搭建一个企业团队:
- A2A 协议,定义了团队成员之间的协作规范;
- MCP 协议,定义了每个成员如何使用工具和资源的标准接口。
这两套协议不冲突,也不重叠,它们是彼此的“逻辑邻居”,而非“竞品对手”。
🎯 小结
我们为什么需要两个协议?
因为智能体系统不仅要能说话(A2A),还要能动手(MCP)。
- 没有 A2A,Agent 各自为战,系统像“哑巴协作”;
- 没有 MCP,Agent 再聪明也只能干坐着,无法调用现实资源。
当协作遇上执行,真正可落地、可扩展、可重用的 Agent 系统才得以成立。
二、职责边界与设计出发点
从外表看,A2A 和 MCP 都是“AI Agent 协议”,都涉及智能体、任务、调用、结果,但它们的设计目标、通信路径和角色模型截然不同。
理解它们的根本区别,不是看谁更强,而是要回答一句话:
“这个协议,到底是为了解决什么样的工程问题而设计的?”
🎯 A2A 的出发点:让 Agent 像团队一样协同工作
A2A 协议由 Google 在 2025 年提出,其设计动机是源于一种现实痛点:
不同厂商、框架、模型的 Agent 之间,没有统一的“说话方式”与“协作流程”。
这导致:
- Agent 不知道对方是谁、能干嘛(缺少能力声明);
- 发任务要靠自定义 API 或 prompt 拼接(通信混乱);
- 无法追踪协作任务进展(缺乏状态标准);
- 成果物格式不统一,无法流转到下一个 Agent(耦合严重)。
A2A 就是为这些问题定制的:
- 📇
AgentCard
→ 身份名片 + 能力声明(像 API 注册); - 📦
Task
→ 标准任务格式、状态流、调度控制; - 📨
Message
→ 协作过程中的往返通信; - 📄
Artifact
→ 明确结构的最终成果包装; - 🔁
SSE/Webhook
→ 实时异步协作机制。
A2A 的视角是**“Agent 与 Agent”,不是工具,不是数据库,不是模型接口,而是真正能自治、能响应、能返回成果的智能体之间的互联语义结构**。
🧰 MCP 的出发点:让 Agent 像人一样调工具
而 MCP 协议最初由 Anthropic 于 2024 年提出,出发点则完全不同:
LLM / Agent 虽然能理解自然语言,但缺乏标准方式调用工具、数据库、企业系统或外部 API,每次接工具都得重写 prompt、封装接口、定义调用格式,非常低效。
所以 MCP 提出了一种“抽象调用桥梁”机制,让所有外部系统都可以被封装为:
- MCP Server:一个能力提供方,代表一个插件、数据库、搜索引擎、系统服务等;
- MCP Tool:具体的功能接口,如
search_documents
,get_weather
,analyze_pdf
; - MCP Resource:可访问的数据、文件、知识片段;
- PromptTemplate:Agent 发送调用请求时可引用的 prompt 构造规则;
- Context Layer:工具调用时自动注入上下文变量。
MCP 的视角是**“Agent 与世界”**,它希望 Agent 能像人一样,自然地说:
“帮我找一下财务系统里的发票数据。”
而不是被迫写:
POST /api/v1/query --header token --data {"sql": "SELECT * FROM invoice WHERE month=3"}
🔍 核心职责对比:谁负责 Agent 间协作?谁负责执行外部调用?
对比维度 | A2A | MCP |
---|---|---|
核心目标 | Agent 间标准化通信、任务调度与协作追踪 | Agent 与工具/数据之间的调用桥梁 |
面向对象 | Agent ↔ Agent | Agent ↔ Resource / Tool |
核心组件 | AgentCard, Task, Message, Artifact, SSE | Resource, Tool, PromptTemplate, Context |
应用层范式 | 类似服务网格 / 微服务 RPC | 类似 USB-C 接口 / OpenAPI 工具调用 |
是否涉及任务状态流转 | ✅ 是(完整生命周期) | ❌ 否(通常为请求响应或短事务) |
是否支持异步通信 | ✅ 原生支持 SSE / Webhook | 取决于具体 MCP 实现 |
对结果输出的建模 | Artifact 构造输出链 | Response 封装格式标准化 |
使用场景 | 多 Agent 系统协同工作 | Agent 调用外部系统资源/能力 |
🧭 补充视角:它们不是竞争关系,而是功能位置不同
你可以想象构建一个 Agent 系统,就像组建一支虚拟团队来完成任务。
- A2A 负责让这些“成员”可以有效合作:谁发起任务,谁负责执行,如何交换信息、确认状态、回传成果。
- MCP 则负责让这些“成员”能高效调工具:需要用日历、查数据库、读 PDF,就用 MCP 发起标准化调用。
A2A 定义的是Agent 联邦协作机制,
MCP 提供的是Agent 能力调用接口层。
就像一个人既要会沟通、分工(A2A),也要会使用电脑、手机、搜索引擎(MCP),两者是配套能力,而不是替代关系。
✅ 小结
理解协议的最好方式不是看接口名,而是想清楚:
- 它的服务对象是谁?
- 它解决的工程问题是什么?
- 它想要补全哪段系统链路?
A2A 是为了解决“多个 Agent 之间协作难”的问题;
MCP 是为了解决“Agent 调用外部能力繁琐”的问题。
而在实际系统中,我们往往既需要协作,又需要调用,所以 ——
A2A × MCP 联动,才是构建下一代 AI 系统的全链路基建组合。
三、结构对比:A2A 与 MCP 各自的核心构件
在工程设计中,结构决定边界。
理解 A2A 和 MCP 的协议本质,最直接的方式就是:逐一拆解它们的核心组件,看它们“分别在系统中扮演了什么角色”。
我们先分别列出它们的基础组成,然后做一一解析:
协议 | 核心模块 |
---|---|
A2A | AgentCard , Task , Message , Artifact , SSE/Webhook |
MCP | Resource , Tool , PromptTemplate , Context , Response |
📇 A2A:为智能体之间的协作设计的“任务通信协议层”
A2A 的设计遵循典型的“任务驱动 + 状态管理 + 异步协作”模型,组件职责如下:
组件 | 含义 | 类比角色 |
---|---|---|
AgentCard | 描述 Agent 能力的身份证 + API 文档 | Swagger 文档 + plugin manifest |
Task | Agent 发起的标准任务结构体,含状态、参数、请求方/响应方 | RPC 调用元数据 |
Message | 多 Agent 任务过程中的异步沟通信息 | 双向聊天 + 参数补充通道 |
Artifact | 任务的最终输出成果,可被下游 Agent 消费 | 可复用结果包(支持文件、数据、报告等) |
SSE/Webhook | 推送型通信,用于异步任务状态通知或中间结果传输 | 事件驱动回调机制 |
这些模块构成了一个完整的“Agent-to-Agent 协作语言”,可以独立支撑一个跨 Agent 的流程自动化系统。
🧰 MCP:为模型与外部系统交互构建的“能力调用抽象层”
MCP 的设计更偏向于调用抽象和上下文封装,它让 Agent 能够标准化地“调工具”、“查资源”、“送请求”,组件设计如下:
组件 | 含义 | 类比角色 |
---|---|---|
Resource | 可访问的目标对象,如文档、数据库、搜索结果等 | 文件句柄 / URL / ID |
Tool | 可执行的操作指令,如 search_docs , analyze_pdf , send_email | 函数调用 / API endpoint |
PromptTemplate | 工具调用时的 prompt 构造模板,指导 LLM 生成请求 | prompt builder / 操作说明书 |
Context | 任务调用上下文信息,如用户身份、会话 ID、最近任务等 | 会话变量 / 用户指令历史 |
Response | 工具返回的结构化结果,包括 content , metadata , source 等 | 响应报文 / JSON 数据结构 |
MCP 不关心任务的状态流转、发送者是谁、目标是谁——它的唯一目标是让 Agent 优雅地连接外部世界,并拿回干净的结果。
🧩 横向对比总结表
模块功能 | A2A 模块 | MCP 模块 | 是否互补 |
---|---|---|---|
智能体注册 / 能力描述 | AgentCard | – | ✅ A2A 专属 |
发起任务 / 指令请求 | Task | Tool | ✅ 可组合 |
输入参数 / 调用上下文 | Task.parameters , Message.content | PromptTemplate , Context | ✅ 可组合 |
结果输出结构 | Artifact | Response | ✅ 都支持结构化输出,但格式风格不同 |
状态追踪 / 流程管理 | Task.status , Message | – | ✅ A2A 专属 |
事件回调 / 异步支持 | SSE , Webhook | MCP 支持自定义 webhook,协议未强定义 | ✅ A2A 更原生 |
多 Agent 调度能力 | ✅ | ❌ | ✅ A2A 擅长 |
工具封装能力 | ❌ | ✅ | ✅ MCP 擅长 |
🧠 实用建议:两者如何组合使用?
在真实工程中,一个复杂任务往往既包含 Agent 间任务流转,也包含 Agent 调用工具或服务的过程。建议如下:
-
用 A2A 处理协作逻辑,比如:
- 谁发起任务?谁接收?结果传给谁?
- 多个 Agent 如何异步协同处理一个长流程?
-
用 MCP 封装外部系统能力,比如:
- 文件分析、知识检索、结构化数据调用、PDF 读取
- 自研服务封装成 MCP Server,供 Agent 调用
组合使用的推荐架构图如下:
用户指令
↓
主调度 Agent ←────────────→ Agent Registry(A2A)
↓ Task ↑
其他 Agent ←→ 工具封装(MCP Server)
↓ Tool Call ↑ Response
↓
统一汇总 → Artifact 输出
✅ 小结
- A2A 把智能体变成能“互相配合”的自治实体,像一个组织架构;
- MCP 把工具和资源变成能“标准调用”的模块接口,像一个开发者工具箱。
两者的组件设计方向不同,但目的完全统一:
让 Agent 不再只是一个 LLM 包装器,而是真正拥有“语言 + 工具 + 协作”能力的智能行动者。
四、典型使用场景对照分析
A2A 和 MCP 各自擅长解决不同类型的工程问题。为了更直观地理解它们的适用边界,我们以三类典型开发场景为例,对照分析各自发挥作用的时机与职责:
🧩 场景一:单智能体调用工具 → 用 MCP 即可解决
📌 场景描述:
你有一个智能助手 Agent,接收到用户请求:
“帮我找一下上周所有项目日报,汇总一下发我。”
这个任务不涉及其他 Agent 协同,它的工作链路是:
- 调用企业内部文档系统;
- 检索上周日报关键词;
- 使用本地总结工具抽取要点;
- 整理成邮件内容发送出去。
✅ 适合用 MCP:
- 文档系统作为一个
MCP Server
暴露出search_docs
接口; Tool
定义搜索操作;Resource
是一批日报文档;- Agent 只需发起请求 → 拿到 Response → 处理输出即可。
✅ 工程价值:
- MCP 统一了接入方式(只需一个请求结构);
- 不需要构建任务状态流转、异步反馈机制;
- 快速集成、适合短事务、单智能体调用场景。
🤝 场景二:多智能体任务协同 → 用 A2A 进行任务流控制
📌 场景描述:
你在构建一个“自动化日报生成流程”,用户只需说一句话:
“帮我生成今天的日报并推送给我。”
背后调用的 Agent 至少包括:
- 日志分析 Agent → 负责聚合数据;
- 文案生成 Agent → 生成自然语言摘要;
- 邮件 Agent → 格式化内容并发送给指定收件人。
✅ 适合用 A2A:
- 日志 Agent 生成 Artifact(结构化数据) → A2A 发 Task 给文案 Agent;
- 文案 Agent 用 Message 补充任务要求,如语言风格 → 产出新的 Artifact;
- 文案 Agent 完成后,再由调度 Agent 向邮件 Agent 发 Task → 发信。
✅ 工程价值:
- 每个 Agent 都是相对独立服务(可用不同框架 / 模型 / 语言);
- 调度逻辑通过 A2A 的 Task 流、状态流明确执行链条;
- 每个阶段可独立追踪状态、挂钩 SSE 推送结果。
🔁 场景三:多 Agent × 多工具协同 → A2A × MCP 联动最优
📌 场景描述:
构建一个“智能出差申请系统”,用户说:
“我下周去深圳出差,帮我订机票、安排酒店,走一遍公司报销流程。”
你将涉及:
- 任务规划 Agent:确定时间地点;
- 差旅订票 Agent:连接航旅平台订票;
- 报销流程 Agent:走 OA 审批流;
- 通知 Agent:通知上级 / 财务。
✅ 最佳实践是 A2A × MCP 联动:
- 任务规划 Agent 用 MCP 查询公司假期、城市航线等;
- 调票 Agent 调 MCP 工具查询并调用 OTA 订票接口;
- 报销流程 Agent 通过 A2A 发起审批 Task 给流程引擎 Agent;
- 各阶段之间通过 Task → Message → Artifact 串起协作过程;
- 最终由通知 Agent 汇总并通过 MCP 邮件接口发送提醒。
✅ 工程价值:
- MCP 把所有“接工具 / 接服务”的地方结构化统一;
- A2A 把所有“Agent 之间任务衔接”变得可控、可追踪;
- 不再需要 prompt glue 或中间脚本手动串联,所有协作组件可组合、可重用、可分布式部署。
🧠 小结:一句话判断场景适配关系
- 如果你在做 “模型调工具”:用 MCP,就像接 USB;
- 如果你在做 “Agent 调 Agent”:用 A2A,就像接工作流;
- 如果你在做 “系统级 AI 工作流”:用 A2A 管调度,用 MCP 管调用,两者合体,就是现代 AI 操作系统的底座。
五、协同演示:一次跨系统“出差审批流程”的完整调用链
为清晰说明 A2A 与 MCP 如何互补协同,本节我们以一个典型的“智能出差任务”作为例子,从用户指令出发,展示一个多 Agent × 多工具系统在实际运行时的任务链与技术接口结构。
🎯 任务目标
用户自然语言请求如下:
“我下周去深圳出差,帮我安排好机票、订酒店,提交公司审批流程,并发个提醒给财务。”
🧠 系统中将涉及的 Agent 与工具
角色 | 职责 | 接口类型 |
---|---|---|
travel-planner-agent | 解析出差目的地、日期 | LLM Agent(OpenAI、DeepSeek等) |
ticket-agent | 查询航班并预订 | 调用 OTA 平台(MCP) |
hotel-agent | 查询酒店并下单 | 调用住宿平台(MCP) |
oa-approval-agent | 提交出差申请 → 获取流程状态 | 与企业 OA 系统对接(MCP) |
notifier-agent | 通知上级 / 财务 | 通过邮件、IM 工具通知(MCP) |
main-orchestrator-agent | 主调度者,分发任务与接收结果 | A2A 中心协调 Agent |
🔁 整体调用流程图
[用户输入]
↓
[main-orchestrator-agent]
↓ ← A2A Task → → 解析目的地、时间
[travel-planner-agent]
↓ Artifact(地点/时间)
↓
A2A Task → [ticket-agent] → MCP 查询航班 → MCP 下单
↓
A2A Task → [hotel-agent] → MCP 查询酒店 → MCP 下单
↓
A2A Task → [oa-approval-agent] → MCP 调 OA 系统
↓
A2A Task → [notifier-agent] → MCP 调 Email / 飞书提醒
🔎 具体接口拆解:A2A 管调度,MCP 管调用
✅ A2A 的作用:
- 调度任务链条:Orchestrator 发出一系列
Task
给子 Agent; - 连接上下游:下游 Agent 生成的
Artifact
被上游 Agent 使用; - 追踪状态:每个 Task 的状态变化(running → completed → failed)由 Orchestrator 统一监听;
- 中途协商:部分 Agent(如 oa-approval-agent)可通过
Message
请求更多上下文信息;
✅ MCP 的作用:
-
ticket-agent 内部调用 OTA MCP Server:
{ "tool": "search_flight", "resource": "flights", "parameters": { "origin": "Beijing", "destination": "Shenzhen", "date": "2025-04-22" } }
得到结构化航班列表 → 通过另一个 MCP Tool 提交订单。
-
oa-approval-agent 内部调用审批系统:
{ "tool": "submit_expense_request", "context": { "employee_id": "E345", "department": "研发部" }, "resource": { "trip_info": { "city": "Shenzhen", "date_range": "2025-04-22 to 2025-04-25" } } }
-
notifier-agent 调飞书 / 邮件 MCP 服务:
- 工具:
send_message
- 资源:
notification_channel
- 上下文:审批单编号、出差摘要、发送人/接收人
- 工具:
🛠 开发者如何实现这样的调用系统?
- 每个 Agent 实现 A2A 标准接口(
/agentcard
,/task
,/message
,/artifact
) - Agent 内部作为 MCP Client 发送结构化调用请求,支持统一
POST /invoke_tool
- Orchestrator 用于:
- 加载 AgentCard,检查能力匹配;
- 分发 Task 并监听状态;
- 处理 Artifact 流转,决定任务下一个阶段。
✅ 工程总结:A2A 管任务线,MCP 管执行力
在这个真实系统中,A2A 做的事是:
谁先做、谁来做、做完了通知谁。
MCP 做的事是:
用什么工具做、怎么连接、结果标准返回给我。
两者没有重复职责,只有交界协作 —— 一边调度,一边执行,像“双线程”配合:
- A2A 是智能体之间的“协同协议栈”;
- MCP 是智能体与世界之间的“接口适配器”。
六、开发视角:如何搭建兼容 A2A + MCP 的智能体平台
随着 A2A 和 MCP 分别在智能体协作与工具调用领域建立起标准协议,越来越多的工程团队希望构建一套同时支持这两种机制的系统平台。
本章我们从工程角度出发,拆解如何搭建这样的智能体协作平台,包括:注册系统、任务调度机制、调用执行链、权限管理、安全与追踪机制等。
1️⃣ 平台结构总览
先给出一个兼容 A2A × MCP 的推荐系统结构图:
┌──────────────────────────────────────┐
│ A2A Agent Registry(能力中心) │
│ - AgentCard 存储 / 检索 │
│ - 能力声明 / 版本管理 │
└──────────────────────────────────────┘
↓(通过 AgentCard 查找)
┌──────────────────────────────────────┐
│ A2A Task Orchestrator(任务调度中心)│
│ - 分发 Task │
│ - 跟踪状态 / 超时 / 重试 │
│ - 管理 Message / Artifact │
└──────────────────────────────────────┘
↓ A2A 调度 Task → ↓ A2A 调度 Task →
┌─────────────┐ ┌─────────────┐
│ Agent A │ │ Agent B │
│ 内部可调用 MCP Tool │ │ 内部可调用 MCP Tool │
└─────────────┘ └─────────────┘
↓ ↓
MCP Tool Call MCP Tool Call
↓ ↓
┌──────────────────────┐ ┌──────────────────────┐
│ MCP Server(工具封装)│ │ MCP Server(数据封装)│
└──────────────────────┘ └──────────────────────┘
2️⃣ Agent Registry:让平台可发现、可筛选、可绑定
所有 Agent 要注册到一个统一的 Agent Registry 中,每个 AgentCard 需包含:
{
"id": "ticket-agent",
"version": "v1.0",
"capabilities": ["search_flights", "book_ticket"],
"input_format": "JSON",
"output_format": "Artifact",
"auth_type": "Bearer",
"mcp_compatible": true
}
✅ 推荐使用标准 JSON Schema 约束字段格式,便于注册中心进行自动验证与筛选。
你可以构建一个轻量服务如:
/agents
: 查询所有 AgentCard/agents/{id}
: 获取指定 Agent 能力/agents/search?capability=book_ticket
: 按能力筛选 Agent
3️⃣ Task Orchestrator:统一调度 Agent 协作流程
该模块负责:
- 根据用户意图 → 分配 Task → 发给对应 Agent;
- 接收并保存 Task 执行状态(
created → running → completed
); - 监听 SSE 推送或轮询状态;
- 统一处理中间 Message、最终 Artifact。
建议实现以下接口:
路由 | 方法 | 说明 |
---|---|---|
/task/send | POST | 发送任务到指定 Agent |
/task/status/{task_id} | GET | 获取任务执行状态 |
/task/events/{task_id} | GET(SSE) | 实时接收任务更新 |
/message/send | POST | Agent 之间交换补充信息 |
/artifact/{task_id} | GET | 获取任务最终结果 |
✅ Orchestrator 不参与具体任务处理逻辑,只负责分发、监听与结果整合。
4️⃣ MCP Server 构建:把工具、API、系统变成“结构化可调服务”
每个 MCP Server 实质上是一个能力接口提供方,开发方式类似微服务 API,但需满足 MCP 格式要求:
- 所有 Tool 调用使用标准结构:
{
"tool": "query_sql",
"resource": "invoice_db",
"parameters": {
"sql": "SELECT * FROM invoice WHERE month = 'March'"
},
"context": {
"session_id": "abc-123",
"user_id": "zhangxin"
}
}
- 返回结构化
response
包含:
{
"result": {...},
"metadata": {...},
"source": "internal_db"
}
可用 MCP 封装的目标包括:
- 文件解析(PDF / Excel / Word);
- 企业服务系统(OA、财务、CRM);
- 外部 API(天气、搜索、地图、翻译);
- 自研系统接口(数据中台、AI 模型服务等);
✅ 可引入插件管理系统,将 MCP Server 作为“能力插件”动态加载和扩展。
5️⃣ 安全与权限机制:两套协议协同的关键保障
由于 A2A 涉及 Agent 间任务传递,MCP 涉及调用外部敏感资源,因此安全机制尤为重要:
A2A 安全建议:
- 使用 JWT Token 或 OAuth 2.0 进行 Agent 身份认证;
- 每个 Task 设置发起方 + 接收方双向签名机制;
- Task Trace 日志中标记所有 Agent ID 与调用链。
MCP 安全建议:
- Tool 层设置访问控制白名单 + API Key;
- Context 中记录调用身份 + 任务上下文(用于审计);
- 所有敏感操作写入 Action Log(便于追责 / 调试)。
6️⃣ 日志与审计建议:构建链路级监控系统
为便于调试与审计,推荐:
- 记录 A2A 的每一次 Task 执行轨迹,包括状态变化;
- 记录 MCP 的每一次 Tool 调用,包括调用参数与响应结构;
- 为每个复合任务分配 trace_id,支持链路回溯;
- 设置可视化面板展示 Agent 调用树、执行时间线、异常点。
✅ 小结:工程落地的关键,是把“协议”变成“机制”
A2A 和 MCP 不只是两个“看起来很标准”的 JSON 协议,它们真正的价值在于:
- 解耦系统模块:每个 Agent、每个工具都可以独立开发、部署、组合;
- 降低协作门槛:用一套通用方式描述协作关系和调用流程;
- 提高系统稳定性与可观测性:每一环都有标准结构、状态记录、成果封装。
最终你将拥有一个类似“AI 微服务系统”的架构:
Agent 像服务,Tool 像插件,A2A 是服务总线,MCP 是接口驱动器。
七、小结:A2A × MCP 的边界、职责与组合使用建议
在当前多智能体系统的开发中,A2A 和 MCP 分别解决了两个独立但常见的问题:
- A2A(Agent-to-Agent 协议):用于不同智能体之间的通信与任务协作,强调身份声明、任务分发、状态追踪与异步交互。
- MCP(Model Context Protocol):用于智能体与外部工具/服务/数据之间的标准化接口调用,强调结构化输入输出、上下文注入与能力封装。
它们的适用边界清晰:
应用维度 | A2A 适合场景 | MCP 适合场景 |
---|---|---|
通信对象 | 多个 Agent 协作 | 单个 Agent 调用工具 |
核心功能 | 任务派发、结果汇总、流程控制 | 数据访问、能力调用、执行接口 |
执行流程 | 分阶段、可追踪、含状态 | 单步调用、即时响应 |
接入方式 | 注册 AgentCard、响应 Task | 注册 Tool、响应标准化请求 |
在多数系统中,两者并不是二选一,而是可以组合使用:
- 使用 A2A 组织 Agent 之间的任务链与协作顺序;
- 每个 Agent 内部通过 MCP 封装与外部系统的连接与调用逻辑。
这种拆分带来的好处是:架构清晰、职责分明、可扩展性强,适合大型、异构、任务链复杂的智能体系统建设。
🌟 如果本文对你有帮助,欢迎三连支持!
👍 点个赞,给我一些反馈动力
⭐ 收藏起来,方便之后复习查阅
🔔 关注我,后续还有更多实战内容持续更新
写系统,也写秩序;写代码,也写世界。
观熵出品,皆为实战沉淀。