1-Liner: Give your AI agents eyes: Extract visual context from local videos for Claude, Cursor, and Windsurf.
This is an MCP (Model Context Protocol) server that bridges AI coding assistants with ffmpeg, enabling them to work with video files directly from chat.
demo.mp4
| Tool | Description |
|---|---|
extract_frame |
Extract a single image (returns base64 & OCR text; path optional) |
extract_multiple_frames |
Batch-extract frames (returns base64; directory optional) |
get_video_info |
Get duration, resolution, FPS, codec, and frame count |
extract_clip |
Cut a video segment (path required) |
- Built-in OCR (
extract_frame): The server automatically runs Optical Character Recognition usingtesseract.json extracted frames and returns the text directly to your AI. Perfect for reading error messages or slide content in videos. - Smart Sampling (
extract_multiple_frames): Don't dump a frame for every second and blow up your token context. Ask fortotalFrames: 10, and the server will perfectly divide the video to return 10 evenly distributed frames capturing the whole timeline. - Transient Mode: If you omit output paths for frames, the server saves them to a system temp folder, reads them to base64, and immediately deletes them. Zero clutter.
Your video files never leave your machine. Frame extraction, OCR, and clipping happen entirely locally. This makes it safe for corporate environments, NDAs, and private recordings.
All processing happens locally on your machine using ffmpeg, ffprobe, and tesseract.js for OCR. The server communicates via stdio transport β the standard MCP protocol. Your AI sends a tool call, the server runs the command, and returns the result (and text, if applicable).
extract_frameβffmpeg -ss <timestamp> -i video.mp4 -frames:v 1 output.jpg+ OCR Processingextract_multiple_framesβffmpeg -vf fps=N/duration video.mp4 output_%04d.jpgget_video_infoβffprobe -print_format json -show_streams -show_format video.mp4extract_clipβffmpeg -ss <start> -to <end> -c copy video.mp4 clip.mp4
Why use
-c copy? It skips re-encoding entirely, making clip extraction near-instant. The tradeoff is that cuts align to the nearest keyframe, so they may be slightly off on the exact frame.
- Node.js 18+ β Download here
- ffmpeg β installed and accessible from your system PATH
| Platform | Command |
|---|---|
| Windows | winget install ffmpeg or choco install ffmpeg |
| macOS | brew install ffmpeg |
| Ubuntu/Debian | sudo apt install ffmpeg |
| Fedora/RHEL | sudo dnf install ffmpeg |
Verify it works: ffmpeg -version
npx -y @eequaled/frames-mcp(Alternatively, you can clone and build from source).
The npx command automatically fetches the latest version from NPM.
For clients that use a config.json structure (Cursor, Claude, Roo Code, Cline, Windsurf), use this snippet in your mcpServers object:
{
"mcpServers": {
"video-frames": {
"command": "npx",
"args": ["-y", "@eequaled/frames-mcp"]
}
}
}Important
If you cloned from GitHub instead of using npx, change the command to node and the args to the absolute path of your local dist/index.js.
- Open Settings β Features β MCP
- Click + Add New MCP Server
- Fill in:
- Name:
video-frames - Type:
command - Command:
npx -y @eequaled/frames-mcp
- Name:
- Save and wait for the green dot (Connected)
Edit your config file:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"video-frames": {
"command": "npx",
"args": ["-y", "@eequaled/frames-mcp"]
}
}
}Open the Roo Code MCP settings panel, or edit the file directly:
%APPDATA%\Code\User\globalStorage\roovscode.roo-cline\settings\cline_mcp_settings.json
{
"mcpServers": {
"video-frames": {
"command": "npx",
"args": ["-y", "@eequaled/frames-mcp"]
}
}
}Edit the Cline MCP settings file:
%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json
{
"mcpServers": {
"video-frames": {
"command": "npx",
"args": ["-y", "@eequaled/frames-mcp"]
}
}
}Open Settings β MCP β Add Server and fill in:
{
"command": "npx",
"args": ["-y", "@eequaled/frames-mcp"]
}Any MCP-compatible tool (Open Interpreter, custom scripts, etc.) can connect using:
| Parameter | Value |
|---|---|
| Transport | stdio |
| Command | npx |
| Args | ["-y", "@eequaled/frames-mcp"] |
You can also test it directly in your terminal:
# Smoke test β should print the running message
npx -y @eequaled/frames-mcp
# Send a raw JSON-RPC list request
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y @eequaled/frames-mcpOnce connected, try these in your AI chat:
What's the duration and resolution of /path/to/video.mp4?
Extract the frame at 1:30 from /path/to/video.mp4 and save it to /output/thumb.jpg
Check this video and tell me the moment the error message appears.
Summarize the UI changes in this screen recording.
Extract the text from the slide at 02:45.
Tip: Always use absolute paths (e.g.,
C:\Videos\movie.mp4or/home/user/movie.mp4). Relative paths won't reliably resolve.
Combined with your AI's vision capabilities, this MCP unlocks:
- Video content analysis β extract frames β AI describes or summarizes scene content
- Thumbnail generation β pull the best-looking frame from any moment
- Quick video inspection β get metadata without opening a video player
- Clip extraction β cut highlight reels or short segments on demand
- GIF/video pipelines β clip a segment and pipe it into further processing
mp4, mkv, avi, mov, webm, flv, wmv, m4v β and anything else ffmpeg can decode.
This project includes an llms.txt file β a machine-readable document written specifically for AI agents. If you want an AI assistant to set up, configure, or use this MCP server on your behalf, just point it at that file:
"Read the
llms.txtin this repo and add the video-frames MCP to my setup."
The file contains everything an agent needs: prerequisites, install steps, config snippets for every client, full tool specs with all parameters, and important caveats (like always using absolute paths).