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.
Exposing an agent (inbound)
Section titled “Exposing an agent (inbound)”Open the agent’s A2A tab:
- Turn on Expose over A2A (off by default).
- 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
- Review the advertised skills — exactly what callers see, derived from the agent’s
template.yaml. - Optionally restrict callers with an inbound allow-list of account emails.
Exposure is an owner/admin, human-only action.
Calling an exposed agent
Section titled “Calling an exposed agent”External callers authenticate with an ExoHuman MCP API key and speak JSON-RPC 2.0 at POST /a2a/{agent}:
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"}]}}}'| Method | Purpose |
|---|---|
message/send | Send a task; waits up to 25 seconds |
message/stream | Send and stream progress |
tasks/get | Poll a task by id |
tasks/cancel | Cancel a task |
A turn longer than 25 seconds returns early with state working and a task id — poll tasks/get rather than re-sending.
Calling external agents (outbound)
Section titled “Calling external agents (outbound)”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.
ExoHuman to ExoHuman
Section titled “ExoHuman to ExoHuman”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.