Skip to main content
For how A2A fits next to MCP at runtime, see A2A transport. Each agent is exposed behind its own route prefix:
/agent/{agentName}
So a support agent gets:
  • GET /agent/support/.well-known/agent-card.json
  • POST /agent/support

What the endpoint serves

The A2A mount provides a stateful agent contract over one JSON-RPC endpoint:
  • agent discovery via the public card
  • request/response execution
  • SSE streaming
  • task retrieval, cancellation, and resubscription
  • push-notification config operations

Endpoint reference

EndpointMethod(s)Purpose
/agent/{agentName}/.well-known/agent-card.jsonGETReturn the public A2A agent card.
/agent/{agentName}POSTServe A2A v1 JSON-RPC methods.

Supported JSON-RPC methods

  • SendMessage
  • SendStreamingMessage
  • GetTask
  • ListTasks
  • CancelTask
  • SubscribeToTask
  • GetTaskPushNotificationConfig
  • ListTaskPushNotificationConfigs
  • CreateTaskPushNotificationConfig
  • DeleteTaskPushNotificationConfig
  • GetExtendedAgentCard

Request body contract

SendMessage and SendStreamingMessage use this shape:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "SendMessage",
  "params": {
    "message": {
      "role": "user",
      "parts": [{ "text": "Find pending orders" }]
    }
  }
}
Streaming uses the same payload but changes method to SendStreamingMessage.
  1. GET /agent/{agentName}/.well-known/agent-card.json
  2. POST /agent/{agentName} with SendMessage or SendStreamingMessage
  3. If you receive a task result, use GetTask for later polling
  4. Use SubscribeToTask for SSE replay of task events
Continuity is task-based: use task IDs to poll, stream, or resume work across turns.

Request examples

SendMessage

curl -s -X POST http://localhost:8080/agent/support \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "SendMessage",
    "params": {
      "message": {
        "role": "user",
        "parts": [{ "text": "Find all pending orders from today" }]
      }
    }
  }' | jq

SendStreamingMessage

curl -N -X POST http://localhost:8080/agent/support \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "SendStreamingMessage",
    "params": {
      "message": {
        "role": "user",
        "parts": [{ "text": "Summarize pending orders in 3 bullets" }]
      }
    }
  }'

GetTask

curl -s -X POST http://localhost:8080/agent/support \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "GetTask",
    "params": { "id": "<task-id>" }
  }' | jq

SubscribeToTask

curl -N -X POST http://localhost:8080/agent/support \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 4,
    "method": "SubscribeToTask",
    "params": { "id": "<task-id>" }
  }'

Operational notes

  • SendMessage can return a task-shaped result when execution is stateful.
  • Tool permissions follow the allowlist in each agent’s config.
  • On model reload, agent routes match your latest declarations.
  • CORS headers are set on agent routes for browser-friendly access.

Troubleshooting

If tool invocation is unexpectedly blocked, check the agent’s tool_access policy and root defaults in .hyperterse.
Next: configure providers in Model providers and tune permission policy in Tool access.