caught-in-4k
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., "@caught-in-4kwatch bug.mov and flag any flicker or layout jumps"
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.
caught-in-4k
Your agent said "done ✅". It never watched it run.
Agents write UI they've never seen move. They can't watch video, so flicker, frozen animations and layout jumps ship with a confident "looks good!". caught-in-4k turns a recording into something an agent can see, so it catches its own UI bugs before you do.

21 seconds of a bug repro, as one image. Red boxes mark what changed. At #7 the user deletes "Buy milk", but "Call mom" disappears instead.
True story
An agent built a looping bonsai animation and called it done. It wasn't watching:
$ npx caught-in-4k bonsai2.mp4
1 keyframes, 1 sheet(s) ← the whole 4.8s loop never changedThe "animation" was a still image (0.5% of pixels moving). The agent rebuilt it, ran caught-in-4k again, and got 3 keyframes with 15% motion in the tree. That's the loop: record → get caught → fix → get a clean run.
Related MCP server: markupR MCP Server
What it does
Picks the frames that matter. One frame per action, once the screen settles: the result of a click, not every letter typed on the way. Blank fade-ins are skipped, and long recordings stay evenly covered.
Catches flicker. A 60 fps pass finds flashes that last one frame and snap back, and marks them
FLICKER. A model sampling video at 1 fps misses them.Boxes what changed since the previous frame, so the agent knows where to look. Mouse jitter and full-screen cuts are left unboxed.
Sharp crops on big screens. On a Retina recording, the changed areas are cut from the full-resolution frame, so small UI text stays readable.
Lines up speech with the frames, using whisper.cpp word timing.
Zoom. Dense frames across any time range, or one full-resolution frame.
Cheap. A 21-second repro fits in one image, about 2k tokens.
Everything runs locally. Nothing is uploaded.
Give it to your agent
MCP (tools watch_video and zoom_video, images come back inline):
claude mcp add caught-in-4k -- npx -y caught-in-4k mcpCodex (~/.codex/config.toml):
[mcp_servers.caught-in-4k]
command = "npx"
args = ["-y", "caught-in-4k", "mcp"]Cursor and others (mcp.json):
{ "mcpServers": { "caught-in-4k": { "command": "npx", "args": ["-y", "caught-in-4k", "mcp"] } } }Skill: copy SKILL.md to ~/.claude/skills/caught-in-4k/SKILL.md
(or your agent's skills folder). The agent then runs it whenever there's a video.
By hand:
npx caught-in-4k bug.mov # .caught-in-4k/bug/index.md + sheets
npx caught-in-4k zoom bug.mov --from 0:13.8 --to 0:15
npx caught-in-4k zoom bug.mov --from 14.8 --count 1Does it work?
We ran a blind test on 6 public bug-report recordings from Excalidraw, Zed and VS Code against mcp-video-analyzer. Separate judge agents saw only one tool's output, with no tool names and no issue text.
caught | partial | tokens (6 videos) | |
caught-in-4k | 2 | 2 | 33k |
mcp-video-analyzer | 0 | 2 | 54k |
To be honest about it:
In round 1, before our fixes, mcp-video-analyzer caught 1 and we caught 0.
The fixes (flicker pass, sharp crops) were tuned on these same videos, so round 2 flatters us.
Both tools are weak on a first pass without the user's description.
The table above is round 2. Full method, both rounds and caveats are in bench/.
Roadmap
Not built yet:
record <url> --do "click Add, type milk": the agent records its own app with Playwright.check: pass/fail with an exit code (flicker, frozen animation, layout jump, blank screen), so agents and hooks can loop until clean.Motion summary for continuous animations: how much moves, where, how smoothly.
A Claude Code hook that won't let the agent stop until the check passes.
A GitHub bot that records PR preview builds and comments what it caught.
Requirements
Node 20+ and ffmpeg (
brew install ffmpeg)Speech (optional): whisper.cpp (
brew install whisper-cpp) and a ggml model in~/.cache/caught-in-4k/, or setCAUGHT_WHISPER_MODEL=/path/to/ggml-small.en.binURLs (optional):
yt-dlp
Develop
npm install
npm test # renders a narrated bug-repro video, then drives the MCP server over stdioMIT licensed.
This server cannot be deployed
Maintenance
Related MCP Connectors
Give AI random access to video: timestamped contact sheets + zoom into any start/end range.
Give agents eyes on any web page: structured context, and changes explained in plain language.
Video, audio, and image processing for AI agents: convert, transcribe, upscale - 150+ operations.
Loom for agents: AI agents record narrated product demos, plus transcripts, summaries, and search.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to watch YouTube videos by extracting frames at scene changes and visual references, pairing each frame with the exact words spoken at that timestamp. Provides dense frame-transcript interleaving for any model.17 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to capture screen and voice recordings, extract timestamped frames, and receive structured Markdown reports with context for bug fixing and UI feedback.9 npm18MIT
- AlicenseNot gradedqualityCmaintenanceEnables agents to analyze long videos by downloading them, extracting transcripts and storyboards, and zooming into specific moments with high-resolution frames and OCR.MIT
- AlicenseNot gradedqualityAmaintenanceLets any LLM agent actually watch videos: a watch_video tool takes a URL or local file and returns scene-aware keyframes fused with a timestamped transcript, processed 100% locally with per-source caching.891 PyPI2,234MIT