mcp-compressor

mcp-compressor

A proxy that intercepts MCP responses to reduce token consumption by compressing them via a pipeline and exposing only two meta-tools to the LLM.

Category
访问服务器

README

mcp-compressor

GitHub Copilot の MCP レスポンスをインターセプトし、トークン消費を削減するプロキシ。

解決する問題

問題 対策
MCP のレスポンスが大きくてトークンを食う 圧縮パイプラインで削減
ツール定義が多くて毎ターン固定コストがかかる メタツール方式で常に2ツールだけ公開
内部・外部 MCP が混在していてインターセプトが難しい wrap モードで一箇所に集約

仕組み

圧縮パイプライン

MCP のレスポンスを以下の順で処理する。

MCP レスポンス
  ↓ TOON 変換        JSON を 36〜64% 削減(LLM 可読のまま)
  ↓ ログ重複除去      繰り返しパターンを集約、最大 98% 削減
  ↓ ログ圧縮         大量ログを先頭 / エラー / 末尾に絞る
  ↓ LLM 要約        閾値超えのみ Ollama で要約(元データ保存)
  ↓
Copilot へ返却

プロキシモード

stdio モード(デフォルト)

MCP サーバーを1つずつラップする。既存の設定に1行追加するだけ。

Copilot → mcp-compressor → 実際の MCP サーバー(子プロセス)

wrap モード

mcp.servers.json に書いた全サーバーに接続し、Copilot には1つのサーバーとして見せる。 内部(stdio)・外部(SSE/HTTP)問わず一箇所でインターセプトできる。

Copilot → mcp-compressor ┬→ filesystem サーバー(stdio)
                          ├→ atlassian サーバー(SSE)
                          └→ github サーバー(SSE)

メタツール方式(デフォルト)

Copilot に公開するのは常に2ツールだけ。

mcp__list_tools(query?)              ← ツール一覧を返す(TOON 圧縮対象)
mcp__invoke_tool(server, tool, args) ← ツールを実行する

ツール定義は LLM に毎ターン送られる。ツールが多いほど固定コストが増えるため、 常に2つに絞ることで削減する。

通常方式: ツール定義 × 30個 × 会話10ターン = 300回分の定義コスト
メタツール: ツール定義 × 2個 × 会話10ターン = 20回分
           + list_tools の結果(TOON 圧縮済み)が履歴に1回

セットアップ

前提条件

  • Windows 11
  • Rancher Desktop(Docker 利用のため)
  • Python 3.11 以上(インストール済みであれば pyenv 不要)

1. リポジトリをクローン(PowerShell)

cd C:\Users\ユーザー名\projects   # 任意のディレクトリ
git clone https://github.com/zakkii-k/mcp-compressor.git
cd mcp-compressor

以降のパス例は C:\Users\ユーザー名\projects\mcp-compressor として記載する。実際のパスに読み替えること。

2. Ollama を起動

WSL・PowerShell どちらでも同じ(Rancher Desktop が起動していれば docker が使える)。 docker compose up はリポジトリ内で実行すること。

# リポジトリ内で実行
docker compose up -d

# または docker run で起動(ディレクトリを問わない)
docker run -d `
  --name ollama `
  -p 11434:11434 `
  -v ollama_data:/root/.ollama `
  --restart unless-stopped `
  ollama/ollama:latest

モデルをダウンロード:

docker exec ollama ollama pull qwen2.5:3b

3. mcp-compressor のインストール

2通りある。Docker が一番シンプル。


A. Docker(推奨・Python 環境不要)

cd C:\Users\ユーザー名\projects\mcp-compressor
docker build -t mcp-compressor .

MCP 設定で docker run を指定するだけで動く。


B. Windows ネイティブ Python

Python が入っていれば pip だけでOK(pyenv 不要)。

cd C:\Users\ユーザー名\projects\mcp-compressor
pip install httpx pyyaml python-toon

4. mcp.json を編集

VS Code のグローバル MCP 設定は以下にある:

C:\Users\ユーザー名\AppData\Roaming\Code\User\mcp.json

グローバル設定なのでパスは絶対パスで書くこと。 ワークスペースごとに設定する場合は .vscode/mcp.json を使う(相対パス可)。

stdio モード(サーバーを1つずつラップする場合)

変更前:

{
  "servers": {
    "filesystem": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:\\path\\to\\dir"]
    }
  }
}

変更後(Python):

{
  "servers": {
    "filesystem": {
      "type": "stdio",
      "command": "python",
      "args": [
        "-m", "mcp_compressor",
        "--config", "C:\\Users\\ユーザー名\\projects\\mcp-compressor\\config.yaml",
        "--",
        "npx", "-y", "@modelcontextprotocol/server-filesystem", "C:\\path\\to\\dir"
      ]
    }
  }
}

変更後(Docker):

{
  "servers": {
    "filesystem": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "mcp-compressor",
        "--",
        "npx", "-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"
      ]
    }
  }
}

wrap モード(全サーバーを1エントリに集約する場合)

Step 1: 既存の mcp.json の servers 部分を mcp.servers.json としてリポジトリ内に保存。

C:\Users\ユーザー名\projects\mcp-compressor\mcp.servers.json
{
  "servers": {
    "filesystem": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:\\path\\to\\dir"]
    },
    "atlassian": {
      "type": "sse",
      "url": "https://mcp.atlassian.com/v1/sse"
    }
  }
}

mcp.servers.example.json をコピーして編集してください。

Step 2: mcp.json を書き換え(Python):

{
  "servers": {
    "mcp-compressor": {
      "type": "stdio",
      "command": "python",
      "args": [
        "-m", "mcp_compressor",
        "--mode", "wrap",
        "--config", "C:\\Users\\ユーザー名\\projects\\mcp-compressor\\config.yaml",
        "--mcp-config", "C:\\Users\\ユーザー名\\projects\\mcp-compressor\\mcp.servers.json"
      ]
    }
  }
}

Step 2: mcp.json を書き換え(Docker):

{
  "servers": {
    "mcp-compressor": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "C:\\Users\\ユーザー名\\projects\\mcp-compressor\\mcp.servers.json:/app/mcp.servers.json",
        "-v", "C:\\Users\\ユーザー名\\projects\\mcp-compressor\\config.yaml:/app/config.yaml",
        "-v", "C:\\Users\\ユーザー名\\projects\\mcp-compressor\\originals:/app/originals",
        "mcp-compressor",
        "--mode", "wrap"
      ]
    }
  }
}

Copilot から見えるツール:

mcp__list_tools   → query="atlassian" で Jira 関連ツールを検索できる
mcp__invoke_tool  → server="atlassian", tool="create_issue" で実行

プレフィックス方式に戻す場合は --no-meta-tools を追加。


設定

config.yaml:

# 要約閾値(パイプライン処理後にこの文字数を超えたら LLM 要約)
threshold_chars: 5000

# 使用モデル(1行変更で切り替え)
model: "qwen2.5:3b"

# パイプラインステージ(実行順)
pipeline:
  - toon_converter      # JSON → TOON 形式(36〜64% 削減)
  - log_deduplicator    # 繰り返しパターンのログを集約
  - log_compressor      # ログの先頭/エラー/末尾を抽出
  - llm_summarizer      # LLM で要約(Ollama 必要)

推奨モデル(16GB RAM)

品質順 モデル RAM 備考
1 qwen2.5:7b ~4.5GB 要約タスク最高品質
2 qwen3:4b ~3GB thinking mode を自動無効化して使用
2 gemma4:e4b ~3GB Google 製、バランス良好
4 qwen2.5:3b ~2GB デフォルト。安定・高速

環境変数

変数 内容 デフォルト
OLLAMA_URL Ollama の URL(Docker 内は自動設定済み) http://localhost:11434
MCP_MODEL 使用モデル qwen2.5:3b
MCP_THRESHOLD 要約閾値(文字数) 5000

圧縮手法の詳細

docs/compression-techniques.md を参照。

手法 削減率 LLM 不要 対象
TOON 変換 36〜64% ✅ JSON 全般
ログ重複除去 80〜98% ✅ 繰り返しパターンのログ
ログ先頭/エラー/末尾 60〜80% ✅ 大量ログ
LLM 要約 70〜90% ❌ 汎用テキスト

テスト

Ollama なしでパイプラインと wrap モードのテストが実行できる。

pip install pytest
pytest tests/ -v

Ollama 起動後は LLM 要約テストも自動で有効になる。


プロジェクト構成

mcp-compressor/
├── mcp_compressor/
│   ├── main.py              # エントリーポイント(--mode stdio/wrap/http)
│   ├── config.py            # 設定読み込み(環境変数対応)
│   ├── pipeline/            # 圧縮パイプライン
│   │   ├── toon_converter.py
│   │   ├── log_deduplicator.py
│   │   ├── log_compressor.py
│   │   ├── json_compressor.py
│   │   ├── json_table_converter.py
│   │   └── llm_summarizer.py
│   └── proxy/
│       ├── stdio_proxy.py        # stdio モード(ローカル MCP)
│       ├── wrap_proxy.py         # wrap モード(全 MCP を集約)
│       ├── server_connection.py  # stdio/SSE サーバー接続管理
│       └── http_proxy.py         # HTTP モード(未実装・スタブ)
├── tests/
├── docs/
│   ├── setup.md
│   └── compression-techniques.md
├── config.yaml
├── mcp.servers.example.json
├── Dockerfile
└── docker-compose.yml

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选