MoviePy MCP Server
The MoviePy MCP Server lets MCP clients load media into a clip registry, chain non-destructive video/audio edits, and render outputs to disk.
Load/create: import video/audio/images; create solid-color and text clips.
Inspect/manage: list clips, get metadata, delete clips, preview frames, project status, list fonts.
Time: trim, concatenate, crossfade, change speed, loop, reverse, freeze.
Geometry: resize, crop, rotate, mirror, even_size, reframe.
Visual FX: fade, grayscale, adjust colors, chroma key; advanced effects include blur, sharpen, invert, gamma, color multiply, margin, painting, opacity, freeze region, slide/scroll, Ken Burns.
Audio: set volume, duck, normalize, delay, stereo volume, extract/remove/attach audio, mix tracks, remove silence.
Compositing: overlay clips, grid clips, add subtitles.
Output: save frame/image, export clip, download/upload media.
Workflow: clip_ids enable branching/retry; uniform metadata and actionable errors.
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., "@MoviePy MCP Server Trim intro.mp4 from 5s to 20s and fade out at end, save as final.mp4."
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.
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 a 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_cliprenders a file.presetcan beyoutube_1080p,reels_1080x1920, orpodcast_aac.
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.
Reads and writes stay inside MOVIEPY_MCP_MEDIA_ROOT (your home directory when unset) or the system temp directory. The registry is one session on stdio. HTTP (MOVIEPY_MCP_TRANSPORT=http) gives each client its own registry and requires MOVIEPY_MCP_TOKEN. Source files are written to .moviepy-mcp/ under the workspace and reopened after a restart; project_status lists edits that were not rebuilt.
The default tool list is the everyday edit path. Set MOVIEPY_MCP_ADVANCED=1 to also expose blur, chroma key, Ken Burns, and the other effects.
Code is split under src/moviepy_mcp/: config, paths, registry, presets, editing, prompts, and tools/.
Related MCP server: Video Edit MCP Server
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",
"moviepy-mcp"
],
"env": {
"MOVIEPY_MCP_MEDIA_ROOT": "C:/Users/vivek/Videos",
"MOVIEPY_MCP_ADVANCED": "1"
}
}
}
}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:
{
"mcpServers": {
"moviepy": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/moviepy-mcp",
"moviepy-mcp"
]
}
}
}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.Source clips are reopened from
.moviepy-mcp/*.jsonafter a restart. Derived edits are listed byproject_statusand are not rebuilt. SetMOVIEPY_MCP_PERSIST=0to keep nothing on disk.MOVIEPY_MCP_MAX_CLIPS(default 48) drops the oldest clip that nothing else still uses.MOVIEPY_MCP_MAX_WIDTH,MAX_HEIGHT, andMAX_DURATIONreject oversized media.download_videowill not read browser cookies unlessMOVIEPY_MCP_ALLOW_BROWSER_COOKIES=1.file_manageropens a drop zone in the chat. After upload,list_filesreturns eachclip_id.download_mediaopens a player and download button for the finished clip;export_clipstill writes a path you choose.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
Available Tools
27 toolsadjust_colorsC
Adjust brightness/contrast.
Inputs: clip_id (required), contrast, brightness. Returns: object
attach_audioB
Set or mix an audio track onto a video clip.
Inputs: audio_clip_id (required), video_clip_id (required), mix_with_existing. Returns: object
change_speedB
Speed a clip up or down.
Inputs: factor (required), clip_id (required). Returns: object
chroma_keyB
Mask a color in a video clip (chroma key / green screen).
Inputs: clip_id (required), color_rgb (required), stiffness, threshold. Returns: object
concatenateA
Join clips end-to-end, in the given order.
All ids must be the same kind (all video/image, or all audio).
Inputs: clip_ids (required), method. Returns: object
create_color_clipA
Create a solid-color video clip (backgrounds, spacers, title cards).
Inputs: width (required), height (required), color_rgb (required), duration_seconds (required), +1 more. Returns: object
create_text_clipA
Create a standalone text clip (titles, captions, credits).
To place text ON TOP of a video, create it here and then use
overlay_clip with position and timing.
Inputs: text (required), font, color, label, +3 more. Returns: object
cropB
Crop to the rectangle (x1, y1)-(x2, y2). Origin is the top-left.
Inputs: x1 (required), x2 (required), y1 (required), y2 (required), +1 more. Returns: object
delete_clipB
Remove a clip from the registry and free its resources.
Inputs: clip_id (required). Returns: object
export_clipA
Render a clip to disk. THIS is the step that writes a file.
Inputs: clip_id (required), output_path (required), fps, codec, +1 more. Returns: object
extract_audioB
Pull the audio track out of a video as a new audio clip.
Inputs: clip_id (required). Returns: object
fadeB
Add fade-in and/or fade-out. Works for video (to black) and audio.
Inputs: clip_id (required), fade_in_seconds, fade_out_seconds. Returns: object
get_clip_infoA
Get full metadata for one clip: duration, size, fps, audio, history.
Inputs: clip_id (required). Returns: object
list_clipsA
List every clip currently in the registry with its metadata.
Inputs: no named parameters. Returns: object
load_audioA
Load an audio file (mp3, wav, aac, ogg...) into the registry.
Inputs: path (required), label. Returns: object
load_imageA
Load a still image (png, jpg...) as a video clip of fixed duration.
Useful for slideshows, intros, watermark sources, and overlays.
Inputs: path (required), label, duration_seconds. Returns: object
load_videoA
Load a video file (mp4, mov, avi, webm, mkv...) into the registry.
Inputs: path (required), label. Returns: object
loop_clipA
Repeat a clip. Give either n_times OR total_duration_seconds.
Inputs: clip_id (required), n_times, total_duration_seconds. Returns: object
mirrorB
Flip a clip. axis: 'horizontal' (left-right) or 'vertical' (up-down).
Inputs: clip_id (required), axis. Returns: object
overlay_clipA
Place one clip on top of another (text, watermark, picture-in-picture).
Inputs: base_clip_id (required), overlay_clip_id (required), x, y, +4 more. Returns: object
remove_audioA
Return a muted copy of a video clip (audio track removed).
Inputs: clip_id (required). Returns: object
resizeA
Resize a video/image clip.
Give exactly one of: scale (e.g. 0.5), width, height, or width+height. A single dimension preserves aspect ratio.
Inputs: clip_id (required), scale, width, height. Returns: object
rotateB
Rotate counter-clockwise by the given degrees (use -90 for clockwise).
Inputs: clip_id (required), degrees (required). Returns: object
save_frameA
Save a single frame of a video as an image (png/jpg).
Useful for thumbnails or letting the user preview an edit.
Inputs: clip_id (required), output_path (required), time_seconds. Returns: object
set_volumeA
Scale volume: 0.5 = half, 2.0 = double, 0 = silent.
Works on audio clips and on the audio track of video clips.
Inputs: factor (required), clip_id (required). Returns: object
to_grayscaleC
Convert a video/image clip to black and white.
Inputs: clip_id (required). Returns: object
trimB
Cut a clip to the range [start_seconds, end_seconds].
Inputs: clip_id (required), start_seconds (required), end_seconds. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Every tool targets a distinct operation: loading, creating, transforming, compositing, audio handling, and exporting. Even related tools like adjust_colors and to_grayscale are clearly separate, with no ambiguous overlap.
Tool names are consistently lowercase snake_case, mostly following a verb_noun pattern (load_video, create_text_clip, export_clip). A few single-word verbs (resize, trim, fade) and to_grayscale are minor deviations but do not break the overall predictable style.
With 27 tools, this server is well above the 3-15 tool sweet spot for MCP coherence. The large number increases agent selection difficulty and could be split into focused sub-servers (e.g., core editing vs. audio vs. compositing).
The server covers the full editing lifecycle: import (load_*), creation (create_*), inspection (list, get, delete), modification (trim, resize, rotate, etc.), compositing (overlay, attach), and export (export_clip, save_frame). No obvious gap for standard MoviePy workflows.
Related MCP Connectors
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
AI video editor for agents and humans: timeline, captions, color, audio and generation as MCP tools.
FFmpeg as a service for AI agents: typed video editing tools, async jobs, downloadable outputs.
Autonomous AI video editor over MCP: viral clips, captions, reframe, chroma key, MP4 export
Related MCP Servers
- AlicenseAqualityDmaintenanceA lightweight server that exposes FFmpeg's video processing capabilities to AI assistants through the Model Context Protocol (MCP), supporting operations like video format conversion, audio extraction, and adding watermarks.853 npm25MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI assistants to perform comprehensive video and audio editing operations including trimming, effects, overlays, audio processing, and YouTube downloads.35 PyPI30MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for programmatic video editing using ffmpeg, enabling draft creation and refinement via natural language.11 npmISC
- AlicenseAqualityDmaintenanceEnables LLMs to perform FFmpeg operations like clipping, merging, extracting audio, adding subtitles, and transcoding videos via a set of tools exposed as an MCP server.58MIT