-
As stated below: https://google.github.io/A2A/#/documentation?id=agent-card Currently, I understand the specification maps a single agent to a single host (base URL). However, there may be cases where a host serves as a routing environment for multiple agents, mapping them to different paths under the same base URL.
could return a list of |
Beta Was this translation helpful? Give feedback.
Replies: 20 comments 38 replies
-
This is very much needed. We should expect a single domain to host multiple agents. |
Beta Was this translation helpful? Give feedback.
-
https://github.com/IhateCreatingUserNames2/Aira "AIRA (Agent Interoperability and Resource Access) enables AI agents built with different frameworks to discover and communicate with each other using a standardized protocol. It bridges the gap between the Agent-to-Agent (A2A) protocol and the Model Context Protocol (MCP) to create a unified ecosystem where AI tools and resources can be shared across different agent implementations." This can work for this. Its a concept of a A2A network, where Agents can Connect and Share Tools... |
Beta Was this translation helpful? Give feedback.
-
Thanks for starting the thread. Currently if you like more than one agent to be available for open discovery on the same host url, the agent card should be available at a different path per agent or they have to be available via a different port. If don't require open discovery for the agent, you can expose the agent card at any url and have the A2AClient read from the custom url. As documented in Agent Discovery topic, we think enterprises scenarios may require an agent to fetch a list of entitled agents via a registry. We are looking to provide more clarity on this requirement in the next revision of the spec. If you have any recommendations or suggestions, please feel free to share with us. |
Beta Was this translation helpful? Give feedback.
-
After reviewing the current Instead of relying solely on the agent card being hosted at {
"agents": [
{
"path": "/path/to/agent",
"description": "Does something."
},
{
"path": "/another/agent",
"description": "Does something else."
}
]
} As for the path structure, I also want to share a few REST-aligned patterns we might consider:
While (2) and (3) are more REST-idiomatic, I feel (1) is simple and intuitive in practice, especially when the agent is already addressable via Would love to hear your thoughts on separating discovery from |
Beta Was this translation helpful? Give feedback.
-
In this proposal, I suggest structuring the
The
This approach keeps the system simple for open discovery while allowing flexibility for more complex scenarios requiring role-based access control: {
"title": "AgentIndex",
"type": "object",
"description": "Represents a list of agents discoverable under this base URL or via a registry.",
"properties": {
"agents": {
"type": "array",
"description": "List of publicly available agents for Open Discovery.",
"items": {
"$ref": "#/$defs/AgentEntry"
}
},
"registry_url": {
"type": "string",
"description": "URL for accessing the agent catalog and entitlement-based discovery via a registry."
}
},
"oneOf": [
{
"required": ["agents"]
},
{
"required": ["registry_url"]
}
],
"$defs": {
"AgentEntry": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Relative path to the agent metadata (e.g. /path/to/agent/agent.json)"
},
"description": {
"type": "string",
"description": "Human-readable summary of what the agent does."
},
"title": {
"type": "string",
"description": "Short name or title for the agent."
}
},
"required": ["path", "title"]
}
}
} |
Beta Was this translation helpful? Give feedback.
-
It would be helpful to get some feedback from the project maintainers 🤔 @kthota-g |
Beta Was this translation helpful? Give feedback.
-
I was implementing multiple agents for a single server but didn't complete it, you can check here for the idea: A2A-Server-Management |
Beta Was this translation helpful? Give feedback.
-
FYI, .well-known does not allow path segments before the .well-known segment https://datatracker.ietf.org/doc/html/rfc5785#section-3 So, if .well-known is to be used then it really needs to be a list of agents in the file, or you could leverage the "very nearly published" api-catalog well-known endpoint to point to agent cards. https://www.ietf.org/archive/id/draft-ietf-httpapi-api-catalog-08.html |
Beta Was this translation helpful? Give feedback.
-
I implemented a PoC for an Open Discovery API Catalog schema based on the draft specification shared by @darrelmiller. Key points include:
{
"title": "AgentCatalog",
"type": "object",
"description": "Represents a list of agents discoverable under this base URL following the Linkset format.",
"properties": {
"linkset": {
"type": "array",
"description": "Linkset structure describing agent discovery entries.",
"items": {
"$ref": "#/$defs/AgentLinkContext"
}
}
},
"required": ["linkset"],
"$defs": {
"AgentLinkContext": {
"type": "object",
"properties": {
"anchor": {
"type": "string",
"format": "uri",
"description": "Specifies the absolute URI reference that points to an agent endpoint."
},
"links": {
"type": "array",
"description": "List of links associated with the anchor, each describing a discoverable agent card.",
"items": {
"$ref": "#/$defs/AgentLinkTarget"
}
}
},
"required": ["anchor", "links"]
},
"AgentLinkTarget": {
"type": "object",
"properties": {
"href": {
"type": "string",
"format": "uri",
"description": "Absolute URI reference to the agent card endpoint."
},
"type": {
"type": "string",
"enum": ["application/json"],
"description": "The media type of the linked resource. Must be 'application/json'."
},
"rel": {
"type": "string",
"enum": ["agent-card"],
"description": "The relation type of the linked resource. Must be 'agent-card'."
},
"name": {
"type": "string",
"description": "Human-readable name for the agent."
},
"description": {
"type": "string",
"description": "Short description of what this agent does."
}
},
"required": ["href", "type", "rel"]
}
}
} For example, if {
"linkset": [
{
"anchor": "https://example.org/agents/agent1/",
"links": [
{
"href": "https://example.org/agents/agent1/agent.json",
"type": "application/json",
"rel": "agent-card"
}
]
},
{
"anchor": "https://example.org/agents/agent2/",
"links": [
{
"href": "https://example.org/agents/agent2/agent.json",
"type": "application/json",
"rel": "agent-card"
}
]
}
]
} If the community finds either the |
Beta Was this translation helpful? Give feedback.
-
This is super cool
…On Tue, May 20, 2025 at 7:20 AM cdavernas ***@***.***> wrote:
Awesome! I love it!
—
Reply to this email directly, view it on GitHub
<#166 (reply in thread)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AGF4WHNJWM65DFVB7AS5L3327MFYRAVCNFSM6AAAAAB3EG5G26VHI2DSMVQWIX3LMV43URDJONRXK43TNFXW4Q3PNVWWK3TUHMYTGMRQGU3DQMA>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
Beta Was this translation helpful? Give feedback.
-
Thanks everyone for the comments!
|
Beta Was this translation helpful? Give feedback.
-
FYI: |
Beta Was this translation helpful? Give feedback.
-
another approach with multiple agents card from same server based on user permissions and RBAC, live demo you can test directly here |
Beta Was this translation helpful? Give feedback.
-
Regarding the following PR: I’ve removed the WIP status from this PR due to changes in the repository structure. The related SDK implementation will continue in |
Beta Was this translation helpful? Give feedback.
-
Hey @darrelmiller, I have a question regarding the use of extension target attributes in RFC 9264. In a JSON Linkset like this: {
"linkset": [
{
"anchor": "https://example.org/agents/agent1",
"describedby": [
{
"href": "https://example.org/agents/agent1/agent.json",
"type": "application/json",
"title": "Agent Card for Agent 1"
}
]
}
]
} I'd like to add a custom boolean indicator that tells consumers whether the target document is an extended version of the AgentCard. Based on Section 4.2.4.3, I’m planning to use an extension target attribute like this: "extended": ["true"] I understand that:
Is this a valid and interoperable way to represent a custom boolean flag using extension attributes in a link target object? Appreciate any feedback or clarification on this usage! |
Beta Was this translation helpful? Give feedback.
-
PoC: SDK Example for Agent Mounting and API Catalog DiscoveryI’ve implemented a proof-of-concept SDK that demonstrates how to define and mount multiple A2A agents using {
"linkset": [
{
"anchor": "http://localhost:9999/a2a/hello/",
"describedby": [
{
"href": "http://localhost:9999/a2a/hello/agent.json",
"type": "application/json"
}
]
},
{
"anchor": "http://localhost:9999/a2a/echo/",
"describedby": [
{
"href": "http://localhost:9999/a2a/echo/agent.json",
"type": "application/json"
}
]
}
]
} Minimal Example Code@click.command()
@click.option('--host', default='localhost')
@click.option('--port', default=9999)
def main(host: str, port: int):
hello_skill = AgentSkill(
id='hello_world',
name='Returns hello world',
description='just returns hello world',
tags=['hello world'],
examples=['hi', 'hello world'],
)
hello_card = AgentCard(
name='Hello World Agent',
description='Just a hello world agent',
url=f'http://{host}:{port}/a2a/hello',
version='1.0.0',
defaultInputModes=['text'],
defaultOutputModes=['text'],
capabilities=AgentCapabilities(streaming=True),
skills=[hello_skill],
supportsAuthenticatedExtendedCard=False,
)
hello_handler = DefaultRequestHandler(
agent_executor=HelloWorldAgentExecutor(),
task_store=InMemoryTaskStore(),
)
hello_agent = A2AStarletteRouteBuilder(
agent_card=hello_card,
http_handler=hello_handler,
)
echo_skill = AgentSkill(
id="echo",
name="Echo input",
description="Returns the input text as is",
tags=["echo"],
examples=["Hello!", "Repeat after me"],
)
echo_card = AgentCard(
name="Echo Agent",
description="An agent that echoes back your input.",
url=f"http://{host}:{port}/a2a/echo",
version="1.0.0",
defaultInputModes=["text"],
defaultOutputModes=["text"],
capabilities=AgentCapabilities(streaming=True),
skills=[echo_skill],
supportsAuthenticatedExtendedCard=False,
)
echo_handler = DefaultRequestHandler(
agent_executor=EchoAgentExecutor(),
task_store=InMemoryTaskStore(),
)
echo_agent = A2AStarletteRouteBuilder(
agent_card=echo_card,
http_handler=echo_handler,
)
server = (
A2AStarletteBuilder()
.mount(hello_agent)
.mount(echo_agent)
.build()
)
uvicorn.run(server, host=host, port=port)
if __name__ == "__main__":
try:
main()
except Exception:
print(traceback.format_exc(), file=sys.stderr) This can serve as a practical SDK example when reviewing the following PR:
The following is the related PoC implementation of the SDK:
|
Beta Was this translation helpful? Give feedback.
-
In the current implementation, each A2A server publishes it's own Agent Card describing it's capabilities. A standalone A2AServer may not know the presence of other servers or agent cards and so they won't be publishers of such catalog. For example: Let's assume an enterprise that has two agents: 1) IT Agent, 2) HR Agent. Each agent may be hosted separately, offers different set of capabilities and each publish their own agent card. These published agent cards could be part of an Agent catalog hosted by another service (let's call it registry). If there is an orchestrator agent that can call these agents, it can be a consumer of the Agent Catalog to discover these agents and then use the provided Agent Card to invoke the agents. The Agent catalog can have entitlement mechanism to return the list of agents available for a given consumer. There is usefulness for Agent Catalog, but we think exposing an agent catalog is not the responsibility of an A2AServer, it should rather be available via a separate service that enables agent discovery. |
Beta Was this translation helpful? Give feedback.
-
Regarding the ongoing discussion about supporting multiple agents under a single host, I have come to consider that, even within the current "one host, one agent" model, similar functionality might be achieved by equipping a single agent with multiple skills. However, this approach may introduce challenges related to skill routing within that agent. Since this topic is closely related to the current discussion, I am adding a link to the discussion for cross-reference. |
Beta Was this translation helpful? Give feedback.
-
SEE ALSO: #943 |
Beta Was this translation helpful? Give feedback.
-
Hi @kthota-g , is there any conclusion directions from the authors of the protocol on how the agent's base url in the agent card could be for orchestrator platforms that could potentially host many agents under a single base url. this is a real world scenario & I'd like some direction, thanks. |
Beta Was this translation helpful? Give feedback.
Thanks for starting the thread. Currently if you like more than one agent to be available for open discovery on the same host url, the agent card should be available at a different path per agent or they have to be available via a different port. If don't require open discovery for the agent, you can expose the agent card at any url and have the A2AClient read from the custom url.
As documented in Agent Discovery topic, we think enterprises scenarios may require an agent to fetch a list of entitled agents via a registry.
We are looking to provide more clarity on this requirement in the next revision of the spec. If you have any recommendations or suggestions, please feel free to share wit…