com.framesail/framesail
REMOTE · API.FRAMESAIL.COM · SCANNED SEP 20
Create long-form YouTube videos end to end: script, storyboard, voiceover, final MP4.
Available components
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http com-framesail-framesail 'https://api.framesail.com/mcp'
{
"mcpServers": {
"com-framesail-framesail": {
"url": "https://api.framesail.com/mcp"
}
}
} {
"servers": {
"com-framesail-framesail": {
"type": "http",
"url": "https://api.framesail.com/mcp"
}
}
} [mcp_servers.com-framesail-framesail] url = "https://api.framesail.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-framesail-framesail": {
"type": "remote",
"url": "https://api.framesail.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-framesail-framesail --url 'https://api.framesail.com/mcp' --transport streamable-http
mcp_servers:
com-framesail-framesail:
url: "https://api.framesail.com/mcp" {
"McpServers": {
"com-framesail-framesail": {
"Transport": "http",
"Url": "https://api.framesail.com/mcp"
}
}
} assistant mcp add com-framesail-framesail -t streamable-http -u 'https://api.framesail.com/mcp'
{
"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.
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
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 |
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 →
activate_script_version 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.
| Name | Type | Req | Description |
|---|---|---|---|
| script_id | string | yes | ID of the script version to activate, from get_script's version list |
No output schema declared.
No examples provided.
add_music_track 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.
| Name | Type | Req | Description |
|---|---|---|---|
| library_track_id | string | yes | Audio library track ID, from browse_audio_library(category="music") |
| loop | boolean | – | True loops the track under the whole video; false plays it once |
| name | string | – | Display name for the track on the project's timeline |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| start_frame | integer | – | Timeline frame at which the track starts (0 = start of the video) |
| volume | number | – | Playback 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 Add segment sound effect ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| library_track_id | string | yes | Audio library track ID, from browse_audio_library(category="sfx") |
| 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 |
No output schema declared.
No examples provided.
analyze_style Re-analyze style ~59
Re-run style analysis (after changing a style's inputs). Async — await_jobs(style_id=...) until the style_analysis job completes.
| Name | Type | Req | Description |
|---|---|---|---|
| style_id | string | yes | ID of the style to re-analyze, from create_style or list_styles |
No output schema declared.
No examples provided.
animate_segment 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| voice | boolean | – | True 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 Wait for 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.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | – | Project ID whose jobs to wait for; pass exactly one of project_id or style_id |
| style_id | string | – | Style ID whose analysis/template jobs to wait for; pass exactly one of project_id or style_id |
| timeout_seconds | integer | – | Max 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Track kind: "music" (background tracks) or "sfx" (sound effects); empty returns both |
| genre | string | – | Filter by the track's genre tag; empty for no filter |
| mood | string | – | Filter by the track's mood tag; empty for no filter |
| search | string | – | Free-text search over track names/descriptions; empty for no filter |
No output schema declared.
No examples provided.
build_scenes 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.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
change_segment_type 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.
| Name | Type | Req | Description |
|---|---|---|---|
| carry_frame | boolean | – | True reuses the already-rendered frame as the new type's starting visual instead of recreating it from scratch |
| dry_run | boolean | – | True previews the consequences (assets kept / staled / recreated / deleted, rendered assets lost) without changing anything |
| media_source | string | – | "" 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_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" |
No output schema declared.
No examples provided.
combine_segments 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | True previews the consequences without changing anything |
| keep | string | – | Whose creative data survives the merge: "this" (segment_number) or "other" (with_segment_number) |
| 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) |
No output schema declared.
No examples provided.
create_asset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | yes | Kind of asset: "character", "environment", or "object" |
| description | string | – | Generation-facing spec of the asset's look; every shot renders from it, so be specific |
| name | string | yes | Asset name as the script refers to it (e.g. the character's name) |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
create_channel 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.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional free-text description of the channel's content focus |
| name | string | yes | Display name for the new channel |
No output schema declared.
No examples provided.
create_project 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | ID of the channel to create the project in, from list_channels or create_channel |
| description | string | – | The video concept/topic; seeds script generation, so make it specific and meaningful |
| title | string | yes | Project title shown in the app |
| video_format | string | – | 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. |
No output schema declared.
No examples provided.
create_style 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | ID of the channel to create the style in, from list_channels |
| inputs | – | – | 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… |
| name | string | yes | Display name for the style |
| presets | – | – | Preset 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 Delete asset ~41
Delete a project asset (e.g. one the scan over-extracted).
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | ID of the asset to delete, from list_assets |
No output schema declared.
No examples provided.
delete_project Delete project ~62
Permanently delete a project and everything in it (script versions, assets, voiceover, segments, renders). Irreversible — confirm with your user first.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | ID of the project to permanently delete, from list_projects |
No output schema declared.
No examples provided.
delete_style 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.
| Name | Type | Req | Description |
|---|---|---|---|
| style_id | string | yes | ID of the style to delete, from list_styles |
No output schema declared.
No examples provided.
director_note Director note (one scene) ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| conversation_history | – | – | Prior chat turns as [{"role": ..., "content": ...}] to continue an editing conversation on this scene; omit to start fresh |
| message | string | yes | Natural-language edit note for this scene, e.g. "move the caption to the top" or "calmer motion" |
| project_id | – | – | Project ID; required (with segment_number) when not passing scene_id |
| scene_id | – | – | 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_nu… |
| segment_number | – | – | 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 |
No output schema declared.
No examples provided.
export_video 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.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
generate_asset_reference Generate asset reference image ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | ID of the asset to render a reference image for, from list_assets |
| editable_sections | – | – | Per-call prompt section overrides, keyed by section name; see get_section_template for the reference-image job |
| model | string | – | Image model ID; empty uses the server default for reference images |
| settings | – | – | Model-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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| editable_sections | – | – | Per-call prompt section overrides, keyed by section name; see get_section_template("script") for the sections this job exposes |
| model | string | – | Model ID to generate with; empty uses the default (see list_models("script")) |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| settings | – | – | Model-specific settings; valid keys come from the model's settings_schema in list_models("script") |
No output schema declared.
No examples provided.
generate_segments Render segment assets ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_scope | string | – | "" 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_run | boolean | – | True returns the credit-cost estimate without rendering anything; ALWAYS run true first and get user approval before the real run |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| segment_numbers | – | – | 1-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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| editable_sections | – | – | Per-call prompt section overrides, keyed by section name; see get_section_template("storyboard") |
| model | string | – | Model ID to plan with; empty uses the default (see list_models("storyboard")) |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| settings | – | – | Model-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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| editable_sections | – | – | Per-call prompt section overrides, keyed by section name; see get_section_template for the template job |
| model | string | – | Image model ID; empty uses the template job's default (see list_models) |
| replace | boolean | – | 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 alread… |
| 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 |
No output schema declared.
No examples provided.
generate_voiceover 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.
| Name | Type | Req | Description |
|---|---|---|---|
| editable_sections | – | – | Per-call prompt section overrides applied to every selected block; see get_section_template("voice_block") |
| model | string | – | 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 |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
| settings | – | – | Model-specific TTS settings applied to every selected block; valid keys come from the model's settings_schema in list_models("voice_block") |
| voice_block_ids | – | – | Block 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 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
get_project Get project ~43
Fetch a project row — settings, voice config, default style, export URL.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
get_script 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.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
get_section_template 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.
| Name | Type | Req | Description |
|---|---|---|---|
| job | string | yes | Generation job name, e.g. "script", "script_scan", "storyboard", "segment_image", "segment_video", "voice_block" |
No output schema declared.
No examples provided.
get_segment_assets 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
No output schema declared.
No examples provided.
get_segments List 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum segments to return; 0 returns all. Long-form projects can hold 100+ segments — page with offset/limit instead of pulling everything at once. |
| offset | integer | – | 0-based index of the first segment to return (pagination) |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
get_style 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).
| Name | Type | Req | Description |
|---|---|---|---|
| style_id | string | yes | Style ID, as returned by create_style or list_styles |
No output schema declared.
No examples provided.
get_video_url Get video download URL ~37
Download URL for the most recent completed export.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
get_workflow_status 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.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | – | Project ID to scope jobs to; pass exactly one of project_id or style_id |
| style_id | string | – | Style 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 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".
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Optional filter: "character", "environment", or "object"; empty lists all asset types |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
list_channels 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| job | string | yes | Generation 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 List music tracks ~41
List the project's background music tracks (volume, loop, timing).
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
list_projects List projects ~37
List projects in a channel.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | ID of the channel whose projects to list, from list_channels or create_channel |
No output schema declared.
No examples provided.
list_provider_keys 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 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}.
| Name | Type | Req | Description |
|---|---|---|---|
| include_composition | boolean | – | 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 |
| limit | integer | – | Maximum scenes to return; 0 returns all |
| offset | integer | – | 0-based index of the first scene to return (pagination) |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
list_style_presets 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | ID of the channel that owns the styles, from list_channels |
No output schema declared.
No examples provided.
list_voice_blocks 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.
| Name | Type | Req | Description |
|---|---|---|---|
| include_subtitle_data | boolean | – | Include each block's word-level subtitle timings — bulky and rarely needed; omitted by default (subtitle_data reports "omitted" when present but stripped) |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
list_voices 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.
| Name | Type | Req | Description |
|---|---|---|---|
| group | string | – | 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… |
| provider | string | – | TTS 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 Director note (whole project) ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Project-wide director note in natural language, e.g. "make the intro punchier" or "all captions bigger" |
| project_id | string | yes | Project ID, as returned by create_project or list_projects |
No output schema declared.
No examples provided.
regenerate_segment_asset 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}.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | yes | "image" or "video"; for a video segment, "image" targets its start frame |
| editable_sections | – | – | Per-call prompt section overrides, keyed by section name; see get_section_template("segment_image") or ("segment_video") |
| model | string | – | Model ID to render with; empty uses the job's default (see list_models("segment_image") / list_models("segment_video")) |
| 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 |
| settings | – | – | Model-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 Remove music track ~37
Remove a music track from the project.
| Name | Type | Req | Description |
|---|---|---|---|
| track_id | string | yes | ID of the music track to remove, from list_music_tracks |
No output schema declared.
No examples provided.
remove_segment_asset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | – | ID of the SFX or overlay asset, from get_segment_assets; needed only when the segment has more than one of them |
| 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 |
No output schema declared.
No examples provided.
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.