The debate over a2a vs acp protocol is less about which is “better” and more about which constraints you can tolerate. A2A (Agent-to-Agent) and ACP (Agent Communication Protocol) both solve agent interoperability, but they make opposite trades between formal discovery and implementation simplicity.
What the two specs actually cover
A2A (Agent-to-Agent)
A2A is the Google-led open standard published in 2025. It defines an agent as a service exposing a JSON-RPC 2.0 surface over HTTP, with a machine-readable “agent card” for discovery. The card advertises skills, supported modalities, and endpoint URLs. Tasks are first-class objects: a client creates a task, sends messages (role + parts), and polls or streams state transitions.
{
"name": "WeatherAgent",
"description": "Forecast provider",
"url": "https://weather.example.com/a2a",
"capabilities": { "streaming": true, "push": false },
"skills": [{ "id": "forecast", "name": "Get Forecast" }]
}
A task invocation looks like a strict RPC:
{
"jsonrpc": "2.0",
"id": "req-1",
"method": "tasks/send",
"params": {
"taskId": "t-123",
"message": { "role": "user", "parts": [{"text": "Forecast for SF"}] }
}
}
ACP (Agent Communication Protocol)
ACP, pushed by IBM’s BeeAI project, skips the discovery formalism. It specifies a uniform HTTP API where an agent is a resource under /acp/v1/agents/{id}/run. You post an input and optionally a session id; the server returns a run object or streams events. There is no agent card standard—you document agents out-of-band or via your own registry.
curl -X POST https://agent.example.com/acp/v1/agents/weather/run \
-H "content-type: application/json" \
-d '{"session_id":"s1","input":"Forecast for SF"}'
ACP is closer to a conventional REST call than a protocol with negotiated task lifecycles.
Head-to-head dimensions
Capabilities
A2A gives you structured discovery, skill enumeration, task resumption, and push notifications. That matters when you are composing dozens of third-party agents you have never seen. ACP gives you session continuity and streaming but assumes you already know what agent you are calling and what it accepts.
Cost model
Neither protocol charges a fee. The real cost is engineering time and payload overhead. A2A’s agent card plus JSON-RPC envelopes add bytes and round trips (fetch card, then send task). ACP’s lean POST reduces boilerplate. If you run agents at high fan-out, A2A’s discovery cache pays off; for tight internal loops, ACP’s minimalism keeps serialization cheap.
Latency and throughput
Both support SSE streaming over HTTP. A2A imposes an extra discovery fetch on first contact unless you cache cards locally. ACP goes straight to /run. In practice, A2A adds one network hop of latency per new agent domain; ACP adds none. Throughput is dominated by your agent’s LLM backend, not the protocol—both are async-friendly.
Ergonomics
A2A has official Python and TypeScript SDKs that hide JSON-RPC plumbing, but the spec is large. You must model tasks, messages, parts, and artifacts. ACP is trivial to hit with curl or requests; a minimal client is ten lines:
import requests
r = requests.post(
"https://agent.example.com/acp/v1/agents/weather/run",
json={"session_id": "s1", "input": "Forecast for SF"},
stream=True,
)
for line in r.iter_lines():
if line:
print(line.decode())
Ecosystem and tooling
A2A launched with backing from Google, Salesforce, SAP, and others; expect enterprise agent catalogs to emit cards. ACP is younger, anchored in BeeAI and open-source agent repos. Regardless of protocol, your agents still need model inference. A gateway like n4n.ai exposes one OpenAI-compatible endpoint across 240+ models with automatic fallback when a provider degrades, so you can swap LLM backends without rewriting protocol code.
Limits
A2A is still evolving; the agent card schema changes between minor versions, and production deployments are thin. Its rigidity hurts if you need custom transport or binary parts. ACP lacks a discovery standard, so you rebuild service discovery yourself. It also has weaker semantics for long-running task state machines.
Comparison table
| Dimension | A2A | ACP |
|---|---|---|
| Discovery | Agent card (JSON), standardized | None; out-of-band registry |
| Wire format | JSON-RPC 2.0 over HTTP/SSE | HTTP POST + SSE, REST-style |
| Task model | Explicit task lifecycle, resumable | Session + run, ephemeral |
| First-call latency | +1 card fetch (cacheable) | Direct, no discovery |
| SDK support | Python, TS official | Minimal, mostly hand-rolled |
| Backers | Google, Salesforce, SAP | IBM BeeAI, OSS |
| Best fit | Cross-org agent meshes | Internal agent microservices |
Code-level contrast
A2A forces you to think in tasks even for a one-shot question. The server responds with a task object you must inspect:
{
"jsonrpc": "2.0",
"id": "req-1",
"result": {
"taskId": "t-123",
"status": "completed",
"artifacts": [{ "parts": [{"text": "Sunny, 18C"}] }]
}
}
ACP collapses that to a run result or streamed text. If you are building a quick pipeline where agent B calls agent A synchronously, ACP’s shape means less code. If agent A is a hosted third party with multiple skills and SLAs, A2A’s card tells you what you are allowed to do before you send data.
Which to choose
Choose A2A if…
- You are integrating agents across company boundaries.
- You need machine-readable skill discovery and versioned agent cards.
- Your workflows require resumable tasks, push updates, or audited state.
- You can absorb SDK weight and spec churn for long-term stability.
Choose ACP if…
- Your agents are internal services behind your own service mesh.
- You want to prototype without writing a discovery layer.
- Latency per call matters and you control both ends.
- Your team prefers REST conventions over RPC envelopes.
When neither fits
If you only have two agents and a hardcoded contract, both protocols are overhead. Use a plain function call or gRPC. Adopt a2a vs acp protocol only when the number of agents or the distance between owners makes implicit contracts brittle. Pick A2A for federation, ACP for simplification—and keep your LLM transport decoupled from either decision.