mcpField
V
vision-squeezer

vision-squeezer

ローカル
github.com/eralpozcanAI・エージェント26 日前に更新

vision-squeezer について

VisionSqueezerは、画像を縮小してビジョンモデルのトークン予算に合わせるライブラリ、CLI、MCPサーバーです。コード、ファイル、ツール経由の画像を扱う開発者やエージェント向けで、チャットに直接添付した画像は処理しません。

主な機能

  1. 01トークン予算に合わせた画像縮小
  2. 02モデル別のトークン見積もり
  3. 03画像のクロップとサイズ変更
  4. 04画像ディレクトリの一括処理
  5. 05HTTP画像最適化エンドポイント
  6. 06対応クライアントの設定を行うインストーラー

活用シーン

  1. 01エージェント分析前のスクリーンショット最適化
  2. 02ビジョンモデルAPIに送る画像の準備
  3. 03画像フォルダーの一括処理
  4. 04HTTPワークフローへの画像最適化の追加

MCP 対応

MCPサーバーは、ファイルやツール出力など、エージェントから渡された画像を対応クライアントで最適化します。チャット画面に直接添付された画像は処理しません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"eralpozcan-vision-squeezer": {
"command": "npx",
"args": [
"-y",
"vision-squeezer"
]
}
}
}
起動コマンドnpx -y vision-squeezer

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmvision-squeezer0.9.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

VisionSqueezer Logo

VisionSqueezer

Build crates.io npm License

画像がモデルに届く前に、ビジョン LLM のトークン予算に収まるようにします。コード、エージェント、パイプライン向けのライブラリ、CLI、MCP サーバーです。

できないこと。 VisionSqueezer は、チャットウィンドウ(Claude Code、Cursor、ChatGPT など)に貼り付けたり、ドラッグしたり、@ で添付したりした画像を縮小できません。クライアントはツールやフックが実行される前に画像を添付するため、全サイズ分の料金が発生します。

トークンを節約できる場合:

  • コードからモデル API に送信する画像:Rust クレート、Python バインディング、CLI。
  • エージェントがファイルから読み込む画像や、ツール経由で取得する画像(スクリーンショット、クローラー、ブラウザー自動化):MCP サーバー、またはプロジェクト内のファイル向け Claude Code の画像読み取りフック。

対象となる具体的なケースについては、トークンを節約できる場合をご覧ください。

MCP サーバーは任意の MCP クライアント(Claude Code、Cursor、Codex、Gemini CLI など)で動作しますが、エージェントが渡した画像だけを認識します。

Vision Squeezer MCP server


インストール

クライアントごとに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 Codevision-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 Codecode --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 の本文として送信します。オプションはクエリ文字列に指定します:

パラメーターデフォルト
modelclaude適合性の判定と推定に使用するモデルの別名(gpt6、gemini、...)
max_tokens1600トークンの上限。0 にすると無効になります
formatjpegjpeg、webp または avif
quality751~100
modeautoauto、ocr または standard
croptruefalse にすると余白を残します
responseimagejson にすると、レポートと 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,9423,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 10001064×728−79%4,674 → 988(−79%)2,903 → 939(−68%)3,096 → 516(−83%)
--max-tokens 1600 --model gpt61408×960−65%4,674 → 1,785(−62%)2,903 → 1,584(−45%)3,096 → 1,032(−67%)
--max-tokens 1600 --model gemini2304×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,6982,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 10001036×756−92%4,661 → 999(−79%)2,942 → 951(−68%)6,192 → 516(−92%)
--max-tokens 1600 --model gpt61344×992−87%4,661 → 1,728(−63%)2,942 → 1,563(−47%)6,192 → 1,032(−83%)
--max-tokens 1600 --model gemini2304×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.61024×10241,229
GPT-6 / GPT-5.62048×20482,500 パッチ上限適用後に 3,000
Claude 4.7+1000×10001,296
レガシー GPT-5 / 5.11024×1024630

MCP ツール:optimize_image

引数型必須デフォルト
image_pathstring2つのうちいずれか—(推奨:ローカルで読み込み、最適化したコピーも一時ファイルに書き込みます)
image_base64string2つのうちいずれか—
mode"auto" | "standard" | "ocr"—"auto"
output_format"jpeg" | "webp"—"jpeg"
qualityinteger 1–100—75
tile_sizeinteger—512
cropboolean—true
bg_toleranceinteger 0–255—15
max_tokensinteger—1600(0 を指定すると上限が無効になります)
max_tilesinteger——
target_modelstring 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×16704,6744,759
Claude Code が縮小したコピー1999×13913,6003,603
--max-tokens 16001344×9241,5841,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 なら確認を求められるファイルを開いてはいけません。

設定リファレンス

パラメーター型デフォルト説明
qualityu8 1–10075JPEG/WebP の出力品質
tile_sizeu32512カスタムグリッドサイズ。target_model が設定されている場合は無視されます
cropbooltrue単色の余白を削除します
bg_toleranceu8 0–25515背景検出で許容する最大チャンネル差
output_formatjpeg/webpjpeg出力エンコード形式。WebP は約 30~50% 小さくなります
max_tilesu32—タイル数の上限(段階的に縮小)
max_tokensu32—target_model で推定するトークン予算(未設定時は Claude)。収まるまで縮小します。0 にすると無効になります
target_modelstring—モデルに応じたプロファイル。現在の 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.632×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×5122048px に収めた後、短辺を 768px にスケーリング85 + タイル数 × 170
GPT-5 / GPT-5.1(レガシー)512×5122048px に収めた後、短辺を 768px にスケーリング70 + タイル数 × 140
Gemini 3768×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_base64string入力画像
operationsarray適用する操作の順序付きリスト

対応する操作: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 を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。