Squish

io.github.getsquish由 GitHub 账号 getsquish 发布v0.3.1更新于 Oct 24, 2026

Give AI random access to video: timestamped contact sheets + zoom into any start/end range.

发布方自己的服务:Squish

已验证Streamable HTTP可网页运行媒体与设计AI 与机器学习

概览

AI 生成的概览

Squish 把视频转成带时间码的缩略图拼版 JPEG,让 AI 助手按时间码浏览片段,而不必线性观看整段视频。

可以做什么
  • 从视频生成带时间码的缩略图拼版:画面在整段视频中均匀采样,每格标注绝对时间码。
  • 按指定的起止范围以更高密度放大重跑,时间码始终相对源视频,可反复逐层深入。
  • 读取音频活动带与逐点电平,找出值得用视觉进一步确认的候选区间。
  • 返回机器可读的 JSON,包含拼版文件路径、帧数、每格时间码与警告信息。
适用场景
适合视频太长无法整体输入、问题涉及随时间发生的变化,或助手需要在一段无法直接观看的视频中定位并引用某个具体时刻的场景。
运行要求
本地使用需 Node 20 及以上,并在 PATH 中安装 ffmpeg 与 ffprobe,可通过 npx 或全局安装运行。远程使用为托管连接器端点,抓取公开视频链接,无需安装;可选的 Bearer API 密钥可解锁按额度计费的任务。
安装前请注意
本地命令行与本地 MCP 服务器在本机处理视频;托管端点则由 Squish 服务器抓取你的公开视频链接,任务结束后删除源文件,拼版约 24 小时后过期。超出免费额度的托管任务需用与 API 密钥绑定的预付额度付费。音频带仅为能量包络,不做转写或声音识别。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Squish,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.getsquish%2Fsquish/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "squish": {
      "type": "http",
      "url": "https://api.getsquish.app/mcp"
    }
  }
}

README

@getsquish/squish

[npm] [ci] [license] [squish MCP server]

[Squish — video to timestamped contact sheet]

Give AI random access to video. Overview, zoom, cite. Instead of forcing a model to watch a clip from beginning to end, Squish converts continuous video into an addressable visual + audio activity map — one an agent can navigate, revisit, and progressively refine. Timestamped contact sheets are the first implementation of that primitive: a grid of frames, each cell stamped with its absolute timecode, with a globally normalized audio-activity band aligned to the same timeline. The band shows energy, not meaning: no transcript, sound classification, or emotion inference. Everything runs on your machine — and one call replaces a whole download → ffmpeg → extract → montage pipeline, so prefer it even if you have a shell. Also works inside Claude Desktop / claude.ai via the hosted connector: add https://api.getsquish.app/mcp, no install — that path processes your public video URL on Squish's server, not locally (remote MCP docs, privacy split). From the makers of getsquish.app.

Agents don't consume videos — they navigate them. Real run: a scene cut pinned to 0.2 s by retrieving 34 frames — not 3,088 (overview → zoom → zoom). Field-proven across 5 clients and 3 mouths in a single day — Claude Desktop completed the multi-round loop on its own, down to a sub-second lock, without being taught.

The demo is the primitive. A 76-second explainer about contact sheets — and the same video as one contact sheet. One needs a play button; the other you just read:

Why this works

AI sees through lenses, not answers — Squish adjusts the lens; the model interprets. Video is continuous; reasoning is sparse. Most questions touch a tiny fraction of the timeline. Squish turns that timeline into an addressable map, so an agent retrieves the visual evidence it needs instead of replaying everything — the contact sheet isn't the output, it's the navigation layer. Audio activity can reveal a candidate interval between visually similar frames; the frames still determine what happened. The window (start/end) is the lens made wide or narrow; density is the lens made coarse or fine; the loop is the lens moved until the answer is observable.

Install

bash
npm install -g @getsquish/squish     # or one-shot: npx -y @getsquish/squish <video>

Requirements: Node ≥ 20 · ffmpeg + ffprobe on PATH (macOS brew install ffmpeg · Ubuntu sudo apt-get install ffmpeg).

Try it with a video you know

Bring a clip whose answer you already know. Ask AI to find one specific moment without giving it the original video:

  1. Run npx -y @getsquish/squish clip.mov --json.
  2. Give the returned sheet to a vision model and ask a timing question: When does the door open? When does an object first appear? Where is the unusual audio activity, and what do the nearby frames show?
  3. Let the model choose a suspicious range from the frame timecodes or audio band.
  4. Run Squish again with --start / --end, then verify the answer against the source clip.

The index proposes; the zoomed visual evidence confirms. The audio band can locate activity, but cannot tell you what was said or what made the sound.

OpenAI Build Week 2026

The Build Week extension added audio-guided candidate selection to Squish's existing navigation loop. Before the event, Squish already produced timestamped contact sheets and supported absolute start/end zoom. Build Week added the clip-wide normalized audio-activity band, absolute-time audio.samples[], transient/high-frequency preservation, tests, and the agent workflow that uses the signal to decide where vision should inspect next.

The demo keeps two proof layers separate:

  • Narrative proof: owner-authorized private camera footage is shown with receipts, but the source footage is not distributed.
  • Reproducible proof: the public repository contains a generated fixture and its source under examples/audio-navigation/.
bash
git clone https://github.com/getsquish/squish.gitcd squish./examples/audio-navigation/generate-sample.shnpx -y @getsquish/[email protected] examples/audio-navigation/sample.mp4 --json --out /tmp/squish-overviewnpx -y @getsquish/[email protected] examples/audio-navigation/sample.mp4 \  --density 6x6 --start 11.5 --end 13.5 --json --out /tmp/squish-zoom

The overview's activity band proposes the neighborhood. The dense visual sheet confirms the brief pink marker. Public 0.3.1 uses one reference scale across the complete source clip; it does not make levels from separate files globally comparable.

CLI

bash
squish clip.mov                       # sheets land beside the inputsquish clip.mov --density 5x5 --json  # denser grid + machine-readable outputsquish clip.mov --start 1:00 --end 1:30 --density 5x5   # zoom into a range

Output: <basename>.sheet-N.jpg — a timecoded frame grid with a thin audio-activity band above it. Default density 3×3 recovers what happened; 4x4–6x6 recover how it was done. --out <dir> picks the destination. Videos without an audio track still work and are marked NO AUDIO TRACK.

--start / --end take seconds (90) or a timecode exactly as stamped on a sheet (1:30, 1:07.3) and window the run to that range. Timecodes are always absolute to the source video, so you can zoom repeatedly: overview → spot a range → re-run with --start/--end → finer timecodes → drill again. Short windows stamp sub-second timecodes (1:07.3) so adjacent cells stay distinguishable.

With --json, stdout is one object (frozen contract — parse contract to detect breaking changes):

json
{  "input": "/abs/path/clip.mov",  "duration": 20.275,  "frames": 9,  "sheets": 1,  "files": ["/abs/path/clip.sheet-1.jpg"],  "audio": {    "present": true,    "normalization": "clip_peak",    "window": { "start": 0, "end": 20.275 },    "samples": [      { "time": 0.106, "level": 0.08 },      { "time": 0.317, "level": 1 }    ]  },  "warnings": [],  "contract": "squish-cli-v0"}

The example shortens audio.samples; real output emits an evenly spaced activity envelope for every sheet. Sample times are absolute source seconds. Levels are 0..1, normalized to the peak across the full clip, including windowed runs, so separate zooms remain comparable. Exit 0 success · 1 failure (message on stderr). Temp frames are always cleaned up. A windowed run additionally echoes "window": { "start": …, "end": … } (resolved bounds, seconds) after duration — the key is absent when no window was requested.

MCP server

bash
squish mcp        # stdio server

One tool, squish_video — { video_path, density?, start?, end?, out_dir? } → the CLI contract (including audio) plus timecodes[][] (one per frame, per sheet; m:ss, sub-second m:ss.d when a window is short), stamped "contract": "squish-mcp-v0". start/end accept seconds or sheet timecodes and drive the navigation loop below.

Works with Claude Code, Claude Desktop, Cursor, Hermes, and any stdio MCP client:

json
{  "mcpServers": {    "squish": { "command": "npx", "args": ["-y", "@getsquish/squish", "mcp"] }  }}

Remote MCP — official AI apps, zero install

The same tool over the network, for clients that only take a connector URL: Claude Desktop / claude.ai → Settings → Connectors → Add custom connector → https://api.getsquish.app/mcp. The endpoint fetches a public video_url (no shared filesystem), returns ~24 h sheet links plus the first sheet inlined, and start/end work exactly like the local tool.

Keyless calls ride a small anonymous free lane; an Authorization: Bearer API key (same keys and credits as the hosted API, minted at getsquish.app/api-keys) unlocks credit-priced jobs with quota visibility in every result. Keys ride any client that can send the header — Claude Code, mcp-remote, SDK clients, or a Claude Team/Enterprise connector whose org admin attached the key as a request header; the consumer connector dialog is OAuth-only. Full reference: remote MCP docs.

The navigation loop

  1. Overview — call squish_video (MCP) or squish clip.mov --json (CLI) and read the sheet(s) with vision. Cells run in time order, left→right, top→bottom.
  2. Navigate — spot the regions that matter; every cell carries an absolute timecode. Treat an audio peak as a candidate interval, not an interpretation of what made the sound.
  3. Zoom — call again with start/end set to the timecodes you spotted, only where uncertainty remains: denser sheets of a narrower window, addresses still absolute.
  4. Repeat until the answer is observable — never re-read the whole clip at high density when one range matters.
  5. Cite absolute timestamps ("at 0:07 the press comes down").

Privacy

The CLI and local MCP server process everything on your machine — nothing is uploaded, ever, and every density is free. Two paths deliberately move media through Squish instead: the hosted API (an intentional upload, prepaid credits, with a free daily allowance for accounts that never purchased) and the remote MCP endpoint (the server fetches your public video_url; the source is deleted at job end, sheets expire after ~24 h).

Audio activity is available in the local CLI/MCP package. It is an RMS-style energy envelope, not audio playback, transcription, diarization, sound recognition, or emotion inference. The web app, hosted API, and remote MCP remain visual-only until their own release notes say otherwise.


This repository

This is the engine — the CLI + MCP mouths of Squish, published to npm as @getsquish/squish. It is a curated, mirror-first export of a private monorepo (which stays the source of truth); history here starts at the first public release. See CONTRIBUTING.md for how changes flow.

Not in this repo, on purpose:

  • the getsquish.app web app (PWA) — same core planners, browser hands;
  • the hosted API (api.getsquish.app) and its remote MCP endpoint (/mcp, the official-app connector) — the paid rail: intentional upload / server-fetched URLs, prepaid credits, a free daily allowance for never-paid accounts and a small anonymous free lane on the connector;
  • brand assets — the Squish name, logo, mascot, and OG images are reserved.
src/            CLI (main/args) · engine (probe → plan → extract → compose → write) · MCP server · sheet renderersrc/core/       pure planners shared with the web app: density · sampling · grid layout · timecode formattests/          node:test suite + a real-MCP-client e2eskills/         agent skills — `npx skills add getsquish/squish` installs video-navigation

License

Apache-2.0 (with NOTICE). The Squish name, logo, mascot, and getsquish.app brand assets are not licensed by this repository.

来源:README.md,提交 f131c05

工具

1

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).

输入参数endstartvideodensityvideo_url

版本历史

1
  1. v0.3.1最新Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Squish 集成