Problem
The spec describes tenant as "provided as a path parameter" in every operation definition (Section 3.1.x), but:
- Section 11.3 (REST URL patterns) does not include
/{tenant}/ in any URL template
- gRPC binding defines tenant as a request message field, not a path parameter
- JSON-RPC binding passes tenant in request params (body), not in the URL
The phrase "provided as a path parameter" appears to be REST-specific guidance that leaked into the binding-agnostic operation definitions, but even the REST binding section doesn't show it.
Proposed Clarification
After analysis, the correct transmission mechanism depends on the binding and HTTP method:
| Binding |
POST requests |
GET/DELETE requests |
| gRPC |
Request message field |
N/A (all unary/streaming RPCs) |
| JSON-RPC |
Request params field (body) |
N/A (all POST) |
| HTTP+JSON |
Request body field |
Path segment after Agent URL |
Key Insight: What Tenant Means
- Agent URL = points to a service endpoint for the agent
- Tenant = scopes to a specific data/config partition (agent instance) within that deployment
- Tenant is NOT part of the Agent URL it's an instance identifier
For gRPC, tenant is essential because gRPC URLs don't support paths so tenant is the only way to distinguish multiple agents on the same host. For HTTP+JSON and JSON-RPC, different agents can use different URL paths, but tenant is still useful when a single Agent service URL serves multiple logical agent instances with different data/config.
Suggested Changes
-
Remove "provided as a path parameter" from the binding-agnostic operation definitions (Section 3.1.x) or replace with "transmission mechanism is binding-specific"
-
REST binding (Section 11.3) clarify:
- POST endpoints: tenant goes in the JSON request body (
"tenant": "xyz")
- GET/DELETE endpoints: tenant is an optional path segment prefix:
GET /{tenant}/tasks/{id} vs GET /tasks/{id}
- Show both tenanted and non-tenanted URL templates
-
JSON-RPC binding (Section 9) note that tenant is a standard field in request params
-
gRPC binding (Section 10) already correct (tenant is a message field)
Impact on SDKs
SDK implementations currently handle tenant inconsistently because the spec is ambiguous. Clarifying this will help all SDKs implement tenant correctly. The .NET SDK (a2a-dotnet) has tenant properties on all request types but no plumbing to actually use them.
Problem
The spec describes
tenantas "provided as a path parameter" in every operation definition (Section 3.1.x), but:/{tenant}/in any URL templateThe phrase "provided as a path parameter" appears to be REST-specific guidance that leaked into the binding-agnostic operation definitions, but even the REST binding section doesn't show it.
Proposed Clarification
After analysis, the correct transmission mechanism depends on the binding and HTTP method:
Key Insight: What Tenant Means
For gRPC, tenant is essential because gRPC URLs don't support paths so tenant is the only way to distinguish multiple agents on the same host. For HTTP+JSON and JSON-RPC, different agents can use different URL paths, but tenant is still useful when a single Agent service URL serves multiple logical agent instances with different data/config.
Suggested Changes
Remove "provided as a path parameter" from the binding-agnostic operation definitions (Section 3.1.x) or replace with "transmission mechanism is binding-specific"
REST binding (Section 11.3) clarify:
"tenant": "xyz")GET /{tenant}/tasks/{id}vsGET /tasks/{id}JSON-RPC binding (Section 9) note that tenant is a standard field in request params
gRPC binding (Section 10) already correct (tenant is a message field)
Impact on SDKs
SDK implementations currently handle tenant inconsistently because the spec is ambiguous. Clarifying this will help all SDKs implement tenant correctly. The .NET SDK (a2a-dotnet) has tenant properties on all request types but no plumbing to actually use them.