ShortsFlow
Uses a Gemini API key to generate AI titles, descriptions, hook scoring, and idea-to-video modes.
Enables publishing or scheduling generated Shorts to Instagram via Upload-Post.
Provides a free local LLM option for AI titles, descriptions, hook scoring, and idea-to-video generation without a paid API key.
Enables publishing or scheduling generated Shorts to TikTok via Upload-Post.
Allows clipping long YouTube videos or links into vertical Shorts and publishing generated Shorts to YouTube.
⚡ ShortsFlow AI Studio
The self-hosted Opus Clip alternative.
Paste a podcast or YouTube link, get captioned 9:16 Shorts that cut to whoever is talking. Free, local, no watermark, no credit caps.
Clip long videos with local Whisper, an LLM that scores the hooks, face-tracked 9:16 crops, a stacked two-speaker split or active-speaker switching, and Remotion spring captions. Or generate from an idea with 30+ formats (facts quizzes, explainers, top-5 lists, stories) and drive everything from a browser UI, the CLI, Docker, Colab or an MCP agent.
✂️ Clipping demo: the crop follows whoever is talking
The first GIF above is a real run of py main.py --source_video interview.mp4 --layout active --use_remotion on a 4:3, 480p two-person
interview: the shot cuts to the speaker, found by voice pitch plus face detection, and Whisper word captions are burned in.
Source footage: Aida Thomas Interviews Nancy Many - Part 1
by Aida Thomas, CC BY-SA 3.0; the demo GIF is a derivative and is shared under the same licence.
Related MCP server: whisper-mcp
🎛️ Review, restyle and brand your shorts
After Make my shorts, the browser app (shortsflow webui) shows every short as a card instead of a bare file list:
Review: a preview player, a strong / good / okay / weak label with the reason, and a title, description and hashtags ready to copy. Remove what you do not want, then Download all as .zip. Earlier runs can be reopened.
Edit one short: pick another caption style or change its start and end, and only that short is re-rendered (about a minute). Undo puts the previous version back.
Caption styles come with a preview, and your brand (logo, @handle, end card, accent colour) is saved once and added to every short.
Screenshots use sample clips made from the demo GIFs above.
⚡ Quick Start - pick one
🪟 Windows: one-click install
⬇ Download ShortsFlow-Setup.exe (or see all releases), run it, then open ShortsFlow from your Desktop. A browser page opens where you paste a video link or upload a file and press one button. No Python, Node or API key to install first.
The installer downloads roughly 2 GB the first time (about 5 GB with an NVIDIA card, because of the GPU libraries; it fetches its own private Python, the speech-recognition components and Node), so it needs an internet connection and a few minutes. It does not need admin rights.
It is not code-signed yet, so Windows may show a blue "Windows protected your PC" box: click More info, then Run anyway.
With an NVIDIA graphics card it uses the GPU (fast). Without one it still works on the CPU, but transcribing a long video takes much longer, and the first run also downloads the speech model.
Uninstall from Windows Settings > Apps. Your videos and settings in
%LOCALAPPDATA%\ShortsFlow\workspaceare kept.
🚀 Your first shorts in 3 steps (no API key needed)
Clipping a long video into vertical shorts works without any account or API key. A key (or a free local Ollama) only adds AI titles and descriptions, and is needed for the idea-to-video modes.
Install (needs Python 3.12):
pip install "shortsflow[clip]"Check your setup:
shortsflow doctorlists what is ready and what to fix, in plain words.Make shorts from a file or a link:
shortsflow clip my_video.mp4(orshortsflow clip "https://youtube.com/watch?v=..."). Add--count 5for more clips,--captionsfor animated captions (needs Node.js, then runshortsflow initonce).
Your shorts are saved in a shortsflow folder in your home directory (the command prints the exact path). Stuck? shortsflow doctor tells you the next step, and error messages say how to fix a bad key or a rate limit.
Option | Command | Best for |
☁️ Google Colab (free GPU, zero install) | Trying it in 5 minutes | |
🐳 Docker (browser WebUI) |
| Servers, Linux, no Python setup |
📦 pip |
| Using it as a command from anywhere |
🌐 Browser WebUI |
| Local use with a GPU |
🖥️ Desktop Studio GUI (Windows) |
| Windows desktop |
🤖 AI agents |
| Claude Code, Cursor, n8n |
git clone --depth 1 https://github.com/ghost1412/shorts-generator.git
cd shorts-generator🐧 Linux / macOS:
chmod +x setup.sh && ./setup.sh && python3 webui.py
⚡ ShortsFlow vs Opus Clip, Klap & Vizard
⚡ ShortsFlow | Paid clippers | |
Price | Free (MIT). You pay only for the LLM key you choose, or $0 with Ollama | ~$19-49 / month with minute or credit caps |
Where your video goes | Stays on your machine; Whisper runs locally | Uploaded to their cloud |
Watermark / export limits | None | Watermark and caps on lower tiers |
Face-tracked 9:16 reframing | ✅ | ✅ |
Podcast layouts | ✅ single, stacked split, active-speaker switching | ✅ varies by tool |
Word-level animated captions | ✅ Remotion (Hormozi, Glow Box, Bounce, Minimal) | ✅ |
Virality / hook score per clip | ✅ in | ✅ |
Dubbing | ✅ | Often a paid add-on |
Idea-to-video (facts, explainers, stories) | ✅ 30+ modes | ❌ clipping only |
Automation | ✅ CLI, MCP server, Docker, GitHub Actions | API usually on higher tiers |
Polished timeline editor | ❌ not yet | ✅ |
Multi-platform scheduling | ✅ TikTok / Instagram / YouTube via Upload-Post ( | ✅ |
Honest take: the paid tools have a nicer editor and scheduling. ShortsFlow wins on cost, privacy, and being scriptable.
🖥️ Desktop Studio GUI (gui_app.py)
3-Column Single-Window Studio Layout: Live 9:16 vertical canvas preview, mode picker, preset cards, and 1-click render launcher.
Interactive Remotion Presets: 1-click selection between
HORMOZI,GLOW_BOX,BOUNCE, andMINIMALspring captions.
🎬 Video Generator Modes
Mode | Visual Format | Quick Command |
✂️ AI Clipping | Slices long YouTube/local videos into high-scoring vertical shorts |
|
🔢 Top 5 Countdown | Numbered listicle countdown shorts (#5 ➔ #1) with rank badges |
|
💬 Chat Story | Animated text message conversation shorts (iMessage format) |
|
👥 Podcast (planned, not implemented yet) | 2-speaker debate shorts with alternating multi-voice synthesis | - |
🌐 Video Dubbing (planned, not implemented yet) | Multilingual video translation & voice re-synthesis | - |
🧮 Manim Explainer | Programmatic 2D/3D math, CS, and science animations |
|
💡 AI Facts | High-energy trivia & mystery facts with scene stock loops |
|
📖 AI Story | Narrative story voiceover with visual scene stitching |
|
🤔 This or That (WYR) | Split-screen dilemma challenge with VS central badge |
|
🧩 Emoji Guess | Interactive emoji puzzle game with animated reveal |
|
📰 News Breakdown | RSS news headline summary with cartoon personas |
|
🎛️ Engine Power Capabilities
Capability | Supported Technologies & Flags |
🎙️ Voice Synthesis & Cloning | Local Kokoro TTS ( |
📐 Aspect Ratios |
|
🔊 Audio Mastering & SFX | Auto SFX ( |
🎥 Motion & Visual Filters | Dynamic Camera Push-In Zoom ( |
📦 Batch Automation | Automated queue execution from CSV / text lists ( |
🤖 Multi-LLM Matrix | Google Gemini, Local Ollama ( |
🎨 Visual Color Grading Presets (--video_filter)
Preset Name | Visual Atmosphere | Preset Name | Visual Atmosphere |
| AI auto-switches color grade per scene beat |
| Black & White high-contrast samurai |
| Neon boosted purples/blues for night sci-fi |
| Blockbuster movie cinematic color balance |
| Golden hour warmth for scenery & drama |
| Sharp contrast & saturation for sports/action |
| Analog retro tape scanlines & color shift |
| Dark fantasy / horror shadow contrast |
🤖 Model Context Protocol (MCP) & AI Agent Server
ShortsFlow AI Studio provides a native MCP Server (mcp_server.py) allowing AI assistants (Claude Desktop, Cursor, Antigravity, n8n, AutoGPT) to create shorts autonomously:
# Launch MCP Server over standard I/O for AI IDEs & Workflow Engines
python mcp_server.pyAdd it to your AI tool
The MCP server runs from a checkout of this repo (it starts main.py next to it):
git clone --depth 1 https://github.com/ghost1412/shorts-generator.git
cd shorts-generator && pip install -r requirements.txt
claude mcp add shortsflow -- python /full/path/to/shorts-generator/mcp_server.py # Claude CodeClaude Desktop / Cursor: add this under mcpServers in the tool's config JSON (use the full path):
{ "mcpServers": { "shortsflow": { "command": "python", "args": ["/full/path/to/shorts-generator/mcp_server.py"] } } }Available MCP Tools:
generate_short: Create AI shorts from topics or prompts.extract_clips: Slice long YouTube videos into vertical shorts with face tracking, a stacked two-speaker split (layout: split) or active-speaker switching (layout: active).generate_social_package: Generate platform metadata (.meta.json) for YouTube Shorts, TikTok, and Reels.get_render_status: Query live rendering job progress.list_supported_modes: List the content modes, caption styles and options the server accepts.
🔌 REST API & Webhooks
pip install -r requirements-full.txt
SHORTSFLOW_API_KEY=change-me python -m shortsflow.api # http://127.0.0.1:8080/docscurl -X POST localhost:8080/v1/clips -H "Authorization: Bearer change-me" -H "Content-Type: application/json" -d '{"source_video": "https://youtu.be/VIDEO_ID", "layout": "active", "clip_count": 3, "webhook_url": "https://example.com/hook"}'
# -> {"id": "a1b2c3", "status": "queued", "url": "/v1/jobs/a1b2c3"}
curl localhost:8080/v1/jobs/a1b2c3 -H "Authorization: Bearer change-me" # status + files[] download linksPOST /v1/shorts generates from an idea (mode, category, prompt...). Webhooks are signed with
X-ShortsFlow-Signature: sha256=<HMAC of body> when SHORTSFLOW_WEBHOOK_SECRET is set. Jobs run one at a time by default
(SHORTSFLOW_MAX_CONCURRENT). With Docker: SHORTSFLOW_API_KEY=change-me docker compose --profile api up api (refuses to start without a key). A ready-made n8n flow lives in examples/n8n/.
📤 Publish & Schedule (TikTok, Instagram Reels, YouTube Shorts)
Clip extraction writes metadata.json (title, description, tags) and a badge thumbnail next to every clip. Post them with
Upload-Post, which holds the platform logins (set UPLOAD_POST_API_KEY and UPLOAD_POST_USER):
# preview what would be posted, then post now or stagger one clip every 3 hours
python -m engine.publish sessions/extraction_123/metadata.json --platforms tiktok,instagram,youtube --dry-run
python -m engine.publish sessions/extraction_123/metadata.json --platforms tiktok,instagram --start 2026-11-02T10:00 --every 180 --timezone Europe/Madrid🏷️ Brand Kit
Burn your logo, @handle and a closing end card into every clip (placed clear of the Shorts/Reels UI):
py main.py --source_video "URL" --logo logo.png --handle @mychannel --end_card "Follow for more"
py main.py --source_video "URL" --brand examples/brand.json # same thing as a preset file
python -m engine.branding existing_clip.mp4 --logo logo.png --handle @mychannel # any finished video💡 Top Command Recipes
# 1. Podcast Shorts that cut to whoever is talking (stacked split when unsure) + silence removal
py main.py --source_video "https://www.youtube.com/watch?v=VIDEO_ID" --extract_mode shorts --layout active --tighten --use_remotion
# 1b. Prompt-based clipping: only the moments that match your request (LLM search, keyword fallback offline)
py main.py --source_video "https://www.youtube.com/watch?v=VIDEO_ID" --find "where they discuss pricing" --clip_count 3 --use_remotion
# 1a. Cut the ums and uhs (and silences) out of clips
py main.py --source_video "URL" --tighten --remove_fillers --use_remotion
# 1e. Edit by transcript: cut phrases, or delete words from the transcript text file and re-run
py main.py --source_video "URL" --session_dir sessions/talk --cut "you know" --cut "so basically"
# -> writes sessions/talk/transcript.txt; delete words/lines in a copy, then:
py main.py --source_video "URL" --session_dir sessions/talk --edit_transcript my_edit.txt
# 1c. Emoji pop on keywords in HORMOZI/BOUNCE captions (needs an emoji font; included in the Docker image)
py main.py --source_video "URL" --use_remotion --caption_style HORMOZI --caption_emoji
# 1d. Fully local, zero-cost voice: Kokoro TTS (no API key; ~120 MB model downloads once)
py main.py --mode FACTS --category "space" --tts_provider kokoro --voice af_heart --use_remotion
# 2. High-Retention Short with Voice Cloning, Zoom Motion & Audio Ducking
py main.py --mode FACTS --category "cyberpunk AI" --tts_provider voicestudio --clone_voice "my_voice.wav" --enable_zoom --auto_ducking --use_remotion
# 3. Render Landscape 16:9 YouTube Video with SFX
py main.py --mode EXPLAINER --prompt "Quantum physics" --aspect_ratio 16:9 --sfx_preset whoosh
# 4. Translate and dub video: planned, not implemented yet (--mode DUB / --target_lang are ignored)
# 5. Process Batch Content Calendar Queue
py main.py --batch_file "topics.txt" --mode FACTS --aspect_ratio 9:16 --use_remotion⚙️ Environment Configuration (.env)
Rename env.example to .env:
GEMINI_API_KEY=your_gemini_key_here
HF_API_KEY=your_huggingface_key_here
PEXELS_API_KEY=your_pexels_key_here
# Local Voice Studio & Production Defaults
VOICE_PROVIDER=auto
VOICE_STUDIO_URL=http://localhost:8000/v1/audio/speech
DEFAULT_ASPECT_RATIO=9:16
AUTO_DUCKING=true🤖 AI Agent Onboarding
If you are an AI Coding Agent (Cursor, Antigravity, Claude Code, Copilot, AutoGPT) onboarding into this codebase, see AGENTS.md for structured architectural context, module maps, CLI skills, and execution rules, and ROADMAP.md for the open task board.
⭐ Star History
📄 License
ShortsFlow AI Studio is open-source software licensed under the MIT License.
The optional animated-caption renderer uses Remotion, which has its own source-available licence (free for individuals and small teams; see remotion.dev/license if you are a larger company). Without Node.js/Remotion you still get clips, just without the animated captions.
Available Tools
5 toolsextract_clipsA
Cut the best moments out of a long video (a local file path or a YouTube link) into captioned vertical shorts: it transcribes the speech with Whisper, scores the moments, crops to 9:16 with face tracking and burns in animated captions. It runs in the background: the call returns a job_id immediately and the work can take several minutes (longer on a computer without an NVIDIA GPU), so poll get_render_status until the job is 'completed' or 'failed'. Clipping works without any API key; an AI key only improves scoring and titles. Files are written under the ShortsFlow folder (sessions/...) and nothing is uploaded. Use generate_short instead to create a video from a topic.
| Name | Required | Description | Default |
|---|---|---|---|
| layout | No | Framing: single = face-tracked crop; split = two speakers stacked; active = cut to whoever is talking (stacked when unsure), best for podcasts and interviews. | single |
| tighten | No | Cut out silences and dead air inside each short. | |
| clip_count | No | How many shorts to cut out. | |
| smart_crop | No | Follow the speaker's face when cropping the wide video to vertical. | |
| source_video | Yes | Local video file path or a YouTube/other video URL to clip. Required. | |
| use_remotion | No | Animated captions (needs Node.js). False renders without animated captions. | |
| caption_style | No | Animated caption look (needs use_remotion): HORMOZI = bold yellow single words, GLOW_BOX = words in boxes with a pink highlight, BOUNCE = bouncy gold single words, MINIMAL = clean dark boxes, AUTO/RANDOM = pick for me. | HORMOZI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses the asynchronous contract (returns job_id immediately, work takes minutes, slower without an NVIDIA GPU), the required polling loop, that files land under the ShortsFlow folder and nothing is uploaded, and the optional-API-key behavior. These are exactly the operational facts an agent needs and none of them are inferable from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well ordered: what it does, how it runs, what it costs/requires, where output goes, and the alternative sibling, in that sequence. Every sentence carries information, though the single unbroken paragraph makes it slightly harder to scan than a short bulleted split would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, long-running, no-output-schema tool, the description covers the async return value, the polling path, runtime expectations, and side effects (local files, no uploads). The only thin spot is what the completed job actually yields beyond 'shorts' — number of files, naming, or format — which the agent must discover from get_render_status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the per-parameter enum and default meanings are already documented and the baseline is 3. The description still adds framing value by tying the parameters together — 'crops to 9:16 with face tracking' contextualizes smart_crop/layout, and 'burns in animated captions' plus the Whisper/scoring mention explains why clip_count and caption styling exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Cut the best moments out of a long video ... into captioned vertical shorts') and then enumerates the pipeline steps: Whisper transcription, moment scoring, 9:16 face-tracked crop, burned-in animated captions. It explicitly names the sibling generate_short as the tool for a different task, so the agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use this for clipping an existing video, use generate_short to create a video from a topic. It also tells the agent the follow-up workflow (poll get_render_status until 'completed' or 'failed') and states the prerequisite context that clipping works without an API key while an AI key only improves scoring and titles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_shortA
Create an original vertical short video from an idea: an AI-written script, voice-over, stock footage, background music and animated captions, rendered locally by the ShortsFlow pipeline. It runs in the background: the call returns a job_id immediately and the render takes a few minutes, so poll get_render_status until the job is 'completed' or 'failed'. It uses the user's own LLM, voice and stock-footage keys from the ShortsFlow .env, writes files only inside the ShortsFlow folder, and never uploads or posts anything. Use this to make a new short from a topic; use extract_clips instead to cut shorts out of an existing video.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Content format. FACTS = a 'spot the lie' quiz of three claims; STORY / HORROR / TRUE_CRIME = narrated stories; EXPLAINER = an animated explainer; WYR = 'would you rather'; TOP_5 = a ranked list; TRIVIA / RIDDLE / EMOJI_GUESS = quiz formats; NEWS = a news recap; others as named. | FACTS |
| vibe | No | Mood of the background music. | suspense |
| prompt | No | Optional extra instructions or context for the script writer, e.g. 'Explain how black holes bend light'. | |
| script | No | Optional finished script to narrate as written. When given, no AI script is generated. | |
| category | No | Topic or category the script should be about, e.g. 'space mysteries', 'ancient Rome', 'psychology'. | space mysteries |
| sfx_preset | No | Sound effects on visual transitions; none turns them off. | auto |
| aspect_ratio | No | Output shape: 9:16 vertical (Shorts, Reels, TikTok), 16:9, 1:1 or 4:5. | 9:16 |
| auto_ducking | No | Lower the background music while the voice is speaking. | |
| tts_provider | No | Voice-over engine. auto picks the best available; edgetts is free; kokoro and local run fully offline; elevenlabs and voicestudio need their own setup. | auto |
| use_remotion | No | Render animated captions with the Remotion engine (needs Node.js). False uses simple captions. | |
| caption_style | No | Animated caption look (needs use_remotion): HORMOZI = bold yellow single words, GLOW_BOX = words in boxes with a pink highlight, BOUNCE = bouncy gold single words, MINIMAL = clean dark boxes, AUTO/RANDOM = pick for me. | HORMOZI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses that the tool is asynchronous, returns a job_id immediately, takes minutes, requires the user's own keys from the ShortsFlow .env, writes only inside the ShortsFlow folder, and never uploads or posts. Async semantics, credential sourcing and side-effect boundaries are exactly the facts an agent needs before firing an expensive render.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each load-bearing: purpose, async contract, side effects/credentials, then routing to the alternative. The most decision-critical facts (what it makes, that it is backgrounded) are front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, long-running generation tool with no output schema, the description covers the return contract (job_id plus polling), the operational constraints (local render, user keys, no upload), and the sibling alternative. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all 11 parameters and 6 enums documented inline, so the schema already does the heavy lifting. The description adds only the loose framing of topic/idea and does not explain how mode, vibe, or caption_style interact with the render; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Create an original vertical short video from an idea") and enumerates the pipeline components it produces: AI script, voice-over, stock footage, music, animated captions. It also explicitly distinguishes itself from the sibling extract_clips, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use rule ("Use this to make a new short from a topic") paired with the alternative and its condition ("use extract_clips instead to cut shorts out of an existing video"). It also prescribes the follow-up workflow: poll get_render_status until 'completed' or 'failed'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_social_packageA
Write platform-ready text for a short: a title, description, hashtags and a short caption for YouTube Shorts, TikTok and Instagram Reels. It answers immediately (no job). It uses the configured AI model; if none is reachable it returns a generic template filled with the topic instead, so check the wording. It does not publish anything.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Format of the video, which shapes the tone of the text. | FACTS |
| topic | Yes | What the video is about, e.g. 'Why the sky is blue'. Required. | |
| category | No | Broad category used to pick hashtags, e.g. 'science' or 'history'. | general |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses synchronous execution, that the configured AI model is used, and that an unreachable model yields a generic template that should be checked. It omits cost/rate characteristics, but the key failure mode an agent must know about is stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the deliverable, then the synchronous behavior, the fallback, and the scope limit. Minimal waste; the fallback sentence is the only one that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-param generation tool with no output schema, the description names the returned artifacts and the degraded-mode behavior, which is what an agent needs to call and trust the result. Missing only explicit contrast with generate_short and any note on how required topic interacts with mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so mode, topic and category are already documented in the schema. The description adds no meaning about how mode or category influence the generated text, leaving it at the baseline for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and output set: writes title, description, hashtags and caption for YouTube Shorts, TikTok and Instagram Reels. This clearly separates it from a renderer like generate_short, though it never names that sibling, so the distinction is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'It does not publish anything' and 'answers immediately (no job)' implicitly scope usage against async/publishing siblings, but there is no explicit when-to-use or when-not guidance and no alternative is named. An agent must infer routing from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_render_statusA
Check a background job started by generate_short or extract_clips. Returns a JSON object with status ('processing', 'completed', 'failed' or 'not_found'), progress (0-100), the last log lines, and an error message (the last lines of the log) when the job failed. Jobs are remembered only while this server is running. Call it every 20-30 seconds until the status is no longer 'processing'. It changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id returned by generate_short or extract_clips. Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it declares the tool changes nothing, discloses the crucial lifetime constraint ("Jobs are remembered only while this server is running"), which explains how 'not_found' arises, and enumerates the exact return fields including that the error message is the tail of the log.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the sibling linkage are front-loaded, and every sentence contributes either scope, return shape, lifetime caveat, or polling cadence. It is slightly dense in one paragraph, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain returns, and it does so completely: status values, progress range, log lines, and error semantics. Combined with the polling guidance and job-lifetime caveat, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already says it is the job_id returned by generate_short or extract_clips, which is essentially what the prose repeats. The description adds no format, validation, or edge-case detail (e.g. what a malformed or stale id yields) beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Check a background job") and immediately ties it to the two sibling tools that create jobs, generate_short and extract_clips, so an agent can tell it apart from every generator in the set without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit polling contract: call every 20-30 seconds and stop when status is no longer 'processing'. Combined with the note that the job must have been started by generate_short or extract_clips, the when-to-use condition is fully specified rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_supported_modesA
List the options the other tools accept: content modes for generate_short, caption styles, voice-over engines, aspect ratios and sound-effect presets. Instant, read-only, takes no input. Call it first if you are unsure which value to pass.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and discloses that the tool is instant, read-only, and takes no input. These are meaningful traits beyond the empty input schema, though it does not describe pagination, authentication needs, or the exact return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose, and adds the usage suggestion without unnecessary wording. Every clause contributes either scope, behavior, or invocation guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only lookup tool with no output schema, the description is complete enough: it says what will be listed, which sibling's options are included, and when to call it. No additional detail is necessary for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are minimal by design. The description reinforces this by stating it takes no input, which aligns with the empty schema and gives the agent baseline clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('options the other tools accept'), then enumerates the option categories such as content modes, caption styles, voice-over engines, aspect ratios, and sound-effect presets. It also ties content modes to the sibling tool generate_short, making the tool's scope clear without needing to inspect any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call it first when unsure which value to pass, which gives clear usage context and positions it as a prerequisite lookup tool. It does not state when not to use it or name every sibling that benefits from it, but the guidance is sufficient for the intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.1- Changed
extract_clips10 fields changed- added
Input schema / properties / caption_style / descriptionAdded value: +"Animated caption look (needs use_remotion): HORMOZI = bold yellow single words, GLOW_BOX = words in boxes with a pink highlight, BOUNCE = bouncy gold single words, MINIMAL = clean dark boxes, AUTO/RANDOM = pick for me." - added
Input schema / properties / caption_style / enumAdded value: +[ + "HORMOZI", + "GLOW_BOX", + "BOUNCE", + "MINIMAL", + "AUTO", + "RANDOM" +] - changed
Input schema / properties / clip_count / descriptionPrevious value: -"Number of viral shorts to extract"New value: +"How many shorts to cut out." - added
Input schema / properties / clip_count / maximumAdded value: +15 - added
Input schema / properties / clip_count / minimumAdded value: +1 - changed
Input schema / properties / layout / descriptionPrevious value: -"single: face-tracked crop; split: two speakers stacked; active: cut to whoever is talking (stacked when unsure) for podcasts/interviews"New value: +"Framing: single = face-tracked crop; split = two speakers stacked; active = cut to whoever is talking (stacked when unsure), best for podcasts and interviews." - changed
Input schema / properties / smart_crop / descriptionPrevious value: -"Enable AI face and subject tracking crop for 9:16 vertical video"New value: +"Follow the speaker's face when cropping the wide video to vertical." - changed
Input schema / properties / source_video / descriptionPrevious value: -"YouTube video URL or local video file path"New value: +"Local video file path or a YouTube/other video URL to clip. Required." - changed
Input schema / properties / tighten / descriptionPrevious value: -"Automatically trim silence gaps for punchy high retention"New value: +"Cut out silences and dead air inside each short." - added
Input schema / properties / use_remotion / descriptionAdded value: +"Animated captions (needs Node.js). False renders without animated captions."
- Changed
generate_short18 fields changed- added
Input schema / properties / aspect_ratio / descriptionAdded value: +"Output shape: 9:16 vertical (Shorts, Reels, TikTok), 16:9, 1:1 or 4:5." - changed
Input schema / properties / auto_ducking / descriptionPrevious value: -"Automatically duck background music when voice audio plays"New value: +"Lower the background music while the voice is speaking." - added
Input schema / properties / caption_style / descriptionAdded value: +"Animated caption look (needs use_remotion): HORMOZI = bold yellow single words, GLOW_BOX = words in boxes with a pink highlight, BOUNCE = bouncy gold single words, MINIMAL = clean dark boxes, AUTO/RANDOM = pick for me." - changed
Input schema / properties / caption_style / enumPrevious value: -[ - "HORMOZI", - "GLOW_BOX", - "BOUNCE", - "MINIMAL" -]New value: +[ + "HORMOZI", + "GLOW_BOX", + "BOUNCE", + "MINIMAL", + "AUTO", + "RANDOM" +] - changed
Input schema / properties / category / descriptionPrevious value: -"Topic or category (e.g. 'space mysteries', 'quantum physics', 'psychology')"New value: +"Topic or category the script should be about, e.g. 'space mysteries', 'ancient Rome', 'psychology'." - changed
Input schema / properties / mode / descriptionPrevious value: -"Content mode: FACTS, EXPLAINER, STORY, WYR, TOP_5, CHAT_STORY, HORROR, TRUE_CRIME, BIBLE, ARTICLE, UGC, EMOJI_GUESS, REDDIT, TRIVIA, QUOTE"New value: +"Content format. FACTS = a 'spot the lie' quiz of three claims; STORY / HORROR / TRUE_CRIME = narrated stories; EXPLAINER = an animated explainer; WYR = 'would you rather'; TOP_5 = a ranked list; TRIVIA / RIDDLE / EMOJI_GUESS = quiz formats; NEWS = a news recap; others as named." - added
Input schema / properties / mode / enumAdded value: +[ + "FACTS", + "EXPLAINER", + "STORY", + "WYR", + "TOP_5", + "CHAT_STORY", + "HORROR", + "TRUE_CRIME", + "BIBLE", + "ARTICLE", + "UGC", + "EMOJI_GUESS", + "REDDIT", + "TRIVIA", + "QUOTE", + "NEWS", + "RIDDLE" +] - changed
Input schema / properties / prompt / descriptionPrevious value: -"Detailed prompt or script context for AI generation"New value: +"Optional extra instructions or context for the script writer, e.g. 'Explain how black holes bend light'." - changed
Input schema / properties / script / descriptionPrevious value: -"Custom manual script to use directly (skips LLM generation)"New value: +"Optional finished script to narrate as written. When given, no AI script is generated." - changed
Input schema / properties / sfx_preset / defaultPrevious value: -"whoosh"New value: +"auto" - added
Input schema / properties / sfx_preset / descriptionAdded value: +"Sound effects on visual transitions; none turns them off." - changed
Input schema / properties / sfx_preset / enumPrevious value: -[ - "none", - "pop", - "whoosh", - "chime", - "riser", - "boom" -]New value: +[ + "auto", + "whoosh", + "pop", + "riser", + "boom", + "none" +] - removed
Input schema / properties / target_langRemoved value: -{ - "description": "Language code for translation/dubbing (e.g., 'es', 'fr', 'de', 'ja')", - "type": "string" -} - changed
Input schema / properties / tts_provider / defaultPrevious value: -"edge-tts"New value: +"auto" - added
Input schema / properties / tts_provider / descriptionAdded value: +"Voice-over engine. auto picks the best available; edgetts is free; kokoro and local run fully offline; elevenlabs and voicestudio need their own setup." - changed
Input schema / properties / tts_provider / enumPrevious value: -[ - "edge-tts", - "elevenlabs", - "voicestudio", - "gtts" -]New value: +[ + "auto", + "edgetts", + "elevenlabs", + "voicestudio", + "local", + "kokoro" +] - changed
Input schema / properties / use_remotion / descriptionPrevious value: -"Use React-based Remotion subtitle engine for dynamic spring animations"New value: +"Render animated captions with the Remotion engine (needs Node.js). False uses simple captions." - added
Input schema / properties / vibe / descriptionAdded value: +"Mood of the background music."
- Changed
generate_social_package4 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Broad category used to pick hashtags, e.g. 'science' or 'history'." - added
Input schema / properties / mode / descriptionAdded value: +"Format of the video, which shapes the tone of the text." - added
Input schema / properties / mode / enumAdded value: +[ + "FACTS", + "EXPLAINER", + "STORY", + "WYR", + "TOP_5", + "CHAT_STORY", + "HORROR", + "TRUE_CRIME", + "BIBLE", + "ARTICLE", + "UGC", + "EMOJI_GUESS", + "REDDIT", + "TRIVIA", + "QUOTE", + "NEWS", + "RIDDLE" +] - changed
Input schema / properties / topic / descriptionPrevious value: -"Topic or title of the video"New value: +"What the video is about, e.g. 'Why the sky is blue'. Required."
- Changed
get_render_status1 field changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The unique job ID returned by generate_short or extract_clips"New value: +"The job_id returned by generate_short or extract_clips. Required."
5 tool updates
v0.1.0- First observed
extract_clips - First observed
generate_short - First observed
generate_social_package - First observed
get_render_status - First observed
list_supported_modes
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: creating a short from a topic (generate_short), clipping an existing video (extract_clips), polling jobs (get_render_status), enumerating options (list_supported_modes) and writing social copy (generate_social_package). The descriptions explicitly contrast the two easily-confused generation paths ("use extract_clips instead"), eliminating the main ambiguity risk.
All names are snake_case and verb-first (generate_*, get_*, list_*, extract_*), following a single predictable verb_noun convention. No mixing of styles or vague bare nouns.
Five tools is tightly scoped to the server's purpose: two job-starting tools, one poller, one options lookup and one text generator. Nothing is redundant and no trivial tool is padded in.
The core lifecycle (start job → poll status → get options → produce metadata) is fully covered, and the async pattern is documented in each tool. Minor gaps remain: no job cancel/list, and get_render_status does not advertise returning the output file path, which agents would likely need to locate the finished video.
Maintenance
Related MCP Connectors
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
AI video clipping MCP: long videos and podcasts into scored, captioned 9:16 shorts.
Turn long videos into captioned vertical clips, then render and schedule social posts.
Make, render and auto-post AI faceless videos to YouTube, TikTok and Instagram from any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAutomated short-form video creation from text prompts, combining text-to-speech, captions, background videos, and music, exposed as an MCP server for AI agents.76 npmMIT
- AlicenseAqualityCmaintenanceEnables MCP clients to transcribe audio/video files locally, generate SRT subtitles, and burn captions into videos via tool calls, without a cloud API.3MIT
- AlicenseNot gradedqualityBmaintenanceAI-native timeline editor for short-form video. Your agent cuts, captions, adds motion graphics and renders against a real, editable timeline over MCP — not a render queue. Human-in-the-loop by design: it calls request_review and waits while you supervise in a browser. Local-first and AGPL; your footage never leaves your machine.2AGPL 3.0
- FlicenseNot gradedqualityAmaintenanceA local MCP server that lets chat-based coding agents turn a folder of raw clips into finished, beat-synced montage videos by handling shot selection, music matching, subtitles, transitions, and rendering through natural language. It returns a timeline digest and contact sheet for approval before any frame is rendered.-