Video Reader
FreeNot checkedProvides video manipulation via ffmpeg (frame extraction, format conversion, trimming, audio adjustments, filters, and subtitle handling) without requiring an e
About
Provides video manipulation via ffmpeg (frame extraction, format conversion, trimming, audio adjustments, filters, and subtitle handling) without requiring an external API key.
README
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
Installing Video Reader
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/lawriec/mcp-video-readerFAQ
Is Video Reader MCP free?
Yes, Video Reader MCP is free — one-click install via Unyly at no cost.
Does Video Reader need an API key?
No, Video Reader runs without API keys or environment variables.
Is Video Reader hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Video Reader in Claude Desktop, Claude Code or Cursor?
Open Video Reader on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Omni Video
An MCP server that transforms LLM-enabled IDEs into professional video editors by pre-processing footage into text proxies, generating motion graphics via HTML/
by buildwithtazaARA
Generate images, video and audio from any AI agent — one connector.
by ARAYouTube
Transcripts, channel stats, search
by YouTubeEverArt
AI image generation using various models.
by modelcontextprotocolCompare Video Reader with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All media MCPs
