Agentcard — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Agentcard (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
AgentCard is to A2A what HTTP headers are to the web.
A standardized, machine-parseable declaration of agent identity and capability. Pure data schema. Zero execution logic. Works with any framework.
Schema version: 1.0 · License: Apache 2.0 + CC-BY 4.0 (spec)
When HTTP was designed, headers solved a critical bootstrapping problem: how does a server know what format a client accepts before any negotiation happens?
AgentCard solves the same problem for agent-to-agent (A2A) communication:
| HTTP Header | AgentCard field |
|---|---|
Content-Type | capabilities[].id |
Accept | capabilities[].input_schema / output_schema |
Authorization | endpoint.auth |
Server / User-Agent | name + version |
| Cache headers | metadata.pacr:* (derived from ledger) |
An AgentCard is a pure data document — no network calls, no execution logic. Any framework can parse it. It travels as the Payload (P) inside a PACR record.
{
"agent_id": "01HZQK3P8EMXR9V7T5N2W4J6C0",
"name": "My Agent",
"version": "1.0.0",
"capabilities": [
{
"id": "text.generate",
"description": "Generate text given a prompt"
}
],
"endpoint": {
"protocol": "http",
"url": "https://agent.example.com/api"
}
}agent_idagent_id is a ULID encoded as Crockford Base32 (26 chars).
# Python
python3 -c "import uuid; print(str(uuid.uuid4()).replace('-','').upper()[:26])"
# Rust (Cargo.toml: ulid = "1.0")
# let id = ulid::Ulid::new().to_string();
# Node.js
npm install ulid && node -e "const {ulid} = require('ulid'); console.log(ulid())"Full JSON Schema: schema.json
| Field | Req | Type | Description |
|---|---|---|---|
agent_id | ✓ | string | ULID Crockford Base32 26-char — globally unique |
name | ✓ | string | Display name 1–128 chars |
version | ✓ | string | semver 2.0 |
capabilities | ✓ | array | ≥1 capability |
endpoint | ✓ | object | How to reach this agent |
pricing | — | object | Cost model: Joules + optional fiat |
metadata | — | object | pacr:* fields derived from ledger |
| Field | Req | Description |
|---|---|---|
id | ✓ | Dot-namespaced: text.generate, vision.classify |
description | ✓ | Human-readable description |
tags | — | Semantic tags for routing |
input_schema | — | JSON Schema for input; null = unstructured |
output_schema | — | JSON Schema for output |
| Field | Req | Description |
|---|---|---|
protocol | ✓ | http · grpc · mcp · ws · custom |
url | ✓ | Endpoint URL |
health_check | — | Optional health-check URL |
auth | — | Auth config; null = no auth |
| Field | Description |
|---|---|
joules_per_request | Canonical settlement unit. Min: 2.854×10⁻²¹ J (Landauer floor at 300 K) |
latency_ms_p50 | p50 latency derived from PACR Ω history |
currency | ISO 4217 or token symbol |
fiat_per_request | Cost in fiat/token (requires currency) |
pacr:* fields are derived from the causal ledger by the CSO — not self-declared.
| Key | Source | Description |
|---|---|---|
pacr:trust_tier | CSO ρ + count | Verified · Established · Basic · Untrusted · Banned |
pacr:rho_ema | CSO | ρ = ΔΦ / Λ (causal return rate EMA) |
pacr:substrate_scope | Self-declared | Deployment substrate: "M1-Ultra", "AWS-Graviton", etc. |
pacr:substrate_gap | Self-declared | Known validation gaps |
pacr:ossification_risk | Computed | high · medium · low — substrate diversity health |
Place your AgentCard at .well-known/agent.json on your domain:
https://your-agent.example.com/.well-known/agent.jsonFollows Well-Known URIs RFC 8615.
use agentcard_validator::validate;
let json = std::fs::read_to_string("my-agent.json")?;
let errors = validate(&json);
if errors.is_empty() { println!("Valid AgentCard"); }
else { for e in &errors { eprintln!("Error: {e}"); } }import json, jsonschema
schema = json.load(open("schema.json"))
card = json.load(open("my-agent.json"))
jsonschema.validate(card, schema) # raises ValidationError on failureconst Ajv = require("ajv/dist/2020");
const ajv = new Ajv();
const valid = ajv.validate(require("./schema.json"), require("./my-agent.json"));
if (!valid) console.error(ajv.errors);| File | Agent type |
|---|---|
examples/llm-agent.json | Language model |
examples/code-review-agent.json | Code review |
examples/data-pipeline-agent.json | ETL pipeline |
pacr:* from ledger, not self-reportjoules_per_request ≥ 2.854×10⁻²¹ J at 300 Kcargo test → Pull RequestReference implementation and validators: Apache 2.0 with explicit patent grant (Section 3).
See NOTICE: no patent claims on the AgentCard schema or wire format.
SPEC-CAUSAL-TOPOLOGY.md, schema.json, *-SPEC.md files: Creative Commons Attribution 4.0.
Allows incorporation into RFCs, standards documents, third-party protocol stacks — attribution only, no separate agreement needed.
AgentCard aims to be the TCP/IP of AI2AI — owned by no one, usable by everyone. The maintainers commit (recorded in NOTICE and git history):
Any fork preserving this NOTICE is the authoritative continuation of the project.
AgentCard 之於 AI2AI,如同 HTTP 標頭之於 Web。
標準化、機器可解析的 Agent 身份與能力聲明。 純數據規格,無執行邏輯,適用於任何框架。
規格版本: 1.0 · 授權: Apache 2.0 + CC-BY 4.0 (spec)
HTTP 設計時,標頭解決了一個關鍵的啟動問題:在任何協商發生之前,伺服器如何知道客戶端接受什麼格式?
AgentCard 為 Agent 對 Agent(A2A)通訊解決了同樣的問題:
| HTTP 標頭 | AgentCard 字段 |
|---|---|
Content-Type | capabilities[].id |
Accept | capabilities[].input_schema / output_schema |
Authorization | endpoint.auth |
Server / User-Agent | name + version |
| 快取標頭 | metadata.pacr:*(帳本衍生,非自報) |
AgentCard 是純數據文件——無網路調用,無執行邏輯。 任何框架均可解析。以 PACR 記錄的 Payload(P)字段傳輸。
{
"agent_id": "01HZQK3P8EMXR9V7T5N2W4J6C0",
"name": "My Agent",
"version": "1.0.0",
"capabilities": [
{
"id": "text.generate",
"description": "Generate text given a prompt"
}
],
"endpoint": {
"protocol": "http",
"url": "https://agent.example.com/api"
}
}agent_idagent_id 是以 Crockford Base32 編碼的 ULID(26 字符)。
# Python
python3 -c "import uuid; print(str(uuid.uuid4()).replace('-','').upper()[:26])"
# Rust (Cargo.toml: ulid = "1.0")
# let id = ulid::Ulid::new().to_string();
# Node.js
npm install ulid && node -e "const {ulid} = require('ulid'); console.log(ulid())"完整 JSON 規格:schema.json
| 字段 | 必需 | 類型 | 說明 |
|---|---|---|---|
agent_id | ✓ | string | ULID Crockford Base32 26 字符——全局唯一身份 |
name | ✓ | string | 顯示名稱 1–128 字符 |
version | ✓ | string | semver 2.0 |
capabilities | ✓ | array | 至少一項能力聲明 |
endpoint | ✓ | object | 聯繫方式 |
pricing | — | object | 定價:焦耳 + 可選法幣 |
metadata | — | object | pacr:* 帳本衍生字段 |
| 字段 | 必需 | 說明 |
|---|---|---|
id | ✓ | 點分命名空間:text.generate、vision.classify |
description | ✓ | 可讀描述 |
tags | — | 語義標籤用於路由 |
input_schema | — | 輸入格式 JSON Schema;null = 非結構化 |
output_schema | — | 輸出格式 JSON Schema |
| 字段 | 必需 | 說明 |
|---|---|---|
protocol | ✓ | http · grpc · mcp · ws · custom |
url | ✓ | 端點地址 |
health_check | — | 可選健康檢查 URL |
auth | — | 認證配置;null = 無認證 |
| 字段 | 說明 |
|---|---|
joules_per_request | 標準結算單位。最小值:2.854×10⁻²¹ J(300 K 時蘭道爾下界) |
latency_ms_p50 | 基於 PACR Ω 歷史的 p50 延遲 |
currency | ISO 4217 或代幣符號 |
fiat_per_request | 法幣費用(需要 currency) |
pacr:* 字段由 CSO(因果結算預言機)從帳本衍生,非 Agent 自報。
| 鍵 | 來源 | 說明 |
|---|---|---|
pacr:trust_tier | CSO ρ + 計數 | Verified · Established · Basic · Untrusted · Banned |
pacr:rho_ema | CSO | ρ = ΔΦ / Λ(因果回報率 EMA) |
pacr:substrate_scope | 自報 | 部署基質:"M1-Ultra"、"AWS-Graviton" 等 |
pacr:substrate_gap | 自報 | 已知驗證缺口 |
pacr:ossification_risk | 計算 | high · medium · low ——基質多樣性健康度 |
將 AgentCard 放置於域名下的 .well-known/agent.json:
https://your-agent.example.com/.well-known/agent.json遵循 Well-Known URIs RFC 8615 慣例。
use agentcard_validator::validate;
let json = std::fs::read_to_string("my-agent.json")?;
let errors = validate(&json);
if errors.is_empty() { println!("Valid AgentCard"); }
else { for e in &errors { eprintln!("Error: {e}"); } }import json, jsonschema
schema = json.load(open("schema.json"))
card = json.load(open("my-agent.json"))
jsonschema.validate(card, schema) # 失敗時拋出 ValidationErrorconst Ajv = require("ajv/dist/2020");
const ajv = new Ajv();
const valid = ajv.validate(require("./schema.json"), require("./my-agent.json"));
if (!valid) console.error(ajv.errors);| 文件 | Agent 類型 |
|---|---|
examples/llm-agent.json | 語言模型 |
examples/code-review-agent.json | 代碼審查 |
examples/data-pipeline-agent.json | 數據管道 |
pacr:* 來自帳本,非自報joules_per_request ≥ 2.854×10⁻²¹ J(300 K)cargo test → Pull Request參考實現與驗證器:Apache 2.0,含明確專利授權(第三條)。
見 NOTICE:對 AgentCard 規格及線路格式不保留任何專利主張。
SPEC-CAUSAL-TOPOLOGY.md、schema.json、*-SPEC.md 文件: Creative Commons Attribution 4.0。
允許引入 RFC、標準文件、第三方協議棧——僅需署名,無需另行協議。
AgentCard 旨在成為 AI2AI 的 TCP/IP——無人擁有,人人可用。 維護者承諾(記錄於 NOTICE 及 git 歷史):
任何保留此 NOTICE 的複刻版本均視為本項目的正統延續。
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.