WAVE MCP Server
OfficialThe WAVE MCP server exposes WAVE streaming APIs as MCP tools for AI coding assistants, enabling management across 5 domains:
Stream Management
List, create, start, and stop streams (with status filtering and pagination)
Create streams with protocol (
webrtc,srt,rtmp,hls), region, recording, and description optionsMonitor real-time stream health: bitrate, frame rate, and latency
Studio / Productions
List and create multi-camera studio productions (with layout options:
single,split,pip,grid,custom)Switch live program output between camera sources with transition effects (
cut,mix,wipe,dve)Control PTZ cameras: pan, tilt, zoom, focus, and recall/store presets
Show, hide, or update HTML5 graphics overlays on a production
Analytics
Get current viewer counts and optional geographic/device demographics per stream or account-wide
Retrieve detailed stream performance metrics (bitrate, latency, quality scores, error rates) over configurable time periods and granularity
Billing & Usage
View current subscription plan, billing cycle, and feature entitlements
Check billing-period consumption (streaming minutes, storage, bandwidth) with summary or detailed breakdowns
Production Tools
Create clips from recorded streams by time range, with optional export to TikTok, YouTube Shorts, Instagram Reels, or Twitter
Mark highlights in a live stream for later clipping (with optional AI confidence score)
Moderate live chat messages: block, flag, or allow with an optional reason
Start real-time captions/transcription using Deepgram, AssemblyAI, or Cohere
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WAVE MCP ServerCheck the health and viewer count of my active stream"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@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_..."
}
}
}
}Related MCP server: ASTRA MCP Server
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
Available Tools
24 toolswave.askA
Propose a WAVE flow (product + MCP tool + price shape) for a media-processing goal stated in plain language (captions/clips/dub/realtime/identity/x402/...). Reads only: checks a bundled, measured snapshot of the product/skill/tool manifests (knowledge/*.json) — never the live network. Never executes: calls no other tool, signs no payment, and makes no side-effecting or network request. Returns a proposal object for you to call yourself; always carries the literal executes: false and never a model field (no sourced Dispatch model catalog exists). See skills/wave-ask/SKILL.md for the full contract.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | The goal in plain language (e.g. "live captions from my mic"). Treated as untrusted text: never echoed into a system-prompt-adjacent field, never used to construct a URL or tool call directly — it only selects among a fixed, pre-grounded set of compositions. | |
| budgetUsd | No | Optional USD budget ceiling. Never used to compute or invent a price — only reorders which suggestion in `next[]` is surfaced first (a reminder to confirm the live 402 quote against it before calling). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so thoroughly: 'Reads only', 'never the live network', 'calls no other tool, signs no payment, and makes no side-effecting or network request', plus guaranteed `executes: false` and absence of a `model` field. It even points to SKILL.md for the full contract.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, followed by essential safety/behavior disclosures and a pointer to the full contract. Every sentence adds distinct information; it is dense but not padded, and the structure follows importance order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description supplies the proposal's key fields (product, MCP tool, price shape), its execution semantics, and its return contract (`executes: false`, no `model` field). The reference to SKILL.md covers edge details without bloating the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already richly explains `question` (untrusted, only selects fixed compositions) and `budgetUsd` (reorders suggestions, never invents a price). The tool description adds useful context about output shape but no additional per-parameter meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Propose a WAVE flow (product + MCP tool + price shape)' for a plain-language media-processing goal. It also distinguishes itself from execution siblings by stating 'never executes' and 'Returns a proposal object for you to call yourself.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly scopes when to use it: any media-processing goal stated in plain language where a WAVE flow proposal is needed. It does not explicitly name alternatives or state when not to use it, but the heavy emphasis on read-only, non-executing behavior makes the boundary with execution-focused siblings clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_control_cameraA
Send a control command to a managed camera (POST /v1/cameras/{id}/control). command selects the variant; supply only the fields that variant needs: set_iris/set_focus/set_zoom/set_gain use value; set_white_balance uses temperature+tint; set_shutter uses angle; set_audio_level uses channel+level; recall_preset uses preset_id; save_preset uses name+slot; start_recording/stop_recording/start_prerecord/autofocus_trigger take no extra fields
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Preset name for save_preset | |
| slot | No | Preset slot (1-20) for save_preset | |
| tint | No | Tint for set_white_balance | |
| angle | No | Shutter angle for set_shutter | |
| level | No | Audio level for set_audio_level | |
| value | No | Numeric value for set_iris/set_focus/set_zoom/set_gain | |
| channel | No | Audio channel for set_audio_level | |
| command | Yes | The camera command variant | |
| camera_id | Yes | The camera ID | |
| preset_id | No | Preset ID for recall_preset | |
| temperature | No | Color temperature for set_white_balance |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the transparency burden. It adds useful behavioral detail about which fields each command variant requires and which commands need no extra fields. However, it does not disclose side effects, permissions, camera-managed prerequisites, or response/error behavior, making it adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one dense, well-organized sentence that front-loads the purpose and endpoint, then uses semicolon-separated mappings for all command variants. Every piece of content contributes directly to correct invocation, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 11 parameters and 13 command variants, the description covers the essential combinatorial logic completely, including which commands require no extra fields. It omits return-value and error details, but those are not necessary for an agent to select and invoke the command correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a critical layer by mapping each `command` enum value to its required parameters, e.g., set_white_balance uses temperature+tint and set_shutter uses angle. This materially reduces ambiguity for the agent, though units and value ranges are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Send a control command to a managed camera'), gives the endpoint, and enumerates all supported command variants. It does not explicitly differentiate from the only other camera-related sibling, wave_switch_camera, but the purpose is specific enough to avoid major confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when sending control commands to managed cameras. It also gives practical guidance on selecting the correct parameter subset per command variant. It does not mention alternatives or exclusions, but the boundary against stream/design/production tools is reasonably evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_create_clipA
Create a clip from a recording (POST /v1/clips). source is a recording ID; in and, optionally, out/duration are time strings like "5s" or "2m"
| Name | Required | Description | Default |
|---|---|---|---|
| in | Yes | Clip start offset, a time string like "5s" or "2m" (0-10m) | |
| fit | No | Resize fit mode (default: contain) | |
| out | No | Clip end offset, a time string like "35s". Omit if using `duration` | |
| width | No | Output width in px (10-2000) | |
| height | No | Output height in px (10-2000) | |
| source | Yes | The recording ID to clip from | |
| formats | No | Output formats to generate (default: [mp4]) | |
| quality | No | Output quality lane (default: 720p) | |
| duration | No | Clip length, a time string like "30s" (1s-60s). Omit if using `out` | |
| visibility | No | Storage/delivery visibility (default: private) | |
| spritesheet_frames | No | Frame count for spritesheet output (1-120, default: 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It only says 'Create a clip' and gives parameter hints; it does not mention whether processing is asynchronous, what the response contains, side effects, or failure modes. This is a significant gap for a mutating POST operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the action and endpoint, then immediately clarifies the key parameter semantics. It is compact, readable, and easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is an 11-parameter tool with no annotations and no output schema. The rich schema covers invocation inputs well, but the description provides no information about return values, processing behavior, or post-invocation expectations. It is minimally viable but leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all parameters. The description adds the time-string pattern and notes that `out`/`duration` are optional, but these details are largely repeated in the schema descriptions. No new parameter semantics are provided beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Create a clip from a recording') and includes the exact endpoint (POST /v1/clips). It clearly names the input resource (recording) and the output object (clip), making its purpose unambiguous and distinct from sibling stream/production tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool to create clips from an existing recording ID, with `in` and optionally `out`/`duration` as time strings. It does not explicitly mention when-not-to-use or alternatives, but no sibling clip tool exists, so the usage context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_create_productionB
Create a new multi-camera production (POST /v1/productions)
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Production title | |
| layout | No | Initial layout mode (default: single) | |
| record | No | Enable recording for this production (default: false) | |
| stream_ids | No | Stream IDs to include as sources in the production | |
| description | No | Production description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for behavioral disclosure. It only says 'Create' and gives the HTTP method; it does not mention side effects, idempotency, permissions, validation behavior, or what happens on success/failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with the action and endpoint front-loaded. There is no wasted content or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus the fully documented schema is sufficient for basic invocation of a create operation, but there are gaps: no return-value information, no usage context, and no annotation-provided safety cues. It is adequate but not complete for a tool with five parameters and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds no additional meaning about the parameters, which is acceptable but does not raise the score above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create'), a specific resource ('multi-camera production'), and the exact endpoint ('POST /v1/productions'). This clearly distinguishes it from sibling tools like wave_create_stream and wave_list_productions by resource type and action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no exclusions, and no mention of prerequisites such as needing existing streams for stream_ids. The description only states what the tool does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_create_streamC
Create a new stream (POST /v1/streams) with a Cloudflare Stream live input
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Stream title | |
| privacy | No | Stream visibility (default: public) | |
| metadata | No | Arbitrary metadata to attach | |
| protocol | No | Ingest protocol (default: auto) | |
| recording | No | Recording configuration for this stream | |
| description | No | Stream description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, but it only conveys that this is a creation mutation. It does not state permissions, quota/cost implications, whether the stream starts immediately, or what the response contains (e.g., stream ID, ingest URL). The Cloudflare Stream live input detail adds some context but not enough to cover side effects or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler; the key verb, resource, and endpoint appear early. The Cloudflare Stream live input detail is the only extra context and it earns its place. This is appropriately front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with no annotations and no output schema, the description is too thin: it omits what the created stream looks like, what is returned, and how creation relates to starting the stream. The schema covers parameter formats well, but the tool-level behavior and downstream workflow are missing. A minimally complete description would at least mention that creation is separate from starting and returns a stream identifier or ingest credentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all six parameters with descriptions, enums, and defaults, so schema description coverage is 100%. The description itself adds no parameter-level meaning, but per the high-coverage baseline, a score of 3 is appropriate. No parameter semantics are sufficiently missing to lower the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a create action on a stream resource and includes the REST endpoint, so the agent knows exactly what operation this is. It is not tautological and the verb 'create' distinguishes it from list/start/stop siblings, but it does not explicitly contrast itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no conditions for when to create a stream versus listing, starting, or stopping one, and it names no alternatives. The verb implies creation is the intended use, but there are no prerequisites, exclusions, or routing cues. The agent is left to infer context from the tool name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_design_contractA
Compose a design-contract.json from an already-extracted pen-extract dir, then validate it against the schema + acceptance-tests catalogue. Returns the validator line, key counts, and the written path.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output contract file (default: <extract>/design-contract.json) | |
| extract | Yes | Path to a <board>.extract/ dir written by wave_design_extract |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool writes a contract file, validates against schema and acceptance-tests, and returns specific outputs (validator line, key counts, written path). It does not mention overwrite behavior or failure handling if validation fails, but the core behavior is clearly conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence with no filler. It front-loads the primary action, then adds the validation step and return values, earning its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple two-parameter tool with no output schema, the description covers purpose, precondition, processing, validation, and return values. It could more clearly state what happens if validation fails or whether an existing output file is overwritten, but the essential context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'extract' and 'out' have meaningful descriptions and defaults in the input schema. The tool description adds no new parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Compose') and resource ('design-contract.json') plus the validation step, making the tool's function concrete. It also references an 'already-extracted pen-extract dir', which distinguishes it from extraction tools like wave_design_extract and check-only tools like wave_design_contract_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'already-extracted' clearly signals that this tool is meant to be used after wave_design_extract, giving useful positional context. It does not explicitly name alternatives or state when not to use it, so it falls short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_design_contract_checkA
Validate an existing design-contract.json against the schema + acceptance-tests catalogue, no compose.
| Name | Required | Description | Default |
|---|---|---|---|
| contract | Yes | Path to a design-contract.json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. 'Validate' suggests a read-only check, and 'no compose' is a useful behavioral disclosure that prevents the agent from expecting composition side effects. Still, the description does not disclose what happens on validation failure, whether the tool returns a structured report, or whether any state is modified, leaving notable behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the core action, target resource, and validation criteria without any filler. Every word earns its place, and the 'no compose' caveat is packed in efficiently. This is an ideal length for a simple one-parameter validation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and low complexity, the description says enough to select and invoke it, but it omits return behavior entirely. Since there is no output schema, the agent cannot know whether the tool reports success/failure, outputs a detailed report, or throws an exception. The absence of this information is a real gap for a validation tool, though the tool is otherwise simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds little beyond the schema: it says the file must be 'existing', which slightly clarifies permissibility, and hints at the kind of file (design-contract.json), but it does not elaborate on path format, validation behavior, or output. The parameter semantics remain essentially as documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Validate' against a clearly identified resource ('existing design-contract.json') and names the acceptance-tests catalogue and schema as validation criteria. The 'no compose' clause helps differentiate it from a possible create/compose workflow. This is unambiguous and distinguishes the tool from likely siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'existing design-contract.json' implies it should be used for pre-existing contracts rather than creating new ones, and 'no compose' tells the agent this tool will not run a compose step. However, it does not explicitly name any alternative sibling or state when to choose this tool over wave_design_contract, wave_design_extract, or wave_design_measure. Usage is implied, not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_design_extractB
Run @wave-av/pen-extract's all extraction pipeline on a .pen board (plates/tokens/geometry/copy/components/receipts/frames/manifest). Returns the manifest.json (files, sha256s, owed).
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output extract dir (default: <pen-dir>/<basename>.extract) | |
| pen | Yes | Path to the .pen board file (must be under $HOME/wave-av or the OS temp dir) | |
| delta | No | Reference board's already-extracted dir; writes season-delta.json into this run's --out |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It clearly discloses the main behavior (full extraction pipeline) and the return value (manifest.json with files, sha256s, owed), but it omits side effects such as writing the extract directory or the potential season-delta.json output, and gives no indication of whether extraction is non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the action and resource, lists the extracted components, and states the return value. There is no filler or duplication of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus the schema covers the main action, required input, optional parameters, and return value, which is enough for a basic invocation. However, the lack of usage context relative to sibling design tools and the under-disclosed file-writing side effects leave noticeable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented. The description adds no new parameter semantics, but it names the underlying package and pipeline, so it neither improves nor conflicts with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete action ('Run ... extraction pipeline') on a specific resource (a .pen board) and enumerates what the pipeline produces: plates/tokens/geometry/copy/components/receipts/frames/manifest. This makes the tool's purpose reasonably distinct from the design-contract/measure siblings, though it does not explicitly contrast itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus sibling tools such as wave_design_contract, wave_design_measure, or wave_design_contract_check. The description implies the input is a .pen board but does not state intended use cases, prerequisites, or exclusions that would help an agent decide between alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_design_measureA
Run @wave-av/loc-study's measure on an image (masked by geometry.json when given) or a rasterized plate SVG, optionally cropped to a region. Returns the measurement JSON (bokashi/keyblock/palette/composition).
| Name | Required | Description | Default |
|---|---|---|---|
| image | No | Path to the image to measure (required unless `plate` is given) | |
| plate | No | Path to a plate SVG to rasterize and measure keyblock on | |
| region | No | Crop region as `x,y,w,h` (fractions or pixels) | |
| geometry | No | pen-extract geometry.json — masks occluder rects out of the measurement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden and does a good job: it discloses the external package/command, conditional geometry masking, plate rasterization, optional cropping, and the return payload. It does not explicitly confirm a read-only/no-side-effect profile, but the wording 'measure' and 'Returns the measurement JSON' strongly imply a non-mutating analysis tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence conveys the core command, input options, preprocessing behavior, and output. There is no filler or redundancy; the content is front-loaded and every phrase contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus schema covers all parameters and, because there is no output schema, it helpfully lists the returned JSON categories. It could be slightly more complete by explicitly stating that at least one of image/plate must be supplied and what happens if both are given, but the overall picture is sufficient for normal invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents all four parameters. The description adds a high-level view of how the parameters combine (image/plate alternative, geometry masking, crop region) but does not add new syntax or formats beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Run @wave-av/loc-study's measure') and the target resource (image or plate SVG), and it names the result ('measurement JSON (bokashi/keyblock/palette/composition)'). It is clear and not tautological, but it does not explicitly contrast itself with sibling tools such as wave_design_extract or wave_design_contract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: whenever a measurement JSON from an image or plate is needed, with options for cropping and geometry masking. It does not provide explicit when-not-to-use guidance or distinguish this tool from wave_design_extract or wave_design_contract, so usage is left mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_get_stream_healthA
Get the current status document for a stream (GET /v1/streams/{id}/status): connection state, viewer count, and quality indicators
| Name | Required | Description | Default |
|---|---|---|---|
| stream_id | Yes | The UUID of the stream to check |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of conveying behavior. It communicates that this is a read-only GET operation returning a current snapshot, which is transparent for a simple health-check tool. It does not mention potential errors, permissions, or latency characteristics, but those are less critical for a read-only status endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one compact, front-loaded sentence. It states the action, the resource, the endpoint, and the key response fields without any filler or repetition, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with no output schema, the description adequately covers what the tool returns by listing connection state, viewer count, and quality indicators. It could add explicit notes about read-only behavior or error cases, but the endpoint, parameter, and response contents are sufficiently clear for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the stream_id property is already documented as 'The UUID of the stream to check.' The tool description adds no additional meaning about the parameter, so the baseline score of 3 is appropriate because the schema already handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a GET operation on a stream status resource and lists the returned contents (connection state, viewer count, quality indicators). It does not explicitly name or differentiate sibling tools like wave_get_stream_metrics or wave_get_viewers, but the 'status document' framing plus endpoint path makes the purpose distinct enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Get the current status document' implies this tool is for checking a stream's live health, which is a clear context. However, there is no explicit guidance on when to prefer this over wave_get_stream_metrics, wave_get_viewers, or wave_list_streams, nor any exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_get_stream_metricsA
Get analytics for a single stream (GET /v1/streams/{id}/analytics): views, watch time, and geographic/device breakdown over an optional date range
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Range end (ISO 8601 timestamp), optional | |
| from | No | Range start (ISO 8601 timestamp), optional | |
| stream_id | Yes | The UUID of the stream |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It explicitly discloses the HTTP method GET (a read-only operation), the specific endpoint, and the return content domains (views, watch time, geographic/device breakdown over a date range). It does not mention default date-range behavior or pagination, but this is a relatively lightweight analytics read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, front-loading the action and scope before enumerating the returned metrics and the optional date range. Every element contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with a fully documented schema and no output schema, the description is largely complete: it explains the resource, the metrics returned, and the optional date filter. Minor gaps such as the default time window when from/to are omitted are not addressed, but nothing essential to selecting the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented (stream_id UUID, optional from/to ISO 8601 timestamps). The description adds only the phrase 'optional date range', which restates the schema's notion of the from/to parameters rather than adding new semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Get analytics') and a specific resource ('a single stream'), reinforced by the endpoint GET /v1/streams/{id}/analytics and the listed metrics. It is distinguishable from broader tools like wave_list_streams, though it does not explicitly contrast with sibling analytics tools such as wave_get_viewers or wave_get_usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope 'for a single stream' and 'optional date range' imply when this tool is appropriate, and the metrics listed (views, watch time, breakdown) indicate the data domain. There is no explicit guidance on when to prefer an alternative tool or when this tool is not appropriate, so usage direction remains implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_get_subscriptionA
Get the current billing account (GET /v1/billing): plan, Stripe customer status, and subscription state
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'GET' and 'Get', which implies a read-only, non-mutating operation. However, with no annotations provided, it does not disclose authentication requirements, possible absence of a billing account, or error behavior, so the behavioral transparency is only partially covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that leads with the action and resource, then gives the endpoint and expected data. Every element is useful and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description adequately conveys what the call returns. It could be more complete by noting whether the billing account may be absent or require setup, but for simple invocation context it is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty, so there is nothing to document. The description adds value by indicating the fields the response contains, helping the agent understand what the tool returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Get the current billing account') and enumerates what it returns: plan, Stripe customer status, and subscription state. This clearly separates it from siblings like wave_get_usage or wave_get_viewers, which cover different domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear: an agent should call this tool when it needs billing or subscription details for the current account. It does not explicitly exclude alternative tools, but the billing-specific resource and returned fields make the appropriate context evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_get_usageA
Get billed usage for a date range (GET /v1/billing/usage), defaulting to the current month
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Range end (YYYY-MM-DD), default: today | |
| from | No | Range start (YYYY-MM-DD), default: start of current month |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It reveals the HTTP GET method, implying a read-only operation, and mentions the default current-month behavior. However, it does not describe authentication needs, response contents, timezone handling, or whether the usage data is aggregated or itemized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that names the operation, resource, endpoint, and default behavior without any wasted words. It is immediately scannable and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with two optional and fully documented parameters, the description is largely sufficient. The only gap is that there is no output schema and the description does not clarify what the response looks like, but this does not block correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both `from` and `to` documented including defaults and date format. The description's 'defaulting to the current month' restates what the schema already says, adding no new parameter semantics beyond the endpoint context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation as retrieving billed usage for a date range, with a specific endpoint and a default behavior. It distinguishes itself from siblings like wave_get_subscription and wave_get_viewers by naming a unique billing resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when billed usage data for a date range is needed, and it notes that omitting dates defaults to the current month. It does not explicitly name alternatives or exclusion conditions, but no sibling is a direct substitute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_get_viewersA
Get account-wide viewer engagement analytics (GET /v1/analytics/engagement) over an optional date range
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Range end (ISO 8601 timestamp), optional | |
| from | No | Range start (ISO 8601 timestamp), optional |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the HTTP method GET, which indicates a read-only operation, and the date-range filtering behavior. However, it does not mention authentication, rate limits, pagination, or the shape of the response, leaving notable operational details unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one tight sentence that leads with the action, specifies scope, includes the endpoint, and notes the optional date range. Every word provides value and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with two optional, fully documented parameters, the description is largely sufficient: it states exactly what is retrieved and the available filter. The lack of an output schema means the response structure is not described, which prevents a 5, but the core invocation details are complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's 'optional date range' adds minimal grouping context for from/to, but the schema already documents the parameters and their optionality. There is no deeper semantic information beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), resource ('viewer engagement analytics'), and scope ('account-wide'), and even includes the endpoint (GET /v1/analytics/engagement). It is clear and distinct from sibling tools like wave_get_stream_metrics, but does not explicitly name or differentiate a sibling, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'account-wide' implies when this tool should be used versus per-stream alternatives, and 'optional date range' hints at parameter usage. However, there is no explicit guidance about when to prefer this over siblings like wave_get_usage or wave_get_stream_metrics, no exclusions, and no mention of prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_list_productionsB
List multi-camera productions in your WAVE account (GET /v1/productions)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of productions to return (default 25) | |
| offset | No | Number of productions to skip for pagination (default 0) | |
| status | No | Filter by production status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it only reveals that this is a GET (read) operation scoped to the account. It does not disclose pagination behavior, ordering, authentication needs, or what happens with empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence delivers the verb, resource, and scope with zero filler. The API endpoint inclusion is a useful bonus that does not bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with fully documented optional parameters, the definition is functional, but with no output schema and no annotations, the description leaves the agent without expectations about the response shape or how this tool fits into the production lifecycle. Acceptable yet incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — all three parameters (limit, offset, status) are already documented with types, ranges, defaults, and the status enum. The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('multi-camera productions'), and a scope ('in your WAVE account'), plus the API endpoint. The resource type clearly distinguishes it from siblings like wave_list_streams and wave_create_production.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as wave_list_streams or wave_create_production. The tool name implies listing productions, but no exclusions, prerequisites, or selection conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_list_streamsA
List streams in your WAVE account (GET /v1/streams), with pagination and status filtering
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of streams to return (1-100, default 50) | |
| offset | No | Number of streams to skip for pagination (default 0) | |
| status | No | Filter by stream status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that this is a GET endpoint, implying a read-only operation, and mentions pagination and status filtering. However, it does not disclose response shape, ordering, authentication needs, rate limits, or any other behavioral details beyond the endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence contains the core purpose and the API endpoint, then the supporting modifiers (pagination, status filtering). Every part is useful and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no required parameters and fully documented parameters, the description is largely complete. It does not describe the return payload since no output schema exists, but the basic purpose and filtering behavior are enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage for all three parameters (limit, offset, status). The description's mention of 'pagination and status filtering' adds no meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List streams'), the resource ('streams in your WAVE account'), and the exact API endpoint (GET /v1/streams). This is specific enough to distinguish it from sibling tools like wave_list_productions or wave_get_stream_health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it: whenever an agent needs to list streams in the WAVE account. However, it does not explicitly contrast it with alternatives, mention when not to use it, or note exclusions such as listings scoped to productions or other resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_mark_highlightA
Mark a moment in a stream as a highlight for later clipping (POST /v1/streams/{id}/highlights)
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Label for the highlight | |
| stream_id | Yes | The stream ID | |
| timestamp | No | ISO 8601 timestamp of the highlight moment (default: now) | |
| confidence | No | Confidence score (0-1, for AI-detected highlights) | |
| duration_seconds | No | Duration of the highlighted moment, in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It does reveal that this is a POST request and marks a highlight, but it does not mention side effects, reversibility, auth requirements, idempotency, whether multiple highlights per stream are allowed, or what the API returns. This is a meaningful transparency gap for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that states the action, resource, purpose, and endpoint with no filler or redundancy. All content is relevant and front-loaded, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input schema fully documents the parameters, and the description provides the core action and endpoint. However, with no output schema and no annotations, the description does not clarify expected return values, failure modes, or how this relates to the wave_create_clip workflow. It is adequate for basic invocation but leaves uncertainty around post-invocation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters already have descriptive definitions in the input schema (100% coverage), including stream_id, timestamp, label, confidence, and duration_seconds. The description itself adds no parameter-level meaning beyond the endpoint path variable corresponding to stream_id, so the schema carries the load and a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Mark'), a specific resource ('a moment in a stream'), and a clear purpose ('as a highlight for later clipping'). It also includes the exact POST endpoint, which makes the tool's function unambiguous and distinguishes it from the sibling wave_create_clip by indicating this only marks for later clipping rather than creating a clip directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for later clipping' implies this tool is used to save a marker before a clip is created, but there is no explicit statement of when to use it versus alternatives such as wave_create_clip. No exclusions, prerequisites, or direct references to sibling tools are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_moderate_chatA
Moderate a chat message in a live stream (POST /v1/moderate): block, flag, or allow it
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Moderation action | |
| reason | No | Reason for moderation action | |
| stream_id | Yes | The stream ID | |
| message_id | Yes | The chat message ID to moderate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden, but it only states that messages can be blocked, flagged, or allowed. It does not disclose whether actions are reversible, whether permission is required, what side effects occur, or what response the caller receives.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one efficient sentence that front-loads the core action, then provides the endpoint and the three possible actions. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutating tool with no output schema and no annotations, but the description stops at the action itself. It omits the result of the call, error/edge-case behavior, and the consequence of each moderation action, leaving the agent under-informed about what happens after invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented. The description's 'block, flag, or allow' phrase adds no new meaning beyond the action enum, but it does helpfully summarize the only non-obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Moderate'), names the resource ('chat message in a live stream'), and enumerates the allowed outcomes ('block, flag, or allow'). It also includes the endpoint, making the tool's role unambiguous relative to the long sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use when a live-stream chat message needs a moderation decision. It doesn't explicitly name when not to use it or point to alternatives, but no sibling tool obviously overlaps, so the lack of exclusions is not a notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_show_graphicA
Show or hide a graphics overlay in a production (POST /v1/productions/{id}/overlay)
| Name | Required | Description | Default |
|---|---|---|---|
| visible | Yes | Whether the overlay should be visible | |
| overlay_id | Yes | The overlay ID (1-100 chars) | |
| production_id | Yes | The production ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It does disclose that this is a state-changing operation (show/hide) and includes the POST method, which is useful. However, it does not mention side effects, prerequisites, idempotency, or error behavior, which would be valuable for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core action and context, and includes the endpoint without any filler. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter mutation tool with complete schema descriptions, the description is largely sufficient to invoke the tool correctly. It could optionally mention the response or prerequisites, but the absence of an output schema and the simplicity of the operation make those gaps minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers 100% of parameters with meaningful descriptions, so the baseline is 3. The description adds no additional parameter-level detail beyond what the schema provides, other than implied linkage through the endpoint path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Show or hide'), the resource ('graphics overlay'), and the context ('in a production'), and reinforces it with the exact endpoint. This is specific enough to distinguish the tool from siblings focused on design, streaming, camera control, or production management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool—whenever overlay visibility needs to be changed—but it does not explicitly state when not to use it or mention alternatives. The context is clear, but there is no explicit routing guidance relative to other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_start_captionsA
Transcribe an audio clip and optionally run a fast-LLM step over the transcript (POST /v1/live/pipeline, multipart). This processes ONE provided audio chunk through WAVE's live pipeline — it does not attach a persistent caption feed to a live stream. Requires the account's live pipeline feature to be enabled; a 404 means it is not armed for this account
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Fast-LLM step to run over the transcript (default: summarize) | |
| task | No | Caption task (default: transcribe) | |
| model | No | Transcription model (default: whisper-large-v3-turbo; translate forces whisper-large-v3) | |
| filename | No | Filename hint for the audio (default: "audio.wav") | |
| language | No | ISO 639 language hint for transcription (transcribe task only) | |
| llm_model | Yes | Fast LLM model ID to run the pipeline step | |
| stream_id | No | Client correlation ID for this stream/session (letters, digits, . _ : -, 1-128 chars) | |
| max_tokens | No | Max tokens for the LLM step (default: 256) | |
| instruction | No | Custom instruction for mode=custom | |
| audio_base64 | Yes | Base64-encoded audio bytes to transcribe (max 25MB decoded) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does so well: it discloses the one-shot nature, the non-persistent behavior, the endpoint/multipart detail, and the 404 meaning when the feature is not armed. It does not mention response format or potential side effects like usage costs, but the core behavioral traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The main purpose is front-loaded, the scope constraint and non-persistent clarification come immediately after, and the operational prerequisite/error semantic is compactly appended.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no annotations and no output schema, the description covers the key operational constraints: single chunk, non-persistent feed, feature prerequisite, and 404 diagnosis. It is complete enough to guide selection and invocation, though it omits explicit return-value expectations and sibling comparisons.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters. The description adds context by framing the call as processing one audio chunk and running a fast-LLM step, which helps with audio_base64 and llm_model, but it does not go beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Transcribe') and resource ('an audio clip') and immediately clarifies the optional fast-LLM step over the transcript. It also distinguishes itself from a persistent caption feed, which is important given the 'captions' name and sibling streaming tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it processes exactly ONE provided audio chunk and explicitly says it does not attach a persistent caption feed, so an agent knows not to use it for ongoing live-stream captioning. It also provides a prerequisite (live pipeline feature enabled) and explains the 404 failure mode, but it does not name specific alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_start_streamA
Start a stream by its ID (POST /v1/streams/{id}/start)
| Name | Required | Description | Default |
|---|---|---|---|
| stream_id | Yes | The UUID of the stream to start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of explaining behavior. It only states the operation and endpoint but does not disclose preconditions, side effects, whether the stream must be in a stopped state, error behaviors, or if the operation is idempotent. For a state-changing action, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, directly relevant sentence that front-loads the action and includes the API path. Every word earns its place, and there is no superfluous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one well-documented parameter, no output schema, no annotations), the description is minimally adequate for selecting and invoking the tool. However, it omits behavioral context such as the stream's required state before starting and what a successful start means, which an agent would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single parameter with a full description, format, and pattern. The tool description adds no additional semantic meaning beyond the endpoint context, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Start a stream') and the resource ('by its ID'), and includes the exact HTTP endpoint for precision. This distinguishes it from sibling tools such as wave_stop_stream, wave_create_stream, and wave_list_streams without needing to open schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action to use this tool is implied by the name and description: call it when you want to start an existing stream. However, there is no explicit guidance about when not to use it, nor any reference to alternatives like wave_create_stream for new streams or wave_stop_stream for stopping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_stop_streamB
Stop an active stream by its ID (POST /v1/streams/{id}/stop)
| Name | Required | Description | Default |
|---|---|---|---|
| stream_id | Yes | The UUID of the stream to stop |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it only states the action and endpoint. It does not disclose whether stopping is idempotent, what happens to the stream's state, whether the operation can be reversed by starting again, or what errors occur for an unknown or already-stopped stream.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence that states the verb, object, and endpoint with no filler. It is appropriately sized for a one-parameter operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the core action and parameter are covered, but the lack of annotations, no output schema, and no behavioral notes leave gaps around expected results and error semantics. The description is minimal but not grossly insufficient for a straightforward stop operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the schema already names stream_id as 'The UUID of the stream to stop' with format and pattern constraints. The description adds only the 'active' qualifier, which is marginal context, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Stop' with a clear resource ('an active stream') and the required identifier, and adds the exact HTTP endpoint. It is clearly distinct from siblings like wave_start_stream or wave_list_streams by action, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'active' implies this is only applicable to currently running streams, and the stop action itself indicates when it is needed. However, there is no explicit guidance about when not to use it, how to confirm a stream is active, or which sibling alternatives might be relevant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_switch_cameraC
Switch the program or preview bus to a different camera index in a multi-camera production (POST /v1/productions/{id}/camera)
| Name | Required | Description | Default |
|---|---|---|---|
| bus | Yes | Which bus to switch | |
| transition | No | Transition type (default: cut) | |
| camera_index | Yes | Camera index to switch to (0-15) | |
| production_id | Yes | The production ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Switch' and gives the endpoint, without describing side effects, immediacy of the switch, permission requirements, reversibility, or how transitions actually behave. This is a significant gap for a state-changing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. The parenthetical endpoint adds orientation, and every part of the text earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and a state-changing operation, the description should provide more context about response behavior, side effects, and when to prefer this over sibling tools. The schema covers parameters well, but the definition as a whole is not contextually complete for an agent to confidently invoke it in all appropriate situations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already explained in the input schema. The description adds no additional parameter-level meaning beyond naming the operation, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Switch'), the resource ('program or preview bus'), and the target ('camera index') in a multi-camera production. It is specific enough to differentiate from broader siblings like wave_control_camera, though it does not explicitly name or contrast siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as wave_control_camera, nor any prerequisites or exclusions. The phrase 'in a multi-camera production' implies some context, but does not help an agent decide between this and related camera-control tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wave_voice_converseA
Drive a full headless conversation with the WAVE voice agent: bind the agent to a room, send a WAV of the caller's speech (16-bit LE 48 kHz PCM, mono or stereo), and receive the agent's spoken reply as raw 16-bit LE 48 kHz stereo PCM written to outPath. No browser, no WebRTC.
| Name | Required | Description | Default |
|---|---|---|---|
| room | Yes | Room id the agent is bound to | |
| outPath | Yes | Path to write the agent's reply PCM to (raw, no WAV header) | |
| audioPath | Yes | Path to the input WAV (16-bit LE 48 kHz PCM) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it does this well by stating the input format, the output format, the side effect of binding the agent to a room, and the headless execution model. It does not mention file overwrites, auth requirements, or blocking/timeout behavior, but the core behavioral contract is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences carry all essential information with no filler. The main behavior is front-loaded, followed by the format details, and the closing 'No browser, no WebRTC' crisply sets expectations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, the description covers the inputs, the output destination, and the environment constraint. It does not explain return semantics, error conditions, or whether the call blocks until the reply is ready, but the primary contractual details an agent needs to invoke it are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value by specifying the exact audio formats: 16-bit LE 48 kHz PCM input (mono or stereo) and raw 16-bit LE 48 kHz stereo PCM output. This goes beyond the terse schema descriptions and helps an agent prepare correct inputs and interpret the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Drive') and names a concrete resource (the WAVE voice agent), then spells out the exact flow: bind to a room, send a caller WAV, receive a spoken reply PCM. This clearly distinguishes it from the sibling tools, none of which describe audio-in/audio-out headless conversation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly establishes the context: use this for a headless conversation with the WAVE voice agent, with 'No browser, no WebRTC' as an explicit boundary. It does not name alternative sibling tools or say when not to use it, but the context is specific enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
23 tool updates
v0.3.0- Changed
wave_control_camera19 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / actionRemoved value: -{ - "description": "Camera control action", - "enum": [ - "move", - "zoom", - "focus", - "recall_preset", - "store_preset" - ], - "type": "string" -} - added
Input schema / properties / angleAdded value: +{ + "description": "Shutter angle for set_shutter", + "type": "number" +} - added
Input schema / properties / camera_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - added
Input schema / properties / channelAdded value: +{ + "description": "Audio channel for set_audio_level", + "type": "number" +} - added
Input schema / properties / commandAdded value: +{ + "description": "The camera command variant", + "enum": [ + "set_iris", + "set_focus", + "set_zoom", + "set_white_balance", + "set_gain", + "set_shutter", + "start_recording", + "stop_recording", + "start_prerecord", + "autofocus_trigger", + "set_audio_level", + "recall_preset", + "save_preset" + ], + "type": "string" +} - added
Input schema / properties / levelAdded value: +{ + "description": "Audio level for set_audio_level", + "type": "number" +} - added
Input schema / properties / nameAdded value: +{ + "description": "Preset name for save_preset", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / panRemoved value: -{ - "description": "Pan speed (-1 to 1)", - "maximum": 1, - "minimum": -1, - "type": "number" -} - changed
Input schema / properties / preset_id / descriptionPrevious value: -"Preset ID for recall/store"New value: +"Preset ID for recall_preset" - added
Input schema / properties / preset_id / formatAdded value: +"uuid" - added
Input schema / properties / preset_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - added
Input schema / properties / slotAdded value: +{ + "description": "Preset slot (1-20) for save_preset", + "maximum": 20, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / temperatureAdded value: +{ + "description": "Color temperature for set_white_balance", + "type": "number" +} - removed
Input schema / properties / tiltRemoved value: -{ - "description": "Tilt speed (-1 to 1)", - "maximum": 1, - "minimum": -1, - "type": "number" -} - added
Input schema / properties / tintAdded value: +{ + "description": "Tint for set_white_balance", + "type": "number" +} - added
Input schema / properties / valueAdded value: +{ + "description": "Numeric value for set_iris/set_focus/set_zoom/set_gain", + "type": "number" +} - removed
Input schema / properties / zoomRemoved value: -{ - "description": "Zoom speed (-1 to 1)", - "maximum": 1, - "minimum": -1, - "type": "number" -} - changed
Input schema / requiredPrevious value: -[ - "camera_id", - "action" -]New value: +[ + "camera_id", + "command" +]
- Changed
wave_create_clip18 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / durationAdded value: +{ + "description": "Clip length, a time string like \"30s\" (1s-60s). Omit if using `out`", + "type": "string" +} - removed
Input schema / properties / end_timeRemoved value: -{ - "description": "Clip end time in seconds", - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / export_toRemoved value: -{ - "description": "Social platforms to auto-export to", - "items": { - "enum": [ - "tiktok", - "youtube_shorts", - "instagram_reels", - "twitter" - ], - "type": "string" - }, - "type": "array" -} - added
Input schema / properties / fitAdded value: +{ + "description": "Resize fit mode (default: contain)", + "enum": [ + "contain", + "cover", + "scale-down" + ], + "type": "string" +} - added
Input schema / properties / formatsAdded value: +{ + "description": "Output formats to generate (default: [mp4])", + "items": { + "enum": [ + "mp4", + "spritesheet", + "m4a", + "frame" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / heightAdded value: +{ + "description": "Output height in px (10-2000)", + "maximum": 2000, + "minimum": 10, + "type": "integer" +} - added
Input schema / properties / inAdded value: +{ + "description": "Clip start offset, a time string like \"5s\" or \"2m\" (0-10m)", + "type": "string" +} - added
Input schema / properties / outAdded value: +{ + "description": "Clip end offset, a time string like \"35s\". Omit if using `duration`", + "type": "string" +} - added
Input schema / properties / qualityAdded value: +{ + "description": "Output quality lane (default: 720p)", + "enum": [ + "720p", + "1080p", + "4k" + ], + "type": "string" +} - added
Input schema / properties / sourceAdded value: +{ + "description": "The recording ID to clip from", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / spritesheet_framesAdded value: +{ + "description": "Frame count for spritesheet output (1-120, default: 30)", + "maximum": 120, + "minimum": 1, + "type": "integer" +} - removed
Input schema / properties / start_timeRemoved value: -{ - "description": "Clip start time in seconds", - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / stream_idRemoved value: -{ - "description": "The stream ID to clip from", - "format": "uuid", - "type": "string" -} - removed
Input schema / properties / titleRemoved value: -{ - "description": "Clip title", - "maxLength": 255, - "type": "string" -} - added
Input schema / properties / visibilityAdded value: +{ + "description": "Storage/delivery visibility (default: private)", + "enum": [ + "public", + "private" + ], + "type": "string" +} - added
Input schema / properties / widthAdded value: +{ + "description": "Output width in px (10-2000)", + "maximum": 2000, + "minimum": 10, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "stream_id", - "start_time", - "end_time" -]New value: +[ + "source", + "in" +]
- Changed
wave_create_production2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / stream_ids / items / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
wave_create_stream10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / description / maxLengthPrevious value: -2000New value: +5000 - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": {}, + "description": "Arbitrary metadata to attach", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Input schema / properties / privacyAdded value: +{ + "description": "Stream visibility (default: public)", + "enum": [ + "public", + "private" + ], + "type": "string" +} - changed
Input schema / properties / protocol / descriptionPrevious value: -"Streaming protocol (default: webrtc)"New value: +"Ingest protocol (default: auto)" - changed
Input schema / properties / protocol / enumPrevious value: -[ - "webrtc", - "srt", - "rtmp", - "hls" -]New value: +[ + "webrtc", + "srt", + "rtmp", + "auto" +] - removed
Input schema / properties / recordRemoved value: -{ - "description": "Enable recording for this stream (default: false)", - "type": "boolean" -} - added
Input schema / properties / recordingAdded value: +{ + "description": "Recording configuration for this stream", + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" +} - removed
Input schema / properties / regionRemoved value: -{ - "description": "Preferred ingest region (e.g., us-east-1, eu-west-1)", - "type": "string" -} - changed
Input schema / properties / title / maxLengthPrevious value: -255New value: +200
- Added
wave_design_contract - Added
wave_design_contract_check - Added
wave_design_extract - Added
wave_design_measure - Changed
wave_get_stream_health2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / stream_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
wave_get_stream_metrics6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / fromAdded value: +{ + "description": "Range start (ISO 8601 timestamp), optional", + "type": "string" +} - removed
Input schema / properties / granularityRemoved value: -{ - "description": "Data point granularity (default: 5m)", - "enum": [ - "1m", - "5m", - "1h", - "1d" - ], - "type": "string" -} - removed
Input schema / properties / periodRemoved value: -{ - "description": "Time period for metrics aggregation (default: 24h)", - "enum": [ - "1h", - "6h", - "24h", - "7d", - "30d" - ], - "type": "string" -} - added
Input schema / properties / stream_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - added
Input schema / properties / toAdded value: +{ + "description": "Range end (ISO 8601 timestamp), optional", + "type": "string" +}
- Changed
wave_get_usage5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / breakdownRemoved value: -{ - "description": "Level of usage detail (default: summary)", - "enum": [ - "summary", - "daily", - "by_stream" - ], - "type": "string" -} - added
Input schema / properties / fromAdded value: +{ + "description": "Range start (YYYY-MM-DD), default: start of current month", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - removed
Input schema / properties / periodRemoved value: -{ - "description": "Billing period to query (default: current)", - "enum": [ - "current", - "previous" - ], - "type": "string" -} - added
Input schema / properties / toAdded value: +{ + "description": "Range end (YYYY-MM-DD), default: today", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +}
- Changed
wave_get_viewers5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / fromAdded value: +{ + "description": "Range start (ISO 8601 timestamp), optional", + "type": "string" +} - removed
Input schema / properties / include_demographicsRemoved value: -{ - "description": "Include geographic and device breakdown (default: false)", - "type": "boolean" -} - removed
Input schema / properties / stream_idRemoved value: -{ - "description": "Stream ID to get viewers for. Omit for account-wide totals.", - "format": "uuid", - "type": "string" -} - added
Input schema / properties / toAdded value: +{ + "description": "Range end (ISO 8601 timestamp), optional", + "type": "string" +}
- Changed
wave_list_productions4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of productions to return (1-100, default 25)"New value: +"Maximum number of productions to return (default 25)" - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - changed
Input schema / properties / status / enumPrevious value: -[ - "draft", - "live", - "ended", - "all" -]New value: +[ + "setup", + "rehearsal", + "live", + "paused", + "ended" +]
- Changed
wave_list_streams4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of streams to return (1-100, default 25)"New value: +"Maximum number of streams to return (1-100, default 50)" - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - changed
Input schema / properties / status / enumPrevious value: -[ - "active", - "idle", - "error", - "all" -]New value: +[ + "idle", + "live", + "ended" +]
- Changed
wave_mark_highlight4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / duration_secondsAdded value: +{ + "description": "Duration of the highlighted moment, in seconds", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / stream_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - added
Input schema / properties / timestampAdded value: +{ + "description": "ISO 8601 timestamp of the highlight moment (default: now)", + "type": "string" +}
- Changed
wave_moderate_chat2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / stream_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
wave_show_graphic8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / actionRemoved value: -{ - "description": "Action to perform", - "enum": [ - "show", - "hide", - "update" - ], - "type": "string" -} - removed
Input schema / properties / dataRemoved value: -{ - "additionalProperties": {}, - "description": "Data bindings for the graphic template", - "type": "object" -} - removed
Input schema / properties / graphic_idRemoved value: -{ - "description": "The graphic template ID", - "type": "string" -} - added
Input schema / properties / overlay_idAdded value: +{ + "description": "The overlay ID (1-100 chars)", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / production_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - added
Input schema / properties / visibleAdded value: +{ + "description": "Whether the overlay should be visible", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "production_id", - "graphic_id", - "action" -]New value: +[ + "production_id", + "overlay_id", + "visible" +]
- Changed
wave_start_captions17 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / audio_base64Added value: +{ + "description": "Base64-encoded audio bytes to transcribe (max 25MB decoded)", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / filenameAdded value: +{ + "description": "Filename hint for the audio (default: \"audio.wav\")", + "type": "string" +} - added
Input schema / properties / instructionAdded value: +{ + "description": "Custom instruction for mode=custom", + "maxLength": 500, + "type": "string" +} - changed
Input schema / properties / language / descriptionPrevious value: -"ISO 639-1 language code (default: en)"New value: +"ISO 639 language hint for transcription (transcribe task only)" - removed
Input schema / properties / language / maxLengthRemoved value: -2 - removed
Input schema / properties / language / minLengthRemoved value: -2 - added
Input schema / properties / llm_modelAdded value: +{ + "description": "Fast LLM model ID to run the pipeline step", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / max_tokensAdded value: +{ + "description": "Max tokens for the LLM step (default: 256)", + "maximum": 4096, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / modeAdded value: +{ + "description": "Fast-LLM step to run over the transcript (default: summarize)", + "enum": [ + "summarize", + "moderate", + "translate", + "custom" + ], + "type": "string" +} - added
Input schema / properties / modelAdded value: +{ + "description": "Transcription model (default: whisper-large-v3-turbo; translate forces whisper-large-v3)", + "enum": [ + "whisper-large-v3-turbo", + "whisper-large-v3" + ], + "type": "string" +} - removed
Input schema / properties / providerRemoved value: -{ - "description": "Transcription provider (default: deepgram)", - "enum": [ - "deepgram", - "assemblyai", - "cohere" - ], - "type": "string" -} - changed
Input schema / properties / stream_id / descriptionPrevious value: -"The stream ID"New value: +"Client correlation ID for this stream/session (letters, digits, . _ : -, 1-128 chars)" - removed
Input schema / properties / stream_id / formatRemoved value: -"uuid" - added
Input schema / properties / stream_id / maxLengthAdded value: +128 - added
Input schema / properties / taskAdded value: +{ + "description": "Caption task (default: transcribe)", + "enum": [ + "transcribe", + "translate" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "stream_id" -]New value: +[ + "audio_base64", + "llm_model" +]
- Changed
wave_start_stream2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / stream_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
wave_stop_stream2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / stream_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
wave_switch_camera9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / busAdded value: +{ + "description": "Which bus to switch", + "enum": [ + "program", + "preview" + ], + "type": "string" +} - added
Input schema / properties / camera_indexAdded value: +{ + "description": "Camera index to switch to (0-15)", + "maximum": 15, + "minimum": 0, + "type": "integer" +} - removed
Input schema / properties / duration_msRemoved value: -{ - "description": "Transition duration in ms (default: 0 for cut)", - "maximum": 5000, - "minimum": 0, - "type": "integer" -} - added
Input schema / properties / production_idAdded value: +{ + "description": "The production ID", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - removed
Input schema / properties / source_idRemoved value: -{ - "description": "The source to switch to (e.g., cam_1, screen_share)", - "type": "string" -} - removed
Input schema / properties / switcher_idRemoved value: -{ - "description": "The Cloud Switcher session ID", - "format": "uuid", - "type": "string" -} - changed
Input schema / properties / transition / enumPrevious value: -[ - "cut", - "mix", - "wipe", - "dve" -]New value: +[ + "cut", + "dissolve", + "wipe", + "fade" +] - changed
Input schema / requiredPrevious value: -[ - "switcher_id", - "source_id" -]New value: +[ + "production_id", + "camera_index", + "bus" +]
- Added
wave_voice_converse - Added
wave.ask
18 tool updates
v0.1.5- First observed
wave_control_camera - First observed
wave_create_clip - First observed
wave_create_production - First observed
wave_create_stream - First observed
wave_get_stream_health - First observed
wave_get_stream_metrics - First observed
wave_get_subscription - First observed
wave_get_usage - First observed
wave_get_viewers - First observed
wave_list_productions - First observed
wave_list_streams - First observed
wave_mark_highlight - First observed
wave_moderate_chat - First observed
wave_show_graphic - First observed
wave_start_captions - First observed
wave_start_stream - First observed
wave_stop_stream - First observed
wave_switch_camera
TDQS
Scored across 24 tools
Each tool maps to a distinct resource/action pair: design extraction, contract validation, stream lifecycle, camera control, billing reads, and analytics. Even similar-sounding tools like wave_design_contract vs wave_design_contract_check are clearly separated by compose-vs-validate semantics, and wave_get_viewers vs wave_get_stream_metrics are distinguished by account-wide vs single-stream scope.
Most tools follow a consistent wave_<verb>_<noun> pattern across streams, productions, billing, and camera actions. Minor deviations like wave_design_contract (noun as operation), wave_voice_converse (noun-verb order), and wave.ask (dot separator instead of underscore) keep it from a 5.
With 24 tools spanning design, productions, streams, billing, camera control, captions, voice, and a meta-planning tool, the server feels like an API grab-bag rather than a tightly scoped set. Most tools have a concrete purpose, but the count is on the heavy side for an MCP server.
Core workflows are present for stream lifecycle, production switching, design extraction/validation, analytics, and camera commands. However, there are notable gaps: wave_create_clip and wave_control_camera depend on recording/camera IDs with no discovery tool, and most resources lack update/delete operations.
Maintenance
Related MCP Connectors
16 AI-native tools with dual SSE + streamable-http transport. Free tier available.
- sleipnirOAuthtv.sleipnir
Multistream to Twitch, YouTube and Kick; generate OBS overlays from a plain-English prompt.
Query your Twitch streams, events, supporters, raids & rankings from an AI assistant via OAuth.
AI Reasoning Cache & Consensus Layer with 11 MCP tools via Streamable HTTP.
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables management of multi-platform streaming through the Restream API, allowing control of streaming channels, stream settings, and access to analytics across platforms like YouTube, Twitch, and Facebook through natural language.912 npm1MIT
- AlicenseCqualityDmaintenanceEnables AI assistants to query and control a bio-hybrid neuromorphic simulation pipeline, including SNN engine, consciousness proxies, and neuroplatform telemetry, via the Model Context Protocol.50MIT

APIVerve MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceProvides access to 249+ production-ready APIs through the Model Context Protocol, enabling AI assistants to fetch weather, news, geocoding, validation, and more data.2 npm3MIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to control YouTube Live Streaming, including creating broadcasts, managing chat, and monitoring stream health via MCP tools.9 npmMIT