Two Teams, Two Agents, One Awkward Meeting
Your procurement agent needs a risk assessment, and the compliance team already has an agent that does exactly that. It runs on a different framework, in a different cloud, owned by people who won't give you its prompts or its tools. Someone suggests wrapping it in an MCP tool. That works until the assessment takes twenty minutes, needs a follow-up question halfway through, and returns three documents. Now your “tool call” is really a conversation between two systems, and a function signature is a poor fit for that.
Agent2Agent (A2A) is a protocol for that conversation. MCP connects an agent to tools and data. A2A connects an agent to another agent, treated as an opaque peer that you delegate work to. Google contributed it to the Linux Foundation, and it reached 1.0 in March 2026. InfoQ's 2026 trends report places agent-to-agent protocols among the innovators, so read this as a technology to understand now and adopt where the need is real.
- Different teams or companies own the agents that need to work together
- You are wrapping an agent in a tool and it keeps not fitting
- Someone at work has said you need “a multi-agent strategy” and you want to check
MCP and A2A Solve Different Problems
| MCP | A2A | |
|---|---|---|
| Connects | An agent to tools and data | An agent to another agent |
| The other side is | A function you can inspect | An opaque peer with its own reasoning |
| Unit of work | A tool call | A task that can last a while and ask questions |
| Discovery | tools/list | An Agent Card |
| Typical boundary | Inside your system | Between teams or organisations |
Most systems that use A2A use MCP as well. The compliance agent uses MCP to reach its own policy database, and A2A is how your agent reaches the compliance agent. Neither replaces the other.
The Core Ideas
- Agent Card. A JSON document published at a well-known URL (
/.well-known/agent-card.json) describing what the agent can do, how to reach it and how to authenticate. Cards can carry signatures, which matters once you stop trusting the network path. - Task. The unit of delegated work, with a status that moves over time. This is the big difference from a function call: a task can be running for an hour, or stop to ask for more input.
- Message and Artifact. Messages carry the back-and-forth. Artifacts are the outputs, such as a finished report.
- Transports. JSON-RPC 2.0 over HTTP(S), with gRPC and REST bindings, plus server-sent events for streaming and push notifications for long waits.
sequenceDiagram
participant P as Procurement agent
participant C as Compliance agent
P->>C: GET agent-card.json
C-->>P: Capabilities, endpoint, auth
P->>C: Send a task, assess vendor Acme
C-->>P: Working
C-->>P: Input required, which region?
P->>C: EU
C-->>P: Completed, artifact risk-report.pdf
Version 1.0 was a breaking release, with a large refactor separating the application protocol from its transport mappings. If you built on 0.x, plan a migration. For example, the card moved from agent.json to agent-card.json back in 0.3, and 1.0 renamed fields (mediaType replaced mimeType) and replaced the separate part types with one Partmessage, which changed how parts are represented, so follow the spec's migration notes. The current release at the time of writing is 1.0.1.
When It Is the Wrong Tool
Be honest about this first, because the failure I expect to see is teams adopting a protocol for agents that could have been a function. Reach for A2A when you can answer yes to at least one of these:
- Another team or company owns the agent, and you can't see inside it.
- The work takes minutes or hours and may need to ask questions.
- The two sides run on different frameworks or clouds and will keep changing independently.
If you own both agents, they share a codebase, and the call returns in seconds, use a function or an MCP tool. A multi-agentdesign inside one process doesn't need a network protocol at all. The other thing to weigh is cost: each hop can add model, network and orchestration cost on the other side, often reasoning over context you can't see, so measure what a peer actually does.
What Goes Wrong
1. Trusting what the other agent says
Output from a remote agent is untrusted input, exactly like text from a web page. OWASP calls out Insecure Inter-Agent Communication as ASI07: use mutual authentication, verify signed cards, and allowlist which agents may delegate to which.
2. No timeouts on delegated tasks
A task can legitimately run for an hour, so a missing deadline looks just like a working agent. Set a deadline per task, and decide what happens when it passes.
3. Losing the trace at the boundary
When an answer is wrong, you need to follow it across both systems. Propagate trace context on every call, or debugging stops at the edge of your own service.
4. Cascades
A retry from agent A can trigger retries in B and C. OWASP lists Cascading Failures as ASI08. Put budgets and circuit breakers on every delegation, since the failure otherwise spreads to everything that trusts the first agent.
Designing a Good Agent Card
Your card is what other agents use to decide whether to call you, so write it like an API contract. List skills with clear names and descriptions, say what inputs each one needs, and give realistic examples. Vague descriptions cause the same problems as vague tool descriptions: wrong calls, or no calls at all. Keep skills narrow. An agent that claims to "help with compliance" tells a caller little, whereas "assess a vendor's data-processing risk, given a company name and region" can be chosen correctly.
Version your card, publish it behind authentication if it reveals internal capabilities, and sign it. Remember that 1.0 was a breaking change, so if you're using an SDK, pin its version, and check which protocol version your peers speak before you upgrade.
What I Would Do First
Check whether you have the problem. If you do, start with a single delegation across one team boundary, with a signed card, a deadline and shared tracing. Get that one working well before you add a second. The AG-UI protocol is worth a look if you also need agents to stream to a front end, but keep that decision separate from this one.

