A2A:Agent2Agent 协议,
安全协作(Secure Collaboration):通过引入认证/授权机制,保证 Agent 之间的身份互信。任务状态管理(Task and state mgmt):实现了 Agent 之间互操作任务以及任务状态的可管理性。用户体验协商(UX negotiation):不同的 Agent 通过协商的方式,对用户提供无缝的体验。功能发现(Capability discovery):提供了 Agen
1 MCP 与A2A关系
| 特性 | Agent2Agent (A2A) | Model Context Protocol (MCP) |
|---|---|---|
| 主要交互对象 | Agent 到 Agent (智能体之间的协作对话) | Agent 到 Tool/Resource (智能体调用外部能力/数据) |
| 交互性质 | 协作性、协商性、状态驱动、可能长时间运行、多模态信息传递 | 调用性、请求-响应式、通常更结构化、面向具体功能执行 |
| 核心目标 | 实现异构 Agent 间的互操作性与任务协同 | 标准化 Agent 对外部工具和上下文资源的访问与使用 |
| 抽象层级 | 应用层/协作层协议 | 更偏向于 Agent 内部决策与执行层面的工具接口协议 |
| 解决的核心问题 | Agent 之间的“沟通障碍”和“协作壁垒” | Agent 调用外部工具时的“接口混乱”和“集成复杂” |
| 典型场景 | 任务委派、多 Agent 联合决策、复杂工作流编排、人机协同 | API 调用、数据库查询、文件读写、代码执行、RAG 数据检索 |

2 资料链接
- Agent2Agent 官方网站:https://google.github.io/A2A
- Agent2Agent 官方 GitHub 仓库:https://github.com/google/A2A
- Awesome A2A 资源库:https://github.com/ai-boost/awesome-a2a
- Model Context Protocol (MCP) 相关信息:https://modelcontextprotocol.io/
- A2A 发布公告 (Google Developers Blog):https://developers.googleblog.com
3 A2A介绍
A2A 作为一个开放协议,充分考虑了 Agent 在和用户、企业打通的过程中所面临的一些挑战,其主要功能特性有以下四点:
- 安全协作(Secure Collaboration):通过引入认证/授权机制,保证 Agent 之间的身份互信。
- 任务状态管理(Task and state mgmt):实现了 Agent 之间互操作任务以及任务状态的可管理性。
- 用户体验协商(UX negotiation):不同的 Agent 通过协商的方式,对用户提供无缝的体验。
- 功能发现(Capability discovery):提供了 Agent 之间相互发现各自能力的机制。
除此之外,A2A 也在企业的无缝接入、简化集成方面,有比较好的考量。
3.1 参与与流程
A2A 中包含三个核心的参与者:
• 用户(User):发起智能体协助请求的主体。存在于协议中,主要的作用是用于 认证&授权 。
• A2A 客户端(Client Agent,即客户端智能体):指的是任务发起者
• A2A 服务器(Server Agent,即远程智能体):指的是任务的执行者
Client 和 Server 之间的通信,可以理解为就是一个个简单的请求和结果的响应,只不过这个请求是一个个的任务。一个 Agent 既可以是 Client 也可以是 Server。
3.2 核心概念
Client Agent 和 Server Agent 交互的过程中,主要涉及到的一些Entity:AgentCard、Task 、Artifact 、Message、Part。
- Agent Card:一个公共元数据文件,位于/.well-known/agent.json,描述智能体的能力、技能、端点URL和认证要求,用于能力发现
- A2A服务器:暴露HTTP端点,实现A2A协议方法,管理任务执行
- A2A客户端:应用程序或智能体,消费A2A服务,通过发送tasks/send或tasks/sendSubscribe请求与服务器交互
- 任务(Task):工作的核心单位,有唯一ID,可处于提交、处理中、需要更多输入、完成、失败或取消等状态
- 消息(Message):通信单位,角色为用户或智能体,包含"部分"(Parts)部分(Part):消息或工件中的内容单位,包括Text
- Part(文本内容)、FilePart(文件,内联字节或URI)和DataPart(结构化JSON数据,如表单)
- 工件(Artifact):任务生成的输出,也包含Parts
3.2.1 AgentCard
AgentCard 是 Server Agent 的名片,它主要描述了 Server Agent 的能力、认证机制等信息。
Client Agent通过获取不同 Server Agent 的 AgentCard,了解不同 Server Agent 的能力,来决断具体的任务执行应该调用哪个 Server Agent 。
AgentCard 内容示例:
interface AgentCard {
name: string;
description: string;
url: string;
provider?: {
organization: string;
url: string;
};
version: string;
documentationUrl?: string;
capabilities: {
streaming?: boolean;
pushNotifications?: boolean;
stateTransitionHistory?: boolean;
};
authentication: {
schemes: string[];
credentials?: string;
};
defaultInputModes: string[];
defaultOutputModes: string[];
skills: {
id: string;
name: string;
description: string;
tags: string[];
examples?: string[];
inputModes?: string[];
outputModes?: string[];
}[];
}
3.2.2 Task
Task 是一个具有状态的实体,由Client Agent创建,其状态由Server Agent维护。
一个Task用于达到特定的目标或者结果。Agent Client和Server Client在Task中交换Mesaage,Server Agent生成的结果叫做Artifact。
除此之外,每个Task有一个唯一的sessionId,多个Task可以使用一个sessionId,表明多个Task属于同一个会话的一部分。
Task 示例:
interface Task {
id: string;
sessionId: string;
status: TaskStatus;
history?: Message[];
artifacts?: Artifact[];
metadata?: Record<string, any>;
}
interface TaskStatus {
state: TaskState;
message?: Message;
timestamp?: string;
}
interface TaskStatusUpdateEvent {
id: string;
status: TaskStatus;
final: boolean; //indicates the end of the event stream
metadata?: Record<string, any>;
}
interface TaskArtifactUpdateEvent {
id: string;
artifact: Artifact;
metadata?: Record<string, any>;
}
interface TaskSendParams {
id: string;
sessionId?: string;
message: Message;
historyLength?: number;
pushNotification?: PushNotificationConfig;
metadata?: Record<string, any>; // extension metadata
}
type TaskState =
| "submitted"
| "working"
| "input-required"
| "completed"
| "canceled"
| "failed"
| "unknown";
3.2.3 Artifact
Artifacts:Server Agent 在执行任务后生成的目标结果叫做 Artifact,一个 Task 可能生成一个或者多个 Artifact。
Artifacts 是不可变的,可以命名,并且可以有多个部分。流式响应可以分批次,将结果附加到现有 Artifacts上。
interface Artifact {
name?: string;
description?: string;
parts: Part[];
metadata?: Record<string, any>;
index: number;
append?: boolean;
lastChunk?: boolean;
}
3.2.4 Message
在 Task执行过程中,Server Agent和Client Agent之间是通过Message完成交流的,当然,这不包括Artifact。
它可以包括:Agent的思考、用户上下文、指令、错误、状态或元数据。
一个Message可以包含多个Part,每个Part携带不同的内容。
Message 示例:
interface Message {
role: "user" | "agent";
parts: Part[];
metadata?: Record<string, any>;
}
3.2.5 Part
Part 是 Message 和 Artifact 的核心组成部分,代表了其携带的主要内容。每个 Part 都标识了内容类型和具体内容。
Part 示例:
interface TextPart {
type: "text";
text: string;
}
interface FilePart {
type: "file";
file: {
name?: string;
mimeType?: string;
// oneof {
bytes?: string; //base64 encoded content
uri?: string;
//}
};
}
interface DataPart {
type: "data";
data: Record<string, any>;
}
type Part = (TextPart | FilePart | DataPart) & {
metadata: Record<string, any>;
};
3.3 通信&认证
ClientAgent 和ServerAgent之间通过HTTP协议进行通信,使用经典的C/S模式,支持SSE流式数据传输,数据格式为JSON-RPC2.0。
A2A遵循Open API规范进行身份验证。A2A不会在协议中交换身份信息。相反,它们会在带外获取材料(如令牌),并在HTTP 头中传输。
3.4 核心流程
Client Agent 和 Server Agent 之间协同工作需要经过以下几个关键步骤:
- Server Agent 在指定站点托管自己的 AgentCard;
- Client Agent 主动发现 AgentCard;
- Client Agent 发起一个 Task;
- Client Agent 设置任务通知监听;
- Server Agent 执行任务,返回 Artifact;
- Client Agent 获取 Artifact。
A2A的典型工作流程包括以下几个步骤
- 发现:客户端从/.well-known/agent.json获取Agent Card,了解智能体的能力
- 启动:客户端发送任务请求,使用tasks/send处理即时任务,返回最终Task对象;使用tasks/sendSubscribe处理长期任务,服务器通过SSE事件发送更新
- 处理:服务器处理任务,可能涉及流式更新或直接返回结果
- 交互(可选):若任务状态为input-required,客户端可发送更多消息,使用相同Task ID提供输入
- 完成:任务达到终端状态(如completed、failed或canceled)
3.4.1 AgentCard 托管 & 发现
官方建议将 AgentCard 托管在 https://host_ip_port/.well-known/agent.json
上面这种方式叫做 Open Discovery,
除此之外,还有另外两种方式:Curated Discovery 和 Private Discovery,详见:链接
Agent Client 可以通过请求https://host_ip_port/.well-known/agent.json,获取到指定的 AgentCard,并集成到自己的提示词或者工具集中。
//agent card
{
"name": "Google Maps Agent",
"description": "Plan routes, remember places, and generate directions",
"url": "https://maps-agent.google.com",
"provider": {
"organization": "Google",
"url": "https://google.com"
},
"version": "1.0.0",
"authentication": {
"schemes": "OAuth2"
},
"defaultInputModes": ["text/plain"],
"defaultOutputModes": ["text/plain", "application/html"],
"capabilities": {
"streaming": true,
"pushNotifications": false
},
"skills": [
{
"id": "route-planner",
"name": "Route planning",
"description": "Helps plan routing between two locations",
"tags": ["maps", "routing", "navigation"],
"examples": [
"plan my route from Sunnyvale to Mountain View",
"what's the commute time from Sunnyvale to San Francisco at 9AM",
"create turn by turn directions from Sunnyvale to Mountain View"
],
// can return a video of the route
"outputModes": ["application/html", "video/mp4"]
},
{
"id": "custom-map",
"name": "My Map",
"description": "Manage a custom map with your own saved places",
"tags": ["custom-map", "saved-places"],
"examples": [
"show me my favorite restaurants on the map",
"create a visual of all places I've visited in the past year"
],
"outputModes": ["application/html"]
}
]
}
3.4.2 发起Task
允许客户端向远程代理发送内容,以启动新任务、恢复中断的任务或重新打开已完成的任务。
{
"jsonrpc": "2.0",
"id": 1,
"method":"tasks/send",
"params": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"message": {
"role":"user",
"data": [{
"type":"text",
"text": "tell me a joke"
}]
},
"metadata": {}
}
}
3.4.3 设置ClientAgent任务状态监听
ClientAgent 可以设置一个方法,给到 ServerAgent,当 ServerAgent 修改 Task 状态后,同步调用 ClientAgent 的监听方法
//Request
{
"jsonrpc": "2.0",
"id": 1,
"method":"tasks/pushNotification/set",
"params": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"pushNotificationConfig": {
"url": "https://example.com/callback",
"authentication": {
"schemes": ["jwt"]
}
}
}
}
//Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"pushNotificationConfig": {
"url": "https://example.com/callback",
"authentication": {
"schemes": ["jwt"]
}
}
}
}
3.4.4 执行 Task,返回结果
Server Agent 执行任务,并以 Artifact 的形式,返回结果。
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"sessionId": "c295ea44-7543-4f78-b524-7a38915ad6e4",
"status": {
"state": "completed",
},
"artifacts": [{
"name":"joke",
"parts": [{
"type":"text",
"text":"Why did the chicken cross the road? To get to the other side!"
}]
}],
"metadata": {}
}
}
3.4.5 获取 Artifact
这里需要注意的是,Client Agent 需要通过获取 Task 的方式,获取到Artifact
//Request
{
"jsonrpc": "2.0",
"id": 1,
"method":"tasks/get",
"params": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"historyLength": 10,
"metadata": {}
}
}
//Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"sessionId": "c295ea44-7543-4f78-b524-7a38915ad6e4",
"status": {
"state": "completed"
},
"artifacts": [{
"parts": [{
"type":"text",
"text":"Why did the chicken cross the road? To get to the other side!"
}]
}],
"history":[
{
"role": "user",
"parts": [
{
"type": "text",
"text": "tell me a joke"
}
]
}
],
"metadata": {}
}
}
3.5 A2A交互的生命周期
A2A的一次完整交互,大致分为四个阶段:
- (1)智能体发现(Agent Discovery)
客户端通过目录服务或已知URL查找可用的智能体,并获取其名片(Agent Card),这为后续的交互提供智能体的基本信息和功能描述。- (2)身份验证(Authentication)
通过标准的认证协议(如OAuth、JWT等)完成身份验证,确保通信双方的安全性和授权。- (3)消息交换(Message Exchange)
智能体之间进行简单的请求-响应交换。客户端发起任务请求,远程智能体响应任务状态。
更多推荐


所有评论(0)