An open protocol created by Google and donated to the Linux Foundation that standardizes how autonomous AI agents discover each other, exchange tasks, and collaborate across frameworks. A2A absorbed IBM's Agent Communication Protocol (ACP) in August 2025 and is now one of the three flagship protocols under the Agentic AI Foundation alongside MCP and ANP.
A public A2A agent MUST publish its Agent Card at the fixed path '/.well-known/agent.json' on its base URL so other agents can discover it without out-of-band configuration
A conventional well-known path means one-shot discovery given only a hostname - the same pattern that makes OAuth server metadata and OpenID discovery work
An Agent Card MUST include at minimum 'name', 'description', 'url', 'version', and 'capabilities' fields so a discovering agent can decide whether and how to call it
A card without these fields is effectively opaque; peers cannot tell the agent's purpose, where to send requests, or which features it supports
A task's 'state' field MUST be one of the defined values - 'submitted', 'working', 'input-required', 'completed', 'canceled', or 'failed' - and MUST NOT introduce custom states
A closed state set lets any client render progress and handle terminal conditions without negotiating a custom vocabulary per server
Once a task reaches a terminal state ('completed', 'canceled', or 'failed') the server MUST NOT transition it to any other state
Terminal states are the signal callers use to stop polling, release resources, and commit results; re-opening them would break every client's completion logic
Servers SHOULD use the input-required state to pause execution when they need additional information from the caller, rather than failing the task and forcing a restart
The input-required state keeps task state and partial results intact so the caller can supply the missing input and resume without losing work
A2A messages carry content as a list of typed parts rather than a single text blob, so agents can exchange text, files, and structured data in one turn
Every message MUST contain a 'parts' array where each element carries a 'type' field identifying the part as text, file, or data
Explicit part types let receivers route content correctly - displaying text, storing files, or feeding structured data into downstream tools - without sniffing the bytes
A server MUST NOT advertise streaming support in its Agent Card unless it actually supports the tasks/sendSubscribe method and delivers updates over Server-Sent Events
Advertising a capability that does not work forces every client to code defensive fallback paths and defeats the purpose of capability declaration
Long-running streams SHOULD emit periodic heartbeat events so clients and intermediaries can distinguish a slow task from a dropped connection
Proxies and load balancers frequently close idle connections after 30-60 seconds; heartbeats keep the channel alive and give clients a clear liveness signal
An Agent Card MUST list the accepted authentication schemes under 'authentication.schemes' when the agent requires credentials, so callers know which scheme to use before sending a request
Without declared schemes the caller has to probe-and-fail; declaring them up-front avoids a round-trip per unsupported method
Credentials MUST NOT be embedded inside message parts, task inputs, or artifact content - they belong in HTTP headers governed by the declared authentication scheme
Credentials in message bodies get logged, cached, and forwarded to downstream agents that have no business seeing them
Push notification targets MUST be supplied by the caller at task creation time via 'pushNotification.url' - the server MUST NOT substitute its own destination
The caller, not the server, owns the security boundary around where task data is allowed to flow
Servers SHOULD sign push notifications so the caller's webhook can verify the delivery originated from the expected agent and has not been tampered with
An unsigned webhook endpoint accepting task updates is trivially spoofable by anyone who learns the URL
An agent registry SHOULD aggregate Agent Cards by crawling the well-known path of participating domains or by accepting push submissions, and SHOULD expose a stable listing endpoint for consumers
Centralized directories become single points of failure and policy; crawl-and-aggregate lets ecosystems federate discovery while keeping each agent in control of its own card