Vocal Video Home →

Vocal Video MCP server

Connecting Claude or ChatGPT? You don't need this page. Follow Connect Claude or Connect ChatGPT — the only thing to know is the URL, https://vocalvideo.com/api/mcp. Wiring up a different client? Other MCP clients.

This page is the protocol reference for people building or configuring their own MCP client, and for agents reading it directly. Vocal Video exposes its 57 agent tools (20 read, 37 write) over the Model Context Protocol. The tools are identical to the REST API reference; only the transport differs. Tools are grouped into toolsets so a connection only loads the slice it needs.

Transport

A single JSON-RPC 2.0 endpoint over Streamable HTTP. There is no SSE stream and no session — every call is one self-contained request/response.

Endpoint POST https://vocalvideo.com/api/mcp
Server vocal-video v1.0.0
Protocol versions 2026-07-28, 2025-06-18
GET / DELETE /api/mcp 405 Method Not Allowed — no server-initiated stream, no sessions

Both protocol revisions are served on the same endpoint; each request declares which one it speaks:

  • 2026-07-28 (stateless). No handshake. Every request carries io.modelcontextprotocol/protocolVersion and io.modelcontextprotocol/clientCapabilities in params._meta, plus the mirrored MCP-Protocol-Version and Mcp-Method HTTP headers (and Mcp-Name on tools/call). A missing or mismatched header fails with -32020; an unsupported version fails with -32022 listing the supported ones; results carry resultType, the server identity in _meta, and ttlMs/cacheScope freshness hints. server/discover advertises versions and capabilities up front.
  • 2025-06-18 (initialize handshake). The classic flow — initialize, notifications/initialized, then tools/*. Requests presenting neither modern _meta nor a modern MCP-Protocol-Version header are served this way.

Authentication & scope

The server accepts two credential types on Authorization: Bearer <token>. Either resolves to a workspace, and API access must be enabled for the account.

1. Workspace API key — the same key the REST surface uses, created in Settings → API keys. Best for scripts and self-hosted clients: paste it into the client's bearer header and connect.

2. OAuth 2.1 — for hosted MCP clients (e.g. Claude custom connectors) that onboard from a URL alone. Point the client at the endpoint and it walks the standard flow automatically:

  • On an unauthenticated request the endpoint answers 401 with a WWW-Authenticate: Bearer resource_metadata="…" header pointing at its discovery document, https://vocalvideo.com/.well-known/oauth-protected-resource/api/mcp (RFC 9728), which in turn names the authorization server at https://vocalvideo.com/.well-known/oauth-authorization-server (RFC 8414).
  • A client with no pre-registered client_id self-registers via Dynamic Client Registration (RFC 7591) at https://vocalvideo.com/oauth/register.
  • Public clients use PKCE (code_challenge_method=S256) and bind the token to this endpoint with a resource=https://vocalvideo.com/api/mcp indicator (RFC 8707), so a token is only ever valid here.
  • After the user approves the consent screen, the client receives a short-lived access token and a refresh token, and renews without re-prompting.

Scope is enforced per tool: a read-scoped credential may call read tools only; a write-scoped credential may call any tool. A scope violation comes back as a tools/call result with isError: true (not a JSON-RPC error), so the host can feed it back to the model.

Toolsets

Every tool schema a connection advertises costs context in the host, and some hosts truncate long tool lists outright — so tools are grouped into use-case toolsets and a connection opts in with a toolsets query param on the endpoint URL:

POST /api/mcp?toolsets=collect,distribute

With no param, the default surface is collect + produce (40 tools). toolsets=all exposes everything. An unknown toolset name fails the request with a -32602 JSON-RPC error — including initialize, so a misconfigured URL fails at connect rather than silently exposing the default set.

Toolset Tools Covers
account 3 Workspace usage, plan features, brand settings.
collect (default) 15 Collectors, prompts, invitations, and the replies they gather.
distribute 14 Galleries, share URLs, embed codes, review shares.
produce (default) 25 Storyboards, scenes, transcript edits, templates, uploaded clips.

Methods

Method Era Purpose
server/discover 2026-07-28 Supported versions, capabilities, and server identity, without a handshake.
initialize 2025-06-18 Handshake; negotiates protocol version and advertises tools capability.
tools/list both Returns every externally-eligible tool with its inputSchema.
tools/call both Invokes a tool by name with an arguments object.
ping 2025-06-18 Liveness check; returns {}.
notifications/* both Acknowledged with 202 Accepted, no body.

Example: tools/call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_storyboards",
    "arguments": { "limit": 10 }
  }
}

The result carries both a JSON-encoded text content block (for older clients) and a structuredContent object (preferred by newer clients):

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "{ ... }" }],
    "structuredContent": {
      "storyboards": [],
      "returned": 0,
      "matched": 0,
      "truncated": false
    }
  }
}

Errors

Two distinct error channels, by design:

  • Protocol failures (malformed envelope, unknown method) → JSON-RPC error object with a negative code.
  • Tool failures (unknown tool, forbidden scope, schema-invalid input, oversize result) → a normal result with isError: true and a text explanation, so the host can surface it to the model rather than aborting.

Tool results are capped at 256 KB. An oversize read returns isError: true with a size message. An oversize successful write returns a compact success result instead, because the mutation has already committed; inspect the resource with a read tool before retrying.

Connecting a client

For hosts that speak remote MCP over HTTP, point them at the endpoint and supply the bearer header:

{
  "mcpServers": {
    "vocal-video": {
      "url": "https://vocalvideo.com/api/mcp",
      "headers": { "Authorization": "Bearer <your-api-key>" }
    }
  }
}

Hosts that only support stdio servers can bridge to this HTTP endpoint with a generic mcp-remote-style proxy. Hosts that support OAuth need only the url — they negotiate a token through the flow above, no header required.

Tool catalog

Tool Toolset Scope Description
get_account_usage account read Read the workspace account's current usage and allowances. Use it before kicking off metered work so you can tell the user they are close to a limit instead of failing at write time. Three separate meters, never interchangeable — say which one you mean: publishes_remaining (videos publishable this month; absent means the plan is unlimited), video_requests_remaining of video_requests_per_period (invitations the account may send), and ai_credits_remaining of ai_credits_granted (AI effects, AI templates, collector translation, and your own replies — every run you make spends these). ai_credits_renew is false when the grant is one-time rather than refilling each term. Also returns collector_count, response_count, video_count, and gallery_count — the authoritative totals, matching what the user sees in the app. Answer any "how many do I have" question from these; the list_* tools return ranked shortlists, not totals.
get_workspace_brand account read Read the workspace's brand surface: brand name, domain, default theme / aspect ratio / visibility, storyboard and collector colors, and the font ids the storyboards inherit by default. Use this when the user asks about brand alignment, when you need to pick colors that match the rest of their work, or before showing design previews.
get_account_features account read Read the workspace account's plan-tier capability flags: pro features, premium themes, custom domain, custom fields, custom release, kiosk mode, downloads, API access, watermark control. Use this to decline gracefully when the user asks for a feature their plan doesn't include — surface the capability gap rather than trying and failing.
list_collectors collect read Find collectors (video request campaigns) in the user's workspace. Returns a shortlist with status, response count, and last-reply recency. Use this for "show me my collectors", "find my hiring collector", or to pick a collector before reading its prompts / sending invitations. Results carry returned (rows in this payload), matched (hits for the filters you sent — NOT a workspace total), and truncated. When truncated is true, narrow the filters rather than assuming you saw everything.
get_collector collect read Fetch a single collector by id. Returns the same payload as a list_collectors entry plus the prompts list (in display order — the questions respondents see), the welcome / thank-you copy, and the invitation / reminder email copy. Use this before any mutation tool that targets a collector's prompts, welcome video, or distribution.
create_collector collect write Create a new collector (video request campaign). Pass ai_prompt with a description of what you want to ask (e.g., "hiring videos about why people love working at Acme") and intended_usage so the brand-aware generator (Agent::CollectorGenerator) can seed tailored prompts and copy. Without ai_prompt, returns an empty collector you can populate with add_prompt. The collector is set to active and ready to accept responses immediately. Calling this makes the new collector the conversation's subject, which is what puts the tools that edit its questions and copy in reach — they arrive with the user's next message, not this one.
update_collector collect write Update one or more copy fields on a collector — nickname, title, intro (welcome blurb), finish_headline / finish_body (thank-you screen), contact_name / contact_title (the in-app spokesperson), sender_name (the From-name on invitations), and the invitation / reminder email copy (subject, body, cta). Also toggles show_logo (the workspace logo on the public collector pages), auto_assemble_drafts (assemble a draft video from every new response automatically), and template_id (which workspace template those drafts assemble with). Use for "rename my hiring collector", "change the thank-you message", "reword the invitation email", "hide our logo", "auto-build drafts with our Spotlight template", etc. Pass only the fields that change.
add_prompt collect write Add a new question (prompt) to the end of the collector's active prompts list. The new prompt is inserted before any inactive prompts so the questions respondents see stay in the user's intended order. Pass plain text for the question; optionally teleprompter_script, max_recording_length, tips, and skippable.
update_prompt collect write Edit an existing question (prompt) in place — its text, teleprompter_script, max_recording_length, tips, or skippable. Use to reword a question or adjust its settings WITHOUT removing it, so responses already recorded against the prompt are preserved (unlike remove + add). Find the prompt id via get_collector. Pass only the fields that change.
remove_prompt collect write Remove a prompt from a collector. Behaviour mirrors the in-app "delete question" verb: if the prompt has no recorded clips, it's destroyed outright; otherwise it's marked inactive (so existing clips stay intact). Refuses to remove the only active prompt from an active collector — set the collector inactive first, or add another prompt before removing.
reorder_prompts collect write Reorder a collector's active prompts. Pass the full ordered list of prompt ids — inactive prompts are pushed to the end automatically.
set_collector_status collect write Set a collector to active (accepting responses) or inactive (paused — link stops accepting submissions). Use for "pause my hiring collector", "turn this back on", etc.
send_collector_invitation collect write Send a collector's video-request invitation to email addresses. Sends real email and spends one ask credit per recipient. TWO-STEP, token-gated. Call FIRST with confirm: false to get a preview (deliverable / skipped / invalid addresses) plus a confirmation_token. To send, call again with the SAME args, confirm: true, and confirmation_token set to that token. The token is short-lived and bound to the exact deliverable recipients; a bare confirm: true without a valid token will not send.
set_storyboard_design produce write Update storyboard-wide design — theme, colors, fonts, soundtrack, watermark, thumbnail, caption settings. All fields optional; pass only what changes. Run get_storyboard first to see the current design summary if you need to read before writing. Use for "make the brand color blue", "switch the theme to atlas", "turn off subtitles", "louder soundtrack".
list_galleries distribute read Find galleries the user has built in their workspace. Returns a shortlist with layout style, view counts, slot count, and links. Use this for "show me my galleries", "find my customer-highlights gallery", or to decide which gallery to add a video to. Results carry returned (rows in this payload), matched (hits for the filters you sent — NOT a workspace total), and truncated. When truncated is true, narrow the filters rather than assuming you saw everything.
get_gallery distribute read Fetch a single gallery by id. Returns the same payload as a list_galleries entry plus the design summary and the full items list (each slot's slot_id + type + typed slottable id + title, in display order). Use this before any add/remove/reorder or design change so you know what's currently in the gallery.
create_gallery distribute write Create a gallery, filled in the same call. When the user names what goes in it ("a gallery of my best videos"), pick the items yourself and pass them here — storyboard_ids for published videos, clip_ids for raw response clips, both in display order. Never create an empty gallery and ask the user which videos to add. Inherits brand defaults for colors and fonts. style picks the layout (default grid); carousel-style galleries get sensible auto-defaults for columns / card height. New galleries are PUBLIC. Calling this makes the new gallery the conversation's subject, which is what puts the tools that reorder, restyle and hide it in reach — those arrive with the user's next message, not this one.
get_gallery_share_url distribute read Return the public share URL for a gallery. Surfaces a warning when the gallery is set to privately (only workspace members can open the link).
get_gallery_embed_code distribute read Return the HTML embed code for a gallery. Gallery embeds do not accept per-call options — the look is driven by the gallery's persisted design (style, columns, colors). Use set_gallery_design to change those before getting embed code if needed.
add_storyboard_to_gallery distribute write Add published videos to a gallery as new items at the end. Adding several is ONE call: pass every id in storyboard_ids, in display order — never a call per video. Idempotent — a video already in the gallery comes back as its existing slot with already_present: true. Drafts cannot be added.
add_clip_to_gallery distribute write Add individual clips (a single recorded segment, not a video cut) to a gallery as new items at the end. Same shape as add_storyboard_to_gallery, plural form included: several clips is ONE call passing clip_ids.
remove_from_gallery distribute write Remove one item from a gallery. Pass slot_id (preferred — unique per gallery), or storyboard_id / clip_id to remove by the underlying item. Does not delete the video or clip itself, only the gallery slot.
reorder_gallery distribute write Reorder gallery items by passing the full slot_ids array in the desired display order. Slot ids come from get_gallery.items[].slot_id — do NOT use the typed storyboard_id / clip_id fields here.
rotate_gallery distribute write Curate a gallery in one call by removing stale videos and backfilling with the most-recently-published videos not already in it. Use for "rotate this gallery to my newest videos" or "keep this gallery fresh". Only operates on storyboard slots — clip slots are never removed. replace_older_than_days controls which videos qualify; optional keep_top_n protects that many leading storyboard slots regardless of age.
set_gallery_design distribute write Update one or more design fields on a gallery (layout style, columns, card type, colors, fonts, shadows, corner radius). All fields optional; pass only what changes. For the full set of current values, call get_gallery first.
set_gallery_metadata distribute write Update a gallery's content text — title, headline, and/or subhead. Separate from set_gallery_design (layout / colors / fonts) and set_gallery_visibility. Use for "rename my gallery", "change the gallery headline / subhead". Pass only the fields that change.
set_gallery_visibility distribute write Change a gallery's visibility. publicly = public + indexed by search engines; unlisted = anyone with the link can view; privately = only workspace members can view.
list_replies collect read Find footage (video/audio responses) matching the user's intent. The PRIMARY filter tool — combine parameters to narrow to a usable shortlist in one call. Use query for keyword search across transcripts and respondent metadata; use the structured filters (response_type, sentiment, specificity, topics, firmographics) for everything else. Returns metadata + a one-line summary per reply. Do NOT call get_reply to filter — that's only for committing a reply to a scene. If the result is {replies: [], index_status: "pending"}, the workspace HAS responses but they're still being indexed — tell the user their responses are still being prepared and to try again shortly; do NOT say the workspace is empty or has no footage, and do NOT build an empty storyboard. Results carry returned (rows in this payload), matched (hits for the filters you sent — NOT a workspace total), and truncated. When truncated is true, narrow the filters rather than assuming you saw everything.
get_reply collect read Fetch the full reply payload for one reply. Returns the respondent metadata, the LLM analysis (summary, sentiment, topics, pull_quote), and a clips array — each clip carries its sentences with per-sentence {text, start, finish, gap_after} timecodes you can use to pick sub-moments for add_scene segments (gap_after is the silence before the next sentence — prefer out-points with a real pause). pull_quote is present only when its transcript locates it as one contiguous run; pull_quote_moment then carries {clip_id, start, finish, confidence} — the ready-to-use hook moment. Call this once you've decided to commit a reply to a scene; the summary and topics from list_replies are enough to shortlist.
get_replies collect read Batch read of full payloads for multiple replies in one turn. Pass an ids array — up to 6 ids are served, extras come back in omitted_ids for a follow-up call. Use this for multi-respondent storyboard builds instead of looping get_reply. Returns { replies, not_found_ids?, omitted_ids? }; each reply has the same shape as get_reply (sentences, pull_quote_moment, etc.).
star_reply collect write Mark a response as starred (the user's favorites). Idempotent — calling on an already-starred response is a no-op. Use this when the user says "favorite this", "star Zach's response", or as cleanup after picking the strongest entries from a list_replies result.
unstar_reply collect write Remove the starred flag from a response. Idempotent — calling on a response that isn't starred is a no-op. Use this for "unstar this", "remove the favorite", or to clean up after a bad star.
get_scene produce read Read a single scene's current content — transcript (post-trim, post-mute), segments with their effects, mute segments, text fields, duration, and style. Use before mutating a scene's content (set_scene_duration, set_scene_segments, mute_words) so you know what's there. For a bird's-eye view of every scene, use get_storyboard instead — calling get_scene per scene to build a list is wasteful.
delete_scene produce write Soft-delete a scene from a storyboard. The delete is reversible — call restore_scene with the same scene id to bring it back. Use when removing, dropping, cutting, or skipping a specific scene.
restore_scene produce write Restore a previously-deleted scene. Rarely needed — the user usually undoes deletes via Cmd+Z. Use when the user explicitly asks to bring back a scene they previously asked to remove.
reorder_scenes produce write Reorder the scenes of a storyboard. Pass every active scene id in the new order; partial reorders aren't supported. Use for "move scene 3 before scene 1", "put the logo at the end", or whole-reel restructuring.
set_scene_duration produce write Set how long a text or logo scene stays on screen. Range is 1–30 seconds (out-of-range values are clamped). Use for "make the intro card longer" or duration-target arithmetic. Does NOT apply to video or audio scenes — their duration comes from the underlying clip and segments. Use set_scene_segments to trim a media scene.
set_scene_segments produce write Replace the playback segments on a video or audio scene — the in/out cuts and per-segment zoom effects. Mirrors add_scene's segments: shape but applies to an existing scene; the old segment list is replaced entirely. Use for "trim that scene to just the part where she says…", "remove the filler in the middle of scene 3", or after get_scene reveals a clip you want to retrim. Each segment carries {start, finish} in clip-local seconds with optional effect, amount, focus. Returns storyboard_total_seconds — the whole video's new length — so when cutting toward a target runtime, read it after each trim rather than tracking a running total yourself. When cutting inside a clip, also pass opening_words / closing_words — the cut word-aligns to the quoted transcript words, with start/finish locating which occurrence and standing in if the quote does not match.
set_scene_text produce write Update the overlay text on an existing scene. Pass at least one of headline, subhead, or kicker. Use for renaming overlays, tightening copy, or swapping a generic headline for a line drawn from what this scene's clip actually says. On a video or audio scene the headline and subhead are the respondent's name and title, shared by every scene that uses the same response, so one call updates them all.
share_draft_for_review distribute write Email a draft video to workspace teammates for review. TWO-STEP, token-gated. Call FIRST with confirm: false to get a preview plus a confirmation_token. To send, call again with the SAME args, confirm: true, and confirmation_token set to that token. The token is short-lived and bound to the exact recipients — change the recipients and you must re-preview. A bare confirm: true without a valid token will not send. Only existing workspace members can be emailed (unknown addresses are reported, never invited). Drafts only.
add_scene produce write Add one or more scenes to a storyboard. To BUILD or extend a video, pass the whole list at once in scenes (an array of scene objects) — a complete build is a SINGLE add_scene call, never one call per scene. To insert just one scene, pass that scene's fields at the top level instead. Each scene has three media-source modes: (1) reply-scoped — pass reply_id and optionally clip_id to use a specific clip from that reply; (2) workspace upload — pass clip_id ALONE (no reply_id) for a standalone workspace-uploaded clip like an animated logo, branded intro/outro, or stats overlay (find these via list_uploaded_clips); (3) structural — template: "text" + headline for a text card, template: "logo" (no clip) for a bare logo card. For reply-scoped media scenes, segments carries sentence-level internal cuts, each optionally carrying an effect to mask a trim or emphasize a moment. Positions are 1-indexed and optional — scenes append in array order when omitted.
assemble_draft produce write Assemble a complete draft video from one response using a workspace template — the same pipeline as the reply page's "New draft video" action. THE standard tool for "build/make me a video from X's response": the template supplies the structure and design, and the assembly pipeline picks scenes, trims, and intro/outro server-side. Prefer this over create_storyboard + add_scene, which remains the path for multi-respondent reels and bespoke cuts. When template_id is omitted the template resolves automatically — the reply's collector template, else the workspace default — and the result reports the resolved template_id / template_name so you can tell the user which was used. Returns immediately with assembly: "building" while the cut is assembled in the background; until assembly is "complete" the draft is not editable — do not add scenes to it. Share the editor_url (it shows build progress, then opens the finished draft), or check later with get_storyboard_summary. Does not change the conversation's open video.
create_storyboard produce write Create a new draft storyboard in the user's current workspace. When the user names a workspace template ("our Customer Spotlights template") call list_templates first and pass its id as template_id — the new storyboard inherits the template's visual settings (aspect ratio, theme, colors, captions, soundtrack, polish flags) and its editorial direction. Otherwise the storyboard inherits workspace defaults. Explicit polish flags (filler_word_removal, shorten_word_gaps, studio_sound) override the inherited settings either way. After creating, use add_scene to populate it with content. The result carries template_guidance — the template's structure, direction and duration costs; read it before add_scene. Calling this binds the conversation to the new storyboard — subsequent turns are storyboard-scoped — and a second call in the same turn is refused: fix a cut with the scene tools next turn, never by building again.
list_storyboards produce read Find videos (storyboards) the user has already created. The PRIMARY discovery tool for videos — composes filters and full-text search and returns a shortlist with metadata + view/play counts in one call. Use this for asks like "show me my recent videos", "find my testimonial videos about onboarding", "my most-viewed videos", or to pick videos to add to a gallery. Each result carries classification aggregated from the source responses (topics / sentiment / response_type / specificity) so you can filter or narrate without a follow-up read. Results carry returned (rows in this payload), matched (hits for the filters you sent — NOT a workspace total), and truncated. When truncated is true, narrow the filters rather than assuming you saw everything.
get_storyboard_summary produce read Light read of a single video by id, usable from any context. Returns the same payload as one entry from list_storyboards plus the design summary and scene count — no scene transcripts, no per-shot data. Use this when the user references a specific video by name or url and you need its current metadata before acting (e.g., adding it to a gallery, changing its visibility, or sharing it). For active editor work use get_storyboard instead — that surface returns the full scene list and polish flags.
get_storyboard produce read Read the current state of a storyboard (the "video" the user is editing). Returns scene-by-scene metadata, design summary (theme, fonts, colors), polish flags (filler-word removal, gap shortening, word-gap threshold, studio sound), scene count, and total duration. Use before any multi-step refinement so you know what's actually in the video — duration math for "make it 60 seconds", which scenes to delete for "focus on team culture", what theme is in play before tweaking design. Cheap: one query, no transcripts.
set_storyboard_metadata produce write Update top-level storyboard metadata — public title, internal title, or public description. All fields optional; pass only what changes. The natural "rename it" tool. URL slug edits are not supported here; direct the user to the in-editor edit modal if they ask to change a video's URL.
set_storyboard_visibility produce write Change a video's visibility. publicly = public + indexed by search engines; unlisted = anyone with the link can view; privately = only workspace members can view. Use this when the user says "make this video public", "unlist this one", "lock this down to my team". Does not affect drafts (drafts have no public page regardless of visibility).
get_storyboard_share_url produce read Return the public share URL for a published video. Use this for "what's the link to my testimonials reel?", "give me the URL for sharing this video", or before composing copy that needs the share link. If the video is set to privately, the response carries a warning the agent should surface to the user — the URL exists but only workspace members can open it. Drafts have no public page and return an error.
get_storyboard_embed_code produce read Return the HTML embed code for a published video plus the resolved options. Use this for "give me the embed code for the testimonials reel", "I want the embed with autoplay off", or any "how do I put this on my site" ask. Embed options are passed per-call (the underlying form object is not persisted). Defaults fire when an option is omitted — most users only override autoplay, max_width, or popover. Drafts have no embed code and return an error.
list_templates produce read List the workspace's video templates — reusable recipes that drive both auto-assembly and chat-driven video creation. Returns id, name, whether the template carries a direction prompt (if set, videos assemble with AI), whether it pins an intro clip and/or an outro clip, and whether it is the workspace default. Use this when the user names a template ("our Customer Spotlights template") or asks "what templates do we have?". Pass the matching template's id to create_storyboard (template_id) so the new storyboard inherits the template's settings and editorial direction. Results carry returned (rows in this payload), matched (how many exist), and truncated; when truncated is true the list was capped and more exist than are shown.
list_uploaded_clips produce read List the standalone uploaded clips in this workspace (animated logos, branded outros, intro cards, stats overlays, etc.) that can be dropped into a storyboard via add_scene (pass clip_id without reply_id) or pinned on a template via update_template intro_clip_id / outro_clip_id. Returns id, title, format (video/audio), and duration. Call this when the user references an uploaded clip by name — match the title and use the id. Results carry returned (rows in this payload), matched (how many exist), and truncated; when truncated is true the list was capped and more exist than are shown.
set_template_prompt produce write Set the AI direction prompt on a workspace template (addressed by template_id). The prompt is overwritten, not merged; an empty string clears it.
update_template produce write Update a workspace template's settings (addressed by template_id) — aspect ratio, subtitles, soundtrack, polish flags, theme, colors. All fields optional; pass only what changes.
tighten produce write Apply storyboard-wide polish in one step: remove filler words, shorten word gaps, and/or adjust the gap threshold. Each parameter is optional — pass only what you want to change. The natural "make it tighter" tool. The change is reversible with a single Cmd+Z.
find_replace produce write Replace every occurrence of a word or phrase across every media scene's transcript. Use for fixing a misspelled name, swapping one product term for another, or scrubbing a phrase the user wants removed. preserve_case mirrors the original casing per occurrence.
mute_words produce write Mute or unmute words on a media scene by transcript index. Pass mute: true to silence (default), mute: false to restore. Use after get_scene reveals the index of the word(s) you want to silence. Word indices are zero-based positions in the clip's transcript.