Google released the A2A protocol in April 2025 to solve a specific problem: AI agents from different vendors cannot talk to each other. Every integration is custom. A2A proposes a standard. This page covers the protocol mechanics, how it compares to MCP and ACP, who backs it, and the open questions that will determine whether it matters.
The Problem: Agent Isolation
Enterprise software runs on dozens of specialized systems. CRM, ERP, HRIS, ticketing, billing. Each is getting its own AI agent. Salesforce has Agentforce. SAP has Joule. ServiceNow has Now Assist. These agents are good at operating within their own system. They are bad at working together.
Every pair of systems that need to communicate requires a custom integration. With N systems, that is N*(N-1)/2 integrations. HTTP solved this problem for documents. SMTP solved it for email. A2A attempts to solve it for agent communication.
How A2A Works
A2A defines four primitives. Everything in the protocol is built from these.
Agent Cards
JSON files hosted at /.well-known/agent.json. Describe the agent's name, capabilities, supported input/output types, authentication requirements, and endpoint URL. This is how agents discover each other.
Tasks
The unit of work. Stateful objects with a lifecycle: submitted, working, input-required, completed, failed, canceled. A client agent creates a task, the remote agent processes it, and status updates flow back. Tasks support streaming via Server-Sent Events.
Messages and Parts
Structured communication within tasks. A message contains one or more Parts: text (plain or markdown), files (inline bytes or URI references), or structured data (JSON). Messages have roles (user or agent) and are append-only within a task.
Push Notifications
Webhook-based server-to-client updates. When a task changes state, the server POSTs an update to the client's registered webhook URL. This avoids polling for long-running tasks.
The flow: client fetches a remote Agent Card, checks capabilities, creates a task via JSON-RPC. The remote agent processes it, optionally streaming results via SSE. If it needs more input, it enters input-required and waits.
Agent Cards: Machine-Readable Discovery
Agent Cards are the entry point to A2A. Before two agents can collaborate, they need to know about each other. An Agent Card is a JSON file that an agent publishes at a well-known URL, similar to how robots.txt works for web crawlers or how /.well-known/openid-configuration works for OAuth.
Example Agent Card (/.well-known/agent.json)
{
"name": "Order Management Agent",
"description": "Handles order lookups, status checks, and modifications",
"url": "https://orders.example.com/a2a",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"pushNotifications": true
},
"authentication": {
"schemes": ["OAuth2"],
"credentials": "https://auth.example.com/.well-known/oauth-authorization-server"
},
"defaultInputModes": ["text/plain", "application/json"],
"defaultOutputModes": ["text/plain", "application/json"],
"skills": [
{
"id": "order-lookup",
"name": "Order Lookup",
"description": "Look up order details by ID or customer email",
"tags": ["orders", "lookup", "status"]
},
{
"id": "order-modify",
"name": "Order Modification",
"description": "Cancel, update shipping, or change quantities",
"tags": ["orders", "modify", "cancel"]
}
]
}The skills array is what makes discovery useful. A client scanning for "order status" capability matches against descriptions and tags. Without skills, the client guesses from the agent name alone.
Agent Cards vs. MCP tool definitions
MCP exposes individual tools (functions with input schemas). An Agent Card exposes an entire agent with high-level skills. MCP is function-level. A2A is service-level.
Tasks and Lifecycle
A Task is the unit of work in A2A. Unlike a simple request-response call, a Task is stateful: ID, current status, message history, and metadata. Statefulness matters because agent work is often asynchronous and multi-turn.
| State | Meaning | Transitions To |
|---|---|---|
| submitted | Task created by client, not yet picked up | working, failed, canceled |
| working | Agent is actively processing the task | completed, failed, canceled, input-required |
| input-required | Agent needs more information from the client to continue | working, failed, canceled |
| completed | Task finished successfully with results in artifacts | Terminal state |
| failed | Task encountered an unrecoverable error | Terminal state |
| canceled | Task was canceled by the client | Terminal state |
The input-required state is what separates A2A from fire-and-forget RPC. An agent can pause, ask for clarification, and resume. This models real collaboration where agents negotiate rather than completing everything in one pass.
Creating a task (JSON-RPC)
POST /a2a HTTP/1.1
Content-Type: application/json
Authorization: Bearer <token>
{
"jsonrpc": "2.0",
"method": "tasks/send",
"id": "req-001",
"params": {
"id": "task-abc-123",
"message": {
"role": "user",
"parts": [{ "type": "text", "text": "Status of order #ORD-2025-7891?" }]
}
}
}For long-running tasks, tasks/sendSubscribe streams Server-Sent Events as the task progresses. No polling needed.
A2A vs MCP: Different Layers, Different Problems
This is the most common point of confusion. A2A and MCP are not competitors. They operate at different layers of the agent stack.
| A2A | MCP | |
|---|---|---|
| What it connects | Agent to agent | Agent to tool/data source |
| Direction | Horizontal (peer-to-peer) | Vertical (agent calls down to tool) |
| Discovery | Agent Cards at /.well-known/agent.json | Tool definitions in server manifest |
| Granularity | Service-level (agent skills) | Function-level (tool parameters) |
| State | Stateful tasks with lifecycle | Stateless function calls (mostly) |
| Communication | Multi-turn, supports input-required | Single request-response per tool call |
| Transport | HTTP + JSON-RPC | stdio or HTTP + SSE |
| Primary use case | Cross-vendor agent collaboration | Giving agents access to tools and data |
The mental model: MCP answers "what can I use?" A2A answers "who can I work with?" In practice, a well-architected agent system uses both. MCP for local tools. A2A for collaboration with other agents. The same agent can participate in both protocols simultaneously.
A2A vs ACP: Enterprise Orchestration vs Developer Workflow
ACP (Agent Communication Protocol) targets a different surface. A2A is about agents collaborating across organizational and vendor boundaries over HTTP. ACP is about agents operating within a developer's IDE via local protocols (stdio, IPC).
| A2A | ACP | |
|---|---|---|
| Primary axis | Agent-to-agent | Agent-to-editor |
| Environment | Cloud, enterprise, cross-vendor | IDE, local |
| Transport | HTTP + JSON-RPC | stdio, IPC |
| Typical participants | CRM, ERP, support agents | Coding, test, review agents in IDE |
A2A: how does Salesforce's agent talk to SAP's agent? ACP: how does a coding agent interact with the editor? Different problems, different protocols.
Who Supports A2A
50+ launch partners spanning cloud providers, SaaS vendors, system integrators, and agent frameworks.
Cloud and AI Platforms
Google (Vertex AI, ADK), Salesforce (Agentforce), SAP (Joule), Intuit, Workday, ServiceNow
Agent Frameworks
LangChain, CrewAI, Cohere, LlamaIndex, Genkit. Build A2A-compatible agents without implementing the protocol from scratch.
Enterprise and Consulting
Deloitte, Accenture, KPMG, Wipro, TCS, Infosys, Cognizant, BCG. System integrators signal enterprise deployment demand.
Who is NOT on the list
Anthropic (maintains MCP), OpenAI (Agents SDK), and Microsoft (Copilot Studio) are absent. Whether A2A becomes universal or stays Google-ecosystem depends on whether these three adopt it.
Getting Started with A2A
Google provides a Python SDK (google-a2a) and reference implementations.
Install the A2A SDK
pip install google-a2aDefine an Agent Card
from a2a.types import AgentCard, AgentSkill, AgentCapabilities
card = AgentCard(
name="Code Review Agent",
description="Reviews PRs for security and performance issues",
url="https://review-agent.example.com/a2a",
version="1.0.0",
capabilities=AgentCapabilities(streaming=True, push_notifications=False),
skills=[
AgentSkill(
id="security-review",
name="Security Review",
description="Scan code changes for common vulnerabilities",
tags=["security", "code-review"],
),
AgentSkill(
id="perf-review",
name="Performance Review",
description="Identify N+1 queries, memory leaks, bundle size",
tags=["performance", "code-review"],
),
],
default_input_modes=["text/plain"],
default_output_modes=["text/plain", "application/json"],
)Handle incoming tasks
from a2a.server import A2AServer, TaskHandler
from a2a.types import Task, TaskState, Message, TextPart
class ReviewHandler(TaskHandler):
async def on_task_send(self, task: Task) -> Task:
diff_text = task.messages[-1].parts[0].text
findings = await run_security_review(diff_text)
task.state = TaskState.COMPLETED
task.messages.append(
Message(role="agent", parts=[TextPart(text=findings)])
)
return task
server = A2AServer(card=card, handler=ReviewHandler())
# Run with: uvicorn server:server.appThe SDK handles Agent Card serving, task lifecycle, and JSON-RPC routing. You implement the task handler.
Client: calling a remote A2A agent
from a2a.client import A2AClient
client = A2AClient(url="https://review-agent.example.com/a2a")
# Discover capabilities
card = await client.get_agent_card()
# Send a task
task = await client.send_task(
task_id="review-001",
message=Message(
role="user",
parts=[TextPart(text="Review this diff:\n" + diff)],
),
)
print(f"Status: {task.state}")
print(f"Result: {task.messages[-1].parts[0].text}")Limitations and Open Questions
A2A solves a real problem, but the protocol has constraints and unanswered questions that will shape its adoption trajectory.
Authentication Complexity
Supports did_auth, API keys, and OAuth2. If two agents use different auth schemes, they cannot communicate without an intermediary. Enterprises must standardize per deployment.
No Offline Support
HTTP-only. No local-first or offline mode. Works for cloud-native enterprise deployments. Limits adoption in developer tooling, edge computing, and air-gapped environments.
Enterprise Focus, Developer Gap
Partners are mostly enterprise vendors and SIs. The protocol design leans cloud-to-cloud. CLI-first and local-first developer tools may find A2A heavyweight.
Missing Key Players
Anthropic, OpenAI, and Microsoft are not launch partners. A communication protocol's value scales with adoption. Half the ecosystem missing means half the value.
Additional gaps: the protocol does not define distributed tracing or correlation IDs across agent boundaries, so debugging multi-agent workflows requires layering on OpenTelemetry or custom trace propagation. Authorization policies (what one agent can ask another to do) are left to implementations. And version negotiation between agents running different A2A spec versions is undefined in the current spec.
Frequently Asked Questions
What is the A2A protocol?
An open protocol from Google (April 2025) for agent-to-agent communication. HTTP + JSON-RPC transport. Agents publish Agent Cards describing capabilities and communicate through stateful Tasks.
What is the difference between A2A and MCP?
Different layers. MCP connects agents to tools and data (vertical, "what can I use?"). A2A connects agents to each other (horizontal, "who can I work with?"). They are complementary.
Who supports A2A?
50+ launch partners: Google, Salesforce, SAP, MongoDB, LangChain, CrewAI, Cohere, Intuit, Workday, Deloitte, Accenture. Anthropic, OpenAI, and Microsoft are not launch partners.
How does agent discovery work?
Agents host an Agent Card (JSON) at /.well-known/agent.json. The card lists capabilities, auth requirements, and endpoint URL. Client agents fetch the card before sending tasks.
Does A2A work offline?
No. HTTP-only. No local-first or offline mode. Designed for cloud-based enterprise deployments.
What is the difference between A2A and ACP?
A2A is agent-to-agent (cross-vendor enterprise orchestration). ACP is agent-to-editor (IDE and developer workflow integration).
What authentication does A2A support?
Three methods: did_auth, API keys, and OAuth2. Deployments choose one. The flexibility is intentional but requires per-deployment standardization.
Is A2A production-ready?
Published spec with Python and TypeScript SDKs, reference implementations, and 50+ partners. Core protocol is stable. Tooling and deployment patterns are still maturing. The missing Anthropic/OpenAI/Microsoft support is the biggest open question.
Building Multi-Agent Systems That Ship Code
Agent protocols define how agents communicate. But the code those agents produce still needs to merge cleanly into your codebase. Morph's Fast Apply model handles LLM-generated edits at 10,500+ tokens per second with deterministic merge behavior. The reliability layer between your agents and your repository.