video-mcp
Uses ElevenLabs text-to-speech to generate narration audio for video segments, with configurable voice and delivery settings.
Produces videos in YouTube explainer format (16:9) suitable for YouTube content.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@video-mcpTurn this script into a narrated YouTube video with captions."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
video-mcp
An MCP server that turns a script into a narrated video. Point an AI agent at it and it can produce YouTube explainers (16:9) or Reels/Shorts (9:16) from three kinds of source:
Engine | Tool | You supply | Good for |
HTML scroll |
| An HTML page + segments naming a CSS selector each | Long-form explainers, docs walkthroughs, architecture pages |
Remotion |
| JSON props for a built-in template, or your own React component | Slide-style reels, data callouts, anything you'd design in React |
HyperFrames |
| A folder with | Kinetic-caption reels, motion-graphics styles you iterate on as code |
The idea shared by all three: narration is generated first, and its real duration drives the visuals. Each segment gets the exact on-screen time its voice-over takes, so timing never drifts. Captions come from the same timestamps for free.
Requirements
Node 20+
ffmpegandffprobeonPATHAn ElevenLabs API key for narration
Chromium for Playwright (
npx playwright install chromium; Remotion downloads its own)
Related MCP server: ViralSpin MCP
Quickstart
git clone https://github.com/techbysaurabh/video-mcp && cd video-mcp
npm install && npx playwright install chromium
cp .env.example .env # add ELEVENLABS_API_KEY
npm run demo:html # silent render of the example page, no keys needed
npm start # MCP over HTTP at http://127.0.0.1:3100/mcpOr with Docker (Chromium and ffmpeg included):
docker build -t video-mcp . && docker run -p 3100:3100 -e ELEVENLABS_API_KEY=... -v $PWD/output:/data/output video-mcpConnect a client
Claude Code, HTTP:
claude mcp add --transport http video-mcp http://127.0.0.1:3100/mcpClaude Code, stdio (the client spawns the server; no port):
claude mcp add video-mcp -e ELEVENLABS_API_KEY=... -- node /path/to/video-mcp/src/mcp/server.js --stdioCursor (.cursor/mcp.json):
{ "mcpServers": { "video-mcp": { "url": "http://127.0.0.1:3100/mcp" } } }First video
Ask your agent:
Use video-mcp to render the bundled example with
generate_video, then pollget_job_statusuntil it's done and tell me where the MP4 is.
That renders examples/html-scroll/page.html with the five segments in segments.json, and writes
output/<job>/output.mp4 plus captions.srt.
Tools
Tool | Purpose |
| HTML scroll engine. |
| Remotion engine. |
| HyperFrames engine. |
| TTS only; returns each segment's duration so you can tune the script before rendering |
| Screenshot an HTML page at given timestamps to check scroll targets |
| Renders are async; poll here. Results carry |
| Props accepted by the built-in compositions |
How it works
segments ──▶ ElevenLabs TTS (cached by voice+text) ──▶ narration.mp3 + per-segment timestamps
│
┌───────────────────────────────────────────────────┼──────────────────────────────┐
▼ ▼ ▼
HTML: Playwright scrolls to each Remotion: props get startTime/ HyperFrames: compose() gets
scrollSelector on the timestamps, duration, React renders to MP4 timed segments, emits HTML+GSAP,
screenshots at 24 fps hyperframes renders it
└───────────────────────────────────────────────────┴──────────────────────────────┘
│
ffmpeg mux (video + narration) + SRT ──▶ output/<job>/output.mp4
│
optional S3 upload (AWS_S3_BUCKET set)Details worth knowing:
TTS cache. Audio is cached by
sha256(voiceId + text); unchanged segments cost nothing on re-render.Scroll motion. Between segments the page eases to the next target over 0.6 s and holds. The
mobilelayout renders a 390 px CSS viewport scaled to 1080×1920 so responsive breakpoints kick in.Remotion custom mode.
jsx_codeis written to a per-job entry and bundled; the component receives{segments, timestamps, totalDuration, ...props}with each segment'sstartTimeanddurationresolved.HyperFrames styles.
compose.mjsexports({ segments, totalDuration, media, narration }) => html. Segments arrive with timing filled in;media[id]describes files a segment referenced vialocalMedia. Seeexamples/hyperframes-kineticfor a caption style that splits each sentence into beats weighted by length.Muxing. Remotion emits a silent AAC track; the mux maps
0:v:0and1:a:0explicitly so the narration always wins.Cost guard.
cost_ceil_chars(default 50 000) aborts a job before any TTS is spent.
Configuration
Variable | Default | Meaning |
| Required for narration | |
|
| Default voice |
|
| Delivery tuning |
|
| HTTP mode bind |
|
| Where jobs write |
| Optional upload; results then include | |
|
| Pinned |
CLI helpers
npm run demo:html # silent scroll render of the example page (no keys)
npm run demo:remotion # silent SegmentReel render (no keys)
npm run render:hyperframes -- examples/hyperframes-kinetic # full narrated render
npm testScope
This repo is the rendering core: narration, three engines, muxing, captions, optional upload, exposed over MCP. Publishing to platforms, AI-generated imagery, avatars and brand kits are deliberately out of scope; build them on top.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Make videos and docs with your AI agent — describe what you need, every output stays editable.
Build and run visual creative-production workflows from your AI agent.
FFmpeg as a service for AI agents: typed video editing tools, async jobs, downloadable outputs.
Generate and edit images, video, voice, lip-sync and 3D models from your AI agent.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to generate narrated videos from topics or scripts, with stock footage, home videos, or local AI clips.2MIT
- AlicenseAqualityDmaintenanceEnables AI agents to edit video assemblies from A-roll and B-roll, add captions, and publish to social media platforms.274 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to analyze audio beats, synthesize voices with Google Gemini TTS, and programmatically construct and render professional videos using Remotion and React.4 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to programmatically scaffold Remotion projects, analyze audio for beat-synced scenes, synthesize voiceovers with word-level timecodes, preview frames, and render finished videos.4 npmMIT