Summary
SDK 8 adds version-scoped MCP schemas and dispatch, but the public DecisioningPlatform composition path does not expose a way to set the handler's protocol pin.
Both of these public functions lack an adcp_version parameter:
adcp.decisioning.serve.create_adcp_server_from_platform()
adcp.decisioning.serve()
The factory always constructs PlatformHandler(...) without a pin, and PlatformHandler does not implement get_adcp_version(). As a result, adcp.server.mcp_tools._resolve_handler_adcp_version(handler, None) returns None.
That makes a DecisioningPlatform-based seller fall back to the SDK's unversioned/current 3.2 model schemas for MCP discovery even when the seller advertises and enforces AdCP 3.1. For example, beta.4's unversioned ListCreativesRequest advertises the 3.2-only assignment_projection and assignment_limit fields; the bundled 3.1 schema correctly omits them.
Current workaround
An adopter must either bypass adcp.decisioning.serve() or mutate the generated handler's private state:
handler, executor, registry = create_adcp_server_from_platform(platform)
handler._adcp_version = "3.1"
Once set, the existing server resolver correctly selects the bundled 3.1 discovery schemas and uses 3.1 as the default unnegotiated dispatch version.
Suggested API
Add adcp_version: str | None = None to both DecisioningPlatform composition functions, resolve/validate it consistently with the other SDK constructor surfaces, and attach the resolved pin to PlatformHandler.
A regression test could assert that a platform created with adcp_version="3.1":
- resolves to
"3.1" through _resolve_handler_adcp_version;
- advertises the bundled 3.1 MCP request/output schemas; and
- uses 3.1 for unversioned dispatch.
Environment
adcp==8.0.0b4
- Python 3.13
- multi-tenant seller using
LazyPlatformRouter + adcp.decisioning.serve()
Summary
SDK 8 adds version-scoped MCP schemas and dispatch, but the public
DecisioningPlatformcomposition path does not expose a way to set the handler's protocol pin.Both of these public functions lack an
adcp_versionparameter:adcp.decisioning.serve.create_adcp_server_from_platform()adcp.decisioning.serve()The factory always constructs
PlatformHandler(...)without a pin, andPlatformHandlerdoes not implementget_adcp_version(). As a result,adcp.server.mcp_tools._resolve_handler_adcp_version(handler, None)returnsNone.That makes a DecisioningPlatform-based seller fall back to the SDK's unversioned/current 3.2 model schemas for MCP discovery even when the seller advertises and enforces AdCP 3.1. For example, beta.4's unversioned
ListCreativesRequestadvertises the 3.2-onlyassignment_projectionandassignment_limitfields; the bundled 3.1 schema correctly omits them.Current workaround
An adopter must either bypass
adcp.decisioning.serve()or mutate the generated handler's private state:Once set, the existing server resolver correctly selects the bundled 3.1 discovery schemas and uses 3.1 as the default unnegotiated dispatch version.
Suggested API
Add
adcp_version: str | None = Noneto both DecisioningPlatform composition functions, resolve/validate it consistently with the other SDK constructor surfaces, and attach the resolved pin toPlatformHandler.A regression test could assert that a platform created with
adcp_version="3.1":"3.1"through_resolve_handler_adcp_version;Environment
adcp==8.0.0b4LazyPlatformRouter+adcp.decisioning.serve()