Squish
Give AI random access to video: timestamped contact sheets + zoom into any start/end range.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"squish": {
"command": "npx",
"args": [
"@getsquish/squish"
]
}
}
}실행 가능한 패키지
0.3.1stdio원격 엔드포인트
https://api.getsquish.app/mcpstreamable-http할 수 있는 일
도구 목록
도구 (1)
🟡squish_video(video_url, video, density, start, end)
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).
입력 스키마
{
"type": "object",
"properties": {
"video_url": {
"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.",
"type": "string"
},
"video": {
"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.",
"type": "object",
"properties": {
"download_url": {
"type": "string"
},
"file_id": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"file_name": {
"type": "string"
}
},
"required": [
"download_url",
"file_id"
]
},
"density": {
"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.",
"type": "string",
"enum": [
"3x3",
"4x4",
"5x5",
"6x6"
]
},
"start": {
"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.",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
]
},
"end": {
"description": "Zoom-window end — same formats as start. Omit to run to the end of the clip; values past the end are clamped.",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}출력 스키마
{
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "Echo of the source — the URL for URL calls; file_name/file_id for attachments (never the temporary download_url)."
},
"duration": {
"type": "number",
"description": "Source video duration, seconds."
},
"window": {
"description": "The resolved zoom window in absolute seconds — present only when start/end were given.",
"type": "object",
"properties": {
"start": {
"type": "number"
},
"end": {
"type": "number"
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
},
"frames": {
"type": "number",
"description": "Frames sampled across the clip or window."
},
"sheets": {
"type": "number",
"description": "Number of contact sheets produced."
},
"files": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sheet URLs, valid ~24h (sheet_ttl_hours)."
},
"sheet_ttl_hours": {
"type": "number"
},
"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."
},
"layout": {
"type": "array",
"items": {
"type": "object",
"properties": {
"width": {
"type": "number"
},
"height": {
"type": "number"
},
"cells": {
"type": "array",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"w": {
"type": "number"
},
"h": {
"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."
}
},
"required": [
"x",
"y",
"w",
"h",
"blank"
],
"additionalProperties": false
}
}
},
"required": [
"width",
"height",
"cells"
],
"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)."
},
"job_id": {
"type": "string"
},
"credits_charged": {
"description": "Keyed calls only.",
"type": "number"
},
"credits_remaining": {
"description": "Keyed calls only.",
"type": "number"
},
"free_jobs_remaining_today": {
"description": "Anonymous calls only.",
"type": "number"
},
"contract": {
"type": "string",
"description": "Always \"squish-mcp-http-v0\"."
}
},
"required": [
"input",
"duration",
"frames",
"sheets",
"files",
"sheet_ttl_hours",
"warnings",
"timecodes",
"layout",
"job_id",
"contract"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}커뮤니티
증거