Skip to content

Ship a stateless viewport MCP server that returns a MoQ URI plus a minted join token, never pixels #62

Description

@yakimoto

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.

BOUNDARYNo 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.

GATEG0G3 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triageOn the board but missing Type/Area/Priority

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions