Agent2Agent (A2A) Protocol
TL;DR
Agent2Agent (A2A) is an open protocol for one agent to discover another, send it messages and track the resulting tasks, without either side exposing its internals. Google created it and donated it to the Linux Foundation, where a multi-company steering committee runs it; the latest release is v1.0.1. It suits teams connecting agents across frameworks or organizations.
Key facts
| Type | Protocol |
|---|---|
| Languages / SDKs | Python, JavaScript, Java, Go, C#, Rust |
| License | Apache-2.0 |
| Pricing model | Open source, free |
| Orchestration pattern | Other |
| GitHub stars | 25,973 (as of 2026-09-30) |
| GitHub forks | 2,638 |
| Last push | 2026-09-29 |
| Latest release | v1.0.1 |
| Repository | a2aproject/A2A |
| Website | a2a-protocol.org |
| Documentation | a2a-protocol.org |
| Last verified | 2026-09-30 |
Key features
- Two roles: an A2A client that sends requests on behalf of a user or system, and an A2A server (remote agent) that exposes an endpoint and processes tasks; each side stays opaque to the other. (source)
- Discovery uses an Agent Card, a JSON document usually served at /.well-known/agent-card.json that lists identity, skills, endpoints with their protocol binding and version, capabilities and security schemes. (source)
- Work is modelled as stateful Tasks that pause in interrupted states (input-required, auth-required) or end in terminal ones (completed, canceled, rejected, failed); outputs are Artifacts, and a contextId groups related interactions. (source)
- Messages carry a user or agent role and one or more Parts holding text, raw bytes, a URL or structured JSON data. (source)
- Three protocol bindings are specified with functional equivalence: JSON-RPC 2.0, gRPC and HTTP+JSON/REST, with a method mapping table (for example SendMessage, GetTask, ListTasks, CancelTask). (source)
- Long-running work is supported by SSE streaming (SendStreamingMessage, SubscribeToTask) and by push notifications to a client webhook. (source)
- Clients send an A2A-Version header (Major.Minor, currently 1.0) on each request, and agents must reject versions they do not support. (source)
- Official SDKs exist for Python, Go, Java, JavaScript, C#/.NET and Rust. (source)
Architecture and orchestration pattern
Pattern: Other
A2A is a peer protocol between agents. A client agent finds a remote agent through its Agent Card, then sends a Message; the remote agent either answers with a Message or creates a Task and reports progress on it. Since v1.0 the normative definition is the Protobuf file a2a.proto, and the spec separates the abstract operations from their JSON-RPC, gRPC and HTTP+JSON/REST bindings, which must behave the same.
State lives with the remote agent. A Task has an ID, a status, message history and artifacts, and moves through submitted and working states to a terminal state (completed, failed, canceled, rejected) or an interrupted one (input required, auth required) that waits for the client. A contextId ties related tasks and messages into one conversation. Agents do not share memory, tools or internal reasoning; only messages, parts and artifacts cross the boundary.
The protocol does not prescribe an orchestration pattern: a client agent can call one or many remote agents in whatever order it chooses, and remote agents can be clients of others. The docs place A2A beside MCP, with A2A linking agents to each other and MCP linking each agent to its own tools. Governance: Google originally developed A2A and donated it to the Linux Foundation; a Technical Steering Committee with seats for Google, Microsoft, Cisco, AWS, Salesforce, ServiceNow, SAP and IBM oversees it.
Human in the loop
A2A models human involvement through task states rather than a separate approval API. When the remote agent needs more information it moves the task to INPUT_REQUIRED and waits for the client's next message; when it needs authorization, including a human's approval before a destructive action, it moves the task to AUTH_REQUIRED with a status message, and the credential is delivered out of band unless an in-band method was negotiated. The client can also cancel a task with CancelTask. How the client presents these requests to a person is left to the client application.
Protocols
| Protocol | Support | Note |
|---|---|---|
| MCP | Partial evidence | Relationship stated, no bridge: A2A's docs describe MCP as the complementary agent-to-tool layer and mention exposing well-defined agent skills as MCP-compatible resources, but the spec defines no normative MCP mapping. |
| A2A | Yes evidence | This is the A2A specification itself; latest release v1.0.1, protocol version 1.0. |
| AG-UI | Unknown | The A2A docs (llms.txt summary and topic pages) do not mention AG-UI, and GitHub code search in a2aproject/A2A for ag-ui and agui returned nothing. |
Best for
- Letting agents built on different frameworks, or run by different teams, hand tasks to each other over HTTP or gRPC.
- Long-running delegated work that needs progress streaming or webhook callbacks.
- Agent networks that need signed Agent Cards, OAuth/OIDC or mTLS, and tenant scoping. (shortlist)
- JVM services exposing or calling agents through the official Java SDK. (shortlist)
- TypeScript and JavaScript services using the official JS SDK (@a2a-js/sdk). (shortlist)
Not for
- Connecting an agent to its own tools and data sources; the A2A docs assign that layer to MCP.
- Human chat between people; the docs describe A2A as a machine-to-machine protocol, not a messaging app.
- Clients or servers still written against v0.3 that cannot be migrated; v1.0 renamed methods and changed enum and ID formats.
Quickstart
pip install a2a-sdk # Python SDK 1.x (spec 1.0). For this server: pip install "a2a-sdk[http-server]" uvicorn
import uvicorn
from starlette.applications import Starlette
from a2a.helpers import get_message_text, new_text_message
from a2a.server.agent_execution import AgentExecutor
from a2a.server.request_handlers import DefaultRequestHandler
from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
from a2a.server.tasks import InMemoryTaskStore
from a2a.types import AgentCapabilities, AgentCard, AgentInterface, AgentSkill
class EchoExecutor(AgentExecutor): # message-only pattern: enqueue exactly one Message
async def execute(self, context, event_queue):
await event_queue.enqueue_event(new_text_message(f"echo: {get_message_text(context.message)}"))
async def cancel(self, context, event_queue): raise NotImplementedError
card = AgentCard(name="Echo", description="Repeats your text", version="0.1.0", capabilities=AgentCapabilities(),
default_input_modes=["text/plain"], default_output_modes=["text/plain"],
supported_interfaces=[AgentInterface(protocol_binding="JSONRPC", url="http://127.0.0.1:9999", protocol_version="1.0")],
skills=[AgentSkill(id="echo", name="Echo", description="Echo text back", tags=["demo"])])
handler = DefaultRequestHandler(agent_executor=EchoExecutor(), task_store=InMemoryTaskStore(), agent_card=card)
uvicorn.run(Starlette(routes=[*create_agent_card_routes(card), *create_jsonrpc_routes(handler, "/")]), port=9999)
Common pitfalls
- The example uses the Python SDK (Python 3.10+). The core package is
a2a-sdk; HTTP servers need extras such asa2a-sdk[http-server]ora2a-sdk[fastapi], and gRPC needsa2a-sdk[grpc]. - v1.0 of the protocol is not wire-compatible with v0.3: JSON-RPC methods were renamed (
message/sendbecameSendMessage), enum values moved to SCREAMING_SNAKE_CASE, thekinddiscriminator and thefinalflag were removed, and compound IDs such astasks/{id}became plain IDs. - Clients must send
A2A-Version: 1.0; agents treat a missing header as 0.3. The Python SDK 1.x keeps a 0.3 compatibility mode. - SDK 1.x removed
A2AStarletteApplicationand the other app wrappers (usecreate_agent_card_routes/create_jsonrpc_routes), madeagent_carda required argument ofDefaultRequestHandler, and raisesInvalidAgentResponseErrorif an executor mixes a Message with Task events or emits updates before the Task.
Pros
- Vendor-neutral stewardship: donated to the Linux Foundation and maintained by a Technical Steering Committee with representatives from eight companies. (source)
- One abstract operation set with three equivalent bindings (JSON-RPC, gRPC, REST), so agents can choose a transport without changing semantics. (source)
- Agents collaborate without exposing internal memory, logic or tool implementations. (source)
- Built-in support for long-running work: task listing with pagination, SSE streaming and push notifications. (source)
- v1.0 added signed Agent Cards (JWS), OAuth device code and PKCE, and mutual TLS declarations. (source)
Cons
- v1.0 introduced many breaking changes from v0.3 (renamed operations, new enum format, removed fields), so older agents need migration. (source)
- Servers must treat a missing A2A-Version header as 0.3, so mixed 0.3 and 1.0 deployments depend on clients sending the header. (source)
- When an agent needs a credential mid-task, the spec requires out-of-band delivery unless an in-band method is negotiated separately. (source)
- The Python SDK's move to 1.x removed the app wrapper classes and enforces stricter event ordering, which breaks existing executors. (source)
Alternatives
FAQ
What is the current A2A version?
The latest release is v1.0.1 (May 2026), a bug-fix release on top of v1.0.0 (March 2026). The protocol version sent on the wire is Major.Minor, so it is 1.0.
How does A2A relate to MCP?
The A2A docs describe them as complementary: MCP connects an agent to its own tools and resources, while A2A connects agents to each other. The spec does not define a formal mapping between the two.
Does A2A work with AG-UI?
A2A's own docs and repository do not mention AG-UI, so no relationship is defined from the A2A side.
Who maintains A2A?
Google developed it and donated it to the Linux Foundation. A Technical Steering Committee with representatives from Google, Microsoft, Cisco, AWS, Salesforce, ServiceNow, SAP and IBM oversees the project.
Which transports does A2A use?
JSON-RPC 2.0 over HTTP(S), gRPC, and HTTP+JSON/REST, with SSE for streaming and webhooks for push notifications.
Sources
- A2A GitHub repository
- A2A documentation home
- A2A specification (latest)
- A2A specification v1.0.1
- LICENSE (Apache-2.0)
- GOVERNANCE.md
- Release v1.0.0 notes
- Release v1.0.1 notes
- What's new in v1.0
- A2A and MCP
- What is A2A?
- Key concepts
- Life of a task
- Agent discovery
- Streaming and asynchronous operations
- Enterprise features
- Extensions
- SDKs
- A2A llms.txt protocol summary
- Python tutorial: start the server
- A2A Python SDK
- Python SDK v0.3 to v1.0 migration guide