A2A协议代理验证工具

a2a-agent-validator是一个用于验证A2A协议代理卡的工具,支持端点获取、卡片结构验证、能力分类(包括Google AP2和x402扩展)并返回结构化快照。

  • by AgentProbe
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 FlowMCP/a2a-agent-validator

使用说明

a2a代理验证器

端到端验证A2A协议代理卡。获取众所周知的端点,根据A2A规范验证卡结构,对功能进行分类,包括 谷歌AP2(代理支付协议) 并返回一个包含16个布尔类别和17个条目字段的结构化快照。兼容 erc8004-registry-parser 作为验证插件。

快速入门

git clone https://github.com/agentprobe/a2a-agent-validator.git
cd a2a-agent-validator
npm i
import { A2aAgentValidator } from 'a2a-agent-validator'

const { status, findings, categories, entries } = await A2aAgentValidator.start( {
    endpoint: 'https://agent.example.com',
    timeout: 15000
} )

特性

  • 从获取代理卡 /.well-known/agent-card.json (A2A规范标准)
  • 验证卡片结构:必填字段、接口、技能、提供者
  • 对16个布尔类别进行分类(可达、技能、流、JSONRPC、GRPC、安全、AP2、x402、嵌入式流、ERC-8004)
  • 发现 AP2(代理支付协议) 通过 capabilities.extensions 阵列和 X-A2A-Extensions HTTP标头--提取版本和角色
  • 发现 x402 付款扩展和版本
  • 发现 嵌入式流 (AP2+x402组合)
  • 发现 ERC-8004 代理卡中的服务链接
  • 提取17个输入字段(姓名、版本、技能、协议、提供者、AP2版本/角色、x402版本、扩展名)
  • 比较两个快照并生成结构化差异
  • 连接失败时返回包含所有错误类别的空快照
  • 兼容 erc8004-registry-parser 通过 .validate() 方法

建筑学

验证管道分四个顺序步骤处理A2A代理卡:

flowchart LR
    A[endpoint] --> B[A2aConnector.fetch]
    B -->|agent card + X-A2A-Extensions header| C[CardStructureValidator.validate]
    C --> D[CapabilityClassifier.classify]
    D -->|AP2 / x402 / ERC-8004 detection| E[SnapshotBuilder.build]

方法

所有方法都是静态的,并使用对象参数和对象返回。

.validate( { endpoint } )

与兼容的简单验证 erc8004-registry-parser。仅返回状态和结果。

方法

.validate( { endpoint } )
密钥 类型 描述 必填
endpoint string A2A代理的基本URL 是

退货

{ status: true, findings: [] }
密钥 类型 描述
状态 布尔值 true 如果卡有效
查找结果 object[] 查找对象 { code, severity, location, message }

.start( { endpoint, timeout } )

对类别和条目进行全面验证。

方法

.start( { endpoint, timeout } )
密钥 类型 描述 必填
endpoint string A2A代理的基本URL 是
timeout number 请求超时(毫秒)(默认值:10000) 否

退货

{ status: true, findings: [], categories: { ... }, entries: { ... } }
密钥 类型 描述
状态 布尔值 true 如果没有验证错误
查找结果 object[] 查找对象 { code, severity, location, message }
类别 对象 16个布尔功能标志
条目 对象 17个提取的数据字段

.compare( { before, after } )

比较两个快照并返回结构化差异。

方法

.compare( { before, after } )
密钥 类型 描述 必填
before object 上一个快照(来自 .start()) 是
after object 当前快照(来自 .start()) 是

退货

{ status: true, findings: [], hasChanges: false, diff: { ... } }
密钥 类型 描述
status boolean 始终 true 验证后
调查结果 对象[] CMP-* 完整性调查结果 { code, severity, location, message } (不同的服务器,时间戳顺序)
hasChanges 布尔值 true 如果检测到任何差异
diff object 结构化diff,包括部分:身份、能力、技能、界面、安全性、类别

类别(16个布尔标志)

标志 描述
isReachable 从端点收到HTTP响应
hasAgentCard 已找到代理卡,JSON格式有效
hasValidStructure 所有必填字段均已显示
hasSkills 至少定义了一项技能
hasSecuritySchemes 已配置安全方案
hasProvider 提供程序信息
supportsStreaming capabilities.streaming === true
supportsPushNotifications capabilities.push_notifications === true
supportsJsonRpc 接口与 protocol_binding: 'JSONRPC'
supportsGrpc 接口与 protocol_binding: 'GRPC'
supportsExtendedCard capabilities.extended_agent_card === true
hasDocumentation documentation_url 目前
supportsAp2 在中检测到AP2扩展 capabilities.extensions 或 X-A2A-Extensions 头球
supportsX402 在中检测到x402扩展 capabilities.extensions 或 X-A2A-Extensions 头球
supportsEmbeddedFlow 检测到AP2和x402(代理支持嵌入式支付流)
hasErc8004ServiceLink 代理卡中发现ERC-8004服务链接

条目(17个数据字段)

条目 类型 描述
url string 已验证端点
agentName string 代理名称
agentDescription string 代理描述
agentVersion string 代理版本
providerOrganization string/null 提供者组织
providerUrl string/null 提供程序URL
skillCount number 技能数量
skills array 技能 [{ id, name }]
protocolBindings array 协议绑定 ['JSONRPC', 'GRPC']
protocolVersion string 第一个接口协议版本
defaultInputModes array 默认输入模式
defaultOutputModes array 默认输出模式
ap2Version string/null AP2版本已从扩展URI中提取(例如。 "1.0")
ap2Roles array/null AP2角色来自 extension.params.roles (例如。 ["buyer", "seller"])
x402Version string/null x402版本已从扩展URI中提取
extensions string/null 原始 X-A2A-Extensions 标题值
timestamp string ISO 8601时间戳

验证码

结果以结构化对象的形式发布 { code, severity, location, message } 符合 AgentProbe查找对象规范。 severity 小写(error / warning / info).这 VAL-1xx 和 CON-1xx 波段是a2a拥有的波段(百位数 1); CSV-* 代码是 已经是全球唯一的,并保留其号码。

VAL——输入验证(带 VAL-1xx)

代码 严重性 位置 消息
VAL-101 错误 端点 缺少值
VAL-102 错误 端点 必须是字符串
VAL-103 错误 端点 不能为空
VAL-104 错误 端点 必须是有效的URL
VAL-105 错误 超时 必须是数字
VAL-106 错误 超时 必须大于0
VAL-107 错误 之前 缺少值/必须是对象/缺少类别或条目
VAL-108 错误 之后 缺少值/必须是对象/缺少类别或条目

CON-A2A连接(频带 CON-1xx)

代码 严重性 位置 消息
CON-110 信息 空 无法访问服务器
CON-111 信息 空 找不到代理卡(HTTP 404)
CON-112 信息 空 HTTP错误
CON-113 信息 空 响应不是有效的JSON
CON-114 信息 空 请求超时

CSV——卡片结构验证

代码 严重性 位置 消息
CSV-020 警告 名称 缺少必填字段“名称”
CSV-021 警告 描述 缺少必填字段“描述”
CSV-022 警告 版本 缺少必填字段“version”
CSV-023 警告 支持的接口 缺少必填字段“支持的接口”
CSV-024 警告 支持的接口 不能为空
CSV-025 警告 功能 缺少必填字段“功能”
CSV-026 警告 默认输入模式 缺少必填字段“默认输入模式”
CSV-027 警告 默认输出模式 缺少必填字段“默认输出模式”
CSV-028 警告 技能 缺少必填字段“技能”
CSV-030 警告 支持的接口[i].url 缺少值
CSV-031 警告 支持的接口[i].url 必须是有效的HTTPS url
CSV-032 警告 支持的接口[i].procol_binding 缺少值
CSV-033 警告 支持的接口[i].procol_version 缺少值
CSV-034 警告 技能[i].id 缺少值
CSV-035 警告 技能[i].name 缺少值
CSV-036 警告 技能[i].description 缺少值
CSV-037 警告 技能[i].tags 缺少值
CSV-038 警告 技能[i].tags 必须是非空数组
CSV-040 警告 provider.url 缺少值
CSV-041 警告 提供者组织 缺少值

CMP——比较

CMP-* 代码由发出 .compare() 作为结构化查找对象 { code, severity, location: 'compare', message } 在其 findings 阵列——均匀 start(). 这 diff 和 hasChanges 是结构化的,从不在代码上。

代码 严重性 描述
CMP-001 警告 快照来自不同的代理
CMP-002 警告 快照之前没有时间戳
CMP-003 警告 快照后比以前旧

许可证

麻省理工学院