A2A interface works with the AgentOS runtime to provide this functionality.
Setup
Seta2a_interface=True when creating an AgentOS instance:
a2a_agentos.py
RemoteAgent, RemoteTeam, RemoteWorkflow) are excluded from this default.
Specific agents, teams, and workflows can be exposed by initializing the interface explicitly:
a2a_interface_initialization.py
A2A Endpoints
For each available agent, team and workflow, the following A2A-compatible endpoints will be available:Agents
-
/a2a/agents/{id}/.well-known/agent-card.json: Returns the Agent Card describing the agent in A2A format. See API reference. -
/a2a/agents/{id}/v1/message:stream: Runs the agent, streaming the responses as events in A2A format. See API reference and A2A protocol docs. -
/a2a/agents/{id}/v1/message:send: Runs the agent, returning the response in A2A format (non-streaming). See A2A protocol docs.
Teams
-
/a2a/teams/{id}/.well-known/agent-card.json: Returns the Team Card describing the Team in A2A format. See API reference. -
/a2a/teams/{id}/v1/message:stream: Runs the team, streaming the responses as events in A2A format. See API reference and A2A protocol docs. -
/a2a/teams/{id}/v1/message:send: Runs the team, returning the response in A2A format (non-streaming). See API reference.
Workflows
-
/a2a/workflows/{id}/.well-known/agent-card.json: Returns the Workflow Card describing the Workflow in A2A format. See API reference. -
/a2a/workflows/{id}/v1/message:stream: Runs the workflow, streaming the responses as events in A2A format. See API reference and A2A protocol docs. -
/a2a/workflows/{id}/v1/message:send: Runs the workflow, returning the response in A2A format (non-streaming). See API reference.
A2A clients expect a server to expose only a single agent.
To use your Agno A2A interface with those clients, use
/a2a/agents/{id}/ (or /a2a/teams/{id}/, /a2a/workflows/{id}/) as the base URL.Authorization
With authorization enabled, A2A routes sit behind the same JWT verification and scope checks as the REST API. Send the token asAuthorization: Bearer <token>.
Per-resource scopes apply through the A2A prefix: a token with
agents:my-agent:run can call POST /a2a/agents/my-agent/v1/message:send. The deprecated /a2a/message/send and /a2a/message/stream dispatch routes require agents:run at the route, then re-check the run scope for the resolved target’s type (agents:run, teams:run, or workflows:run) before running it. See Scopes for the full route-to-scope mapping.
Run identity
For anonymous callers, theX-User-ID header and the userId field in params.message.metadata attribute the run to a user. Authenticated callers are pinned to their token’s principal, and any client-supplied identity is ignored. Anonymous callers cannot claim reserved principals (sa:*, __scheduler__).
Task ownership
tasks:get requires contextId (the session the run belongs to) and returns 400 without it. For callers scoped to a user (a service account, or a JWT user under user isolation), tasks:get and tasks:cancel verify that the task belongs to that user in that session. tasks:cancel also requires contextId for these callers.