Agent Card
JSON at a well-known address: name, description, skills, the interfaces the agent serves, its capabilities and the security schemes it accepts.
Guide
The A2A (Agent2Agent) protocol is an open standard that lets AI agents built by different companies find each other, hand each other work and return results over HTTPS. Each agent publishes an Agent Card saying what it can do, where to reach it and how to sign in; a caller sends it a message, and the work is tracked as a task that moves through defined states until it completes, fails or needs more input. Google introduced A2A in April 2025, version 1.0 shipped in March 2026, and the project is governed under the Linux Foundation.
A2A is a protocol for one agent to give work to another: the client sends a message, and the remote agent answers with a reply or a task to follow until the work is done. The specification lets agents collaborate "without needing access to each other's internal state, memory, or tools": a supplier's ordering agent or a partner's support agent can take requests from yours without either side exposing its prompts, model or systems.
A2A does not replace the Model Context Protocol. MCP connects an agent to tools and data; A2A connects it to another agent as a peer, and that agent may use MCP internally. The comparison is in A2A vs MCP, and the tool side in the best MCP servers for business agents.
Google created A2A but no longer controls it alone. It announced the protocol in April 2025, contributed it to the Linux Foundation in June 2025, and in August 2026 A2A became a hosted project of the Agentic AI Foundation, the Linux Foundation body that also hosts MCP.
| Date | Milestone | Source |
|---|---|---|
| 9 April 2025 | Google announces A2A with 50+ technology partners. | |
| 23 June 2025 | The Linux Foundation launches the Agent2Agent project. | Linux Foundation |
| 30 July 2025 | Version 0.3.0, the version many early tutorials describe. | Releases |
| 12 March 2026 | Version 1.0.0, the first stable specification. | Releases |
| 9 April 2026 | 150+ supporting organisations; built into Google, Microsoft and AWS platforms. | Linux Foundation |
| August 2026 | Joins the Agentic AI Foundation (AAIF) as a hosted project. | AAIF |
A steering committee with seats for Google, Microsoft, Cisco, AWS, Salesforce, ServiceNow, SAP and IBM sets technical direction, per the governance file. The specification is Apache 2.0 licensed.
A client reads the remote agent's Agent Card, obtains the credential it asks for, and sends a message. The agent replies with a message or, for anything that takes time, a task whose results come back as artifacts.
JSON at a well-known address: name, description, skills, the interfaces the agent serves, its capabilities and the security schemes it accepts.
One turn, with a role (ROLE_USER or ROLE_AGENT), a messageId and parts holding text, a file or structured data.
The unit of work, with an id and a status. Related tasks share a contextId, which keeps a multi-turn exchange together.
An output the agent produced - a document, an image, data - made of parts, with its own artifactId.
| Task state | Meaning | Client's next step |
|---|---|---|
TASK_STATE_SUBMITTED | Accepted, not started. | Wait, poll or stream. |
TASK_STATE_WORKING | In progress. | Wait for updates. |
TASK_STATE_INPUT_REQUIRED | Paused: needs more from the caller. | Reply with the same taskId. |
TASK_STATE_AUTH_REQUIRED | Paused: needs an authorisation. | Arrange it, usually out of band. |
TASK_STATE_COMPLETED | Done. Terminal. | Read the artifacts. |
TASK_STATE_FAILED | Ended in error. Terminal. | Read the status message. |
TASK_STATE_CANCELED | Cancelled. Terminal. | Nothing further. |
TASK_STATE_REJECTED | Declined by the agent. Terminal. | Do not resend it unchanged. |
While a task runs, the client can stream updates over Server-Sent Events, poll with GetTask, or register a webhook if the card supports pushNotifications.
An Agent Card is a JSON document, served by convention at https://{server_domain}/.well-known/agent-card.json, that names the agent, lists its skills, and says where to call it and which credentials it accepts. This illustrative version 1.0 card uses the specification's exact field names; the company, URLs and skill are made up.
{
"name": "Invoice Desk",
"description": "Answers invoice status questions for Example Co customers. Needs an invoice number. Will not change invoices or issue refunds.",
"supportedInterfaces": [
{
"url": "https://agents.example.com/a2a/invoice-desk",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
}
],
"provider": { "organization": "Example Co", "url": "https://www.example.com" },
"version": "1.0.0",
"capabilities": { "streaming": true, "pushNotifications": false },
"securitySchemes": {
"bearer": { "httpAuthSecurityScheme": { "scheme": "Bearer" } }
},
"securityRequirements": [ { "schemes": { "bearer": { "list": [] } } } ],
"defaultInputModes": ["text/plain"],
"defaultOutputModes": ["text/plain"],
"skills": [
{
"id": "invoice-status",
"name": "Invoice status",
"description": "Looks up whether an invoice is open, paid or overdue.",
"tags": ["invoices"],
"examples": ["Has invoice INV-1042 been paid?"]
}
]
}
name, description, supportedInterfaces, version, capabilities, defaultInputModes, defaultOutputModes and skills.url, a protocolBinding (JSONRPC, GRPC or HTTP+JSON) and a protocolVersion.A tutorial that uses message/send, parts with a "kind" field or states such as "completed" was written for version 0.3; the specification's migration appendix covers the changes.
Yes. Version 1.0 defines three standard bindings, all over HTTP(S): JSON-RPC 2.0, gRPC and HTTP+JSON (REST). Every binding an agent offers must provide the same operations and authentication.
| Operation | JSON-RPC and gRPC | HTTP+JSON |
|---|---|---|
| Send a message | SendMessage | POST /message:send |
| Send and stream | SendStreamingMessage | POST /message:stream |
| Get a task | GetTask | GET /tasks/{id} |
| Cancel a task | CancelTask | POST /tasks/{id}:cancel |
| Register a push webhook | CreateTaskPushNotificationConfig | POST /tasks/{id}/pushNotificationConfigs |
Clients send an A2A-Version header such as 1.0; an agent that receives none assumes 0.3. A minimal JSON-RPC call to the agent above is an HTTPS POST to its interface URL with a bearer token:
{
"jsonrpc": "2.0",
"id": 1,
"method": "SendMessage",
"params": {
"message": {
"messageId": "6f1c2d1e-0001",
"role": "ROLE_USER",
"parts": [{ "text": "Has invoice INV-1042 been paid?" }]
}
}
}
A reply that finishes in one step returns the answer as an artifact:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"task": {
"id": "task-8812",
"contextId": "ctx-311",
"status": { "state": "TASK_STATE_COMPLETED" },
"artifacts": [
{ "artifactId": "art-1", "parts": [{ "text": "INV-1042 was paid on 3 October." }] }
]
}
}
}
Yes. An Agent Card can declare OAuth 2.0 (authorisation code, client credentials or device code flows), OpenID Connect, bearer tokens, API keys and mutual TLS. The client obtains a credential out of band and sends it with every request; A2A messages carry no identity of their own.
The server must authenticate every request; what an authenticated caller may then do is left to the implementation. And TASK_STATE_AUTH_REQUIRED lets an agent pause a task to ask its caller for an authorisation, such as a person's approval before a destructive action.
Use HTTPS, authenticate every call, scope credentials to named agents, treat inbound callers as strangers rather than owners, let your agent contact only remote agents you listed, and treat replies as untrusted input. The table pairs each control with how we implement it on Olano.
| Control | Why it matters | How Olano does it |
|---|---|---|
| HTTPS only | Tokens travel in a header. | By default, external access is refused on a plain-http address; remote agents must be https://. |
| Authenticate every call | An open endpoint exposes the agent's tools. | A missing or bad token gets a 401. Callers use a minted token or an OAuth 2.1 sign-in. |
| Scope credentials | One token for everything turns a leak into a breach. | A token reaches only the agents it names. An administrator ticks agents on the consent page. |
| Callers are not owners | Knowing who calls is not permission. | Inbound turns run as a non-owner; actions needing approval wait in the Approvals inbox. |
| Addresses are configuration | A model that picks URLs can be steered to exfiltrate. | Your agent can call only names on its Remote Agents list, with no URL parameter. |
| Pin the card's endpoint | A compromised card could redirect credentials. | Both URLs are vetted, and by default the card's endpoint must share the configured origin. |
| Replies are input | Another agent's reply can carry prompt injection. | Replies are reported, not obeyed, and capped at 20,000 characters by default. |
| Log every crossing | You will be asked to account for these calls. | Every exchange appears in the Agent to Agent view's External segment. |
If you use push notifications, validate webhook URLs too: the specification warns that a client-supplied webhook is a server-side request forgery risk.
Yes, with conditions. Version 1.0 is a stable specification, the Linux Foundation reported production deployments in April 2026, and the Python SDK was still shipping releases in October 2026. The open questions sit on the other side of each connection: 0.3 agents are still in service, not every agent serves every binding, and the protocol supplies no approvals, audit or rate limits.
Validate the Agent Card, send a real message, then break things on purpose.
Olano speaks A2A both ways, with the controls above built in, and both directions are off by default.
Inbound. Only an administrator can publish an agent: switch on the A2A endpoints under Config → External access, then on the agent's External access tab switch on Reachable over A2A and write its public description. Each exposed agent gets an Agent Card at <public URL>/api/a2a/agents/<agent>/.well-known/agent-card.json plus a JSON-RPC endpoint, declaring both bearer and OAuth sign-in. The description is compulsory and is never the system prompt. An administrator mints tokens (shown once, revocable), or a client signs in through Olano's own OAuth 2.1 server and an administrator approves it on a consent page. Callers never see the agent's configuration, files or other threads, and inbound task records are kept 7 days by default. The full walkthrough is in exposing your agent as an MCP server or agent card.
Outbound. On the agent's Advanced tab, the Remote Agents list holds a name, an https:// URL, an authentication mode and a vault reference for each agent it may call. That gives it tools to list, discover, message and poll remote agents. Sending counts as an external write, so an agent in Supervised or Locked-down mode asks first.
Visibility. The Agent to Agent view keeps outside traffic in its own External segment, with an A2A or MCP badge, apart from delegation between your own agents.
The limits: Olano does not make a remote agent trustworthy or find agents for you, and inbound A2A needs a public HTTPS address. See our security page for the isolation, vault and audit trail underneath, and the platform page for the rest.
Google created it and announced it on 9 April 2025. It was contributed to the Linux Foundation in June 2025 and became a hosted project of the Agentic AI Foundation in August 2026.
Yes. Version 1.0, the first stable specification, was released in March 2026. In April 2026 the Linux Foundation reported more than 150 supporting organisations and integration in Google, Microsoft and AWS platforms.
Yes. An Agent Card can declare OAuth 2.0 with the authorisation code, client credentials or device code flow, as well as OpenID Connect, bearer tokens, API keys and mutual TLS. Credentials are obtained out of band and sent with every request.
Yes. Version 1.0 defines JSON-RPC 2.0, gRPC and HTTP+JSON bindings, production traffic must use HTTPS or TLS, and streaming uses Server-Sent Events.
Use the A2A project's free A2A Inspector to check the Agent Card and watch raw traffic, and its Technology Compatibility Kit to test conformance. Then test failures on purpose, such as a missing token.
MCP connects an agent to tools and data; A2A connects an agent to another agent as a peer, across company boundaries. They are complements, and both are now hosted by the Agentic AI Foundation.
The rest of the interoperability cluster.
What each protocol connects, and what open protocols do for lock-in.
Switches, descriptions, tokens, consent and approvals in detail.
The official servers worth connecting, and what to gate on each.
The short definition, and the addressing rule that matters most.
Isolation, the vault, approval gates and the audit trail.
Checked 16 October 2026 against the A2A specification and protocol definitions at version 1.0.0, the project's release notes and governance file, Google's April 2025 announcement, the Linux Foundation's June 2025 and April 2026 announcements, and the Agentic AI Foundation's August 2026 announcement. The example card and request are illustrative. Olano is not affiliated with Google, the Linux Foundation or the Agentic AI Foundation. If we have described something wrongly, write to support@olano.ai and we will correct this page.
Tell us which agents should talk to which. We will say plainly what each side will see and which requests will wait for a person.