Pastorsimon1798

mcp-video

Community Pastorsimon1798
Updated

Video editing MCP server for AI agents. 19 tools, 276 tests, progress callbacks. Works with Claude Code, Cursor, and any MCP client.

mcp-video

The video editing MCP server for AI agents. 19 tools. 3 interfaces. Purpose-built for AI agents.

Quick Start • Tools • Python API • CLI • Timeline DSL • Templates • Roadmap • Contributing

What is mcp-video?

mcp-video is an open-source video editing server built on the Model Context Protocol (MCP). It gives AI agents and any MCP-compatible client the ability to programmatically edit video files.

Think of it as ffmpeg with an API that AI agents can actually use. Instead of memorizing cryptic command-line flags, an agent calls structured tools with clear parameters and gets structured results back.

The Problem It Solves

AI agents can write code, analyze documents, and browse the web — but they can't edit video. Existing video editing tools are either:

  • GUI-only (Premiere, DaVinci, CapCut) — agents can't use them
  • Raw FFmpeg wrappers — require memorizing hundreds of flags
  • Cloud APIs (Render, Bannerbear) — expensive, slow, vendor lock-in

mcp-video bridges this gap. It's a local, fast, free video editing layer that any AI agent can use through a standard protocol.

Three Ways to Use It

Interface Best For Example
MCP Server AI agents (Claude Code, Cursor) "Trim this video and add a title"
Python Client Scripts, automation, pipelines editor.trim("v.mp4", start="0:30", duration="15")
CLI Shell scripts, quick ops mcp_video trim video.mp4 -s 0:30 -d 15

Install

Prerequisites

FFmpeg must be installed on your system:

# macOS
brew install ffmpeg

# For full text overlay support (drawtext filter):
# brew install freetype harfbuzz
# brew reinstall --build-from-source ffmpeg
# Verify: ffmpeg -filters | grep drawtext

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
# Download from https://ffmpeg.org/download.html

Installation

pip install mcp-video

Or with UVX (no install needed):

uvx mcp_video

Quick Start

1. As an MCP Server (for AI agents)

Install FFmpeg first, then pick your client:

Claude Code:

claude mcp add mcp-video -- pip install mcp-video && mcp-video --mcp

Claude Desktop — add to your claude_desktop_config.json:

{
  "mcpServers": {
    "mcp-video": {
      "command": "uvx",
      "args": ["mcp_video"]
    }
  }
}

Cursor — add to your .cursor/mcp.json:

{
  "mcpServers": {
    "mcp-video": {
      "command": "uvx",
      "args": ["mcp_video"]
    }
  }
}

Any MCP client — if installed via pip, the command is just mcp-video.

Then just ask your agent: "Trim this video from 0:30 to 1:00, add a title card, and resize for TikTok."

2. As a Python Library

from mcp_video import Client

editor = Client()

# Get video info
info = editor.info("interview.mp4")
print(f"Duration: {info.duration}s, Resolution: {info.resolution}")

# Trim a clip
clip = editor.trim("interview.mp4", start="00:02:15", duration="00:00:30")

# Merge clips with transitions
video = editor.merge(
    clips=["intro.mp4", clip.output_path, "outro.mp4"],
    transitions=["fade", "dissolve", "fade"],
)

# Add text overlay
video = editor.add_text(
    video=video.output_path,
    text="EPISODE 42: The Future of AI",
    position="top-center",
    size=48,
)

# Add background music
video = editor.add_audio(
    video=video.output_path,
    audio="music.mp3",
    volume=0.7,
    fade_in=2.0,
    fade_out=3.0,
)

# Resize for TikTok (9:16)
video = editor.resize(video=video.output_path, aspect_ratio="9:16")

# Export final video
result = editor.export(video.output_path, quality="high")
print(result)
# EditResult(output_path='interview_9:16.mp4', duration=45.0, resolution='1080x1920', ...)

3. As a CLI Tool

# Get video metadata
mcp_video info video.mp4

# Generate a fast low-res preview
mcp_video preview video.mp4

# Extract storyboard frames for review
mcp_video storyboard video.mp4 -n 12

# Trim a clip
mcp_video trim video.mp4 -s 00:02:15 -d 30 -o trimmed.mp4

# Convert to a different format
mcp_video convert video.mp4 -f webm -q high

MCP Tools

mcp-video exposes 19 tools for AI agents. All tools return structured JSON with success, output_path, and operation metadata. On failure, they return {"success": false, "error": {...}} with auto-fix suggestions.

New in v0.2.0: Progress callbacks provide real-time feedback on long-running operations (merge, convert, export), and visual verification returns thumbnails so agents can confirm results without opening files.

Video Operations

Tool Description Key Parameters
video_info Get video metadata input_path
video_trim Trim clip by timestamp input_path, start, duration/end
video_merge Concatenate multiple clips clips[], transitions[], transition_duration
video_speed Change playback speed input_path, factor (0.5=slow, 2.0=fast)

Effects & Overlays

Tool Description Key Parameters
video_add_text Overlay text/title input_path, text, position, size, color
video_add_audio Add or replace audio video_path, audio_path, volume, mix
video_subtitles Burn SRT/VTT subtitles input_path, subtitle_path
video_watermark Add image watermark input_path, image_path, position, opacity
video_crop Crop to rectangular region input_path, width, height, x?, y?
video_rotate Rotate and/or flip video input_path, angle, flip_horizontal, flip_vertical
video_fade Video fade in/out input_path, fade_in, fade_out

Format & Quality

Tool Description Key Parameters
video_resize Change resolution/aspect ratio input_path, width/height or aspect_ratio
video_convert Convert format input_path, format (mp4/webm/gif/mov)
video_export Render with quality settings input_path, quality, format

Analysis & Extraction

Tool Description Key Parameters
video_thumbnail Extract a single frame input_path, timestamp
video_preview Generate fast low-res preview input_path, scale_factor
video_storyboard Extract key frames as grid input_path, frame_count
video_extract_audio Extract audio track input_path, format (mp3/wav/aac/ogg/flac)

Advanced

Tool Description Key Parameters
video_edit Full timeline-based edit timeline (JSON DSL — see below)

MCP Resources

Resource URI Description
mcp-video://video/{path}/info Video metadata as JSON
mcp-video://video/{path}/preview Key frame timestamps
mcp-video://video/{path}/audio Audio track info
mcp-video://templates Available templates, presets, and formats

Python Client API

Full reference for the Client class:

from mcp_video import Client
editor = Client()

Methods

Method Returns Description
info(path) VideoInfo Video metadata (duration, resolution, codec, fps, size)
trim(input, start, duration?, end?, output?) EditResult Trim by start time + duration or end time
merge(clips, output?, transitions?, transition_duration?) EditResult Concatenate clips with per-pair transitions
add_text(video, text, position?, font?, size?, color?, shadow?, start_time?, duration?, output?) EditResult Overlay text on video
add_audio(video, audio, volume?, fade_in?, fade_out?, mix?, start_time?, output?) EditResult Add or replace audio track
resize(video, width?, height?, aspect_ratio?, quality?, output?) EditResult Resize or change aspect ratio
convert(video, format?, quality?, output?) EditResult Convert format (mp4/webm/gif/mov)
speed(video, factor?, output?) EditResult Change playback speed
thumbnail(video, timestamp?, output?) ThumbnailResult Extract single frame
preview(video, output?, scale_factor?) EditResult Fast low-res preview
storyboard(video, output_dir?, frame_count?) StoryboardResult Key frames + grid
subtitles(video, subtitle_file, output?) EditResult Burn subtitles into video
watermark(video, image, position?, opacity?, margin?, output?) EditResult Add image watermark
crop(video, width, height, x?, y?, output?) EditResult Crop to rectangular region
rotate(video, angle?, flip_horizontal?, flip_vertical?, output?) EditResult Rotate and/or flip video
fade(video, fade_in?, fade_out?, output?) EditResult Video fade in/out effect
export(video, output?, quality?, format?) EditResult Render with quality settings
edit(timeline, output?) EditResult Execute full timeline edit from JSON
extract_audio(video, output?, format?) EditResult Extract audio as file path

Return Models

VideoInfo(path, duration, width, height, fps, codec, audio_codec, ...)
# .resolution  -> "1920x1080"
# .aspect_ratio -> "16:9"
# .size_mb -> 5.42

EditResult(success=True, output_path, duration, resolution, size_mb, format, operation)

ThumbnailResult(success=True, frame_path, timestamp)

StoryboardResult(success=True, frames=["f1.jpg", ...], grid="grid.jpg", count=8)

CLI Reference

mcp_video [command] [options]

Commands:
  info           Get video metadata
  trim           Trim a video
  merge          Merge multiple clips
  add-text       Overlay text on a video
  add-audio      Add or replace audio track
  resize         Resize or change aspect ratio
  convert        Convert video format
  speed          Change playback speed
  thumbnail      Extract a single frame
  preview        Generate fast low-res preview
  storyboard     Extract key frames as storyboard
  subtitles      Burn subtitles into video
  watermark      Add image watermark
  crop           Crop to rectangular region
  rotate         Rotate and/or flip video
  fade           Add video fade in/out
  export         Export with quality settings
  extract-audio  Extract audio track
  edit           Execute timeline-based edit from JSON

Options:
  --mcp      Run as MCP server (default when no command given)
  -h, --help Show help

Examples

# Get metadata as JSON
mcp_video info video.mp4

# Preview with custom downscale
mcp_video preview video.mp4 -s 2

# Storyboard with 12 frames
mcp_video storyboard video.mp4 -n 12 -o ./frames

# Trim from 2:15 for 30 seconds
mcp_video trim video.mp4 -s 00:02:15 -d 30 -o clip.mp4

# Convert to GIF at medium quality
mcp_video convert video.mp4 -f gif -q medium

# Default: run MCP server
mcp_video --mcp

Timeline DSL

For complex multi-track edits, describe everything in a single JSON object:

editor.edit({
    "width": 1080,
    "height": 1920,
    "tracks": [
        {
            "type": "video",
            "clips": [
                {"source": "intro.mp4", "start": 0, "duration": 5},
                {"source": "main.mp4", "start": 5, "trim_start": 10, "duration": 30},
                {"source": "outro.mp4", "start": 35, "duration": 10},
            ],
            "transitions": [
                {"after_clip": 0, "type": "fade", "duration": 1.0},
                {"after_clip": 1, "type": "dissolve", "duration": 1.0},
            ],
        },
        {
            "type": "audio",
            "clips": [
                {"source": "music.mp3", "start": 0, "volume": 0.7, "fade_in": 2},
            ],
        },
        {
            "type": "text",
            "elements": [
                {"text": "EPISODE 42", "start": 0, "duration": 3, "position": "top-center",
                 "style": {"size": 48, "color": "white", "shadow": True}},
            ],
        },
    ],
    "export": {"format": "mp4", "quality": "high"},
})

Timeline Schema

Field Type Default Description
width int 1920 Output width
height int 1080 Output height
tracks Track[] [] Video, audio, and text tracks
export.format str "mp4" mp4, webm, gif, mov
export.quality str "high" low, medium, high, ultra

Track types: video, audio, text

Video clip fields: source, start, duration, trim_start, trim_end, volume, fade_in, fade_out

Transition fields: after_clip (index), type (fade/dissolve/wipe-*), duration

Text element fields: text, start, duration, position, style (font/size/color/shadow)

Positions: top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right

Templates

Pre-built templates for common social media formats:

from mcp_video.templates import tiktok_template, youtube_video_template

# TikTok (9:16, 1080x1920)
timeline = tiktok_template(
    video_path="clip.mp4",
    caption="Check this out!",
    music_path="bgm.mp3",
)

# YouTube Shorts (9:16, title at top)
timeline = youtube_shorts_template("clip.mp4", title="My Short")

# Instagram Reel (9:16)
timeline = instagram_reel_template("clip.mp4", caption="Reel caption")

# YouTube Video (16:9, 1920x1080)
timeline = youtube_video_template(
    video_path="video.mp4",
    title="My Amazing Video",
    outro_path="subscribe.mp4",
    music_path="bgm.mp3",
)

# Instagram Post (1:1, 1080x1080)
timeline = instagram_post_template("clip.mp4", caption="Post caption")

# Execute any template
result = editor.edit(timeline)

Template Registry

from mcp_video.templates import TEMPLATES

print(list(TEMPLATES.keys()))
# ['tiktok', 'youtube-shorts', 'instagram-reel', 'youtube', 'instagram-post']

# Call any template by name
timeline = TEMPLATES["tiktok"](video_path="clip.mp4", caption="Hello!")

Quality Presets

Quality CRF Encoder Preset Max Height Use Case
low 35 fast 480p Drafts, previews
medium 28 medium 720p Social media
high 23 slow 1080p Production
ultra 18 veryslow 1080p Final output

Lower CRF = better quality, larger file. The preset controls encoding speed (slower = better compression).

Aspect Ratios

Ratio Resolution Platforms
16:9 1920x1080 YouTube
9:16 1080x1920 TikTok, Reels, Shorts
1:1 1080x1080 Instagram Post
4:5 1080x1350 Instagram Feed
4:3 1440x1080 Classic video
21:9 2560x1080 Ultrawide
editor.resize("video.mp4", aspect_ratio="9:16")  # TikTok
editor.resize("video.mp4", aspect_ratio="16:9")  # YouTube
editor.resize("video.mp4", aspect_ratio="1:1")   # Instagram

Error Handling

mcp-video parses FFmpeg errors and returns structured, actionable error responses:

{
  "success": false,
  "error": {
    "type": "encoding_error",
    "code": "unsupported_codec",
    "message": "Codec error: vp9 — Auto-convert input from vp9 to H.264/AAC before editing",
    "suggested_action": {
      "auto_fix": true,
      "description": "Auto-convert input from vp9 to H.264/AAC before editing"
    },
    "documentation_url": "https://github.com/pastorsimon1798/mcp-video#codec-compatibility"
  }
}

Error Types

Error Type Auto-Fix Description
FFmpegNotFoundError dependency_error No FFmpeg not installed
FFprobeNotFoundError dependency_error No FFprobe not installed
InputFileError input_error No File doesn't exist or invalid
CodecError encoding_error Yes Unsupported codec
ResolutionMismatchError encoding_error Yes Clips have different resolutions
ProcessingError processing_error No FFmpeg processing failed
ExportError export_error No Export/rendering failed
ResourceError resource_error No Insufficient disk space or memory

Testing

mcp-video has 276 tests across the full testing pyramid:

tests/
├── conftest.py              # Shared fixtures (sample video, audio, SRT, VTT, watermark PNG, WebM)
├── test_models.py           # 48 tests — Pydantic model validation (no FFmpeg needed)
├── test_errors.py           # 42 tests — Error classes and FFmpeg error parsing (no FFmpeg)
├── test_templates.py        # 21 tests — Template functions and registry (no FFmpeg)
├── test_client.py           # 31 tests — Python Client API wrapper
├── test_server.py           # 36 tests — MCP tool layer
├── test_engine.py           # 26 tests — Core FFmpeg engine operations
├── test_engine_advanced.py  # 44 tests — Edge cases, new operations, per-transition merge
├── test_cli.py              # 6 tests  — CLI commands via subprocess
└── test_e2e.py              # 8 tests  — Full end-to-end workflows

Running Tests

# Install dev dependencies
pip install -e ".[dev]"

# Run all tests
pytest tests/ -v

# Run only unit tests (no FFmpeg needed)
pytest tests/test_models.py tests/test_errors.py tests/test_templates.py -v

# Run with coverage
pytest tests/ --cov=mcp_video --cov-report=term-missing

Test Pyramid

Layer Tests What It Tests
Unit 111 Models, errors, templates — pure Python, no FFmpeg
Integration 143 Client, server, engine, CLI — real FFmpeg operations
E2E 8 Multi-step workflows (TikTok, YouTube, GIF, speed)

Architecture

mcp_video/
├── __init__.py       # Exports Client
├── __main__.py       # CLI entry point (argparse)
├── client.py         # Python Client class (wraps engine)
├── engine.py         # FFmpeg engine (all video operations)
├── errors.py         # Error types + FFmpeg stderr parser
├── models.py         # Pydantic models (VideoInfo, EditResult, Timeline DSL)
├── templates.py      # Platform templates (TikTok, YouTube, Instagram)
└── server.py         # MCP server (19 tools + 4 resources)

Dependencies:

  • mcp>=1.0.0 — Model Context Protocol SDK
  • pydantic>=2.0 — Data validation
  • ffmpeg — Video processing (external, required)

Supported Formats

Video

Format Container Video Codec Audio Codec
MP4 mp4 H.264 (libx264) AAC
WebM webm VP9 (libvpx-vp9) Opus
MOV mov H.264 (libx264) PCM
GIF gif Palette-based None

Audio (extraction)

MP3, AAC, WAV, OGG, FLAC

Subtitles

SRT, WebVTT (burned into video)

Development

# Clone
git clone https://github.com/pastorsimon1798/mcp-video.git
cd mcp-video

# Setup
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run a single test file
pytest tests/test_client.py -v

# Run with verbose output
pytest tests/ -v --tb=long

Roadmap

  • Progress callbacks for long-running operations (v0.2.0)
  • Visual verification with thumbnail output (v0.2.0)
  • Batch processing mode (edit 100 videos at once)
  • Streaming upload/download (S3, GCS integration)
  • Web UI for non-agent users
  • FFmpeg filter auto-detection and graceful fallback
  • Video effects (blur, color grading)
  • Audio normalization and noise reduction
  • Thumbnail selection via AI scene detection
  • Plugin system for custom filters

License

Apache 2.0 — see LICENSE. Use it however you want.

Acknowledgments

Built on FFmpeg and the Model Context Protocol.

MCP Server · Populars

MCP Server · New

    nteract

    semiotic

    A data visualization for AI and Streaming

    Community nteract
    rixinhahaha

    Snip

    A macOS menu-bar screenshot tool with annotation, AI-powered organization, and semantic search. Built with Electron and Ollama. Featured on Product Hunt: https://www.producthunt.com/products/snip-ai-powered-macos-screenshot-tool

    Community rixinhahaha
    blitzdotdev

    Blitz

    Blitz mac app

    Community blitzdotdev
    mozilla

    Firefox DevTools MCP

    Model Context Protocol server for Firefox DevTools - enables AI assistants to inspect and control Firefox browser through the Remote Debugging Protocol

    Community mozilla
    globau

    Firefox DevTools MCP

    Model Context Protocol server for Firefox DevTools - enables AI assistants to inspect and control Firefox browser through the Remote Debugging Protocol

    Community globau