「Claude Code」
コンテキストウィンドウを制するものは開発を制する
Claude Codeの
Anthropicの公式ドキュメントから答えると
簡単に言うと、コンテキストウィンドウの中身は、セッションの中のユーザーのメッセージ
下記のコンテキストウィンドウの概念図をご覧ください。
一番左の
黄土色の
その次の
注目すべきはこのTurn2のInputとして、Turn1のInputとOutputが入っている、ということです。
そしてTurn2で生成されたClaudeの新しいレスポンスが次の
このように数珠繋ぎでコンテキストウィンドウが成り立ってることが分かります。
この連なりが最大で20万トークン、ということになります。ちなみに20万トークンとは大体小説一冊程度の文字数になります[2]。
Claude Codeがコンテキストウィンドウを使って開発を行うために、ここに何が入ってどう動作しているのかをエンジニアは理解する必要があります。
今回は、このコンテキストウィンドウの中身を掘り下げていきます。
拡張思考モードの際のコンテキストウィンドウ
Anthropicのブログで言及されている知見として、Ultrathinkなどで拡張思考モードで動作した際、その会話のOutputの中に拡張思考モード分のトークンが入りますが、次のTurnには引き継がれません[3]。
おそらく拡張思考モードは基本的に思考するための手順を一旦アウトプットして、Claudeの推論の精度を上げるためのものなので、その手順自体は次の会話には不要だと判断しているのだと考えられます。
コンテキストウィンドウの中身
上述のコンテキストウィンドウの概念図のInputの中にClaude Codeが動作するためのシステムプロンプトやツールが入っていたり、Outputの中にはClaudeが生成したコードなども入っています。
具体的な中身を見るために/contextコマンドを入力してみましょう。
/contextコマンドの実行結果
左上にある碁盤の目のようになっているのがコンテキストウィンドウの占有を視覚的に表したものです。
10マス✖10マスのアイコンになっており、何がどこまで占めて、どれだけ空いてるかがわかるようになっています。
Claude Codeが動くための30%の領域
まず注目すべきは動かせないシステムプロンプトとシステムツール
⛁ System prompt: 2.9k tokens (1.4%) ⛁ System tools: 19.4k tokens (9.7%)
システムプロンプト
「システムプロンプト」
ツール
「ツール」
「ツール」
ツールにはBash
これはClaude Codeの設定ファイルであるsettings(.local).jsonのpermission設定と対応しています。
"permissions": {
"allow": [
"Bash(mkdir:*)",
"Bash(npm init:*)",
"Read(//Users/user/other_project/**)",
]
}
詳しくは以下の公式ドキュメントをご覧ください。
https://
なお、ツールのpermissionを
Auto Compactの領域
次に注目すべきはAuto Compact
⛁ Autocompact buffer: 45.0k tokens (22.5%)
コンテキストウィンドウ自体が逼迫してきた際に、この領域を使ってこれまでの会話や出力内容を圧縮して収めるためのバッファです。
つまり余力を維持するために常に確保されていて、これが22.
Auto Compactの正体
Compact=
詳しい仕様は公開されていませんが、重要なコンテキストとして判断した会話の履歴の概要をまとめて次のInputの中に入力しています。
またあまり活用している例をみませんが、CLAUDE. Summary instructionsという項目を作るとその指示に応じて圧縮を行ってくれます。
# Summary instructions
コンパクトを使用する時は、コードの変更内容についてフォーカスしてください。
コンテキストウィンドウに常駐するもの
ここまで見て、20万トークンのうちすでに約30%がシステム側で使用されていることがわかりました。
ユーザーが利用できるのは残りの70%程度となりますが、もう少し詳細に見ていくとコンテキストウィンドウに常駐しているものの存在が明らかになってきます。
CLAUDE.md
まず、Claudeがセッション間で受け継ぐための記憶として機能する
これはセッション開始時に常に読み込まれてコンテキストに含まれます。
なので記憶を引き継がせるために仕様を入れすぎると、必然的に大きくなります。
CLAUDE.
⚠ Large CLAUDE.md will impact performance (93.7k chars > 40.0k) • /memory to edit
MCPサーバー
次はMCPサーバーです。
「MCPサーバー」
使わないスキーマ定義まで全部保持するため、たとえばGetメソッドだけ使いたいのに、PostメソッドやPutメソッドもずっと保持し続けてしまう、というような非効率な側面があります。
さらに、便利なのでいつでも呼び出したいからといって、ユーザー定義側にMCPサーバーを追加しすると無駄なコンテキストを占有し続けます。
また、Git連携のためにGitHubのMCPサーバーを使っている方も多いようですが、筆者としては、ghコマンドをインストールしClaudeには都度、
> ghコマンドでリポジトリを作って
などと指示した方が効率が良いと考えています。
カスタムエージェント
「カスタムエージェント」
カスタムエージェントを活用して、たとえばテストやフロントエンド、バックエンドやインフラの専門家といった様々な特色を持ったエージェントを独立した形で作ることが可能です。
カスタムエージェントはユーザーが指示しなくてもClaude Codeが自由に自己判断で呼び出して使えるようになっているため、常駐します。
ただし、カスタムエージェント自体の中身は単なるプロンプトであるため、占有率自体は大きくないことが多いです。
カスタムスラッシュコマンド
これは筆者も意外だったのですが、カスタムスラッシュコマンドも常駐します。
ただしカスタムエージェントと同じく中身はプロンプトであるため、占有は小さいことが多いです。
コンテキストウィンドウを占有しないもの
HooksやAgent Skillsは後述するようにコンテキストウィンドウを占有しません。
Hooks
任意のタイミングでコードを実行できる
おそらくHooksはシステムプロンプト内で発火のための記載はあると思われますが、そのコードの中身自体をClaudeが知っておく必要がないため、記載されていません。
本当にそうなのか、筆者が試しにsettings.
しかし、以下のようにコンテキストウィンドウが変わることはありませんでした。
Agent Skills
鳴物入りで登場したAgent Skillsですが、コンテキスト効率が高い設計になっているのもAnthropicが薦める理由です。
先述のMCPは呼び出すつもりがない定義も全て常時読み込んでしまうのに対して、常駐するのはSKILL.
たとえば、筆者は
---
name: lint-checker
description: エージェントがTypeScriptやJavaScriptファイルを編集・作成した後に、ESLintで構文チェックを行い、エラーがあれば自動修正を試みます。編集完了後のコード品質チェックに使用してください。
---
# Lint Checker Skill
このスキルは、ファイル編集後のコード品質を自動的にチェックし、問題があれば修正します。
## 使用タイミング
以下の状況で自動的に使用されます:
(省略)
SKILL.
要点としてはこの最初のディレクティブ部分だけがClaudeには読み込まれている、というのと、このnameとdescriptionには文字数の制約があり、nameは英数字のみ使用可能で最大64文字、descriptionは最大1024文字としなければなりません[5]。
ClaudeはSKILL.
そして、このnameとdescriptionを元に、いつ何のスキルを発動させるかを判断し、必要に応じてその下の手順の内容を読み込み、スキルを使用します。
このように非常にトークン効率の良い設計となっています。
IDE連携
もう一つお伝えしたいのはIDE連携で読み込まれるコンテキストです。
/ideコマンドを使ってIDE連携を行うと、VS CodeやCursorでユーザーが開いている内容やカーソルで選択している箇所が自動でClaudeに送られます。
そのため、うっかり何か別のファイルを開いている場合、全く関係ないコンテキストを送ることになります。
対話モードの右下に青文字でファイル名が出ていたら、コンテキストに含まれます。
筆者がなんとなく開いたNext.
もしこのページと関係ない処理をClaudeが行なっている場合、無駄に2,000トークンをClaudeに保持させ続けることになります。
また、IDE連携では、うっかり.envなどの秘匿情報も開いた状態にしておくと、それもコンテキストに含めてしまうことになりますので、セキュリティ上の注意が必要です。
このような事態を避けるため/ideコマンドを使ってIDEとの連携を切ってる方もいます。
ただ、もちろん便利な側面もあって、容易にファイル情報をClaudeに送れるのみならず、IDEからのTypeCheckエラーやLintエラー、型エラーなどもClaudeが必要に応じて取得できるようになります。
使い方をしっかりと理解して使うことが大事だと思います。
まとめ
今回は
LLM時代になって
今回はその内容を噛み砕いて掘り下げることで、皆さんの今後のClaude Codeの開発に生かしてもらえれば幸いです。
下記にカスタムツール群とコンテキスト占有について筆者なりにまとめてみました。
| 機能 | コンテキスト占有 | 動作タイミング | 発火 | 概略 |
|---|---|---|---|---|
| スラッシュコマンド | 小 | 明示的なコマンド実行時 | 確定的 | プロンプトをまとめておける |
| サブエージェント | あり | 明示的な呼び出し or 自動 | 確定的 or 確率的 | 特定の専門家を作れる |
| Hooks | なし | イベント時 | 確定的 | コマンドを実行できる |
| MCPサーバー | やや大 | 常時接続・ |
確定的 | 様々な機能と繋げられる |
| Agent Skills | 極小 | 自然言語で自動検出 | 確定的だがやや確率的 | 手順を与えられる |
コンテキストの占有を意識しながら、これらのツールを適切に使い分けるようにしましょう。
次回はCLAUDE.
