Servidor MCP

Squish

io.github.getsquish/squish
Medios y contenido Público y accesible MCP 2025-11-25

Qué hace este MCP

Samples videos into timestamped contact sheets and supports focused visual inspection of time ranges.

squish_video
Squish a video into a timestamped contact sheet
Turn 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).
Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'end': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Zoom-window end — same formats as start. Omit to run to the end of the clip; values past the end are clamped.'}, 'start': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': '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': {'type': 'object', 'required': ['download_url', 'file_id'], 'properties': {'file_id': {'type': 'string'}, 'file_name': {'type': 'string'}, 'mime_type': {'type': 'string'}, 'download_url': {'type': 'string'}}, 'description': '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': {'enum': ['3x3', '4x4', '5x5', '6x6'], 'type': 'string', 'description': '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': {'type': 'string', 'description': '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.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['input', 'duration', 'frames', 'sheets', 'files', 'sheet_ttl_hours', 'warnings', 'timecodes', 'layout', 'job_id', 'contract'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Sheet URLs, valid ~24h (sheet_ttl_hours).'}, 'input': {'type': 'string', 'description': 'Echo of the source — the URL for URL calls; file_name/file_id for attachments (never the temporary download_url).'}, 'frames': {'type': 'number', 'description': 'Frames sampled across the clip or window.'}, 'job_id': {'type': 'string'}, 'layout': {'type': 'array', 'items': {'type': 'object', 'required': ['width', 'height', 'cells'], 'properties': {'cells': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y', 'w', 'h', 'blank'], 'properties': {'h': {'type': 'number'}, 'w': {'type': 'number'}, 'x': {'type': 'number'}, 'y': {'type': 'number'}, 'blank': {'type': 'boolean', 'description': 'True when that frame could not be read and the cell was left black. Present on EVERY cell — a missing field means a server older than this contract, not a healthy sheet. Blankness is NOT detectable from the image: every cell is painted black before drawing, so a night shot or a cut to black is pixel-identical to a failed read.'}}, 'additionalProperties': False}}, 'width': {'type': 'number'}, 'height': {'type': 'number'}}, 'additionalProperties': False}, 'description': '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': {'type': 'number', 'description': 'Number of contact sheets produced.'}, 'window': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'number'}, 'start': {'type': 'number'}}, 'description': 'The resolved zoom window in absolute seconds — present only when start/end were given.', 'additionalProperties': False}, 'contract': {'type': 'string', 'description': 'Always "squish-mcp-http-v0".'}, 'duration': {'type': 'number', 'description': 'Source video duration, seconds.'}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'timecodes': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}, 'description': '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': {'type': 'number', 'description': 'Keyed calls only.'}, 'sheet_ttl_hours': {'type': 'number'}, 'credits_remaining': {'type': 'number', 'description': 'Keyed calls only.'}, 'free_jobs_remaining_today': {'type': 'number', 'description': 'Anonymous calls only.'}}, 'additionalProperties': False}
Añadido
squish_video
17 de September de 2026 a las 12:42