.claude/settings.json に書いたはずのルールが、なぜか効かない」。Claude Codeをチームで使いはじめた方から、いちばん多く届く相談がこれです。

書き方を間違えたわけではないことがほとんどです。同じキーが、別の置き場所にも書かれている。それだけのことが起きています。Claude Codeの設定ファイルは1か所ではなく、置き場所が5つに分かれているからです。

この記事では、優先順位の決まり方と、値の型によって競合の結果が変わる仕組みを公式ドキュメントから整理します。そのうえで、チームに配る設定と手元だけの設定をどこで分けるかまで持っていきます。

こんなふうに調べていませんか

  • .claude/settings.json に許可ルールを書いたのに、動きがまったく変わらない
  • 同僚の環境では止まる操作が、自分の環境では止まらない
  • チームに配る設定と、自分の手元だけの設定を分ける基準が分からない

この記事を読み終えたときに手に入るもの

  • 5つの置き場所のうち、どれが勝つかを自分で追えるようになります
  • スカラー値と配列値で結果が変わる理由が、図で分かります
  • 明日から、設定を書く場所を迷わず選べるようになります

結論30秒でわかる、この記事の結論

  • 優先順位はスコープの種類だけで決まります。 書いた時刻の新しさは関係しません。
  • 競合の結果は値の型で変わります。スカラー値は上位の層が勝ち、配列値は全層が合算されます。
  • deny だけは別枠です。どの層のdenyも、どの層のallowより先に評価されます。
勝ち負けは「場所」「型」「別枠」で決まります同じキーが2か所にあるとき、勝つのは上の層です勝ち負けは「場所」「型」「別枠」で決まりますその1置き場所は5つある誰に効かせたいかで分かれているその2勝ち方は値の型で変わる上書きされる型と、足し算される型その3denyだけは別枠許可より先に読まれる鈴木さん同じキーが2か所にあるとき、勝つのは上の層です
勝ち負けは「場所」「型」「別枠」で決まります — 同じキーが2か所にあるとき、勝つのは上の層です

この記事は、AIエージェントを自分の手で動かしている方の会話をはさみながら進めます。若葉さんが言葉の意味を、高梨課長が運用の手ざわりを聞き、鈴木さんが答えます。

01Claude Codeのsettings.jsonは5つもあって、AIエージェントはどれを読んでいるんですか?

Claude Codeの設定は、ユーザー・プロジェクト共有・ローカル・コマンドライン引数・Managedという5つの置き場所に分かれています。分かれている理由は「誰に効かせたい設定なのか」が置き場所ごとに違うからです。

若葉さん
若葉さんの発言

5つもあるんですね…。設定ファイルって、プロジェクトの.claude/に1つ置けば済むものだと思っていました。

鈴木さん
鈴木さんの発言

そう思って書きはじめると、たいてい迷子になりますね。5つは機能の違いではなくて、効かせたい相手の違いで分かれているんですよ。自分だけなのか、チーム全員なのか、組織全体なのか。そこが違うだけです。

Managed以外の4スコープは、ファイルパスが決まっています。ユーザー設定は~/.claude/settings.json、プロジェクト共有設定は.claude/settings.json、ローカル設定は.claude/settings.local.jsonです。コマンドライン引数は、セッション起動時に--settingsで渡します。

Managedだけは事情が違います。サーバー配信・MDM・ファイル配置(macOSは/Library/Application Support/ClaudeCode/)と、複数の経路を持ちます。どの経路で配信されても、開発者側からは上書きできません(出典: Claude Code公式ドキュメント)。

置き場所を、会社の決めごとに置きかえると5つの違いは、効かせたい相手の広さの違いです置き場所を、会社の決めごとに置きかえると5つの違いは、効かせたい相手の広さの違いです会社でいうとClaude Codeでいうと全社に配られる就業規則Managedその打ち合わせだけの申し合わせコマンドライン引数自分の机に貼った付箋ローカル部内で回覧する運用ルールプロジェクト共有どの部署に行っても持ち歩く手帳ユーザー
置き場所を、会社の決めごとに置きかえると — 5つの違いは、効かせたい相手の広さの違いです

この章のまとめ

置き場所が5つあるのは、設定の種類が5つあるからではありません。同じ設定を、誰に効かせたいかで置き場所が分かれています。

02settings.jsonの優先順位は、エージェントが後から書いた方を選ぶわけではないんですか?

ここを誤解したまま設定を足していくと、いつまでも意図した動きになりません。Claude Codeは、同じキーが複数のsettings.jsonにあっても、書いた時刻の新しさでは選びません。優先順位はスコープの種類だけで固定されています(出典: Claude Code公式ドキュメント)。

優先順位スコープ主な置き場所誰に効くかGitで共有するか
1(最優先)Managedサーバー配信・MDM・managed-settings.json組織の全員(配信方式によっては端末単位)管理者が配布(開発者は編集不可)
2コマンドライン引数--settings <file> などセッション起動時の指定そのセッションだけされない(一時的)
3ローカル.claude/settings.local.json自分・このプロジェクトだけされない(Git管理外が前提)
4プロジェクト共有.claude/settings.json全共同作業者される(コミット対象)
5(最下位)ユーザー~/.claude/settings.json自分・全プロジェクトされない(ホーム配下)
上に積まれた層ほど、強く効きます並びは固定で、書き直しても入れ替わりません上に積まれた層ほど、強く効きます並びは固定で、書き直しても入れ替わりませんManaged組織の全員に効き、下から動かせないコマンドライン引数起動したそのセッションだけに効くローカル自分の、このプロジェクトだけに効くプロジェクト共有共同作業者の全員に効くユーザー自分に、どのプロジェクトでも効く土台が弱く、上へ行くほど強い。書いた時刻は並びに影響しません鈴木さん下から積み上げても、上の層には届きません。まず上を見てください
上に積まれた層ほど、強く効きます — 並びは固定で、書き直しても入れ替わりません

順位は固定なので、ユーザー設定をどれだけ丁寧に書き直しても、プロジェクト共有設定の値には勝てません。逆にプロジェクト側からも、Managedの値は一切上書きできません(出典: 同)。

つまり「効かないから書き足す」は、たいていの場合、遠回りです。書き足す前に、上の層に同じキーが無いかを見に行くほうが早く終わります。

この章のまとめ

勝ち負けを決めているのは、書いた順でも書いた量でもありません。そのファイルがどのスコープに属しているかの一点です。

03Claude Codeのsettings.jsonを、AIエージェントが本当に読んでいるかはどこで分かりますか?

順位の話に入る前に、そもそも読み込まれているかを確かめます。読み込まれていないファイルは、いくら書いても順位の勝負に参加していません。

まず、非Managedの3スコープが実在するかを見ます。

ls -la ~/.claude/settings.json
ls -la .claude/settings.json
ls -la .claude/settings.local.json

3つとも存在しなくてもエラーにはなりません。存在しないスコープは「そのスコープには何も定義されていない」という扱いになり、優先順位の判定から静かに外れます(出典: 同)。エラーが出ないので、無いことに気づけないのがやっかいなところです。

思ったとおりに動かないときの、たどり方書き足す前に、この順で範囲をせばめます思ったとおりに動かないときの、たどり方書き足す前に、この順で範囲をせばめます1そのファイルはあるか無くてもエラーは出ません2一覧に名前が出ているか出ていなければ土俵の外です3上の層に同じキーは無いかあればそちらが答えです
思ったとおりに動かないときの、たどり方 — 書き足す前に、この順で範囲をせばめます

04/statusに出ないsettings.jsonは、AIエージェントが読んでいないということですか?

はい、そう考えて差し支えありません。読み込まれた設定ソースは、起動中のセッションで/statusを実行すると「Setting sources」という行に一覧表示されます(出典: 同)。この一覧に出ないスコープは、そのセッションでは1件も読み込まれていません。

バージョンの確認はclaude --versionです。Managed設定は組織のIT担当者が配布する前提のため、開発者のターミナルからは通常見えません。存在すれば/statusの一覧に、配信経路つきで表れます。構造そのものは$schemaフィールドで検証できます(出典: 同)。

「届いている」と言えるのは、この状態ですどれか1つでも欠けると、書いた内容は無視されます「届いている」と言えるのは、この状態ですどれか1つでも欠けると、書いた内容は無視されます見る場所一覧に名前がある起動中のセッションが拾えている見る場所パスが想定どおり置いたつもりの場所と一致している見る場所構造が検証を通る壊れた書式は読み飛ばされる
「届いている」と言えるのは、この状態です — どれか1つでも欠けると、書いた内容は無視されます

この章のまとめ

書いたのに効かないときは、順位を疑う前に土俵に上がっているかを見ます。一覧に出ていないファイルは、勝ち負け以前の状態です。

05同じ許可をsettings.jsonに書いたのに、AI社員の片方だけ効かないのはなぜですか?

ここが本記事の核心です。優先順位は「勝った1つのファイルが設定を丸ごと決める」という仕組みではありません。キーの型によって、競合したときの挙動が変わります(出典: Claude Code公式ドキュメント)。

若葉さん
若葉さんの発言

同じsettings.jsonに書いたのに、片方は上書きされて、もう片方は両方とも生きている…。書き方を間違えたんでしょうか。

鈴木さん
鈴木さんの発言

いえ、たぶん正しく書けています。値が1つしか置けない棚と、いくつでも入る箱があると思ってください。棚は上の層の人が置いたものだけが残って、箱は全員のぶんが入るんです。

設定キーの型競合したときの挙動具体例
スカラー値(文字列・真偽値・数値)優先順位が最も高いスコープの値だけが効くdefaultModethememodel
配列値(多くの設定)全スコープの値を合算し、重複を除いて全部が有効になるpermissions.allowpermissions.denysandbox.filesystem.allowWrite

公式ドキュメントはspinnerTipsEnabledを例に挙げています。ユーザー設定でtrue、プロジェクト共有設定でfalseなら、プロジェクトの値が適用されます(出典: 同)。上位が勝ち、下位は消えます。

型が違うと、競合の結末が変わります1つしか置けない棚か、いくつでも入る箱か型が違うと、競合の結末が変わります1つしか置けない棚か、いくつでも入る箱か1つしか置けない型上の層の値だけが残る下の層の値は消える見た目には何も起きない既定の動き・テーマ・モデルなどいくつでも入る型全部の層の値を持ち寄る同じものは1つにまとめる誰の指定も消えない許可・確認・拒否のルールなど
型が違うと、競合の結末が変わります — 1つしか置けない棚か、いくつでも入る箱か

06配列値が合算されると、AIエージェントに配ったsettings.jsonの許可はどうなりますか?

配列値は逆に足し算になります(出典: 同)。プロジェクト共有設定とユーザー設定を同時に読み込む例で確かめます。

// .claude/settings.json(プロジェクト共有)
{
  "permissions": {
    "deny": ["Bash(terraform apply*)"]
  }
}
// ~/.claude/settings.json(ユーザー)
{
  "permissions": {
    "deny": ["Bash(curl *)"],
    "allow": ["WebFetch(domain:example.com)"]
  }
}

この2つを同時に読み込むと、denyは合算され、terraform applycurlの両方が拒否されます。allowWebFetchは優先順位を比べる相手がいないため、そのまま有効になります。

別々に書いた拒否は、1つの結果へ集まります重なった指定はまとめられ、残りはそのまま生きます別々に書いた拒否は、1つの結果へ集まります重なった指定はまとめられ、残りはそのまま生きます共有側に書いた指定手元に書いた指定作業者の全員へ配られる自分の環境にだけ足される持ち寄った結果持ち寄った結果 : 両方とも止まる / 重なりは1つにまとめられる比べる相手がいない指定は、そのまま有効なまま残ります
別々に書いた拒否は、1つの結果へ集まります — 重なった指定はまとめられ、残りはそのまま生きます

この章のまとめ

「片方だけ効かない」の正体は、スカラー値だから上書きされたか、配列値だから合算されて両方効いているかのどちらかです。型を見れば説明がつきます。

07配列なのに合算されないsettings.jsonの設定は、AIエージェントの何を守るためですか?

配列はすべて合算される、と覚えると次でつまずきます。順序に意味を持つ配列は、合算すると意味が壊れるためです。

代表例がfallbackModelです。ユーザー設定とプロジェクト共有設定の両方に書いた場合を見ます。

// ~/.claude/settings.json(ユーザー)
{ "fallbackModel": ["claude-opus-5", "claude-haiku-4-5"] }
// .claude/settings.json(プロジェクト共有・こちらが優先)
{ "fallbackModel": ["claude-sonnet-5"] }

プロジェクト共有の方が優先順位で上のため、最終的なfallbackModel["claude-sonnet-5"]という1件だけのチェーンになります。ユーザー設定の2件は合算されず、丸ごと無視されます(出典: 同)。

1つのキーが確定するまでの分かれ道型を見て、例外かを見て、置き場所を見ます1つのキーが確定するまでの分かれ道型を見て、例外かを見て、置き場所を見ます1いくつでも入る型かいいえなら、上の層の値で確定2並び順に意味があるかあるなら、上の層のものを丸ごと採用3その置き場所で有効か無効な場所に書くと何も起きない鈴木さん足し算になるはずが、丸ごと入れ替わる。ここだけ覚えておいてください
1つのキーが確定するまでの分かれ道 — 型を見て、例外かを見て、置き場所を見ます

もう1種類、特定のスコープでは書いても何も起きない値があります。defaultMode: autoはプロジェクト設定・ローカル設定では無視され、~/.claude/settings.jsonに書く必要があります(出典: 同)。skipDangerousModePermissionPromptも同じ理由でプロジェクト設定では無視されます。

08denyは、AI導入の安全弁としてsettings.jsonの優先順位より強いんですか?

権限ルール(allow・ask・deny)には、階層の優先順位より強い決まりがあります。どのスコープのdenyも、他のどのスコープのallowより先に評価されます(出典: Claude Code公式ドキュメント)。

高梨課長
高梨課長の発言

ということは、私がユーザー設定で止めておいた操作を、プロジェクト側の許可で開けてしまうことは無いんですね。

鈴木さん
鈴木さんの発言

はい、そこは逆向きも同じです。チームで止めた操作を、個人の許可で開けることもできません。止める側が先に読まれる、と覚えておくと事故が減りますよ。

ユーザー設定で許可した操作でも、プロジェクト共有設定が拒否すれば拒否されたままです。逆に、ユーザー設定の拒否をプロジェクト側の許可で覆すこともできません。allowとdenyは同じ土俵で戦っていない、と考えると分かりやすくなります。

止める指定は、許す指定より先に読まれますどちらか一方が止めていれば、結果は止まります止める指定は、許す指定より先に読まれますどちらか一方が止めていれば、結果は止まりますどちらも許している操作は通りますもう一方だけが止めている自分が許していても止まります自分だけが止めている相手が許していても止まりますどちらも止めている止まります自分の置き場所での指定もう一方の置き場所での指定
止める指定は、許す指定より先に読まれます — どちらか一方が止めていれば、結果は止まります

権限そのものの配分(何をallowにして、何をaskで止めるか)は、この記事の範囲を越えます。配分の考え方と設定例は『Claude Codeの権限設定|AIエージェントに任せる範囲と3列の配分』が扱います。危険操作を実行前に遮断する仕組みは『Claude CodeのPreToolUseで危険コマンドを遮断する4つの判定』が扱います。

この章のまとめ

denyは階層の外側にいます。どこか1か所で止めれば、他のどこで許可しても止まったままです。安全側に倒れる設計になっています。

09チーム共有と個人用で、AI社員のsettings.jsonはどこに線を引くんですか?

階層と競合ルールが分かると、次に迷うのは配置です。公式ドキュメントは、4つの非管理スコープの使い分けを示しています(出典: 同)。

高梨課長
高梨課長の発言

危険な操作の拒否ルールは、とりあえず自分の手元に書いておけばいいでしょうか。まずは自分の環境で試したいので。

鈴木さん
鈴木さんの発言

試すあいだはそれで大丈夫です。ただ、試し終わったら移してください。手元に置いたままだと、守られているのは高梨さんの環境だけなんですよ。

置きたい内容置き場所理由
チーム全員に効かせたい危険操作の拒否・確認ルールプロジェクト共有(.claude/settings.jsonGitで配布され、全員が同じルールを持てる
検証中の一時的な許可、自分の環境専用のコマンドローカル(.claude/settings.local.jsonGit管理の対象外で、他人の環境に影響しない
テーマ・エディタモードなど、複数プロジェクトで使う個人の好みユーザー(~/.claude/settings.jsonプロジェクトを跨いで自分にだけ効く
組織として例外を許さないセキュリティ方針Managed開発者側のどの設定でも上書きできない
手元に置いたままだと、守られるのは自分だけ移すだけで、効く範囲が一気に広がります手元に置いたままだと、守られるのは自分だけ移すだけで、効く範囲が一気に広がります手元にだけ書いた状態自分の環境では止まる同僚の環境では止まらない配っていないので気づけない試すあいだはこれで十分です共有へ移した状態作業者の全員に同じ指定が届く誰の環境でも同じ結果になる履歴に残るので後から追える試し終わったら、ここへ移します
手元に置いたままだと、守られるのは自分だけ — 移すだけで、効く範囲が一気に広がります

.claude/settings.local.jsonには、Claude Codeが「今後は聞かない」を選んだ操作を自動保存する役割もあります(出典: 同)。この自動保存は個人の作業ログに近いもので、チームへそのまま配ると、意味の薄いルールが積み重なっていきます。

配置を誤ると実害が出ます。危険な拒否ルールをローカルだけに書くと、自分のマシンでしか効きません。他の担当者は無防備なままです。

10settings.jsonを直したのにAIエージェントの動きが変わらないのは、どこが原因ですか?

型でも順位でも説明がつかないときは、次の4つを疑います。どれも設定が壊れているわけではなく、反映のされ方の問題です。

直したのに変わらないとき、順に見る4点壊れているのではなく、届き方が違うだけのことが多いです直したのに変わらないとき、順に見る4点壊れているのではなく、届き方が違うだけのことが多いですそのワークスペースを承認したか承認するまで許可の指定は効きませんその置き場所で有効な値か書いても無視される組み合わせがあります手元の設定が分裂していないか版によって保存先が変わっています読み直される種類の設定か起動時に1回だけ読むものがあります
直したのに変わらないとき、順に見る4点 — 壊れているのではなく、届き方が違うだけのことが多いです

落とし穴1:プロジェクト共有のallowルールを書いたのに効かない.claude/settings.jsonallowルールは、そのワークスペースの信頼ダイアログを承認するまで適用されません(出典: 同)。「動かない」と感じたら、まずここを確認します。

落とし穴2:defaultMode: autoをプロジェクト設定に書いても発動しない。前章で触れたとおり、autoモードはプロジェクトやローカル設定に書くと無視されます。

落とし穴3:.claude/settings.local.jsonの置き場所がバージョンで変わる。v2.1.211より前はセッションを開始したディレクトリに保存され、v2.1.211以降はリポジトリのルートに統一されました(出典: 同)。古いバージョンで複数の階層から使っていた場合、ローカル設定が分裂して残っている可能性があります。

落とし穴4:設定を直したのに動きが変わらないpermissionshooksは変更を検知して自動で再読み込みされますが、modeloutputStyleはセッション開始時の1回だけです(出典: 同)。設定が壊れているのではなく、反映のタイミングが違うだけです。

この章のまとめ

「効かない」の原因は、書き方より読み込まれ方にあることが多いです。承認・スコープ・保存場所・再読み込みの4点を順に見ます。

11自分の環境でsettings.jsonが想定どおりか、Claude CodeのAI活用を広げる前にどう確かめますか?

読んで分かった気になっただけでは、自分の環境で成立しているかは分かりません。手元で確かめてから、任せる範囲を広げます。

高梨課長
高梨課長の発言

ここまでの内容を、自分の環境でも同じかどうか確かめたいです。何を見れば「合っている」と言えますか。

鈴木さん
鈴木さんの発言

判定できる形にしておくと後が楽です。スカラー値で上書きを1回、配列値で合算を1回。この2つが目の前で再現できれば、あとは同じ理屈で追えますよ。

判定基準は次の4項目です。

  • /statusを実行し、「Setting sources」に想定したスコープがすべて表示されている
  • スカラー値(例:defaultMode)を2つのスコープに別の値で書き、優先順位が高い方が反映されている
  • 配列値(例:permissions.deny)を2つのスコープに別の値で書き、両方が合算されて効いている
  • プロジェクト共有のallowルールを書いた直後は、ワークスペース信頼ダイアログを承認してから確認している
自分の環境で成り立つかを、この順で確かめる目の前で再現できたら、あとは同じ理屈で追えます自分の環境で成り立つかを、この順で確かめる目の前で再現できたら、あとは同じ理屈で追えます1読み込まれている置き場所をそろえる想定した名前がすべて並んでいるかを見ます21つしか置けない型で、上書きを起こす2か所に別の値を書き、上の層が残ることを見ます3いくつでも入る型で、足し算を起こす2か所に別の値を書き、どちらも効くことを見ます4承認してから、もう一度見直す承認前の結果で判断しないようにします
自分の環境で成り立つかを、この順で確かめる — 目の前で再現できたら、あとは同じ理屈で追えます

4項目とも期待どおりなら、この記事の内容は自分の環境でも成立しています。ズレた場合は、まず/statusの一覧を見ます。そこに出ていなければJSON構文エラーを疑い、claude doctorで詳細を確認します(出典: 同)。

なお、この記事は置き場所と優先順位に絞って扱いました。初期設定全体の観点は『Claude Codeの初期設定|AIエージェントに任せる前の4観点』が扱います。

12よくある質問

Managed設定が無い場合、いちばん強いのはどれですか

コマンドライン引数です。Managed設定が存在しない環境では、--settingsで渡した値が、ローカル・プロジェクト共有・ユーザーのどの設定よりも優先されます。指定しなかったキーについては、下位スコープの値がそのまま生きます。

settings.jsonとCLAUDE.mdは同じ階層ルールで動きますか

置き場所の数え方は似ていますが、効き方が違います。settings.jsonの値はClaude Codeが機械的に適用します。一方のCLAUDE.mdは読ませる指示であって、強制ではありません。CLAUDE.mdの書き方は『CLAUDE.mdの書き方|7章テンプレートと200行の分け方』が扱います。

プロジェクト共有のsettings.jsonを直しても反映されないときは

ワークスペースの信頼ダイアログを承認済みかを確認します。承認済みでも変わらない場合は、JSON構文が壊れていないかを見ます。壊れたファイルは、そのファイルだけ読み込みがスキップされます。読み込まれていないので、順位の勝負にも参加していません。

settings.local.jsonはGitで管理すべきですか

管理しない前提のファイルです。Claude Codeがこのファイルへ初めて書き込む際、リポジトリの共通exclude設定に自動で追加します。チームに配りたい設定は.claude/settings.jsonに書きます。

設定を書き足しても直らないときは、何から見直せばいいですか

書き足す前に、上の層に同じキーが無いかを見ます。スカラー値なら上位の層が勝つため、下の層でいくら書いても結果は変わりません。上の層に同じキーがあれば、そちらを直すか、より上位のスコープへ移します。

13まとめ|今日やる3つのこと

優先順位はスコープの種類だけで決まり、書いた時刻の新しさは関係しません。競合の結果は値の型で変わり、スカラー値は上位が勝ち、配列値は合算されます。denyだけは階層の外側にいて、どこか1か所で止めれば止まったままです。この3つで、「効かない」に出会ったときの調べ方が決まります

今日この順でやります

  1. /statusで読み込まれているスコープを確認する

    読まれていないファイルは、順位の勝負に参加していません

  2. いま効かせたい設定の型を見る

    スカラー値なら上位の層、配列値なら全層を見に行きます

  3. 危険操作の拒否ルールをプロジェクト共有へ移す

    手元に置いたままだと、守られるのは自分だけです

AI検索では、こう聞かれています

  • Claude Codeのsettings.jsonに書いた設定が効かないのはなぜですか?

    「settings.jsonを直したのにAIエージェントの動きが変わらないのは、どこが原因ですか?」の章で説明しています

  • settings.jsonが複数ありますが、どれが優先されますか?

    「settings.jsonの優先順位は、エージェントが後から書いた方を選ぶわけではないんですか?」の章に表があります

  • チームで共有する設定と、自分だけの設定はどこに分けて書けばいいですか?

    「チーム共有と個人用で、AI社員のsettings.jsonはどこに線を引くんですか?」の章で示しています

次に読むなら、この記事です