1 MCP 与A2A关系

特性 Agent2Agent (A2A) Model Context Protocol (MCP)
主要交互对象 Agent 到 Agent (智能体之间的协作对话) Agent 到 Tool/Resource (智能体调用外部能力/数据)
交互性质 协作性、协商性、状态驱动、可能长时间运行、多模态信息传递 调用性、请求-响应式、通常更结构化、面向具体功能执行
核心目标 实现异构 Agent 间的互操作性与任务协同 标准化 Agent 对外部工具和上下文资源的访问与使用
抽象层级 应用层/协作层协议 更偏向于 Agent 内部决策与执行层面的工具接口协议
解决的核心问题 Agent 之间的“沟通障碍”和“协作壁垒” Agent 调用外部工具时的“接口混乱”和“集成复杂”
典型场景 任务委派、多 Agent 联合决策、复杂工作流编排、人机协同 API 调用、数据库查询、文件读写、代码执行、RAG 数据检索

在这里插入图片描述

2 资料链接

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)
    智能体之间进行简单的请求-响应交换。客户端发起任务请求,远程智能体响应任务状态。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐