Yyatmita

Claude Code のシステムプロンプトを覗く・足す・置き換える

Claude Code のシステムプロンプトをカスタマイズするための実用ガイド。フラグ 4 つの体系、append と replace の判断基準、output styles とサブエージェント単位の system_prompt、SDK との非対称、20 万トークンのコスト崖、Piebald のシステムプロンプト抽出リポジトリの読み方まで。

自分のエージェント基盤を組む#agent-stack#claude-code#system-prompt#prompt-engineering

Claude Code を本来想定された「コーディングアシスタント」以外の用途に使い始めると、デフォルトの振る舞いが微妙にズレてくる。結論先出しで簡潔すぎる出力、「不要なファイルを作るな」というミニマリズム、コードレビューのトーン。コーディングには最適化されているが、用途を広げると邪魔になる場面がある。本稿は Claude Code の システムプロンプト をどう覗き、どう足し、どう置き換えるかを、フラグの体系から実用ガイドまでまとめる。CLI 側で完結する範囲の話で、別レイヤーの仕組み(CLAUDE.md や /memory)とは混同しないように扱う。


1. システムプロンプトとは何で、どこを触れるのか

Claude Code を起動すると、CLI 側の harness が裏でモデルへ渡すプロンプト一式を組み立てる。その先頭に置かれるのが システムプロンプト で、内容としては identity と security の宣言、タスク実行の方針、ツール使用ポリシー、出力スタイル、行動の慎重な実行(可逆性と blast radius)などが地の文で書かれている。サイズはおおむね 2.5K〜3.6K トークン。

この本体は npm パッケージ @anthropic-ai/claude-code の中にコンパイル済みで埋まっており、公式には公開されていない(claude.ai のチャット用システムプロンプトは公開されているが、Code 用は別物で非公開)。ただし CLI からは、起動時の引数で 追記 または 置換 ができる。これが本稿で扱う範囲。

注意したいのは、CLAUDE.md/memory で扱う project memory / user memory は システムプロンプト操作とは別の機構 だという点。これらは Claude Code が起動時に project context として読み込む仕組みで、結果としてモデルに渡される文字列の一部にはなるが、本稿で扱うシステムプロンプト操作(フラグや output styles)と同じ軸では並べられない。ここを混同しないために、本稿では CLAUDE.md には立ち入らない。


2. フラグは 4 つ、2 系統

システムプロンプト関連フラグは大きく 追記 (append)置換 (replace) の 2 系統で、合計 4 つ。

フラグ系統用途
--append-system-prompt <text>追記デフォルトの末尾に文字列を追加
--append-system-prompt-file <path>追記ファイルから追記内容を読み込み
--system-prompt <text>置換デフォルトを丸ごと差し替え
--system-prompt-file <path>置換ファイルからシステムプロンプト全体を読み込み

ルール:

  • 置換系 (--system-prompt / --system-prompt-file) は 排他 ——同時には指定できない
  • 追記系はどちらの置換系とも 併用可能
  • 対話モード (claude) と非対話モード (claude -p) の 両方 で効く

使い分けの基準はひとつだけで、Claude Code のデフォルトの「コーディングアシスタント」という人格・ツール指針・コーディング規約を残すかどうか。残すなら追記、根本的に違う人格にするなら置換。


3. append が基本、replace は例外

実用上、9 割は追記で済む。理由は、Claude Code のデフォルトプロンプトには「コーディング指針」だけでなく、ツールの使い方(cat ではなく Read、sed ではなく Edit)、可逆性と blast radius を評価して破壊的操作の前に確認する、といった 運用上欠かせない足場 が含まれているから。これを丸ごと捨てると、コーディング以外の作業でも巻き添えで損をする。

追記で十分なケース:

# 単発レビューで観点を足す
claude -p "Review this auth code" \
  --append-system-prompt "SQL インジェクション・XSS・トークン管理も必ずチェックすること"
 
# セッション全体でフォーカスを維持する
claude --append-system-prompt-file ./prompts/postgres-focus.md

置換が要るのは、人格と権限モデルがデフォルトと根本的に違うとき だけ。具体的には:

  • 人間が監視しないパイプライン内で非コーディングタスクを回す
  • サブエージェントの中で「コーディングエージェントとして振る舞ってほしくない」隔離ノード(例: 外部ドキュメントを読むだけの reader)を作る

このどちらにも当てはまらないなら、追記で書く。


4. 永続化したいときは output styles

「同じ append を毎回渡すのは面倒」となったら、システムプロンプト操作の範疇では output styles が選択肢になる。

output styles は /output-style で対話的に作成・切り替えでき、~/.claude/output-styles/ 配下に markdown で保存される。Anthropic の glossary が明示しているとおり、これは システムプロンプトを modify する機構 だが、--system-prompt の単純置換とは挙動が違う。具体的には、デフォルトのシステムプロンプトのうち ソフトウェアエンジニアリング特化の部分をオフにして、その上にスタイル指示を載せる ように動く。Claude Code をコーディングアシスタント以外の人格に「役替え」させるための仕組みで、Default / Proactive / Explanatory / Learning がビルトインで提供されている。

カスタム output style は frontmatter 付きの markdown で書く:

---
name: Diagrams first
description: Lead every explanation with a diagram
keep-coding-instructions: true
---
 
When explaining code, architecture, or data flow, start with a Mermaid diagram showing the structure, then explain in prose.

keep-coding-instructions: true を入れるとデフォルトのコーディング指示を 保持したまま スタイル指示をレイヤーできる。落としたいなら省略する(デフォルト false)。--system-prompt の「全消し」と --append-system-prompt の「追記」のあいだに、output styles という 「ソフトウェアエンジニアリング層だけ抜き差しできる」中間モード があると考えると整理しやすい。

サブエージェント定義 (.claude/agents/*.md) にも system_prompt 相当のフィールドがあるが、これは「現在のセッションのシステムプロンプトを変える」のではなく、サブエージェントが起動されたときに、それ自身が独自に持つ system prompt を定義する別レイヤーの仕組みだ(公式 docs: 「Subagents... do not receive the parent's system prompt」)。本稿の射程(CLI 側で完結する範囲のシステムプロンプト操作)とは別軸の話なので、ここでは扱わない。


5. Agent SDK は逆方向

ここまでは Claude Code CLI の話。Agent SDK(旧 Claude SDK) は 逆方向 の挙動をする。

サーフェスデフォルト
Claude Code CLIフル機能のシステムプロンプト(コーディング指針 + ツール指針 + 安全指示)
Agent SDK必須のツール指示 のみ(コーディング規約・応答スタイル・プロジェクト文脈は含まない)

SDK で Claude Code 相当のフル機能が欲しければ、systemPrompt: { type: "preset", preset: "claude_code" } を明示的に指定する。逆に言うと、SDK は ゼロから自分の harness を組む ための器で、CLI の足場を継承しないのがデフォルト。

両方を使い分けていると、「CLI で --system-prompt を空に置換」と「SDK でプリセット未指定」がほぼ同じ状態になる——ここがハマりやすい。CLI と SDK でデフォルトの厚みが違う点は意識しておく。


6. 容量と 20 万トークンの崖

システムプロンプト単体には専用の容量制限はない。Claude のコンテキストウィンドウ(Opus 4.7 / Sonnet 4.6 / Fable 5 は 1M、Haiku 4.5 は 200K)を、システムプロンプト・ツール定義・会話履歴・出力予約分で共有する形になる。

実用上、システムプロンプトのサイズはほぼ問題にならない:

  • Claude Code のデフォルトのシステムプロンプト本文は 2.5K〜3.6K トークン
  • カスタム追記を 1〜2K 足しても誤差
  • 重いのはツール定義の方 (14K〜17K トークン)

ただし注意点が 2 つ:

(a) 20 万トークンの崖: Claude Code では入力プロンプトが 20 万トークンを超えると、標準 API レートの 2 倍 で課金される。1M ウィンドウがあっても、ここを超えた瞬間に単価が跳ねる。プロンプト本体より、流し込む資料の方で当たりやすい。

(b) prompt caching: 静的なシステムプロンプトは prompt caching に乗せると割引が効く。output styles で固定するなら、サイズより「キャッシュが効く形で固定する」方が得。


7. システムプロンプトと安全層

--system-prompt で置換すれば倫理的な歯止めが外れるのでは」という直感への補足。

歯止めには性質の違う 2 層がある:

  1. 訓練された傾向(重み側・編集不可): 深刻な害(マルウェア・武器・CSAM)への拒否。これはシステムプロンプトに書かれていてもいなくても残る
  2. 明示されたポリシー(プロンプト側・編集可能): wellbeing の細則、児童保護のエッジケース、トーン、製品レベルの磨き込み

--system-prompt で置換して消えるのは (2) だけ で、(1) は残る。検証は簡単で、Claude Code のシステムプロンプトを空に置換しても、土台の API モデルは依然として明白に有害な要求を拒否する。

本当に危ないのは「システムプロンプト置換」単体ではなく、置換 × 権限緩和 × 信頼できない入力 の組み合わせだ:

  • カスタムプロンプトで「確認なしで実行しろ」的な指示を仕込む
  • --dangerously-skip-permissions で human-in-the-loop を外す
  • そこに外部から汚染された文脈(WebFetch で読んだドキュメント等)が流れ込む

これが揃うと、訓練側の床は残っていても運用レベルの事故(意図しないファイル操作、データ漏洩)は普通に起きる。システムプロンプトはタスク指針として扱い、権限はランタイムのゲートとツール境界で担保する——この二層分離が設計の正解だ。

Claude Code のデフォルトプロンプトの "Executing actions with care" セクション(可逆性と blast radius の話)が、まさにこの哲学を地の文で書いている。安全面からも、原則として 置換ではなく追記 が結論になる。


8. デフォルトの中身を学ぶには——Piebald のリポジトリ

「で、そもそも Claude Code のデフォルトのシステムプロンプトには何が書いてあるのか」を知りたくなる。公式公開はないが、第三者の抽出リポジトリ Piebald-AI/claude-code-system-prompts が、@anthropic-ai/claude-code npm パッケージのコンパイル済みバンドルから可読な markdown に抽出している。リリースの数分以内に追従していて、各バージョンの CHANGELOG も付いている。

このリポジトリは大量のファイルが並んでいて最初は圧倒されるが、ファイル名の prefix で分類 できる:

prefix性質
system-prompt-*本体のシステムプロンプト断片(常駐)
system-reminder-*会話中に動的に差し込まれる通知(常駐ではない)
agent-prompt-*サブエージェント(Plan / Explore / Task 系)のシステムプロンプト
tool-description-*組み込みツールの説明

カスタマイズ目的なら system-prompt-* を読めばいい。読むべき断片はだいたい以下:

  • system-prompt-doing-tasks-software-engineering-focus ——「ユーザーの依頼は基本ソフトウェアエンジニアリングだと解釈せよ」という大元の前提
  • system-prompt-communication-style / system-prompt-tone-and-style-concise-output-short ——ターセな出力トーン
  • system-prompt-executing-actions-with-care ——可逆性と blast radius、破壊的操作の前の確認
  • system-prompt-censoring-assistance-with-malicious-activities ——「悪意ある要求の拒否 / 認可されたセキュリティ作業は可」

自分が「上書きすべき」「温存すべき」と判断した境界線が、ここを読むとそのまま地の文として確認できる。

Piebald のリポジトリは npm パッケージから正規ダウンロード可能な配布物を解析しているので、技術的にはリバースエンジニアリングのうち最も穏当な部類だ。ただし Anthropic の規約には RE 禁止条項があり、プロンプト本文を verbatim でブログに長文転載するのは引用要件(主従関係・明瞭区別性)を満たしにくい。学習のための閲覧と、自分の文章での要約・参照に留めるのが安全 で、本稿もファイル名と論点の構造紹介に絞っている。


9. まとめ

Claude Code のシステムプロンプトを触るときの整理:

  • システムプロンプト操作は 4 つのフラグ: append × 2、replace × 2。置換系は排他、追記系は併用可
  • 9 割は追記で済む。デフォルトの足場(ツール指針・可逆性のガード)を温存できるので
  • 永続化したいなら output styles(ソフトウェアエンジニアリング層だけ抜き差しできる中間モード)。keep-coding-instructions でコーディング指示の保持/破棄も選べる
  • SDK は逆方向: デフォルトが最小限なので、欲しければ claude_code プリセットを明示
  • 容量は気にしなくていい が、20 万トークン超の 2 倍課金と、ツール定義側の重さは意識する
  • 安全は権限境界で担保する。プロンプトは指針、ゲートはランタイム
  • デフォルトの中身を読みたいなら Piebald リポジトリ。ただし verbatim 転載は規約・著作権の論点があるので学習・参照用に留める
  • CLAUDE.md は別の話: project memory の機構なので、システムプロンプト操作とは別軸で扱う

システムプロンプトは Claude Code という他人の harness の中のスロットでしかない。本気で自分流に作り変えたくなったら、それはもうカスタマイズの問題ではなく、Agent SDK 層に降りて自分の harness を組む フェーズの話になる。本稿は CLI 側で完結する範囲のガイドだが、その境目を踏み越える瞬間がいつ来るかは、各自のスコープと野心次第だ。