Claude Codeのコンテキストウィンドウを可視化して確認する方法
Claude Code公式のインタラクティブなタイムラインで、起動前後に何が文脈に積まれるかを追い、自分のセッションでは/contextコマンドで同じ内訳を実測する手順をまとめます。
コンテキストウィンドウの使用状況は、Claude Codeで/contextを実行すると確認できます。使用量が色付きのグリッドで表示され、肥大したツールやメモリーには改善の提案も出ます。コンテキストウィンドウの上限はモデルで決まり、Sonnet 5以降やOpus 4.7以降は既定で1Mトークン、Opus 4.6とSonnet 4.6は[1m]を付けない限り200Kです。
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を使っている場合、その内容もここに積まれます。AGENTS.mdが読み込まれる場合もあります。
環境情報の置き場所は起動フラグで変えられます。v2.1.287のclaude --helpには--exclude-dynamic-system-prompt-sectionsがあります。作業ディレクトリ・環境情報・メモリーのパス・git statusを、システムプロンプトから最初のユーザーメッセージへ移すフラグです。ヘルプの説明では、ユーザー間のプロンプトキャッシュを再利用しやすくする用途です。既定のシステムプロンプトを使うときだけ効きます。
Skillの一行説明リストには、他の起動時コンテンツと違う扱いがひとつあります。/compact後にこの一覧は再注入されません。再注入されるのは、そのセッション中に実際に呼び出したSkillの本文だけです。呼んでいないSkillの存在は、コンパクトのたびに文脈から静かに落ちます。
タイムライン全体の数値を足すと、圧縮前の会話は合計22,225トークンになります。起動直後の7,850トークンは、このうち約35%です。
タイムラインの代表値を足した内訳
起動直後(入力前)
7,850
ここまでで1文字も打っていない
圧縮前の合計
22,225
サブエージェント内の読み込みは含まない
ターミナルで全文が見える分
3,665
全体の約16.5%。あなたの入力とClaudeの文章・差分
一行表示か非表示の分
18,560
一行表示10,490・非表示8,070
作業中にトークンが積み上がる仕組み
作業が進むと、ファイル読み込み・パス限定ルール・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」という一行表示だけでトリガーします。
ファイル以外にも、画面には一行しか出ない出力があります。npm testの出力は1,200トークン、grep "refreshToken"の結果は600トークンです。画面にはテストの合否数や実行したコマンドだけが出ます。あなたが!git statusのように!を前置して実行したシェルコマンドも、コマンドと出力の両方が文脈に入ります。例では180トークンです。
PostToolUse hookがhookSpecificOutput.additionalContextでテキストを返す場合も同様に文脈へ加算されます。ただし終了コード0の標準出力だけならデバッグログに残るのみで、文脈には入りません。タイムラインの例では、ファイル編集のたびにprettierを走らせるhookがauth.tsの編集で120トークン、auth.test.tsの編集で100トークンを個別に加えています。一致するツールイベントのたびに毎回走るので、1回の値が小さくても編集の数だけ積み上がります。PostToolUse hookの出力が10,000文字を超えると、全文はファイルに保存され、Claudeにはプレビューとファイルパスが渡されます。
サブエージェントの読み込みが本体の文脈を圧迫しない理由
タイムラインの後半では、あなたが「サブエージェントで調査させてから直して」と頼む場面を扱います。この時点でClaudeはリサーチをサブエージェントに委譲し、サブエージェントは独立した新しいコンテキストウィンドウで動きます。CLAUDE.mdやMCP・Skillの設定は同じものを読み込みますが、これはサブエージェント自身の文脈としてカウントされ、本体の会話履歴やあなたの自動メモリーは引き継ぎません。サブエージェントがsession.tsやtimeouts.tsを読んでも、その内容は本体の文脈に入らず、戻ってくるのは最終の文章と、トークン数・所要時間を載せた小さなメタデータだけです。
タイムラインの値で数えると差は大きくなります。サブエージェント側の起動分は3,790トークンです。内訳はシステムプロンプト900・CLAUDE.md 1,800・MCPとスキル970・依頼文120です。続くファイル読み込みが6,100トークンで、計9,890トークンになります。本体に戻ったのは420トークンの要約でした。読み込む量が多い調査ほど、この差が効いてきます。
サブエージェントが読み込む内容は一律ではありません。組み込みのExploreエージェントとPlanエージェントは、文脈を小さく保つためにCLAUDE.mdの読み込み自体を省略します。また、ネストした呼び出しで再帰しないよう、サブエージェントは既定でAgentツール自体を持ちません(プランモード制御やバックグラウンドタスク用のツールなど、親から一部のツールを引き継がない点も同様です)。委譲先のエージェントによって最初から積まれる分が違うことは、調査タスクをどのエージェントに投げるか選ぶときの材料になります。
コンテキストウィンドウの上限はモデルでどう違うか
上限はモデルごとに違い、Claude Codeは認識したモデルにAnthropic APIと同じコンテキストウィンドウを割り当てます。
| モデル | 既定の上限 | 1Mにする方法 |
|---|---|---|
| Fable 5.1・Fable 5、Sonnet 5以降、Haiku 5.5、Opus 4.7以降 | 既定の上限1Mトークン | 1Mにする方法不要(最初から1M) |
| Opus 4.6・Sonnet 4.6 | 既定の上限200Kトークン | 1Mにする方法[1m]付きで選ぶ(プランの条件あり) |
CLAUDE_CODE_DISABLE_1M_CONTEXT=1を設定すると、1Mが既定のモデルも200Kのコンテキストウィンドウとして扱い、200Kの境界で圧縮します。自動圧縮を切っている場合は圧縮されず、上限に達するとエラーで止まります。LLMゲートウェイの先で200Kを超える要求が拒否されるときは、CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000で圧縮の境界を合わせます。
自分の実際のセッションを/contextで確認する
タイムラインが使う数値は代表値であり、あなたの実際のプロジェクトでの内訳ではありません。今のセッションで実際に何がどれだけ文脈を占めているかは、/contextを実行すると分かります。
/context/contextはカテゴリ別の内訳とあわせて、最適化の提案、どのCLAUDE.mdとどの自動メモリーファイルが読み込まれたかを表示します。コンテキストの使用量を色付きのグリッドで見せるコマンドで、コンテキストを多く使うツールやメモリーの肥大、容量の警告も提案として出ます。フルスクリーンモードでは項目別の内訳がたたまれ、/context allで展開できます。読み込まれたファイルをその場で開いて編集したい場合は/memoryを実行します。タイムラインの代表値と自分の実測値がかけ離れているなら、原因はプロジェクト固有のCLAUDE.mdの分量か、読み込んだファイルの数か、呼び出したSkillのどれかに絞り込めます。
/compact後に何が残り、何が消えるか
会話が長くなり/compactが走ると、履歴は構造化された要約に置き換わります。v2.1.198以降、この要約リクエストはセッションの拡張思考の設定を引き継ぎます。セッションで思考が有効なら要約も思考しながら生成され、無効ならそのまま無効です。思考の有無は要約の作られ方に影響するだけで、セッション自体の設定は要約後も変わりません。何が生き残るかは、その内容がどう読み込まれたかで決まります。
| 読み込みの仕組み | コンパクト後 |
|---|---|
| システムプロンプト・output style | コンパクト後引き続き適用される |
| プロジェクト直下のCLAUDE.mdとパス指定なしのルール | コンパクト後ディスクから再注入 |
| 自動メモリー | コンパクト後ディスクから再注入 |
| gitステータスのスナップショット | コンパクト後リポジトリから新しいものを読み直す |
| Plan Modeで書いたプラン | コンパクト後ディスクから再注入 |
paths:指定ルール | コンパクト後該当ファイルを再度読んだタイミングで再読み込み |
| サブディレクトリのネストしたCLAUDE.md | コンパクト後該当ディレクトリのファイルを読んだタイミングで再読み込み |
| Claudeが読み書きしたファイル | コンパクト後直近に変更された順で最大5件を再読み込み |
| 呼び出し済みSkillの本文 | コンパクト後1 Skillあたり5,000トークン・合計25,000トークンの上限で再注入(古いものから切り捨て) |
| バックグラウンドのコマンドとサブエージェント | コンパクト後動き続ける。実行中のものはClaudeに通知され、重複して起動しない |
| Hookが以前追加した文脈 | コンパクト後会話の他の部分と一緒に要約される |
compactソース(圧縮直後に再起動したことを示すマッチャー値)に一致するSessionStart hook | コンパクト後実行され、出力が圧縮後の文脈に加わる |
コンパクト直後、Claude Codeはセッション内で読み書きしたファイルのうち直近に変更された最大5件を選んで再読み込みします。再読み込みされたファイルに一致するpaths:ルールやネストしたCLAUDE.mdは、その読み込みをきっかけに戻ります。5,000トークンを超えるファイルは内容なしの参照(Referenced file)として戻り、Read扱いにはなりません。ルールをコンパクトをまたいで確実に残したい場合は、paths:のfrontmatterを外すか、プロジェクト直下のCLAUDE.mdへ移すのが確実です。
タイムラインのスクリプトが要約の大きさに使う係数0.12(12%)は、圧縮前の合計に掛けるものではありません。起動後の会話イベント14,375トークンに0.12を掛けた約1,700トークン(1,725)が、要約ブロックの大きさです。ここへ再注入の分が足されます。起動時の自動読み込み(Skillの一行説明を除く)7,400、再読み込みされる4ファイル6,900、呼び出し済みSkillの本文620を足すと、圧縮後は約16,600トークンです。圧縮前の22,225トークンの約75%に当たります。
つまりこの例では、要約が小さくなっても全体は4分の1ほどしか縮みません。再注入される分が大きいからです。圧縮後を軽くしたいなら、読み込むファイルの数と、SKILL.mdの長さを見直す方が効きます(以上の計算は公式タイムラインのスクリプトの数値を使った筆者の算術で、実セッションの値ではありません)。
表の最後の行にある「compactソースに一致するSessionStart hook」は、圧縮を挟んでセッションが再開したことを示すマッチャー値です。圧縮のたびに毎回コンテキストへ何かを足したい運用(プロジェクト固有の注意事項を再注入する等)では、この値に一致するSessionStart hookを仕込んでおくと、/compactが走った直後だけ動くフックを作れます。圧縮そのものを止めたいならPreCompact/PostCompactフックが使えます。
膨らんだ原因を/contextの内訳から絞る
`/context`で見る順番
- 1
起動直後の分を見る
入力前から数千トークンあるのは正常です。ここが重いときは、CLAUDE.mdの行数、読み込まれた自動メモリー、MCPサーバーの数を疑います。
- 2
作業中に増えた分を見る
大きなファイルの読み込みとコマンド出力が主因です。プロンプトでファイルを具体的に指定するか、調査をサブエージェントへ渡します。
- 3
圧縮後も重いかを見る
再注入されるファイルとSkill本文の分が残ります。
/clearで会話を切るか、paths:指定のルールとSkillの長さを見直します。
よくあるつまずき
- 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 で発火点を動かす
自動コンパクトが走るまでの余裕を、早めたり遅らせたりします。
/clear で会話を切る
無関係な作業へ移るとき、古い履歴が毎回のトークンを消費するのを止めます。
/autocompactは、公式のコマンド表でv2.1.221以降とされています。値は200000の素の数値、500kや1Mの単位付き、200のような100〜1000の裸の数字(千単位)で渡せます。範囲は100Kから1Mトークンで、モデルのコンテキストウィンドウを超える値は上限に切り詰められます。保存先は3通りあります。
/autocompact 500kはユーザー設定のautoCompactWindowに保存され、次回以降にも効く。managed settingsが同じキーを持つ場合、コマンドは値を保存してもセッションはその設定に従うclaude --autocompact 500kはその起動だけの上書きで、managed settingsにも負けない。v2.1.287のclaude --helpには--autocompact <auto|tokens>が100k–1M tokensと載っている- 環境変数
CLAUDE_CODE_AUTO_COMPACT_WINDOWは最優先で、素のトークン数しか受け付けない。設定中の/autocompactは変更せず、上書きされていると報告する
何も設定しないときの発火点はモデルで違います。ネイティブ1Mのモデル(Sonnet 5、Fableモデル、Opus 4.7以降をAnthropic APIで使う場合)は、上限に達する前の約967Kトークンで圧縮します。Sonnet 4.6とOpus 4.6を拡張コンテキストなしで使うと、200Kの境界で圧縮します。
上限そのものを広げたいときは、1Mトークンのコンテキストウィンドウへモデルを切り替える選択肢があります。既定で1Mになるモデルは上の表のとおりで、プランごとの条件は同記事にまとめています。劣化の仕組みはClaudeのコンテキストロットにあります。
まとめ
持ち帰る判断は2つです。ターミナルで全文が見えるのは全体の2割に満たない(この例で約6分の1)ので、体感ではなく/contextの内訳で見ること。圧縮は要約だけでなく再注入の分も含めて評価することです。CLAUDE.mdの書き方そのものを見直したい場合はCLAUDE.mdを実用に引き上げる10のパターン、/compactの発火条件をさらに詳しく知りたい場合はClaude Code compactの発火条件と要約後に残る情報を合わせて読むと理解が深まります。