You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Managed subscriptions seller fails the SDK's own capability validation (principal fields, idempotency, supported_versions) and needs undocumented wiring over MCP #1771
A seller on the managed reporting-subscriptions path (ReliableReportingService(subscriptions=SubscriptionOptions(...)), adcp 10.0.0b4) advertises a get_adcp_capabilities response that the Python SDK's own client rejects. The client validates against the bundled 3.3.0-beta.3 schemas, and a Python buyer fails on the Python seller with:
get_adcp_capabilities response failed schema validation at /adcp/idempotency: 'idempotency' is a required property
/adcp/principal/optimistic_concurrency 'optimistic_concurrency' is a required property
/adcp/principal/max_reporting_destinations ... reporting_destination_offerings ... suspension_interval_seconds
ManagedSubscriptions.advertise_principal always adds the reporting_destinations section to adcp.principal.supported_sections. Under 3.3.0-beta.3 that section requires max_reporting_destinations, reporting_destination_offerings and suspension_interval_seconds, and principal itself requires optimistic_concurrency. The SDK fills none of these, and the seller guide doesn't say the host must. The service's supported_versions also defaults so that a client negotiates 3.0 or 3.1 and refuses get_principal ("get_principal is unavailable in AdCP 3.1") unless the host passes serve(supported_versions=("3.2", "3.3-beta.3")).
To get the interop seller working I had to:
set adcp.idempotency, adcp.principal.{optimistic_concurrency, max_reporting_destinations, reporting_destination_offerings, suspension_interval_seconds} and experimental_features: ["account.requests"] in the handler's capabilities;
pass supported_versions;
pass context_factory=auth_context_factory; without it list_accounts gets no caller_identity over MCP;
pass a caller_resolver; the default needs an AccountAwareToolContext, so get_reporting_status over MCP fails with "Reporting service configuration failed".
The managed path either fills the principal fields it implies (or refuses to start without them, naming them), or the guide lists every host-supplied field. A seller built per docs/reporting-subscriptions-seller.md and served with serve() should pass the SDK's own response validation, and should serve get_reporting_status to bearer callers over MCP.
Fixed on next by #1779 (922fb877). It merged into a non-default branch, so the issue didn't auto-close.
adcp.principal:optimistic_concurrency: true is always advertised. reporting_destinations is listed only when the seller supplies max_reporting_destinations, reporting_destination_offerings and suspension_interval_seconds.
adcp.supported_versions: advertised on the managed path when the seller doesn't state it, so a buyer reaches 3.3 instead of negotiating down to 3.1.
Plain MCP callers: a reporting task with an authenticated caller and no resolved account reads the account the request names. It is still bounded by the subscription grant check, so no caller_resolver is needed.
Seller guide: the new Capabilities and serving section of docs/reporting-subscriptions-seller.md lists what the host still supplies (adcp.idempotency, the destination facts, context_factory=auth_context_factory).
The test_issue_1771_* tests in tests/test_reporting_subscription_managed.py cover both repros and pass on next (7edba16d). The experimental_features: ["account.requests"] the interop seller set isn't needed for validation; it advertises request_account, which is the seller's choice.
Activity
bokelley commentedon Nov 1, 2026
Fixed on
nextby #1779 (922fb877). It merged into a non-default branch, so the issue didn't auto-close.adcp.principal:optimistic_concurrency: trueis always advertised.reporting_destinationsis listed only when the seller suppliesmax_reporting_destinations,reporting_destination_offeringsandsuspension_interval_seconds.adcp.supported_versions: advertised on the managed path when the seller doesn't state it, so a buyer reaches 3.3 instead of negotiating down to 3.1.caller_resolveris needed.docs/reporting-subscriptions-seller.mdlists what the host still supplies (adcp.idempotency, the destination facts,context_factory=auth_context_factory).The
test_issue_1771_*tests intests/test_reporting_subscription_managed.pycover both repros and pass onnext(7edba16d). Theexperimental_features: ["account.requests"]the interop seller set isn't needed for validation; it advertisesrequest_account, which is the seller's choice.