Summary
After adcp==6.2.0b3, the server-side version resolver/adaptation path is returning the correct legacy 3.0 media-buy shape for omitted/existing 3.0 buyers, but MCP output validation still rejects the response because the advertised/generated tool outputSchema only accepts the 3.1 beta success-envelope status.
This leaves adopters tempted to patch outputSchema locally. We should not do that in sellers; the Python SDK/server layer should generate or advertise an MCP schema that is compatible with the negotiated wire contract.
Environment
- Python SDK:
adcp==6.2.0b3
- JS storyboard runner:
@adcp/sdk@7.11.0 (AdCP 3.0.12)
- Seller capabilities advertise both
3.0 and 3.1-beta.3
- Repro seller: Prebid Sales Agent local stack
Repro
Run the legacy 3.0 storyboard runner against the MCP endpoint:
npx -y @adcp/sdk@7.11.0 storyboard run \
http://localhost:50001/mcp \
media_buy_seller \
--auth ci-test-token \
--protocol mcp \
--allow-http \
--json
Representative failing scenario:
media_buy_seller/pending_creatives_to_start/create_buy_no_creatives
The seller returns the expected 3.0 shape:
{
"media_buy_id": "mb_...",
"packages": [],
"status": "pending_creatives",
"context": {
"correlation_id": "..."
}
}
But MCP output validation rejects it:
Output validation error: {... "status": "pending_creatives", ...} is not valid under any of the given schemas
In the local repro this accounts for six MCP 3.0 storyboard failures. The same seller code path works for explicit 3.1 beta shape (status: "completed" plus media_buy_status).
Expected
When a buyer requests or implies 3.0 compatibility, the server should be able to return the 3.0 success shape and pass MCP output validation.
Concretely, one of these should happen upstream:
- Generate MCP
outputSchema for multi-version handlers wide enough to accept both negotiated 3.0 and 3.1 media-buy success shapes.
- Or select the tool output schema by the resolved request version before validation.
- Or avoid validating a negotiated 3.0 response against a 3.1-only generated success branch.
Notes
This is the residual issue after #851 / #855. Those changes exposed the resolver and improved response adaptation, but the MCP tool schema/validator is still single-shape.
I verified the root cause locally by temporarily widening the generated MCP media-buy create/update success-arm status enum to the legacy MediaBuyStatus values. That made the 3.0 MCP storyboard pass. I removed that local shim because this should be fixed in the SDK rather than in seller applications.
Summary
After
adcp==6.2.0b3, the server-side version resolver/adaptation path is returning the correct legacy 3.0 media-buy shape for omitted/existing 3.0 buyers, but MCP output validation still rejects the response because the advertised/generated tooloutputSchemaonly accepts the 3.1 beta success-envelope status.This leaves adopters tempted to patch
outputSchemalocally. We should not do that in sellers; the Python SDK/server layer should generate or advertise an MCP schema that is compatible with the negotiated wire contract.Environment
adcp==6.2.0b3@adcp/sdk@7.11.0(AdCP 3.0.12)3.0and3.1-beta.3Repro
Run the legacy 3.0 storyboard runner against the MCP endpoint:
Representative failing scenario:
The seller returns the expected 3.0 shape:
{ "media_buy_id": "mb_...", "packages": [], "status": "pending_creatives", "context": { "correlation_id": "..." } }But MCP output validation rejects it:
In the local repro this accounts for six MCP 3.0 storyboard failures. The same seller code path works for explicit 3.1 beta shape (
status: "completed"plusmedia_buy_status).Expected
When a buyer requests or implies 3.0 compatibility, the server should be able to return the 3.0 success shape and pass MCP output validation.
Concretely, one of these should happen upstream:
outputSchemafor multi-version handlers wide enough to accept both negotiated 3.0 and 3.1 media-buy success shapes.Notes
This is the residual issue after #851 / #855. Those changes exposed the resolver and improved response adaptation, but the MCP tool schema/validator is still single-shape.
I verified the root cause locally by temporarily widening the generated MCP media-buy create/update success-arm
statusenum to the legacyMediaBuyStatusvalues. That made the 3.0 MCP storyboard pass. I removed that local shim because this should be fixed in the SDK rather than in seller applications.