trvrse

Give your AI a camera — a hosted MCP server that turns any AI agent into a generative media studio: text-to-image, image-to-video, voiceover, and an end-to-end cinema pipeline, with per-key spend caps. 45 tools over streamable HTTP.

Documentation

trvrse cinema — MCP guide for agents

You are (or are configuring) an LLM agent connected to the trvrse cinema MCP server. It exposes a five-stage film pipeline — Script → References → Storyboards → Videos → Assembly — as 28 tools: 17 stage-by-stage tools you drive yourself, plus 3 Autopilot tools (make_film, get_run, cancel_run) that hand the whole pipeline to the server for one-call film production, plus make_long_film (multi-minute films with consistent characters, §3) and get_gate_review_link (mint a no-login human review link for a gated stage), plus 4 cast tools (save_character_to_cast, list_cast, delete_cast_member, refresh_cast_portrait) for episodic reuse of approved characters, plus refresh_character_portrait for re-minting a non-cast character's expired trusted portrait, plus set_shot_face_trust_override for per-scene face-moderation control. Separately, 7 asset tools (estimate_generation_cost, generate_image, edit_image, upload_image, list_images, generate_video, get_video_job) generate reference images and Seedance 2.5 videos without a cinema project (§4). A third surface, 6 video-plan tools (estimate_video_plan_cost, create_video_plan, get_video_plan, list_video_plans, approve_video_plan, reject_video_plan, §5), builds a full Seedance 2.x manifest — brief, refs, prompt, cost — that a human OR the agent itself approves before it dispatches. This guide is the complete playbook: connecting, the workflow loop, Autopilot, standalone assets, video plans, cost and error contracts, and a worked end-to-end transcript.

Endpoint: https://www.trvrse.com/api/mcp/mcp · Keys: minted by a human at Settings → Agent access · Raw markdown version of this page: https://www.trvrse.com/docs/agents.md

1. Quick start

Mint a key

  1. Sign in to the app and go to Settings → Agent access (https://www.trvrse.com/settings/agent).
  2. Click New key, give it a name (and, optionally, a spend cap in credits — leave blank for uncapped).
  3. The plaintext key is shown exactly once in a modal you must explicitly dismiss with Done. Copy it now — it is never shown again (only a trv_ + 8-char prefix is kept for display). If you lose it, revoke the key and mint a new one.

The key looks like trv_ followed by 43 base64url characters, e.g. trv_9F2k7q....

Endpoint

https://www.trvrse.com/api/mcp/mcp

(mcp-handler 's basePath is /api/mcp; it appends the mcp transport segment itself. Streamable HTTP only — SSE is disabled.)

Claude Code

claude mcp add --transport http trvrse-cinema https://www.trvrse.com/api/mcp/mcp \
  --header "Authorization: Bearer trv_YOUR_KEY_HERE"

Generic MCP client (JSON config)

Most MCP clients (Claude Desktop, other agent runtimes) accept a config block like:

{
  "mcpServers": {
    "trvrse-cinema": {
      "url": "https://www.trvrse.com/api/mcp/mcp",
      "transport": "http",
      "headers": {
        "Authorization": "Bearer trv_YOUR_KEY_HERE"
      }
    }
  }
}

The exact key name/shape (url vs command, headers vs env) varies by client — anything that supports a streamable-HTTP MCP transport with a custom header works. There is no OAuth/dynamic-registration flow; the bearer token is the credential.

claude.ai and ChatGPT (custom connectors)

claude.ai and ChatGPT custom connectors support only OAuth or "no authentication" — never a custom Authorization header, so the two connect methods above don't work there. Use the keyed-URL endpoint instead (shown alongside the plaintext key when a new one is minted, on Settings → Agent access):

https://www.trvrse.com/api/mcp/k/trv_YOUR_KEY_HERE/mcp

claude.ai — Settings → Connectors → Add custom connector → paste the URL above, leave authentication as None.

ChatGPT (developer mode / custom connectors) — add a connector with the same URL, authentication None.

The key rides in the URL path; the endpoint injects it as the bearer token internally and forwards to the same authed handler above — no second server, no different tool catalog. The URL is bearer-equivalent: treat it like a password (don't paste it somewhere public), prefer a spend-capped key per connector, and revoke it any time from Settings → Agent access if it leaks.

Sanity-check the connection

Once connected, ask the agent to call list_projects (or run get_project_status against an existing project id). A working connection returns real JSON; a bad key returns an isError result naming BRIDGE_AUTH_FAILED (see the error contract below).

Install this guide as a skill (optional)

Claude Code and other skills-capable agents can carry this playbook in-context instead of re-reading it each session:

SKILLS_DIR=~/.claude
mkdir -p "$SKILLS_DIR/skills/trvrse-cinema" && \
  curl -fsSL https://www.trvrse.com/docs/agents/skill.md \
  -o "$SKILLS_DIR/skills/trvrse-cinema/SKILL.md"

2. The workflow loop

Every film follows the same loop per stage:

  1. Check stateget_project_status: read the five stage statuses and nextActions (it names exactly the tool calls the pipeline admits next; trust it over guessing).
  2. Quoteget_cost_estimate for the stage you are about to generate.
  3. Generate — call the stage's generate_* tool with confirmedCost set to the quote's exact total.
  4. Pollget_project_status every 15–30 seconds until the stage's entities leave GENERATING (typically 1–3 minutes).
  5. Review & approve — inspect results (statuses, failure reasons), regenerate anything that failed, then call the stage's approve_* tool to unlock the next stage.

Script is the exception: generate_script and rewrite_scenes run the LLM in-request and return the full screenplay synchronously (~30–60 seconds), and script work is free — no quote needed.

3. One-call films (Autopilot)

Instead of driving the five-stage loop above yourself, make_film hands the whole pipeline to the server: submit a brief and a budget, then poll get_run until the film is done.

make_film

  • briefText (required) — the production brief the whole film is generated from.
  • profile (required) — "cinematic" (16:9 default) or "short" (see below).
  • budgetCredits (required) — a hard ceiling for the run's total spend (see "Budget is a hard ceiling" below).
  • gates (optional, default [] = fully unattended) — which of "script", "references", "storyboards", "videos", "assembly" pause the run for human review (see "Gates" below).
  • webhookUrl (optional, https:// only) — receives run events (see "Webhooks" below).
  • title, aspectRatio, videoModel (optional) — same shapes as create_project; profile supplies defaults you can override.

Returns {runId, projectId, webhookSecret?}. webhookSecret is present only when webhookUrl was set, and is shown exactly once, here — save it immediately, it is never returned again and you need it to verify webhook deliveries.

make_long_film — multi-minute films with consistent characters

Use this instead of make_film when the user wants a long-form piece whose characters must stay recognisably the same person throughout.

It runs the same pipeline, but changes how video is generated. make_film renders one independent clip per storyboard page and concatenates them, so a 3-minute film is 20–40 separate generations — each an independent roll of the dice on character identity. make_long_film renders each page as ONE continuous multi-shot Seedance 2.5 generation and continues the previous page through native video extension, so the same film is about 6 generations. Every segment re-sends the same approved character portraits: the extension carries continuity, the portraits carry identity.

  • Pinned to seedance-2.5-reference. videoModel is not selectable.
  • Total runtime is capped at 180 seconds. A storyboard that plans more is refused with the exact overage — cut scenes and regenerate.
  • gates defaults to all four review points ("script", "references", "storyboards", "videos"), because the point of this tool is that a human signs off on the cast and the plot before the expensive video leg. Pass [] only if the user explicitly asks for an unattended run.
  • Other arguments match make_film: briefText, budgetCredits, title, castIds, webhookUrl, aspectRatio.