toStringなどJavaScriptプロトタイプ属性名と衝突する権限ルール名がsettings.jsonを無視させていた問題の修正
原文(日本語に翻訳)
JavaScriptのプロトタイプ属性名(例:toString)と一致する名前の権限ルールが、settings.jsonをサイレントに無視させていた問題を修正しました。
原文(英語)
Fixed permission rules with names matching JavaScript prototype properties (e.g. toString) causing settings.json to be silently ignored
概要
Claude Codeの設定ファイルsettings.jsonはJavaScriptで処理されます。JavaScriptのオブジェクトにはtoString、valueOf、constructor、hasOwnPropertyなどのプロトタイプ属性が組み込まれており、これらと同じ名前のキーを設定ファイルに含めた場合、設定全体が無視されるバグがありました。エラーメッセージも表示されないため、設定が適用されていないことに気づきにくく、原因の特定が困難でした。v2.1.98でこの問題が修正され、プロトタイプ属性名と一致するルール名があっても設定ファイルが正しく処理されます。
基本的な使い方
修正前の動作(問題のある挙動)
json
// .claude/settings.json
// "toString" という名前のルールが含まれている場合
{
"permissions": {
"allow": [
"Bash(git *)",
"Bash(npm *)"
]
},
"mcpServers": {
"toString": { ← JavaScriptプロトタイプ属性と同名
"command": "npx",
"args": ["-y", "some-mcp-server"]
}
}
}bash
# 修正前の動作
$ claude
# → settings.json がサイレントに無視される
# → "Bash(git *)" や "Bash(npm *)" の許可ルールが適用されない
# → エラーメッセージなし(設定が無視されていることに気づかない)修正後の動作(v2.1.98以降)
bash
# 修正後:プロトタイプ属性名と衝突するキーがあっても設定が正しく処理される
$ claude
# → settings.json が正常に読み込まれる
# → 全ての権限ルールが正しく適用される実践例
シナリオ1:影響を受けるJavaScriptプロトタイプ属性名の一覧
以下の名前を設定キーとして使用していた場合に問題が発生していました。
json
// 問題が発生するキー名の例(修正前)
{
"someSection": {
"toString": {...}, // Object.prototype.toString
"valueOf": {...}, // Object.prototype.valueOf
"constructor": {...}, // Object.prototype.constructor
"hasOwnProperty": {...}, // Object.prototype.hasOwnProperty
"isPrototypeOf": {...}, // Object.prototype.isPrototypeOf
"propertyIsEnumerable": {...}, // Object.prototype.propertyIsEnumerable
"toLocaleString": {...} // Object.prototype.toLocaleString
}
}シナリオ2:MCPサーバー名が原因のケース(修正後)
MCPサーバーの設定名として予約語と同じ名前を使っていた場合に問題が発生していました。
json
// 修正前:この設定でsettings.json全体が無視されることがあった
{
"mcpServers": {
"constructor": { ← 問題のあったキー名
"command": "npx",
"args": ["-y", "@company/mcp-server"]
}
},
"permissions": {
"allow": ["Bash(npm *)"] ← これも無視されていた
}
}
// 修正後:settings.json が正しく処理される
// または、キー名を変更して回避することも可能:
{
"mcpServers": {
"company-constructor-tool": { ← 別の名前に変更
"command": "npx",
"args": ["-y", "@company/mcp-server"]
}
}
}シナリオ3:問題が発生しているかどうかの確認(修正前後)
bash
# 設定が正しく読み込まれているか確認する方法
# 1. デバッグモードでClaude Codeを起動
$ claude --debug
# 2. 設定ファイルの読み込みログを確認
# 修正前:エラーなしに設定が無視される(ログに何も表示されない)
# 修正後:設定が正しく読み込まれたことがログに表示される
# 3. 許可ルールが機能しているか確認
$ claude
> git status # "Bash(git *)" ルールが設定されている場合
# 修正前:権限プロンプトが表示される(ルールが無視されているため)
# 修正後:自動許可される(ルールが正しく適用されるため)シナリオ4:設定ファイルの修正方法
もし現在のsettings.jsonにプロトタイプ属性名と衝突するキーがある場合の対処法:
json
// 変更前(問題のある設定)
{
"permissions": {
"allow": ["Bash(git *)"]
},
"customSection": {
"valueOf": {
"description": "value retrieval tool"
}
}
}
// 変更後(修正した設定)
{
"permissions": {
"allow": ["Bash(git *)"]
},
"customSection": {
"value-of-tool": { // ハイフンを使った名前に変更
"description": "value retrieval tool"
}
}
}v2.1.98以降は修正されているため、キー名を変更しなくても正しく動作しますが、混乱を避けるために予約語と衝突する名前は使わないことを推奨します。
注意点
- この問題は「サイレントに設定が無視される」という性質上、デバッグが非常に困難でした。設定が効いていないように見える場合は、このバグが原因だった可能性があります。
- v2.1.98以降は修正されていますが、設定キーの命名として
toString、valueOf、constructorなどのJavaScriptプロトタイプ属性名は使わないことを推奨します。 - この問題は
settings.jsonだけでなく、Claude Codeが読み込む他のJSON設定ファイル(.claude/settings.local.jsonなど)でも発生していた可能性があります。 - 過去に設定が無効だった期間があった場合は、意図通りに設定が適用されているか改めて確認してください。