The Agent2Agent protocol add-on mounted alongside the native contract.
A2A is a standardized protocol for agent-to-agent delegation. It gives an upstream agent a task-oriented interface for discovering this agent, sending it work, streaming basic progress, retrieving a known task, and canceling that task.
This implementation is intentionally foundational. It supports the core communication loop, not the entire A2A specification.
Enable it in your manifest:
http_server {
protocol {
a2a {}
}
}The default base path is /a2a. You can change the base path:
protocol {
a2a {
path = "/custom-path"
}
}With a custom base path, the endpoints below are served under <path>.
The A2A add-on is a protocol adapter over the same service layer as the native HTTP API.
| A2A concept | agentc concept |
|---|---|
| Task | Run |
| Context | Session |
| Message | User message input |
| Text part | User text content |
| Data part | Structured input context |
| Task status | Run status |
| Artifact | Assistant output or structured final state |
/a2a/.well-known/agent-card.jsonReturns the Agent Card describing this A2A service.
The URL where this A2A interface is served.
The transport binding for the interface.
The A2A protocol version advertised by this interface.
/a2a/message:sendSends a message to the agent and waits for the resulting task or message response.
Optional tenant ID. If omitted, the configured default tenant ID is used.
The message to send to the agent.
Optional A2A send-message configuration.
Optional request metadata.
Client-provided message ID.
Optional context ID. In agentc, this maps to the session ID.
Optional task ID. In agentc, this maps to the run ID.
The sender role.
ROLE_USERROLE_AGENTROLE_UNSPECIFIEDMessage content parts.
Optional message metadata.
A text content part.
A structured JSON content part.
Optional filename metadata.
Optional media type metadata.
Optional part metadata.
For the first implementation, text and data parts are supported. raw and url parts are not
supported yet.
curl -X POST http://localhost:8080/a2a/message:send \
-H "Content-Type: application/json" \
-d '{
"message": {
"messageId": "msg-1",
"role": "ROLE_USER",
"parts": [
{ "text": "Return a short greeting." }
]
}
}'The task ID. In agentc, this is the run ID.
The context ID. In agentc, this is the session ID.
The current task status.
Artifacts produced by the task.
Optional task message history.
Optional task metadata.
The current task lifecycle state.
TASK_STATE_SUBMITTEDTASK_STATE_WORKINGTASK_STATE_COMPLETEDTASK_STATE_FAILEDTASK_STATE_CANCELEDTASK_STATE_INPUT_REQUIREDTASK_STATE_REJECTEDTASK_STATE_AUTH_REQUIREDTASK_STATE_UNSPECIFIEDOptional status message.
Optional timestamp for the status.
The artifact ID.
Human-readable artifact name.
Optional artifact description.
Artifact content parts.
Optional artifact metadata.
/a2a/message:streamSends a message to the agent and streams task updates using Server-Sent Events.
Optional tenant ID. If omitted, the configured default tenant ID is used.
The message to send to the agent.
Optional A2A send-message configuration.
Optional request metadata.
The task ID.
The context ID.
The updated task status.
Optional update metadata.
The task ID.
The context ID.
The artifact update.
Whether the artifact content should be appended.
Whether this is the final chunk for the artifact.
Optional update metadata.
The response is a Server-Sent Events stream. Each event contains a JSON data payload.
data: {"task":{"id":"...","contextId":"...","status":{"state":"TASK_STATE_SUBMITTED"}}}
data: {"statusUpdate":{"taskId":"...","contextId":"...","status":{"state":"TASK_STATE_WORKING"}}}
data: {"artifactUpdate":{"taskId":"...","contextId":"...","artifact":{"artifactId":"response","name":"Agent Response","parts":[{"text":"Hello"}]},"append":true,"lastChunk":false}}
data: {"statusUpdate":{"taskId":"...","contextId":"...","status":{"state":"TASK_STATE_COMPLETED"}}}/a2a/tasks/{id}Retrieves the current state of a known A2A task.
The task ID.
Optional tenant ID. If omitted, the configured default tenant ID is used.
/a2a/tasks/{id}:cancelCancels an active A2A task.
The task ID.
Optional tenant ID. If omitted, the configured default tenant ID is used.
The current A2A add-on supports:
Agent Card discovery
Message send
Message streaming over SSE
Known task retrieval
Known task cancellation
Text input parts
Structured JSON data input parts
Text artifacts and structured `state` artifactsIt does not currently support task listing, push notifications, raw binary parts, URL parts, or the full A2A extension surface.
This page documents inbound A2A serving. To configure this agent to call other A2A servers as tools, see Connect agents via A2A.
© 2026 pogue.dev. All rights reserved.
CC BY 4.0Search the agentc documentation