Skip to content

fix: make MCP outputSchema accept negotiated 3.0 media-buy status #866

@bokelley

Description

@bokelley

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions