Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,544Letters: 14Defects: 1,324counted 3 min ago
teppi

Server definition

Hash
sha256:60a6147bad539d0375d7354bc51918da4d7910d7af0b1a0458a3776c7df331cd
What it is
What a remote MCP server returned when asked what it offers: 28 tools

The blob, as servednamed by its sha256

{ "instructions": "Framesail turns a brief into a finished video. Steps, in order: channel\nstyle -> script -> Analyze Script (finds the characters, environments,\nobjects and voice blocks) -> reference images -> voices and voiceover ->\nstoryboard (segments) -> segment images, some animated into clips ->\nscenes (built automatically) -> export.\n\nStart and resume with get_status: the account and credits, each step's\nstate and web link, running jobs, and the next step in plain words. A step\ncalled out of order is refused with that next step: do it instead of\nretrying. Generate tools return at once; call get_status with wait=true\nuntil the jobs finish. Work stays saved between sessions: never redo a\nstep because you don't remember doing it.\n\nSpending: generate tools, render and notes spend credits; reads, edits and\nexport are free. Go one step at a time, show the user each result and its\nweb link, and wait for a go-ahead unless they asked for the whole run.\nBefore rendering, always call render with dry_run=true, show the estimate\nbeside credits_available, and wait for a yes given after they saw it; an\nearlier \"do it all\" does not cover it. Never generate finished work again\nunless asked. model, settings and editable_sections (the prompt editor)\napply to named items only and are saved to each for next time.\n\nWords: a segment is one storyboard item; a scene is one editor timeline\nitem. A segment's image is generated first and can be animated into a\nclip; a talking head is a clip with lip sync. Real photos and B-roll are\nfetched, not generated. Overlays are on-screen text (lower thirds, title\ncards, callouts); an overlay segment is all on-screen text, full screen.\nThe brief is what the video is about; the visual concept is how it looks.\nEach channel has exactly one channel style.\n\nThe tools need a Pro, Studio or Scale plan; get_status explains. A 401\nmeans the connection is no longer valid: ask the user to reconnect.\n", "tools": [ { "description": "The account's default model and settings for one kind of generation,\nused when neither the call nor the item's prompt editor names one.\nvoice_block needs provider and segment_video needs talking_head: each\nfamily keeps its own default.", "inputSchema": { "properties": { "action": { "description": "set_model_default: model, optional settings; clear_model_default", "enum": [ "set_model_default", "clear_model_default" ], "type": "string" }, "generation": { "description": "script_scan is Analyze Script; *_reference, reference images; voice_block, the voiceover; segment_image, a segment's image; segment_video, a clip; art_style_*_template, the style's template images", "enum": [ "script", "script_scan", "storyboard", "character_reference", "environment_reference", "object_reference", "voice_block", "segment_image", "segment_video", "art_style_character_template", "art_style_environment_template" ], "type": "string" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "set_model_default: a model id from get_generation_options" }, "provider": { "anyOf": [ { "enum": [ "minimax", "elevenlabs" ], "type": "string" }, { "type": "null" } ], "description": "voice_block: the voice engine (the project's voice_tts_provider)" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" }, "talking_head": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "segment_video: true for talking head models, false for clips" } }, "required": [ "action", "generation" ], "type": "object" }, "name": "account_edit", "outputSchema": null }, { "description": "Add a character, environment or object that Analyze Script missed,\nor rename one or rewrite its description. After a description change,\nrender its reference image again (assets_generate asset_ids).", "inputSchema": { "properties": { "action": { "description": "create: project_id, asset_type, name, optional description; update: asset_id and name and/or description", "enum": [ "create", "update" ], "type": "string" }, "asset_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "update: the asset id" }, "asset_type": { "anyOf": [ { "enum": [ "character", "environment", "object" ], "type": "string" }, { "type": "null" } ], "description": "create: the kind" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "What it looks like; every render follows it, so be specific" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The name the script uses for it" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" } }, "required": [ "action" ], "type": "object" }, "name": "assets_edit", "outputSchema": null }, { "description": "Render reference images, which keep each character, environment and\nobject looking the same in every segment. Needs both style template\nimages. Without asset_ids it renders every asset with none, skipping\nones already rendering, so a repeat never bills twice. Afterwards,\nview_image them to check likeness.", "inputSchema": { "properties": { "asset_ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Assets to render, again if they have one; omit for every asset without a reference image" }, "dry_run": { "default": false, "description": "Return the count and credit estimate; start nothing", "type": "boolean" }, "editable_sections": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Template prompt section overrides, keyed by section id" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Model id (get_generation_options); omit for the saved choice" }, "project_id": { "description": "Project id", "type": "string" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" } }, "required": [ "project_id" ], "type": "object" }, "name": "assets_generate", "outputSchema": null }, { "description": "The project's characters, environments and objects, each with its\ndescription (what every render follows), reference_image (null: not\nrendered; view_image it) and, for characters, voice_id. Each needs a\nreference image before the voiceover.", "inputSchema": { "properties": { "asset_type": { "anyOf": [ { "enum": [ "character", "environment", "object" ], "type": "string" }, { "type": "null" } ], "description": "Only this kind" }, "project_id": { "description": "Project id", "type": "string" } }, "required": [ "project_id" ], "type": "object" }, "name": "assets_read", "outputSchema": null }, { "description": "Permanently delete; irreversible, so confirm with the user first.\nproject: it and everything in it. asset: a character, environment or\nobject. music_track: a background music track. segment_extra: a\nsegment's sound effect or overlay, with its scene layers. A segment's\nimage, clip and voiceover can't be deleted.", "inputSchema": { "properties": { "id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The asset, music track, or segment sound effect or overlay" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" }, "segment_number": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Segment number (1-based, from storyboard_read)" }, "type": { "description": "project: project_id; asset, music_track: id; segment_extra: project_id, segment_number, and id if the segment has several", "enum": [ "project", "asset", "music_track", "segment_extra" ], "type": "string" } }, "required": [ "type" ], "type": "object" }, "name": "delete", "outputSchema": null }, { "description": "Polish the video in the editor; changes show in the next export.\n\nscene_note: edit one scene with a note (move, restyle, add or remove\nlayers and overlays, change the text of a lower third, title card or\ncallout, change motion); spends credits. Returns the changes and\nskipped_mutations: edits that didn't land (applied=false) or landed\ndifferently than asked (applied=true), each with a reason; check them.\nScene lengths follow the narration; the image, clip and voiceover layers\ncan't be removed. project_note: a note for the whole video, applied to\nup to 10 scenes per call; spends credits. captions: merge caption\nsettings. add_sfx: attach a sound effect to a segment. add_music /\nupdate_music: background music timed in seconds; a track's duration\nfollows from its trim.", "inputSchema": { "properties": { "action": { "description": "scene_note: segment_number, message; project_note: message; captions: caption_config; add_sfx: segment_number, library_track_id; add_music: library_track_id, optional name, volume, loop, start_seconds; update_music: track_id and any of name, volume, loop, start_seconds, trim_start_seconds, trim_end_seconds", "enum": [ "scene_note", "project_note", "captions", "add_sfx", "add_music", "update_music" ], "type": "string" }, "caption_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "captions: keys to merge into the caption settings (get_status shows them)" }, "library_track_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A track id from editor_read action=audio_library" }, "loop": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Loop the music under the whole video" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The note in plain words, e.g. \"move the caption to the top\"" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The music track's name" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" }, "segment_number": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Segment number (1-based, from storyboard_read)" }, "start_seconds": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Where the music starts in the video, in seconds" }, "track_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "update_music: a track id from editor_read action=music" }, "trim_end_seconds": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "update_music: where playback stops within the track, in seconds" }, "trim_start_seconds": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "update_music: where playback starts within the track, in seconds" }, "volume": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Music volume 0-1; the 0.12 default sits under the narration, so raise it only if asked" } }, "required": [ "action" ], "type": "object" }, "name": "editor_edit", "outputSchema": null }, { "description": "scenes: the editor timeline, one scene per segment, as {total,\noffset, returned, scenes}; scenes build on their own from the\nstoryboard. music: {tracks}, timed in seconds. audio_library: tracks to\nadd with editor_edit; when nothing matches, it lists the library's moods\nand genres.", "inputSchema": { "properties": { "action": { "description": "scenes: the timeline (project_id); music: the project's music tracks (project_id); audio_library: music and sound effects to add", "enum": [ "scenes", "music", "audio_library" ], "type": "string" }, "category": { "anyOf": [ { "enum": [ "music", "sfx" ], "type": "string" }, { "type": "null" } ], "description": "audio_library: music or sfx (sound effects); omit for both" }, "genre": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "audio_library: a genre tag" }, "include_composition": { "default": false, "description": "scenes: include each scene's full layer JSON (bulky: page it)", "type": "boolean" }, "limit": { "default": 0, "description": "scenes: how many; 0 returns all", "type": "integer" }, "mood": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "audio_library: a mood tag" }, "offset": { "default": 0, "description": "scenes: first to return, 0-based", "type": "integer" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "audio_library: free text" } }, "required": [ "action" ], "type": "object" }, "name": "editor_read", "outputSchema": null }, { "description": "Render the finished video from the editor timeline; free. When the\nexport job completes, get_status carries export_url.", "inputSchema": { "properties": { "project_id": { "description": "Project id", "type": "string" } }, "required": [ "project_id" ], "type": "object" }, "name": "export_video", "outputSchema": null }, { "description": "What a generate call can be told to use.\n\nmodels: the allowed models with credit estimates and settings_schema\n(the valid settings keys); is_default marks the default (the account's\nsaved choice, else Framesail's). Voice and clip models come in families,\neach with its own default: pass provider or talking_head for one family.\n\nprompt_sections: sections with entity_backed=false can be overridden\nwith editable_sections; entity_backed=true sections show the item's own\ncontent (description, prompts, text, brief): change it with the edit\ntools.", "inputSchema": { "properties": { "action": { "description": "models: the allowed models; prompt_sections: the prompt editor's sections", "enum": [ "models", "prompt_sections" ], "type": "string" }, "generation": { "description": "script_scan is Analyze Script; *_reference, reference images; voice_block, the voiceover; segment_image, a segment's image; segment_video, a clip; art_style_*_template, the style's template images", "enum": [ "script", "script_scan", "storyboard", "character_reference", "environment_reference", "object_reference", "voice_block", "segment_image", "segment_video", "art_style_character_template", "art_style_environment_template" ], "type": "string" }, "provider": { "anyOf": [ { "enum": [ "minimax", "elevenlabs" ], "type": "string" }, { "type": "null" } ], "description": "voice_block: the voice engine (the project's voice_tts_provider)" }, "talking_head": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "segment_video: true for talking head models, false for clips" } }, "required": [ "generation", "action" ], "type": "object" }, "name": "get_generation_options", "outputSchema": null }, { "description": "Where things stand and what to do next; start and resume here.\n\nAlways reports the account: plan, credits, credits held by running jobs,\nand credits_available to spend. project_id adds the project's settings,\neach step's state and web link, jobs with readable errors, export_url\nand next_step. channel_id reports the channel style instead:\nanalysis_done, inputs_stale, templates, templates_stale and next_step.\nWithout API access it reports only the account and\nsubscription_needed: pass that on to the user.", "inputSchema": { "properties": { "channel_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Report this channel's style instead of a project" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" }, "wait": { "default": false, "description": "Wait up to about 50 seconds for the jobs in scope to finish, then report only credits, jobs, step states and next_step; call again if some still run", "type": "boolean" } }, "type": "object" }, "name": "get_status", "outputSchema": null }, { "description": "Create a channel or a project, or change a project's title, brief or\nvideo format. A new project takes its channel's style; a channel with no\nstyle needs one (style_edit action=create) before anything is\ngenerated. Share the returned web_url so the user can follow along.", "inputSchema": { "properties": { "action": { "description": "create_channel: name, optional description; create_project: channel_id, title, optional description, video_format; update_project: project_id and any of title, description, video_format", "enum": [ "create_channel", "create_project", "update_project" ], "type": "string" }, "channel_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "create_project: its channel" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "A channel: what it is about. A project: the brief, what the video is about; it seeds the script, so make it specific" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "create_channel: the channel name" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "The project title" }, "video_format": { "anyOf": [ { "enum": [ "landscape", "portrait" ], "type": "string" }, { "type": "null" } ], "description": "landscape (16:9, the default) or portrait (9:16: Shorts, Reels, TikTok); fixed once a storyboard exists" } }, "required": [ "action" ], "type": "object" }, "name": "projects_edit", "outputSchema": null }, { "description": "Your channels, or the projects in one channel.", "inputSchema": { "properties": { "action": { "description": "channels: your channels; projects: the projects in channel_id", "enum": [ "channels", "projects" ], "type": "string" }, "channel_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "projects: the channel" } }, "required": [ "action" ], "type": "object" }, "name": "projects_read", "outputSchema": null }, { "description": "Render segment images and clips, the biggest spend in the video:\nalways run it with dry_run=true first and get the user's yes on the\nestimate.\n\ngenerate: without segment_numbers, everything not yet rendered (items\nrendering are skipped); with them, those segments, finished renders\nincluded, e.g. the first minute before the whole video. Overrides need\nsegment_numbers and what=images or what=clips.\n\nanimate: turn one segment's rendered image into a clip; animate only\nimages worth motion. dry_run quotes the default clip or talking head\nmodel. A refused render leaves the segment as it was; to go back to the\nimage, segment_restructure change_type to=image keep_image=true.\n\nCheck renders with storyboard_read action=segment_assets and\nview_image.", "inputSchema": { "properties": { "action": { "description": "generate: optional segment_numbers, what; animate: segment_number, optional talking_head", "enum": [ "generate", "animate" ], "type": "string" }, "dry_run": { "default": false, "description": "Return the count and credit estimate; start nothing", "type": "boolean" }, "editable_sections": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Template prompt section overrides, keyed by section id" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Model id (get_generation_options); omit for the saved choice" }, "project_id": { "description": "Project id", "type": "string" }, "segment_number": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Segment number (1-based, from storyboard_read)" }, "segment_numbers": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "description": "generate: only these segments, finished ones included; omit for everything not yet rendered" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" }, "talking_head": { "default": false, "description": "animate: true for a talking head (the person in the image speaks the narration with lip sync, billed on the segment's full length); false for a clip", "type": "boolean" }, "what": { "default": "all", "description": "generate: images (everything but clips: images, overlay segments, real photos, B-roll), clips, or all", "enum": [ "images", "clips", "all" ], "type": "string" } }, "required": [ "action", "project_id" ], "type": "object" }, "name": "render", "outputSchema": null }, { "description": "Change the script or its settings; only revise spends credits.\n\nsave: replace the active version's text (the old text is lost: show the\nuser the current script first), then run Analyze Script. Notation, never\nread aloud: `[SCENE: <visual direction>]` as its own paragraph directs\nthe storyboard for the narration after it, until the next one, over the\ndirector style. `<break time=\"1.5s\" />` is the only thing that makes the\nvoice pause (about 0.5s between thoughts, 1.0s between sections; one tag\nwith the total, never two in a row). A paragraph starting `Name: \"...\"`\nis that character's dialogue. A delivery cue in square brackets inside\na line (`[laughs]`, `[sighs]`, `[whispers]`) shapes how it is said; keep\nit inline, never on its own line. MiniMax performs sounds such as\nlaughs, sighs, breathes, gasps and coughs and drops other cues.\n\nactivate_version: switch to another version (each generated script is\none). revise: an AI rewrite of a passage or the whole script in the\nnarrative voice; returns revised_text without saving it: splice it in\nand save.", "inputSchema": { "properties": { "action": { "description": "save: content; activate_version: script_id; revise: instruction, optional selected_text; settings: script_target_minutes and/or voice_mix; set_concept: visual_concept", "enum": [ "save", "activate_version", "revise", "settings", "set_concept" ], "type": "string" }, "content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "save: the full script text" }, "instruction": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "revise: what to change, e.g. \"make the intro punchier\"" }, "project_id": { "description": "Project id", "type": "string" }, "script_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "activate_version: a version id from script_read" }, "script_target_minutes": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "settings: length of the next generated script, in minutes" }, "selected_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "revise: the exact passage to rewrite; omit for the whole script" }, "visual_concept": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "set_concept: how the video looks" }, "voice_mix": { "anyOf": [ { "enum": [ "narrator_only", "narrator_led", "balanced", "character_led" ], "type": "string" }, { "type": "null" } ], "description": "settings: narration versus character dialogue" } }, "required": [ "action", "project_id" ], "type": "object" }, "name": "script_edit", "outputSchema": null }, { "description": "generate: write the script from the brief and the narrative style;\neach run is a new version (review it with script_read).\n\nanalyze (Analyze Script): find the script's characters, environments\nand objects (including any named only in `[SCENE: ...]` directions) and\nsplit it into voice blocks. Existing assets are kept as they are\n(description, reference image, voice) and new ones added; assets the\nscript no longer names stay until the user deletes them. Review with\nassets_read.", "inputSchema": { "properties": { "action": { "description": "generate: write the script; analyze: Analyze Script", "enum": [ "generate", "analyze" ], "type": "string" }, "editable_sections": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Template prompt section overrides, keyed by section id" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Model id (get_generation_options); omit for the saved choice" }, "project_id": { "description": "Project id", "type": "string" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" } }, "required": [ "action", "project_id" ], "type": "object" }, "name": "script_generate", "outputSchema": null }, { "description": "The active script, its versions, and the script settings\n(script_target_minutes, voice_mix, visual concept). Show the script to\nthe user before Analyze Script.", "inputSchema": { "properties": { "project_id": { "description": "Project id", "type": "string" } }, "required": [ "project_id" ], "type": "object" }, "name": "script_read", "outputSchema": null }, { "description": "Change one segment without losing renders; only split spends\ncredits. Returns the changed segments.\n\nset_prompts: write prompts verbatim, no AI rewrite. The renders stay as\nthey are: render the segment again to apply the new prompts.\nset_continuation: make this segment's image continue an earlier one's\n(same composition, only the change); render the image again.\nrollback: restore one of the last 5 renders of the image or clip; the\ncurrent one takes its place, so it can be undone, and the prompt\neditor's model stays as it is. split: cut into 2-4 parts; the\ninheriting part keeps the prompts and renders; the others start empty\nand get prompts written from their narration in the background (spends\ncredits), or give them prompts with set_prompts. Later segments\nrenumber: read the storyboard again before more edits.", "inputSchema": { "properties": { "action": { "description": "set_prompts: image_prompt, video_prompt and/or media_queries; set_continuation: continues_from; rollback: what, optional index; split: offsets_ms, optional inherit_index", "enum": [ "set_prompts", "set_continuation", "rollback", "split" ], "type": "string" }, "continues_from": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "set_continuation: an EARLIER segment number; 0 clears the link" }, "image_prompt": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "set_prompts: the image prompt" }, "index": { "default": 0, "description": "rollback: which earlier render, 0 = the latest", "type": "integer" }, "inherit_index": { "default": 0, "description": "split: the part (0-based) that keeps the prompts and renders", "type": "integer" }, "media_queries": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "set_prompts: searches for a real photo or B-roll" }, "offsets_ms": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "description": "split: 1-3 ascending cut points, in ms from the segment's start; word timings: voiceover_read action=blocks include_subtitle_data=true" }, "project_id": { "description": "Project id", "type": "string" }, "segment_number": { "description": "Segment number (1-based, from storyboard_read)", "type": "integer" }, "video_prompt": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "set_prompts: the motion used when the image is animated" }, "what": { "anyOf": [ { "enum": [ "image", "clip" ], "type": "string" }, { "type": "null" } ], "description": "rollback: restore the image or the clip" } }, "required": [ "action", "project_id", "segment_number" ], "type": "object" }, "name": "segment_edit", "outputSchema": null }, { "description": "Change what a segment is. Every call previews first: when no\nrendered image or clip would be lost it runs; otherwise it changes\nnothing and returns what would be lost. Show the user, then call again\nwith confirm=true.\n\ncombine: merge with a neighboring segment. The kept segment's renders\nstay, retimed to the combined length, but go stale: its prompts are\nrewritten for the combined narration, so render it again after. The\nother's are deleted (the preview names it).\n\nchange_type: to an image, real photo, B-roll (both fetched) or overlay\nsegment. Clips and talking heads come from render action=animate.\nkeep_image turns a clip back into its image, keeping the render. A\nchange between an image, real photo and B-roll keeps the prompts;\nrender the image again.\n\nrewrite: an AI rewrite of the prompts from feedback; render the image\nand clip again after. For exact text, use segment_edit set_prompts.\n\ncombine, rewrite and a change to or from an overlay segment write\nprompts in the background, and a change to a real photo or B-roll with\nno searches yet writes its searches (its prompts stay): a small AI step\nthat spends credits (get_status wait=true). Until it finishes,\nchange_type is refused (409). Sound effects and overlays always\nsurvive; change an overlay's text with editor_edit scene_note. Later\nsegments may renumber: read the storyboard again.", "inputSchema": { "properties": { "action": { "description": "combine: with_segment_number, optional keep; change_type: to, optional keep_image; rewrite: feedback", "enum": [ "combine", "change_type", "rewrite" ], "type": "string" }, "confirm": { "default": false, "description": "Run even though renders are lost; only after the user saw which", "type": "boolean" }, "feedback": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "rewrite: what to change, e.g. \"make this a close-up\"" }, "keep": { "default": "this", "description": "combine: whose prompts and renders survive", "enum": [ "this", "other" ], "type": "string" }, "keep_image": { "default": false, "description": "change_type from a clip to image: keep the rendered image", "type": "boolean" }, "project_id": { "description": "Project id", "type": "string" }, "segment_number": { "description": "Segment number (1-based, from storyboard_read)", "type": "integer" }, "to": { "anyOf": [ { "enum": [ "image", "real_photo", "b_roll", "overlay_segment" ], "type": "string" }, { "type": "null" } ], "description": "change_type: the new kind" }, "with_segment_number": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "combine: the neighboring segment" } }, "required": [ "action", "project_id", "segment_number" ], "type": "object" }, "name": "segment_restructure", "outputSchema": null }, { "description": "Storyboard settings, used by the next storyboard run.", "inputSchema": { "properties": { "action": { "const": "settings", "description": "settings: sfx_level", "type": "string" }, "project_id": { "description": "Project id", "type": "string" }, "sfx_level": { "description": "How many sound effects the storyboard plans", "enum": [ "none", "minimal", "frequent" ], "type": "string" } }, "required": [ "action", "project_id", "sfx_level" ], "type": "object" }, "name": "storyboard_edit", "outputSchema": null }, { "description": "Plan the storyboard: every segment, its timing, image and motion\nprompts, overlays and continuations, following the channel style and\nany `[SCENE: ...]` directions. Needs the finished voiceover (its timing\ndrives the cuts). It plans images, plus real photos and B-roll when the\ndirector style has the `@real-media` tag; clips come later, by animating\nrendered images. Running it again replaces the whole plan, edits\nincluded. The longest step (several minutes): get_status wait=true,\nrepeatedly.", "inputSchema": { "properties": { "editable_sections": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Template prompt section overrides, keyed by section id" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Model id (get_generation_options); omit for the saved choice" }, "project_id": { "description": "Project id", "type": "string" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" } }, "required": [ "project_id" ], "type": "object" }, "name": "storyboard_generate", "outputSchema": null }, { "description": "segments: {total, offset, returned, segments}. Each segment has its\nsegment_number (the handle segment tools take), kind (image, clip,\ntalking head, real photo, B-roll or overlay segment), narration,\nduration, direction, image_prompt, video_prompt (the motion when\nanimated), media_queries (searches for a real photo or B-roll), the\ncharacters, environments and objects it shows, continues_from_segment\n(its image continues that earlier segment's image) and its assets.\n\nsegment_assets: {segment_number, assets}: its image, clip, real photos,\noverlays and sound effects, each with kind, status, prompt, model,\nearlier_renders (what a rollback can restore) and public_url (for\nview_image).", "inputSchema": { "properties": { "action": { "description": "segments: the storyboard, paged; segment_assets: one segment's assets (segment_number)", "enum": [ "segments", "segment_assets" ], "type": "string" }, "limit": { "default": 0, "description": "segments: how many; 0 returns all. Long videos have 100+, so page.", "type": "integer" }, "offset": { "default": 0, "description": "segments: first to return, 0-based", "type": "integer" }, "project_id": { "description": "Project id", "type": "string" }, "segment_number": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Segment number (1-based, from storyboard_read)" } }, "required": [ "action", "project_id" ], "type": "object" }, "name": "storyboard_read", "outputSchema": null }, { "description": "Create or change the channel style (one per channel, used by all its\nprojects).\n\ncreate: offer the user two real options, never invented ones. (a)\nReferences (best): YouTube links of their channel or of videos whose\nlook they like, or a written description. Analysis starts at once and\nwrites the fields: wait with get_status channel_id wait=true, then\nrender both template images (style_generate action=template). A\nreference informs every axis, narrative included; for its look only,\ngive it contributes_to [\"art_style\"]. (b) Presets: one per axis, all\nthree; instant, and the art preset brings its template images. Presets\nand references don't mix.\n\nupdate_fields: replace fields' text; it never starts an analysis (an\nanalysis rewrites art_style, narrative_style, director_style and\ntext_style). Those four and script_prompt can't be removed, every field\nneeds text, and summaries are written only by analysis. Real photos and\nB-roll are turned on by the literal `@real-media` tag in director_style,\nwith prose on when and how much; remove it to turn them off.\n\nupdate_references: replace the references, fields untouched\n(inputs_stale turns true). File references can only be added in the\napp.", "inputSchema": { "properties": { "action": { "description": "create: name, and references or presets; update_fields: fields; update_references: references", "enum": [ "create", "update_fields", "update_references" ], "type": "string" }, "channel_id": { "description": "The channel whose style this is", "type": "string" }, "fields": { "anyOf": [ { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "type": "object" }, { "type": "null" } ], "description": "update_fields: {key: \"new text\"} for the keys you change; {key: null} removes a key you added" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "create: the style name" }, "presets": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "create: {\"art_style\": id, \"narrative_style\": id, \"director_style\": id} from style_read action=presets" }, "references": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "description": "[{\"input_type\": \"youtube\" | \"text\", \"value\": \"<link or description>\", \"contributes_to\": [\"art_style\", ...]?}]. A youtube value is a video link, or a channel link or @handle. update_references: the COMPLETE list in order; copy kept entries from style_read verbatim." } }, "required": [ "action", "channel_id" ], "type": "object" }, "name": "style_edit", "outputSchema": null }, { "description": "analyze: read the references again and rewrite art_style,\nnarrative_style, director_style and text_style, replacing hand edits.\n\ntemplate: render one of the style's two template images. Reference\nimages render on them (characters on the character template,\nenvironments and objects on the environment one) and segment images\nfall back on them, so finish both before any reference image. An\nexisting one is refused unless replace=true: replacing it changes the\nlook of everything rendered after.", "inputSchema": { "properties": { "action": { "description": "analyze; template: template_type", "enum": [ "analyze", "template" ], "type": "string" }, "channel_id": { "description": "The channel whose style this is", "type": "string" }, "editable_sections": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Template prompt section overrides, keyed by section id" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Model id (get_generation_options); omit for the saved choice" }, "replace": { "default": false, "description": "template: true only when the user asked for a new image (or agreed to render a stale one again)", "type": "boolean" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" }, "template_type": { "anyOf": [ { "enum": [ "character", "environment" ], "type": "string" }, { "type": "null" } ], "description": "template: which template image; run once for each" } }, "required": [ "action", "channel_id" ], "type": "object" }, "name": "style_generate", "outputSchema": null }, { "description": "get: the channel style: its references, its fields (art_style,\nnarrative_style, director_style, text_style, any added; script_prompt on\nrequest), the summary analysis wrote for each, and templates, the\ncharacter and environment template images (null: not rendered; a URL:\nit exists, so view_image it rather than render it again).\ninputs_stale: the references changed since the last analysis (offer\nstyle_generate action=analyze). templates_stale: the art style changed\nsince the templates were rendered (offer to render them again).\n\npresets: the preset catalog, one list per axis (art_style,\nnarrative_style, director_style), with labels, descriptions and, for art\npresets, preview images. Let the user pick one per axis.", "inputSchema": { "properties": { "action": { "description": "get: the channel style (channel_id or project_id); presets: the preset catalog", "enum": [ "get", "presets" ], "type": "string" }, "channel_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "get: the channel (or pass project_id)" }, "include_script_prompt": { "default": false, "description": "get: include the long script_prompt", "type": "boolean" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" } }, "required": [ "action" ], "type": "object" }, "name": "style_read", "outputSchema": null }, { "description": "Show a Framesail image inline: a segment image, reference image,\nstyle template or preset preview.", "inputSchema": { "properties": { "url": { "description": "An image URL from a read tool (public_url, reference_image, template or preset); other hosts are refused", "type": "string" } }, "required": [ "url" ], "type": "object" }, "name": "view_image", "outputSchema": null }, { "description": "Voices and voice blocks; free. set_voice: the narrator's or a\ncharacter's voice; every speaker needs one before the voiceover.\nrescan_blocks: split the active script into voice blocks again after an\nedit, assets untouched; blocks whose words are unchanged keep their\naudio. settings: the voice engine and narrator speed.", "inputSchema": { "properties": { "action": { "description": "set_voice: speaker, voice_id; rescan_blocks; settings: voice_tts_provider and/or narrator_speed", "enum": [ "set_voice", "rescan_blocks", "settings" ], "type": "string" }, "narrator_speed": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "settings: speaking rate, 0.5-2.0 (default 1.0); pauses come only from `<break>` tags" }, "project_id": { "description": "Project id", "type": "string" }, "speaker": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "set_voice: \"narrator\", or a character's name" }, "voice_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "set_voice: a voice id from voiceover_read action=voices" }, "voice_tts_provider": { "anyOf": [ { "enum": [ "minimax", "elevenlabs" ], "type": "string" }, { "type": "null" } ], "description": "settings: the voice engine" } }, "required": [ "action", "project_id" ], "type": "object" }, "name": "voiceover_edit", "outputSchema": null }, { "description": "Generate voice block audio. Every speaker needs a voice first, and\nevery asset a reference image. Without voice_block_ids it fills every\nblock with no audio, skipping ones already generating. A model must\nmatch the project's voice engine. An existing storyboard retimes to the\nnew audio on its own.", "inputSchema": { "properties": { "dry_run": { "default": false, "description": "Return the count and credit estimate; start nothing", "type": "boolean" }, "editable_sections": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Template prompt section overrides, keyed by section id" }, "model": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Model id (get_generation_options); omit for the saved choice" }, "project_id": { "description": "Project id", "type": "string" }, "settings": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "description": "Model settings: keys of its settings_schema" }, "voice_block_ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "Blocks to generate, again if they have audio; omit for every block without audio" } }, "required": [ "project_id" ], "type": "object" }, "name": "voiceover_generate", "outputSchema": null }, { "description": "voices: one engine's voice ids, labels and preview audio, as\n{groups, voices}. blocks: the voice blocks (narration and dialogue) with\ntheir speaker, voice_id (the speaker's voice), audio and any\n`[SCENE: ...]` direction over them (never spoken), as {blocks,\ntotal_duration_ms, all_complete}.", "inputSchema": { "properties": { "action": { "description": "voices: the voice catalog for provider; blocks: the project's voice blocks", "enum": [ "voices", "blocks" ], "type": "string" }, "group": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "voices: one catalog group; each engine has its own (see groups). Filter the large ElevenLabs catalog." }, "include_subtitle_data": { "default": false, "description": "blocks: include word-level timings (bulky)", "type": "boolean" }, "project_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Project id" }, "provider": { "default": "minimax", "description": "voices: the voice engine (the project's voice_tts_provider)", "enum": [ "minimax", "elevenlabs" ], "type": "string" } }, "required": [ "action" ], "type": "object" }, "name": "voiceover_read", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:60a6147bad539d0375d7354bc51918da4d7910d7af0b1a0458a3776c7df331cd | sha256sum