mcp-video-reader
An MCP server that gives Claude full access to ffmpeg — extract frames, convert formats, trim and join clips, manipulate audio, apply filters, and handle subtitles. No external API key required.
Prerequisites
ffmpeg must be installed and available on your PATH.
- Windows:
winget install ffmpegorchoco install ffmpeg - macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt install ffmpeg
Installation
npx (no install)
npx mcp-video-reader
npm global
npm install -g mcp-video-reader
From GitHub directly
npx github:lawriec/mcp-video-reader
Local dev
git clone https://github.com/lawriec/mcp-video-reader.git
cd mcp-video-reader
npm install
npm run build
Configuration
Claude Desktop
Add to your Claude Desktop config (claude_desktop_config.json):
Via npx (recommended):
{
"mcpServers": {
"video-reader": {
"command": "npx",
"args": ["-y", "mcp-video-reader"]
}
}
}
Via GitHub (before npm publish):
{
"mcpServers": {
"video-reader": {
"command": "npx",
"args": ["-y", "github:lawriec/mcp-video-reader"]
}
}
}
Local build:
{
"mcpServers": {
"video-reader": {
"command": "node",
"args": ["/absolute/path/to/mcp-video-reader/build/index.js"]
}
}
}
Claude Code
claude mcp add video-reader -- npx -y mcp-video-reader
Tools
Inspection
get_video_info
Get metadata about a video file.
Input:
file_path(string, required) — Absolute path to the video file
Output: Text with duration, resolution, fps, codecs, bitrate, file size.
---
extract_frames
Extract evenly-spaced frames from a video file as JPEG images.
Input:
file_path(string, required) — Absolute path to the video filenum_frames(number, optional) — Number of frames to extract, 1–20 (default: 10)start_time(number, optional) — Start time in seconds (default: beginning)end_time(number, optional) — End time in seconds (default: end of video)
Output: Text summary + base64 JPEG images of each frame.
---
extract_frame_at_timestamp
Extract a single frame at a specific timestamp.
Input:
file_path(string, required) — Absolute path to the video filetimestamp(number, required) — Timestamp in seconds
Output: Text label + single base64 JPEG image.
---
Convert
convert_video
Convert a video to a different container format and/or codec. Audio is copied without re-encoding unless the container requires otherwise.
Input:
file_path(string, required) — Absolute path to the input video fileoutput_format(string, required) — Container format:mp4,mkv,webm,avi, ormovcodec(string, optional) — Video codec:h264,h265,vp9,av1, orcopy(re-container without re-encode)crf(number, optional) — Constant Rate Factor for quality (0–63; lower = better). Typical: 18–28 for h264/h265, 28–40 for vp9bitrate(string, optional) — Target video bitrate, e.g.2000kor5M. Cannot be combined withcrfoutput_path(string, optional) — Defaults to same directory as input with_convertedsuffix
Output: Text confirming the output file path.
---
Trim / Edit
trim_video
Cut a clip from a video by start and end time. Re-muxes without re-encoding (lossless, fast).
Input:
file_path(string, required) — Absolute path to the input video filestart_time(number, required) — Start time in secondsend_time(number, required) — End time in secondsoutput_path(string, optional) — Defaults to same directory with_trimmedsuffix
Output: Text confirming the output file path.
---
concat_videos
Join multiple video files into one in the order provided, without re-encoding (lossless, fast). All inputs must share the same codec and resolution.
Input:
file_paths(array of strings, required) — Ordered list of absolute paths (minimum 2)output_path(string, optional) — Defaults to same directory as the first file with_concatsuffixoutput_format(string, optional) —mp4,mkv,webm,avi, ormov. Defaults to the format of the first input file
Output: Text confirming the output file path.
---
split_video
Split a video into equal-duration segments without re-encoding. Output files are named <basename>_part_000.<ext>, <basename>_part_001.<ext>, etc.
Input:
file_path(string, required) — Absolute path to the input video filesegment_duration(number, required) — Duration of each segment in secondsoutput_dir(string, optional) — Directory to write segments to. Defaults to same directory as inputoutput_format(string, optional) —mp4,mkv,webm,avi, ormov. Defaults to same format as input
Output: Text listing all created segment file paths.
---
Audio
extract_audio
Extract the audio track from a video and save it as a standalone audio file.
Input:
file_path(string, required) — Absolute path to the input video fileoutput_format(string, optional) — Audio format:mp3,aac,flac,wav, orogg(default:mp3)output_path(string, optional) — Defaults to same directory with_audiosuffix
Output: Text confirming the output file path.
---
strip_audio
Remove the audio track from a video, producing a silent video. The video stream is copied without re-encoding.
Input:
file_path(string, required) — Absolute path to the input video fileoutput_path(string, optional) — Defaults to same directory with_noaudiosuffix
Output: Text confirming the output file path.
---
adjust_volume
Change the audio volume of a video. The video stream is copied without re-encoding.
Input:
file_path(string, required) — Absolute path to the input video filevolume(number, required) — Volume multiplier:1.0= original,2.0= double,0.5= half. Must be ≥ 0output_path(string, optional) — Defaults to same directory with_volumesuffix
Output: Text confirming the output file path.
---
Filters
resize_video
Resize a video to new dimensions. Omit one dimension to scale proportionally and preserve aspect ratio.
Input:
file_path(string, required) — Absolute path to the input video filewidth(number, optional) — Output width in pixelsheight(number, optional) — Output height in pixelsoutput_path(string, optional) — Defaults to same directory with_resizedsuffix
At least one of width or height must be provided.
Output: Text confirming the output file path.
---
crop_video
Crop a video to a rectangular region.
Input:
file_path(string, required) — Absolute path to the input video filewidth(number, required) — Width of the crop region in pixelsheight(number, required) — Height of the crop region in pixelsx(number, optional) — X offset of the top-left corner (default: 0)y(number, optional) — Y offset of the top-left corner (default: 0)output_path(string, optional) — Defaults to same directory with_croppedsuffix
Output: Text confirming the output file path.
---
rotate_video
Rotate a video 90, 180, or 270 degrees clockwise.
Input:
file_path(string, required) — Absolute path to the input video filerotation(number, required) — Degrees clockwise:90,180, or270output_path(string, optional) — Defaults to same directory with_rotatedNsuffix
Output: Text confirming the output file path.
---
adjust_video
Adjust brightness, contrast, and/or saturation using the ffmpeg eq filter.
Input:
file_path(string, required) — Absolute path to the input video filebrightness(number, optional) — Range:-1.0to1.0. Default:0(no change)contrast(number, optional) — Range:-1000to1000. Default:1(no change)saturation(number, optional) — Range:0(grayscale) to3.0. Default:1(no change)output_path(string, optional) — Defaults to same directory with_adjustedsuffix
Output: Text confirming the output file path.
---
add_text_overlay
Burn a text string onto every frame of a video using the ffmpeg drawtext filter.
Input:
file_path(string, required) — Absolute path to the input video filetext(string, required) — Text to overlay (max 500 characters)x(number, optional) — X position in pixels from the left edge (default: 10)y(number, optional) — Y position in pixels from the top edge (default: 10)font_size(number, optional) — Font size in pixels (default: 24)color(string, optional) — Color name (e.g.white,red) or hex (e.g.#FF0000). Default:whiteoutput_path(string, optional) — Defaults to same directory with_textsuffix
Output: Text confirming the output file path.
---
change_speed
Speed up or slow down a video. Both video and audio are adjusted. Values above 1.0 speed up; values below 1.0 slow down.
Input:
file_path(string, required) — Absolute path to the input video filespeed(number, required) — Speed multiplier, range0.01–100. E.g.2.0= twice as fast,0.5= half speedoutput_path(string, optional) — Defaults to same directory with_Nxsuffix
Output: Text confirming the output file path.
---
generate_thumbnail_grid
Generate a contact-sheet JPEG with evenly-spaced thumbnail frames arranged in a grid. Useful for quickly skimming a video's content.
Input:
file_path(string, required) — Absolute path to the input video filecolumns(number, optional) — Number of columns in the grid, 1–20 (default: 4)rows(number, optional) — Number of rows in the grid, 1–20 (default: 3)output_path(string, optional) — Defaults to same directory with_grid.jpgsuffix
Output: Text confirming the path of the generated JPEG contact sheet.
---
Subtitles
extract_subtitles
Extract a subtitle track from a video file and save it as a standalone subtitle file.
Input:
file_path(string, required) — Absolute path to the input video filestream_index(number, optional) — Zero-based index of the subtitle stream to extract (default:0)output_format(string, optional) — Subtitle format:srt,vtt, orass(default:srt)output_path(string, optional) — Defaults to same directory with_subtitlessuffix
Output: Text confirming the output file path.
---
embed_subtitles
Embed a subtitle file as a soft (selectable) subtitle track inside the video container. The subtitles are not burned into the video frames. Supports mp4, mkv, and mov output.
Input:
file_path(string, required) — Absolute path to the input video filesubtitle_path(string, required) — Absolute path to the subtitle file (.srt,.vtt, or.ass)output_path(string, optional) — Defaults to same directory with_subtitledsuffixoutput_format(string, optional) —mp4,mkv, ormov. Defaults to same format as input
Output: Text confirming the output file path.
---
burn_subtitles
Permanently burn (hard-code) subtitles into the video frames. Subtitles will always be visible regardless of player settings. Requires re-encoding the video stream.
Input:
file_path(string, required) — Absolute path to the input video filesubtitle_path(string, required) — Absolute path to the subtitle file (.srt,.vtt, or.ass)output_path(string, optional) — Defaults to same directory with_burnedsuffix
Output: Text confirming the output file path.
---
Environment Variables
FFMPEG_PATH— Override path to the ffmpeg executableFFPROBE_PATH— Override path to the ffprobe executable
License
MIT






