A2A vs MCP: two protocols solving two different problems

9 min read
Agent AMCPToolDBAPIAgent BMCPToolDBAPIA2A
MCP is the vertical axis — one agent reaching its own tools. A2A is the horizontal axis — one agent reaching another.

A2A and MCP get compared the way React and Redux used to get compared: constantly, and usually by someone trying to pick one. The framing is wrong. They sit at different layers of the same stack, and once you look at what each one actually puts on the wire, the question answers itself.

The one-line answer

MCP connects an agent to its tools. A2A connects an agent to another agent. MCP runs vertically — down from your agent into the databases, APIs and files it needs. A2A runs horizontally — across to a peer that has its own model, its own tools, and usually its own owner.

That is the whole distinction, and every other difference follows from it. If the thing on the other end is a capability you drive, you want MCP. If it is a system that decides for itself how to accomplish what you asked, you want A2A.

What each one actually puts on the wire

Abstract comparisons are easy to nod along with and hard to act on, so look at the messages instead. An MCP client, once connected to a server, asks what it can call:

MCP — asking a server what it exposes
--> {"jsonrpc": "2.0", "id": 1, "method": "tools/list"}

<-- {"jsonrpc": "2.0", "id": 1, "result": {
      "tools": [{
        "name": "search_orders",
        "description": "Find orders by customer id or date range",
        "inputSchema": {
          "type": "object",
          "properties": {
            "customerId": { "type": "string" },
            "since":      { "type": "string", "format": "date" }
          },
          "required": ["customerId"]
        }
      }]
    }}

Note the shape of that description. inputSchema is a contract for a caller that already knows what it wants: give me these arguments, I will do exactly this. The tool has no opinion, no state of its own worth speaking of, and no ability to come back later.

A2A opens with something quite different — a document, fetched over plain HTTP, describing an agent:

A2A — the Agent Card at /.well-known/agent-card.json
{
  "name": "Order Operations Agent",
  "description": "Investigates order issues end to end: locates the order,
                  diagnoses the failure, and issues refunds under policy.",
  "version": "2.4.0",
  "supportedInterfaces": [
    { "url": "https://agents.example.com/orders/a2a/v1",
      "protocolBinding": "JSONRPC",
      "protocolVersion": "1.0" }
  ],
  "capabilities": { "streaming": true, "pushNotifications": true },
  "defaultInputModes": ["text/plain", "application/json"],
  "defaultOutputModes": ["application/json"],
  "skills": [{
    "id": "order-investigation",
    "name": "Order investigation",
    "description": "Given a customer complaint, find the order, determine
                    what went wrong, and propose or execute a remedy.",
    "tags": ["orders", "refunds", "support"]
  }]
}

There is no input schema here, and that absence is the point. You do not tell this agent which function to call — you hand it a problem in one of its defaultInputModes and it works out the rest. What the card promises instead is addressability: where the agent lives, what protocol it speaks, whether it can stream, whether it can call you back, and what kinds of problems it is willing to take.

Discovery is the real difference

The deepest split between the two protocols is not the message format — both lean on JSON-RPC 2.0 — but when and how you find out what exists.

MCP discovery is in-session. You connect to a server you were already configured to know about, complete an initialize handshake, and then ask it what it has. Nothing is discoverable before the connection exists, which is fine, because the host application already knows which servers it is wired to.

A2A discovery is static and public. The Agent Card sits at a fixed, well-known path and is fetched with an ordinary unauthenticated GET:

curl -s https://agents.example.com/.well-known/agent-card.json

That single design decision is what makes A2A work across organisational boundaries — which is the problem A2A was introduced to solve. Anyone who knows your domain can learn what your agent does without a credential, an SDK, a registry entry or a conversation with your team. It is the same trick robots.txt and openid-configuration pull, applied to agents — and it is why the card carries so much weight in the protocol.

Side by side

MCPA2A
ConnectsAn agent to its tools, data and promptsAn agent to another agent
CounterpartyA capability you driveA peer that decides how
DiscoveryIn-session, after initializeStatic GET of /.well-known/agent-card.json
Unit of workA tool call with typed argumentsA task delegated in natural language or JSON
Description formatJSON Schema per toolSkills with tags, examples and modes
Typical boundaryInside one system or trust domainAcross teams, vendors and organisations
Long-running workRequest/response; the caller waitsStreaming and push notifications are declared capabilities
Who reads the descriptionYour model, to pick the right toolAnother team's agent, to decide whether to engage at all

Where the comparison is genuinely a choice

There is a real overlap, and pretending otherwise is how people end up building the wrong thing. Both protocols can carry JSON-RPC over HTTP. Both describe capabilities as JSON. And you can wrap an entire agent as a single MCP tool called ask_the_orders_agent, or expose a single tool as a trivial A2A agent with one skill. Neither is absurd.

Three questions usually settle it:

  1. Does the caller know the exact operation it wants? If yes, that is a tool call, and MCP's typed input schema is a feature rather than a formality.
  2. Does the work outlive a single request? Tasks that run for minutes, need progress updates, or call back later fit A2A's task lifecycle; forcing them through a synchronous tool call means building your own polling protocol on the side.
  3. Does a stranger need to find this? If a team you have never met should be able to discover and address your agent, only A2A gives you that for free. MCP has no equivalent of a public, crawlable card.

The stack that runs both

In practice the interesting systems are not choosing. A single deployed agent is usually an A2A peer on the outside and an MCP client on the inside:

  • Its public face is an Agent Card at /.well-known/agent-card.json, so partner agents can find it, see which skills it offers, and learn how to authenticate.
  • Behind that endpoint, the agent reaches its warehouse database, its payments API and its document store through MCP servers — none of which are visible to, or the business of, the caller.
  • When it needs work it cannot do itself, it fetches another agent's card and delegates over A2A, becoming a client at that boundary.

The layering is what makes the encapsulation hold. A partner integrating with your agent should not need to know that you swapped one MCP tool for another last week, and with this structure they never find out.

Which one to reach for

Reach for MCP when you are extending what a single agent can do:

  • giving a model access to a database, a filesystem, a ticketing system or an internal API;
  • packaging a deterministic operation you want called with specific arguments;
  • working entirely inside one trust domain, where a configured connection is a reasonable prerequisite.

Reach for A2A when you are making an agent reachable as a participant:

  • another team, product or company needs to send work to your agent;
  • the work is open-ended enough that the caller should describe the goal, not the procedure;
  • you want to be listed, indexed or discovered rather than individually integrated.

If that second list describes you, the first artefact to build is the card itself — the shape of it is defined in the A2A specification — and it is smaller than the integration work you are probably imagining. The Agent Card schema reference walks every field of the v1.0 document, and the Agent Card generator will produce a valid one from a form in about two minutes. When you have a draft, run it through the validator before it goes anywhere near a partner.

Frequently asked questions

Is A2A a replacement for MCP?

No. MCP describes the tools, data and prompts a single agent can use; A2A describes agents as peers that can delegate work to each other. An agent can be an A2A peer to the outside world and an MCP client internally at the same time, and most production systems end up exactly there.

Can I expose an A2A agent as an MCP tool instead?

You can, and for a small internal capability it is often the pragmatic choice. What you give up is autonomy and discoverability: an MCP tool is something your model calls with typed arguments and waits on, whereas an A2A peer receives a task, decides how to accomplish it, and can run long enough to need its own lifecycle. You also lose static discovery — there is no URL another organisation can fetch to learn your tool exists.

Do A2A and MCP use the same transport?

They overlap. Both use JSON-RPC 2.0 as one of their wire formats, which is why the two are so often confused. A2A v1.0 additionally defines gRPC and HTTP+JSON bindings, and an Agent Card names which of them a given endpoint speaks through supportedInterfaces[].protocolBinding.

Does an MCP server need an Agent Card?

Not unless you also want it reachable as an A2A peer. An Agent Card advertises an agent that other agents can delegate tasks to. A pure MCP server — one that exposes tools to a host application over a session — is discovered by the host that connects to it, not by strangers fetching a well-known URL.

Which one should I implement first?

Implement whichever solves the boundary you are actually stuck at. If your agent cannot reach the data or actions it needs, that is an MCP problem. If another team, vendor or customer cannot find or address your agent, that is an A2A problem — and an Agent Card is the smallest useful thing you can ship for it.

References

  1. A2A protocol specification (a2aproject/A2A)github.com/a2aproject/A2A
  2. A2A: a new era of agent interoperability — Google Developers Blogdevelopers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/
  3. Model Context Protocol specificationmodelcontextprotocol.io/
  4. JSON-RPC 2.0 specificationwww.jsonrpc.org/specification

Related tool: Agent Card Schema reference

Next step

Know the fields before you argue about the protocols.

The Agent Card is the part of A2A you have to get right first — it is the only thing another agent reads before deciding whether to talk to yours.