A2A — the Agent2Agent protocol
A2A is a protocol for one autonomous agent to discover another and ask it something in natural language, over JSON-RPC. Version 1.0.0 publishes a card at /.well-known/agent-card.json describing the agent's skills. Connect implements it at POST /a2a with five public documentation skills and no authenticated extended card.
What A2A is for, and what MCP is for#
The two protocols are often presented as rivals, which misreads both. MCP connects a *client* to *capabilities*: a model client holds the connection, reads a list of tools and calls them with arguments it constructs. A2A connects an *agent* to *another agent*: the caller does not know the callee's internals, does not construct a function call, and asks a question in words that the callee's own reasoning answers.
| MCP | A2A | |
|---|---|---|
| Caller | A model client | Another agent |
| Unit of work | A named tool with typed arguments | A message in natural language |
| Discovery | The client is configured with a URL | A card at a well-known URI |
| Who reasons | The caller | Both ends |
| Connect's endpoint | POST /mcp | POST /a2a |
A useful test: if you already know which function you want, you want MCP. If you have a question and are looking for someone able to answer it, you want A2A. Connect offers both, over the same documentation corpus, so the answers cannot diverge.
The exchange, end to end#
Fetch
/.well-known/agent-card.jsonfrom the domain you are interested in.Result A JSON document naming the agent, its protocol version, the URL to send messages to, its declared capabilities and its skills.
POST a JSON-RPC
message/sendto the URL the card gives, with a message whosepartscontain a text part.Result A result of kind
message, roleagent, carrying reply parts and acontextIdyou can quote on a follow-up.Name a
skillIdfrom the card if you know which skill you want.Result That skill answers. Omit it and Connect chooses from the shape of the question, because an agent that arrived via a well-known URI often has not read the skill list.
POST /a2a HTTP/1.1
Host: connectbyjbrh.com
Content-Type: application/json
{"jsonrpc":"2.0","id":"7","method":"message/send",
"params":{"skillId":"describe-capability",
"message":{"parts":[{"kind":"text",
"text":"Can Connect record a phone call?"}]}}}A reply carries a text part and, where there is something structured worth handing to a program, a data part beside it — the page URL, the status word, the other candidate pages. metadata names the skill that answered and the documentation root the answer came from, so a caller can audit which surface produced what.
Does Connect use A2A?#
Yes, as a server, in production. Protocol version 1.0.0; the card lives at /.well-known/agent-card.json and the endpoint is POST /a2a. Five skills are published and every one reads the generated public documentation: explain-connect answers a question from the closest page, search-connect-docs returns matching pages, describe-capability reports the status vocabulary and the status of the nearest documented capability, explain-workflow returns an end-to-end workflow page, and explain-integration answers from the protocol, developer and technology references.
There is no authenticated extended card. The card declares supportsAuthenticatedExtendedCard: false, and a call to agent/getAuthenticatedExtendedCard is answered with -32004 and a sentence saying the public card is the whole advertised surface. Adding a private one would be a real decision about exposing workspace capability to other agents, and pretending it exists would be worse than not having it.
Streaming is not offered either. The card declares streaming: false and message/stream returns -32004 pointing at message/send. Push notifications are likewise declared false. Every skill answers from generated files, so there is nothing to stream.
Connect is not an A2A *client*: it does not go out and call other agents' cards.
Limits and refusals#
| Condition | Answer |
|---|---|
| More than 60 requests a minute from one address | 429 |
| Body over 128 KB | 413, before parsing |
A method other than message/send or tasks/send | -32601 |
message/stream | -32004 — the card declares streaming false |
agent/getAuthenticatedExtendedCard | -32004 — no such card exists |
A skillId not on the card | -32004, listing the five real ones |
| A message with no text part | -32602 |
One thing worth planning for: this endpoint answers about the public documentation, so a question about a specific business's mail, calls or customers has no useful answer here and will come back as documentation about that subject. That is not a failure to be retried — it is the boundary of the surface.
Questions#
Do I have to read the card before sending a message?
You should, because the card names the URL and the skills. But Connect does not require it: a message with no skillId is routed by the shape of the question, which is a deliberate concession to agents that found the well-known URI and went straight to it.
Can another agent do anything to my workspace over A2A?
No. Every skill reads the generated public documentation, holds no session and touches no workspace. There is no authenticated variant of this endpoint and no credential that would unlock one.
Is A2A a replacement for an API?
No, and treating it as one produces a slow, vague API. A2A is for the case where the caller does not know the shape of the answer in advance. When you do know it, the public API or the MCP tools give you typed results without a natural-language round trip.