WAVE MCP Server
Official@wave-av/mcp-server
WAVE is media infrastructure for the agentic internet: one call shape moves live and on-demand media across every transport, and both kinds of user, people and agents, discover it, call it, and pay for it per call. This package is how an agent discovers and calls that call shape over MCP. The hosted server answers at https://mcp.wave.online/mcp, the agent card is published at https://gateway.wave.online/.well-known/agent-card.json, and the skills index at https://gateway.wave.online/.well-known/wave-skills.json. npx @wave-av/mcp-server runs a WAVE MCP server locally over stdio for Claude Code, Cursor, and Windsurf.
Live → · docs · npm · repo · Docs · Status
Quick start
npx @wave-av/mcp-server{
"mcpServers": {
"wave": {
"command": "npx",
"args": ["-y", "@wave-av/mcp-server"],
"env": {
"WAVE_API_KEY": "wave_live_..."
}
}
}
}Setup
1. Get an API key
# Via CLI
wave auth login
# Or create at https://console.wave.online/dashboard#keys2. Configure your AI tool
Add to your .mcp.json (Claude Code, Cursor, Windsurf, etc.) — see the Quick start config above.
Available tools — Streams
Tool | Description |
| List streams with pagination and status filtering (idle/live/ended) |
| Create a new stream (protocol, recording, privacy) |
| Start a stream |
| Stop an active stream |
| Get a stream's current status document |
| Get analytics for a single stream over a date range |
| Mark a moment in a stream as a highlight for later clipping |
Available tools — Studio
Tool | Description |
| List multi-camera productions |
| Create a new multi-camera production |
| Switch the program/preview bus to a camera index in a production |
| Show or hide a graphics overlay in a production |
| Send a control command (iris/focus/zoom/white balance/gain/shutter/recording/audio level/presets) to a managed camera |
| Moderate a chat message in a live stream (block/flag/allow) |
| Transcribe an audio clip and optionally run a fast-LLM step over the transcript |
| Create a clip from a recording |
Available tools — Analytics
Tool | Description |
| Get account-wide viewer engagement analytics over a date range |
Available tools — Billing
Tool | Description |
| Get the current billing account (plan, subscription state) |
| Get billed usage for a date range |
Design tools
Thin wrappers over the design-to-engineer pipeline's two standalone libraries
(@wave-av/pen-extract, @wave-av/loc-study) — stage E2 of
wave-pen-register's designs/DESIGN-TO-ENGINEER-SYSTEM.md. Neither library
is published to npm yet, so each tool resolves its library from a sibling
checkout, $HOME-first, with an env override:
Tool | Description |
| Run pen-extract's |
| Compose + validate a |
| Run loc-study's |
| Validate an existing |
Every path argument (pen board, extract dir, image, contract file, etc.) is
confined to $HOME/wave-av or the OS temp dir — a call outside those roots
is rejected before anything runs.
Env var | Default | Purpose |
|
| Root of the |
|
| Root of the |
Available tools — Compose (front door composer)
wave_compose is the agent rendering of the WAVE conversational front door
composer (designs/front-door/PR4-BRIEF.md in wave-pen-register-wt): given
a goal in plain language, it proposes a composition of WAVE
products/tools/meters — it never executes anything itself.
Tool | Description |
| Propose a WAVE media pipeline (captions/clips/dub/realtime/identity/...) for a goal stated in plain language. Calls the live gateway |
| Deprecated — use |
Input:
{ intent: string, budgetUsd?: number }(wave_compose) /{ question: string, budgetUsd?: number }(wave.ask, deprecated).Output:
{ intent, stages[], productIds[], tools[], meters[], priceRows[], executes: false, next[], grounding }(wave_compose;groundingis"gateway"or"snapshot") or the gateway's own object verbatim plusgrounding: "gateway"when a live call succeeds.wave.ask's output omitsgroundingbut is otherwise identical. Alwaysexecutes: false, never amodelfield (no sourced Dispatch model catalog exists yet).Grounded, not generated, in the snapshot path: every
productIds[]/tools[]/meters[]entry is checked against a bundled, measured snapshot of the live platform (knowledge/products.json— 59 products,knowledge/skills.json— 179 skills with pricing,knowledge/mcp-tools.json— 93 live gateway tools; seeknowledge/SOURCES.mdfor fetch provenance). A goal the composer doesn't recognize, or one that mentions a name outside that snapshot, always falls back to a real, grounded composition — never a fabricated one and never a dead end.Pricing is never invented in the snapshot path: each
priceRows[]entry carries the skill's realmeter(ornullfor flat-rate skills) and apriceShaperead straight off the skill's pricing block; thequotefield is always"quote at call time".The
WAVE_API_KEYnever goes anywhere but the gateway:wave_compose's live call sends it only as theAuthorizationheader onPOST {WAVE_BASE_URL}/v1/compose; it is never logged and never echoed into the tool's returned content, including on a failed call (which falls back to the snapshot path instead of surfacing an error).See
skills/wave-ask/SKILL.mdfor the full agent-facing how-to-call contract.
Available tools — Voice
Tool | Description |
| Drive a full headless voice-agent turn: bind an agent to a room, send a WAV of the caller's speech, and receive the agent's spoken reply as raw PCM. No browser, no WebRTC. Requires |
Resources
Access WAVE entities directly via the wave:// URI scheme:
wave://streams/{id}- Stream configuration and statuswave://productions/{id}- Studio production details
Environment variables
Variable | Required | Default | Description |
| Yes | - | Your WAVE API key |
| No |
| API origin. Tool paths are |
In-process (Claude Agent SDK) mode
For consumers already running inside a Claude Agent SDK
session, the same tools are available in-process — skipping the stdio subprocess
hop (~50 ms vs ~500 ms cold start). The tool list is shared with the stdio
server (src/tools/index.ts), so the two transports never drift.
@anthropic-ai/claude-agent-sdk is an optional peer dependency: stdio users
never need it. Install it only for this mode:
npm install @wave-av/mcp-server @anthropic-ai/claude-agent-sdkimport { query } from "@anthropic-ai/claude-agent-sdk";
import { createWaveSdkMcpServer } from "@wave-av/mcp-server/sdk-server";
const wave = await createWaveSdkMcpServer();
for await (const message of query({
prompt: "List my active streams",
options: { mcpServers: { wave }, env: { WAVE_API_KEY: process.env.WAVE_API_KEY } },
})) {
// handle messages
}Setup for other AI tools
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"wave": {
"command": "npx",
"args": ["-y", "@wave-av/mcp-server"],
"env": { "WAVE_API_KEY": "wave_live_..." }
}
}
}Windsurf
Add to Windsurf MCP settings with the same configuration.
Troubleshooting
Server not starting
Verify your API key is set:
echo $WAVE_API_KEYTools not appearing
Restart your AI tool after adding the MCP configuration. Most tools require a restart to detect new MCP servers.
Connection errors
The MCP server uses stdio transport (no network listener). If you see connection errors, check that npx can run successfully:
npx @wave-av/mcp-server --versionTesting the server
Send a JSON-RPC initialize request to verify:
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' | npx @wave-av/mcp-serverRelated packages
@wave-av/sdk — TypeScript SDK (34 API modules)
@wave-av/adk — Agent Developer Kit
@wave-av/cli — Command-line interface
@wave-av/create-app — Scaffold a new project
OpenAPI spec — Full API specification
Development
cd packages/mcp-server
pnpm install
pnpm run build
pnpm run dev # Watch mode
pnpm run type-checkLicense
MIT
Capabilities
Capability | Status |
Control a PTZ camera (pan, tilt, zoom, focus, preset recall/store). | |
Create a clip from a recorded stream, optionally exporting to social platforms. | |
Create a new multi-camera studio production. | |
Create a new stream (protocol, recording, region options). | |
Drive a full headless conversation with the WAVE voice agent (WAV in, PCM reply out, no browser/WebRTC). | |
Get real-time stream health metrics (bitrate, frame rate, latency). | |
Get detailed stream performance metrics (bitrate, latency, quality, error rates). | |
Get current subscription plan, billing cycle, and feature entitlements. | |
Get current billing-period usage (streaming minutes, storage, bandwidth). | |
Get current viewer count and viewer demographics for a stream or account-wide. | |
List all studio productions in the WAVE account. | |
List all streams in the WAVE account with pagination and status filtering. | |
Mark a moment in a stream as a highlight for later clipping. | |
Moderate a chat message in a live stream (block, flag, or allow). | |
Show, hide, or update an HTML5 graphics overlay on a production. | |
Start real-time captions/transcription on a stream. | |
Start a stream by ID, transitioning it to the active state. | |
Stop an active stream by ID. | |
Switch the live program output to a different camera/source in a Cloud Switcher session. | |
Run pen-extract's mechanical extraction pipeline on a .pen board. | |
Compose and validate a design-contract.json from an extract dir. | |
Measure a print image or rasterized plate SVG with loc-study. | |
Validate an existing design-contract.json against the schema. | |
Deprecated (use wave_compose): propose a WAVE media pipeline (captions/clips/dub/realtime/...) for a goal in plain language; never executes. | |
Propose a WAVE media pipeline for a goal in plain language. Calls the live gateway when a key is configured; falls back to a bundled snapshot otherwise. Never executes. |
For AI agents
Exposes the MCP tool wave-mcp-server over stdio.
The receipts
Every claim below is checked by npm run verify against the live repo or endpoint — a non-pass verdict fails the gate.
Claim | How it's verified |
Documentation surface is docs.wave.online/mcp | resolved by grepping |
Published npm package name is @wave-av/mcp-server | resolved by grepping |
wave_control_camera tool defined in src/tools/production.ts | resolved by grepping |
Exposes 25 MCP tools | resolved by grepping |
wave_voice_converse tool defined in src/tools/voice.ts | resolved by grepping |
wave_design_extract tool defined in src/tools/design.ts | resolved by grepping |
wave_design_contract tool defined in src/tools/design.ts | resolved by grepping |
wave_design_measure tool defined in src/tools/design.ts | resolved by grepping |
wave_design_contract_check tool defined in src/tools/design.ts | resolved by grepping |
wave_create_clip tool defined in src/tools/production.ts | resolved by grepping |
wave_create_production tool defined in src/tools/studio.ts | resolved by grepping |
wave_create_stream tool defined in src/tools/streams.ts | resolved by grepping |
wave_get_viewers tool defined in src/tools/analytics.ts | resolved by grepping |
wave_list_productions tool defined in src/tools/studio.ts | resolved by grepping |
wave_list_streams tool defined in src/tools/streams.ts | resolved by grepping |
wave_mark_highlight tool defined in src/tools/streams.ts | resolved by grepping |
wave_moderate_chat tool defined in src/tools/production.ts | resolved by grepping |
wave_show_graphic tool defined in src/tools/production.ts | resolved by grepping |
wave_start_captions tool defined in src/tools/production.ts | resolved by grepping |
wave_start_stream tool defined in src/tools/streams.ts | resolved by grepping |
wave_stop_stream tool defined in src/tools/streams.ts | resolved by grepping |
wave_get_stream_health tool defined in src/tools/streams.ts | resolved by grepping |
wave_get_stream_metrics tool defined in src/tools/streams.ts | resolved by grepping |
wave_get_subscription tool defined in src/tools/billing.ts | resolved by grepping |
wave_switch_camera tool defined in src/tools/production.ts | resolved by grepping |
wave_get_usage tool defined in src/tools/billing.ts | resolved by grepping |
Server connects via stdio transport (no network listener) | resolved by grepping |
wave.ask tool defined in src/tools/wave-ask/wave-ask.ts | resolved by grepping |
wave_compose tool defined in src/tools/wave-ask/wave-compose.ts | resolved by grepping |
Topics
wave · mcp · model-context-protocol · ai · streaming · tools
Built by WAVE Online, LLC · wave.online · Docs · LinkedIn
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wave-av/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server