video-studio-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VIDEO_STUDIO_BASE | No | Base directory where video projects are created. | ~/Work/VideoReview |
| ELEVENLABS_API_KEY | No | Your ElevenLabs API key for voiceover. Required on Linux/Windows (macOS can fall back to say command without it). Can also be set via the set_api_key tool after startup. | |
| ELEVENLABS_VOICE_ID | No | Override the default voice globally. Per-template voice in content.json takes precedence. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| set_api_key | Save the USER'S OWN ElevenLabs API key so this machine can generate real voiceovers. Call this only when a tool reports that no key is configured, or when the user offers a key. Ask the user for their key first — get one free at https://elevenlabs.io/app/settings/api-keys — and NEVER invent one. The key is written to ~/.config/video-studio/config.json with 0600 permissions and never leaves this machine. Alternative for users who prefer not to type a key into chat: put ELEVENLABS_API_KEY in the 'env' block of their MCP client config instead; that always wins over the saved file. Call with no arguments to just report where the current key comes from. |
| list_templates | START HERE for any 'make a video about X' request. Returns every available template with id, name, what it looks like, and what it is best for — plus a poster image when one exists. AFTER calling this you MUST let the user pick: present the templates and ask them to choose (use your AskUserQuestion tool so the choice renders the same in the desktop app and the terminal). Do NOT pick a template silently on the user's behalf. Once they choose, call template_schema with that id. |
| template_schema | Return the content.json schema, scene outline and hard rules for ONE template. Call this after the user picked a template, before writing any content. Each template has its OWN scene types — do not reuse another template's shape. |
| search_wikimedia_images | Find freely-licensed (Public Domain / CC) images on Wikimedia Commons for a topic. Search with ENGLISH keywords for best results (e.g. 'Tomb of Minh Mang Hue', 'Angkor Wat aerial'). Returns candidates with title, license, author, pixel dimensions and a downloadable URL. Pick images >= ~1000px; prefer old public-domain photos for a documentary feel. ALWAYS keep the license+author of every image you use to credit sources in the closing scene. AUTONOMY: do NOT stop to ask the user which results to use — pick the best yourself. (The ONE thing you must ask about is the template, via list_templates.) |
| preview_images | Download the given image URLs and return small thumbnails so you can visually judge which to use before committing. Use after search_wikimedia_images when you need to see the images. |
| new_video_project | Create a new Remotion project at ~/Work/VideoReview// using the chosen template. Runs npm install (~15s). Do this once per video, after the user picked a template, before adding images or writing content. |
| add_images | Download chosen Wikimedia images into /public/images/. Pass the direct URLs from search results and a short filename for each (e.g. 'ngomon.jpg'). In content.json reference them as 'images/'. |
| write_content | Write the video storyboard to /content.json. Pass the COMPLETE JSON as a string. Schema: meta{fps:30,width:1080,height:1920,accent,accentSoft,voice:false} and scenes[] where each scene has id, type ('title'|'photo'|'timeline'|'closing'), dur, voiceover (1-2 sentences in the target language), image ('images/..'), focalX/focalY. title{kicker,title,subtitle}; photo{year,headline,caption}; timeline{title,items:[{year,text}]}; closing{title,note,cta}. Vietnamese: DO NOT write ALL-CAPS text with hook-accent letters (Ỷ/Ủ/Ổ/Ả/Ẩ) in 'year' badges; use numbers or hook-free words. Facts must be accurate; credit image sources in closing 'note'. |
| generate_voiceover | Start generating the Vietnamese/target-language voiceover for every scene using ElevenLabs eleven_turbo_v2_5 with the default Northern-accent Vietnamese voice 'Hien' (falls back to macOS |
| render_video | Start the Remotion render (-> out/video.mp4). Runs in the BACKGROUND and returns immediately. Do this AFTER voiceover finished (so scene lengths match narration). Then call project_status with wait_for='render' to get the final duration and QA frames. |
| create_video | ONE-SHOT builder — the preferred path. Given the finished storyboard and chosen images, it scaffolds the project, downloads the images, writes content.json, then runs voiceover + render in ONE background job. IMPORTANT: run the pipeline AUTONOMOUSLY — do NOT pause to ask the user to confirm the topic, the script, or which images to use; decide yourself and proceed straight to a finished video. Typical flow: call search_wikimedia_images a few times to gather image URLs (you may skip preview_images), compose an accurate storyboard, then call this once. Afterward poll project_status with wait_for='build' until it returns the mp4 path + QA frames, then finish with write_publish_meta (title + description + hashtags). content_json = the full content.json string (meta + scenes with voiceover in the target language; Vietnamese: no ALL-CAPS hook-accent letters in 'year'). images = [{url, filename}] matching the 'images/' paths used in content_json. |
| project_status | Report voiceover + render progress for a project. With wait_for='voiceover' it waits (up to ~50s) until all scene mp3s exist; with wait_for='render' it waits until out/video.mp4 is ready, then returns the duration, whether audio is present, and 4 QA frames as images (inspect them: layout, readable text, correct diacritics; if a subject is mis-cropped, adjust focalX/focalY in content.json and re-render). If a job is still running after the wait, call again. |
| write_publish_meta | FINAL STEP, right after the render is done: save the publishing copy for the video — a hook title, a description, and hashtags. Write them in the SAME language as the voiceover, from the video's real content (do not promise anything the video does not show). title: <= 100 chars, one strong hook. description: 2-4 sentences — what the viewer gets, plus image credits (author + license) when the images are CC-BY/CC-BY-SA. hashtags: 5-12, each ONE word (no spaces), mixing broad tags with topic-specific ones. Saves /publish.json + a copy-paste ready /publish.txt, and returns the text so you can show it to the user. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sexybells/video-studio-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server