29-AgentSkillsMCP与A2A
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 中写了能力,就代表一定能调用吗?
答:仍需认证、协议兼容和实际授权,卡片是发现信息。