A2A Agent Card is readable
What it checks
Whether the A2A Agent Card at /.well-known/agent-card.json can be read by an A2A client.
| State | Verdict |
|---|---|
No card at agent-card.json, and nothing A2A-shaped at agent.json |
notApplicable |
| 404, or an HTML page answering for the path | notApplicable |
| JSON with none of the Agent Card’s keys (for example one document served at every path) | notApplicable |
| Body is not a JSON object | fail |
A known field has the wrong type (capabilities not an object; skills, supportedInterfaces, defaultInputModes or defaultOutputModes not an array; name, description or version not a string; a skills or supportedInterfaces entry not an object; an interface url, protocolBinding or protocolVersion that is present but not a string; a 0.3-shape top-level url that is not a string) |
fail |
| A Required field is missing | warn |
A supportedInterfaces entry lacks url, protocolBinding or protocolVersion |
warn |
An interface URL is not an absolute https:// or wss:// URL |
warn |
The card sits only at the pre-1.0 path /.well-known/agent.json |
warn |
The card uses the 0.3 shape: a top-level url and no supportedInterfaces |
not judged; details.legacyShape |
| Every Required field present and well-typed | pass |
The audit reads the card only. It never calls the agent’s endpoint.
Why it matters
The reference A2A client, given a domain, sends a GET to /.well-known/agent-card.json. If the body does not parse as an Agent Card, the client has no card and cannot learn the agent’s skills or endpoint.
Evidence
- A2A 1.0 §8.2 names
https://{server_domain}/.well-known/agent-card.jsonas the discovery path. §4.4.1 marksname,description,supportedInterfaces,version,capabilities,defaultInputModes,defaultOutputModesandskillsas Required — a2a-protocol.org/…/specification (verified 2026-10-18) a2a.protomarks the same eight AgentCard fields REQUIRED, and marksurl,protocol_bindingandprotocol_versionREQUIRED on eachAgentInterface— raw.githubusercontent.com/…/a2a.proto (verified 2026-10-18)- The discovery topic page: the client “performs an HTTP GET request” to that path — a2a-protocol.org/…/agent-discovery (verified 2026-10-18)
- IANA registers
agent-card.jsonas permanent, change controller Linux Foundation, 2025-08-01 — iana.org/…/well-known-uris.xhtml (verified 2026-10-18) - The reference SDK sets
AGENT_CARD_WELL_KNOWN_PATH = '/.well-known/agent-card.json'. Its resolver has no fallback toagent.json, ignores unknown fields, and raisesAgentCardResolutionErroron invalid JSON or a wrongly typed field. Itsparse_agent_cardconverts a 0.3-shape card (top-levelurl) into a 1.0 interface, so such a card still loads — raw.githubusercontent.com/…/constants.py (verified 2026-10-18) - Copilot Studio: a person enters the agent’s endpoint URL, and “if your agent has a valid agent card on the standard .well-known URL, Copilot Studio automatically pulls the name and description for your agent from the card”. The same page’s note locates the card “at your agent’s endpoint +
/.well-known/agent.json”: relative to the endpoint, and at the pre-1.0 file name, not at the domain root — learn.microsoft.com/…/add-agent-agent-to-agent (verified 2026-10-18) - A2A 0.3.0 (2025-07-30) changed the well-known URI from
agent.jsontoagent-card.jsonas a breaking change — github.com/…/CHANGELOG.md (verified 2026-10-18) - Adoption is small. Of 20,185 hosts that answered a probe, 65 serve a card; 41 of those fail a hard structural rule and 15 sit only on the legacy path — raw.githubusercontent.com/…/2026-07-29-most-publish… (verified 2026-10-18)
Counter-evidence: Both documented consumers are user-configured. A person types the agent’s endpoint or domain; no AI vendor documents crawling the open web for agent cards. Copilot Studio reads the card relative to the endpoint and names the pre-1.0 agent.json, so it does not confirm the domain-root agent-card.json read this audit checks.
Limits
- Only root-level cards are found. Frameworks often mount cards under a sub-path, such as
/a2a/<agent>/.well-known/agent-card.json. - A card linked from an
ard.jsonorai-catalog.jsonentry is not followed. - Signatures are optional in A2A 1.0, so they are not judged.
details.signedreports whether the card carries any. - An authenticated extended card (
capabilities.extendedAgentCard) is not fetched.
How it scores
Grade: B — a published specification (A2A 1.0, Linux Foundation) on a permanently registered path, with real but small adoption. The reference SDK implements the domain-root read. The only vendor consumer, Copilot Studio, is configured by a person and reads the card relative to the endpoint, so the domain-root read is not documented vendor behaviour. The audit scores only sites that publish a card, so a site with no A2A agent loses nothing.
- A card a client cannot load fails at high priority.
- A card that loads but is incomplete, names an insecure interface or sits only at the old path warns.
- A 0.3-shape card is not warned: the reference SDK converts it.
Example finding
{
"name": "Booking Agent",
"capabilities": ["streaming"],
"skills": { "id": "book" }
}
capabilities is an array and skills is an object. The reference SDK rejects the card.
Sources
- A2A Protocol Specification v1.0.0 — Linux Foundation / A2A Project, spec (verified 2026-10-18)
- A2A protocol definition — a2a.proto — A2A Project (Linux Foundation), spec (verified 2026-10-18)
- A2A Protocol — Agent Discovery — Linux Foundation / A2A Project, spec (verified 2026-10-18)
- IANA Well-Known URIs registry — IANA, spec (verified 2026-10-18)
- a2a-python — A2ACardResolver (card_resolver.py) — Linux Foundation / A2A Project, repo (verified 2026-10-18)
- Microsoft Copilot Studio — Add an agent over the A2A protocol — Microsoft, vendor-doc (verified 2026-10-18)
- A2A CHANGELOG — 0.3.0 (2025-07-30) — Linux Foundation / A2A Project, repo (verified 2026-10-18)
- API Evangelist — Most published agent cards are not actually A2A (2026-07-29) — API Evangelist, dataset (verified 2026-10-18)
Limits
- Only root-level cards are found. Frameworks often mount cards under a sub-path, such as
/a2a/<agent>/.well-known/agent-card.json. - A card linked from an
ard.jsonorai-catalog.jsonentry is not followed. - Signatures are optional in A2A 1.0, so they are not judged.
details.signedreports whether the card carries any. - An authenticated extended card (
capabilities.extendedAgentCard) is not fetched.