Pillar: agent plane.
WHY — MCP is how agents will actually reach a viewport, and the tool surface is the commercial front door: MCP tool calls are becoming chargeable by default at the gateway layer, so if WAVE does not define the viewport tool vocabulary a generic one will be what agents learn. The correct discipline — MCP is the tool surface, never the media path — is what keeps WAVE off the hot path and lets the video ride MoQ. A held viewport is long-running work with a handle, which is exactly the shape of MCP's Tasks extension.
GROUNDED — WAVE already has the primitives and a live instance of the pattern: registerTool at agent-money/src/mcp/server.ts:87, paid-tool 402-challenge design at :11, buildToolsList carrying pricing at :107, and wave-gateway/src/mcp.ts running three tools at POST /mcp per ADR-0003 ("each product spoke runs its own <product>.mcp.wave.online/mcp"). The token half exists: wave-moq-edge/src/moq-join-token.ts mints {ns, track, org, scope} with a 120 s ceiling and a dedicated secret so the media WebSocket never traverses the gateway. The in-tree gap is dated and specific: agent-money/src/mcp/server.ts:269 pins protocolVersion: "2025-06-18".
Correction on the external half: the target revision is UNVERIFIED. The claim that the MCP spec finalises on a specific 2026 date with a specific deprecation list (stateless core, Tasks promoted, Roots/Sampling/Logging deprecated) carries no URL and no fetch date anywhere in the source material, and was not confirmed. Do not hard-code a future spec string into a done-when — if either the date or the letter moves, the acceptance criterion becomes unachievable. Cite modelcontextprotocol.io with a fetch date, or mark it UNVERIFIED and build against the then-current published revision, named in the receipt.
BOUNDARY — No media through MCP, ever. No pixels in a tool result; a frame-grab tool returns a signed URL, not bytes. Do not build on any capability the current published revision marks deprecated. Do not claim conformance to any revision until server.ts:269 actually moves and the receipt names it. Do not implement lease pricing here — that is the commerce pillar's rate card; this node calls it.
TAXONOMY — Orchestration agents (primary); viewer and clipping agents; analytics agents (scene description only); integration developers.
GATE — G0 → G3 on a flag-gated deploy → G4 on the live receipt.
DONE-WHEN — A dated receipt showing, against the deployed endpoint: tools/list returns the five tools (list_viewports, describe_scene, bind_viewport, release_viewport, grab_frame) with the then-current published MCP protocol revision named in the receipt, plus a note recording the fetch date and URL of the revision cited; tools/call bind_viewport returns a long-running-work handle plus a MoQ URI and a join token and zero media bytes; a subsequent MoQ subscribe using only that token delivers at least one object; release_viewport transitions the handle to terminal; and an unauthenticated bind_viewport returns a 402 challenge, not a 500.
DEPENDENCIES — Consumes the intent schema and the agent token, both fixture-able. Calls the commerce pillar's lease and rate card.
Pillar: agent plane.
WHY — MCP is how agents will actually reach a viewport, and the tool surface is the commercial front door: MCP tool calls are becoming chargeable by default at the gateway layer, so if WAVE does not define the viewport tool vocabulary a generic one will be what agents learn. The correct discipline — MCP is the tool surface, never the media path — is what keeps WAVE off the hot path and lets the video ride MoQ. A held viewport is long-running work with a handle, which is exactly the shape of MCP's Tasks extension.
GROUNDED — WAVE already has the primitives and a live instance of the pattern:
registerToolatagent-money/src/mcp/server.ts:87, paid-tool 402-challenge design at:11,buildToolsListcarryingpricingat:107, andwave-gateway/src/mcp.tsrunning three tools atPOST /mcpper ADR-0003 ("each product spoke runs its own<product>.mcp.wave.online/mcp"). The token half exists:wave-moq-edge/src/moq-join-token.tsmints{ns, track, org, scope}with a 120 s ceiling and a dedicated secret so the media WebSocket never traverses the gateway. The in-tree gap is dated and specific:agent-money/src/mcp/server.ts:269pinsprotocolVersion: "2025-06-18".Correction on the external half: the target revision is UNVERIFIED. The claim that the MCP spec finalises on a specific 2026 date with a specific deprecation list (stateless core, Tasks promoted, Roots/Sampling/Logging deprecated) carries no URL and no fetch date anywhere in the source material, and was not confirmed. Do not hard-code a future spec string into a done-when — if either the date or the letter moves, the acceptance criterion becomes unachievable. Cite modelcontextprotocol.io with a fetch date, or mark it UNVERIFIED and build against the then-current published revision, named in the receipt.
BOUNDARY — No media through MCP, ever. No pixels in a tool result; a frame-grab tool returns a signed URL, not bytes. Do not build on any capability the current published revision marks deprecated. Do not claim conformance to any revision until
server.ts:269actually moves and the receipt names it. Do not implement lease pricing here — that is the commerce pillar's rate card; this node calls it.TAXONOMY — Orchestration agents (primary); viewer and clipping agents; analytics agents (scene description only); integration developers.
GATE — G0 → G3 on a flag-gated deploy → G4 on the live receipt.
DONE-WHEN — A dated receipt showing, against the deployed endpoint:
tools/listreturns the five tools (list_viewports,describe_scene,bind_viewport,release_viewport,grab_frame) with the then-current published MCP protocol revision named in the receipt, plus a note recording the fetch date and URL of the revision cited;tools/call bind_viewportreturns a long-running-work handle plus a MoQ URI and a join token and zero media bytes; a subsequent MoQ subscribe using only that token delivers at least one object;release_viewporttransitions the handle to terminal; and an unauthenticatedbind_viewportreturns a 402 challenge, not a 500.DEPENDENCIES — Consumes the intent schema and the agent token, both fixture-able. Calls the commerce pillar's lease and rate card.