Claude Codeの内部動作を完全解剖 — Agentic Loopからコンテキスト読み込みまで
(mintlify.com)Claude Codeがターミナル上でどのように動作するのかを、公式ドキュメント(VineeTagarwaLによるMintlify整理版)を基準に要点だけまとめました。
Claude Codeはどのように動作するのか?
ひとことで言えば「読んで → 考えて → ツールを使って → 結果を見て → 繰り返す」というループです。
Agentic Loopの6段階
- ユーザーがターミナルにメッセージを入力(または
--print/ stdin で渡す) - システムプロンプトを組み立て — 現在の日付、gitの状態、CLAUDE.mdファイル、利用可能なツール一覧
- Anthropic APIを呼び出し → モデルが
tool_useブロック(ツール名 + JSON入力)を生成 - 権限チェック — 自動承認 / 確認要求 / ブロックのいずれかを決定
- ツールを実行 → 結果(ファイル内容、コマンド出力など)を
tool_resultとして会話に追加 - 結果を受け取ったモデルが追加のツール呼び出しまたは最終応答を返す — ツール呼び出しがなくなるまで繰り返し
このループはローカルのターミナルプロセス内でのみ動作します。WebFetch、WebSearch、MCPサーバーのように明示的に外部を呼び出すツールでない限り、ファイル・シェル・認証情報がマシンの外に出ることはありません。
コンテキストはどのように作られるのか?
会話開始時に2つのブロックを組み立て、すべてのAPI呼び出しの前に付加します。
- システムコンテキスト — 現在のブランチ、直近5件のコミット、
git status --shortの結果(2,000文字を超える場合は切り詰め) - ユーザーコンテキスト — CLAUDE.mdメモリファイル(4段階の階層探索)、今日の日付(
Today's date is YYYY-MM-DD)
両方のブロックはlodash/memoizeによって会話単位でキャッシュされます。setSystemPromptInjection()が呼ばれると、キャッシュは即座に初期化されます。
権限モデル — ツールはいつ実行されるのか?
| 結果 | 動作 |
|---|---|
allow |
即時実行し、結果を会話に追加 |
ask |
一時停止 → 確認ダイアログを表示 |
deny |
拒否 → モデルにエラーを返す |
- bypassPermissionsモード: すべてのチェックをスキップ
- acceptEditsモード: ファイル編集は自動承認、bashは引き続き確認を要求
- Read、Glob、Grepのような読み取り専用ツールは、すべてのモードでデフォルトで自動承認
サブエージェント(Taskツール)
ClaudeはTaskツール(AgentTool)でサブエージェントをスポーンできます。サブエージェントは隔離された会話と、必要に応じて制限されたツールセットで独自のAgentic Loopを回し、完了すると親エージェントに結果を返します。ローカル(インプロセス)またはリモートコンピュートで実行できます。
会話の保存と復元
会話は ~/.claude/ にJSONトランスクリプトファイルとして保存されます。
--resume <session-id>または--resume単独で以前の会話を再開- 再開時: 全メッセージ履歴を読み込み、CLAUDE.mdファイルを再探索し、権限モードは設定のデフォルト値にリセット
- 長い会話は定期的にコンパクションを実施 — 古いメッセージを要約してコンテキストウィンドウを管理。完全な元トランスクリプトはディスクに保持
クエリエンジンの役割
各「ターン」は query.ts が駆動します。
- トークンストリーミングをターミナルにリアルタイム出力
tool_useブロックを適切なハンドラーにディスパッチ- ターンごとのトークン・ツール呼び出し予算を管理
- コンテキストウィンドウがいっぱいになるとコンパクションをトリガー
- 各ツールは
maxResultSizeChars属性を持つ — 結果がこの上限を超える場合は一時ファイルに保存し、モデルにはファイルパスのみを渡す(コンテキストウィンドウのオーバーフロー防止)
原文: How Claude Code works — Mintlify
参考: VineeTagarwaLがClaude Code公式ドキュメントをMintlifyで再整理した非公式ミラー文書です。
1件のコメント
23年から、ReActの構造は大きく変わっていないんですね。