Discovery and supportedInterfaces
The spec standardizes only the well-known path to a card, and a client takes the first supportedInterfaces entry it speaks before it checks a capability flag.
The planner starts with three ports in its configuration: 41241, 41242, and 41243. Before it delegates any work, it fetches three cards, picks one interface from each, and records which agents stream and which one wants a token.
When you finish this section, you can locate an agent's card, pick the interface to call, and avoid the calls its card rules out.
Three routes to a card
The spec names three ways to reach a card, and it standardizes the details of only one:
- Well-known URI. The client fetches
https://{server_domain}/.well-known/agent-card.jsonfrom a host it already knows. The project recommends this route for public agents. - Registry or catalog. The client queries a curated catalog of agents, and the current specification sets no standard API for such a registry.
- Direct configuration. The client starts from Agent Card URLs or card content that it already has, kept in code, a configuration file, or an environment variable.
The planner's ports come from direct configuration in the kit's run script, and each card from the well-known path.
### 1 · discover test-runner
Host: localhost:41241
Accept: application/json
Content-Type: application/json
{
"name": "test-runner",
…
}Use the path exactly as the spec writes it. One diagram in the project's guides still shows /.well-known/agent-card with no .json, and POST /sendMessage where 1.0 has POST /message:send (conflict D32). PR #2261 fixed the diagram on main after v1.0.1, not yet released.
Figure 2.2 follows the planner from its configuration to a checked call on code-reviewer.
Choosing from supportedInterfaces
The spec gives the client four rules for supportedInterfaces, all of them MUST. The first one decides the endpoint:
Supported means a binding and a version that the client implements. A JSON-RPC 1.0 client skips a GRPC entry and a JSONRPC entry at 0.3, since one card can list a binding at several versions.
The other three rules ask the client to prefer earlier entries and to use the URL of the chosen entry. The client also sets the tenant field of every request message to the exact value of that AgentInterface entry. No kit card sets a tenant.
Checking capabilities before a call
On the server side the rule is a MUST: a call that the card rules out fails with a fixed error. The table gives each error with its JSON-RPC code.
Flag in capabilities | Operations it allows | Error when the flag is absent or false |
|---|---|---|
streaming | SendStreamingMessage, SubscribeToTask | UnsupportedOperationError, -32004 |
pushNotifications | CreateTaskPushNotificationConfig, GetTaskPushNotificationConfig, ListTaskPushNotificationConfigs, DeleteTaskPushNotificationConfig | PushNotificationNotSupportedError, -32003 |
extendedAgentCard | GetExtendedAgentCard | UnsupportedOperationError, -32004 |
Section 3 says that every A2A implementation must support its operations. Yet an agent declines streaming, push, or the extended card by leaving its flag out. The flags decide (conflict D26).
The code-reviewer card has no pushNotifications flag, and the kit's error scenario registers a webhook with it anyway:
### 6 · CreateTaskPushNotificationConfig: not supported
Host: localhost:41242
…
"method": "CreateTaskPushNotificationConfig",
"params": {
"taskId": "00000000-0000-4000-8000-000000000000",
…
…
"code": -32003,
"message": "Push notifications are not supported",
…
"reason": "PUSH_NOTIFICATION_NOT_SUPPORTED",The task id does not exist, yet the error names the missing capability, so the call cost a round trip the card had answered.
Skills, modes, and security fields say whether the agent fits the job and what it needs. The planner maps run-tests to test-runner and attaches a bearer token to every deployer call (the planner code). Part and security schemes read those fields.
Caching the card
A card changes rarely, so the spec asks both sides to use ordinary HTTP caching. A server should send a Cache-Control response header with a max-age directive. It also sends an ETag derived from the card's version or a hash of its content. A client honors those headers and revalidates an expired card with If-None-Match or If-Modified-Since.
The kit sends no Cache-Control or ETag header, as the kit README lists. An extended card replaces the cached public card for an authenticated session, as extended cards and signatures explains.
A2A protocol 1.0.1 · 3303592 · 2026-05-28 · Edition 2026.10