Markdown Editor

A2A Agent Card and Interface Specification Template (A2A 1.0)

A2A agent spec: Agent Card fields, skills, bindings, security schemes, operations, task states, parts, push, errors, discovery, example card, conformance

AI & DataFullA2A Protocol Specification 1.0.1Apache-2.0a2aagentcardspec

How to use: Use it when you expose an AI agent to other agents over the Agent2Agent protocol. Fill identity, interfaces, skills and security schemes first, then generate the published Agent Card from section 14 and run the conformance checklist. The main pitfall is copying field names from pre-1.0 examples, which use different names and enum values.

Preview

A2A Agent Card and Interface Specification: [Agent name]

Specification for an AI agent exposed to other agents over the Agent2Agent (A2A) protocol: identity and metadata, skills, capabilities, protocol bindings, security schemes, supported operations, task lifecycle, messages, parts and artifacts, streaming and push notifications, errors, versioning and discovery, an example Agent Card, security considerations and a conformance checklist. Written against the A2A Protocol Specification 1.0.1 (May 2026, a patch release of 1.0.0 from March 2026 with an unchanged a2a.proto; the protocol version used on the wire is 1.0), whose normative definition is the a2a.proto file in the specification repository. A2A is a Linux Foundation project and, since August 2026, a hosted project of the Agentic AI Foundation. Check the current release at a2a-protocol.org before you start. Replace every [bracketed] value and every row marked Example.

Document control

FieldValue
Document ID[A2A-SPEC-001]
Agent name[Name as in the Agent Card name]
Agent version (card version)[1.0.0]
Document version[0.1]
A2A specification1.0.1 (protocol version 1.0)
Older protocol versions served[None / 0.3 on a separate interface]
Status[Draft / In review / Approved / Deprecated]
Owner[@agent-owner]
Approvers/reviewers[@api-review], [@security-engineer], [@platform-engineer]
Public Agent Card URL[https://agent.example.com/.well-known/agent-card.json]
Classification[Public / Internal / Confidential]
Last updatedYYYY-MM-DD
Related documents[Agent specification], [MCP server specifications], [Threat model], [Runbook]

Approvals

RoleNameDecisionDate
Agent owner[@name][Approve / Approve with conditions / Reject]YYYY-MM-DD
API review[@name][Decision]YYYY-MM-DD
Security[@name][Decision]YYYY-MM-DD
Identity and access management[@name][Decision]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]First draft
1.0YYYY-MM-DD[@name]Example: First release with JSON-RPC and HTTP+JSON interfaces
1.1YYYY-MM-DD[@name]Example: Added push notifications and a signed card

Contents

1. Purpose and scope

[Describe what the agent offers and to whom.] Example: The Invoice Reconciliation Agent matches supplier invoices against purchase orders and goods receipts for business customers of [Company], and returns a reconciliation report. It is called by customers' procurement agents and by our own finance assistant. It does not approve or pay invoices.

ItemValue
CallersExample: Customer procurement agents (external), internal finance assistant
TenancyExample: Multi-tenant; each customer is a tenant
Data handledExample: Invoices, purchase orders, supplier names; Confidential
Out of scopeExample: Payments, supplier onboarding, tax advice
Human contactExample: [support address] for interface questions

2. Protocol baseline and governance

ItemValue
SpecificationAgent2Agent (A2A) Protocol Specification 1.0.1, https://github.com/a2aproject/A2A/blob/v1.0.1/docs/specification.md (current version: https://a2a-protocol.org/latest/specification/)
Normative sourcespecification/a2a.proto in https://github.com/a2aproject/A2A (tag v1.0.1, identical to v1.0.0)
Protocol version on the wire1.0 in protocolVersion of each interface and in the A2A-Version request header
Requests without A2A-VersionTreated as version 0.3 by the specification; [reject with VersionNotSupportedError / serve 0.3 interface]
SDK used[Example: Official A2A SDK for [language], version [x.y.z]]
GovernanceLinux Foundation project; hosted by the Agentic AI Foundation (AAIF) since August 2026; specification licensed under Apache License 2.0
Change tracking[Example: Watch specification releases; review each minor release within 30 days]

3. Agent identity and metadata

FieldRequiredValueNotes
nameYesExample: Invoice Reconciliation AgentHuman-readable name
descriptionYesExample: Matches supplier invoices to purchase orders and receipts and reports mismatchesShown to users and models
supportedInterfacesYesSee section 4Ordered list; first entry is preferred
provider.organizationYes if provider givenExample: Example Finance Services Ltd
provider.urlYes if provider givenExample: https://www.example.com
versionYesExample: 1.0.0Version of this agent, not of A2A
documentationUrlNoExample: https://docs.example.com/agents/invoice-recon
iconUrlNoExample: https://agent.example.com/icon.png
capabilitiesYesSee section 5
securitySchemesNoSee section 7Map of scheme name to scheme
securityRequirementsNoSee section 7Requirements for the whole agent
defaultInputModesYesExample: application/json, text/plain, application/pdfMedia types accepted
defaultOutputModesYesExample: application/json, text/plainMedia types returned
skillsYesSee section 6At least one skill
signaturesNoSee section 13.3JWS signatures over the card

4. Interfaces and protocol bindings

#urlprotocolBindingprotocolVersiontenantNotes
1Example: https://agent.example.com/a2a/v1JSONRPC1.0[Not used / tenant ID]Preferred
2Example: https://agent.example.com/a2a/restHTTP+JSON1.0REST style, media type application/a2a+json
3Example: https://grpc.agent.example.comGRPC1.0Internal callers only

Binding notes to verify:

  • JSON-RPC: JSON-RPC 2.0 over HTTP; method names equal the operation names (for example SendMessage); streaming uses Server-Sent Events (text/event-stream).
  • HTTP+JSON: resource-style paths such as POST /message:send and GET /tasks/{id}; streaming uses Server-Sent Events.
  • gRPC: service A2AService in package lf.a2a.v1; streaming uses server-streaming RPCs.
  • Tenant: when tenant is set on an interface, requests carry the same opaque value; do not use it as the only isolation control.

5. Capabilities and extensions

FieldValueNotes
capabilities.streamingExample: trueSendStreamingMessage and SubscribeToTask supported
capabilities.pushNotificationsExample: truePush notification config operations supported (section 11)
capabilities.extendedAgentCardExample: trueAuthenticated callers can fetch a richer card
capabilities.extensionsExample: one entrySee table below
Extension uridescriptionrequiredparams
Example: https://example.com/a2a/extensions/cost-estimate/v1Returns an estimated processing cost before work startsfalse{"currency": "EUR"}

Clients activate extensions per request with the A2A-Extensions header (a comma-separated list of extension URIs). If an extension is marked required: true, clients that do not support it receive ExtensionSupportRequiredError.

6. Skills

idnamedescriptiontagsinputModesoutputModesSkill securityRequirements
reconcile-invoice (Example)Reconcile invoiceMatches one invoice to its purchase order and receipts; returns matched lines and mismatchesinvoice, reconciliation, procurementapplication/pdf, application/jsonapplication/jsonoauth: invoices:reconcile
explain-mismatch (Example)Explain mismatchExplains in plain language why a line did not matchinvoice, explanationapplication/json, text/plaintext/plainoauth: invoices:read
batch-reconcile (Example)Batch reconciliationReconciles up to 500 invoices for a period and returns a report artifactbatch, reportapplication/jsonapplication/json, text/csvoauth: invoices:reconcile

Skill examples (the examples field):

  • reconcile-invoice: Example: "Reconcile invoice INV-2026-0042 from Example Office Supplies against PO-77120."
  • explain-mismatch: Example: "Why did line 3 of INV-2026-0042 not match?"
  • batch-reconcile: Example: "Reconcile all invoices received in September 2026 for supplier SUP-0193."

7. Security schemes and authentication

Scheme nameType (JSON key)Key settingsUsed for
oauth (Example)oauth2SecuritySchemeflows.clientCredentials with tokenUrl and scopes; oauth2MetadataUrl setAgent-to-agent calls
oidc (Example)openIdConnectSecuritySchemeopenIdConnectUrlCalls on behalf of a signed-in user
mtls (Example)mtlsSecuritySchemeClient certificate issued by [CA]Internal gRPC callers
ScopeGrants
invoices:read (Example)Read reconciliation results for the caller's tenant
invoices:reconcile (Example)Start reconciliation tasks for the caller's tenant

Authentication rules:

  • [Example: Access tokens must have this agent as audience and a lifetime of 15 minutes or less.]
  • [Example: The tenant is derived from the token, never from message content.]
  • [Example: GetExtendedAgentCard requires a valid token from a scheme in the public card; it returns the batch-reconcile skill only to callers with invoices:reconcile.]
  • [Example: When a task needs a credential the caller has not supplied, the task moves to TASK_STATE_AUTH_REQUIRED with a message explaining what is needed; the credential itself is obtained out of band.]

8. Supported operations

Operation (JSON-RPC method)HTTP+JSONSupportedLimits and notes
SendMessagePOST /message:sendExample: YesBlocking by default; returnImmediately: true returns at once
SendStreamingMessagePOST /message:streamExample: YesStream closes at a terminal state
GetTaskGET /tasks/{id}Example: YeshistoryLength honoured, maximum 50
ListTasksGET /tasksExample: YesCursor pagination; only the caller's tasks
CancelTaskPOST /tasks/{id}:cancelExample: YesBatch tasks cancel between invoices
SubscribeToTaskGET /tasks/{id}:subscribeExample: YesFirst event is the current Task
CreateTaskPushNotificationConfigPOST /tasks/{taskId}/pushNotificationConfigsExample: YesMaximum 3 configs per task
GetTaskPushNotificationConfigGET /tasks/{taskId}/pushNotificationConfigs/{id}Example: Yes
ListTaskPushNotificationConfigsGET /tasks/{taskId}/pushNotificationConfigsExample: Yes
DeleteTaskPushNotificationConfigDELETE /tasks/{taskId}/pushNotificationConfigs/{id}Example: Yes
GetExtendedAgentCardGET /extendedAgentCardExample: YesAuthentication required

Each HTTP+JSON path also has a tenant-prefixed form (for example /{tenant}/message:send in the specification's path templates) when an interface uses tenant.

8.1 Example request (JSON-RPC)

A client starts a reconciliation with a structured data part:

{
  "jsonrpc": "2.0",
  "id": "req-7",
  "method": "SendMessage",
  "params": {
    "message": {
      "messageId": "9f1c2e7a-4b1d-4c55-9a43-1d0f8e2b6c10",
      "role": "ROLE_USER",
      "parts": [
        {"text": "Reconcile this invoice against its purchase order."},
        {"data": {"invoiceId": "INV-2026-0042", "purchaseOrderId": "PO-77120"}, "mediaType": "application/json"}
      ]
    },
    "configuration": {"acceptedOutputModes": ["application/json"], "returnImmediately": true}
  }
}

9. Task lifecycle and states

StateKindWhen this agent uses itClient action
TASK_STATE_SUBMITTEDActiveExample: Task accepted and queuedWait, poll, stream or await push
TASK_STATE_WORKINGActiveExample: Matching in progressSame
TASK_STATE_INPUT_REQUIREDInterruptedExample: PO number missing or ambiguousSend a message with the same taskId
TASK_STATE_AUTH_REQUIREDInterruptedExample: Caller lacks a scope needed for a linked ERP lookupObtain authorization out of band, then continue
TASK_STATE_COMPLETEDTerminalExample: Report artifact producedRead artifacts
TASK_STATE_FAILEDTerminalExample: Unrecoverable processing errorRead status message; may retry with a new task
TASK_STATE_CANCELEDTerminalExample: Caller cancelledNone
TASK_STATE_REJECTEDTerminalExample: Request outside scope or policyRead reason; do not retry unchanged

The diagram drops the TASK_STATE_ prefix for readability. Direct Message replies (no task) are used for: [Example: explain-mismatch answers under 2 seconds]. Related tasks share a contextId; a follow-up may list earlier tasks in referenceTaskIds.

10. Messages, parts and artifacts

10.1 Accepted input parts

ContentPart fieldmediaTypeLimitsValidation
Instructions (Example)texttext/plain4,000 charactersTreated as data for the agent's model, not as system instructions
Invoice reference (Example)dataapplication/jsonSchema ReconcileRequest v1JSON Schema, unknown fields rejected
Invoice file (Example)rawapplication/pdf10 MBType sniffing, malware scan
Invoice file link (Example)urlapplication/pdfHTTPS onlyAllow-listed hosts; SSRF checks

10.2 Artifacts returned

namePartsDescriptionStreaming
reconciliation-report (Example)data (application/json)Matched lines, mismatches, totalsSent once at completion
batch-report (Example)data (application/json) plus raw (text/csv)Batch resultsChunks with append and lastChunk on TaskArtifactUpdateEvent

Artifact and message extensions lists name any extension URIs that contributed content. Do not place secrets or other tenants' data in metadata.

11. Streaming and push notifications

AspectDesign
Streaming eventstask, statusUpdate (TaskStatusUpdateEvent), artifactUpdate (TaskArtifactUpdateEvent), or message for direct replies
ResubscriptionSubscribeToTask on any non-terminal task; first event is the current Task
Push config fieldsurl (required), id, taskId, token, authentication (scheme, credentials)
Push deliveryExample: At least once; 15 s timeout; exponential backoff for 1 h; stop after 10 consecutive failures
Webhook validationExample: HTTPS only; reject private, loopback and link-local addresses after DNS resolution; per-tenant allow-list of domains
Webhook authenticationExample: Bearer token from authentication.credentials, plus the per-config token echoed for the receiver to check
Client duties (to document for callers)Return HTTP 2xx, process idempotently, check the task ID, verify the sender

12. Error handling

A2A errorJSON-RPC codeHTTPgRPCWhen this agent returns it
TaskNotFoundError-32001404NOT_FOUNDExample: Unknown task or task of another tenant
TaskNotCancelableError-32002400FAILED_PRECONDITIONExample: Task already terminal
PushNotificationNotSupportedError-32003400FAILED_PRECONDITIONOnly if pushNotifications is false
UnsupportedOperationError-32004400FAILED_PRECONDITIONExample: Message sent to a terminal task
ContentTypeNotSupportedError-32005400INVALID_ARGUMENTExample: Part media type not accepted by the skill
InvalidAgentResponseError-32006500INTERNALExample: Agent produced a response that failed validation
ExtendedAgentCardNotConfiguredError-32007400FAILED_PRECONDITIONOnly if declared but not configured
ExtensionSupportRequiredError-32008400FAILED_PRECONDITIONRequired extension not activated
VersionNotSupportedError-32009400FAILED_PRECONDITIONA2A-Version not served on the interface

Standard JSON-RPC errors (for example -32602 invalid params and -32603 internal error) are used for malformed requests. Map authentication failures to HTTP 401 and authorization failures to 403 on HTTP bindings.

13. Versioning, discovery and caching

13.1 Discovery

MethodDetail
Well-known URIhttps://[domain]/.well-known/agent-card.json returns the public card
Registry or catalogue[Example: Internal agent registry entry [ID]]
Direct configuration[Example: Partners receive the card URL in onboarding]
Extended cardGetExtendedAgentCard for authenticated callers

13.2 Versioning policy

  • Agent version follows semantic versioning: removing a skill, an interface or an accepted media type, or adding a required security requirement, is a major change.
  • New protocol versions are added as new supportedInterfaces entries before old ones are removed; old interfaces stay for [6] months.
  • Clients send A2A-Version: 1.0; requests for unsupported versions get VersionNotSupportedError.

13.3 Signing and caching

AspectDesign
Card signatureExample: JWS with ES256; protected header includes alg, kid and jku; payload is the card canonicalised with RFC 8785 after removing default-valued fields and the signatures field
Key publicationExample: JWKS at https://agent.example.com/.well-known/jwks.json; keys rotated yearly with overlap
Cache headersExample: Cache-Control: max-age=3600; ETag derived from version and content hash
Client guidanceHonour HTTP caching; revalidate with If-None-Match; verify at least one signature before trusting the card

14. Example Agent Card

The public card for the worked example, with one interface per binding and the security scheme wrapped by its type key:

{
  "name": "Invoice Reconciliation Agent",
  "description": "Matches supplier invoices to purchase orders and goods receipts and reports mismatches. Use it when an invoice must be checked before approval.",
  "supportedInterfaces": [
    {"url": "https://agent.example.com/a2a/v1", "protocolBinding": "JSONRPC", "protocolVersion": "1.0"},
    {"url": "https://agent.example.com/a2a/rest", "protocolBinding": "HTTP+JSON", "protocolVersion": "1.0"}
  ],
  "provider": {"organization": "Example Finance Services Ltd", "url": "https://www.example.com"},
  "version": "1.0.0",
  "documentationUrl": "https://docs.example.com/agents/invoice-recon",
  "capabilities": {"streaming": true, "pushNotifications": true, "extendedAgentCard": true},
  "securitySchemes": {
    "oauth": {
      "oauth2SecurityScheme": {
        "description": "Client credentials for partner agents",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://auth.example.com/oauth2/token",
            "scopes": {"invoices:read": "Read reconciliation results", "invoices:reconcile": "Start reconciliation tasks"}
          }
        },
        "oauth2MetadataUrl": "https://auth.example.com/.well-known/oauth-authorization-server"
      }
    }
  },
  "securityRequirements": [{"schemes": {"oauth": {"list": ["invoices:read"]}}}],
  "defaultInputModes": ["application/json", "text/plain", "application/pdf"],
  "defaultOutputModes": ["application/json", "text/plain"],
  "skills": [
    {
      "id": "reconcile-invoice",
      "name": "Reconcile invoice",
      "description": "Matches one invoice to its purchase order and receipts and returns matched lines and mismatches.",
      "tags": ["invoice", "reconciliation", "procurement"],
      "examples": ["Reconcile invoice INV-2026-0042 from Example Office Supplies against PO-77120."],
      "inputModes": ["application/pdf", "application/json"],
      "outputModes": ["application/json"],
      "securityRequirements": [{"schemes": {"oauth": {"list": ["invoices:reconcile"]}}}]
    },
    {
      "id": "explain-mismatch",
      "name": "Explain mismatch",
      "description": "Explains in plain language why an invoice line did not match.",
      "tags": ["invoice", "explanation"],
      "examples": ["Why did line 3 of INV-2026-0042 not match?"],
      "inputModes": ["application/json", "text/plain"],
      "outputModes": ["text/plain"]
    }
  ],
  "signatures": [
    {"protected": "[base64url JWS protected header]", "signature": "[base64url signature]"}
  ]
}

15. Security considerations

IDConcernControlTest
A2A-SEC-001Authorization on every operationCheck scope and tenant on each call, before any lookup that could reveal whether another tenant's task existsCross-tenant test suite
A2A-SEC-002Task enumerationUnguessable task IDs; ListTasks scoped to caller; TaskNotFoundError for other tenants' tasksFuzz task IDs
A2A-SEC-003Prompt injection through partsText and file content passed to the model as data; tools behind the agent follow the [Agent tool and permission design]Injection fixture set
A2A-SEC-004SSRF through url parts and webhooksHTTPS only; block private, loopback and link-local ranges after resolution; allow-listsSSRF test cases
A2A-SEC-005Card spoofing or tamperingSigned card, HTTPS, key rotation; clients told to pin and verifySignature verification test
A2A-SEC-006Sensitive data in the extended cardNo internal URLs or credentials in any cardCard review checklist
A2A-SEC-007Resource exhaustionSize limits per part, rate limits per client, cap on concurrent tasks per tenantLoad test
A2A-SEC-008Push credential leakagePer-config tokens treated as secrets, rotated, unique per configSecret scanning, review
A2A-SEC-009Logging of sensitive contentLog IDs, states and sizes, not part contents; mask tokensLog review
A2A-SEC-010Transport securityTLS 1.2 or later (prefer 1.3) on every interfaceTLS scan

16. Conformance checklist

IDCheckEvidenceDone
A2A-CONF-001Card served at /.well-known/agent-card.json with all required fields[Validation output][ ]
A2A-CONF-002Field names and enum values match the 1.0 JSON form exactly[Schema validation][ ]
A2A-CONF-003Each interface answers with its declared protocolBinding and protocolVersion[Integration test][ ]
A2A-CONF-004A2A-Version honoured; unsupported versions return VersionNotSupportedError[Test][ ]
A2A-CONF-005Declared capabilities implemented; undeclared ones return the matching error[Test][ ]
A2A-CONF-006Streams start with the Task and close at a terminal state[Test][ ]
A2A-CONF-007Messages to terminal tasks return UnsupportedOperationError[Test][ ]
A2A-CONF-008ListTasks returns only the caller's tasks, sorted by last update, with nextPageToken always present[Test][ ]
A2A-CONF-009Push notifications delivered at least once with configured authentication[Test][ ]
A2A-CONF-010GetExtendedAgentCard requires authentication[Test][ ]
A2A-CONF-011Card signature verifies with the published key[Test][ ]
A2A-CONF-012Cache headers present on the card endpoint[Test][ ]
A2A-CONF-013Security tests A2A-SEC-001 to A2A-SEC-010 pass[Report][ ]
A2A-CONF-014Interoperability run with at least [two] independent clients or SDKs[Report][ ]

17. Glossary and references

TermMeaning
A2A clientApplication or agent that sends requests to a remote agent
A2A server (remote agent)Agent that exposes an A2A endpoint and processes tasks
Agent CardJSON document describing an agent's identity, interfaces, skills, capabilities and security requirements
TaskStateful unit of work with an ID and a lifecycle
ContextIdentifier that groups related tasks and messages
PartSmallest unit of content: text, raw bytes, a URL or structured data
ArtifactOutput of a task, made of parts
Protocol bindingMapping of A2A operations onto a transport: JSON-RPC, gRPC or HTTP+JSON
Interrupted stateA non-terminal state waiting for the client: input required or authorization required

References:

Standard and licence note

Based on the Agent2Agent (A2A) Protocol Specification 1.0.1 and its a2a.proto definition, published by the A2A project under the Linux Foundation and licensed under Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0). Field, enum, operation and error names are reproduced exactly so that implementations interoperate; all explanatory text is original and requirements are summarised rather than quoted. The OWASP reference in section 15 is a citation only. Check a2a-protocol.org for the current release and the normative wording before implementing. Template licence: MIT.

Related templates