get_frames
Retrieve keyframe images from a screen recording to see what was displayed at a specific moment or across a time range. Filter near-duplicates for a concise visual summary.
Instructions
Fetch stored keyframe images (JPEG, <=1568px wide) as MCP image content: the frames nearest to at_ms, OR unique frames across [start_ms, end_ms] evenly thinned to max_frames. Serves unique frames by default (near-duplicates from static scenes are filtered); hard cap 6 images per call. When NOT to use: exact instants between keyframes or native-resolution detail (use extract_frame), or finding on-screen text (use search — OCR text is indexed). Examples:
get_frames(job_id="...", at_ms=83500) — what was on screen when the remark at 1:23.5 was spoken
get_frames(job_id="...", at_ms=83500, max_frames=2) — tighter context, fewer tokens
get_frames(job_id="...", start_ms=0, end_ms=600000, max_frames=6) — overview strip of the first 10 min
get_frames(job_id="...", start_ms=290000, end_ms=310000, include_duplicates=true) — every capture near 5:00
transcript hit at t_ms=421500 → get_frames(job_id, at_ms=421500) for the visual evidence
walking a demo scene by scene → one ranged call per scene beats one giant range
frame files are named by video-ms (t00083500.jpg ↔ t_ms 83500) — stable refs for findings
keep max_frames at 2-4 unless you are truly comparing scenes; images are token-expensive
audio-only job → this tool errors by design; use get_transcript / get_moment instead
anti-example: need EXACTLY 12:34.500 between two keyframes → extract_frame(job_id, at_ms=754500)
anti-example: "find the screen with the red error banner" → search(job_id, "error") first, then jump
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| at_ms | No | ||
| end_ms | No | ||
| job_id | Yes | ||
| start_ms | No | ||
| max_frames | No | ||
| include_duplicates | No |