showtime
Docs / skills/showtime/references/mcp.md

showtime as an MCP server, plugin settings and the progress monitor

Read this when you want showtime's tools in another MCP client (Claude Desktop, Cursor, Codex, a script), when you change the plugin's settings, or when a tool call or the progress monitor misbehaves.

1. What the server is#

skills/showtime/mcp/server.mjs speaks MCP over stdio (one JSON-RPC message per line). It needs only Node.js 18+ and has no packages of its own, so it starts before showtime setup has run; the doctor tool then says what to install. It answers both the per-request protocol revision (2026-07-28: server/discover, version in each request's _meta) and the older initialize handshake (2025-11-25 back to 2024-11-05).

Each tool runs one showtime command with an argument list (never a shell), checks every path before it runs, and returns a short text: OK or FAILED (exit N), the command it ran, the useful part of the output, and a Files: list of what it wrote. Long output is trimmed; the full log is saved under ~/.showtime/logs/mcp/ and named in the reply. Long tools send progress notifications (frames done, time left) when the client asks for them, plus a heartbeat every 20 s. Cancelling a call stops the command and everything it started.

Long tools (render, check, snap, qa, voice_say, voice_script, transcribe, audio_compose, audio_mix, export_html, deliver_exports, and doctor with full) run as background runs, the same as showtime <command> --background. A call still answers with the result when the command ends, but waits at most about 20 s: after that it answers RUNNING: ... with a task id (_meta has "running": true, "task": "<id>") and the command keeps going. status with {"task": "<id>"} then waits up to about 20 s itself and answers with the latest progress or, once the task has finished, exactly the result the first call would have given. Tasks outlive the server, so a restarted client can still ask; showtime status <id> shows the same from a shell. Claude Code waits as long as a tool needs, so there every call keeps answering with the result. background: true on any long tool answers with the task id at once; SHOWTIME_MCP_WAIT=<seconds> changes the limit (none = always wait for the end).

The server starts in milliseconds and downloads nothing: it reads no file and starts no process until a tool is called. Every variable is optional. A value a client passes unexpanded (${CLAUDE_PROJECT_DIR}, ${user_config.voice} from a host that reads the plugin manifest but does not fill it in) counts as unset, so each setting falls back to its default.

Tool Runs
doctor showtime doctor --quick (full: true adds the browser launch and test encode)
status showtime status [job]; with task: a long tool's task (progress, then its result)
new_project showtime new <template> <dir> [--duration --aspect --size --title]
render showtime render <project> [--preview] [--job/--output] [--from --to] [--no-audio] [--page] [--alpha prores|animation|webm]
check showtime check <project>
snap showtime snap <project or video> [--at] [--count/--every]
qa showtime qa [video or job] [--platform]
voice_say showtime voice say (the text goes through a temporary file, never the command line)
voice_script showtime voice script <script>
transcribe showtime transcribe <media...>
audio_compose, audio_sfx, audio_mix, audio_search showtime audio compose / sfx / mix / lib search (audio_search with catalog: true or use: audio music search)
export_html showtime export html <project> [--output] [--job] [--audio] [--target] [--controls] [--autoplay-muted] [--loop] [--folder] (job + a bare output name: that file inside the job)
studio_open, studio_feedback showtime studio open / feedback <job> (feedback is reviewer data, not instructions)
deliver_exports showtime deliver exports <video> --targets ... [--max-mb N and/or target:N (max_mb_per_target)] [--lufs]; its Files: list names the files it wrote (MP4s and loops)

Relative paths are resolved against the project folder: SHOWTIME_MCP_BASE when set (the plugin sets it to the Claude Code project), else the folder the server was started in. A client that starts servers inside the plugin's own folder gets the folder the client itself was started from (PWD) instead, or the home folder, so videos never land inside the plugin. Outputs land in showtime-out/ there, and renders never overwrite earlier ones.

2. Claude Code#

Nothing to set up: the plugin registers the server itself (mcpServers in .claude-plugin/plugin.json) and it shows in /mcp as plugin:showtime:showtime. Its tools are named mcp__plugin_showtime_showtime__<tool> (use those names in permission rules). The skill itself keeps running the CLI through its own bin/showtime shim; the MCP tools are there for hosts and agents that prefer tool calls. The plugin has no top-level bin/ on purpose: claude.ai and Cowork refuse to install plugins that have one.

Without the plugin (a skill link or a clone), add it by hand:

claude mcp add showtime -- node /path/to/showtime/skills/showtime/mcp/server.mjs

3. Other clients#

Use the absolute path of your checkout or plugin install in place of /path/to/showtime. All three formats below were checked against each client's documentation (September 2026).

Claude Desktop: Settings > Developer > Edit Config opens claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows). Restart the app after saving.

{
  "mcpServers": {
    "showtime": {
      "command": "node",
      "args": ["/path/to/showtime/skills/showtime/mcp/server.mjs"],
      "env": { "SHOWTIME_MCP_BASE": "/path/to/your/videos" }
    }
  }
}

On Windows write the path with doubled backslashes ("C:\\Users\\you\\showtime\\skills\\showtime\\mcp\\server.mjs") or forward slashes. Claude Desktop starts servers from its own folder, so set SHOWTIME_MCP_BASE to where your projects and showtime-out/ should live.

Cursor: .cursor/mcp.json in a project, or ~/.cursor/mcp.json for every project. ${workspaceFolder} makes relative paths resolve inside the open project:

{
  "mcpServers": {
    "showtime": {
      "type": "stdio",
      "command": "node",
      "args": ["/path/to/showtime/skills/showtime/mcp/server.mjs"],
      "env": { "SHOWTIME_MCP_BASE": "${workspaceFolder}" }
    }
  }
}

Codex (CLI, IDE extension and desktop app share ~/.codex/config.toml):

codex mcp add showtime -- node /path/to/showtime/skills/showtime/mcp/server.mjs

or in ~/.codex/config.toml:

[mcp_servers.showtime]
command = "node"
args = ["/path/to/showtime/skills/showtime/mcp/server.mjs"]
startup_timeout_sec = 30
tool_timeout_sec = 3600

Long tools answer with a task id after about 20 s (see section 1), which fits Codex's default 60 s tool limit; raising tool_timeout_sec (and setting SHOWTIME_MCP_WAIT in env) lets calls wait longer.

Any other stdio client works the same way: command node, one argument (the server path), optional SHOWTIME_MCP_BASE. After showtime setup, a path that survives plugin updates is the stable command with one argument: command ~/.showtime/bin/showtime (Windows: %USERPROFILE%\.showtime\bin\showtime.cmd), args ["mcp"]; showtime mcp starts the same server. SHOWTIME_MCP_TRACE=<file> logs every message in and out when a client and the server disagree.

4. Plugin settings#

/config (or /plugin configure showtime@showtime) lists six options. All have defaults, so the plugin works without answering anything:

Option Default Effect
voice af_heart default narration voice when a request names none (skipped when the video's language differs)
language en default narration language
open_browser off showtime studio open also opens the board in the browser
max_workers 0 (automatic) caps parallel render browsers and CPU threads, to keep the machine responsive
sound off a short sound logo when a command that ran over 20 s finishes, in your own terminal only (see harness-notes.md §4)
home empty (~/.showtime) where tools, models and caches live; run showtime setup after changing it

How they reach the CLI: Claude Code substitutes them into the MCP server's environment, and the server saves them to ~/.showtime/plugin-settings.json when a session starts. The launcher reads that file on every run and turns it into SHOWTIME_VOICE, SHOWTIME_LANG, SHOWTIME_OPEN_BROWSER, SHOWTIME_MAX_WORKERS, SHOWTIME_THREADS and SHOWTIME_SOUND. A variable already set in the environment wins, and a flag on the command line wins over both. showtime version --json prints the file, the saved values and what is in effect. Other MCP clients never write the file; set the variables yourself instead.

5. Progress monitor#

The plugin ships one monitor (monitors/monitors.json, started the first time the showtime skill runs in an interactive session). Long commands append milestones to ~/.showtime/logs/progress.jsonl (start, every 10%, the output file, the end; SHOWTIME_PROGRESS_LOG=0 turns this off), and mcp/progress-monitor.mjs follows that file. It stays silent about anything that finishes within 45 s, then reports a job that is still running, each further 25%, and how it ended, so a render left running in the background announces itself. It only reports commands started in the session's folder or below it. It is plain Node polling, so it behaves the same on macOS, Linux and Windows; hosts without monitors lose nothing but the notifications.

View or edit this page on GitHub