ffmpeg-mcp Server
Paket Python untuk pemrosesan media menggunakan FFmpeg dan FastMCP.
Dokumentasi

ffmpeg-mcp π¬β‘
Edit video and audio by just talking to your AI assistant.
ffmpeg-mcp is a Model Context Protocol server that puts the full power of FFmpeg behind a clean set of tools your LLM can call β clip, crop, scale, overlay, concatenate with transitions, extract frames/audio, make GIFs, and more. No command-line flags to memorize.
β¨ Why ffmpeg-mcp?
FFmpeg is incredibly powerful and incredibly hard to remember. ffmpeg-mcp hands that power to your AI assistant so you can say what you want in plain English:
"Grab the first 10 seconds of
demo.mov, scale it to 1080p, slap my logo in the top-right corner, and turn it into a GIF."
β¦and the model orchestrates the right tools for you. Each tool is a small, validated Python function β easy to read, reuse, and extend.
- π£οΈ Natural-language video editing β works in any MCP client (Claude Desktop, Cursor, Cline, β¦)
- π§± 12 focused tools β composable building blocks instead of one giant black box
- β Input validation built in β paths are checked for existence, emptiness, and validity before FFmpeg runs
- π§© Hackable β add a new tool by writing one function and registering it
π οΈ Available Tools
| Tool | What it does | Key parameters |
|---|---|---|
get_video_metadata | Probe a file for streams, codecs, duration, etc. | input_video_path |
extract_frames | Save frames as images (evenly, by interval, or 1/sec) | input_video_path, number_of_frames?, timestamp_offset? |
extract_audio | Pull audio out to a .wav file | input_video_path |
scale_video | Upscale to 1080p / 2k / 4k, aspect-preserving | input_video_path, resolution="1080p" |
crop_video | Crop to a region | input_video_path, width, height, x_offset, y_offset, safe_crop |
clip_video | Cut a sub-clip by start + duration | input_video_path, start_timestamp, duration |
make_gif | Turn a segment into an optimized GIF | input_video_path, start_timestamp, duration |
overlay_image | Composite an image (logo/watermark) with timing & opacity | input_video_path, overlay_image_path, positioning, opacity, start_time, duration |
overlays_video | Overlay a (looping) video onto another | input_video_path, overlay_video_path, positioning, scale |
trim_and_concat_operation | Trim multiple clips and stitch them together | inputs: [{path, start_time?, end_time?}], width, height |
get_normalized_clips | Normalize clips to a common res/fps/codec (in parallel) | input_video_clips, resolution, frame_rate, crf |
concat_clips_with_transition | Concatenate clips with an xfade transition | input_video_clips, transition_type="fade", transition_duration |
?marks optional parameters.concat_clips_with_transitionsupports many transitions βfade,wipeleft,slideup,circlecrop,dissolve,pixelize,radial, and dozens more.
π¦ Requirements
Verify FFmpeg is available:
ffmpeg -version
π Quick Start
1. Clone & install
git clone https://github.com/yubraaj11/ffmpeg-mcp.git
cd ffmpeg-mcp
uv sync --frozen
2. Connect it to your MCP client
Point your client at the server using the snippets below. Replace /path/to/ffmpeg-mcp with the absolute path to your clone.
Claude Desktop / Cursor (claude_desktop_config.json or .cursor/mcp.json)
{
"mcpServers": {
"ffmpeg-mcp": {
"command": "uv",
"args": ["--directory", "/path/to/ffmpeg-mcp/ffmpeg_mcp", "run", "main.py"],
"env": { "PYTHONPATH": "/path/to/ffmpeg-mcp" }
}
}
}
Cline (VS Code)
{
"mcpServers": {
"ffmpeg-mcp": {
"autoApprove": [],
"disabled": false,
"timeout": 60,
"command": "uv",
"args": ["--directory", "/path/to/ffmpeg-mcp/ffmpeg_mcp", "run", "main.py"],
"env": { "PYTHONPATH": "/path/to/ffmpeg-mcp" },
"transportType": "stdio"
}
}
}
3. Restart your client and start editing
"Extract 5 evenly-spaced frames from
intro.mp4.""Make a 3-second GIF from
clip.movstarting at 12s.""Concatenate
a.mp4,b.mp4, andc.mp4with a 1-secondwipelefttransition between them."
Processed files are written under ffmpeg_mcp/processed_elements/.
π§° Project Layout
ffmpeg_mcp/
βββ main.py # MCP server entry point β registers all tools
βββ services/ # one module per tool
βββ configs/ # colored logging setup
βββ exceptions/ # structured error messages
utils/ # validation decorators & helpers
Every tool returns either the output file path or a structured JSON error (status, error_type, message, time), so failures are easy for the model to read and recover from.
π€ Contributing
Contributions are very welcome! Adding a tool is roughly:
- Write a function in
ffmpeg_mcp/services/your_tool.py. - Export it from
ffmpeg_mcp/services/__init__.py. - Register it in
main.pywithmcp.tool(name_or_fn=your_tool).
Please run the linter before opening a PR:
uv run ruff check .
Found a bug or have an idea? Open an issue β and if this project saves you from another ffmpeg man-page dive, consider leaving a β.
π Built With
fastmcpβ the MCP server frameworkffmpeg-pythonβ Python bindings for FFmpegpydanticβ data validationcolorlogβ colored logs