39 ポイント 投稿者 GN⁺ 2026-03-02 | 1件のコメント | WhatsAppで共有
  • 外部ツール呼び出し時に発生する大量の生データがコンテキストウィンドウを急速に消費する問題を解決
  • Claude Codeとツール出力の間に配置され、データを圧縮・フィルタリングして315KBを5.4KBに縮小(98%削減)
  • サンドボックス構造により各実行を分離し、stdoutのみをコンテキストに含めることでログ・スナップショットなどの元データ流出を遮断
  • SQLite FTS5ベースのナレッジベースでMarkdownコンテンツをインデックス化し、BM25ランキングとPorter stemmingを適用して正確なコードブロック検索を支援
  • 同じ200Kトークン上限でセッション継続時間が30分から3時間に伸び、AIエージェントの効率的なコンテキスト管理が可能

問題点

  • Claude CodeのMCPツール呼び出しは、各呼び出しごとに生データを200Kコンテキストウィンドウへ直接ダンプする
    • Playwrightスナップショット56KB、GitHub Issue 20件で59KB、アクセスログ45KBなど
    • 約30分の使用で全コンテキストの40%が消費される
  • MCPは外部ツール利用の標準となったが、入力定義と出力データの両方がコンテキストを埋める構造的な限界がある
  • 81個以上のツールが有効な状態では、最初のメッセージ前にすでに72%(143Kトークン)が消費されている

Context Modeの構造

  • Claude Codeとツール出力の間に位置するMCPサーバーとして、生データを最小化して転送
    • 315KBの出力が5.4KBに縮小(98%減)
  • execute呼び出しは分離されたサブプロセスで実行され、メモリや状態を共有せず独立して動作
    • stdoutのみがコンテキストに含まれ、ログ・APIレスポンス・スナップショットなどはサンドボックス内に保持される
  • 10言語ランタイムをサポート: JavaScript, TypeScript, Python, Shell, Ruby, Go, Rust, PHP, Perl, R
    • Bunの自動検出によりJS/TS実行速度が3〜5倍向上
  • 認証済みCLI(gh, aws, gcloud, kubectl, docker)は環境変数継承方式で資格情報を安全に受け渡す

ナレッジベース(knowledge base)

  • indexツールがMarkdownを見出し単位に分割し、コードブロックをそのまま保持したままSQLite FTS5仮想テーブルに保存
  • 検索時にはBM25ランキングアルゴリズムを使い、単語頻度、逆文書頻度、文書長の正規化に基づいて関連性を計算
  • Porter stemmingの適用により、“running”、“runs”、“ran”を同一語幹としてマッチ
  • search呼び出しでは要約ではなく正確なコードブロックと見出し階層を返す
  • fetch_and_indexはURLを取得してHTMLをMarkdownに変換した後にインデックス化し、元ページはコンテキストに含まれない

パフォーマンス指標

  • 11件の実シナリオ(テストトリアージ、TypeScriptエラー診断、git diffレビューなど)すべてで出力を1KB以下に維持
    • Playwrightスナップショット: 56KB → 299B
    • GitHub Issue(20件): 59KB → 1.1KB
    • アクセスログ(500件): 45KB → 155B
    • CSV分析(500行): 85KB → 222B
    • Gitログ(153コミット): 11.6KB → 107B
    • リポジトリ調査(subagent): 986KB → 62KB(5回呼び出し vs 37回)
  • セッション全体では315KB → 5.4KBに縮小し、セッション継続時間は30分 → 3時間
  • 45分後に残るコンテキスト: 従来60% → 99%

インストールと利用方法

  • Plugin Marketplace経由で自動ルーティングフックとスラッシュコマンドをサポート
  • MCP専用インストールも可能
  • Claude Codeを再起動後、すぐに利用可能

実際の変化

  • 利用方法を変更せずにPreToolUseフックが自動で出力をルーティング
  • サブエージェントはbatch_executeを基本ツールとして使用
  • Bashサブエージェントはgeneral-purposeにアップグレードされ、MCPツールにアクセス可能
  • 結果としてコンテキストウィンドウがもはや急速に埋まらず、同じトークンでより長いセッションを維持できる

開発の背景

  • MCP Directory & Hubの運営中に、すべてのMCPサーバーが生データをコンテキストにダンプする共通パターンを発見
  • CloudflareのCode Modeがツール定義を圧縮したことに着想を得て、出力データ圧縮の方向へ拡張
  • Claude Codeセッションで6倍長く作業できることを確認後、MITライセンスでオープンソース公開
  • GitHub: mksglu/claude-context-mode

1件のコメント

 
GN⁺ 2026-03-02
Hacker Newsのコメント
  • ここで提案されている FTS5インデックス手法 は正しいが、さらに一歩進めるべきだと思う
    ツール出力には構造化データ(JSON、テーブル、設定)と自然言語(注釈、エラーメッセージ、docstring)が混在しているので、純粋なBM25 では性能が落ちる
    私は似た問題を解くために、Model2Vec + sqlite-vec + FTS5 を組み合わせたハイブリッド検索器を作った。2つの検索結果を Reciprocal Rank Fusion(RRF) で統合することで、BM25の正確なキーワード一致とベクトル検索の意味ベース一致の両方を得られる
    増分インデキシングも重要だ。私のインデクサは --incremental フラグで変更されたチャンクだけを再埋め込みする。15,800ファイル全体の再インデックスは4分、日次の増分更新は10秒未満だ
    キャッシュの面でもこの方式は有利だ。同じクエリに対して圧縮された出力が 決定的(deterministic) なので、プロンプトキャッシュが安定して機能する
    Context Modeのアーキテクチャに付け加えるなら、同じ検索器をPostToolUseフックとして実行し、出力が会話に入る前に圧縮されるようにすることだ

    • OPの手法では構造化レスポンスがそのまま残る点が問題だったが、私は サンドボックス実行が不可能なMCPゲートウェイ を作っているので、この方法はとても有用に見える。今日これを試してみるつもりだ
    • この内容についての 詳細な記事 をぜひ読みたい。HNの几帳面なノートテイカーたちが気に入りそうだ
    • 私もこの Obsidianのインデキシング作業 の背景と実装過程を詳しく見てみたい
  • 記事の著者です。数日前に GitHubリポジトリ を共有したところ、良いフィードバックをもらった。今回の記事はその アーキテクチャ説明
    核心のアイデアは、MCPツール呼び出しが吐き出す生データを200Kコンテキストウィンドウに入れる代わりに、Context Modeが 隔離されたサブプロセス を生成し、stdoutだけをコンテキストに渡すことだ。LLM呼び出しなしの純粋なアルゴリズムベースで、SQLite FTS5 + BM25 + Porter stemmingを使っている
    最近は228スターと実際の利用データを得て、サブエージェントルーティング がどれほど重要かを実感した。Bashサブエージェントを汎用型へ自動アップグレードしてbatch_executeを使えば、生出力でコンテキストを埋め尽くさずに済む

    • ブログ記事に Cloudflare Code Modeの投稿 へのリンクを追加するとよさそうだ。READMEにはあるが本文にはない
    • とても興味深いので自分でも試してみるつもりだ。ただ、Context ModeはMCPのコンテキスト使用自体を扱っているわけではないと理解しているが、それで合っているか確認したい。複数のClaude環境でMCPを使っている立場として、CLIだけでは限界がある
    • これを Zed Agent のような他のエージェントでも使えるのか気になる
    • Codex をサポートしていない理由があるのか知りたい。構造的にはエージェント非依存に見えるが
    • この方式がキャッシュを壊さないのか気になる
  • なぜ mcp-cliモード を使わないのかわからない。私は wener-mcp-cli でクローン版を作ってある

  • すばらしい仕事だ。コンテキストウィンドウ管理 にはまだ改善の余地が大きいと思う。たとえばモデルが何度か試行した末に正解にたどり着いたなら、失敗した試行をコンテキストから取り除く バックトラッキング のような手法が有用そうだ

    • 私も同意する。デバッグ中に生じたログや失敗記録は、バグを修正した後は取り除けるべきだ。今のIDEでは手動でやるのが面倒だ。エージェントが自分でコンテキストを管理し、ログのようなものは一定回数後に自動整理されるとよい。コンテキストは単なるスタックではなく、自由に操作できる空間として捉えるべきだ
    • 失敗した試行は結局 ノイズ だ。再試行パターンを自動検出して最後の成功版だけ残すのは、十分実装可能だ
    • 今は1990年代後半のように感じる。当時がHTMLとSQLだったなら、今は コーディングエージェント だ。私たちはすでに熟練エンジニアなので、Claude Codeを使いながら自然に最適化を見つけていく
    • サブエージェントを活用するのも方法だ。問題が起きたらサブエージェントをフォークして解決し、結果だけ持ち帰ればいい。モデルが自分でメモリを消して過去の状態に戻るという想像も面白い
    • 私は実際にそうしている。各タスク呼び出しは別個のサブプロセスとして実行されるので、親コンテキストを汚染しない。完了後は結果、過程の要約、失敗した試行、学んだことを4項目に整理して親へ渡す。ツール出力はファイルに保存し、LLMは必要な部分だけ読む。たとえば “Success!” で終わるなら最後の行だけ見ればよい。失敗時はエラーメッセージだけ読む。ローカルモデルでログを要約してクラウドモデルに渡す実験もしている。最新技術ではないかもしれないが、自分の環境ではうまく動いている
  • この記事を見て、自分が Claude Codeのトークン使用量 をまったく把握していないと気づき、今朝 claude-trace というCLIを作った
    ~/.claude/projects/*/*.jsonl を解析して、セッション、ツール、プロジェクト、タイムラインごとの使用量とコスト(キャッシュ読み取り/生成を含む)を分析する
    Context Modeが出力圧縮をうまく解決するなら、これは 計測レイヤー として変更前後の消費を可視化する

    • 「/context?」という問いのように、実際にトークンがどこへ使われているのかを可視化するのが重要だ
  • MCPではなく CLIアプリ を使えば、多くのトークン消費は減らせる。たとえば GitHub CLI はMCPよりはるかに少ないトークンで同じことができる

  • フックが攻撃的すぎるように感じる。すべてのcurl/wget/WebFetchを遮断してサンドボックスで56KBスナップショットを作るのはよいが、単なる curl api.example.com/health のように200バイトしか必要ない場合にはやりすぎだ
    153個のgitコミットを107バイトに圧縮すると、モデルは完璧な抽出スクリプトを書けない限りデータを見られない。誤ったコマンドを書けば必要な情報が失われる
    ベンチマークはモデルが常に正しい要約コードを書くと仮定しているが、実際にはそうではない

    • 私も同意したので、その機能は削除した
  • 悪くはないが、精度低下ハルシネーションのリスク がある。不完全なデータや誤った抽出ロジックのせいで、Claudeが間違った結論を出す可能性がある。MCPが優れた抽出スクリプトと検索クエリの両方を書けるほど賢いことを前提にしている。情報保持は実際かなり大きな問題だと思う

  • 圧縮率は印象的だが、圧縮されたコンテキスト でもモデルが同等品質の出力を出せるのか気になる。セッションを30分から3時間に延ばせても、2時間時点での推論品質が維持されてこそ意味がある
    esafakが言う キャッシュの経済性 も重要だ。プロンプトキャッシュがうまく効けば、冗長なコンテキストも事実上無料になる。しかし圧縮がキャッシュの連続性を壊すなら、かえってコストが増える可能性もある
    さらに根本的な問題は、ほとんどのMCPツールがSELECT *で全データを取ってくることだ。要約とドリルダウンをサポートする プロトコル設計の問題 である

    • キャッシュが無料のように見えても、実際には 注意力の低下と速度低下 を引き起こす。長いプレフィックスを再利用しても、計算量自体は依然として大きい
  • 80個以上のツールをコンテキストに入れる必要があるのか疑問だ。コンテキストは金のように貴重で、問題と無関係なものを多く入れるほど結果は悪くなる。データ圧縮より サブエージェントの分離 のほうがよいアプローチだ

    • その通りだ。ただ、たいていの人はタスクごとにMCPサーバーを直接管理していない。5〜6個のサーバーをインストールしただけで、デフォルトで80個のツールが読み込まれる。Context Modeはツール定義の過剰さを解決するものではない。代わりに、ツール実行後にダンプされる 出力側 を扱う。たとえばPlaywrightのスナップショットやgit logひとつだけでも5万トークン飛ぶが、それをサンドボックスで処理する