Skip to main content
Glama
wave-av

WAVE MCP Server

Official
by wave-av

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

kind domain lang visibility phase

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#keys

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

wave_list_streams

List streams with pagination and status filtering (idle/live/ended)

wave_create_stream

Create a new stream (protocol, recording, privacy)

wave_start_stream

Start a stream

wave_stop_stream

Stop an active stream

wave_get_stream_health

Get a stream's current status document

wave_get_stream_metrics

Get analytics for a single stream over a date range

wave_mark_highlight

Mark a moment in a stream as a highlight for later clipping

Available tools — Studio

Tool

Description

wave_list_productions

List multi-camera productions

wave_create_production

Create a new multi-camera production

wave_switch_camera

Switch the program/preview bus to a camera index in a production

wave_show_graphic

Show or hide a graphics overlay in a production

wave_control_camera

Send a control command (iris/focus/zoom/white balance/gain/shutter/recording/audio level/presets) to a managed camera

wave_moderate_chat

Moderate a chat message in a live stream (block/flag/allow)

wave_start_captions

Transcribe an audio clip and optionally run a fast-LLM step over the transcript

wave_create_clip

Create a clip from a recording

Available tools — Analytics

Tool

Description

wave_get_viewers

Get account-wide viewer engagement analytics over a date range

Available tools — Billing

Tool

Description

wave_get_subscription

Get the current billing account (plan, subscription state)

wave_get_usage

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

wave_design_extract

Run pen-extract's all pipeline on a .pen board; returns the manifest (files, sha256s, owed)

wave_design_contract

Compose + validate a design-contract.json from an extract dir; returns the validator line and key counts

wave_design_measure

Run loc-study's measure on an image (masked by geometry) or a rasterized plate SVG

wave_design_contract_check

Validate an existing design-contract.json, no compose

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

WAVE_PEN_EXTRACT_ROOT

$HOME/wave-av/wave-pen-register-wt/packages/pen-extract

Root of the @wave-av/pen-extract checkout

WAVE_LOC_STUDY_ROOT

$HOME/wave-av/wave-design-study-wt/tools/loc-study

Root of the @wave-av/loc-study checkout

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

wave_compose

Propose a WAVE media pipeline (captions/clips/dub/realtime/identity/...) for a goal stated in plain language. Calls the live gateway POST /v1/compose when WAVE_API_KEY is configured (grounding: "gateway"); falls back to a bundled snapshot composition when no key is set or the live call fails, errors, or times out after 3s (grounding: "snapshot") — never a dead end. Propose-only: calls no other tool itself.

wave.ask

Deprecated — use wave_compose instead. Kept as an offline-only alias for one release (calls no other tool, makes no network request; identical composition logic to wave_compose's snapshot fallback, without the grounding field).

  • 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; grounding is "gateway" or "snapshot") or the gateway's own object verbatim plus grounding: "gateway" when a live call succeeds. wave.ask's output omits grounding but is otherwise identical. Always executes: false, never a model field (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; see knowledge/SOURCES.md for 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 real meter (or null for flat-rate skills) and a priceShape read straight off the skill's pricing block; the quote field is always "quote at call time".

  • The WAVE_API_KEY never goes anywhere but the gateway: wave_compose's live call sends it only as the Authorization header on POST {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.md for the full agent-facing how-to-call contract.

Available tools — Voice

Tool

Description

wave_voice_converse

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 WAVE_INTERNAL_SECRET (edge-internal auth, not the customer API key).

Resources

Access WAVE entities directly via the wave:// URI scheme:

  • wave://streams/{id} - Stream configuration and status

  • wave://productions/{id} - Studio production details

Environment variables

Variable

Required

Default

Description

WAVE_API_KEY

Yes

-

Your WAVE API key

WAVE_BASE_URL

No

https://api.wave.online

API origin. Tool paths are /v1/* on the WAVE gateway.

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-sdk
import { 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_KEY

Tools 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 --version

Testing 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-server

Development

cd packages/mcp-server
pnpm install
pnpm run build
pnpm run dev       # Watch mode
pnpm run type-check

License

MIT

Capabilities

Capability

Status

Control a PTZ camera (pan, tilt, zoom, focus, preset recall/store).

preview

Create a clip from a recorded stream, optionally exporting to social platforms.

preview

Create a new multi-camera studio production.

preview

Create a new stream (protocol, recording, region options).

preview

Drive a full headless conversation with the WAVE voice agent (WAV in, PCM reply out, no browser/WebRTC).

preview

Get real-time stream health metrics (bitrate, frame rate, latency).

preview

Get detailed stream performance metrics (bitrate, latency, quality, error rates).

preview

Get current subscription plan, billing cycle, and feature entitlements.

preview

Get current billing-period usage (streaming minutes, storage, bandwidth).

preview

Get current viewer count and viewer demographics for a stream or account-wide.

preview

List all studio productions in the WAVE account.

preview

List all streams in the WAVE account with pagination and status filtering.

preview

Mark a moment in a stream as a highlight for later clipping.

preview

Moderate a chat message in a live stream (block, flag, or allow).

preview

Show, hide, or update an HTML5 graphics overlay on a production.

preview

Start real-time captions/transcription on a stream.

preview

Start a stream by ID, transitioning it to the active state.

preview

Stop an active stream by ID.

preview

Switch the live program output to a different camera/source in a Cloud Switcher session.

preview

Run pen-extract's mechanical extraction pipeline on a .pen board.

preview

Compose and validate a design-contract.json from an extract dir.

preview

Measure a print image or rasterized plate SVG with loc-study.

preview

Validate an existing design-contract.json against the schema.

preview

Deprecated (use wave_compose): propose a WAVE media pipeline (captions/clips/dub/realtime/...) for a goal in plain language; never executes.

preview

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.

preview

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 package.json

Published npm package name is @wave-av/mcp-server

resolved by grepping package.json

wave_control_camera tool defined in src/tools/production.ts

resolved by grepping src/tools/production.ts

Exposes 25 MCP tools

resolved by grepping capabilities.json

wave_voice_converse tool defined in src/tools/voice.ts

resolved by grepping src/tools/voice.ts

wave_design_extract tool defined in src/tools/design.ts

resolved by grepping src/tools/design.ts

wave_design_contract tool defined in src/tools/design.ts

resolved by grepping src/tools/design.ts

wave_design_measure tool defined in src/tools/design.ts

resolved by grepping src/tools/design.ts

wave_design_contract_check tool defined in src/tools/design.ts

resolved by grepping src/tools/design.ts

wave_create_clip tool defined in src/tools/production.ts

resolved by grepping src/tools/production.ts

wave_create_production tool defined in src/tools/studio.ts

resolved by grepping src/tools/studio.ts

wave_create_stream tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_get_viewers tool defined in src/tools/analytics.ts

resolved by grepping src/tools/analytics.ts

wave_list_productions tool defined in src/tools/studio.ts

resolved by grepping src/tools/studio.ts

wave_list_streams tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_mark_highlight tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_moderate_chat tool defined in src/tools/production.ts

resolved by grepping src/tools/production.ts

wave_show_graphic tool defined in src/tools/production.ts

resolved by grepping src/tools/production.ts

wave_start_captions tool defined in src/tools/production.ts

resolved by grepping src/tools/production.ts

wave_start_stream tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_stop_stream tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_get_stream_health tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_get_stream_metrics tool defined in src/tools/streams.ts

resolved by grepping src/tools/streams.ts

wave_get_subscription tool defined in src/tools/billing.ts

resolved by grepping src/tools/billing.ts

wave_switch_camera tool defined in src/tools/production.ts

resolved by grepping src/tools/production.ts

wave_get_usage tool defined in src/tools/billing.ts

resolved by grepping src/tools/billing.ts

Server connects via stdio transport (no network listener)

resolved by grepping src/server.ts

wave.ask tool defined in src/tools/wave-ask/wave-ask.ts

resolved by grepping src/tools/wave-ask/wave-ask.ts

wave_compose tool defined in src/tools/wave-ask/wave-compose.ts

resolved by grepping src/tools/wave-ask/wave-compose.ts

Topics

wave · mcp · model-context-protocol · ai · streaming · tools


Built by WAVE Online, LLC · wave.online · Docs · LinkedIn

Available Tools

24 tools
wave.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.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYesThe 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.
budgetUsdNoOptional 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

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPreset name for save_preset
slotNoPreset slot (1-20) for save_preset
tintNoTint for set_white_balance
angleNoShutter angle for set_shutter
levelNoAudio level for set_audio_level
valueNoNumeric value for set_iris/set_focus/set_zoom/set_gain
channelNoAudio channel for set_audio_level
commandYesThe camera command variant
camera_idYesThe camera ID
preset_idNoPreset ID for recall_preset
temperatureNoColor temperature for set_white_balance

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
inYesClip start offset, a time string like "5s" or "2m" (0-10m)
fitNoResize fit mode (default: contain)
outNoClip end offset, a time string like "35s". Omit if using `duration`
widthNoOutput width in px (10-2000)
heightNoOutput height in px (10-2000)
sourceYesThe recording ID to clip from
formatsNoOutput formats to generate (default: [mp4])
qualityNoOutput quality lane (default: 720p)
durationNoClip length, a time string like "30s" (1s-60s). Omit if using `out`
visibilityNoStorage/delivery visibility (default: private)
spritesheet_framesNoFrame count for spritesheet output (1-120, default: 30)

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesProduction title
layoutNoInitial layout mode (default: single)
recordNoEnable recording for this production (default: false)
stream_idsNoStream IDs to include as sources in the production
descriptionNoProduction description

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesStream title
privacyNoStream visibility (default: public)
metadataNoArbitrary metadata to attach
protocolNoIngest protocol (default: auto)
recordingNoRecording configuration for this stream
descriptionNoStream description

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoOutput contract file (default: <extract>/design-contract.json)
extractYesPath to a <board>.extract/ dir written by wave_design_extract

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contractYesPath to a design-contract.json

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoOutput extract dir (default: <pen-dir>/<basename>.extract)
penYesPath to the .pen board file (must be under $HOME/wave-av or the OS temp dir)
deltaNoReference board's already-extracted dir; writes season-delta.json into this run's --out

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
imageNoPath to the image to measure (required unless `plate` is given)
plateNoPath to a plate SVG to rasterize and measure keyblock on
regionNoCrop region as `x,y,w,h` (fractions or pixels)
geometryNopen-extract geometry.json — masks occluder rects out of the measurement

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
stream_idYesThe UUID of the stream to check

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end (ISO 8601 timestamp), optional
fromNoRange start (ISO 8601 timestamp), optional
stream_idYesThe UUID of the stream

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end (YYYY-MM-DD), default: today
fromNoRange start (YYYY-MM-DD), default: start of current month

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end (ISO 8601 timestamp), optional
fromNoRange start (ISO 8601 timestamp), optional

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of productions to return (default 25)
offsetNoNumber of productions to skip for pagination (default 0)
statusNoFilter by production status

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of streams to return (1-100, default 50)
offsetNoNumber of streams to skip for pagination (default 0)
statusNoFilter by stream status

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoLabel for the highlight
stream_idYesThe stream ID
timestampNoISO 8601 timestamp of the highlight moment (default: now)
confidenceNoConfidence score (0-1, for AI-detected highlights)
duration_secondsNoDuration of the highlighted moment, in seconds

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesModeration action
reasonNoReason for moderation action
stream_idYesThe stream ID
message_idYesThe chat message ID to moderate

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
visibleYesWhether the overlay should be visible
overlay_idYesThe overlay ID (1-100 chars)
production_idYesThe production ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoFast-LLM step to run over the transcript (default: summarize)
taskNoCaption task (default: transcribe)
modelNoTranscription model (default: whisper-large-v3-turbo; translate forces whisper-large-v3)
filenameNoFilename hint for the audio (default: "audio.wav")
languageNoISO 639 language hint for transcription (transcribe task only)
llm_modelYesFast LLM model ID to run the pipeline step
stream_idNoClient correlation ID for this stream/session (letters, digits, . _ : -, 1-128 chars)
max_tokensNoMax tokens for the LLM step (default: 256)
instructionNoCustom instruction for mode=custom
audio_base64YesBase64-encoded audio bytes to transcribe (max 25MB decoded)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
stream_idYesThe UUID of the stream to start

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
stream_idYesThe UUID of the stream to stop

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
busYesWhich bus to switch
transitionNoTransition type (default: cut)
camera_indexYesCamera index to switch to (0-15)
production_idYesThe production ID

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roomYesRoom id the agent is bound to
outPathYesPath to write the agent's reply PCM to (raw, no WAV header)
audioPathYesPath to the input WAV (16-bit LE 48 kHz PCM)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 23 tool updatesv0.3.0
    • Changedwave_control_camera19 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / action
        Removed value: -{
        -  "description": "Camera control action",
        -  "enum": [
        -    "move",
        -    "zoom",
        -    "focus",
        -    "recall_preset",
        -    "store_preset"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / angle
        Added value: +{
        +  "description": "Shutter angle for set_shutter",
        +  "type": "number"
        +}
      • addedInput schema / properties / camera_id / pattern
        Added 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)$"
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Audio channel for set_audio_level",
        +  "type": "number"
        +}
      • addedInput schema / properties / command
        Added 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"
        +}
      • addedInput schema / properties / level
        Added value: +{
        +  "description": "Audio level for set_audio_level",
        +  "type": "number"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Preset name for save_preset",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / pan
        Removed value: -{
        -  "description": "Pan speed (-1 to 1)",
        -  "maximum": 1,
        -  "minimum": -1,
        -  "type": "number"
        -}
      • changedInput schema / properties / preset_id / description
        Previous value: -"Preset ID for recall/store"New value: +"Preset ID for recall_preset"
      • addedInput schema / properties / preset_id / format
        Added value: +"uuid"
      • addedInput schema / properties / preset_id / pattern
        Added 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)$"
      • addedInput schema / properties / slot
        Added value: +{
        +  "description": "Preset slot (1-20) for save_preset",
        +  "maximum": 20,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / temperature
        Added value: +{
        +  "description": "Color temperature for set_white_balance",
        +  "type": "number"
        +}
      • removedInput schema / properties / tilt
        Removed value: -{
        -  "description": "Tilt speed (-1 to 1)",
        -  "maximum": 1,
        -  "minimum": -1,
        -  "type": "number"
        -}
      • addedInput schema / properties / tint
        Added value: +{
        +  "description": "Tint for set_white_balance",
        +  "type": "number"
        +}
      • addedInput schema / properties / value
        Added value: +{
        +  "description": "Numeric value for set_iris/set_focus/set_zoom/set_gain",
        +  "type": "number"
        +}
      • removedInput schema / properties / zoom
        Removed value: -{
        -  "description": "Zoom speed (-1 to 1)",
        -  "maximum": 1,
        -  "minimum": -1,
        -  "type": "number"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "camera_id",
        -  "action"
        -]New value: +[
        +  "camera_id",
        +  "command"
        +]
    • Changedwave_create_clip18 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / duration
        Added value: +{
        +  "description": "Clip length, a time string like \"30s\" (1s-60s). Omit if using `out`",
        +  "type": "string"
        +}
      • removedInput schema / properties / end_time
        Removed value: -{
        -  "description": "Clip end time in seconds",
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / export_to
        Removed value: -{
        -  "description": "Social platforms to auto-export to",
        -  "items": {
        -    "enum": [
        -      "tiktok",
        -      "youtube_shorts",
        -      "instagram_reels",
        -      "twitter"
        -    ],
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • addedInput schema / properties / fit
        Added value: +{
        +  "description": "Resize fit mode (default: contain)",
        +  "enum": [
        +    "contain",
        +    "cover",
        +    "scale-down"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / formats
        Added value: +{
        +  "description": "Output formats to generate (default: [mp4])",
        +  "items": {
        +    "enum": [
        +      "mp4",
        +      "spritesheet",
        +      "m4a",
        +      "frame"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / height
        Added value: +{
        +  "description": "Output height in px (10-2000)",
        +  "maximum": 2000,
        +  "minimum": 10,
        +  "type": "integer"
        +}
      • addedInput schema / properties / in
        Added value: +{
        +  "description": "Clip start offset, a time string like \"5s\" or \"2m\" (0-10m)",
        +  "type": "string"
        +}
      • addedInput schema / properties / out
        Added value: +{
        +  "description": "Clip end offset, a time string like \"35s\". Omit if using `duration`",
        +  "type": "string"
        +}
      • addedInput schema / properties / quality
        Added value: +{
        +  "description": "Output quality lane (default: 720p)",
        +  "enum": [
        +    "720p",
        +    "1080p",
        +    "4k"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "description": "The recording ID to clip from",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / spritesheet_frames
        Added value: +{
        +  "description": "Frame count for spritesheet output (1-120, default: 30)",
        +  "maximum": 120,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / start_time
        Removed value: -{
        -  "description": "Clip start time in seconds",
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / stream_id
        Removed value: -{
        -  "description": "The stream ID to clip from",
        -  "format": "uuid",
        -  "type": "string"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Clip title",
        -  "maxLength": 255,
        -  "type": "string"
        -}
      • addedInput schema / properties / visibility
        Added value: +{
        +  "description": "Storage/delivery visibility (default: private)",
        +  "enum": [
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / width
        Added value: +{
        +  "description": "Output width in px (10-2000)",
        +  "maximum": 2000,
        +  "minimum": 10,
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "stream_id",
        -  "start_time",
        -  "end_time"
        -]New value: +[
        +  "source",
        +  "in"
        +]
    • Changedwave_create_production2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / stream_ids / items / pattern
        Added 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)$"
    • Changedwave_create_stream10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / description / maxLength
        Previous value: -2000New value: +5000
      • addedInput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Arbitrary metadata to attach",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / privacy
        Added value: +{
        +  "description": "Stream visibility (default: public)",
        +  "enum": [
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / protocol / description
        Previous value: -"Streaming protocol (default: webrtc)"New value: +"Ingest protocol (default: auto)"
      • changedInput schema / properties / protocol / enum
        Previous value: -[
        -  "webrtc",
        -  "srt",
        -  "rtmp",
        -  "hls"
        -]New value: +[
        +  "webrtc",
        +  "srt",
        +  "rtmp",
        +  "auto"
        +]
      • removedInput schema / properties / record
        Removed value: -{
        -  "description": "Enable recording for this stream (default: false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / recording
        Added value: +{
        +  "description": "Recording configuration for this stream",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "enabled"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / region
        Removed value: -{
        -  "description": "Preferred ingest region (e.g., us-east-1, eu-west-1)",
        -  "type": "string"
        -}
      • changedInput schema / properties / title / maxLength
        Previous value: -255New value: +200
    • Addedwave_design_contract
    • Addedwave_design_contract_check
    • Addedwave_design_extract
    • Addedwave_design_measure
    • Changedwave_get_stream_health2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / stream_id / pattern
        Added 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)$"
    • Changedwave_get_stream_metrics6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Range start (ISO 8601 timestamp), optional",
        +  "type": "string"
        +}
      • removedInput schema / properties / granularity
        Removed value: -{
        -  "description": "Data point granularity (default: 5m)",
        -  "enum": [
        -    "1m",
        -    "5m",
        -    "1h",
        -    "1d"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / period
        Removed value: -{
        -  "description": "Time period for metrics aggregation (default: 24h)",
        -  "enum": [
        -    "1h",
        -    "6h",
        -    "24h",
        -    "7d",
        -    "30d"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / stream_id / pattern
        Added 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)$"
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Range end (ISO 8601 timestamp), optional",
        +  "type": "string"
        +}
    • Changedwave_get_usage5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / breakdown
        Removed value: -{
        -  "description": "Level of usage detail (default: summary)",
        -  "enum": [
        -    "summary",
        -    "daily",
        -    "by_stream"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Range start (YYYY-MM-DD), default: start of current month",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • removedInput schema / properties / period
        Removed value: -{
        -  "description": "Billing period to query (default: current)",
        -  "enum": [
        -    "current",
        -    "previous"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Range end (YYYY-MM-DD), default: today",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
    • Changedwave_get_viewers5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Range start (ISO 8601 timestamp), optional",
        +  "type": "string"
        +}
      • removedInput schema / properties / include_demographics
        Removed value: -{
        -  "description": "Include geographic and device breakdown (default: false)",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / stream_id
        Removed value: -{
        -  "description": "Stream ID to get viewers for. Omit for account-wide totals.",
        -  "format": "uuid",
        -  "type": "string"
        -}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Range end (ISO 8601 timestamp), optional",
        +  "type": "string"
        +}
    • Changedwave_list_productions4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of productions to return (1-100, default 25)"New value: +"Maximum number of productions to return (default 25)"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "draft",
        -  "live",
        -  "ended",
        -  "all"
        -]New value: +[
        +  "setup",
        +  "rehearsal",
        +  "live",
        +  "paused",
        +  "ended"
        +]
    • Changedwave_list_streams4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of streams to return (1-100, default 25)"New value: +"Maximum number of streams to return (1-100, default 50)"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "active",
        -  "idle",
        -  "error",
        -  "all"
        -]New value: +[
        +  "idle",
        +  "live",
        +  "ended"
        +]
    • Changedwave_mark_highlight4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / duration_seconds
        Added value: +{
        +  "description": "Duration of the highlighted moment, in seconds",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / stream_id / pattern
        Added 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)$"
      • addedInput schema / properties / timestamp
        Added value: +{
        +  "description": "ISO 8601 timestamp of the highlight moment (default: now)",
        +  "type": "string"
        +}
    • Changedwave_moderate_chat2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / stream_id / pattern
        Added 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)$"
    • Changedwave_show_graphic8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / action
        Removed value: -{
        -  "description": "Action to perform",
        -  "enum": [
        -    "show",
        -    "hide",
        -    "update"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / data
        Removed value: -{
        -  "additionalProperties": {},
        -  "description": "Data bindings for the graphic template",
        -  "type": "object"
        -}
      • removedInput schema / properties / graphic_id
        Removed value: -{
        -  "description": "The graphic template ID",
        -  "type": "string"
        -}
      • addedInput schema / properties / overlay_id
        Added value: +{
        +  "description": "The overlay ID (1-100 chars)",
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / production_id / pattern
        Added 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)$"
      • addedInput schema / properties / visible
        Added value: +{
        +  "description": "Whether the overlay should be visible",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "production_id",
        -  "graphic_id",
        -  "action"
        -]New value: +[
        +  "production_id",
        +  "overlay_id",
        +  "visible"
        +]
    • Changedwave_start_captions17 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / audio_base64
        Added value: +{
        +  "description": "Base64-encoded audio bytes to transcribe (max 25MB decoded)",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "Filename hint for the audio (default: \"audio.wav\")",
        +  "type": "string"
        +}
      • addedInput schema / properties / instruction
        Added value: +{
        +  "description": "Custom instruction for mode=custom",
        +  "maxLength": 500,
        +  "type": "string"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"ISO 639-1 language code (default: en)"New value: +"ISO 639 language hint for transcription (transcribe task only)"
      • removedInput schema / properties / language / maxLength
        Removed value: -2
      • removedInput schema / properties / language / minLength
        Removed value: -2
      • addedInput schema / properties / llm_model
        Added value: +{
        +  "description": "Fast LLM model ID to run the pipeline step",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / max_tokens
        Added value: +{
        +  "description": "Max tokens for the LLM step (default: 256)",
        +  "maximum": 4096,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "Fast-LLM step to run over the transcript (default: summarize)",
        +  "enum": [
        +    "summarize",
        +    "moderate",
        +    "translate",
        +    "custom"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / model
        Added value: +{
        +  "description": "Transcription model (default: whisper-large-v3-turbo; translate forces whisper-large-v3)",
        +  "enum": [
        +    "whisper-large-v3-turbo",
        +    "whisper-large-v3"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / provider
        Removed value: -{
        -  "description": "Transcription provider (default: deepgram)",
        -  "enum": [
        -    "deepgram",
        -    "assemblyai",
        -    "cohere"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / stream_id / description
        Previous value: -"The stream ID"New value: +"Client correlation ID for this stream/session (letters, digits, . _ : -, 1-128 chars)"
      • removedInput schema / properties / stream_id / format
        Removed value: -"uuid"
      • addedInput schema / properties / stream_id / maxLength
        Added value: +128
      • addedInput schema / properties / task
        Added value: +{
        +  "description": "Caption task (default: transcribe)",
        +  "enum": [
        +    "transcribe",
        +    "translate"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "stream_id"
        -]New value: +[
        +  "audio_base64",
        +  "llm_model"
        +]
    • Changedwave_start_stream2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / stream_id / pattern
        Added 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)$"
    • Changedwave_stop_stream2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / stream_id / pattern
        Added 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)$"
    • Changedwave_switch_camera9 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / bus
        Added value: +{
        +  "description": "Which bus to switch",
        +  "enum": [
        +    "program",
        +    "preview"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / camera_index
        Added value: +{
        +  "description": "Camera index to switch to (0-15)",
        +  "maximum": 15,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • removedInput schema / properties / duration_ms
        Removed value: -{
        -  "description": "Transition duration in ms (default: 0 for cut)",
        -  "maximum": 5000,
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • addedInput schema / properties / production_id
        Added 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"
        +}
      • removedInput schema / properties / source_id
        Removed value: -{
        -  "description": "The source to switch to (e.g., cam_1, screen_share)",
        -  "type": "string"
        -}
      • removedInput schema / properties / switcher_id
        Removed value: -{
        -  "description": "The Cloud Switcher session ID",
        -  "format": "uuid",
        -  "type": "string"
        -}
      • changedInput schema / properties / transition / enum
        Previous value: -[
        -  "cut",
        -  "mix",
        -  "wipe",
        -  "dve"
        -]New value: +[
        +  "cut",
        +  "dissolve",
        +  "wipe",
        +  "fade"
        +]
      • changedInput schema / required
        Previous value: -[
        -  "switcher_id",
        -  "source_id"
        -]New value: +[
        +  "production_id",
        +  "camera_index",
        +  "bus"
        +]
    • Addedwave_voice_converse
    • Addedwave.ask
  2. 18 tool updatesv0.1.5
    • First observedwave_control_camera
    • First observedwave_create_clip
    • First observedwave_create_production
    • First observedwave_create_stream
    • First observedwave_get_stream_health
    • First observedwave_get_stream_metrics
    • First observedwave_get_subscription
    • First observedwave_get_usage
    • First observedwave_get_viewers
    • First observedwave_list_productions
    • First observedwave_list_streams
    • First observedwave_mark_highlight
    • First observedwave_moderate_chat
    • First observedwave_show_graphic
    • First observedwave_start_captions
    • First observedwave_start_stream
    • First observedwave_stop_stream
    • First observedwave_switch_camera

TDQS

A3.5/5.0

Scored across 24 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count3/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.

Completeness3/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers