mcp-video-reader
Provides tools to manipulate video and audio files using ffmpeg, including frame extraction, conversion, trimming, concatenation, audio manipulation, filters, and subtitles.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-video-reader extract 10 frames from /home/user/video.mp4"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 ffmpegmacOS:
brew install ffmpegUbuntu/Debian:
sudo apt install ffmpeg
Related MCP server: FFmpeg MCP
Installation
npx (no install)
npx mcp-video-readernpm global
npm install -g mcp-video-readerFrom GitHub directly
npx github:lawriec/mcp-video-readerLocal dev
git clone https://github.com/lawriec/mcp-video-reader.git
cd mcp-video-reader
npm install
npm run buildConfiguration
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-readerTools
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
Available Tools
20 toolsadd_text_overlayA
Burn a text string onto every frame of a video using the ffmpeg drawtext filter.
Inputs: text (required), file_path (required), x, y, +3 more.
adjust_videoB
Adjust brightness, contrast, and/or saturation of a video using the ffmpeg eq filter.
Inputs: file_path (required), contrast, brightness, saturation, +1 more.
adjust_volumeA
Change the audio volume of a video. The video stream is copied without re-encoding.
Inputs: volume (required), file_path (required), output_path.
burn_subtitlesA
Permanently burn (hard-code) subtitles into the video frames. The resulting video always shows the subtitles regardless of player settings. Requires re-encoding.
Inputs: file_path (required), subtitle_path (required), output_path.
change_speedA
Speed up or slow down a video. Both video and audio are adjusted to match. Values > 1 speed up; values < 1 slow down.
Inputs: speed (required), file_path (required), output_path.
concat_videosA
Join multiple video files into a single file in the order provided. Files are concatenated without re-encoding (lossless, very fast). All input files must have the same codec and resolution.
Inputs: file_paths (required), output_path, output_format.
convert_videoA
Convert a video to a different container format and/or codec. Supports format changes (mp4, mkv, webm, avi, mov) and codec changes (h264, h265, vp9, av1). Quality can be controlled via CRF or target bitrate.
Inputs: file_path (required), output_format (required), crf, codec, +2 more.
crop_videoA
Crop a video to a rectangular region defined by width, height, and top-left corner (x, y).
Inputs: width (required), height (required), file_path (required), x, +2 more.
embed_subtitlesA
Embed a subtitle file as a soft subtitle track inside a video container (the subtitles are selectable but not burned into the video frames). Supports mp4, mkv, and mov output.
Inputs: file_path (required), subtitle_path (required), output_path, output_format.
extract_audioA
Extract the audio track from a video file and save it as a standalone audio file.
Inputs: file_path (required), output_path, output_format.
extract_frame_at_timestampA
Extract a single frame at a specific timestamp from a video file. Returns the frame as a base64 JPEG image.
Inputs: file_path (required), timestamp (required).
extract_framesA
Extract evenly-spaced frames from a video file as JPEG images. Returns the frames as base64 images that can be viewed directly. Useful for understanding what happens in a video over time.
Inputs: file_path (required), end_time, num_frames, output_dir, +1 more.
extract_subtitlesA
Extract a subtitle track from a video file and save it as a standalone subtitle file.
Inputs: file_path (required), output_path, stream_index, output_format.
generate_thumbnail_gridA
Generate a contact-sheet image (JPEG) with evenly-spaced thumbnail frames arranged in a grid. Useful for getting a quick visual overview of a video.
Inputs: file_path (required), rows, columns, output_path.
get_video_infoA
Get metadata about a video file: duration, resolution, fps, codecs, bitrate, file size.
Inputs: file_path (required).
resize_videoA
Resize a video to new dimensions. Provide width, height, or both. Omitted dimension is computed automatically to preserve aspect ratio.
Inputs: file_path (required), width, height, output_path.
rotate_videoB
Rotate a video 90, 180, or 270 degrees clockwise.
Inputs: rotation (required), file_path (required), output_path.
split_videoA
Split a video into equal-duration segments. Segments are created without re-encoding (lossless). Output files are named with a _part_NNN suffix.
Inputs: file_path (required), segment_duration (required), output_dir, output_format.
strip_audioA
Remove the audio track from a video file, producing a silent video. The video stream is copied without re-encoding.
Inputs: file_path (required), output_path.
trim_videoA
Cut a clip from a video by specifying start and end times. The output is re-muxed (not re-encoded) so it is fast and lossless.
Inputs: end_time (required), file_path (required), start_time (required), output_path.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
Each tool has a clearly distinct purpose: extraction, conversion, editing, filtering, and subtitles are all separated. Even similar-sounding tools like extract_audio and strip_audio are unambiguous due to their specific descriptions.
All tools follow a consistent verb_noun pattern in snake_case, e.g., extract_audio, trim_video, adjust_volume. Compound names like generate_thumbnail_grid and extract_frame_at_timestamp maintain the pattern without deviation.
20 tools is on the higher end but appropriate for a comprehensive video processing server. Each tool adds distinct value, though the server name suggests a reader scope, making the editing tools slightly broad.
The tool set covers core video operations: metadata, frame/audio/subtitle extraction, conversion, trimming, splitting, concatenation, and various filters. Missing advanced capabilities like audio replacement or stabilization, but no critical dead ends for common workflows.
Maintenance
Related MCP Connectors
Transform video, audio and images, and generate media from prompts. FFmpeg, captions, models.
Hosted MCP tools for FFmpeg-style video and audio processing through FFMPEG API.
Run FFmpeg and FFprobe in the cloud: convert, compress, trim and analyze video and audio.
FFmpeg processing for video, audio and images via MCP with OAuth and shared account allowance.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables image and video processing through FFmpeg, including compression, format conversion, resizing, and batch processing operations for common media formats.-
- AlicenseAqualityDmaintenanceEnables video and audio processing through FFmpeg, supporting format conversion, compression, trimming, audio extraction, frame extraction, video merging, and subtitle burning through natural language commands.8170 PyPI28MIT
- AlicenseBqualityBmaintenanceProvides video and audio manipulation tools powered by FFmpeg, enabling AI assistants to perform media operations such as cutting, converting, and removing silence.6192 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables video processing tasks such as resizing, audio extraction, and metadata inspection using FFmpeg, with base64 input/output for stateless and portable operation.1MIT