Claude Codeのシステムプロンプトの肥大化を解消する方法
本記事では、Claude Codeのリクエスト毎に送信される不要なツール定義や命令などの冗長部分を特定し削除する6つのステップを紹介します。/contextコマンドやログプロキシを使用して測定し、disable*フラグとdenyルールを設定することで、トークン消費を大幅に削減できます。
Claude Codeにメッセージを送るたびに、あなたには見えないペイロードが送信されています。それはあなたのプロンプトではなく、その周辺の仕組み、すなわちツール定義、スキルカタログ、あなたが使ったことのない機能のシステム指示です。これらは毎回のリクエストで送信され、ターンごとに課金されます。
これらの大部分は削除可能です。以下の6つのステップで、リクエストの実際の内容を確認し、Claude Codeがすでに持っている2つの設定を使って削減する方法を示します。筆者の場合、1ターンあたり数万トークン削減できました。
- /contextでコンテキストを測定する
任意のClaude Codeセッションで/contextと入力します。コンテキストウィンドウがカテゴリ別(システムプロンプト、システムツール、MCPツール、メモリファイル、メッセージ)に表示され、それぞれのトークン数と割合が示されます。変更前に今の数値を記録し、最後のステップで比較します。なお、/contextはツールをグループとして表示し、個別のサイズはわかりません。次のステップでそれを確認します。
- ログプロキシで最大の原因を見つける
Claude CodeはHTTP経由でAnthropic APIと通信するため、リクエストをそのまま転送し、レスポンスをストリーミングで返しつつ内容を記録するプロキシを挟むことができます。CLIは気づきません。proxy.mjs(1ファイル、依存関係なし、Node標準モジュールのみ使用)を入手し、node proxy.mjsで実行します。別のターミナルでClaude Codeをそのプロキシに向けます:ANTHROPIC_BASE_URL=http://localhost:8787 claude。各リクエストは ./logs/ にMarkdownファイルとして書き込まれ、端末にはランク付きテーブルが表示されます(例:「[agent-proxy] 69 tools · 154,946 tool bytes · 65,538 real input tokens」)。Markdownファイルを開くと、各ツールの完全なスキーマ、システムプロンプト、メッセージ履歴など、モデルが受信するリクエスト全体を確認できます。ランクテーブルは作業リストとして使え、使っていないツールを正確に削除できます。
これでペイロードの内容とどの部分が大きいかがわかりました。次の2つのステップで削除します。両方の設定は設定ファイルにあります。~/.claude/settings.json(全プロジェクト)または.claude/settings.json(プロジェクト個別)です。
- disable*フラグで機能全体をオフにする
一部の機能は、ツールと命令の一式を伴います。1つのフラグで機能ごとオフにできます:
- disableBundledSkills:Anthropicがバンドルする全スキール(dataviz、review、initカタログなど)を一度に削除しますが、スラッシュコマンドは入力可能なまま残ります。
- disableWorkflows:マルチエージェントのWorkflowツールを削除します。通常、テーブル内で最大の項目です。
機能が価値を生んでいないと感じたら、該当するフラグを使いましょう。
- denyルールで個別ツールを削除する
個別のツールには、permissions.denyルールでツール名を裸で指定すると、そのツールの定義がペイロードから削除され、Claudeは認識しなくなります: { "permissions": { "deny": ["NotebookEdit", "CronCreate"] } } 注意点:裸の名前("NotebookEdit")はツールを削除しますが、スコープ指定ルール(例:"Bash(rm *)"、"Skill(dataviz)")は該当する呼び出しをブロックするものの、定義はペイロードに残ります。リクエストを削減するには裸の名前を使ってください。前のステップのフラグは大まかな第一段階であり、これらのdenyルールでフラグがカバーしていない個別ツールをピンポイントで削除します。 一部のスキルだけ残したい場合、disableBundledSkillsは全か無かです。個別に削除するには、skillOverridesでスキルを"off"(ペイロードから削除)または"user-invocable-only"(入力は可能だがClaudeが見えない)に設定します。
- 完全な設定を適用する
以下は前の2ステップで得られた設定です。肥大化を削減するフラグとdenyルールをまとめ、~/.claude/settings.jsonにそのまま貼り付けられます: { "permissions": { "deny": [ "EnterPlanMode", "ExitPlanMode", "DesignSync", "NotebookEdit", "SendMessage", "PushNotification", "RemoteTrigger", "ReportFindings", "ScheduleWakeup", "AskUserQuestion", "CronCreate", "CronDelete", "CronList" ] }, "disableBundledSkills": true, "disableWorkflows": true, "disableRemoteControl": true, "disableClaudeAiConnectors": true, "disableArtifact": true } これはメニューであり、処方箋ではありません。自分のペイロードをまず確認してから削除すべきものを決めてください。プランモードを使うなら残し、ノートブックを書くならNotebookEditを残すなど。上記のリストは筆者が削除したものです。 注意:一見無駄に見えても、バックグラウンドジョブやマルチエージェント実行に必要な仕組み(タスクツール、Workflow、ワークツリーツール)もあります。それらを使っているなら残しましょう。
- /contextで再測定する
Claude Codeを再起動して設定を再読み込みし、再度/contextを実行します。ツール数とトークン合計が減少しているはずです。 その差が、以前は毎ターン送信していたが今は送信していないトークンです——リクエストが安くなり、モデルがあなたの問題に到達する前に読み飛ばす必要のある内容も減ります。