watch-video
Let Claude (or any MCP client) watch a video. Give it a local file or a URL (YouTube and 1,500+ other sites via yt-dlp) and it gets a timestamped transcript plus a handful of scene-selected keyframes, then drills into exact frames only when needed. No cloud transcription, no API keys.
> Watch https://www.youtube.com/watch?v=jNQXAC9IVRw and tell me what he says about the elephants.
$ video-cli overview https://www.youtube.com/watch?v=jNQXAC9IVRw --max-frames 8
# Me at the zoo
duration: 00:19
transcript: platform-subs:en, language=en, 6 segments, took 0.4s
keyframes: 3 scene-selected at 00:00, 00:05, 00:11
total time: 6.7s
## Transcript
[00:01] All right, so here we are, in front of the elephants
[00:05] the cool thing about these guys is that they have really... really really long trunks and that's cool
[00:16] and that's pretty much all there is to say
IMAGE: ~/.cache/video_mcp/Youtube_jNQXAC9IVRw/sheets_8/sheet_01.jpg
Claude: He stands in front of the elephants (00:01) and says the cool thing about them is
their really long trunks (00:05). That is the whole video (00:16).
Why this one
| watch-video | Cloud video APIs (e.g. Gemini) | Transcript-only tools | |
|---|---|---|---|
| Sees the screen (code, slides, charts, UI) | Yes: keyframes, hi-res frames, OCR | Yes | No |
| Runs locally, nothing uploaded | Yes | No: the video goes to the provider | Varies |
| API key or account | None | Required, billed per use | Varies |
| Videos without captions | Local Parakeet / Whisper | Yes | Often fails |
| Token cost of the visual pass | ~20 frames per contact sheet (cost of ~1.5 images) | Billed by video length | None (no visuals) |
| Private recordings (meetings, bug repros) | Safe: never leave the machine | Uploaded | Varies |
It ships as two parts:
videoMCP server with seven tools (below).watch-videoskill that teaches Claude the cheap-first workflow: overview, then frames, then ranges.
How it works
| Step | What happens |
|---|---|
| Transcript | Platform subtitles if the video has them (seconds), else Parakeet TDT 0.6B v3 (int8, CPU, 25 European languages), else faster-whisper large-v3-turbo (other languages, GPU or language="auto"). |
| Keyframes | Decodes only keyframes at thumbnail size, drops repeats and static slides, then fills the largest time gaps. The selection adapts to how much the video changes (screencast vs. action). |
| Contact sheets | Labelled frames tiled into grids: about 20 frames for the token cost of 1.5 full frames. Black bars are cropped automatically. |
| Drill-down | get_frames seeks to exact timestamps at 1280 px (readable code and charts). For URLs it seeks into the stream without downloading the whole video. |
Everything is cached under ~/.cache/video_mcp, so repeat calls are instant.
Measured on a mid-range CPU (i5-11400, no GPU): 35.7-minute local video overview in about 2.6 minutes; YouTube video with subtitles in about 7 seconds; a drill-down frame in about 0.5 seconds.
Install
Requirements: Python 3.10+ and ffmpeg (including ffprobe) on your PATH.
Claude Code: one command (plugin)
Installs the MCP server and the skill together. Needs uv for uvx.
/plugin marketplace add marwanm7moud/watch-video
/plugin install watch-video@watch-video
Any agent: package, server, skill
pipx install watch-video-mcp # or: uv tool install watch-video-mcp / pip install watch-video-mcp
# optional extras: Whisper (non-European languages / GPU) and OCR (on-screen text as text)
pipx install "watch-video-mcp[whisper,ocr]"
# latest from GitHub instead of PyPI:
pip install git+https://github.com/marwanm7moud/watch-video
No install needed to try the CLI: uvx --from watch-video-mcp video-cli hw.
Install ffmpeg with winget install Gyan.FFmpeg (Windows), brew install ffmpeg (macOS) or
sudo apt install ffmpeg (Linux). The first transcription downloads the Parakeet model (about 650 MB).
Register the MCP server
Claude Code:
claude mcp add video --scope user -- video-mcp
Claude Desktop (claude_desktop_config.json) or any other MCP client:
{ "mcpServers": { "video": { "command": "video-mcp" } } }
If video-mcp is not on your PATH, use the full path to the executable or python -m video_mcp.server.
Install the skill
The skill works with or without the MCP server: it falls back to video-cli and installs it on first use.
Copy the skill folder so your agent knows when and how to use the tools:
# macOS / Linux
mkdir -p ~/.claude/skills && cp -r skills/watch-video ~/.claude/skills/
# Windows (PowerShell)
Copy-Item -Recurse skills\watch-video $HOME\.claude\skills\
Then ask Claude: "Watch https://youtu.be/... and summarize it", or "At what point do they explain the stop-loss, and what does the chart show then?"
Tools
| Tool | Use |
|---|---|
video_overview(source, max_frames=40, ocr=False) |
Start here: metadata, chapters, full transcript, contact sheets. ocr=True adds on-screen text. |
get_frames(source, timestamps, hi_res=True) |
Exact frames ("12:30", "1:02:05" or seconds), up to 20. |
scan_range(source, start, end, count=12) |
Evenly spaced frames in one sheet, to follow motion or a demo. |
find_cuts(source, start, end, threshold=0.2) |
Hard cuts (shot or screen changes) and cuts per minute, for pacing. |
get_transcript(source, start, end) |
Transcript slice. |
search_transcript(source, query) |
Timestamped hits for any of the words, exact phrase first; plus on-screen text after an ocr=True overview. |
check_hardware() |
Detected tools, GPU and the transcription profile in use. |
Command line
The same operations work without MCP:
video-cli overview video.mp4 --max-frames 16
video-cli overview demo.mp4 --ocr # also read code/slides on screen
video-cli frames https://youtu.be/... 12:30 13:05
video-cli range video.mp4 10:00 10:30 --count 12
video-cli cuts ad.mp4 # hard cuts + cuts per minute
video-cli search video.mp4 "stop loss"
video-cli hw
Configuration
| Variable | Default | Effect |
|---|---|---|
VIDEO_MCP_CACHE |
~/.cache/video_mcp |
Cache directory (delete it to reclaim space). |
VIDEO_MCP_LANG |
en |
Default transcription language; auto detects it with Whisper. |
VIDEO_MCP_THREADS |
4 (CPU) |
Threads for CPU transcription. |
VIDEO_MCP_AVX512 |
unset | Set to 1 to let Whisper use AVX-512 (faster, but a very heavy sustained load). |
On CPU the server runs below normal priority, one heavy job at a time, with Whisper held to AVX2, so a long transcription does not freeze your desktop.
Limitations
- English is assumed unless you pass
language. Parakeet covers 25 European languages on CPU (language="de","fr","es", ...). Other languages (Arabic, Chinese, Japanese, Hindi, ...) need Whisper, which is slow on CPU. - Frames are sampled, not every frame is analysed; the transcript can mishear names and terms. The skill tells Claude to cite timestamps and confirm exact on-screen text with a hi-res frame.
- Use it only on videos you are allowed to access and process; respect each site's terms and copyright.
Development
pip install -e ".[dev]"
ruff check .
pytest
License
MIT. See LICENSE.
Metadata
Release files for watch-video-mcp 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| watch_video_mcp-0.3.0.tar.gz | 28.0 kB | Without provenance | Details for watch_video_mcp-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| watch_video_mcp-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for watch_video_mcp-0.3.0-py3-none-any.whl |
Total release size: 52.9 kB
Release files / watch_video_mcp-0.3.0.tar.gz
| Download URL | watch_video_mcp-0.3.0.tar.gz |
|---|---|
| Size | 28.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b081d62d260fe04650fc5fb5c7e9074010aa0bb9f3f615fb91cf98d647e7506
|
|
BLAKE2b-256 checksum How to use checksums |
1ee66a19d80e51a7aab4074af5b5712eaf871e9ab62986c07465f7223896bbe1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / watch_video_mcp-0.3.0-py3-none-any.whl
| Download URL | watch_video_mcp-0.3.0-py3-none-any.whl |
|---|---|
| Size | 24.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bd97d731dd605f49eb6f528c5c9f7967f67d2b771f14f09a3c4cfa4b66c3e551
|
|
BLAKE2b-256 checksum How to use checksums |
4ec27b981b0e85b70d2057ca25490bfd72febd9ba3c6e3b569fa85f6cedabb61
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Security for watch-video-mcp 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.