managedSourcesBehaviorで複数の管理設定ソースを統合する
管理設定は通常1ソースだけが採用されます。managedSourcesBehaviorをmergeにすると、種類ごとの結合ルールで複数ソースを合成できる仕組みを扱います。
managedSourcesBehaviorとは何か
Claude Codeの管理設定(managed settings)は、組織が複数の経路から同じ端末に配ることがあります。既定では、そのうち最も優先度の高い1ソースだけが採用され、残りは捨てられます。managedSourcesBehaviorは、この「1つだけ採用」をやめて複数ソースを1つのポリシーに合成させるキーです。値は"first-wins"(既定)と"merge"の2つで、mergeにはClaude Code v2.1.242以降が必要です。
権限・モデル制限・バージョン強制まで含めた組織管理の全体像はClaude Code組織管理ガイドにあります。ここでは、複数ソースがどう1つに合成されるかという結合ルールだけを掘り下げます。
配ったポリシーが効かないとき、最初に見る場所
MDMで配ったはずの設定が効かない、という報告を受けたら、まず当の端末でセッションを開いて/statusを実行します。見るのはSetting sourcesの行です。
/statusで原因を2択に絞る
- 1
Setting sourcesの行を読む
管理ソースが有効なら、行に
Enterprise managed settingsと、採用されたソースが括弧付きで出ます。(remote)はサーバー管理設定かゲートウェイ、(plist)か(HKLM)はMDM・OSポリシー、(file)・(drop-ins)・(file + drop-ins)は管理設定ファイルです。 - 2
末尾が「, merged」かを見る
(remote + file, merged)のように, mergedで終わっていれば、複数ソースを合成しています(v2.1.242以降)。(HKCU)はユーザーが書き換えられるレジストリがフォールバックとして採用されたことを、(parent process)は埋め込みホストが制限的な設定を渡したことを示します。 - 3
Skipped sourcesの行で「届いていない」か「負けた」かを切り分ける
端末上に見つかったのに採用されなかったソースは、2行目の
Skipped sourcesに名前が出ます(v2.1.242以降)。ここに配布したソースがあれば、設定は届いたうえで上位ソースに負けています。Setting sourcesの行自体が無く、サーバー管理設定を使っているなら、claude doctorが取得結果を報告します。
行が出ないのは、ポリシーキーを運ぶ管理ソースが見つからないときです。管理設定ファイルを置いたなら、OSごとのパス(macOSは/Library/Application Support/ClaudeCode/managed-settings.json、Linuxは/etc/claude-code/managed-settings.json)にあることと、managedSourcesBehaviorだけでなくポリシーキーが入っていることを確かめます。JSONが壊れているファイルは、この状態ではなくClaude Codeの起動拒否になります。
既定のfirst-winsには、読み飛ばされたソースを知らせる警告がありません。「配ったのに効かない」が静かに起きるので、Skipped sourcesの行が唯一の手がかりです。
4つの管理設定ソースの優先順位
Claude Codeは、次の順序でソースを確認します。
| 優先順位 | ソース | 配信元 | admin sourceか |
|---|---|---|---|
| 1(最高) | ソースリモート設定 | 配信元claude.aiのサーバー管理設定、または自前のClaude apps gateway | admin sourceか○ |
| 2 | ソースMDM / OSポリシー | 配信元macOSのplist、WindowsのHKLMレジストリ | admin sourceか○ |
| 3 | ソース管理設定ファイル | 配信元managed-settings.jsonとmanaged-settings.d/*.jsonを結合したもの | admin sourceか○ |
| 4(最低) | ソースHKCUレジストリ | 配信元Windowsのユーザー書き込み可能なレジストリ | admin sourceか×(ユーザー自身が書き換えられるため) |
リモート設定が取得されるのは、セッションがAnthropicのAPIへ直接、対象となるログインまたはAPIキーで認証しているときと、/loginでゲートウェイにサインインしたときだけです。それ以外のプロバイダーを使っている場合や、ANTHROPIC_BASE_URLがAnthropic以外を指している場合は、最上位を飛ばして次のソースから確認が始まります。
HKCUは「admin source」に数えられず、managedSourcesBehaviorの値に関係なく合成に加わりません。しかも、上位にadmin documentが「存在する」と見なされれば、HKCUはその下で一切適用されません。存在と見なされるのは、null以外の値でポリシーキーを1つでも持つ場合と、HKLM値・管理設定ファイル・managed-settings.dが存在するのに読めない場合です。読めないファイルでも、HKCUを押さえる側に回ります。
「ポリシーキー」とは、managedSourcesBehavior自身とwslInheritsWindowsSettingsを除くすべての設定キーです。この2つしか載っていないファイルやMDMポリシーは数えられず、確認は次のソースへ進みます。
first-winsとmergeで何が変わるか
採用されるソースの数
first-wins
ポリシーキーを1つ以上運ぶ最上位のソースだけを採用します。下位ソースが寄与できるのは、後述するクロスソースキーだけです。
merge
ポリシーキーを運ぶすべてのadmin sourceが参加します。キーの種類ごとに、上位の値が勝つ・リストを足す・ロックは最も厳しい値、のいずれかで合成します。
managedSourcesBehavior自体は、このキーかポリシーキーのどちらかを運ぶ最上位のソースからしか読まれません。下位のソースが自分の判断で「合成に参加する」と宣言する抜け道は塞がれています。
{
"managedSourcesBehavior": "merge"
}このキーは、配布するソースのうち最も優先度の高いものに書きます。サーバー管理設定を配らない端末なら、MDMプロファイルにも書く必要があります。管理設定ファイルは最下位のadmin sourceで、その下に合成相手がないため、ファイル側だけに書いても効果はありません。
2つのソースに同じ設定を置くと結果はどう違うか
MDMとファイルの2ソースが、次のように設定を持つ端末を考えます。MDM側がmanagedSourcesBehavior: "merge"を持つかどうかで、結果が分かれます。以下は各キーの種類ごとの規則を当てはめた読み方です。
- MDM:
permissions.allowにBash(git status)、modelにsonnet - ファイル:
permissions.allowにBash(npm test)、modelにopus、cleanupPeriodDaysに14、envに変数TEAM_NAME
| キー | first-wins(既定) | merge |
|---|---|---|
permissions.allow | first-wins(既定)Bash(git status)のみ | mergeBash(git status)とBash(npm test)の両方 |
model | first-wins(既定)sonnet(MDM) | mergesonnet(MDM) |
cleanupPeriodDays | first-wins(既定)既定値のまま。ファイル側の14は無視 | merge14(MDMが未設定なので次のソースから採用) |
envのTEAM_NAME | first-wins(既定)ファイル側の値が適用 | mergeファイル側の値が適用 |
差が出るのは1行目と3行目です。modelのように両方が設定するキーはどちらでも上位が勝ち、envはmanagedSourcesBehaviorと無関係に変数単位で合成されます。mergeは「上位が黙っているキーを下位が埋める」挙動をもたらす設定でもあります。
mergeで種類ごとにどう統合されるか
mergeが有効なとき、Claude Codeはキーの種類ごとに異なる規則で値を組み立てます。
| 種類 | mergeでの結合方法 | 代表キー |
|---|---|---|
| リスト | mergeでの結合方法全ソースのエントリを結合 | 代表キーpermissions.allow、hooks、sandbox.network.allowedDomains、deniedMcpServers |
| ロック | mergeでの結合方法どのソースが指定しても最も厳しい値を採用。緩い値は最上位ソースからだけ | 代表キーallowManagedPermissionRulesOnly、permissions.disableBypassPermissionsMode |
| 制限許可リスト | mergeでの結合方法最上位で設定されたリストをそのまま採用し、下位のエントリは足さない。最上位が未設定なら次のソースから丸ごと | 代表キーavailableModels、allowedMcpServers、fallbackModelのチェーン |
| 値ごと採用 | mergeでの結合方法設定した最上位ソースの値をそのまま採用(v2.1.257以降) | 代表キーsandbox.credentials.awsPairs、sandbox.ripgrep |
| MCPサーバー定義 | mergeでの結合方法サーバー名単位で全ソースを結合し、同名なら上位ソースの定義が勝つ | 代表キーmanagedMcpServers |
| 最上位ソースだけから読むキー | mergeでの結合方法下位の値は、最上位が未設定でも無視 | 代表キーapiKeyHelper、forceLoginOrgUUID、modelPicker、policyHelper、permissions.defaultMode、parentSettingsBehavior |
| その他のキー | mergeでの結合方法設定している最上位ソースの値 | 代表キーmodel、cleanupPeriodDays |
ロックの「緩い値」の扱いは見落とされがちです。どのソースも厳しい値を設定していなければ、緩い値は最上位ソースのものだけが採用されます。
組み合わせに条件が付くキーもあります。modelOverridesはavailableModelsと対で、上位ソースがavailableModelsだけを設定している場合は、すべてのソースのmodelOverridesが無視されます。policyHelperは、ポリシーキーを運ぶ最上位がMDMか管理設定ファイルのときだけ働き、サーバー管理設定が最上位なら実行されません。
managedSourcesBehaviorを設定していなくても合成されるキー
一部のキーは、first-winsのままでも全admin sourceから読まれます。下位のMDMポリシーや管理設定ファイルが、最上位ソースの空白を埋める形で効きます。この読み取りからHKCUは外れます。代表的なものは次のとおりです。
sandbox.network.allowManagedDomainsOnlyとsandbox.filesystem.allowManagedReadPathsOnly— いずれかのソースがtrueならロックが有効になり、許可ドメイン・許可読み取りパスを全admin sourceから合算しますallowManagedMcpServersOnly— いずれかがtrueならロックが有効になり、allowedMcpServersは、設定しているソースのうち最上位のものがそのまま使われます(v2.1.273以降)deniedMcpServersとdisableClaudeAiConnectors— どれかのソースにエントリかtrueがあれば適用されます(v2.1.273以降)enableArtifact— いずれかがfalseならArtifactツールが無効(v2.1.242以降)maxEffortLevel— 最も低い上限が採用され、どのソースも上限を引き上げられません(v2.1.267以降)attribution(または非推奨のincludeCoAuthoredBy)によるコミットトレーラーの無効化、forceRemoteSettingsRefreshenv— 変数単位で、各変数は定義している最上位ソースから取られます(v2.1.223以降)
envの扱いが変わったのはv2.1.223です。それ以前は、選ばれたソースのenvブロックを丸ごと採用していました。
ゲートウェイのログイン用キー(forceLoginGatewayUrlなど)は別の規則です。サーバー管理設定からは読まれません。サーバー管理設定が採用されていても、ポリシーキーを運ぶ端末上の最上位admin sourceが値を供給します。それより下位のadmin sourceやHKCUに書いた値は無視されます。
バージョンで合成の範囲はどう広がったか
合成の対象が増えた順
- v2.1.223envが変数単位の合成に
選ばれたソースのブロック丸ごとの採用をやめ、変数単位でソースをまたぐようになりました。
- v2.1.242managedSourcesBehaviorが登場
mergeが使えるようになり、/statusにSkipped sourcesの行と, mergedの表示も加わりました。 - v2.1.257値ごと採用の2キー
sandbox.credentials.awsPairsとsandbox.ripgrepが、mergeでも下位と混ざらず丸ごと採用されるようになりました。 - v2.1.267maxEffortLevelがクロスソースに
全admin sourceのうち最も低い上限が適用されます。
- v2.1.273MCPの許可・拒否がクロスソースに
allowManagedMcpServersOnly・deniedMcpServers・disableClaudeAiConnectorsが、managedSourcesBehaviorと無関係に全admin sourceから読まれるようになりました。 - v2.1.285allowedProvidersの条件
allowedProvidersが独自の規則を持つようになりました。セッションが使えるのは、サーバー管理のリストと端末側のリストの両方に載るプロバイダーだけです。サーバー側のリストは範囲を狭められますが、広げることはできません。
mergeはv2.1.242より前のバージョンでは使えません。複数のバージョンが混在するフリートでは、同じ管理設定を配っても、合成が効く端末と効かない端末が出ます。
mergeを有効にするかの判断基準
mergeは、複数の部署やベンダーがそれぞれ別の管理ソースを持ち込む組織のためにあります。MDM側がベースラインのサンドボックス設定を配り、IT部門が管理設定ファイルで追加の許可ドメインを足す運用は、first-winsのままだと成立しません。MDMの設定が勝ち、ファイル側の追加分は、前節のクロスソースキーを除いて切り捨てられるためです。
逆に、mergeは下位ソースのリストを足し算する機能でもあります。下位ソースの管理を外部ベンダーに委託している、ファイルの配置権限が緩い端末が混ざっている、といった状況では、許可範囲を広げる抜け道になり得ます。決め手は、自分より下位のすべてのソースを、自分と同じ水準で管理できているかどうかです。
managedSourcesBehaviorとparentSettingsBehaviorは何が違うか
名前が似たparentSettingsBehaviorは、Agent SDK・IDE拡張・Claude Desktopのような埋め込みホストが渡す設定を、管理ポリシーとどう組み合わせるかを決めます。managedSourcesBehaviorが扱うのはadmin source同士(リモート・MDM・ファイル)の合成で、対象が別です。2つのキーはどちらも"merge"にできますが、片方の設定はもう片方に影響しません。
parentSettingsBehaviorの既定も"first-wins"で、管理ポリシーがあるとホスト側の設定は捨てられます。"merge"にすると、ホストの設定は制限方向の値だけを残すフィルターを通り、管理ポリシーの下に適用されます。Claude Desktopがゲートウェイの通信許可リストを配る場面が典型です。注意点が1つあります。allowManaged*Onlyのロックを併せて設定しない限り、ホストが渡した権限の許可ルールとサンドボックスの許可リストは、フィルター後もそのまま効きます。
よくあるつまずき
- 管理設定ファイルだけに
"managedSourcesBehavior": "merge"を書いても、上位のMDMやリモート設定がこのキーもポリシーキーも運んでいなければ効果はありません。このキーは最上位ソースからしか読まれないためです - HKCUレジストリは、
mergeにしても合成対象に入りません。ユーザー自身が書き換えられるレジストリだからです parentSettingsBehaviorをmanagedSourcesBehaviorと混同し、Agent SDKやIDE拡張の設定が自動でadmin sourceと合成されると思い込むケースがあります。別のキーなので、それぞれ個別に切り替えますallowManagedPermissionRulesOnlyのようなロックは、first-winsなら選ばれたソースの値で決まります。mergeのときに初めて「どのソースでも最も厳しい値が勝つ」規則が働くため、first-winsの端末で下位ソースのロックに期待しても効きません。例外は前掲のクロスソースのロックですmodelOverridesだけを下位ソースに書いても、上位ソースがavailableModelsを設定していてmodelOverridesを設定していなければ、どのソースからも無視されます- Windows端末で
/statusのSetting sources行が(HKCU)だけになるのは、admin sourceが1つも存在しないときです。MDMやファイルを配ったつもりでこの表示なら、配布したものが端末で見つかっていません
まとめ
複数の管理ソースを持つ組織で決めることは、mergeにするかどうかの1点です。リストが足し算になる代わりに、下位ソースの配置権限まで管理者が握っている必要があります。効いているかどうかは、端末で/statusのSetting sourcesが, mergedで終わっているかと、Skipped sourcesに配布物が残っていないかで判断できます。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。