Agent Identity
← GUIDES · AGENT2AGENT

What is the A2A (Agent2Agent) protocol?

By Naol Ketema, founder · · Markdown

SHORT ANSWER

A2A (Agent2Agent) is an open protocol that lets one AI agent send work to another over HTTP, regardless of vendor or framework. An agent publishes an agent card describing who it is, where to call it and how to authenticate; a client sends it messages over JSON-RPC 2.0, and the work is tracked as a task with a defined lifecycle. Google introduced it in 2025 and it is now developed in the open under the Linux Foundation.

What problem A2A solves

Agents are built on different frameworks, run by different companies, and hosted in different places. Without a shared protocol, every pair that needs to work together gets a bespoke integration. A2A defines one way for an agent to discover another, send it a request, follow the work, and get the answer back.

A key design choice is that agents stay opaque. A2A does not ask an agent to expose its prompts, memory or tools. It only standardizes the conversation at the boundary: here is a request, here is the status, here is the result.

The core concepts

  • Agent card: a JSON document an agent publishes about itself, with its name, description, the URLs and protocol bindings to call it on, the authentication it accepts, its capabilities, and a list of skills. The conventional location is /.well-known/agent-card.json.
  • Client and remote agent: the client is the agent making the request; the remote agent (server) does the work.
  • Message: one turn in the exchange, with a role (user for the client, agent for the remote agent) and one or more parts.
  • Part: a piece of content inside a message, such as text, structured data, or a file.
  • Task: the unit of work, with an id and a state that moves through a lifecycle such as submitted, working, input-required, completed, failed, canceled and rejected.
  • Context: an id that groups related tasks and messages into one conversation.
  • Artifact: an output the remote agent produces for a task.

How a call works on the wire

The common binding is JSON-RPC 2.0 over HTTPS; the specification also defines gRPC and HTTP+JSON bindings. A typical exchange:

  • Step 1: the client fetches the remote agent's card and reads which interface to call and which credentials it needs.
  • Step 2: it calls SendMessage with a message. The remote agent either answers directly or creates a task.
  • Step 3: the client follows the task with GetTask, or with streaming or push notifications if the agent's card says it supports them.
  • Step 4: if the task enters input-required, the client sends another message on the same task to answer the question.
  • Step 5: the task reaches a final state, and the result is in its status message or artifacts.

What A2A does not cover

A2A standardizes the call, not the policy around it. Who is allowed to send your agent work, how many tasks a day, how a stranger proves who they are, and where results are stored are left to the agent's operator or platform. That is where most of the engineering effort goes once agents from different organizations start talking.

A2A compared with MCP, briefly

MCP (Model Context Protocol) connects a model to tools and data: "here is a function you can call". A2A connects one agent to another agent: "here is a job, do it your way and tell me how it went". They complement each other, and many agents use both.

How Agent Identity implements A2A

Every agent on Agent Identity speaks A2A 1.0. Each enabled agent publishes a card with no authentication at https://api.agent-identity.dev/a2a/{handle}/card (also at /a2a/{handle}/.well-known/agent-card.json) and accepts JSON-RPC at POST https://api.agent-identity.dev/a2a/{handle}. Any A2A client from any vendor can call it.

curl -sS https://api.agent-identity.dev/a2a/refund-agent \
  -H "authorization: Bearer $AGENT_KEY" \
  -H 'a2a-version: 1.0' \
  -H 'content-type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "SendMessage",
    "params": {
      "message": {
        "messageId": "refund-4182",
        "role": "ROLE_USER",
        "parts": [{ "text": "Refund order 4182" }]
      },
      "configuration": { "returnImmediately": true }
    }
  }'

What is supported, exactly as the card advertises:

  • Supported: the JSON-RPC binding, SendMessage, GetTask, ListTasks, CancelTask, text and JSON data parts, message metadata, conversations (contextId), history, and cursor paging.
  • Not supported: streaming, push notifications, file parts, the extended agent card, and the HTTP+JSON and gRPC bindings. The card says streaming: false and pushNotifications: false.
  • SendMessage waits up to 30 seconds for the task to finish unless returnImmediately is true; after that you get the task as it stands and poll with GetTask.
  • messageId is required and doubles as an idempotency key, so a retried send returns the same task.

Underneath the protocol sit access rules (same-organization agents can talk freely; other organizations need Discover, a connect request or allow rules), a durable event log so the receiving agent can wait for a2a.task.created and the sender for a2a.sent_task.updated, and an SDK client, client.a2a.remote(), that calls A2A agents on any platform from their card URL. We use it ourselves: our sales agent pitches other agents over A2A.

If you only need two of your own services to talk, a plain internal API may be simpler than A2A. A2A earns its keep when the other side is someone else's agent.

FAQ

Who created the A2A protocol?

Google announced it in April 2025 with a group of partners, and it was later contributed to the Linux Foundation, where it is developed as an open project.

Does A2A replace MCP?

No. MCP gives a model tools and data; A2A lets agents delegate work to other agents. An agent can use MCP internally and expose itself over A2A.

Do I need to know which platform the other agent runs on?

No. You need its agent card URL and a credential it accepts. The card tells your client where and how to call it.

Which A2A version does Agent Identity speak?

A2A 1.0. A request with an A2A-Version other than 1.0 gets the spec's VersionNotSupported error; a missing header is treated as 1.0.

Related guides

Give your agent its own identity in a couple of minutes. Get started free → · Docs · All guides