Skip to content

Managed subscriptions seller fails the SDK's own capability validation (principal fields, idempotency, supported_versions) and needs undocumented wiring over MCP #1771

Closed

Description

@bokelley

Summary

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".

See tests/interop/matrix/py/seller.py in adcontextprotocol/adcp#8679.

Expected

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.

🤖 Generated with Claude Code

Activity

  1. bokelley commented on Nov 1, 2026

    @bokelley
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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