MoviePy MCP Server
MoviePy MCP Server
An LLM-friendly Model Context Protocol server for video and audio editing, built on MoviePy v2 and FastMCP. It lets MCP clients (Claude Desktop, Claude Code, Cursor, etc.) trim, merge, resize, overlay, mix audio, and render video through natural language.
Design
The server is built around an in-memory clip registry:
load_video/load_audio/load_imagereturns aclip_id.Every editing tool takes a
clip_idand returns a newclip_id— operations chain without touching disk, and source clips are never mutated, so an agent can branch or retry any step.export_clipis the only tool that renders a file.
Every tool returns uniform metadata (duration_seconds, size, fps, has_audio, history), so the model always knows the state of an edit without extra probing. Errors are actionable: they name the bad argument, list known clip_ids, and suggest the fix.
Requirements
Python 3.10+
FFmpeg on your PATH (
sudo apt install ffmpeg/brew install ffmpeg)
Installation
git clone <your-repo-url> moviepy-mcp
cd moviepy-mcp
pip install -e .
# or with uv:
uv pip install -e .Run it directly to verify:
moviepy-mcpClient configuration
Cursor (~/.cursor/mcp.json)
Add a moviepy entry under mcpServers (same shape as other local uv servers). Restart Cursor or reload MCP after saving:
{
"mcpServers": {
"moviepy": {
"command": "uv",
"args": [
"run",
"--directory",
"C:/Users/vivek/projects/moviepy-mcp",
"python",
"src/moviepy_mcp/server.py"
]
}
}
}Replace the --directory path with your clone of this repo. uv run uses the project’s pyproject.toml / .venv, so you do not need a global moviepy-mcp install.
Claude Desktop / Claude Code (stdio)
If the package is installed (pip install -e . or uv pip install -e .):
{
"mcpServers": {
"moviepy": {
"command": "moviepy-mcp"
}
}
}Or without installing, via uv (one-shot deps):
{
"mcpServers": {
"moviepy": {
"command": "uv",
"args": [
"run",
"--with",
"fastmcp",
"--with",
"moviepy",
"python",
"/path/to/moviepy-mcp/src/moviepy_mcp/server.py"
]
}
}
}Tools
Category | Tools |
Load / create |
|
Inspect |
|
Time |
|
Geometry |
|
Visual FX |
|
Audio |
|
Compositing |
|
Output |
|
Example agent workflow
"Take intro.mp4, keep seconds 5–20, add the title 'Q2 Review' for the first 4 seconds, fade out at the end, and save as final.mp4."
The agent will typically call:
load_video(path="intro.mp4") -> video_a1b2c3d4
trim(clip_id="video_a1b2c3d4", start_seconds=5, end_seconds=20)
create_text_clip(text="Q2 Review", font_size=64, duration_seconds=4)
overlay_clip(base_clip_id=..., overlay_clip_id=..., position="top")
preview_frame(clip_id=..., time_seconds=0)
export_clip(clip_id=..., output_path="final.mp4")Notes
Text rendering requires a font; pass
font="/path/to/font.ttf"tocreate_text_clipif the default is unavailable on your system.GIF export uses
write_gif(defaults to 12 fps); everything else goes through FFmpeg.The registry lives in server memory — restarting the server clears all clip_ids.
preview_framereturns an image to the model (downscaled to 640px by default). Use it after edits to verify beforeexport_clip.Clip metadata and a first-frame PNG are resources:
clip://{clip_id}/infoandclip://{clip_id}/frame.crossfadedissolves overlapping clips;concatenateis still a hard cut.even_sizecrops odd dimensions (H.264).add_subtitlesaccepts SRT or WebVTT viasrt_textorsrt_path.download_videouses yt-dlp for YouTube and Instagram. Public URLs work as-is; private Instagram media may needcookies_from_browser(e.g.chrome) or acookies_file. Respect each platform's terms of service and only download content you have rights to use.reframechanges aspect ratio for Shorts/Reels-style output:mode="crop"center-crops to fill,mode="pad_blur"keeps the whole frame and fills the bars with a blurred, zoomed copy.create_slideshowbuilds a video from a list of image paths in one call, with optional crossfade transitions and background audio (looped or trimmed to fit).mix_audio_trackslayers audio clips simultaneously (voice + music + SFX) with per-track volume;concatenatestill plays clips one after another.remove_silencecuts near-silent gaps out of an audio or video clip (podcast/vlog jump-cut editing) based on a loudness threshold and minimum gap length.save_frameandexport_imagetakeat_end=Trueto grab the last frame without knowing the exact duration.
License
MIT
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/vive1101011/moviepy-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server