Connect an AI agent

Make a show from inside your AI assistant

ShowMaker speaks MCP, so any AI client that does too can run the studio directly: write and fix the script, build a consistent cast, break scenes into shots, draw the stills, cast and perform the voices, render the clips and assemble the cut — 104 tools, the same ones the product itself runs on.

ClaudeClaude CodeChatGPTCursorWindsurfZed…and any other MCP client
Server URLhttps://mcp.showmaker.studio/mcp

Connect it

There is nothing to install. The server is remote, speaks streamable HTTP, and signs you in through your browser the first time your client asks for it.

Claude (web, desktop and mobile)

  1. Open Settings → Connectors and choose Add custom connector.
  2. Paste the URL above. Leave every other field alone — the connector discovers what it needs.
  3. Click Connect. Claude sends you to ShowMaker to sign in and approve access, then comes back connected.
  4. Ask for something. Start with “list my ShowMaker projects” to confirm the link.
Watch the spelling of the host. It is mcp., not msp. — a typo resolves to a server that is not ours and simply 404s, with nothing to point at.

You need an account on Starter or above

Every tool below is documented in the open, because you should be able to see exactly what an agent could do with your studio before you decide to give it one. The connection itself is a different matter: these tools read your scripts, change your projects and spend your credits, so the server answers only a caller that has signed in as you.

MCP is a paid-plan feature. An agent works on a loop — what you would do forty times by hand, a script does four hundred times before anyone looks — so automated access is available on Starter and above. The free plan runs Story Flow in the browser, which is a different way of working rather than a smaller one, and does not connect an assistant.
  • Sign-in is OAuth 2.1 with PKCE. Your client is registered automatically — nothing to fill in, no keys to paste.
  • A connection is scoped to one organisation — the one you signed in with — and reaches only the projects that org can already see.
  • Access is revocable at any time, from the panel below, and every issued credential expires on its own.
  • Spending is separate from writing. The scopes are mcp:read and mcp:write; permission to start paid work (mcp:spend) is granted deliberately, not by default.

What it can do

The catalogue follows the pipeline, from a premise nobody has paid for yet to a finished cut. Each area below is a real stage of making an episode — jump to its tools, or read the whole list further down.

What your agent sees first

104 tool definitions are more than most clients will hold — and a client that cannot hold them does not say so, it silently keeps the ones that fit. So the connector opens with a small, permanent set plus a way to reach everything else:

  • find_tools searches the full catalogue by any words you like, best match first.
  • describe_tool returns a tool's real description and input schema.
  • call_tool runs any tool in the catalogue by name — identical to calling it directly, with the same permission checks.

Alongside those, these are always visible without a search: list_projects, get_credits, list_characters, get_script, list_props, list_locations, list_scenes, generate_scene_preview, poll_project, update_shot.

Nothing is hidden — only unlisted. Every one of the 104 tools is callable from the first minute, whether or not it appears in the opening list. If your client is one that can hold the whole manifest, add ?tools=full to the URL and it will serve every schema up front instead.

Ask it like this

Start a seriesMake me a nine-episode vertical drama about a surrogate who discovers she is carrying twins for two different families. Build the cast and the locations, then show me episode one's beats before you spend anything.

Story tools only — no images, no renders, no credits.

Board an episodeBreak scene 3 into coverage — establishing, singles on both of them with matched eyelines, and an insert on the phone — then draw the stills and show me a contact sheet.

Coverage, blocking and stills, before a frame of video exists.

Fix one thingLine 4 of scene 1 is on the wrong character — it belongs to the older brother, not the driver. Fix it, re-voice that line, and re-shoot the still from a low angle without touching anything else in the frame.

Single-line edits exist precisely so a small fix stays small.

Every tool

All 104 of them, grouped by what they are for. This is the complete surface — the same names, summaries and arguments your agent gets back from find_tools and describe_tool.

104 tools

Projects & credits

6 tools

Everything starts with a project. An agent can create one, list the ones you can work on, find the other episodes of a series, and copy a finished episode's cast, locations and props into the next one so a series stays consistent. get_credits reports what the account can actually spend right now — not what it stores — so an agent can check before starting expensive work.

create_project

Create a new project (the first step of the whole flow)

required: title · optional: aspectRatio, dialogueLanguage, format, prompt, type, visualStyle

list_projectsCore

List the projects you can work on, newest first — id, title, type, format, status and timestamps

optional: limit, seriesId

list_org_projects

The OTHER projects this account owns — how you find another EPISODE of the series you are working on

optional: limit, seriesId

update_project

Patch top-level project fields (e.g

required: patch, projectId

get_creditsCore

How many credits this account can SPEND right now

no arguments

copy_refs

Copy CAST, LOCATIONS, PROPS and/or SCENES from another project into this one — how episode 2 of a series reuses episode 1's people and sets instead of…

required: projectId, sourceProjectId · optional: copyCharacters, copyLocations, copyProps, copyScenes

Story development

9 tools

The story layer is deliberately cheap. An agent can generate a cast, a world and a beat sheet from a premise, refine it over a multi-turn conversation, score it for AI-video readiness, or ingest a script you already wrote and infer its people and places from the text.

generate_story

One-shot AI generation: given a premise, returns characters + locations + beats + scenes with @slug refs already embedded

required: premise, projectId · optional: coverage, faithful, projectType, visualStyle

story_chat

Multi-turn refinement chat — pass the full conversation messages array

required: messages · optional: context

rate_story

Score a story for AI-video readiness across 10 criteria (max 20)

required: messages · optional: context

get_project_storydev

Read the current storyDev JSON for a project (premise, characters, locations, beats, scenes, conversation history)

required: projectId

save_storydev

Overwrite the storyDev JSON for a project

required: projectId · optional: beats, characters, conversationHistory, locations, premise, scenes, scenesSource, updatedAt

import_script

INGEST an existing script/prose into structured scenes

required: projectId, text · optional: chunk, faithful, mode

extract_cast_locations

Infer the CAST + LOCATIONS from a script's text (`scriptText`)

required: projectId, scriptText

build_script_from_story

Convert the storyDev blob (generate_story's beats + scenes) into a SCREENPLAY and save it — the bridge from the story path to the script path

required: projectId · optional: overwrite

push_to_board

Materialise the storyDev blob into the SCENES table AND into real Character/Location entities

required: projectId

The screenplay

7 tools

get_script reads the acts, scenes, dialogue and shots a project actually holds. save_script replaces a whole screenplay; update_dialogue_line patches one spoken line by id, which is what you want when a single word is wrong and you do not want to risk the rest of the draft. Pushing the script to the board is what creates the shots everything downstream edits.

get_scriptCore

READ the screenplay — the acts/scenes/dialogue/shots a project actually holds

required: projectId · optional: mode, sceneId

save_script

Write the SCREENPLAY (script.acts[].scenes[]) for a project

required: projectId, script

update_dialogue_line

Patch ONE dialogue line's spoken text and/or speaker, by its dialogue line id (dl_id from get_script mode:'scene', scene.dialog[].id)

required: dialogLineId, projectId, sceneId · optional: character, line

rename_scene

Rename a scene

required: projectId, scriptSceneId, slugline

create_script_scene

Create a REAL scene — the SCRIPT scene and its linked board row together

required: projectId · optional: action, description, duration, durationSec, insertAfterScriptSceneId, prompt, slugline, title, videoPrompt

push_script_to_board

Materialise the saved SCREENPLAY into board scenes, each carrying its scriptSceneId (the link coverage + shot tools need)

required: projectId

sync_shots_to_board

Re-sync the script's shots onto the board after coverage/shot edits (upserts one board scene per script shot, stamping scriptShotId/scriptSceneId)

required: projectId · optional: forceRewritePrompts, shotId

Cast & wardrobe

12 tools

A character is a real entity with reference stills, a slug your prompts @-mention, and wardrobe outfits that lock a look across scenes. The shared Cast Library carries named people between projects, so a recurring character arrives already drawn.

list_charactersCore

List all real Character entities for a project (the materialised ones with stills, not the storyDev draft characters).

required: projectId

create_character

Create a real Character entity directly (bypasses push_to_board)

required: name, projectId · optional: glamour, negativePrompt, prompt, slug, voiceId, voiceName, voiceOnly

update_character

Patch a character's fields (name, prompt, negativePrompt, slug) and its NAME TAG defaults (tagRole, tagImageUrl, tagImageStyle)

required: characterId, projectId · optional: aliases, glamour, name, negativePrompt, prompt, slug, tagImageStyle, tagImageUrl, tagRole, voiceFx, voiceFxReverb, voiceGain, voiceId, voiceName, voiceOnly, voicePitch, voiceSource, voiceSpeed, voiceStability

delete_character

Delete a character entity

required: characterId, projectId

generate_character_still

Generate one still image for a character

required: characterId, projectId · optional: glamour, model, refImageUrl, refStillId, shotType

import_character_still

Import an existing image URL as a still on a character

required: characterId, projectId, url · optional: replaceStillId, tag

delete_character_still

Delete one still from a character

required: characterId, projectId, stillId

add_wardrobe

Add a WARDROBE OUTFIT to a character — the way to LOCK an outfit across scenes

required: characterId, name, projectId · optional: baseWardrobeId, locationName, locationTag, promptExtension

generate_wardrobe_sheet

Render a wardrobe outfit's reference SHEET — one multi-panel turnaround (same face, the outfit's clothes) stored as the outfit's turnaroundUrl and slu…

required: characterId, projectId, wardrobeId · optional: glamour, matchReferenceOutfit, model

update_wardrobe

Patch a wardrobe outfit (name, promptExtension, locationTag, slug)

required: characterId, projectId, wardrobeId · optional: baseWardrobeId, locationTag, name, promptExtension, slug

delete_wardrobe

Delete a wardrobe outfit from a character.

required: characterId, projectId, wardrobeId

shot_cast

Who is IN a shot — the characters the board sceneId actually shows, each with its NAME TAG defaults (tagRole) and cached lockup (tagImageUrl)

required: projectId, sceneId

Locations & props

14 tools

Locations get a reference plate and can be shot again from additional camera angles, so every coverage shot reads as one place. Props work the same way: draw the object once, @-mention its slug, and every shot that names it is anchored to the same picture.

list_locationsCore

List all real Location entities for a project.

required: projectId

create_location

Create a real Location entity directly.

required: name, projectId · optional: negativePrompt, prompt, slug

update_location

Patch a location's fields (name, prompt, negativePrompt, slug)

required: locationId, projectId · optional: lock, name, negativePrompt, prompt, slug

delete_location

Delete a location entity

required: locationId, projectId

generate_location_still

Generate one still image for a location

required: locationId, projectId · optional: model, refImageUrl, refStillId

list_location_angles

The catalogue of extra camera angles generate_location_angles can shoot of a location (id, label, kind, description)

required: projectId

generate_location_angles

Shoot a location you already have a still of from ADDITIONAL camera positions, saved onto that SAME location

required: angles, locationId, projectId · optional: previewOnly, refStillId

accept_location_angles

Attach angles shot with generate_location_angles(previewOnly=true) to their location

required: locationId, projectId, stills

promote_location_angles

Turn chosen angle stills into LOCATIONS of their own

required: locationId, projectId, stillIds · optional: names

list_propsCore

List all real Prop entities for a project (name, @slug, prompt, stills)

required: projectId

create_prop

Create a real Prop entity — an object a shot can @-mention (a weapon, a contract, an idol)

required: name, projectId · optional: framing, negativePrompt, prompt, slug

update_prop

Patch a prop's fields (name, prompt, negativePrompt, slug)

required: projectId, propId · optional: name, negativePrompt, prompt, slug

delete_prop

Delete a prop entity

required: projectId, propId

generate_prop_still

Draw a prop's reference still — the picture every shot that @-mentions it gets anchored to

required: projectId, propId · optional: model, refImageUrl, refStillId, tag

Storyboard & shots

18 tools

This is the largest area, and the one an agent spends most of its time in: turn a scene into establishing shots, dialogue singles with matched eyelines, inserts and reactions; stage where people stand and where the camera is; patch a prompt; lock a shot against re-render; and pull one back out of the bin when a delete was wrong.

list_scenesCore

List the board scenes for a project (after push_to_board has materialised them) — what each row IS, whether it has a still and a clip, and the URLs to…

required: projectId · optional: detail, sceneId

update_scene

Patch fields on a board scene (a shot)

required: patch, projectId, sceneId

add_shot

Add one shot to a scene's coverage (a board scene) with an explicit still prompt / video prompt

required: description, projectId, scriptSceneId · optional: coverageType, dialogLineId, duration, generateAudio, insertAtIndex, negativePrompt, reactsToDialogLineId, videoModel, videoPrompt

update_shotCore

Patch a shot's fields — most importantly its still `visualPrompt`

required: patch, projectId · optional: scriptShotId, shotId

update_shot_settings

Set ANY aspect of HOW a shot renders — video source/model, mode, voicing, Ken Burns, morph frames, captions, quality

required: projectId, sceneId · optional: audioLeadMs, autoAddOnRegen, captionsScale, captionsStyle, captionsText, durationSec, endFrameUrl, extendFromSceneId, generateAudio, kenBurns, lcutToNext, loopToVoiceover, mode, morphTargetSceneId, negativePrompt, renderQuality, shotType, splitDialogueRender, startFrameUrl, videoModel, voiceoverPitch, voiceoverSpeed, voiceoverText, voiceoverVoiceName, voicing

generate_scene_coverage

Break ONE scene into individual coverage SHOTS (establishing / dialogue singles with matched eyelines / inserts / reactions), each with its own framin…

required: projectId, scriptSceneId · optional: description, dialogLineId, locationSlug, mode, shots

set_scene_blocking

STAGE a scene — where each subject stands in frame and where the camera is

required: projectId, scriptSceneId · optional: aspect, background, bgSlug, camera, description, items, remove, scene, visualPrompt

copy_shot_to_scene

Copy a FINISHED shot from any scene into another scene as an INTERCUT / flash-back / flash-ahead

required: projectId, sourceShotId, targetScriptSceneId · optional: index, scriptSceneId, shotId

enhance_shot_prompt

AI-enhance a shot's still prompt text into a richer, cinematic prompt (stateless — pass the current `text`; @slug references are preserved)

required: projectId, text · optional: availableSlugs

regenerate_shot_video_prompt

Author a fresh VIDEO (motion) prompt for a shot from its still + current dialogue/line — use after editing a dialogue line so the motion prompt no lon…

required: projectId, stillPrompt · optional: availableSlugs, description, dialogue, shotType, speaker

resolve_scene_refs

Read-only: return the exact reference stills (cast/wardrobe/location/props + the establishing look-ref) that a scene's still render WILL send, each fl…

required: projectId, sceneId · optional: promptOverride

recompute_scene_refs

Rebuild a scene's reference set from its prompt's @slugs (replaces the stored refs — drops a stale/removed @ref, unlike the append-only reconcile)

required: projectId, sceneId

set_shot_lock

Lock or unlock a shot/scene against re-render

required: locked, projectId, sceneId

delete_shot

Delete a shot from a scene (recoverable from the deleted-shot bin)

required: projectId · optional: sceneId, scriptShotId, shotId

delete_board_row

Delete ONE board row by its board sceneId

required: projectId, sceneId

list_deleted_shots

The deleted-shot BIN — shots removed from this project, still recoverable

required: projectId

restore_shot

Put a binned shot back, into ANY scene, at a drop index

required: archivedSceneId, projectId, targetScriptSceneId · optional: index, scriptSceneId

restore_shot_still

Point a shot back at one of its EARLIER stills

required: key, projectId, sceneId

Stills & re-shooting

13 tools

Every shot gets a still before it ever becomes video, which is where the money is saved. A still can be re-shot from a different camera angle, edited to change one described thing, punched into for a tighter insert, or upscaled so an insert cuts at native size. Frames and segments of finished clips can be captured back as reusable references.

generate_scene_previewCore

Generate a single gpt-image-2 still showing what a scene WILL look like as its starting frame

required: projectId, sceneId · optional: allowUnresolvedTags, model, previewOnly, promptOverride, quality

generate_all_scene_previews

Generate the storyboard still for EVERY scene in one call (batch, ≤10 in parallel)

required: projectId · optional: force, model

build_scene_previews_contact_sheet

Stitch every scene's preview frame into a single contact-sheet image (4-column grid)

required: projectId

list_shot_angles

The catalogue of camera angles preview_shot_restage can re-shoot an existing SHOT still from (id, label, description, reposeRisk)

required: projectId

preview_shot_restage

Re-shoot ONE shot's still without re-rendering it — a new camera ANGLE, or an EDIT that changes one described thing and leaves everything else identic…

required: projectId, scriptShotId · optional: angleId, authorPrompt, change, mode, region, sharpen, useCastRefs

apply_shot_restage

Commit a preview_shot_restage result

required: imageUrl, projectId, scriptShotId, target · optional: description, savePrompt, visualPrompt

upscale_shot_still

Make (or reuse) a HIGH-RESOLUTION copy of a shot's still, so inserts can be cut from it at native size

required: projectId, scriptShotId · optional: force

punch_in_shot

PUNCH IN: cut a tighter INSERT out of a frame you already have

required: projectId, rect, scriptShotId · optional: description, target

preview_card_shot

Generate a TITLE CARD image and return its URL

required: projectId · optional: look, text

add_card_shot

Land an already-previewed card as a REAL shot inside a script scene

required: imageUrl, projectId, scriptSceneId · optional: asVideo, durationSec, index, motion, text, videoModel

extract_reference_frame

Grab a single FULL-RESOLUTION frame at `atSec` out of a source video clip and store it as a reusable IMAGE REFERENCE in the project's reference librar…

required: atSec, projectId, sourceUrl · optional: title

extract_reference_segment

Carve an IN→OUT window out of a source video clip and store it as a reusable MOTION REFERENCE in the project's reference library — the video twin of e…

required: inSec, outSec, projectId, sourceUrl · optional: title

extract_last_frame

Pull the last frame of a rendered scene's video clip via ffmpeg

required: projectId, sceneId · optional: versionId

Voice, dialogue & captions

8 tools

Search roughly twelve thousand library voices, assign one to a character, and generate per-line takes that also drive lip-sync. Captions are transcribed from the voice that actually plays, with word timings, and composed into the clip.

search_voices

Search the ElevenLabs shared voice library (~12k voices) by free-text + language/accent/gender/age

optional: accent, age, gender, language, pageSize, search

assign_voice_speaker

Assign a voice to a character so their dialogue/narration is voiced with it

required: characterId, projectId · optional: voiceId, voiceName, voiceRefUrl

recast_voices

Auto-assign fitting library voices to characters that don't have one yet (by their described age/gender)

required: projectId · optional: characterIds

generate_voiceover

Generate the spoken VOICEOVER / narration audio for a SHOT and store it on the row

required: projectId, sceneId · optional: expressiveDefault, expressiveMode, seed, speed, text, voice, voiceFx, voiceFxReverb, voicePitch, voiceSource

voice_dialogue_line

Generate a per-LINE dialogue TTS take (ElevenLabs) for a specific character — the take that also drives Seedance lip-sync

required: projectId, sceneId, text · optional: character, dlId, expressiveDefault, expressiveMode, expressiveTags, expressiveText, nextText, parenthetical, previousRequestIds, previousText, speed, stability, voiceFx, voiceFxReverb, voiceId, voicePitch

tag_scene_voiceovers

Add ElevenLabs v3 expressive delivery tags (inline, phrase-by-phrase) to every scene's dialogue/voiceover for the project, so a re-voice sounds perfor…

required: projectId

generate_captions

Generate burned-in captions for a scene by transcribing its voiceover (Whisper word timings)

required: projectId, sceneId · optional: captionSource, font, highlightColor, holdMs, position, promptHint, style, text, wordsPerSlide

compose_scene

Burn a scene's voiceover audio AND captions into a single COMPOSED clip (the assembler prefers each scene's composed clip)

required: projectId, sceneId · optional: captionBurn

Rendering & assembly

11 tools

Render one shot or a whole scene, fuse a run of shots into a single take, split a take back apart, lay a score under the whole show, and assemble the final cut. Renders are asynchronous — poll_project is the one call that tells an agent where everything stands.

generate_scene

Render the actual video clip for a scene

required: projectId, sceneId · optional: allowExpensive, force, generateAudio, locationImageUrls, mode, model, refImageLabels, refImageOverride

render_scene

Build ONE scene's watchable clip — the board's “Render scene” button

required: projectId, scriptSceneId

poll_projectCore

Check status of every queued/rendering scene in a project in one call

required: projectId

generate_multishot_group

Compose a SELECTED RUN of a scene's existing shots into ONE multishot clip — the board's 'make these shots one take' action

required: projectId, scriptSceneId, shotIds · optional: model, seconds

split_shot_clip

Split a RENDERED multishot group's clip back onto its member shots at the given cut times — the board's 'break this take into its shots' action

required: markers, projectId, scriptShotId · optional: dryRun, overwrite, shotId

detect_clip_cuts

Find the HARD CUTS inside a shot's rendered clip and report their times in seconds

required: projectId, scriptShotId · optional: shotId

set_shot_cutaway

Author a rendered shot as a CUTAWAY over a parent shot — a video OVERLAY that plays on top of the parent for a moment while the PARENT'S AUDIO KEEPS P…

required: offsetSec, parentShotId, projectId, sourceShotId · optional: shotId

clear_shot_cutaway

Remove a shot's cutaway link

required: projectId, sourceShotId · optional: shotId

score_show

Compose ONE continuous music bed for the WHOLE show, shaped to the emotional/tension arc, and lay it under the cut (ducked beneath dialogue)

required: projectId · optional: arc, brief, dropDepth, engine, gainArc, genre, intensity, prompt, sfx

assemble_preview

Assemble the final watchable cut — the Release Cut

required: projectId

get_preview_status

Check whether the assembled show is ready and get its playable URL — WITHOUT triggering a (re)build

required: projectId

Titles & name tags

6 tools

Name tags are rendered as real artwork in one of several lockup styles and placed on a Titles track you can read, retime and re-place cue by cue.

list_title_styles

The lockup styles generate_title_card can render (prestige / news / neon / minimal), each with a note on what it suits

no arguments

generate_title_card

Render a character name tag as ARTWORK — 'LEO ANDERSON' over 'CEO of Vantage Holdings' as a broadcast lower-third — keyed to transparency and cropped,…

required: name, projectId · optional: role, style

list_title_cues

Read the Titles track — every name tag and burned caption with its cueId, kind, timing, placement and whether artwork is attached

required: projectId · optional: kind

add_name_tag

Place a character name tag on the Titles track

required: name, projectId · optional: anchorOffsetMs, anchorSceneId, durationMs, imageScale, imageUrl, role, startMs, x, y

update_name_tag

Patch one cue on the Titles track by cueId (from list_title_cues) — rename, re-place (x/y), retime (startMs moves it without stretching; durationMs se…

required: cueId, projectId · optional: anchorOffsetMs, anchorSceneId, clearImage, durationMs, endMs, imageScale, imageUrl, name, role, startMs, x, y

delete_title_cue

Remove one cue from the Titles track by cueId (either a name tag or a burned caption)

required: cueId, projectId

What costs money

Reading costs nothing. Anything that generates — a still, a voice take, a video clip, an assembled cut — spends credits from the same balance as the studio UI, at the same prices. An agent can check what it is able to spend first with get_credits, which reports what your account can actually spend right now rather than what it merely holds.

Stills before video, always. The cheapest way to work is the way the product works: draw the frame, fix it until it is right, and only then render motion from it. See Storyboard & Shot Sheet.

If something looks wrong

Your client only shows a handful of tools

That is the intended opening set — ask it to search for what you need and it will find the rest. If it cannot see find_tools either, remove the connector and add it again: clients cache the tool list from the moment they connect, and a stale copy is only replaced by reconnecting.

It says it is not authorised

Sign in again from your client's connector settings. If you revoked a token below, any agent using it stops immediately and by design.

A long job seems to hang

Rendering and batch stills are asynchronous — the work continues on our side even if your client gives up waiting. Ask it to poll with poll_project rather than starting the job again; a second attempt can spend credits twice.

The connector will not add at all

Check the host character by character: mcp.showmaker.studio. A near-miss hostname does not fail loudly — it resolves somewhere else entirely and returns a plain 404.