Summary
A publisher (or any AdCP operator) running a multi-agent topology — sales agent at /sales, signals at /signals, governance at /governance, creative at /creative, etc. — has no standard way to advertise which tenants are live, what each tenant's URL is, and which specialisms each tenant claims. Buyers and conformance runners (e.g., adcp-client PR #1355 which adds per-specialism routing) have to learn the topology out-of-band: a Notion page, a CSV, or hardcoded lists in the runner.
The prod test-agent demonstrates the problem precisely: six tenants live at https://test-agent.adcontextprotocol.org/{sales,signals,governance,creative,creative-builder,brand}/mcp, but the only way to learn that list today is to read adcontextprotocol/adcp:server/src/training-agent/index.ts TENANT_IDS. There's no machine-readable manifest.
Proposal
Define a new well-known endpoint:
GET /.well-known/adcp-agents.json
Returns a manifest of tenants served from this origin:
{
"version": "1.0",
"agents": [
{
"key": "sales",
"url": "https://example.com/sales/mcp",
"transport": "mcp",
"specialisms": ["sales-non-guaranteed", "sales-guaranteed"],
"auth_hint": "shared_bearer"
},
{
"key": "signals",
"url": "https://example.com/signals/mcp",
"transport": "mcp",
"specialisms": ["signal-marketplace", "signal-owned"],
"auth_hint": "shared_bearer"
}
]
}
auth_hint is optional and informational only — shared_bearer, per_tenant_bearer, oauth, etc. The actual auth is negotiated out-of-band; this just helps tooling render hints to the operator.
The endpoint MUST be readable without authentication (parity with .well-known/agent-card.json). For privacy, operators MAY return only the public/test tenants and gate production tenants behind authenticated discovery on a different path.
Why
- Buyers: machine-readable enumeration replaces the "find the publisher's tenant list in their docs" hop.
- Conformance runners:
adcp storyboard run --agents-map can be replaced with adcp storyboard run --discover https://publisher.example for the common case.
- AAO Verified: certification can verify a publisher's declared topology against its actual surface in one fetch instead of N tenant-card probes.
Relation to existing well-known endpoints
/.well-known/agent-card.json — single-agent manifest (per A2A / AdCP today). For multi-tenant operators this card is either missing or describes one (arbitrary?) tenant. The new endpoint complements it.
/.well-known/oauth-authorization-server — RFC 8414 OAuth metadata. Orthogonal.
/.well-known/brand.json — brand identity. Orthogonal.
Found by
PR review of adcp-client#1355 — flagged by the adtech-product-expert reviewer as the upstream bottleneck for multi-agent adoption: "buyers don't get tenant URLs from publishers as a structured artifact. They get a Notion page or a CSV. A discover-tenants primitive would do more for adoption than this PR."
Out of scope (file as follow-ups)
- Per-tenant signed manifests (TLS chain trust is sufficient for v1).
- Capability-aware filtering at the manifest level (operator advertises full list; runner fetches each tenant's
get_adcp_agent_capabilities for the per-specialism detail).
- Versioning beyond a top-level
version field.
Summary
A publisher (or any AdCP operator) running a multi-agent topology — sales agent at
/sales, signals at/signals, governance at/governance, creative at/creative, etc. — has no standard way to advertise which tenants are live, what each tenant's URL is, and which specialisms each tenant claims. Buyers and conformance runners (e.g.,adcp-clientPR #1355 which adds per-specialism routing) have to learn the topology out-of-band: a Notion page, a CSV, or hardcoded lists in the runner.The prod test-agent demonstrates the problem precisely: six tenants live at
https://test-agent.adcontextprotocol.org/{sales,signals,governance,creative,creative-builder,brand}/mcp, but the only way to learn that list today is to readadcontextprotocol/adcp:server/src/training-agent/index.tsTENANT_IDS. There's no machine-readable manifest.Proposal
Define a new well-known endpoint:
Returns a manifest of tenants served from this origin:
{ "version": "1.0", "agents": [ { "key": "sales", "url": "https://example.com/sales/mcp", "transport": "mcp", "specialisms": ["sales-non-guaranteed", "sales-guaranteed"], "auth_hint": "shared_bearer" }, { "key": "signals", "url": "https://example.com/signals/mcp", "transport": "mcp", "specialisms": ["signal-marketplace", "signal-owned"], "auth_hint": "shared_bearer" } ] }auth_hintis optional and informational only —shared_bearer,per_tenant_bearer,oauth, etc. The actual auth is negotiated out-of-band; this just helps tooling render hints to the operator.The endpoint MUST be readable without authentication (parity with
.well-known/agent-card.json). For privacy, operators MAY return only the public/test tenants and gate production tenants behind authenticated discovery on a different path.Why
adcp storyboard run --agents-mapcan be replaced withadcp storyboard run --discover https://publisher.examplefor the common case.Relation to existing well-known endpoints
/.well-known/agent-card.json— single-agent manifest (per A2A / AdCP today). For multi-tenant operators this card is either missing or describes one (arbitrary?) tenant. The new endpoint complements it./.well-known/oauth-authorization-server— RFC 8414 OAuth metadata. Orthogonal./.well-known/brand.json— brand identity. Orthogonal.Found by
PR review of adcp-client#1355 — flagged by the adtech-product-expert reviewer as the upstream bottleneck for multi-agent adoption: "buyers don't get tenant URLs from publishers as a structured artifact. They get a Notion page or a CSV. A
discover-tenantsprimitive would do more for adoption than this PR."Out of scope (file as follow-ups)
get_adcp_agent_capabilitiesfor the per-specialism detail).versionfield.