This skill helps you properly configure MCP servers in Claude Code. It ensures MCP servers are configured in the right location and scope to avoid unnecessary context pollution across all sessions.
ONLY these two locations are valid for MCP configuration:
User/Local scope: ~/.claude.json
mcpServers field (global for all projects)Project scope: .mcp.json in your project root
~/.claude.json global mcpServers - This loads MCPs in ALL sessions and wastes context space.mcp.json - This only loads MCPs when working in that specific projectsettings.json for MCP control - The permissions.allow field can override disabled settings and cause confusionInvoke this skill when:
| Task | Example |
|---|---|
| Add MCP to current project | "添加 pencil MCP 到当前项目" |
| Remove MCP from all projects | "从所有项目中移除 shadcn-studio-mcp" |
| Check MCP configuration | "检查当前的 MCP 配置" |
| Clean up global MCPs | "清理全局 MCP 配置" |
First, understand what MCPs are currently loaded:
# Check user-level configuration
cat ~/.claude.json | grep -A 20 '"mcpServers"' | head -25
# Check project-level configuration
cat .mcp.json 2>/dev/null || echo "No project .mcp.json found"
# Check settings.json (should NOT have MCP config)
cat ~/.claude/settings.json | grep -A 5 '"permissions"'
Best Practice: Always add MCPs at project level
Create or edit .mcp.json in your project root:
{
"mcpServers": {
"server-name": {
"type": "stdio",
"command": "npx",
"args": ["-y", "package-name"],
"env": {
"API_KEY": "your-key-here"
}
}
}
}
From global config (~/.claude.json):
import json
with open('/Users/likai/.claude.json', 'r') as f:
data = json.load(f)
# Remove from global mcpServers
if 'mcpServers' in data and 'server-name' in data['mcpServers']:
del data['mcpServers']['server-name']
print(f"Removed server-name from global config")
with open('/Users/likai/.claude.json', 'w') as f:
json.dump(data, f, indent=2)
From project config (.mcp.json):
import json
try:
with open('.mcp.json', 'r') as f:
data = json.load(f)
if 'mcpServers' in data and 'server-name' in data['mcpServers']:
del data['mcpServers']['server-name']
with open('.mcp.json', 'w') as f:
json.dump(data, f, indent=2)
print("Removed server-name from project config")
except FileNotFoundError:
print("No .mcp.json found in project")
Remove any MCP-related permissions that might override configuration:
import json
with open('/Users/likai/.claude/settings.json', 'r') as f:
data = json.load(f)
# Remove permissions block if it contains MCP references
if 'permissions' in data:
if 'allow' in data['permissions']:
data['permissions']['allow'] = [
item for item in data['permissions']['allow']
if not item.startswith('mcp__')
]
if not data['permissions']['allow']:
del data['permissions']
with open('/Users/likai/.claude/settings.json', 'w') as f:
json.dump(data, f, indent=2)
{
"mcpServers": {
"pencil": {
"command": "/Users/likai/.vscode/extensions/highagency.pencildev-0.6.29/out/mcp-server-darwin-arm64",
"args": ["--app", "visual_studio_code"],
"env": {},
"type": "stdio"
}
}
}
{
"mcpServers": {
"shadcn-studio-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"shadcn-studio-mcp",
"API_KEY=your-api-key",
"EMAIL=your-email"
],
"env": {}
}
}
}
{
"mcpServers": {
"unsplash": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@microlee666/unsplash-mcp-server"],
"env": {
"UNSPLASH_ACCESS_KEY": "your-access-key"
}
}
}
}
Cause: MCP is configured in ~/.claude.json global mcpServers
Solution:
~/.claude.json global config.mcp.json instead"disabled": trueCause: permissions.allow in settings.json overrides disabled setting
Solution:
settings.json permissionspermissions block if emptyCause: MCP configured in multiple locations with different settings
Solution:
~/.claude.json, .mcp.json, settings.json
.mcp.json)Diagnostic commands:
# Search all possible locations
echo "=== Global Config ==="
grep -A 10 '"mcpServers"' ~/.claude.json | head -15
echo "=== Project Config ==="
cat .mcp.json 2>/dev/null || echo "No .mcp.json"
echo "=== Settings ==="
grep -A 5 '"permissions"' ~/.claude/settings.json 2>/dev/null || echo "No permissions"
echo "=== Project Settings ==="
grep -A 5 '"permissions"' .claude/settings.json 2>/dev/null || echo "No project settings"
.mcp.json for project-specific MCPs~/.claude.json global mcpServers empty to avoid context pollutionsettings.json - use it only for permissions if needed.mcp.json so team members get the same MCPsdisabled: true - Just remove the MCP configuration entirelyWhen Claude Code loads MCPs, it follows this priority:
.mcp.json (highest priority)~/.claude.json project-specific config~/.claude.json global mcpServers
settings.json permissions can override all of the aboveRecommendation: Use only project-level .mcp.json to avoid confusion.
# 1. Clean up global config
python3 << 'EOF'
import json
with open('/Users/likai/.claude.json', 'r') as f:
data = json.load(f)
data['mcpServers'] = {}
with open('/Users/likai/.claude.json', 'w') as f:
json.dump(data, f, indent=2)
print("✓ Cleaned global mcpServers")
EOF
# 2. Clean up settings.json
python3 << 'EOF'
import json
with open('/Users/likai/.claude/settings.json', 'r') as f:
data = json.load(f)
if 'permissions' in data:
del data['permissions']
with open('/Users/likai/.claude/settings.json', 'w') as f:
json.dump(data, f, indent=2)
print("✓ Cleaned settings.json permissions")
EOF
# 3. Create project-level config
cat > .mcp.json << 'EOF'
{
"mcpServers": {
"your-mcp-name": {
"type": "stdio",
"command": "your-command",
"args": [],
"env": {}
}
}
}
EOF
echo "✓ Created project .mcp.json"
# 4. Restart Claude Code
echo "⚠️ Please restart Claude Code for changes to take effect"
~/.claude.json and .mcp.json
.mcp.json onlymcpServers in ~/.claude.json (wastes context)settings.json (causes conflicts)