Skip to content

Releases: adcontextprotocol/adcp-client-python

v5.2.0

11 May 17:31
abac33b

Choose a tag to compare

5.2.0 (2026-05-11)

Features

  • client: server_version constructor scaffold (stage 7-lite) (#674) (5c7acb4)
  • client: surface structured adcp_error on TaskResult (#675) (fe66335)
  • compat: AdapterPair pattern + v2.5 sync_creatives (stage 4) (#665) (0e47dcc)
  • compat: server-side shape-based v2.5 detection (stage 6) (#673) (d6210cc)
  • compat: v2.5 create_media_buy + update_media_buy adapters (stage 5c) (#669) (4e3473a)
  • compat: v2.5 get_products adapter (stage 5b) (#668) (2025520)
  • compat: v2.5 list_creative_formats + preview_creative adapters; deprecate spec_compat_hooks (#667) (fec91d6)
  • schemas: fetch + bundle v2.5 schemas from pinned upstream SHA (stage 4b1) (#670) (bd6837f)
  • server: pre-adapter validation against legacy schema (stage 4b2) (#671) (4ef032b)
  • server: route validation by wire adcp_version (stage 3) (#664) (d2ffac7)
  • validation: per-version validator loader (stage 2 of versioned validation) (#659) (6311a9a)

v5.1.0

11 May 08:07
140cbd1

Choose a tag to compare

5.1.0 (2026-05-11)

Features

  • a2a: per-request agent-card URL resolution via callable public_url (#650) (1b4f3e0)
  • server: add spec_compat_hooks() for pre-v3 / pre-4.4 buyer compatibility (#648) (30690e5)
  • server: TenantRegistry.as_platform() adapter for serve() integration (#649) (0e396ca)
  • testing: forward pre_validation_hooks through build_asgi_app (#655) (2df49c0)

Bug Fixes

  • decisioning: wrap pydantic.ValidationError from delegates as INVALID_REQUEST (#656) (976ab4f)

v5.0.0

10 May 17:32
b279d1a

Choose a tag to compare

5.0.0 (2026-05-10)

⚠ BREAKING CHANGES

  • types: callers passing affected_packages into a function typed def f(x: list[Package]) will see a mypy error and need to migrate to Sequence[Package]. Runtime behavior is unchanged; the change is annotation-only.
  • types: Subclasses that add fields without Field(exclude=True) will now have those fields appear in model_dump() output where they were previously dropped by Pydantic's declared-schema firewall. Audit each subclass and mark internal fields with Field(exclude=True). To restore the prior behavior at a specific call site, pass serialize_as_any=False explicitly.
  • webhooks: domain kwarg removed from create_mcp_webhook_payload and WebhookSender.send_mcp. Migrate to protocol (kebab-case string or AdcpProtocol enum value).
  • webhooks: create_mcp_webhook_payload returns a Pydantic model, not a dict; task_type is now required.

Features

  • a2a: add public_url param to agent card for production deployments (#621) (14d294c)
  • server: add TenantRegistry with per-tenant health tracking (#628) (ae687b6)
  • server: default MCP streamable-http to stateful with idle eviction (#636) (3173a54)
  • server: expose RequestContext.transport and current_transport ContextVar (#627) (20e5d53)
  • server: pre-validation request hook for spec-default injection (#614) (#629) (05d4cd8)
  • testing: adopter type-checking test suite with zero-ignore contract (#634) (20e496c)
  • testing: extend build_asgi_app with full serve-layer kwargs (#626) (8679a95)
  • types: default serialize_as_any=True in AdCPBaseModel.model_dump (#639) (3160ace), closes #615
  • types: widen extension-point list[X] to Sequence[X] (#624) (#640) (96ccfd4)
  • webhooks: create_mcp_webhook_payload returns McpWebhookPayload (#632) (9eb962c)
  • webhooks: replace domain kwarg with typed protocol (AdcpProtocol enum) (#637) (fdd4053)

Bug Fixes

  • server: register /.well-known/agent.json alias route in create_a2a_server (#613) (2989101)
  • server: strip None-valued asset fields from dict-based response builder output (#631) (c02ea84), closes #622
  • types: widen canceled Literal[True]=True to Literal[True]|None=None on request types (#643) (120ae3b)

Documentation

  • types: document Field(exclude=True) and @model_serializer for nested wire isolation (#630) (4912af9)

v4.6.1

10 May 11:15
fca954e

Choose a tag to compare

4.6.1 (2026-05-10)

Bug Fixes

  • decisioning: wire sync_accounts/list_accounts dispatch to AccountStore Protocols (#610) (dabf4fb)

v4.6.0

09 May 12:54
7125bce

Choose a tag to compare

4.6.0 (2026-05-09)

Features

  • webhooks: public to_wire_dict() serialization seam (#602) (6a06e88)

Bug Fixes

  • decisioning: re-validate params through platform method's stricter subclass annotation (#597) (3d269f5)
  • webhooks: add canceled/rejected/auth-required to A2A status map; fail fast on unknowns (#606) (89f9491)
  • webhooks: correct type annotations for extract_webhook_result_data and payload builders (#600) (e624b5c)
  • webhooks: reject unknown AdCP status in create_a2a_webhook_payload (#605) (37d2cda)

Documentation

  • contributing: document PR title format to prevent silent CHANGELOG drops (#580) (2c5ec64)

v4.5.0

08 May 02:56
2cd6496

Choose a tag to compare

4.5.0 (2026-05-07)

Features

  • auth: per-leg header config + agent-card bearerAuth scheme (#595) (52f45ef)

Bug Fixes

  • client: preserve agent_uri trailing slash; widen MCP URL fallbacks (#582) (1db3ce3)

v4.4.3

05 May 20:25
8dc4670

Choose a tag to compare

4.4.3 (2026-05-05)

Bug Fixes

  • server: A2A auth middleware populates current_principal contextvars (#592) (5430942)

v4.4.2

05 May 18:26
4a6b8f5

Choose a tag to compare

4.4.2 (2026-05-05)

Bug Fixes

  • deps: re-pin a2a-sdk<1.0.2, add protobuf>=6 floor + matrix canary (#588) (1e16d6f)

v4.4.1

05 May 17:21
aa59259

Choose a tag to compare

4.4.1 (2026-05-05)

Bug Fixes

  • client: add extra_headers escape hatch for multi-tenant servers (#585) (66b7456)
  • deps: bump a2a-sdk to >=1.0.2,<1.1 (#586) (2fd640c)

v4.4.0

04 May 16:44
18b37e8

Choose a tag to compare

v4.4.0 — DecisioningPlatform foundation, Tier 2 commercial identity, durable infra

The largest release since the SDK's restructure. ~90 features and ~30 fixes across five weeks of work, anchored by the new DecisioningPlatform Protocol architecture and end-to-end Tier 2 commercial-identity flow. Highlights below; the auto-generated CHANGELOG (appended at the end of this release's body or in CHANGELOG.md) has the full per-PR list.

Headline themes

1. DecisioningPlatform — unified Protocol architecture (#316)

A single Protocol surface for building AdCP servers, replacing the legacy handler-by-tool pattern. Six Protocol breadth-sprint batches ship the surface adopters need:

  • Sales (existing) + CampaignGovernance (#334)
  • Signals + Audience (#332)
  • CreativeBuilder + CreativeAdServer (#333)
  • BrandRights + ContentStandards + PropertyLists + CollectionLists (#335)
  • MockAdServer with /_debug/traffic counters (#383, #405)

2. Tier 2 commercial identity (v3 signing)

End-to-end RFC 9421 signed-request flow for the v3 buyer-agent registry:

  • BuyerAgentRegistry + dispatch wire-up + AuthInfo v3 fields (#349, #359)
  • PgBuyerAgentRegistry durable Postgres backend (#364, #380, #407)
  • BrandJsonJwksResolver + CapabilityCache v3 Tier 1 (#345)
  • AuthInfo.from_verified_signer bridge to RFC 9421 (#365)
  • verify_from_agent_url single-call resolver+verifier (#401)
  • async_resolve_agent JWKS bootstrap via brand.json (#389)

3. Multi-tenant routing

  • PlatformRouter + multi-platform proof (#477, #490)
  • LazyPlatformRouter for tenant-on-first-request construction (#552)
  • SubdomainTenantRouter + CallableSubdomainTenantRouter for DB-backed lookups (#355, #368, #544)
  • create_tenant_store opinionated multi-tenant AccountStore (#473)
  • createOAuthPassthroughResolver (#472), createRosterAccountStore (#471)

4. Durable Postgres infrastructure

  • PostgresTaskRegistry for HITL task state (#361)
  • PgWebhookDeliverySupervisor for multi-worker delivery (#360)
  • PgBackend idempotency for multi-worker durable replay (#555)
  • WebhookDeliverySupervisor + SQLAlchemy A2A stores (#348)

5. transport="both" — single-binary MCP + A2A (#354, #370)

Host both MCP and A2A on the same process, with structured-error parity (#530, #536) and structuredContent.adcp_error on MCP error responses (#509, #525).

6. Validation, by default (validation=strict in serve())

Breakingserve() now defaults to strict wire-conformance validation (#439). Servers that previously passed lax validation may surface new errors. Set validation="warn" or validation=None to opt out. See ADCP_VALIDATION_MODE env var (#391, #385) for global override.

Companion DX: oneOf near-miss validator hints + issues[].hint on every VALIDATION_ERROR (#476).

7. Auth surface improvements

  • serve(auth=BearerTokenAuth(...)) — A2A sibling + cross-transport shortcut (#566)
  • ctx.auth_principal populated from bearer ContextVar (#574, fixes #571)
  • ctx.auth_info.kind == "bearer" typed flow discriminator (#577, fixes #576)
  • header_name + bearer_prefix_required on BearerTokenAuthMiddleware (#545)
  • CreateMediaBuySubmittedResponse alias + handler return type covers all 3 branches (#575, fixes #570)

Migration callouts

  • validation=strict is the new default in serve() (#439). To preserve prior behavior, pass validation="warn" or set ADCP_VALIDATION_MODE.
  • AuthInfo flat-field synthesis warns now, removes in 4.5.0AuthInfo(kind="api_key", key_id=..., principal=...) triggers DeprecationWarning. Construct typed ApiKeyCredential/OAuthCredential/HttpSigCredential explicitly going forward.
  • Bearer adopters reading ctx.auth_principal/ctx.auth_info (#571, #576) — these now populate for bearer flows. Adopter code gating on is None to detect bearer flow needs to switch to ctx.auth_info.kind == "bearer" checks.

Selected fixes

  • TaskHandoff registry.fail/complete echo request context (#569)
  • Tier 2 codes → spec-conformant PERMISSION_DENIED (#375, #393)
  • MCP error responses populate structuredContent.adcp_error (#509, #525)
  • Server/A2A structured-error parity with MCP (#530, #536)
  • @IdempotencyStore.wrap supports arg-projected methods (#567, fixes #559)
  • Schemas bundled as adcp.schemas package (#442) — eliminates inlined test copy

Acknowledgments

Triage / review automation expanded substantially in this cycle — Claude Code triage routine, no-triage label gate, and stuck-label sweep workflows now coordinate parallel work between the bot and humans (CLAUDE.md coordination rules updated #572).


Full per-PR CHANGELOG: see the auto-generated section below or CHANGELOG.md.


Auto-generated CHANGELOG (per-PR)

4.4.0 (2026-05-04)

Features

  • auth: header_name + bearer_prefix_required on BearerTokenAuthMiddleware (#545) (b16d18f)
  • auth: serve(auth=BearerTokenAuth(...)) — A2A sibling + cross-transport shortcut (#566) (4ead607)
  • buyer-agent-registry: caching + rate-limit + audit emission (#380) (#407) (5a1e6b6)
  • client: looks_like_v3_capabilities — drop the v2-downgrade footgun on capabilities-validation failure (#475) (385dc80)
  • decisioning: Account v3 projection helpers — bank-details write-only guard (#356) (#366) (5d898b6)
  • decisioning: Account.mode + sandbox-authority gate for comply_test_controller (Phase 1) (#483) (f5cd8cf)
  • decisioning: adopt structured capabilities in v3 reference seller (8316105), closes #479
  • decisioning: advertise_all kwarg + handler.get_advertised_tools (#529) (8b1b384)
  • decisioning: align AccountStore.resolution literal with JS + Tier 1 docs (#330) (6490948)
  • decisioning: AuthInfo.from_verified_signer — bridge to RFC 9421 verifier (#365) (5ae109b)
  • decisioning: boot-time capabilities response shape validation (#422) (#446) (127f164)
  • decisioning: boot-time validator for declared idempotency vs wired @wrap (#543) (7657ad4)
  • decisioning: BrandRights/ContentStandards/PropertyLists/CollectionLists Protocols (breadth sprint Batch 4 — FINAL) (#335) (aeb2543)
  • decisioning: built-in fields projection on get_products responses (#503) (06aaf51)
  • decisioning: CampaignGovernancePlatform Protocol (breadth sprint Batch 3) (#334) (2ca828a)
  • decisioning: composeMethod + security composer helpers (#466) (ddad4b9)
  • decisioning: comprehensive Emma DX follow-up (P0/P1/P2 + examples) (#339) (985dcd9)
  • decisioning: create_tenant_store — opinionated multi-tenant ...
Read more