mcpField
D
distil

distil

ローカル
github.com/munhqAI・エージェント13 週間前に更新

distil について

distilは、LLMエージェントのコンテキストを測定・管理するRustライブラリとツール群です。会話記録のトークンコストを分析し、キャッシュ調整、予算設定、圧縮などのレイヤーを備えています。

主な機能

  1. 01会話記録のトークン使用量を分析
  2. 02各コンテキストレイヤーの効果を個別測定
  3. 03キャッシュ可能なプレフィックスを保つ順序調整
  4. 04コンテキスト予算設定と圧縮レイヤー
  5. 05オプションのMCPサーバーを導入

活用シーン

  1. 01エージェントセッションのトークン分布分析
  2. 02ローカル会話記録でのコンテキスト戦略比較
  3. 03予算設定前のコンテキストコスト確認

MCP 対応

オプションの`mcp`機能で`distil-mcp` MCPサーバーを利用できます。READMEにはClaude Codeへのサーバー登録方法も記載されています。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"munhq-distil": {
"command": "npx",
"args": [
"-y",
"@munhq/distil"
]
}
}
}
起動コマンドnpx -y @munhq/distil

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

パッケージ
npm@munhq/distil0.3.4

ツール

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

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

詳細

distil

npm MCP Registry Smithery license

Install in Cursor Install in VS Code

claude mcp add distil -- npx -y @munhq/distil

アカウントも API キーも設定も不要です。このパッケージは、プラットフォームに対応したバイナリを取得し、公開済みのチェックサムと照合する小さなラッパーです。Node を使わない場合に備えて、install.sh とビルド済みバイナリも用意しています。


キャッシュ書き込みはトークンの2%、請求額の28%です

これは主張ではなく、実測値です。実際のエージェントセッション13,814件、アシスタントのターン410,742件を、2026-08-29に再実行しました。リクエストのたびに履歴全体が再送されるため、そこに含まれる一意なトークンはそれぞれ550回課金されていました。

つまり、明白に思える対策である「履歴の圧縮」は、たいてい間違いです。履歴を編集すると、編集箇所以降のキャッシュ済みプレフィックスが無効になり、0.1倍の読み取りが1.25倍または2.0倍の書き込みに変わります。コンテキストのコストは、圧縮しても解消できません。トークンを取り込まないようにするしかありません。

エージェントセッションのトークンの内訳:ツールの結果59.9%、ツール呼び出し17.9%、ユーザーテキスト14.0%、アシスタントのテキスト7.2%、思考1.0% 損益分岐点に達するために書き換えで削除すべき量:残り1ターンなら8%、10ターンなら46%、100ターンなら90%

この分野のツールはどれも、独自のテスト用データで測定した削減率を公表しています。しかし、実際のセッションのうちどれだけに手を加えられるのか、また、プロンプトキャッシュの料金を適用したときにその割合がどれだけのコストになるのかという分母は、どのツールも公表していません。distil は、エージェントが実際に作成したトランスクリプトを使って、その両方を測定します。

既存の成果と、そうでないもの。 以下のキャッシュ計算は新たな発見ではありません。Anthropic のコンテキスト編集のドキュメントには、ツールの結果を消去するとキャッシュ済みプレフィックスが無効になると記載されており、消去による効果がコストに見合うだけの大きさである場合にのみ実行するための clear_at_least も用意されています。損益分岐点のルールも公開されています。5分間のキャッシュでは、消去したトークン数に次の消去までのリクエスト数を掛けた値が、保持するトークン数の11.5倍を超える必要があります。この README の表は、このルールをそのまま再現しています。独立して導出しましたが、これは計算の検証であり、新たな貢献ではありません。

不足しているのは実測データです。どの情報源も、自分のワークロードで調整するよう勧めていますが、そのための手段を提供しているものも、実際の測定値を公表しているものもありません。このクレートは、そのギャップを埋めるためのものです。clear_at_least の値を選ぶため、あるいは一切消去しないと決めるために必要な数値を測定します。

測定結果の全容

2026-08-29 に、ローカルの Claude Code トランスクリプト 13,814 件を対象に測定しました — アシスタントのターン数は 410,742 回、重複を除いたテキストは 212.7M トークンです。distil-bench ~/.claude/projects を使えば、ご自身のコーパスでも再現できます。コーパスは増えていくため、小数点以下の数値より測定日が重要です。

トークン数割合
ツールの結果127,371,43059.9%
ツール呼び出し38,065,12117.9%
ユーザーテキスト29,818,53614.0%
アシスタントのテキスト15,402,0777.2%
思考2,076,7161.0%

この重複を除いた 212.7M トークンに対し、請求対象となった入力トークンは 116.9 billion でした — リクエストのたびに履歴全体を再送するため、各トークンは 550 回分の料金が発生しました。

実際のキャッシュ倍率(読み取りは 0.1x、5 分の TTL の書き込みは 1.25x、1 時間の TTL の書き込みは 2.0x)を適用すると、次のようになります。

トークンの割合コストの割合
キャッシュ読み取り97.9%71.8%
キャッシュ書き込み2.0%27.6%

キャッシュ書き込みはトークンの 2% を占める一方、請求額の 28% を占めます。 履歴を編集すると、編集箇所以降のキャッシュされたプレフィックスが無効になり、0.1x の読み取りが 1.25x または 2.0x の書き込みに変わります。そのため、書き換えによって無効化される範囲を次の値より小さくする必要があります。

残りのターン数5m TTL1h TTL
18.0%5.0%
1046.5%34.5%
2063.5%51.3%
10089.7%84.0%

この表は、別の形で示した公開済みの損益分岐ルールです。どの行でも、5 分のティアでは cleared x turns / kept が 11.5 になります。この値を使って clear_at_least を選び、distil-bench を使って設定すべきターン数と末尾のサイズを見つけてください。これらはワークロードの特性であり、公開されている情報がほとんどない部分です。

履歴の単位ごとに見ると、残り 10 ターンの場合、そのまま保持するコストは 1.00、圧縮するコストは 2.15、最初から取り込まないコストは 0 です。コンテキストのコストから逃れるために圧縮することはできません。トークンを取り込まない選択だけが可能です。

このクレートを使う際の意味

履歴に触れないレイヤーは、この計算上有利です。CacheAlignLayer(安定したプレフィックスがキャッシュ可能な状態に保たれるよう、コンテンツを並べ替えます)と ScratchpadLayer(作業状態をウィンドウの外部に保持します)が該当します。

履歴を書き換えるレイヤー — MaskingLayer、SummarizationLayer、CompactionLayer — は、一般的なケースでは節約できる額よりもコストがかかります。これらを使うのは、コンテキストのオーバーフローという、ほかの選択肢ではリクエストが失敗し、キャッシュ料金との比較が意味をなさなくなる場面に限ってください。BudgetLayer は、まさにその場面のためにあります。

RegistryLayer と CodeModeLayer は、同じ機能を標準でより優れた形で実現する Anthropic の Tool Search Tool および Programmatic Tool Calling よりも前に作られたものです。標準機能を優先してください。

古いツールの結果をクリアする場合は、MaskingLayer よりもプロバイダーの clear_tool_uses コンテキスト編集を優先してください。これはサーバー側で実行され、clear_at_least を受け取り、依存関係を追加せずに API パラメーター 1 つで実現できます。API で提供されない動作が必要な場合に限り、ここでレイヤーを使ってください。

測定

cargo build --features bench --release

# Where tokens are, what they cost, and the break-even table
./target/release/distil-bench ~/.claude/projects --json baseline.json

# Sessions that called a given tool, against those that did not
./target/release/distil-bench ~/.claude/projects --split-by-tool mcp__codeindex__

# Export real traffic so other compressors run on the same input
./target/release/distil-bench ~/.claude/projects --export-sessions ./sessions --min-turns 40

外部ツールとの比較、公平性のルール、最初に誤った数値を生み出した 2 つのハーネスのミスについては、bench/README.md を参照してください。

保持

元のコンテキストで答えられた質問にモデルが引き続き答えられる場合に限り、その節約には意味があります。

# No LLM judge: file paths checked against ground truth from the transcript
python bench/artifact_retention.py ./sessions 12

# LLM-graded probes (recall / artifact / continuation / decision)
cargo build --features probe --release
./target/release/distil-probe <session.jsonl> --probes 6 --model qwen2.5:3b

プローブの分類体系は Factory.ai のものです。同社の記事では分類体系が定義されていますが、ハーネスは提供されていません。判定には Completer を使い、Summarizer は使いません — Summarizer は要約を前提とした枠組みを持ち込む可能性があり、プローブの形式と採点指示の両方を書き換えてしまうためです。

ライブラリーとして使う

use distil::{CacheAlignLayer, Ctx, EstimateCounter, Pipeline};

let pipeline = Pipeline::builder()
    .counter(EstimateCounter)
    .layer(CacheAlignLayer::generic())
    .build();

let mut ctx = Ctx::new(messages, tools, turn);
let result = pipeline.optimize(&mut ctx);
println!("{result}");

この例はコンパイル可能な状態で examples/readme_quickstart.rs に保存されています — cargo run --example readme_quickstart で実行できます。

すべてのレイヤーが Layer を実装し、tokens_before、tokens_after、詳細行を報告するため、それぞれを個別に測定できます。

機能

機能追加される内容
corpusトランスクリプトローダー(追加の依存関係なし)
benchdistil-bench。tiktoken が必要です
probedistil-probe。HTTP 判定には proxy が必要です
tiktokenchars/3.5 による推定ではなく、正確な BPE カウント
proxydistil-proxy HTTP サーバー
mcpdistil-mcp MCP サーバー
metricsPrometheus /metrics

インストール

./install.sh                       # binaries, the skill, and the MCP server
/plugin marketplace add munhq/distil
/plugin install distil             # Claude Code: skill and server in one step

install.sh は両方のバイナリをインストールし、見つかったすべての Claude ホームにスキルを配置し、ユーザースコープで MCP サーバーを登録します。プラグインがすでにインストールされている場合は、プラグインがサーバーを宣言し、スキルも同梱しているため、バイナリのみをインストールします。

プラグインは npx -y @munhq/distil を使ってサーバーを起動するため、Node が必要です。プラグイン相対パスは使用できません。Claude Code は ${CLAUDE_PLUGIN_ROOT} を展開しますが、それ以外のクライアントは展開しないため、プラグインでこのパスを宣言すると、ほかのすべてのクライアントには存在しないリテラルパスが渡されます。Node がない場合に備えて、install.sh とビルド済みバイナリも引き続き提供しています。

プラットフォームのサポート
プラットフォームバイナリスクリプト
Linux x86_64 / arm64リリース済み、テスト済み対応
macOS x86_64 / arm64リリース済み、CI でビルド対応
Windows x86_64 / arm64リリース済み、CI でビルドシェルが必要:Git Bash、MSYS2、または WSL

リリースでは 6 つのターゲットを公開しており、plugin/test_platform.sh はインストーラーとプラグインランチャーの両方をこのマトリクスに照らして検証するため、アセット名と要求される名前が食い違うことはありません。install.sh とランチャーは bash スクリプトのため、Windows ではシェルが必要です。cmd と PowerShell では実行できません。Linux バイナリは静的 musl ビルドのため、対応する glibc は必要ありません。

注意事項

コーパスは、ある開発者のマシンに由来するものです。発見されたのは比率であり、絶対的な合計値は個人のものです。カウントには cl100k_base を使用しており、Claude のトークナイザーを数パーセント以内で近似します。損益分岐モデルはキャッシュのブレークポイントが 1 つだけだと仮定しているため、末尾部分だけを書き換える場合のコストは表の値より小さくなります。これは精度を高めるものですが、結論を覆すものではありません。

コントリビューション

ビルドとテストの手順、ベンチマークの変更時に守るべきルール、レビュー前にプルリクエストで必要な内容については、CONTRIBUTING.md を参照してください。脆弱性は非公開で報告してください — SECURITY.md。

ライセンス

MIT。詳しくは LICENSE を参照してください。

コメント

MCP は初めてですか?

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

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