A·Agent Guide 从经典智能体到前沿工程 ← 返回主博客
AGENT GUIDE / READING NOTES

第 8 章 MCP、A2A 与互操作

沿请求与任务生命周期理解 MCP、A2A 和应用责任

8.1 接入能力之前,先问对端承担什么职责

本章目标:能画出 host/client/server 与独立 Agent 的边界,理解调用和任务生命周期,并知道协议没有解决哪些应用问题。

研究助手需要两种外部能力:读取文档库;把“整理某主题资料”委托给另一个研究系统。前者的调用者通常掌握整体任务,通过工具取得数据;后者的接收者可能自己规划、使用工具并返回产物。

MCP 服务能力与 A2A 独立任务的系统边界

MCP 规范 [导读] 组织模型应用与外部工具、资源和提示的接口;A2A 规范 [导读] 组织独立 Agent 的发现、消息、任务状态与产物。它们可以组合,也存在能力重叠,不能仅按“同步工具 vs 异步 Agent”划线。

用户 → 宿主研究应用
       ├─ MCP Client → 文档服务:搜索 / 读取证据
       └─ A2A Client → 研究 Agent:接收任务 / 自主执行 / 返回产物

8.2 MCP 的三种服务能力为什么不等价

MCP 中 host 是使用模型的应用,client 是其中的协议连接组件,server 提供对外能力。server 不一定拥有语言模型:一个文档检索服务就可以是 server。

能力 本例中的用途 调用者要判断什么
Tools 按查询搜索文档 参数、权限、结果与副作用
Resources 读取有标识的资料 版本、可见性与内容完整性
Prompts 选择预设的研究模板 是否适合任务、是否可信

标准接口降低重复写适配器的成本。它没有自动把工具描述变成正确工具,也没有保证 server 返回的网页不含注入。宿主仍负责选择哪些内容进入模型、哪些请求允许执行。

8.3 沿一次工具请求理解消息关联

下面展示本章采用版本的一个工具请求示意;工具名 search_policy 是教学服务自定义名称。请求还需要配合实际 transport、认证和服务实现,复制这段 JSON 并不能得到可工作的连接。

{
  "jsonrpc": "2.0",
  "id": "req-17",
  "method": "tools/call",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {}
    },
    "name": "search_policy",
    "arguments": {"query": "member shipping"}
  }
}

id 用来关联协议请求与响应,name 指定已发现的工具,arguments 需要符合该工具的输入定义。JSON-RPC 错误与工具业务错误要分开:消息无法处理和“查询没有匹配文档”不是同一种情况。

尤其注意版本:2026-07-28 基础规范采用自包含请求与逐请求能力声明。不能把旧教程的一次初始化握手流程原样套进新版本;可选扩展还有各自的要求。工程上应固定所用 schema/SDK,记录双方能力,验证不支持情况。

8.4 A2A 为什么需要任务对象与产物

独立研究 Agent 可能先接受任务、继续工作、请求补充输入,最后交付文档。调用者需要区分“请求被收到”和“任务已完成”,并知道怎样查询状态、继续提供信息或取消。

A2A 的任务包含 ID、状态和可选产物等字段,Agent Card 描述对方能力与接口。以下只画生命周期含义,不使用特定绑定的完整报文格式:

发现能力 → 发送主题与交付要求 → 已提交 → 工作中
                                      ↘ 需要补充范围 → 补充后继续
                          → 完成 / 失败 / 取消 → 接收产物并验收

产物可能是报告、附件或分阶段输出,不能只保留最后一段聊天文本。对方标记 completed 表示其运行成功终止,调用方仍要核对报告是否有原文证据、覆盖需求以及符合自己的访问范围。

MCP 也有可选的长期任务扩展,所以异步不是 A2A 独有。更重要的判断是:对端暴露的是能力接口,还是独立任务执行主体;谁管理计划、状态、凭据与验收。

8.5 协议转换后仍需保存应用语义

本地工具可能返回 status=ok,远端工具返回 content 和错误标记;适配器应转成内部统一结果,同时保留原始请求 ID、来源、时间和状态。不能把“远端状态未知”强行转换成“失败可重试”,否则可能重复执行副作用。

用户身份也不能只藏在模型自然语言里。宿主到 server、Agent 到 Agent 都要有真实认证与授权;某个身份可调用工具,不代表它能看到工具返回的全部资料。跨服务的数据范围、保留时间和日志责任需要应用设计。

取消同样不能解释为回滚。收到取消后,对端可能停止剩余动作,但此前已发出的通知或已写入的文件未必消失。界面应显示哪些完成、哪些未确认,而不是统一写“已撤销”。

8.6 动手设计一个最小适配器

不用先安装完整框架。拿第 5 章 retrieve(query,k) 作为内部服务,设计三层:协议请求解码 → 调用已允许的检索函数 → 编码结果。保留查询、请求 ID、文档 ID、版本与截断状态,并写清无结果、错误参数和权限不足的区别。

参考验收包括:合法查询返回 D1/D2;未知方法或错误参数得到受控错误;D4 不进入结果;响应关联正确 ID;版本不支持时明确失败。这是协议适配练习,只有实现并验证所选规范要求后,才能宣称是兼容 MCP 的 server。

再画一个 A2A 研究委派任务,规定输入缺失时如何澄清、报告格式与完成检查。本章交付物:一张信任边界图、一对请求/响应、一份异步任务状态表。先理解语义,再追 SDK API。


Agent Guide · 从反馈闭环走向可靠系统基于 Markdown 构建