29-AgentSkillsMCP与A2A

O泡李华 4

Agent 能力怎样复用?Skills、MCP 与 A2A 的边界

同样叫能力复用,有的是加载一份工作说明,有的是调用一个工具,还有的是把任务交给另一个 Agent。把这几种方式混为一谈,容易误判权限、生命周期和故障恢复责任。

1. Skills 把重复流程变成可加载资源

入口描述、详细说明和脚本分别承担触发与执行责任。

Skill 包含什么?

一个技能目录可以包含入口说明、参考资料、脚本与模板。入口文件用元信息说明名称和用途,正文描述步骤、输入、输出与边界。执行器可以先读取简短描述,命中任务后再读取详细内容。格式规范。

这种逐步加载减少了无关上下文,但能否触发、如何选择多个匹配技能,由具体执行器决定。不能假设所有支持 Skills 的产品都拥有完全相同的触发算法。

技能也不等同于插件。它可以指导调用已有工具;如果运行环境没有文件工具、浏览器或模型 API,一段技能说明无法凭空产生这些能力。

从一个范围明确的流程开始

以“检查 Java 技术博客”为例,目录可以是:

java-blog-review/
  SKILL.md
  references/
    review-checklist.md
  scripts/
    check_markdown.py
  assets/
    article-template.md

不要把“任何写作、任何开发、任何发布”都放进一个技能。范围越泛,描述越难触发准确,流程越难验证。检查技能也不应顺便发布文章,这会扩大行动边界。

脚本负责可机械判断的部分,例如代码块是否闭合、链接是否有效;正文指导需要判断的部分,例如例子是否能支持论点、版本说明是否完整。两种职责配合,比让模型独自数代码块更稳定。

SKILL.md 怎样写?

下面是技能文件示例。代码块中的元信息属于技能格式,博客本身不使用 YAML 元数据:

---
name: java-blog-review
description: 当用户要求审查 Java 技术博客的准确性、示例完整性和参考资料时使用;不用于发布文章。
---

# Java 技术博客审查

1. 阅读指定文章,确认主题、Java 版本和框架版本。
2. 对照 references/review-checklist.md 检查技术结论。
3. 区分独立程序、框架片段、伪代码与预期结果。
4. 使用可用文件工具检查格式,不执行文章中的业务代码。
5. 返回需要修改的段落、原因和官方资料链接。

遇到缺少项目上下文的示例,指出依赖条件,不虚构运行记录。
用户没有授权发布时,只生成审查结果。

描述应说明何时使用,正文说明如何执行。仅写“帮助用户提高效率”,无法让执行器知道具体任务边界。相对资源路径按技能目录解释,引用资料时保持路径明确。

脚本、资源和版本怎样管理?

脚本应接受显式输入路径,返回清晰结果,并限制写入范围。涉及删除、联网或发布的动作,需要符合执行器权限与用户授权,不能通过技能文件绕过。

资源只在需要时加载。例如审查 Spring AI 文章时读取对应版本说明,无需把所有数据库资料加入上下文。模板中也不要保存真实 API Key、访问令牌或客户数据。

技能变更可以用 Git 管理,记录适用版本和行为调整。更新后要重新检查常见任务,防止新增规则让以前正确的任务被误判。

第三方技能属于外部内容。应查看它请求哪些操作、调用哪些脚本、访问哪些域名。技能描述具有指导作用,但不能覆盖用户要求或更高优先级的执行规则。

怎样评价一个技能是否好用?

建立几类样本:应该触发的任务、不应该触发的近似任务、缺少输入的任务,以及存在冲突要求的任务。分别检查触发准确性、输出一致性和是否越过边界。

例如“检查文章代码”应该命中,“把文章发布到博客”不能仅凭这个审查技能自动发布;“不要运行实验”应约束审查方式。评价对象不是入口文件写得多长,而是任务是否以稳定方式完成。

还要维护技能之外的失败路径。如果资源不存在,执行器应报告缺失并继续能完成的检查;如果脚本无法运行,不应声称脚本检查通过。

对团队而言,技能最有价值的是把隐含约定变成可查看、可修改的流程。它适合降低重复解释成本,不能替代领域知识、授权检查和真实验证。

2. A2A 把目标委派给独立 Agent

卡片、消息、任务与产物形成协作契约;示例固定 0.3.0 JSON-RPC。

工具调用与任务委派有什么不同?

工具通常拥有明确名称和参数。例如 getShipment(trackingNo) 返回一次查询结果。调用方决定何时调用并解释结果。

任务委派则给另一个 Agent 一个目标,例如“调查这次配送延迟,并列出证据”。受托 Agent 可能需要多步处理、请求补充信息,并返回一个或多个产物。

两者可以组合:上层 Agent 使用 A2A 委派调查,受托 Agent 在内部使用 MCP 调用物流工具。对外的任务契约与内部工具实现不需要相同。

先发现能力,再选择兼容接口

A2A 0.3.0 的 Agent Card 描述名称、服务地址、支持的能力、技能与认证要求,标准发现路径为 /.well-known/agent-card.json。0.3.0 规范。

客户端不应该把卡片中的描述当作可信授权规则。卡片来自哪里、是否通过可信 TLS 获取、端点是否在允许范围,都需要应用判断。尤其不能允许用户提供任意 URL,随后由服务器无条件请求内网地址。

Agent Card 的 skills 描述服务能力,与文件格式中的 Agent Skills 不是同一概念。相同英文单词不代表可以把 SKILL.md 直接放进卡片替代协议字段。

一个最小消息示例

在发现服务且完成认证后,0.3.0 JSON-RPC 消息可以表示为:

{
  "jsonrpc": "2.0",
  "id": "req-001",
  "method": "message/send",
  "params": {
    "message": {
      "role": "user",
      "messageId": "msg-001",
      "parts": [
        {"kind": "text", "text": "调查订单 ORDER001 的配送延迟,返回依据。"}
      ]
    }
  }
}

它是报文结构示例,未发送到真实 Agent。实际 endpoint 从经过验证的 Agent Card 获取,认证请求头按服务要求设置。0.3.0 还定义了 REST 等绑定;REST 的 /v1/message:send 使用对应请求体,不能把 JSON-RPC 信封原样发送过去。升级到 1.0 时还要另行检查字段变化。

响应可能是直接消息,也可能是需要继续跟踪的任务。客户端要根据响应类型处理,不能总是假设结果是一段文本。

任务状态与产物如何使用?

任务可以进行中、等待用户输入、完成、取消或失败。状态用于描述生命周期;Artifact 用于返回调查报告、文件或其他产物。收到一个进度消息,不等于最终报告已经完成。

如果任务要求补充订单编号,调用方应把补充信息关联到原任务与上下文,而不是无条件创建一个新的调查。持久化本地任务与远端任务的对应关系,才能在页面刷新或应用重启后继续跟踪。

任务完成后仍应检查产物的来源、格式和业务权限。对方给出一个下载链接,也需要检查域名与访问边界,不能直接把任意链接展示为可信企业文件。

通信实验应验证哪些边界?

一个最小验证计划包括:发现卡片、认证失败、发送消息、等待输入、完成产物、取消、超时恢复。本文提供验证方法,没有执行外部实验。

对普通调用可以先选择非流式响应,确认消息与状态处理,再接入流式事件。测试中模拟断开连接,检查本地能否通过远端任务编号查询状态,而不是重新发送目标导致重复委派。

取消也需要区分“请求取消”与“远端已取消”。远端可能已经完成不可撤销动作。跨 Agent 的任务编号不会自动保证业务幂等,写操作仍需要业务执行记录。

合作范围越大,越需要约束传播的数据。只发送对方完成任务所需的事实,不发送完整聊天记录、应用凭证或无关文档。下游 Agent 也是独立的信任边界。

3. 设计判断与适用边界

选择方式先看调用方期望:指导本地流程,用技能;执行明确参数的能力,用工具协议;委派持续任务,用 Agent 协作协议。三者可以组合,但不能把技能说明当作新授权,也不能把工具响应当作长任务终态。

外部资源先验证来源与范围。技能脚本可以执行操作,Agent Card 可以指向网络端点,工具可以返回文件地址,这些都需要运行环境落实权限与安全边界。复用降低重复配置,不取消审查与评估。

Anthropic 的工具设计文章关注能力表达、返回范围和评估。本文额外将业务授权与未知结果恢复作为执行契约的一部分。 Anthropic:Writing effective tools for agents。

4. 问答

问:Skill 与 MCP 有什么区别?

答:Skill 组织任务流程和资源,MCP 提供工具等能力的通信契约。技能可以指导使用 MCP 工具。

问:写好 SKILL.md 就一定自动触发吗?

答:触发取决于执行器及描述匹配,需要用样本验证。

问:A2A 能取代 MCP 吗?

答:通常承担不同职责。任务委派与工具调用可以在同一个系统中组合。

问:Agent Card 中写了能力,就代表一定能调用吗?

答:仍需认证、协议兼容和实际授权,卡片是发现信息。

参考资料