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. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| set_api_keyA | 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_templatesA | 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_schemaA | 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_imagesA | 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_imagesA | 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_projectA | 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_imagesA | 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_contentA | 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_voiceoverA | 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_videoA | 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_videoA | 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_statusA | 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_metaA | 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