Skip to content

fix(spec): Add clarification about multi-tenancy support and tenant field usage in Agent Cards #1273

@darrelmiller

Description

@darrelmiller

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:

  1. Whether Agent Cards should list multiple AgentInterface entries for different tenants
  2. How the tenant field should be used across different protocol bindings (gRPC vs HTTP+JSONRPC)
  3. 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

  1. 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
  2. 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
  3. 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:

  1. 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)
  2. 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
  3. 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

  • Add a dedicated section or paragraph in the specification explaining multi-tenancy support
  • Clarify the distinction between multi-tenancy and multi-hosting
  • Document how clients should handle tenant fields across different protocol bindings
  • Provide clear guidance on Agent Card structure for multi-tenant scenarios
  • Decide on the final structure for representing tenant information (direct field vs protocolParameters)

References

Related discussion from team conversation on December 4, 2025. https://discord.com/channels/1362108044737253548/1362204426365833347/1446152799376248922

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions