vision-squeezer について
VisionSqueezerは、画像を縮小してビジョンモデルのトークン予算に合わせるライブラリ、CLI、MCPサーバーです。コード、ファイル、ツール経由の画像を扱う開発者やエージェント向けで、チャットに直接添付した画像は処理しません。
主な機能
- 01トークン予算に合わせた画像縮小
- 02モデル別のトークン見積もり
- 03画像のクロップとサイズ変更
- 04画像ディレクトリの一括処理
- 05HTTP画像最適化エンドポイント
- 06対応クライアントの設定を行うインストーラー
活用シーン
- 01エージェント分析前のスクリーンショット最適化
- 02ビジョンモデルAPIに送る画像の準備
- 03画像フォルダーの一括処理
- 04HTTPワークフローへの画像最適化の追加
MCP 対応
MCPサーバーは、ファイルやツール出力など、エージェントから渡された画像を対応クライアントで最適化します。チャット画面に直接添付された画像は処理しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
VisionSqueezer
画像がモデルに届く前に、ビジョン LLM のトークン予算に収まるようにします。コード、エージェント、パイプライン向けのライブラリ、CLI、MCP サーバーです。
できないこと。 VisionSqueezer は、チャットウィンドウ(Claude Code、Cursor、ChatGPT など)に貼り付けたり、ドラッグしたり、
@で添付したりした画像を縮小できません。クライアントはツールやフックが実行される前に画像を添付するため、全サイズ分の料金が発生します。トークンを節約できる場合:
- コードからモデル API に送信する画像:Rust クレート、Python バインディング、CLI。
- エージェントがファイルから読み込む画像や、ツール経由で取得する画像(スクリーンショット、クローラー、ブラウザー自動化):MCP サーバー、またはプロジェクト内のファイル向け Claude Code の画像読み取りフック。
対象となる具体的なケースについては、トークンを節約できる場合をご覧ください。
MCP サーバーは任意の MCP クライアント(Claude Code、Cursor、Codex、Gemini CLI など)で動作しますが、エージェントが渡した画像だけを認識します。
インストール
クライアントごとに1つのコマンド(推奨)
npx vision-squeezer install # asks for the client and scope
npx vision-squeezer install --client claude --scope user --yes
npx vision-squeezer install --client cursor --yes
各クライアントにはインストール方法が1つだけあり、インストーラーが選択します。
| クライアント | install の動作 |
|---|---|
| Claude Code | vision-squeezer-mcp プラグイン(MCP サーバー、/vision-stats /vision-doctor /vision-upgrade スキル、画像読み取りフック)をインストールします |
| Codex CLI、Qwen Code、Kimi CLI | <cli> mcp add vision-squeezer -- npx -y vision-squeezer@<version> を実行します |
| Gemini CLI | 同じ mcp add に加えて、settings.json に画像読み取りフックを追加します |
| VS Code | code --add-mcp を実行します |
| Cursor | 固定バージョンのエントリを1つ mcp.json にマージし、hooks.json に画像読み取りフックを追加します |
| OpenCode | 固定バージョンのエントリを1つ opencode.json にマージし、画像読み取りプラグインを追加します |
| Windsurf、Claude Desktop | 固定バージョンのエントリを1つ、クライアントの JSON 設定にマージします |
JSON ファイルは置き換えずにマージします。他のサーバーやフックは保持され、解析できないファイルには手を加えず、再実行時には独自のエントリを置き換えるため、重複して追加されることはありません。
スコープ(user、local、project)は、クライアントが複数のスコープに対応している場合にのみ尋ねられます。旧バージョンの --method は受け付けますが、無視されます。
以下の手動コマンドでは、簡潔にするため npx -y vision-squeezer を使用しています。vision-squeezer@<version> のようにバージョンを固定してください(インストーラーでは固定されます)。バージョンを指定しない npx は、新しいリリースが出た後も最初にキャッシュしたバージョンを使い続けます。
Claude Code
npx vision-squeezer install --client claude --scope user --yes
これは以下の2つのコマンドを実行します(最初に、以前の claude mcp add 登録と settings.json のフックを削除します)。手動で行う場合:
claude plugin marketplace add eralpozcan/vision-squeezer
claude plugin install vision-squeezer-mcp@vision-squeezer --scope user
MCP サーバー、スキル、フックを読み込むには、Claude Code を再起動するか、/reload-plugins を実行してください。スキルとフックなしで MCP サーバーだけを使いたい場合は、claude mcp add --scope user vision-squeezer -- npx -y vision-squeezer を実行してください。
Claude Desktop
npx vision-squeezer install --client claude-desktop --yes
または、claude_desktop_config.json に追加してください(macOS:~/Library/Application Support/Claude/、Windows:%APPDATA%\\Claude\\):
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Cursor
npx vision-squeezer install --client cursor --yes
または、~/.cursor/mcp.json(グローバル)または .cursor/mcp.json(プロジェクト)に追加します:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
こちらをクリックして、その他10種類以上のIDEとエージェント(VS Code、JetBrains、Windsurf、Zedなど)のインストール手順を表示します
VS Code Copilot
code --add-mcp '{"name":"vision-squeezer","command":"npx","args":["-y","vision-squeezer"]}'
または、.vscode/mcp.json に追加します:
{
"servers": {
"vision-squeezer": {
"type": "stdio",
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
JetBrains(IntelliJ、WebStorm、PyCharm)
Tools → GitHub Copilot → Model Context Protocol (MCP) → Configure を開き、次を追加します:
{
"servers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Windsurf
npx vision-squeezer install --client windsurf --yes
または、~/.codeium/windsurf/mcp_config.json に追加します:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Gemini CLI
Google は、無料ユーザーおよび Google One ユーザー向けに、2026-06-18 に Gemini CLI を Antigravity CLI に置き換えました。Antigravity については、Antigravity を参照してください。
gemini mcp add --scope user vision-squeezer -- npx -y vision-squeezer
または、~/.gemini/settings.json(ユーザー)/.gemini/settings.json(プロジェクト)に追加します:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Codex CLI
codex mcp add vision-squeezer -- npx -y vision-squeezer
または、~/.codex/config.toml に追加します:
[mcp_servers.vision-squeezer]
command = "npx"
args = ["-y", "vision-squeezer"]
Qwen Code
qwen mcp add vision-squeezer -- npx -y vision-squeezer
OpenCode
opencode mcp add は対話形式でのみ実行できるため、~/.config/opencode/opencode.json(グローバル)またはリポジトリのルートにある opencode.json(プロジェクト)に直接追加します:
{
"mcp": {
"vision-squeezer": {
"type": "local",
"command": ["npx", "-y", "vision-squeezer"],
"enabled": true
}
}
}
Kimi CLI
kimi mcp add vision-squeezer -- npx -y vision-squeezer
Zed
~/.config/zed/settings.json に追加します:
{
"context_servers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Kiro
.kiro/settings/mcp.json(ワークスペース)または ~/.kiro/settings/mcp.json(グローバル)に追加します:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Antigravity
MCP のみで、フックは不要です。Antigravity の MCP 設定から構成します:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
手動インストール(Rust バイナリ)
# From crates.io
cargo install vision-squeezer
# Or from source
git clone https://github.com/eralpozcan/vision-squeezer && cd vision-squeezer
make install # builds → ~/.local/bin/
その後、上記の設定で npx の代わりにバイナリのパスを直接使用します:
{ "command": "vision-squeezer-mcp" }
ヒント:
npx -y vision-squeezer --setupを実行すると、自動検出されたパスを含む設定例が表示されます。
CLI の使用方法
vision-squeezer path/to/image.jpg \
--mode auto|ocr|standard \ # default: auto (= standard, keeps colour; ocr is opt-in)
--format jpeg|webp|avif \ # default: jpeg
--quality 85 \ # output quality 1-100 (default: 75)
--tile-size 256 \ # patch size in px (default: 512)
--no-crop \ # disable padding removal
--smart-crop \ # edge-energy crop (vs corner-tolerance)
--auto-quality 0.95 \ # binary-search quality to hit SSIM target
--bg-tolerance 25 \ # background detection 0-255 (default: 15)
--model <provider-alias> \ # model-aware resizing; see the model catalog
--max-tokens 1600 \ # token budget: downscale until the output fits (0 = off; MCP default 1600)
--max-tiles 20 \ # hard cap on tile count (model-specific unit)
--json \ # machine-readable JSON output
--dry-run # run pipeline, skip disk write
バッチモード
ファイルの代わりにディレクトリを渡します:
vision-squeezer ./screenshots --recursive --output-dir ./optimized
vision-squeezer ./screenshots --recursive --json > report.json
HTTP API(n8n、Make、Zapier)
vision-squeezer serve は小規模な HTTP サーバーを起動するため、任意のワークフローツールから、通常の HTTP リクエストで2つのステップの間に画像を圧縮できます。カスタムノードは不要です。
vision-squeezer serve # 127.0.0.1:8080
docker build -t vision-squeezer . # or run it in a container
docker run -p 8080:8080 vision-squeezer
画像のバイトデータを POST /optimize の本文として送信します。オプションはクエリ文字列に指定します:
| パラメーター | デフォルト | |
|---|---|---|
model | claude | 適合性の判定と推定に使用するモデルの別名(gpt6、gemini、...) |
max_tokens | 1600 | トークンの上限。0 にすると無効になります |
format | jpeg | jpeg、webp または avif |
quality | 75 | 1~100 |
mode | auto | auto、ocr または standard |
crop | true | false にすると余白を残します |
response | image | json にすると、レポートと base64 形式の画像を返します |
curl --data-binary @screenshot.png "http://localhost:8080/optimize?max_tokens=1600" -o out.jpg -D -
# X-Tokens-Before: 4674
# X-Tokens-After: 1584
# X-Input-Size: 2400x1670
# X-Output-Size: 1344x924
GET /health は ok を返します。本文が 25 MB を超えると 413 を返し、入力が不正な場合は理由を1行で示して 400 を返します。認証機能はありません。サーバーはデフォルトで 127.0.0.1 をリッスンし、Docker イメージはコンテナー内のすべてのインターフェースをリッスンするため、信頼できるネットワーク上でのみポートを公開してください。
n8n。 画像を取得するステップとビジョンモデルの間に HTTP Request ノードを配置します:
- Method を
POST、URL をhttp://vision-squeezer:8080/optimize?max_tokens=1600に設定します(同じ Docker ネットワーク上で両方を実行する場合はコンテナー名、それ以外の場合はlocalhostを使用します)。 - Send Body をオンにし、Body Content Type を n8n Binary File、Input Data Field Name を
dataに設定します。 - Options → Response → Response Format を File に設定すると、次のノードに最適化された画像がバイナリとして渡されます。Include Response Headers and Status をオンにすると、
X-Tokens-*の値を読み取れます。
これらの設定は n8n のドキュメントに準拠していますが、n8n 自体ではまだテストされていません。
計算の仕組み:2026年のビジョンモデルの課金方法
画像をそのまま LLM に送ると、トークンを無駄にしています。最新のビジョンモデルはファイルサイズ(MB/KB)ではなく、ピクセル寸法のみを考慮しますが、プロバイダーごとにコストの計算方法はまったく異なります。vision-squeezer はこれらのアルゴリズムをシミュレーションし、視覚的な文脈を損なうことなくトークン使用量を減らせる、数学的に最小のサイズを見つけます。
1. OpenAI GPT-6 / GPT-5.6(32pxパッチ)
現在のOpenAIのビジョンモデルは32×32パッチを数え、高詳細画像を2048pxの辺と2500パッチの上限内に収めたうえで、1.2倍の係数を適用します。
- 解決策:
--model gpt6を指定すると、パディングを除去してパッチの上限内に収め、端のパッチが部分的にしか使われない状況を回避します。1024×1024の入力は1024パッチ/1229トークンです。
2. Claude 4.7+(28pxパッチ)
Claudeは、ceil(Width/28) × ceil(Height/28) のビジュアルトークンを数えます。Claude 4.7+の高解像度ビジョンでは、辺の上限が2576px、トークンの上限が4784です。claude-standard は、それ以前の1568px/1568トークンの階層に対応します。
- 解決策: パディングを除去し、選択した階層の上限内に収め、寸法を28pxのグリッドに合わせます。
3. Gemini 3(大きなタイル)
Geminiは、大規模な768×768タイル方式を使用します(画像が384pxを超える場合)。各タイルは一律258トークンです。
- 解決策: 800×600の画像は2×1のタイルグリッドになり、516トークンを使用します。
vision-squeezerでサイズを少し調整し、768×768の枠内にぴったり収めると、コストは258トークンに下がります(50%削減)。
4. Llama 3.2 / 3.3 Vision(560pxタイル)
MetaのMllamaは、560×560のグリッドで画像をタイルに分割し、最大4タイル(各約1601トークン)に制限します。
- 解決策: 2400×1670のスクリーンショットを2400×1200にトリミングすると、2×2から2×1のキャンバスになり、**6,404 → 3,202トークン(−50%)**となります。(Llama 4は異なるビジョンエンコーダーを使用するため、モデル化していません。)
5. Qwen2-VL / 2.5-VL / 3-VL(28pxパッチグリッド)
AlibabaのQwen-VLは、28pxの実効グリッド(14pxパッチ × 2×2マージ)を使用します。tokens = (W/28)·(H/28) で、上限と下限は [4, 16384] です。
- 解決策: パッチが小さいため、調整の鍵は面積です。1024×1024の画像から枠線を除去して896×896にすると、**1,369 → 1,024トークン(−25%)**となります。
6. DeepSeek Flash / DeepSeek-VL2
DeepSeek FlashはOpenAI互換API経由での画像入力に対応し、画像1枚あたり384画像トークンという上限を公開しています。APIプロファイルには --model deepseek を、DeepSeek-VL2のオープンウェイトのタイル計算を正確に行うには --model deepseek-local を使用してください。
7. Kimi K2.5 / K2.6 / K3
Kimiは、MoonshotのOpenAI互換API経由でネイティブな画像・動画入力に対応しています。Moonshotは安定した画像課金グリッドを公開していないため、--model kimi は参考用のネイティブ解像度の推定値を提示しつつ、クロップとファイルサイズの最適化は正確に適用します。
8. DeepSeek-VL2(384px Anyresタイル)
SigLIP-384 + 2×ピクセルシャッフルでは、(m·384, n·384) のキャンバス上で1タイルあたり196トークンとなります(m·n ≤ 9)。
- 解決策: 800×768の画像を768×768に調整すると、3×2から2×2のタイルになり、**1,415 → 1,023トークン(−28%)**となります。(オープンウェイトのため、利点はAPI課金ではなくローカル推論時のコンテキストにあります。)
従来の gpt4o と gpt5 のプロファイルも、512pxの高詳細タイルを引き続き使用するエンドポイント向けに利用できます。
プロバイダーの計算方法と出典の詳細:visionsqueezer.com/providers
パイプライン
Input image
→ crop_padding remove solid-color borders
→ calculate_optimal_dims snap to tile boundary (always down)
→ [enforce_max_tokens] token budget (MCP default 1600) / optional tile cap
→ resize_exact Lanczos3
→ [binarize] OCR mode only: Otsu threshold
→ JPEG/WebP encode configurable quality & format
🦀 Rustを選んだ理由
VisionSqueezerは、パフォーマンスが重要なミドルウェアです。妥協できない次の3つの理由から、Rustを選びました。
- 遅延を感じさせない: 画像処理がボトルネックになってはなりません。Rustなら、サイズ調整、クロップ、エンコードを数ミリ秒で実行でき、最適化レイヤーを開発者のワークフローから完全に見えないものにできます。
- 最小限のフットプリント: IDEのバックグラウンドで動作するMCP サーバーとして、VisionSqueezerは極めて軽量に設計されており、アイドル時のCPUとRAMの使用量はほぼゼロです。
- Wasm対応: RustはWebAssemblyを第一級でサポートしているため、同じ高性能な最適化をブラウザーやエッジ(Cloudflare Workers)にも適用できます。これにより、画像がネットワークに送信される前にクライアント側で圧縮できます。
ベンチマークのスナップショット
vision-squeezer <image> [flags] --dry-run --json を使い、data/ 内のサンプル画像で取得しました。目標はメガバイト数ではなく、トークン数を減らすことです。プロバイダーの課金はピクセル寸法に基づくため、ファイルサイズが影響するのはアップロードとレイテンシーだけです。予算を指定しない場合、パイプラインはグリッドに合わせてパディングを切り抜きますが、プロバイダーが大きすぎる画像をすでに自動縮小するため、大きな写真ではほとんど節約になりません。トークン予算(--max-tokens、MCP サーバーでのデフォルトは 1600)を指定することで、実際に節約できます。
ケーススタディ 1:標準画像(istanbul.jpg)
2400×1670、0.5 MB。
| 実行 | 出力 | ファイルサイズ | Claude 4.7+ のトークン数 | GPT-6 のトークン数 | Gemini のトークン数 |
|---|---|---|---|---|---|
| 予算なし(0.7 より前のデフォルト) | 2048×1536 | −29% | 4,674 → 4,070(−13%) | 2,903 → 2,942 | 3,096 → 1,548(−50%) |
--max-tokens 1600(MCP のデフォルト) | 1344×924 | −67% | 4,674 → 1,584(−66%) | 2,903 → 1,462(−50%) | 3,096 → 1,032(−67%) |
--max-tokens 1000 | 1064×728 | −79% | 4,674 → 988(−79%) | 2,903 → 939(−68%) | 3,096 → 516(−83%) |
--max-tokens 1600 --model gpt6 | 1408×960 | −65% | 4,674 → 1,785(−62%) | 2,903 → 1,584(−45%) | 3,096 → 1,032(−67%) |
--max-tokens 1600 --model gemini | 2304×1536 | −22% | 4,674 → 4,565(−2%) | 2,903 → 2,880(−1%) | 3,096 → 1,548(−50%) |
vision-squeezer data/istanbul.jpg --max-tokens 1600
Input: 2400×1670 (0.5 MB)
Output: 1344×924 (0.2 MB, JPG q75)
File: 67.5% smaller
── Token Estimates ─────────────────────────────────────────
Model Before After Saved
------------------------------------------
Claude 4.7+ 4674 1584 3090 (66.1%)
GPT-6 2903 1462 1441 (49.6%)
GPT-4o 1105 1105 0 (0.0%)
GPT-5 910 910 0 (0.0%)
Gemini 3096 1032 2064 (66.7%)
────────────────────────────────────────────────────────────
ケーススタディ 2:1200 万画素の画像(istanbul2.jpg)
4096×3072、2.2 MB。
| 実行 | 出力 | ファイルサイズ | Claude 4.7+ のトークン数 | GPT-6 のトークン数 | Gemini のトークン数 |
|---|---|---|---|---|---|
| 予算なし(0.7 より前のデフォルト) | 3584×2560 | −40% | 4,661 → 4,698 | 2,942 → 2,924(−1%) | 6,192 → 5,160(−17%) |
--max-tokens 1600(MCP のデフォルト) | 1288×952 | −88% | 4,661 → 1,564(−66%) | 2,942 → 1,476(−50%) | 6,192 → 1,032(−83%) |
--max-tokens 1000 | 1036×756 | −92% | 4,661 → 999(−79%) | 2,942 → 951(−68%) | 6,192 → 516(−92%) |
--max-tokens 1600 --model gpt6 | 1344×992 | −87% | 4,661 → 1,728(−63%) | 2,942 → 1,563(−47%) | 6,192 → 1,032(−83%) |
--max-tokens 1600 --model gemini | 2304×1536 | −71% | 4,661 → 4,565(−2%) | 2,942 → 2,880(−2%) | 6,192 → 1,548(−75%) |
vision-squeezer data/istanbul2.jpg --max-tokens 1600
Input: 4096×3072 (2.2 MB)
Output: 1288×952 (0.3 MB, JPG q75)
File: 87.9% smaller
── Token Estimates ─────────────────────────────────────────
Model Before After Saved
------------------------------------------
Claude 4.7+ 4661 1564 3097 (66.4%)
GPT-6 2942 1476 1466 (49.8%)
GPT-4o 765 1105 0 (0.0%)
GPT-5 630 910 0 (0.0%)
Gemini 6192 1032 5160 (83.3%)
────────────────────────────────────────────────────────────
数値の見方
- 予算が無効だと、トークン数はほとんど変わりません。 Claude 4.7+ は画像をすでに 4,784 トークンに制限しているため、元画像が 4,661 トークンでも、処理後に 4,698 トークンになることがあります。圧縮後のファイルは小さくなりますが、請求額は変わりません。
--max-tokens 1600は、構図、色、大きな文字を保ちながら、両方の写真で Claude のトークン数を約 66%、GPT-6 のトークン数を約 50%削減します。 最初に失われるのは細部(遠くの窓や小さな看板)です。- 予算は対象モデルに基づいて計算されます。 モデルを指定しない場合は Claude が対象です。同じ 1600 を指定しても、
--model geminiでは Gemini の 768px タイルグリッドに合わせて処理され(1,032 トークン)、ファイルサイズの列もその結果に従います。 - コンテンツに応じて予算を選んでください。 1600 と 1000 では、Retina 解像度のコードのスクリーンショットに含まれる本文を読み取れる状態で保てましたが、600 では保てませんでした。上限を無効にするには、
--max-tokens 0を渡すか、CLI で省略してください。 - 色が失われることはありません。
autoモードはstandardと同様に動作します。白黒出力になるのは、--mode ocrを明示的に指定した場合だけです。
現行モデルの妥当性チェック
| プロファイル | 入力 | 推定トークン数 |
|---|---|---|
| GPT-6 / GPT-5.6 | 1024×1024 | 1,229 |
| GPT-6 / GPT-5.6 | 2048×2048 | 2,500 パッチ上限適用後に 3,000 |
| Claude 4.7+ | 1000×1000 | 1,296 |
| レガシー GPT-5 / 5.1 | 1024×1024 | 630 |
MCP ツール:optimize_image
| 引数 | 型 | 必須 | デフォルト |
|---|---|---|---|
image_path | string | 2つのうちいずれか | —(推奨:ローカルで読み込み、最適化したコピーも一時ファイルに書き込みます) |
image_base64 | string | 2つのうちいずれか | — |
mode | "auto" | "standard" | "ocr" | — | "auto" |
output_format | "jpeg" | "webp" | — | "jpeg" |
quality | integer 1–100 | — | 75 |
tile_size | integer | — | 512 |
crop | boolean | — | true |
bg_tolerance | integer 0–255 | — | 15 |
max_tokens | integer | — | 1600(0 を指定すると上限が無効になります) |
max_tiles | integer | — | — |
target_model | string enum | — | コアモデルに加え、glm、pixtral、gemma、internvl、minicpm、molmo、aya、phi4、granite、llava、falcon、minimax、step、ling、voyage |
応答: 最適化された画像を含むMCPのimageブロックと、それに続く簡単なレポートのテキストブロックです。テキスト内で画像がbase64になることはありません。モデルはこれをテキストトークンとして読み取るため、置き換え対象の画像よりもコストが高くなります。
{
"width": 1344,
"height": 924,
"output_path": "/tmp/vision-squeezer/shot-1a2b3c4d.jpg",
"tokens_before": 4674,
"tokens_after": 1584,
"savings_report": {
"tiles_before": 4674,
"tiles_after": 1584,
"tiles_saved": 3090,
"token_reduction_pct": "66.1",
"size_reduction_pct": "67.5"
}
}
入力がimage_pathの場合、output_pathが設定されます。
トークンを節約できる場面
最適化の効果があるのは、小さくなった画像がモデルに届く場合だけです。実際には、次のようになります。
| 画像がモデルに届く方法 | 最適化されるか |
|---|---|
Claude Code がプロジェクト内の画像ファイルを読み込む(Read) | はい。プラグインに同梱されている画像読み込みフックによって最適化されます(install --client claude) |
エージェントが image_path を指定して optimize_image を呼び出す | はい。どのフォルダーからでも利用できます。エージェントに CLAUDE.md / AGENTS.md でこれを行うよう伝えてください |
| 画像をチャットに貼り付ける、またはドラッグする | いいえ。ツールやフックが実行される前に、クライアントが画像を添付します |
@path を使ってファイルを添付する | いいえ。ツール呼び出しが発生しないため、フックも実行されません |
基準値が重要です。 Claude Code は送信前に大きな画像をすでに縮小します。今回のテストでは、2400×1670 のファイルは 1999×1392 としてモデルに届きました。このため、istanbul.jpg では、元のファイルと比較して測定した 66% ではなく、1600 トークンの予算によって約 56% 節約できます。
この README のトークン数は、各プロバイダーが公開しているルールに基づく推定値です。Claude については、Anthropic の count_tokens エンドポイント(claude-sonnet-5-5、画像トークンのみ)で確認しました。
送信される istanbul.jpg | サイズ | 推定値 | 実測値 |
|---|---|---|---|
| 元画像 | 2400×1670 | 4,674 | 4,759 |
| Claude Code が縮小したコピー | 1999×1391 | 3,600 | 3,603 |
--max-tokens 1600 | 1344×924 | 1,584 | 1,587 |
実際の節約量は、Claude Code が送信する画像を基準にすると 3,603 → 1,587(−56%)、元画像を基準にすると 4,759 → 1,587(−67%)です。GPT と Gemini の推定値は、それぞれの API で確認していません。
| クライアント | 画像読み込みフック | 状況 |
|---|---|---|
| Claude Code | はい。Read に対する PreToolUse(プラグイン) | 実際のセッションでテスト済み |
| Cursor | はい。Read に対する preToolUse + updated_input(hooks.json) | Cursor のドキュメントに準拠。アプリ内では未テスト |
| Gemini CLI | はい。read_file に対する BeforeTool(settings.json) | Gemini のドキュメントに準拠。アプリ内では未テスト。Google は 2026-06-18 に、無料ユーザーと Google One ユーザー向けの Gemini CLI を Antigravity CLI に置き換えました |
| OpenCode | はい。read に対する tool.execute.before のプラグイン | OpenCode のドキュメントに準拠。アプリ内では未テスト |
| Codex CLI | いいえ。フックで呼び出しを書き換えることはできますが、Codex のドキュメントには画像読み込みのツールパスが記載されていません | MCP ツールのみ |
| Windsurf | いいえ。pre_read_code でできるのはブロックのみです | MCP ツールのみ |
| VS Code Copilot | いいえ。ドキュメントにはツール入力を書き換える方法が記載されていません | MCP ツールのみ |
| Kimi CLI | いいえ。PreToolUse で入力を確認できますが、ドキュメントには書き換え方法が記載されていません | MCP ツールのみ |
| Qwen Code、Claude Desktop | 未確認/フックシステムなし | MCP ツールのみ |
「MCP ツールのみ」とは、エージェントが image_path を指定して optimize_image を呼び出す必要があるという意味です。AGENTS.md でエージェントにそうするよう伝えてください。Cursor、Gemini CLI、OpenCode 用のフックは、これらのクライアントが読み込みをワークスペース内に制限しているため、プロジェクト内の自己無視設定された .vision-squeezer/ フォルダーにコピーを保持します。
節約効果を得るには、スクリーンショットをプロジェクト内(たとえば screenshots/)に保存し、パスで参照してください。フックが書き換えるのはプロジェクト内のファイルだけです。フックは許可する判定を返すため、通常の Read なら確認を求められるファイルを開いてはいけません。
設定リファレンス
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
quality | u8 1–100 | 75 | JPEG/WebP の出力品質 |
tile_size | u32 | 512 | カスタムグリッドサイズ。target_model が設定されている場合は無視されます |
crop | bool | true | 単色の余白を削除します |
bg_tolerance | u8 0–255 | 15 | 背景検出で許容する最大チャンネル差 |
output_format | jpeg/webp | jpeg | 出力エンコード形式。WebP は約 30~50% 小さくなります |
max_tiles | u32 | — | タイル数の上限(段階的に縮小) |
max_tokens | u32 | — | target_model で推定するトークン予算(未設定時は Claude)。収まるまで縮小します。0 にすると無効になります |
target_model | string | — | モデルに応じたプロファイル。現在の OpenAI モデルには gpt6 を指定してください |
対応モデル
プラットフォームのサポート
ビルド済みの MCP バイナリは、Linux x86_64/ARM64、macOS Apple Silicon/Intel、Windows x86_64/ARM64 に対応しています。Python ホイールは、Linux x86_64/ARM64、macOS Apple Silicon/Intel、Windows x86_64 に対応しています。サポート対象外の Python アーキテクチャでは、pip install --no-binary vision-squeezer vision-squeezer を実行してソースからインストールできます。
| モデル | タイルサイズ | 事前スケーリング | トークンの計算式 |
|---|---|---|---|
| GPT-6 / GPT-5.6 | 32×32 パッチ | 辺 2048px / 2500 パッチ | ceil(patches × 1.2) |
| Claude 4.7+ 高解像度 | 28×28 パッチ | 辺 2576px / 4784 パッチ | 1 パッチあたり 1 トークン |
| Claude 標準 | 28×28 パッチ | 辺 1568px / 1568 パッチ | 1 パッチあたり 1 トークン |
| GPT-4o / GPT-4.5(レガシー) | 512×512 | 2048px に収めた後、短辺を 768px にスケーリング | 85 + タイル数 × 170 |
| GPT-5 / GPT-5.1(レガシー) | 512×512 | 2048px に収めた後、短辺を 768px にスケーリング | 70 + タイル数 × 140 |
| Gemini 3 | 768×768 | ≤384×384 ではフラットなティア | タイルあたり 258 |
| DeepSeek Flash | プロバイダー管理 | 最大 384 画像トークン | 保守的な 384 トークン上限 |
| Kimi K2.5/K2.6/K3 | ネイティブ解像度 | プロバイダー固有 | 28px を基準とした参考値 |
| GLM、Pixtral/Mistral、Gemma、InternVL | プロバイダー固有 | プロバイダー固有 | 汎用プロファイルによる参考値 |
| MiniCPM、Molmo、Aya、Phi-4、Granite | プロバイダー固有 | プロバイダー固有 | 汎用プロファイルによる参考値 |
| LLaVA、Falcon、MiniMax、Step、Ling、Voyage | プロバイダー固有 | プロバイダー固有 | 汎用プロファイルによる参考値 |
高度な機能
永続化と分析
VisionSqueezer は、すべての最適化をローカルの ~/.vision-squeezer/stats.db に記録します。
vision-squeezer stats
── VisionSqueezer Analytics ────────────────────────────────
Total Optimizations: 42
Total Tokens Saved: 842,500
Total Bytes Saved: 156.40 MB
Estimated USD Saved: $2.11
────────────────────────────────────────────────────────────
シェルフックと Claude Code スキル
.zshrc / .bashrc に追加します。
eval "$(vision-squeezer setup-hook)"
これにより、次の 2 つが同時にインストールされます。
squeezeエイリアス — 最適化と出力パスの取得を 1 ステップで実行します。img_path=$(squeeze data/logo.png --model gemini)- Claude Code スキル — 初回実行時に
~/.claude/skills/に自動で書き込まれます
利用可能なスキル
| スキル | 起動方法 | 機能 |
|---|---|---|
vision-stats | /vision-stats | 累積トークン数とバイト数の削減量を表示します。ローカルの stats.db を読み込み、MCP のオーバーヘッドはありません |
vision-doctor | /vision-doctor | インストール済みのバージョンと最新の npm リリースを比較し、古い場合は更新コマンドを表示します |
vision-upgrade | /vision-upgrade | インストール方法(cargo/npm/npx)を検出して、適切な更新コマンドを実行します |
出力例:
/vision-stats
── VisionSqueezer Analytics ────────────────────────────────
Total Optimizations: 42
Total Tokens Saved: 842,500
Total Bytes Saved: 156.40 MB
Estimated USD Saved: $2.11
────────────────────────────────────────────────────────────
/vision-doctor
## VisionSqueezer Doctor
- [x] Binary found: /usr/local/bin/vision-squeezer
- [x] Installed version: 0.1.8
- [x] Latest version (npm): 0.1.8
- [x] Status: Up to date
マーケットプレイスからのインストール(setup-hook の代替):
~/.claude/settings.json に追加します。
{
"extraKnownMarketplaces": {
"vision-squeezer": {
"source": { "source": "github", "repo": "eralpozcan/vision-squeezer" }
}
}
}
次に、Claude Code で /plugins add vision-stats@vision-squeezer、/plugins add vision-doctor@vision-squeezer、または /plugins add vision-upgrade@vision-squeezer を実行します。
サンドボックスモード:「コードで考える」
画像が LLM に届く前に、アトミックな操作をローカルで実行します。画像の処理方法はエージェントが判断し、中間ステップでトークンを消費することはありません。
CLI:
vision-squeezer screenshot.png --ops '[{"op":"crop","x":10,"y":20,"width":500,"height":500},{"op":"binarize"}]'
MCP ツール — sandbox_execute:
| 引数 | 型 | 説明 |
|---|---|---|
image_base64 | string | 入力画像 |
operations | array | 適用する操作の順序付きリスト |
対応する操作:crop、grayscale、binarize、resize、contrast、brightness。
クローラーとの統合
Playwright/Puppeteer を使ったスクレイピングパイプラインで、画像をその場で最適化できます。生のスクリーンショットによる API トークンの無駄はありません。
await page.route('**/*.{png,jpg}', async (route) => {
const response = await route.fetch();
const body = await response.body();
const optimized = await squeeze(body); // pipe through vision-squeezer
route.fulfill({ body: optimized });
});
コントリビューション
PR を歓迎します。セットアップとガイドラインについては、CONTRIBUTING.md を参照してください。 行動規範 に従ってください。
ライセンス
Elastic License 2.0 (ELv2) — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。