mcp-video-reader
Provides video manipulation via ffmpeg (frame extraction, format conversion, trimming, audio adjustments, filters, and subtitle handling) without requiring an external API key.
README
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
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.