Claude Media
Claude Codeのコンテキストウィンドウを可視化して中身を確認する方法

Claude Codeのコンテキストウィンドウを可視化して中身を確認する方法

Claude Code公式のインタラクティブなタイムラインで、起動前後に何が文脈に積まれるかを追い、自分のセッションでは/contextコマンドで同じ内訳を実測する手順をまとめます。

Claude Codeのコンテキストウィンドウには、指示・読み込んだファイル・Claude自身の応答に加えて、ターミナルには表示されない内容も積まれます。公式docsはcontext-windowページに、起動からコンパクトまでの1セッションを実際の値で追体験できるインタラクティブなタイムラインを用意しています。本記事はこのタイムラインが何を示しているかを要約し、自分の実セッションで同じ内訳を/contextコマンドから確認する手順をまとめます。

起動直後に自動で読み込まれる要素と概算トークン数

タイムラインが示す起動シーケンスでは、あなたが何も入力しない時点で次の要素が順に文脈へ積まれます。数値はタイムラインが使う代表値で、実際のプロジェクトでは前後します。

要素概算トークンターミナルに見えるか
システムプロンプト概算トークン4,200ターミナルに見えるか見えない(常に最初に読み込まれる)
自動メモリー(MEMORY.md)概算トークン680ターミナルに見えるか見えない(先頭200行または25KBまで)
環境情報(作業ディレクトリ・OS等)概算トークン280ターミナルに見えるか見えない
MCPツール名(スキーマは遅延)概算トークン120ターミナルに見えるか見えない
Skillの一行説明概算トークン450ターミナルに見えるか見えない(本文は呼び出し時のみ読み込み)
~/.claude/CLAUDE.md概算トークン320ターミナルに見えるか見えない
プロジェクトのCLAUDE.md概算トークン1,800ターミナルに見えるか見えない

MCPツールは既定でスキーマ本体を遅延させ、タスクに必要になったものだけツール検索経由で読み込みます。ENABLE_TOOL_SEARCH=autoにすると、コンテキストウィンドウの10%に収まる範囲でスキーマを先読みし、falseにすると全件を先読みします。Skillの一行説明も同様に、disable-model-invocation: trueを付けたSkillはこの一覧にすら載らず、/名前で明示的に呼ぶまで文脈に一切現れません。output styleや--append-system-promptを使っている場合、その内容もここに積まれます。

Skillの一行説明リストには、他の起動時コンテンツと違う扱いがひとつあります。/compact後にこの一覧は再注入されません。再注入されるのは、そのセッション中に実際に呼び出したSkillの本文だけです。呼んでいないSkillの存在は、コンパクトのたびに文脈から静かに落ちます。

作業中にトークンが積み上がる仕組み

作業が進むと、ファイル読み込み・パス限定ルール・Hookが個別に文脈を伸ばします。タイムラインの例では、src/api/auth.tsの読み込みが2,400トークン、追ったtokens.tsが1,100トークンというように、ターミナルには「Read auth.ts」の一行しか出ない裏で、ファイル内容の全量がClaudeの文脈に入ります。

.claude/rules/配下のpaths:指定ルールは、該当パターンに一致するファイルをClaudeが読んだ瞬間に自動で読み込まれます。タイムラインの例ではsrc/api/**に一致するルールがapi-conventions.mdを、*.test.tsに一致する別ルールがtesting.mdを、それぞれ「Loaded」という一行表示だけでトリガーします。

PostToolUse hookがhookSpecificOutput.additionalContextでテキストを返す場合も同様に文脈へ加算されます。ただし終了コード0の標準出力だけならデバッグログに残るのみで、文脈には入りません。タイムラインの例ではファイル編集のたびにprettierを走らせるhookが登場し、auth.tsの編集で1回、auth.test.tsの編集で1回、それぞれ独立に発火して個別に文脈へ加算されています。一致するツールイベントが起きるたびに毎回実行される、というのがhookの基本動作です。1つのhookが「一度だけ」ではなく編集の数だけ効くことは、hookの追加コンテキストが積み上がる速さを見積もるときに見落としやすい点です。

サブエージェントの読み込みが本体の文脈を圧迫しない理由

タイムラインの後半では、あなたが「サブエージェントで調査させてから直して」と頼む場面を扱います。この時点でClaudeはリサーチをサブエージェントに委譲し、サブエージェントは独立した新しいコンテキストウィンドウで動きます。CLAUDE.mdやMCP・Skillの設定は同じものを読み込みますが、これはサブエージェント自身の文脈としてカウントされ、本体の会話履歴やあなたの自動メモリーは引き継ぎません。サブエージェントがsession.tstimeouts.tsを読んでも、その内容は本体の文脈を一切消費せず、戻ってくるのは要約と小さなメタデータだけです。大きな調査ほど、サブエージェントへ渡す価値が上がります。

サブエージェントが読み込む内容は一律ではありません。組み込みのExploreエージェントとPlanエージェントは、文脈を小さく保つためにCLAUDE.mdの読み込み自体を省略します。また、ネストした呼び出しで再帰しないよう、サブエージェントは既定でAgentツール自体を持ちません(プランモード制御やバックグラウンドタスク用のツールなど、親から一部のツールを引き継がない点も同様です)。委譲先のエージェントによって最初から積まれる分が違うことは、調査タスクをどのエージェントに投げるか選ぶときの材料になります。

自分の実際のセッションを/contextで確認する

タイムラインが使う数値は代表値であり、あなたの実際のプロジェクトでの内訳ではありません。今のセッションで実際に何がどれだけ文脈を占めているかは、/contextを実行すると分かります。

/context

/contextはカテゴリ別の内訳とあわせて、最適化の提案、どのCLAUDE.mdとどの自動メモリーファイルが読み込まれたかを表示します。読み込まれたファイルをその場で開いて編集したい場合は/memoryを実行します。タイムラインの代表値と自分の実測値がかけ離れているなら、原因はプロジェクト固有のCLAUDE.mdの分量か、読み込んだファイルの数か、呼び出したSkillのどれかに絞り込めます。

/compact後に何が残り、何が消えるか

会話が長くなり/compactが走ると、履歴は構造化された要約に置き換わります。v2.1.198以降、この要約リクエストはセッションの拡張思考の設定を引き継ぎます。セッションで思考が有効なら要約も思考しながら生成され、無効ならそのまま無効です。思考の有無は要約の作られ方に影響するだけで、セッション自体の設定は要約後も変わりません。何が生き残るかは、その内容がどう読み込まれたかで決まります。

読み込みの仕組みコンパクト後
システムプロンプト・output styleコンパクト後変化しない(メッセージ履歴の一部ではないため)
プロジェクト直下のCLAUDE.mdとパス指定なしのルールコンパクト後ディスクから再注入
自動メモリーコンパクト後ディスクから再注入
Plan Modeで書いたプランコンパクト後ディスクから再注入
paths:指定ルールコンパクト後該当ファイルを再度読んだタイミングで再読み込み
サブディレクトリのネストしたCLAUDE.mdコンパクト後該当ディレクトリのファイルを読んだタイミングで再読み込み
Claudeが読み書きしたファイルコンパクト後直近に変更された順で最大5件を再読み込み
呼び出し済みSkillの本文コンパクト後1 Skillあたり5,000トークン・合計25,000トークンの上限で再注入(古いものから切り捨て)
Hookが以前追加した文脈コンパクト後会話の他の部分と一緒に要約される
compactソース(圧縮直後に再起動したことを示すマッチャー値)に一致するSessionStart hookコンパクト後実行され、出力が圧縮後の文脈に加わる

コンパクト直後、Claude Codeはセッション内で読み書きしたファイルのうち直近に変更された最大5件を選んで再読み込みし、それらに適用されるルールとネストしたCLAUDE.mdも合わせて再読み込みします。5,000トークンを超えるファイルは内容なしの参照(Referenced file)として戻り、Read扱いにはなりません。ルールをコンパクトをまたいで確実に残したい場合は、paths:のfrontmatterを外すか、プロジェクト直下のCLAUDE.mdへ移すのが確実です。

タイムラインの例では、要約後の会話は圧縮前の合計トークン数のおよそ12%に収まる代表値で示されています。実際の圧縮率はセッションの内容次第で変わりますが、「要約後もほとんど残る」わけではなく、大部分が要約の一段落に置き換わるという規模感の目安にはなります。

表の最後の行にある「compactソースに一致するSessionStart hook」は、圧縮を挟んでセッションが再開したことを示すマッチャー値です。圧縮のたびに毎回コンテキストへ何かを足したい運用(プロジェクト固有の注意事項を再注入する等)では、この値に一致するSessionStart hookを仕込んでおくと、/compactが走った直後だけ動くフックを作れます。

よくあるつまずき

  • Skillの本文は「切り捨てられて消える」のではなく、ファイルの先頭側を優先して切り詰められる。重要な指示はSKILL.mdの冒頭に置く
  • パス指定ルールは「一度読み込んだら以後ずっと有効」ではない。コンパクト後は該当ファイルを再び読むまで効かない
  • /compactは会話全体を無条件で要約するとは限らない。/compact focus on ...で残す観点を指定でき、自動パスが推測するより意図した内容を残せる
  • 大きな調査を本体セッションのまま続けると文脈を消費し続ける。サブエージェントへの委譲は文脈を節約する手段であって、単なる並列化の手段ではない
  • 「コンテキストウィンドウが埋まる=セッションが終わる」ではない。自動コンパクトが先に走るため、何もしなくてもセッションは続く。手を打つ意味は、自動パスが選ぶ内容より自分で残したい内容を選べる点にある

コンテキストが埋まる前に打てる手

/compact focus on the auth bug fix
/autocompact 500k
/clear

/compactに指示を添えると、自動パスが推測するより残す内容を選べます。/rewindでメッセージを選び「Summarize from here」または「Summarize up to here」を選ぶと、会話の一部だけを圧縮できます。/autocompactにトークン数を渡すと、自動コンパクトが走るしきい値そのものを早めたり遅らせたりできます。値は200000のような素の数値、500k1Mのような単位付き、あるいは200のように100〜1000の裸の数字(千単位として解釈)のいずれの書き方でも受け付けます。無関係な作業に移るときは/clearで会話を切ると、次のタスクに不要な履歴がトークンを消費し続けるのを防げます。

それでも足りない場合は、1Mトークンのコンテキストウィンドウへモデルを切り替える選択肢もあります。対応モデルとプランごとの条件は同記事にまとめています。

まとめ

公式のインタラクティブタイムラインは、起動前の自動読み込み・ファイル読み込みごとの加算・サブエージェントによる文脈の分離・コンパクトでの再注入という4つの仕組みを、実際の数値付きで一望できるようにしたものです。自分のプロジェクトでの実測値は/contextで確認し、想定より膨らんでいる原因がCLAUDE.mdなのかSkillなのか読み込んだファイルなのかを、この対応関係から逆引きすると早く特定できます。CLAUDE.mdの書き方そのものを見直したい場合はCLAUDE.mdを実用に引き上げる10のパターン/compactの発火条件をさらに詳しく知りたい場合はClaude Code compactの発火条件と要約後に残る情報を合わせて読むと理解が深まります。

この記事を共有:XはてブLinkedIn