Skip to content

[Actions] mcp-server: wave_compose as a finished rendering — save, run, schema on the live shape, release, live e2e #129

Description

@yakimoto

Sub-epic: the MCP rendering of WAVE Composer — wave_compose as a finished product surface, not just a merged tool.

POST https://api.wave.online/v1/compose takes a plain-language intent and returns a grounded proposal: which WAVE products to chain, in what order, at what live price. MCP is one of four renderings of that one engine (API, CLI, SDK, MCP), and it is the one an agent reaches for first — so its schema is the contract other agents read.

Today (receipt)

  • wave_compose: gateway-calling successor to wave.ask #127 wave_compose: gateway-calling successor to wave.ask MERGED 2026-09-06T15:21:38Z (feat/wave-compose-tool). The tool exists and calls the gateway rather than composing locally.
  • fix(release): verify tools/list against capabilities.json, not a literal 18 (v0.3.0 verify red on 24 tools) #128 fix(release): verify tools/list against capabilities.json, not a literal 18 MERGED 2026-09-06T19:51:12Z — the release verify now counts tools from the manifest.
  • The engine it calls is live. Probed unauthenticated this session: POST https://api.wave.online/v1/compose with no credentials returns 402 with an x402 payment challenge naming "resource": "/v1/compose". With a key holding composer:write it returns 200, carrying these keys: callShape, engine, executes, flowId, groundedAt, grounding, id, intent, manifestHash, next, priceRows, productIds, scopes, stages, tools.
  • GET https://api.wave.online/.well-known/wave-skills/composer.json returns 200 and declares auth.scope: "composer:write" and pricing.meter: "wave_compose_builds".
  • What is not done: the tool's declared output schema is not proven to match the live response key-for-key, there is no save-flow tool, no run/progress/artifact tools, no release cut carrying wave_compose, and no e2e in this repo's CI that calls the live gateway.

Done means (live proof)

  • (a) Compose live against the enginewave_compose returns a proposal fetched from POST https://api.wave.online/v1/compose. Receipt: the merged PR (wave_compose: gateway-calling successor to wave.ask #127) plus a captured tool result showing live stages and priceRows.
  • (b) Save flow — an agent can persist a composed proposal through the authenticated bearer path and read it back by id, as a tool call.
  • (c) Run + progress + artifacts — tools exist to hand a proposal to a run, surface stage progress as it streams, and list the resulting artifacts.
  • (d) Tool schema and examples grounded on the LIVE response shape — the declared output schema names the keys the API actually returns (stages, priceRows, scopes, engine, executes, flowId, candidates). A test fails if the schema and a live response disagree in either direction.
  • (e) Release cut — a version bump plus a release-workflow run id as the receipt, and tools/list on the published server includes wave_compose.
  • (f) e2e vs the live gateway in this repo's CI — a test asserting 402 without a key and the 200 response shape with a key, green, with the run id recorded.

Owner

Lane builds it. Jake crossing: the merge to this public repo's default branch, and any release publish.

Depends on

The runner surface behind (c) is tracked on the API side; (a), (d), (e), (f) are independent and buildable now.

Layer

Actions — the MCP face of WAVE's Knowledge / Actions / Awareness triple.

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

    category:bugSomething is brokenenhancementNew feature or requestneeds-triageOn the board but missing Type/Area/Prioritysize:LThis PR changes 100-499 lines, ignoring generated filestrust:ownerIssue author is repo owner

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions