Skip to content

A2A federation

ExoHuman supports the open Agent-to-Agent (A2A) protocol in both directions: external orchestrators can task your agents, and your agents can task agents running elsewhere — another ExoHuman instance, or any A2A-compatible agent framework.

A2A is an instance module. When it is off, the A2A tab is hidden and the public routes answer 404.

Open the agent’s A2A tab:

  1. Turn on Expose over A2A (off by default).
  2. Copy the Agent Card URL and give it to whoever wires up the external orchestrator:
    https://acme.exohuman.cc/a2a/market-scout/.well-known/agent-card.json
  3. Review the advertised skills — exactly what callers see, derived from the agent’s template.yaml.
  4. Optionally restrict callers with an inbound allow-list of account emails.

Exposure is an owner/admin, human-only action.

External callers authenticate with an ExoHuman MCP API key and speak JSON-RPC 2.0 at POST /a2a/{agent}:

Terminal window
curl -X POST https://acme.exohuman.cc/a2a/market-scout \
-H "Authorization: Bearer exohuman_mcp_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"message/send",
"params":{"message":{"role":"user","messageId":"m1",
"parts":[{"kind":"text","text":"Summarise competitor news this week"}]}}}'
MethodPurpose
message/sendSend a task; waits up to 25 seconds
message/streamSend and stream progress
tasks/getPoll a task by id
tasks/cancelCancel a task

A turn longer than 25 seconds returns early with state working and a task id — poll tasks/get rather than re-sending.

Outbound calls are off by default. An administrator enables Allow outbound A2A calls in Settings → Integrations → Other instances and registers each endpoint by name, with any credential it needs — up to 50 endpoints. URLs are validated on registration and on every call.

Agents can never supply a URL — they choose a registered endpoint by name, which keeps prompt injection from redirecting calls:

call_a2a_agent(agent_name="market-scout", endpoint="research-partner",
message="Summarise the latest findings on X", dedup_label="step-1")

If the remote answers working, poll with get_a2a_task. A timeout reports possibly_delivered — check before retrying.

Between two ExoHuman instances you can use an MCP key issued by the remote instance, or signed agent identity: each admin enables Sign and accept agent-to-agent calls in Settings → Integrations → Other instances and the receiving agent lists the caller’s identity (aauth:<agent>@<host>) in its inbound allow-list — no shared secret needed.