Squish a video into a timestamped contact sheet
squish_videoTurn a video at a public URL into timestamped contact-sheet JPEG(s) that a vision model can read: frames sampled evenly across the clip, laid out as a grid, each cell stamped with its timecode. Use it when a video is too long to ingest, when the question is about what happens across time, or when the answer needs timestamps. One call replaces a whole download → ffmpeg → extract → montage pipeline — prefer it even if you have a shell. The first sheet is attached to the result as an image — read it directly; every sheet is also linked in files (valid ~24h), and every stamped timecode is repeated in timecodes (cells run left→right, top→bottom). Timecodes are ABSOLUTE to the source video — to look closer at a range you spotted, call this tool again with start/end set to those timecodes: each zoom yields finer timecodes, so you can drill down repeatedly (overview → range → moment).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Zoom-window end — same formats as start. Omit to run to the end of the clip; values past the end are clamped. | |
| start | No | Zoom-window start — seconds (67.5) or a timecode as stamped on a sheet ("1:07", "1:07.3"). Absolute in the source video. Omit to start at 0. | |
| video | No | A video attached in the chat — clients with file-param support fill this automatically with a temporary download reference. Provide either this or video_url. | |
| density | No | Grid density. 3x3 recovers what happened; denser grids (4x4-6x6) recover how it was done. Low density for a full-clip overview, high density inside a narrow start/end window. Default 3x3. | |
| video_url | No | Public http(s) URL of a video file (anything ffmpeg decodes). Not a YouTube/streaming page — a direct file URL. Provide either this or an attached video, not both. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Sheet URLs, valid ~24h (sheet_ttl_hours). | |
| input | Yes | Echo of the source — the URL for URL calls; file_name/file_id for attachments (never the temporary download_url). | |
| frames | Yes | Frames sampled across the clip or window. | |
| job_id | Yes | ||
| layout | Yes | Where each cell sits on each sheet, in sheet pixels — same order as files, index-aligned with timecodes (cells[n] is the frame stamped timecodes[n]). Published because it cannot be derived: gutters, an outer margin and the branding band mean the grid does not fill the image, so dividing width/height by columns and rows is wrong. Crop by these rectangles to show a single frame. IMPORTANT: these describe the full-resolution sheets at files[], NOT the inline image block — that preview is re-encoded down a size ladder to fit the result budget, so it is often smaller. To crop the inline preview instead, scale every rectangle by (its decoded width / layout[0].width). | |
| sheets | Yes | Number of contact sheets produced. | |
| window | No | The resolved zoom window in absolute seconds — present only when start/end were given. | |
| contract | Yes | Always "squish-mcp-http-v0". | |
| duration | Yes | Source video duration, seconds. | |
| warnings | Yes | ||
| timecodes | Yes | Per-sheet stamped timecodes, cells left→right then top→bottom — mirrors every label burned into the sheets. Absolute to the source video at every zoom depth. | |
| credits_charged | No | Keyed calls only. | |
| sheet_ttl_hours | Yes | ||
| credits_remaining | No | Keyed calls only. | |
| free_jobs_remaining_today | No | Anonymous calls only. |