Verified conversions across 205 color spaces: CSS strings, gamut checks, .cube LUTs
Framesail is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Create long-form YouTube videos end to end: script, storyboard, voiceover, final MP4.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http framesail-mcp https://api.framesail.com/mcp
# 2 — ask your agent for something these tools do
# list_channels, create_channel, list_projects and 65 more
Framesail costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http framesail-mcp https://api.framesail.com/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
68 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
List your channels. Every project lives in a channel, which owns the reusable styles (art/narrative/director) that drive generation.
No parameter schema on file.
Create a new channel — the container for projects and their reusable styles. Use when the user wants a fresh creative identity rather than adding to an existing channel.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Display name for the new channel |
| description | string | no | Optional free-text description of the channel's content focus |
List projects in a channel.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | ID of the channel whose projects to list, from list_channels or create_channel |
Create a project. The description (the video concept/topic) seeds script generation, so write a meaningful one. Pass video_format='portrait' for a vertical video — every shot, overlay, and the export are then composed for a 9:16 frame. The response's web_url is the project's page in the web app — share it so the user can follow along.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | ID of the channel to create the project in, from list_channels or create_channel |
| title | string | yes | Project title shown in the app |
| description | string | no | The video concept/topic; seeds script generation, so make it specific and meaningful |
| video_format | string | no | Output frame shape: 'landscape' (16:9, the default — YouTube and long-form) or 'portrait' (9:16 — Shorts, Reels, TikTok). Fixed once the storyboard is generated, so pick it up front. |
Fetch a project row — settings, voice config, default style, export URL.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
Patch project fields. Updatable: title, description, asset_mix, sfx_level, video_concept, voice_mix, voice_tts_provider, script_target_minutes, narrator_speed, video_format. (The narrator's TTS voice is NOT here — use set_narrator_voice.) video_format ('landscape' | 'portrait') is only changeable until the storyboard exists — after that the shots and overlays are composed for
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| fields | object | yes | Partial dict of fields to patch; allowed keys: title, description, sfx_level ('none'|'minimal'|'frequent'), video_concept, voice_mix ('narrator_only'|'narrator_led'|'balanced'|'character_led'), voice_ |
Permanently delete a project and everything in it (script versions, assets, voiceover, segments, renders). Irreversible — confirm with your user first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | ID of the project to permanently delete, from list_projects |
Set the project's default style — the style whose art/narrative/director fields drive its generations. Use after create_style to put a new visual identity into effect, or to switch a project between channel styles.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| style_id | string | yes | ID of the style to make the project's default, from create_style or list_styles |
Merge a patch into the project's burned-in caption config (keys like enabled, plus styling). Read the current value from get_project (caption_config). Applies at the next export — no rebuild needed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| caption_config | object | yes | Partial caption config to merge (keys like enabled, plus styling); read the current value from get_project's caption_config |
THE resume/orientation tool: one call returns every pipeline step's state (script -> scan -> reference_images -> voices -> voiceover -> style_templates -> storyboard -> segment_assets -> scenes -> export), any running jobs, and a next_action telling you exactly what to do next. Call this when picking up an existing project, after any await_jobs, or whenever you're unsure where
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
Poll this between steps: returns active + recently-finished AI jobs (scope by project_id, or style_id for style analysis), plus per-segment- asset render statuses for projects. A step is done when its jobs reach status=complete (or error, with a user-readable message). NOTE: finished jobs drop out of jobs after ~30s — a short list does NOT mean work was lost; judge render bat
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Project ID to scope jobs to; pass exactly one of project_id or style_id |
| style_id | string | no | Style ID to scope jobs to (style analysis); pass exactly one of project_id or style_id |
Block (server-side) until the scope has no pending/running jobs, or the timeout passes — use this instead of polling get_workflow_status yourself. Returns {done, jobs}. If done=false the work is still running: just call await_jobs again (a 3-5 minute storyboard takes a few consecutive calls). Keep timeout_seconds <= 50 so the client doesn't time out the tool call.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Project ID whose jobs to wait for; pass exactly one of project_id or style_id |
| style_id | string | no | Style ID whose analysis/template jobs to wait for; pass exactly one of project_id or style_id |
| timeout_seconds | integer | no | Max seconds to block server-side before returning done=false; keep <= 50 so the client doesn't time out the tool call |
Inspect the prompt sections a generation job exposes for per-call override via editable_sections (jobs: script, script_scan, storyboard, segment_image, segment_video, voice_block, ...). Sections marked locked cannot be overridden.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job | string | yes | Generation job name, e.g. "script", "script_scan", "storyboard", "segment_image", "segment_video", "voice_block" |
List the models allowed for a generation job, with display names, credit estimates, and each model's settings_schema — the valid keys for that tool's settings param (e.g. image quality/orientation, video duration). The first entry is the default every tool uses when model is omitted. Voice models carry a provider field — a voice_block model must match the project's voice_tt
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job | string | yes | Generation job whose allowed models to list, e.g. "script", "storyboard", "segment_image", "segment_video", "voice_block" |
Generate the project's script from its description/concept and the channel's narrative style. Async — returns {job_id}; poll get_workflow_status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| model | string | no | Model ID to generate with; empty uses the default (see list_models("script")) |
| editable_sections | no | Per-call prompt section overrides, keyed by section name; see get_section_template("script") for the sections this job exposes | |
| settings | no | Model-specific settings; valid keys come from the model's settings_schema in list_models("script") |
Read the active script's full text + the version list. Use this to show the script to your user for review/feedback before scan_script — the review-edit-resave loop (get_script -> discuss -> save_script) is the expected workflow when the user wants input.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
Save script text (your own draft, or an edited version of the generated one — saving creates a new version, old versions are kept). Run scan_script afterwards so assets and voice blocks reflect the new text.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| content | string | yes | Full script text to save as a new version; plain prose narration, optionally with [SCENE: ...] direction paragraphs, <break time="0.5s" /> pauses, and Name: speaker prefixes |
AI-rewrite a passage of the active script in the project's narrative voice (the same in-editor revise the UI offers). selected_text must appear verbatim in the script; omit it to revise the whole script. Synchronous — returns {revised_text}, which is NOT saved: splice it over selected_text (or replace the full script) and call save_script to keep it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| instruction | string | yes | Natural-language edit instruction, e.g. "make the intro punchier" |
| selected_text | string | no | Exact passage to rewrite; must appear verbatim in the active script. Omit to revise the whole script |
Switch the project's active script to another saved version (ids come from get_script's version list — every save_script creates one). Re-run scan_script / rescan_voice_blocks afterwards if the text differs, since downstream artifacts follow the active version.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| script_id | string | yes | ID of the script version to activate, from get_script's version list |
Analyze the active script: extracts character/environment/object assets and splits narration into voice blocks. DESTRUCTIVE on re-run (assets are recreated, not merged — curated descriptions, reference images, and voices are lost; prefer rescan_voice_blocks after script edits). Async — returns {job_id}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| model | string | no | Model ID to scan with; empty uses the default (see list_models("script_scan")) |
| editable_sections | no | Per-call prompt section overrides, keyed by section name; see get_section_template("script_scan") |
List the project's assets extracted by scan_script — characters, environments, objects. Each has a description (the spec every shot uses to render it — surfaced top-level here; the raw row nests it at ai_output.description), an optional reference image (file_path is a public URL — view_image it), and for characters a voice_id. Review these after scan_script: fix descriptions, t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| asset_type | string | no | Optional filter: "character", "environment", or "object"; empty lists all asset types |
Manually add a character/environment/object the scan missed. asset_type: "character" | "environment" | "object". The description is the generation-facing spec of its look — be specific.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| asset_type | string | yes | Kind of asset: "character", "environment", or "object" |
| name | string | yes | Asset name as the script refers to it (e.g. the character's name) |
| description | string | no | Generation-facing spec of the asset's look; every shot renders from it, so be specific |
Rename an asset and/or rewrite its description. If the look changed, regenerate its reference image afterwards so renders match.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| asset_id | string | yes | Asset ID, as returned by list_assets or create_asset |
| name | string | no | New asset name; empty leaves the name unchanged |
| description | string | no | New generation-facing look description; empty leaves it unchanged |
Delete a project asset (e.g. one the scan over-extracted).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| asset_id | string | yes | ID of the asset to delete, from list_assets |
Render an asset's reference image in the channel's art style — the visual anchor that keeps a character/environment looking identical across every shot. EVERY character, environment, and object asset needs one before generate_voiceover (the server enforces this; fire the jobs for all assets, then one await_jobs). Async — the job writes the image onto the asset row: await_jobs(p
| Parameter | Type | Required | Notes |
|---|---|---|---|
| asset_id | string | yes | ID of the asset to render a reference image for, from list_assets |
| model | string | no | Image model ID; empty uses the server default for reference images |
| editable_sections | no | Per-call prompt section overrides, keyed by section name; see get_section_template for the reference-image job | |
| settings | no | Model-specific settings (e.g. image quality/orientation); valid keys come from the model's settings_schema in list_models |
Bind a TTS voice to a character asset — required before generate_voiceover for every character with dialogue (the narrator's voice is separate: set_narrator_voice). Browse ids with list_voices.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| asset_id | string | yes | Character asset ID, from list_assets |
| voice_id | string | yes | TTS voice ID, from list_voices (use the provider matching the project's voice_tts_provider) |
List available TTS voices (id, label, preview audio URL) for a provider: "minimax" (default engine) or "elevenlabs". Match the project's voice_tts_provider (see get_project) so picked ids work with its engine.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | no | TTS engine to list voices for: "minimax" (default engine) or "elevenlabs"; match the project's voice_tts_provider |
| group | string | no | Return only this catalogue group (case-insensitive; e.g. "Narration", "Characters"). Empty returns every group — the ElevenLabs catalogue is 150+ voices, so filter it by group; the response's groups |
Set the project's narrator TTS voice — required before generate_voiceover whenever the script has narration. Browse ids with list_voices. (Character dialogue voices are separate: set_character_voice.)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| voice_id | string | yes | TTS voice ID for the narrator, from list_voices (use the provider matching the project's voice_tts_provider) |
List the project's voice blocks (per-speaker narration chunks) with their audio status and assigned voices.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| include_subtitle_data | boolean | no | Include each block's word-level subtitle timings — bulky and rarely needed; omitted by default (subtitle_data reports "omitted" when present but stripped) |
Override one voice block's voice or playback volume (block ids from list_voice_blocks). Re-run generate_voiceover for the block afterwards if you changed its voice — existing audio is not regenerated automatically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| voice_block_id | string | yes | Voice block ID, from list_voice_blocks |
| voice_id | string | no | New TTS voice ID for this block, from list_voices; empty leaves the voice unchanged |
| volume | no | Playback volume for this block, 0-1; omit to leave unchanged |
Re-extract voice blocks from the active script WITHOUT touching assets or their reference images — the non-destructive alternative to scan_script after a script edit. Existing audio is superseded by the new block split, so re-run generate_voiceover afterwards. Async — returns {job_id}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
Generate TTS audio for the project's voice blocks. Without voice_block_ids it fills gaps: only blocks with no audio yet run, so re-calling it is always safe (already-generated and currently-generating blocks are skipped, never re-billed). Pass voice_block_ids to explicitly REgenerate those blocks (e.g. after changing a block's voice). Speakers must have voices bound first — set
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| model | string | no | TTS model ID; empty uses the default for the project's TTS provider. If set, it must belong to that provider — see list_models("voice_block") for each model's provider |
| voice_block_ids | no | Block IDs (from list_voice_blocks) to explicitly REgenerate; omit to fill gaps — only blocks with no audio yet run | |
| editable_sections | no | Per-call prompt section overrides applied to every selected block; see get_section_template("voice_block") | |
| settings | no | Model-specific TTS settings applied to every selected block; valid keys come from the model's settings_schema in list_models("voice_block") |
Plan the full visual storyboard: segments, shot pacing, image/video prompts, overlays, continuation chains — driven by the channel's director and art styles. Requires voiceover to exist (timing comes from it). BEFORE calling: confirm the project's asset_mix with your user (image vs video vs generated_graphic percentages, update_project) — the storyboard plans against it and vid
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| model | string | no | Model ID to plan with; empty uses the default (see list_models("storyboard")) |
| editable_sections | no | Per-call prompt section overrides, keyed by section name; see get_section_template("storyboard") | |
| settings | no | Model-specific settings; valid keys come from the model's settings_schema in list_models("storyboard") |
List the storyboard's segments (narration span, type, duration, creative direction). The 1-based segment_number is the handle every segment tool takes (update/split/combine/continuation/regenerate) — you never need a UUID. Each segment also reports continues_from_segment. When set, this shot is a CONTINUATION of that earlier segment: its rendered frame carries over (same com
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| offset | integer | no | 0-based index of the first segment to return (pagination) |
| limit | integer | no | Maximum segments to return; 0 returns all. Long-form projects can hold 100+ segments — page with offset/limit instead of pulling everything at once. |
List one segment's assets (images/video/overlays) including their status, config (prompts, model), and public URLs of rendered files — pass an image's public_url to view_image to actually look at it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
Regenerate a segment's primary image or video with optional overrides — the API equivalent of the editor's expert drawer. asset_type: "image" | "video" (for a video segment, "image" targets its start frame). Use a different model, override prompt sections (see get_section_template("segment_image")), or tweak settings (e.g. image quality), then re-run just this asset. Async — re
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
| asset_type | string | yes | "image" or "video"; for a video segment, "image" targets its start frame |
| model | string | no | Model ID to render with; empty uses the job's default (see list_models("segment_image") / list_models("segment_video")) |
| editable_sections | no | Per-call prompt section overrides, keyed by section name; see get_section_template("segment_image") or ("segment_video") | |
| settings | no | Model-specific settings (e.g. image quality, video duration); valid keys come from the model's settings_schema in list_models |
Change a segment's visual type: "image" | "video" | "overlay_scene". carry_frame=true reuses the already-rendered image as the video start frame (or vice versa) instead of recreating it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
| segment_type | string | yes | New visual type: "image", "video" (fetched b-roll only — requires media_source "real"), or "overlay_scene" |
| carry_frame | boolean | no | True reuses the already-rendered frame as the new type's starting visual instead of recreating it from scratch |
| media_source | string | no | "" keeps the segment's current source; "real" makes the visual fetched stock footage / a real photo (b-roll) instead of a generated one; "generated" switches back |
| dry_run | boolean | no | True previews the consequences (assets kept / staled / recreated / deleted, rendered assets lost) without changing anything |
Rewrite one segment's creative direction from feedback ("make this shot a close-up", "show the machine from above") — an LLM rewrites the shot's prompts; continuation links, SFX, and overlays are preserved. The visual assets reset to not_started: re-render them afterwards (generate_segments or regenerate_segment_asset). For a precise prompt tweak with no rewrite, use regenerate
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
| user_input | string | yes | Natural-language feedback describing the change to this shot, e.g. "make this a close-up" or "show the machine from above" |
| dry_run | boolean | no | True previews the consequences (assets recreated, rendered assets lost) without changing anything |
Split a segment at the given time offsets (ms, 1-3 cuts → 2-4 parts). inherit_index picks which resulting part keeps the original creative data. Later segments renumber — re-check get_segments before further edits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based number of the segment to split, as reported by get_segments |
| offsets_ms | array | yes | Cut points as millisecond offsets from the segment start, ascending; 1-3 cuts producing 2-4 parts |
| inherit_index | integer | no | 0-based index of the resulting part that keeps the original creative data (default: the first part) |
| dry_run | boolean | no | True previews the consequences without changing anything |
Merge a segment with an adjacent one (segment numbers must be neighbors). keep: "this" | "other" — whose creative data survives. Later segments renumber — re-check get_segments before further edits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
| with_segment_number | integer | yes | 1-based number of the adjacent segment to merge with (must neighbor segment_number) |
| keep | string | no | Whose creative data survives the merge: "this" (segment_number) or "other" (with_segment_number) |
| dry_run | boolean | no | True previews the consequences without changing anything |
Make a segment's image render as a continuation of an EARLIER segment's frame (same composition evolving — the storyboard's continues_from_segment, settable after the fact). continues_from is that earlier segment's number; pass 0 to clear the link. Regenerate the segment's image afterwards — the reference is applied at generation time.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based number of the segment whose image should continue an earlier frame, as reported by get_segments |
| continues_from | integer | no | 1-based number of the EARLIER segment whose frame this one continues; pass 0 to clear the link |
Attach a sound effect from the audio library to a segment (find track ids via browse_audio_library with category="sfx"). Re-run build_scenes to get it onto the timeline.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
| library_track_id | string | yes | Audio library track ID, from browse_audio_library(category="sfx") |
Remove a sound effect from a segment. With one SFX attached, no name needed; with several, pass sfx_name (the asset name shown by get_segment_assets).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_number | integer | yes | 1-based segment number, as reported by get_segments |
| sfx_name | string | no | Name of the SFX asset to remove, as shown by get_segment_assets; needed only when the segment has several SFX attached |
Render every actionable segment asset (images, video clips, overlays) across the project, in dependency order. THE most expensive call in the pipeline: ALWAYS dry_run=true first, show your user the estimate next to get_credit_balance, and wait for a fresh yes before the real run — prior blanket permission ("do the whole thing") does not cover this spend. Pass segment_numbers to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| dry_run | boolean | no | True returns the credit-cost estimate without rendering anything; ALWAYS run true first and get user approval before the real run |
| segment_numbers | no | 1-based segment numbers (from get_segments) to render only a subset; omit to render every actionable asset in the project | |
| asset_scope | string | no | "" renders everything actionable; "no_clips" is the cheap base pass (images, overlays, fetched b-roll — no generated video clips); "clips_only" renders just the generated clips |
Compile segments + assets + voiceover into the editor/render timeline (scenes). Run after segment assets are complete, before export.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
List the project's scenes (composition layers, durations, layout).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| include_composition | boolean | no | Include each scene's full composition JSON (layers, layout) — kilobytes per scene, so page with offset/limit when True; the default summary rows are enough for ids and director notes |
| offset | integer | no | 0-based index of the first scene to return (pagination) |
| limit | integer | no | Maximum scenes to return; 0 returns all |
Edit ONE scene with a natural-language note (the same director chat the editor UI uses): move/restyle/add/remove layers and overlays, retime, etc. Synchronous — returns the applied mutations + updated scene. Address the scene by project_id + segment_number (preferred — always resolves to the current scene) or by scene_id from a fresh list_scenes call. Scene durations are locked
| Parameter | Type | Required | Notes |
|---|---|---|---|
| message | string | yes | Natural-language edit note for this scene, e.g. "move the caption to the top" or "remove the overlay" |
| project_id | no | Project ID; required (with segment_number) when not passing scene_id | |
| segment_number | no | 1-based segment number of the scene to edit (from list_scenes or get_segments) — preferred over scene_id because it is resolved to the current scene at call time | |
| scene_id | no | ID of the scene to edit, from a FRESH list_scenes call — scene ids change whenever segments are edited (split/combine/update-content), so never reuse ids saved earlier; prefer project_id + segment_num | |
| conversation_history | no | Prior chat turns as [{"role": ..., "content": ...}] to continue an editing conversation on this scene; omit to start fresh |
Apply a project-WIDE director note ("make the intro punchier", "all captions bigger", "tighten pacing in the back half"). A routing pass picks only the scenes the note applies to and edits each one. Synchronous — a few seconds per affected scene. Returns the per-scene results; re-run export_video afterwards to see changes in the final render.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| message | string | yes | Project-wide director note in natural language, e.g. "make the intro punchier" or "all captions bigger" |
Render the final MP4 (Remotion). Fetches the current timeline and queues the render. Async — poll get_workflow_status for the video_export job, then call get_video_url.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
Download URL for the most recent completed export.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
List the channel's style rows (variable groups). Styles hold the art_style / narrative_style / director_style / script_prompt fields that drive every generation step, plus any custom @variables.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | ID of the channel that owns the styles, from list_channels |
Fetch one style row — its inputs (reference material), analyzed fields (art_style, narrative_style, director_style, script_prompt, ...), and templates: {"character": url|null, "environment": url|null}, the two template images. A null there means that template is genuinely missing and needs generate_style_template; a URL means it exists (view_image it) — don't re-render it. Sh
| Parameter | Type | Required | Notes |
|---|---|---|---|
| style_id | string | yes | Style ID, as returned by create_style or list_styles |
Hand-edit a style's analyzed fields after reviewing them — e.g. tighten the art_style wording or adjust the director_style pacing rules. fields is the FULL flat dict to write: {key: {"value": str, "applies_to": [...]}} (fetch with get_style, modify, send back). Editing fields does NOT trigger re-analysis, so your edits stick.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| style_id | string | yes | Style ID, as returned by create_style or list_styles |
| fields | object | yes | Sparse patch of style fields, shaped {key: {"value": str, "applies_to": [...]}} — send ONLY the keys you are changing; unlisted keys keep their current value |
The curated preset catalog for the no-AI style creation path, grouped by axis (art_style / narrative_style / director_style). Show the user the labels + descriptions and let THEM pick one per axis — don't choose silently. Art presets include preview image URLs (view_image works on them). Create with create_style(presets={axis: id, ...}) — instant, no analysis job. Full field te
No parameter schema on file.
Create a style. Two mutually exclusive paths: References (best): inputs=[{"input_type": "youtube" | "text", "value": "<url or description>"}] — YouTube videos are watched (a channel link or @handle resolves to that channel's newest usable upload) and text directions read; async analysis writes the style's art/narrative/director fields: await_jobs(style_id=...) before using the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | ID of the channel to create the style in, from list_channels |
| name | string | yes | Display name for the style |
| inputs | no | Reference material to analyze, [{"input_type": "youtube" | "text", "value": "<url or description>"}]; a youtube value can be a video link or a channel link/@handle (resolved to that channel's newest u | |
| presets | no | Preset IDs per axis, {"art_style": id, "narrative_style": id, "director_style": id}, from list_style_presets; instant, no analysis. Mutually exclusive with inputs |
Re-run style analysis (after changing a style's inputs). Async — await_jobs(style_id=...) until the style_analysis job completes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| style_id | string | yes | ID of the style to re-analyze, from create_style or list_styles |
Render one of a style's two template images — a REAL step of style setup, not an optional extra: a style isn't finished until both its character and environment templates are rendered (the app shows them on the style card). Asset reference images render against them (characters → character template; environments and objects → environment template), and segment renders fall back
| Parameter | Type | Required | Notes |
|---|---|---|---|
| style_id | string | yes | Style ID, as returned by create_style or list_styles |
| template_type | string | yes | Which of the style's two template images to render: "character" or "environment" — run once for each |
| replace | boolean | no | Set True ONLY to deliberately overwrite an existing template of this type — the user must have asked for a new one. Leave False and the call refuses rather than clobbering a template the style already |
| model | string | no | Image model ID; empty uses the template job's default (see list_models) |
| editable_sections | no | Per-call prompt section overrides, keyed by section name; see get_section_template for the template job |
Delete a style (e.g. a failed analysis experiment). Don't delete a style that projects still use as their default — rebind them first with set_project_style.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| style_id | string | yes | ID of the style to delete, from list_styles |
Register a BYOK provider API key (encrypted at rest, BYOK plan only). Jobs whose model belongs to this provider then run on YOUR key and charge 0 credits. Providers: openai, gemini, anthropic, fal, elevenlabs, minimax.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | yes | Provider the key belongs to: "openai", "gemini", "anthropic", "fal", "elevenlabs", or "minimax" |
| key | string | yes | The provider API key to register; stored encrypted at rest |
List registered BYOK providers (masked — only the last 4 characters).
No parameter schema on file.
Verify the connection: the account email and plan behind the current credential. Call once after connecting — before creating anything — to confirm you're on the right account; costs nothing.
No parameter schema on file.
Current credit balance + plan info. Check before expensive steps (a full segment render can cost hundreds of credits — generate_segments dry_run gives the estimate). Jobs covered by a BYOK provider key bill 0.
No parameter schema on file.
Browse the audio library for background music and sound effects. category: "music" | "sfx". Returns track ids for add_music_track / add_segment_sfx.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| category | string | no | Track kind: "music" (background tracks) or "sfx" (sound effects); empty returns both |
| search | string | no | Free-text search over track names/descriptions; empty for no filter |
| mood | string | no | Filter by the track's mood tag; empty for no filter |
| genre | string | no | Filter by the track's genre tag; empty for no filter |
List the project's background music tracks (volume, loop, timing).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
Add background music to the project from the audio library (find track ids with browse_audio_library, category="music"). Defaults loop the track under the whole video at bed level (volume 0.12 ≈ -18.4 dB under narration — don't raise it without being asked); re-run export_video to hear it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| library_track_id | string | yes | Audio library track ID, from browse_audio_library(category="music") |
| name | string | no | Display name for the track on the project's timeline |
| volume | number | no | Playback volume 0-1; the 0.12 default sits at bed level under narration — don't raise it unless asked |
| loop | boolean | no | True loops the track under the whole video; false plays it once |
| start_frame | integer | no | Timeline frame at which the track starts (0 = start of the video) |
Tweak a music track. fields keys: name, volume (0-1), loop, start_frame, duration_frames, position, trim_start_frame, trim_end_frame.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| track_id | string | yes | Music track ID, from list_music_tracks or add_music_track |
| fields | object | yes | Partial dict of track fields to patch; allowed keys: name, volume (0-1), loop, start_frame, duration_frames, position, trim_start_frame, trim_end_frame |
Remove a music track from the project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| track_id | string | yes | ID of the music track to remove, from list_music_tracks |
Fetch a rendered Framesail image so you (and your user) can SEE it — pass a URL from get_segment_assets, get_style, or asset endpoints. Returns the image inline. Only Framesail media URLs are allowed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Public Framesail media URL to fetch — a public_url from get_segment_assets, a file_path from list_assets, or a template/preset image URL from get_style / list_style_presets; other hosts are rejected |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Framesail or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.27.2.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Framesail can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.