Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

com.framesail/framesail

REMOTE · API.FRAMESAIL.COM · SCANNED SEP 20

Create long-form YouTube videos end to end: script, storyboard, voiceover, final MP4.

−1 this week 92 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security94
Transport & Reachability100
Schema Quality & AI Usability71
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 13576 tokens (~188/item across 72 items; 72 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management98
  • Stability check failed: schema churn in the 30 days we've observed: 1 tool removals, 0 breaking changes, 0 auth/transport breaks, 5 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 73 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the com.framesail/framesail MCP server?

com.framesail/framesail is a hosted endpoint at https://api.framesail.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.framesail.com

# add to Claude Code
claude mcp add --transport http com-framesail-framesail 'https://api.framesail.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "com-framesail-framesail": {
      "url": "https://api.framesail.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-framesail-framesail": {
      "type": "http",
      "url": "https://api.framesail.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.com-framesail-framesail]
url = "https://api.framesail.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-framesail-framesail": {
      "type": "remote",
      "url": "https://api.framesail.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-framesail-framesail --url 'https://api.framesail.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-framesail-framesail:
    url: "https://api.framesail.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-framesail-framesail": {
      "Transport": "http",
      "Url": "https://api.framesail.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add com-framesail-framesail -t streamable-http -u 'https://api.framesail.com/mcp'
// mcp.json
{
  "mcpServers": {
    "com-framesail-framesail": {
      "type": "http",
      "url": "https://api.framesail.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 18 Sept 26 −1
    • Stability: pass → fail security
    • A breaking change shipped without a version bump: still 1.27.2 security
    • Tool “remove_segment_sfx” was removed security
    • New tool “remove_segment_asset”, which the server declares destructive security
    • Tool “add_segment_sfx” rewrote its description, which is the text the model reads security
    • Tool “director_note” rewrote its description, which is the text the model reads security
    • Tool “get_segments” rewrote its description, which is the text the model reads security
    • Tool “project_director_note” rewrote its description, which is the text the model reads security
    • Tool “save_script” rewrote its description, which is the text the model reads security
    • “director_note” reworded the description of “message” cosmetic
  • 10 Sept 26 0
    • Tool “generate_voiceover” rewrote its description, which is the text the model reads security
  • 1 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “update_style_references”, which the server declares destructive security
    • Tool “activate_script_version” rewrote its description, which is the text the model reads security
    • Tool “browse_audio_library” rewrote its description, which is the text the model reads security
    • Tool “build_scenes” rewrote its description, which is the text the model reads security
    • Tool “change_segment_type” rewrote its description, which is the text the model reads security
    • Tool “combine_segments” rewrote its description, which is the text the model reads security
    • Tool “create_asset” rewrote its description, which is the text the model reads security
    • Tool “generate_segments” rewrote its description, which is the text the model reads security
    • Tool “generate_storyboard” rewrote its description, which is the text the model reads security
    • Tool “get_segments” rewrote its description, which is the text the model reads security
    • Tool “get_style” rewrote its description, which is the text the model reads security
    • Tool “list_models” rewrote its description, which is the text the model reads security
    • Tool “list_provider_keys” rewrote its description, which is the text the model reads security
    • Tool “list_scenes” rewrote its description, which is the text the model reads security
    • Tool “list_voice_blocks” rewrote its description, which is the text the model reads security
    • Tool “list_voices” rewrote its description, which is the text the model reads security
    • Tool “rescan_voice_blocks” rewrote its description, which is the text the model reads security
    • Tool “revise_script” rewrote its description, which is the text the model reads security
    • Tool “save_script” rewrote its description, which is the text the model reads security
    • Tool “scan_script” rewrote its description, which is the text the model reads security
    • Tool “split_segment” rewrote its description, which is the text the model reads security
    • Tool “update_project” rewrote its description, which is the text the model reads security
    • Tool “update_segment_content” rewrote its description, which is the text the model reads security
    • Tool “update_style_fields” rewrote its description, which is the text the model reads security
    • Schema quality: 152 → 188 functional
    • New tool “animate_segment” functional
    • New tool “rollback_segment_asset” functional
    • New tool “update_segment_prompts” functional
    • “change_segment_type” added an optional parameter “dry_run” cosmetic
    • “change_segment_type” added an optional parameter “media_source” cosmetic
    • “combine_segments” added an optional parameter “dry_run” cosmetic
    • “generate_segments” added an optional parameter “asset_scope” cosmetic
    • “get_segments” added an optional parameter “limit” cosmetic
    • “get_segments” added an optional parameter “offset” cosmetic
    • “list_scenes” added an optional parameter “include_composition” cosmetic
    • “list_scenes” added an optional parameter “limit” cosmetic
    • “list_scenes” added an optional parameter “offset” cosmetic
    • “list_voice_blocks” added an optional parameter “include_subtitle_data” cosmetic
    • “list_voices” added an optional parameter “group” cosmetic
    • “split_segment” added an optional parameter “dry_run” cosmetic
    • “update_segment_content” added an optional parameter “dry_run” cosmetic
    • “change_segment_type” reworded the description of “segment_type” cosmetic
    • “save_script” reworded the description of “content” cosmetic
    • “update_project” reworded the description of “fields” cosmetic
    • “update_style_fields” reworded the description of “fields” cosmetic
    • “rescan_voice_blocks” dropped the optional parameter “model” cosmetic
  • 26 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 +1
    • Stability: 0.97 → pass security
  • 23 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Aug 26 0
    • Tool “director_note” rewrote its description, which is the text the model reads security
    • “director_note” added an optional parameter “project_id” cosmetic
    • “director_note” added an optional parameter “segment_number” cosmetic
    • “director_note” reworded the description of “scene_id” cosmetic
    • “director_note” made “scene_id” optional cosmetic
  • 16 Aug 26 0
    • Tool “list_models” rewrote its description, which is the text the model reads security
    • “generate_voiceover” reworded the description of “model” cosmetic
    • “update_project” reworded the description of “fields” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://api.framesail.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.framesail.com CN=YE1,O=Let's Encrypt,C=US 19 Aug 2026 17 Nov 2026 ECDSA 256 ECDSA-SHA384 6c30faf009f53b8303de16181953decf929
SANs: api.framesail.com
CN=YE1,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 5ddd70dd31f801c85c186a7a04b80afe
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.framesail.com. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
framesail.com. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://api.framesail.com/.well-known/oauth-protected-resource/mcp"

Bearer resource_metadata="https://api.framesail.com/.well-known/oauth-protected-resource/mcp"
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
content-security-policy default-src 'none'; frame-ancestors 'none'
x-content-type-options nosniff
x-frame-options DENY
referrer-policy no-referrer

Protected resource metadata

Document https://api.framesail.com/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://api.framesail.com/mcp
Authorisation server https://api.framesail.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.framesail.com/mcp Verified 200
http (plaintext) http://api.framesail.com/mcp HTTPS enforced 301 https://api.framesail.com/mcp
MCP tools · 72 exposed · ~11,710 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
activate_script_version ~95

Switch the project's active script to another saved version (ids come from get_script's version list — each generate_script run creates one; save_script edits the active version in place). Re-run scan_script / rescan_voice_blocks afterwards if the text differs, since downstream artifacts follow the active version.

NameTypeReqDescription
script_idstringyesID of the script version to activate, from get_script's version list

No output schema declared.

No examples provided.

add_music_track ~210

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.

NameTypeReqDescription
library_track_idstringyesAudio library track ID, from browse_audio_library(category="music")
loopbooleanTrue loops the track under the whole video; false plays it once
namestringDisplay name for the track on the project's timeline
project_idstringyesProject ID, as returned by create_project or list_projects
start_frameintegerTimeline frame at which the track starts (0 = start of the video)
volumenumberPlayback volume 0-1; the 0.12 default sits at bed level under narration — don't raise it unless asked

No output schema declared.

No examples provided.

add_segment_sfx ~114

Attach a sound effect from the audio library to a segment (find track ids via browse_audio_library with category="sfx"). It lands on the segment's scene immediately — no build_scenes needed.

NameTypeReqDescription
library_track_idstringyesAudio library track ID, from browse_audio_library(category="sfx")
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments

No output schema declared.

No examples provided.

analyze_style ~59

Re-run style analysis (after changing a style's inputs). Async — await_jobs(style_id=...) until the style_analysis job completes.

NameTypeReqDescription
style_idstringyesID of the style to re-analyze, from create_style or list_styles

No output schema declared.

No examples provided.

animate_segment ~277

Animate one segment in a single call: flip it to a generated video shot (keeping its rendered image as the clip's first frame) and START the clip render immediately. BILLS video credits on this call — the segment's image must already be rendered (400 otherwise). A refused generation (out of credits, already running) rolls the flip back, so the segment is either animating or exactly as it was. This is the ONLY way to a generated video (voice=true for a Talking Head) — change_segment_type refuses that target; it owns the other kind switches (real media, overlay scene, back to a still — segment_type "image" with carry_frame=true reverts an animated shot for free). Async — returns {ai_job_id, segment}; await_jobs until the clip completes.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments
voicebooleanTrue lip-syncs the on-frame speaker to the voiceover (lip-sync model family — bills the exact segment length, so long segments cost proportionally more); False is an ordinary prompt-driven clip. Alwa…

No output schema declared.

No examples provided.

await_jobs ~179

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.

NameTypeReqDescription
project_idstringProject ID whose jobs to wait for; pass exactly one of project_id or style_id
style_idstringStyle ID whose analysis/template jobs to wait for; pass exactly one of project_id or style_id
timeout_secondsintegerMax seconds to block server-side before returning done=false; keep <= 50 so the client doesn't time out the tool call

No output schema declared.

No examples provided.

browse_audio_library ~168

Browse the audio library for background music and sound effects. category: "music" | "sfx". Returns {tracks} — track ids feed add_music_track / add_segment_sfx. Zero matches also returns the mood and genre tags the library actually carries, so retry with one of those rather than guessing new filter words.

NameTypeReqDescription
categorystringTrack kind: "music" (background tracks) or "sfx" (sound effects); empty returns both
genrestringFilter by the track's genre tag; empty for no filter
moodstringFilter by the track's mood tag; empty for no filter
searchstringFree-text search over track names/descriptions; empty for no filter

No output schema declared.

No examples provided.

build_scenes ~93

Compile segments + assets + voiceover into the editor/render timeline (scenes). Run after segment assets are complete, before export. Returns a receipt — {scene_count, scenes: [{scene_id, segment_number, duration_frames, status, layer_count}]}; composition detail via list_scenes.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

change_segment_type ~383

Change what a segment's base visual IS: a generated still ("image"), fetched real media (media_source="real" — a real photo for "image", stock b-roll footage for "video"), or an overlay scene. Generated video is NOT set here — it's the state a rendered still reaches through animate_segment (voice=true for a Talking Head), and a "video" target without media_source="real" is refused with that guidance. segment_type "image" with carry_frame=true reverts an animated shot back to its still for free. media_source="real" turns the shot into fetched media with no start frame and no generation. carry_frame=true reuses the already-rendered image instead of recreating it; ignored for a real target. SFX and overlays always survive a type change. dry_run=true previews what would be kept / staled / recreated / deleted before you commit.

NameTypeReqDescription
carry_framebooleanTrue reuses the already-rendered frame as the new type's starting visual instead of recreating it from scratch
dry_runbooleanTrue previews the consequences (assets kept / staled / recreated / deleted, rendered assets lost) without changing anything
media_sourcestring"" 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
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments
segment_typestringyesNew visual type: "image", "video" (fetched b-roll only — requires media_source "real"), or "overlay_scene"

No output schema declared.

No examples provided.

combine_segments ~198

Merge a segment with an adjacent one (segment numbers must be neighbors). keep: "this" | "other" — whose creative data survives: its assets are kept (rendered frame/clip marked stale against the combined narration and its prompts re-derived); the other segment's assets are deleted. Later segments renumber — re-check get_segments before further edits.

NameTypeReqDescription
dry_runbooleanTrue previews the consequences without changing anything
keepstringWhose creative data survives the merge: "this" (segment_number) or "other" (with_segment_number)
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments
with_segment_numberintegeryes1-based number of the adjacent segment to merge with (must neighbor segment_number)

No output schema declared.

No examples provided.

create_asset ~220

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. The scan reads narration and `[SCENE: ...]` directions, so the common miss is anyone NEITHER ever names — a host the video needs but no text mentions, a recurring set the script only implies. Name the asset exactly as the script or directions will refer to it so the storyboard binds the two, then generate_asset_reference it like any scanned asset.

NameTypeReqDescription
asset_typestringyesKind of asset: "character", "environment", or "object"
descriptionstringGeneration-facing spec of the asset's look; every shot renders from it, so be specific
namestringyesAsset name as the script refers to it (e.g. the character's name)
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

create_channel ~73

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.

NameTypeReqDescription
descriptionstringOptional free-text description of the channel's content focus
namestringyesDisplay name for the new channel

No output schema declared.

No examples provided.

create_project ~208

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.

NameTypeReqDescription
channel_idstringyesID of the channel to create the project in, from list_channels or create_channel
descriptionstringThe video concept/topic; seeds script generation, so make it specific and meaningful
titlestringyesProject title shown in the app
video_formatstringOutput 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.

No output schema declared.

No examples provided.

create_style ~312

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 style. (Image/video FILE references require the multipart REST endpoint POST /styles.) Presets (instant, no analysis): presets={"art_style": id, "narrative_style": id, "director_style": id} — all three axes, ids from list_style_presets.

NameTypeReqDescription
channel_idstringyesID of the channel to create the style in, from list_channels
inputsReference 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…
namestringyesDisplay name for the style
presetsPreset IDs per axis, {"art_style": id, "narrative_style": id, "director_style": id}, from list_style_presets; instant, no analysis. Mutually exclusive with inputs

No output schema declared.

No examples provided.

delete_asset ~41

Delete a project asset (e.g. one the scan over-extracted).

NameTypeReqDescription
asset_idstringyesID of the asset to delete, from list_assets

No output schema declared.

No examples provided.

delete_project ~62

Permanently delete a project and everything in it (script versions, assets, voiceover, segments, renders). Irreversible — confirm with your user first.

NameTypeReqDescription
project_idstringyesID of the project to permanently delete, from list_projects

No output schema declared.

No examples provided.

delete_style ~63

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.

NameTypeReqDescription
style_idstringyesID of the style to delete, from list_styles

No output schema declared.

No examples provided.

director_note ~374

Edit ONE scene with a natural-language note (the same director chat the editor UI uses): move/restyle/add/remove layers and overlays, change motion, etc. Storyboard image, video and voiceover layers can't be removed. Synchronous — returns summary, mutations, skipped_mutations (edits that did NOT land, with reasons — check it) and the scene's layers ({id, name, layerType, segmentAssetId}); list_scenes(include_composition=True) has the full composition. Address the scene by project_id + segment_number (preferred) or a scene_id from a fresh list_scenes call. Scene durations are locked to the narration: don't ask to extend/shorten any but the final scene. remove_segment_asset deletes an SFX or overlay by id without a model in the loop; for whole-video notes, project_director_note.

NameTypeReqDescription
conversation_historyPrior chat turns as [{"role": ..., "content": ...}] to continue an editing conversation on this scene; omit to start fresh
messagestringyesNatural-language edit note for this scene, e.g. "move the caption to the top" or "calmer motion"
project_idProject ID; required (with segment_number) when not passing scene_id
scene_idID 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_nu…
segment_number1-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

No output schema declared.

No examples provided.

export_video ~69

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.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

generate_asset_reference ~205

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(project_id), then list_assets and view_image the file_path to check likeness.

NameTypeReqDescription
asset_idstringyesID of the asset to render a reference image for, from list_assets
editable_sectionsPer-call prompt section overrides, keyed by section name; see get_section_template for the reference-image job
modelstringImage model ID; empty uses the server default for reference images
settingsModel-specific settings (e.g. image quality/orientation); valid keys come from the model's settings_schema in list_models

No output schema declared.

No examples provided.

generate_script ~134

Generate the project's script from its description/concept and the channel's narrative style. Async — returns {job_id}; poll get_workflow_status.

NameTypeReqDescription
editable_sectionsPer-call prompt section overrides, keyed by section name; see get_section_template("script") for the sections this job exposes
modelstringModel ID to generate with; empty uses the default (see list_models("script"))
project_idstringyesProject ID, as returned by create_project or list_projects
settingsModel-specific settings; valid keys come from the model's settings_schema in list_models("script")

No output schema declared.

No examples provided.

generate_segments ~322

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. The staged flow is cheapest: asset_scope="no_clips" first (images + overlays), review, then animate_segment the shots that deserve motion. Pass segment_numbers to render only a subset — e.g. segments 1-18 for the opening minute before committing to the full video. Safe to re-run: completed and currently-generating assets are skipped, so a second call only picks up new/failed work. Async — one job per asset; await_jobs until all complete.

NameTypeReqDescription
asset_scopestring"" 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
dry_runbooleanTrue returns the credit-cost estimate without rendering anything; ALWAYS run true first and get user approval before the real run
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numbers1-based segment numbers (from get_segments) to render only a subset; omit to render every actionable asset in the project

No output schema declared.

No examples provided.

generate_storyboard ~202

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). Plans generated stills + real media only (real media requires the style's @real-media tag); generated video is added per segment after the images render, with animate_segment. Async — returns {job_id}; this is the longest LLM step.

NameTypeReqDescription
editable_sectionsPer-call prompt section overrides, keyed by section name; see get_section_template("storyboard")
modelstringModel ID to plan with; empty uses the default (see list_models("storyboard"))
project_idstringyesProject ID, as returned by create_project or list_projects
settingsModel-specific settings; valid keys come from the model's settings_schema in list_models("storyboard")

No output schema declared.

No examples provided.

generate_style_template ~333

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 on them when a shot has no asset reference — so finish BOTH before generate_asset_reference. Run once per template_type ("character" | "environment") for every new style; skip types the style already has (get_style's `templates`). A template already exists is a hard stop here — the call refuses unless replace=True, because overwriting one silently re-anchors every future render. Async — await_jobs(style_id=...), then get_style.

NameTypeReqDescription
editable_sectionsPer-call prompt section overrides, keyed by section name; see get_section_template for the template job
modelstringImage model ID; empty uses the template job's default (see list_models)
replacebooleanSet 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 alread…
style_idstringyesStyle ID, as returned by create_style or list_styles
template_typestringyesWhich of the style's two template images to render: "character" or "environment" — run once for each

No output schema declared.

No examples provided.

generate_voiceover ~345

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_narrator_voice / set_character_voice. Optional editable_sections/settings apply to every selected block (see get_section_template("voice_block") and list_models("voice_block")). On a project that already has a storyboard, segment timings are re-aligned to the new audio automatically when the run finishes (prompts and rendered images untouched) — await_jobs until the project is idle before exporting. Async — returns one job per block.

NameTypeReqDescription
editable_sectionsPer-call prompt section overrides applied to every selected block; see get_section_template("voice_block")
modelstringTTS 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
project_idstringyesProject ID, as returned by create_project or list_projects
settingsModel-specific TTS settings applied to every selected block; valid keys come from the model's settings_schema in list_models("voice_block")
voice_block_idsBlock IDs (from list_voice_blocks) to explicitly REgenerate; omit to fill gaps — only blocks with no audio yet run

No output schema declared.

No examples provided.

get_credit_balance ~55

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_pipeline_progress ~191

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 a video stands — never guess pipeline position. Every step carries a web_url — the page in the Framesail web app where your user can see that step's output. Share it whenever you present a step's results ("review the storyboard here: ...") so they can inspect and edit in the browser; the app and this API act on the same live state.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

get_project ~43

Fetch a project row — settings, voice config, default style, export URL.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

get_script ~87

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.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

get_section_template ~93

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.

NameTypeReqDescription
jobstringyesGeneration job name, e.g. "script", "script_scan", "storyboard", "segment_image", "segment_video", "voice_block"

No output schema declared.

No examples provided.

get_segment_assets ~95

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.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments

No output schema declared.

No examples provided.

get_segments ~260

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. Returns {total, offset, returned, segments}; on big projects page through with offset/limit rather than fetching all segments in one call. Each segment reports `continues_from_segment`: when set, this shot CONTINUES that earlier segment's frame (same composition, only the delta changes); null is a fresh shot. Adjust with set_segment_continuation. Each segment's segment_assets also lists its overlays (asset_type ui_element, text under config.overlay) — the one call that audits every lower third / title card in the project.

NameTypeReqDescription
limitintegerMaximum segments to return; 0 returns all. Long-form projects can hold 100+ segments — page with offset/limit instead of pulling everything at once.
offsetinteger0-based index of the first segment to return (pagination)
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

get_style ~173

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. Show fields to the user for review; fine-tune with update_style_fields. `inputs_stale: true` means the references changed since the last analysis run — the analyzed fields don't reflect them; offer the user analyze_style (it rewrites those fields).

NameTypeReqDescription
style_idstringyesStyle ID, as returned by create_style or list_styles

No output schema declared.

No examples provided.

get_video_url ~37

Download URL for the most recent completed export.

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

get_workflow_status ~188

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 batches by `segment_assets` statuses (or get_pipeline_progress), never by counting jobs. Prefer await_jobs over polling this in a tight loop.

NameTypeReqDescription
project_idstringProject ID to scope jobs to; pass exactly one of project_id or style_id
style_idstringStyle ID to scope jobs to (style analysis); pass exactly one of project_id or style_id

No output schema declared.

No examples provided.

list_assets ~175

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, then generate_asset_reference for each one (all of them need a reference image before voiceover). asset_type filter: "character" | "environment" | "object".

NameTypeReqDescription
asset_typestringOptional filter: "character", "environment", or "object"; empty lists all asset types
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

list_channels ~38

List your channels. Every project lives in a channel, which owns the reusable styles (art/narrative/director) that drive generation.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_models ~159

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). When model is omitted the server picks: the account's saved expert-drawer choice for that job/scope if one exists, else the first entry here. Voice models carry a `provider` field — a voice_block model must match the project's voice_tts_provider or generate_voiceover rejects it.

NameTypeReqDescription
jobstringyesGeneration job whose allowed models to list, e.g. "script", "storyboard", "segment_image", "segment_video", "voice_block"

No output schema declared.

No examples provided.

list_music_tracks ~41

List the project's background music tracks (volume, loop, timing).

NameTypeReqDescription
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

list_projects ~37

List projects in a channel.

NameTypeReqDescription
channel_idstringyesID of the channel whose projects to list, from list_channels or create_channel

No output schema declared.

No examples provided.

list_provider_keys ~48

List registered BYOK providers (masked — only the last 4 characters). Returns {keys: [...]}; an empty list means no keys are registered (every job bills platform credits).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_scenes ~189

List the project's scenes in timeline order. Default rows are light summaries ({scene_id, segment_number, duration_frames, status, layer_count}) — enough to address a scene by number or id; include_composition=True returns the full layer/layout JSON (bulky — page with offset/limit on long projects). Returns {total, offset, returned, scenes}.

NameTypeReqDescription
include_compositionbooleanInclude 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
limitintegerMaximum scenes to return; 0 returns all
offsetinteger0-based index of the first scene to return (pagination)
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

list_style_presets ~117

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 text lands on the style row (get_style shows it after creation).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_styles ~69

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.

NameTypeReqDescription
channel_idstringyesID of the channel that owns the styles, from list_channels

No output schema declared.

No examples provided.

list_voice_blocks ~140

List the project's voice blocks (per-speaker narration chunks) with their audio status and assigned voices. A block's `scene_direction` is the script's `[SCENE: ...]` direction governing it (never spoken; null when the span carries none). Word-level subtitle timings are stripped unless include_subtitle_data=True.

NameTypeReqDescription
include_subtitle_databooleanInclude each block's word-level subtitle timings — bulky and rarely needed; omitted by default (subtitle_data reports "omitted" when present but stripped)
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

list_voices ~203

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. Returns {groups: {name: count}, voices}; the ElevenLabs catalogue is 150+ voices, so pass group (names from `groups`) rather than reading it all at once.

NameTypeReqDescription
groupstringReturn 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…
providerstringTTS engine to list voices for: "minimax" (default engine) or "elevenlabs"; match the project's voice_tts_provider

No output schema declared.

No examples provided.

project_director_note ~143

Apply a project-WIDE director note ("make the intro punchier", "all captions bigger"). A routing pass picks the scenes the note applies to and edits each — at most 10 scenes per call, so a change touching more needs repeat calls or per-scene director_note. Synchronous — a few seconds per scene. Returns per-scene results (summary, mutation_count).

NameTypeReqDescription
messagestringyesProject-wide director note in natural language, e.g. "make the intro punchier" or "all captions bigger"
project_idstringyesProject ID, as returned by create_project or list_projects

No output schema declared.

No examples provided.

regenerate_segment_asset ~262

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 — returns {job_id}.

NameTypeReqDescription
asset_typestringyes"image" or "video"; for a video segment, "image" targets its start frame
editable_sectionsPer-call prompt section overrides, keyed by section name; see get_section_template("segment_image") or ("segment_video")
modelstringModel ID to render with; empty uses the job's default (see list_models("segment_image") / list_models("segment_video"))
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments
settingsModel-specific settings (e.g. image quality, video duration); valid keys come from the model's settings_schema in list_models

No output schema declared.

No examples provided.

remove_music_track ~37

Remove a music track from the project.

NameTypeReqDescription
track_idstringyesID of the music track to remove, from list_music_tracks

No output schema declared.

No examples provided.

remove_segment_asset ~146

Delete a segment's sound effect or overlay (lower third, title card, callout) — the asset and every scene layer built from it, immediately. These are the only removable assets: the segment's image, video and voiceover are structural. With one SFX/overlay attached, no id needed.

NameTypeReqDescription
asset_idstringID of the SFX or overlay asset, from get_segment_assets; needed only when the segment has more than one of them
project_idstringyesProject ID, as returned by create_project or list_projects
segment_numberintegeryes1-based segment number, as reported by get_segments

No output schema declared.

No examples provided.

Common questions

What is the com.framesail/framesail MCP server?

com.framesail/framesail is an MCP server listed in the public MCP registry as com.framesail/framesail. Create long-form YouTube videos end to end: script, storyboard, voiceover, final MP4. This page covers its hosted endpoint (https://api.framesail.com/mcp).

Is the com.framesail/framesail MCP server safe to use?

com.framesail/framesail scores 92 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the com.framesail/framesail MCP server expose?

com.framesail/framesail exposes 72 tools: list_channels, create_channel, list_projects, create_project, get_project, and 67 more. Their descriptions and schemas cost roughly 11,710 tokens of context every time the server is loaded.

Does the com.framesail/framesail MCP server require authentication?

Yes. com.framesail/framesail asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the com.framesail/framesail MCP server still maintained?

com.framesail/framesail is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.