Project-level permissions replace global permissions instead of merging
Open 💬 14 comments Opened Jan 9, 2026 by gregoramon
Description
When a project has a local .claude/settings.local.json file with a permissions block, it appears to replace the global permissions from ~/.claude/settings.local.json rather than merging with them.
Expected Behavior
Global and local permissions should merge:
- Global allow:
["mcp__Ref__ref_search_documentation", "mcp__Ref__ref_read_url", "WebSearch", ...] - Local allow:
["mcp__expo-mcp__search_documentation"] - Effective allow: Union of both lists
Actual Behavior
Local permissions replace global:
- Tools allowed globally (e.g.,
mcp__Ref__ref_read_url) still prompt for permission when a localpermissionsblock exists but doesn't include them - Users must duplicate all global permissions in every project's local settings
Steps to Reproduce
- Add
"mcp__Ref__ref_read_url"to global~/.claude/settings.local.jsonpermissions allow list - Create a project with
.claude/settings.local.jsonthat has apermissionsblock but doesn't include that tool - Try to use the Ref tool - it will prompt for permission despite being globally allowed
Impact
This defeats the purpose of global settings. Users expect global permissions to apply everywhere unless explicitly overridden locally.
Suggested Fix
Merge permission arrays (union for allow, union for deny) rather than replacing them entirely when local settings exist.
---
🤖 Generated with Claude Code
This issue has 14 comments on GitHub. Read the full discussion on GitHub ↗