Problem Statement
The specification currently lacks clear guidance on how multi-tenancy should be handled in A2A, particularly regarding the tenant field in Agent Cards. This has led to confusion about:
- Whether Agent Cards should list multiple
AgentInterface entries for different tenants
- How the
tenant field should be used across different protocol bindings (gRPC vs HTTP+JSONRPC)
- The distinction between multi-tenancy (same agent, different data/permissions) and multi-hosting (different agents on the same host)
Background
The tenant field was introduced to accommodate protocol-specific requirements, particularly gRPC's URL structure limitations. However, its purpose and usage patterns need clearer documentation.
Key Confusion Points
-
Agent Card Structure: Should a public Agent Card contain multiple AgentInterface entries for different tenants? This seems problematic because:
- The preferred protocol binding is at index 0, which would incorrectly suggest the Agent has a preference over which tenant the client should use
- Agent Cards shouldn't be used for tenant discovery
-
Protocol Binding Differences:
- For HTTP/JSONRPC: Clients expect to get the root path and append
/<tenant>/<operation>
- For gRPC: Clients need to add the tenant into the operation call
- The
tenant field in gRPC supportedInterfaces is essentially breaking down the URL into two pieces due to gRPC's design
-
Multi-tenancy vs Multi-hosting:
- Multi-tenancy: Same agent hosted in different tenants with access to different data or permission rights
- Multi-hosting: Completely different agents living on the same host
- Are we solving both with the same field?
Proposed Clarifications
The specification should include:
-
Clear Definition: A paragraph explaining that:
- Multi-tenancy is a first-class supported concept in A2A
- The
tenant field serves both multi-tenancy and multi-hosting scenarios
- From a client perspective, these are treated the same way (separate agents)
-
Agent Card Guidelines:
- One Agent Card should represent one specific agent instance (including tenant context)
- Agent Cards should NOT list multiple interfaces for different tenants
- For agents that support multiple tenants, each tenant should have its own Agent Card
-
Protocol-Specific Handling:
- Document how each protocol binding should handle the tenant field
- Consider whether
tenant should be an explicit optional property in supportedInterfaces rather than buried in protocolParameters
Example Structure Discussion
Current consideration for representing tenant information:
{
"supportedInterfaces": [{
"url": "https://service.acme.org:8102",
"protocolBinding": "GRPC",
"tenant": "/project/123/agent/345"
},
{
"url": "https://service.acme.org/project/123/agent/345",
"protocolBinding": "HTTP+JSON"
}
]
}
Alternative with protocol parameters:
{
"supportedInterfaces": [{
"url": "https://service.acme.org:8102",
"protocolBinding": "GRPC",
"protocolParameters": {
"tenant": "/project/123/agent/345"
}
},
{
"url": "https://service.acme.org/project/123/agent/345",
"protocolBinding": "HTTP+JSON"
}
]
}
Recommendation
If multi-tenancy is acknowledged as a first-class supported concept in A2A, the tenant field should live as an optional property directly in supportedInterfaces rather than being buried in a map of protocolParameters.
Acceptance Criteria
References
Related discussion from team conversation on December 4, 2025. https://discord.com/channels/1362108044737253548/1362204426365833347/1446152799376248922
Problem Statement
The specification currently lacks clear guidance on how multi-tenancy should be handled in A2A, particularly regarding the
tenantfield in Agent Cards. This has led to confusion about:AgentInterfaceentries for different tenantstenantfield should be used across different protocol bindings (gRPC vs HTTP+JSONRPC)Background
The
tenantfield was introduced to accommodate protocol-specific requirements, particularly gRPC's URL structure limitations. However, its purpose and usage patterns need clearer documentation.Key Confusion Points
Agent Card Structure: Should a public Agent Card contain multiple
AgentInterfaceentries for different tenants? This seems problematic because:Protocol Binding Differences:
/<tenant>/<operation>tenantfield in gRPCsupportedInterfacesis essentially breaking down the URL into two pieces due to gRPC's designMulti-tenancy vs Multi-hosting:
Proposed Clarifications
The specification should include:
Clear Definition: A paragraph explaining that:
tenantfield serves both multi-tenancy and multi-hosting scenariosAgent Card Guidelines:
Protocol-Specific Handling:
tenantshould be an explicit optional property insupportedInterfacesrather than buried inprotocolParametersExample Structure Discussion
Current consideration for representing tenant information:
{ "supportedInterfaces": [{ "url": "https://service.acme.org:8102", "protocolBinding": "GRPC", "tenant": "/project/123/agent/345" }, { "url": "https://service.acme.org/project/123/agent/345", "protocolBinding": "HTTP+JSON" } ] }Alternative with protocol parameters:
{ "supportedInterfaces": [{ "url": "https://service.acme.org:8102", "protocolBinding": "GRPC", "protocolParameters": { "tenant": "/project/123/agent/345" } }, { "url": "https://service.acme.org/project/123/agent/345", "protocolBinding": "HTTP+JSON" } ] }Recommendation
If multi-tenancy is acknowledged as a first-class supported concept in A2A, the
tenantfield should live as an optional property directly insupportedInterfacesrather than being buried in a map ofprotocolParameters.Acceptance Criteria
References
Related discussion from team conversation on December 4, 2025. https://discord.com/channels/1362108044737253548/1362204426365833347/1446152799376248922