Framesail is an MCP server with 72 tools an agent can call, among them activate_script_version, add_music_track, add_segment_sfx. It answers at https://api.framesail.com/mcp over streamable HTTP, and it listed its tools to an anonymous client, so no sign-in was needed for that. Our probes reached it 10 of 10 times since 5 September 2026; the last check, on 18 October 2026, succeeded.
Create long-form YouTube videos end to end: script, storyboard, voiceover, final MP4.
Description as the publisher wrote it.
| Tool | What it does |
|---|---|
activate_script_version | 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 Inputs: script_id |
add_music_track | 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 wit Inputs: project_id, library_track_id, name, volume, loop, start_frame |
add_segment_sfx | Attach a sound effect from the audio library to a segment (find track ids via browse_audio_library with category="sfx"). Re-run build_scenes to get it onto the timeline. Inputs: project_id, segment_number, library_track_id |
analyze_style | Re-run style analysis (after changing a style's inputs). Async — await_jobs(style_id=...) until the style_analysis job completes. Inputs: style_id |
animate_segment | 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 ren Inputs: project_id, segment_number, voice |
await_jobs | 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 Inputs: project_id, style_id, timeout_seconds |
browse_audio_library | 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, Inputs: category, search, mood, genre |
build_scenes | 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 Inputs: project_id |
change_segment_type | 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 stat Inputs: project_id, segment_number, segment_type, carry_frame, media_source, dry_run |
combine_segments | 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 Inputs: project_id, segment_number, with_segment_number, keep, dry_run |
create_asset | 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 Inputs: project_id, asset_type, name, description |
create_channel | 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. Inputs: name, description |
create_project | 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 Inputs: channel_id, title, description, video_format |
create_style | 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 u Inputs: channel_id, name, inputs, presets |
delete_asset | Delete a project asset (e.g. one the scan over-extracted). Inputs: asset_id |
delete_project | Permanently delete a project and everything in it (script versions, assets, voiceover, segments, renders). Irreversible — confirm with your user first. Inputs: project_id |
delete_style | 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. Inputs: style_id |
director_note | Edit ONE scene with a natural-language note (the same director chat the editor UI uses): move/restyle/add/remove layers and overlays, retime, etc. Synchronous — returns the applied mutations + updated scene. Address the scene by project_id Inputs: message, project_id, segment_number, scene_id, conversation_history |
export_video | 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. Inputs: project_id |
generate_asset_reference | 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 Inputs: asset_id, model, editable_sections, settings |
generate_script | Generate the project's script from its description/concept and the channel's narrative style. Async — returns {job_id}; poll get_workflow_status. Inputs: project_id, model, editable_sections, settings |
generate_segments | 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 w Inputs: project_id, dry_run, segment_numbers, asset_scope |
generate_storyboard | 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 Inputs: project_id, model, editable_sections, settings |
generate_style_template | 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 Inputs: style_id, template_type, replace, model, editable_sections |
generate_voiceover | 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). P Inputs: project_id, model, voice_block_ids, editable_sections, settings |
get_credit_balance | 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. |
get_pipeline_progress | 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_actio Inputs: project_id |
get_project | Fetch a project row — settings, voice config, default style, export URL. Inputs: project_id |
get_script | Read the active script's full text + the version list. Use this to show the script to your user for review/feedback before scan_script — the review-edit-resave loop (get_script -> discuss -> save_script) is the expected workflow when the us Inputs: project_id |
get_section_template | 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. Inputs: job |
get_segment_assets | 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. Inputs: project_id, segment_number |
get_segments | 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, o Inputs: project_id, offset, limit |
get_style | 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 ther Inputs: style_id |
get_video_url | Download URL for the most recent completed export. Inputs: project_id |
get_workflow_status | 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, w Inputs: project_id, style_id |
list_assets | 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 ref Inputs: project_id, asset_type |
list_channels | List your channels. Every project lives in a channel, which owns the reusable styles (art/narrative/director) that drive generation. |
list_models | 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 t Inputs: job |
list_music_tracks | List the project's background music tracks (volume, loop, timing). Inputs: project_id |
list_projects | List projects in a channel. Inputs: channel_id |
list_provider_keys, list_scenes, list_style_presets, list_styles, list_voice_blocks, list_voices, project_director_note, regenerate_segment_asset, remove_music_track, remove_segment_sfx, rescan_voice_blocks, revise_script, rollback_segment_asset, save_script, scan_script, set_character_voice, set_narrator_voice, set_project_style, set_provider_key, set_segment_continuation, split_segment, update_asset, update_caption_config, update_music_track, update_project, update_segment_content, update_segment_prompts, update_style_fields, update_style_references, update_voice_block, view_image, whoami
Every block below points at https://api.framesail.com/mcp. Pick your client and copy.
claude mcp add --transport http framesail https://api.framesail.com/mcp
{
"mcpServers": {
"framesail": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.framesail.com/mcp"]
}
}
}{
"mcpServers": {
"framesail": {
"url": "https://api.framesail.com/mcp"
}
}
}{
"servers": {
"framesail": {
"type": "http",
"url": "https://api.framesail.com/mcp"
}
}
}{
"context_servers": {
"framesail": {
"url": "https://api.framesail.com/mcp"
}
}
}{
"mcpServers": {
"framesail": {
"serverUrl": "https://api.framesail.com/mcp"
}
}
}{
"mcpServers": {
"framesail": {
"url": "https://api.framesail.com/mcp"
}
}
}name: framesail
version: 0.0.1
schema: v1
mcpServers:
- name: framesail
type: streamable-http
url: https://api.framesail.com/mcp{
"mcpServers": {
"framesail": {
"httpUrl": "https://api.framesail.com/mcp"
}
}
}{
"mcpServers": {
"framesail": {
"type": "http",
"url": "https://api.framesail.com/mcp"
}
}
}{
"mcpServers": {
"framesail": {
"url": "https://api.framesail.com/mcp"
}
}
}goose://extension?url=https%3A%2F%2Fapi.framesail.com%2Fmcp&type=streamable_http&id=framesail&name=framesail
It answered our last check on 18 October 2026 in 226 ms. Over 10 checks since 5 September 2026 it answered 10. Status here comes from Neuronto's own probes, not from the publisher.
Yes. It is published by framesail.com and served from api.framesail.com, the vendor's own domain: https://api.framesail.com/mcp.
72, as returned by the server's own tools/list on 10 September 2026: activate_script_version, add_music_track, add_segment_sfx, analyze_style, animate_segment, await_jobs, browse_audio_library, build_scenes, and 64 more.
It answered our last check on 18 October 2026 in 226 ms. Over 10 checks since 5 September 2026 it answered 10.
Put the server under mcpServers in ~/.cursor/mcp.json with the URL https://api.framesail.com/mcp. The exact JSON is above, with the same setup for Claude Code, Claude Desktop, VS Code, Windsurf, Zed, Gemini CLI and the rest.
It listed its tools to an anonymous client, so reading the tool list needs no key. Individual tools can still ask for credentials in their own inputs.
Publisher: com.framesail. Endpoint host: api.framesail.com. ARD identifier: urn:air:com.framesail:mcp:framesail.
First indexed 31 August 2026. The tools are exactly what the server returned; nothing on this page
is inferred from its name. Ranking in Neuronto search is never for sale.