Agent2Agent (A2A) Protocol

Protocol · Last verified 2026-09-30 · Install verified 2026-09-30

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

Agent2Agent (A2A) Protocol key facts. Data as of 2026-09-30.
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

MCP, A2A and AG-UI support for Agent2Agent (A2A) Protocol. See the full matrix.
ProtocolSupportNote
MCP Partial evidence
checked 2026-09-30
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
checked 2026-09-30
This is the A2A specification itself; latest release v1.0.1, protocol version 1.0.
AG-UI Unknown
checked 2026-09-30
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

Install verified 2026-09-30 (uv venv, Python 3.12.13, macOS arm64: uv pip install a2a-sdk ok, import a2a ok, a2a-sdk 1.1.5. Packages came from the mirrors.aliyun.com mirror, so the version is the one that mirror served on this date. Install and import check only; not a functional test.). What this means

# 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 as a2a-sdk[http-server] or a2a-sdk[fastapi], and gRPC needs a2a-sdk[grpc].
  • v1.0 of the protocol is not wire-compatible with v0.3: JSON-RPC methods were renamed (message/send became SendMessage), enum values moved to SCREAMING_SNAKE_CASE, the kind discriminator and the final flag were removed, and compound IDs such as tasks/{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 A2AStarletteApplication and the other app wrappers (use create_agent_card_routes / create_jsonrpc_routes), made agent_card a required argument of DefaultRequestHandler, and raises InvalidAgentResponseError if an executor mixes a Message with Task events or emits updates before the Task.

Official quickstart

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

Unknown fields: protocols.agui: searched the A2A docs (llms.txt summary, topic pages) and GitHub code search in a2aproject/A2A for ag-ui and agui; no AG-UI relationship is described.

Something wrong or out of date, or do you maintain Agent2Agent (A2A) Protocol and want this page removed? Report a correction or request removal.