Claude Code 配置速查表
最常用的键、规则、模板和坑。
⚠️ 严格 JSON
settings.json 是严格 JSON。// 注释和尾逗号都是语法错误,会导致该文件被整个跳过,启动时报 Settings Error。
一、放到哪
| 层级 | 路径 | 进 git |
|---|---|---|
| 用户级 | ~/.claude/settings.json(Windows:%USERPROFILE%\.claude\) | 否 |
| 项目共享 | <项目>/.claude/settings.json | 是 |
| 项目本地 | <项目>/.claude/settings.local.json | 否 |
| 企业强制 | 见下 | IT 下发 |
优先级(高 → 低):企业 managed → 命令行 --settings → settings.local.json → 项目 settings.json → 用户 settings.json
企业 managed 路径:
| 平台 | 路径 |
|---|---|
| Windows | C:\Program Files\ClaudeCode\managed-settings.json |
| Windows 注册表 | HKLM\SOFTWARE\Policies\ClaudeCode 下 Settings 值(REG_SZ/REG_EXPAND_SZ) |
| macOS | /Library/Application Support/ClaudeCode/managed-settings.json |
| Linux / WSL | /etc/claude-code/managed-settings.json |
旧的C:\ProgramData\ClaudeCode\managed-settings.json已不再读取。
同目录可放managed-settings.d/*.json分片,按文件名字母序合并。
claude config list # 看当前生效值
claude doctor # 报出配置错误二、最常用键
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"model": "sonnet",
"fallbackModel": "haiku",
"permissions": {
"allow": ["Bash(npm run test:*)", "Bash(git status)", "Read(./src/**)"],
"ask": ["Bash(git push:*)"],
"deny": ["Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)", "Bash(curl:*)"],
"defaultMode": "acceptEdits",
"additionalDirectories": ["../shared-libs"]
},
"env": { "NODE_ENV": "development" },
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh",
"padding": 0
},
"cleanupPeriodDays": 30,
"alwaysThinkingEnabled": true,
"spinnerTipsEnabled": false,
"outputStyle": "Explanatory",
"enableAllProjectMcpServers": false,
"enabledMcpjsonServers": [],
"disabledMcpjsonServers": [],
"disableAllHooks": false
}| 键 | 说明 |
|---|---|
model / fallbackModel | 主模型 / 降级模型(--model 和 ANTHROPIC_MODEL 会覆盖它) |
permissions | defaultMode 和 additionalDirectories 都在这一层里面,不是顶层 |
env | 注入每个会话的环境变量;与 shell 同名时设置文件赢 |
hooks | 见 第五节 |
statusLine | 自定义状态栏 |
apiKeyHelper | 输出 API key 的脚本,适合密钥轮换 |
cleanupPeriodDays | 会话记录保留天数,默认 30 |
attribution | commit/PR 里的归属信息(attribution.commit / .pr / .sessionUrl) |
disableAllHooks | 一键关掉所有 hooks;注意它同时会关掉自定义 statusLine 和 @ 补全 |
autoUpdatesChannel | 发布通道:"latest"(默认)或 "stable"(不是 autoUpdates,那个键不存在) |
outputStyle | 输出风格,首字母大写(Default/Proactive/Concise/Explanatory/Learning) |
三、权限
求值顺序
deny > ask > allow先看 deny,再看 ask,最后看 allow;第一个命中的决定结果,规则宽窄不影响顺序。宽泛的 deny 会压过更窄的 allow。
常用写法
{
"permissions": {
"allow": [
"Bash(npm run test:*)",
"Bash(git diff:*)",
"Read(./src/**)",
"Read(./**/*.md)",
"WebFetch(domain:docs.claude.com)",
"WebSearch",
"mcp__github__get_issue",
"mcp__puppeteer__*"
],
"ask": ["Bash(git push:*)", "Bash(npm publish:*)"],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(//etc/passwd)",
"Bash(curl:*)",
"Bash(rm -rf:*)"
]
}
}路径写法(Read / Edit)
| 写法 | 含义 |
|---|---|
//path | 文件系统绝对路径(两个斜杠) |
~/path | 家目录 |
/path | 相对该 settings 文件所属层级(项目设置 → 主工作目录;用户设置 → ~/.claude/) |
path 或 ./path | 相对当前工作目录 |
Windows 路径先归一化为 POSIX:C:\Users\alice → /c/Users/alice,所以写 //c/**/.env。
defaultMode 取值
default(CLI 里叫 manual)、acceptEdits、plan、auto、dontAsk、bypassPermissions
坑:auto与bypassPermissions不从项目或本地 settings 生效(v2.1.257 起)。要设就设在用户级或 managed,或用--permission-mode。
禁用它们:"disableBypassPermissionsMode": "disable"、"disableAutoMode": "disable"(都在permissions下,取值都是字符串"disable")。
要点
- Bash 是前缀匹配,
Bash(npm run test:*)的:*必须写(等价Bash(npm run test *))。 Bash(ls*)会连lsof一起匹配;要精确就写Bash(ls *)。- 复合命令按
&& || ; |拆分,规则要逐个子命令都命中。 - MCP 规则是
mcp__<server>__<tool>,支持mcp__puppeteer__*这种通配;但带括号的mcp__x__y(...)会被跳过。 Write/MultiEdit/NotebookEdit上的路径规则会被接受但永不生效,要用Edit(...)。- 裸
Bash作为 deny 会把 Bash 工具整个从上下文移除(省 token 但也失去能力);Bash(rm *)只拦截。 - 会话内改:
/permissions;单次注入:claude --allowedTools "..." --disallowedTools "..."
四、环境变量(常设)
# 端点 / 认证
ANTHROPIC_BASE_URL # 网关或代理端点
ANTHROPIC_AUTH_TOKEN # 自定义 Authorization 头
ANTHROPIC_API_KEY
# 模型
ANTHROPIC_MODEL # 覆盖 settings 里的 model
ANTHROPIC_DEFAULT_HAIKU_MODEL # 后台小模型
CLAUDE_CODE_SUBAGENT_MODEL
# 代理
HTTPS_PROXY / HTTP_PROXY / NO_PROXY # 不支持 SOCKS
# 小写变体也有效
# 超时 / 上限
API_TIMEOUT_MS=600000
BASH_DEFAULT_TIMEOUT_MS=120000
BASH_MAX_TIMEOUT_MS=600000
BASH_MAX_OUTPUT_LENGTH=30000
MCP_TIMEOUT / MCP_TOOL_TIMEOUT
# 隐私 / 遥测
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
DISABLE_TELEMETRY=1
DISABLE_ERROR_REPORTING=1
# 脚本里读(运行时注入)
CLAUDECODE # 在 CC 子进程中为 1
CLAUDE_PROJECT_DIR # 项目根绝对路径ANTHROPIC_SMALL_FAST_MODEL已废弃 → 用ANTHROPIC_DEFAULT_HAIKU_MODEL。
这些是「非空即开启」的开关,设成0仍然算开启,要关必须 unset 或设为空串。
五、Hook 最小可用
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/guard.sh",
"timeout": 60
}
]
}
]
}
}| 事件(常用) | 时机 |
|---|---|
PreToolUse | 工具调用前,可拦截/改写 |
PostToolUse | 工具调用成功后 |
UserPromptSubmit | 用户提交 prompt 后 |
SessionStart / SessionEnd | 会话开始 / 结束 |
Stop / SubagentStop | 主 agent / 子代理结束 |
PreCompact / PostCompact | 上下文压缩前 / 后 |
(实际事件远多于此,约 30+ 个;/hooks 可查当前版本全集。)
退出码:
| 码 | 含义 |
|---|---|
0 | 成功。stdout 仅在 UserPromptSubmit / SessionStart 等少数事件上注入为上下文 |
2 | 阻断。stderr 回喂给 Claude |
| 其他 | 不阻断。exit 1 不会拦住任何东西 |
要强制策略必须用 exit 2。拦截式输出(配合 exit 0):
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "禁止 rm -rf"
}
}command里用${CLAUDE_PROJECT_DIR}拼绝对路径(hook 的 cwd 不保证是项目根);脚本记得chmod +x;调试claude --debug hooks。
六、MCP 最小
<项目>/.mcp.json(进 git):
{
"mcpServers": {
"filesystem": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
},
"tavily": {
"type": "http",
"url": "https://mcp.tavily.com/mcp/",
"headers": { "Authorization": "Bearer ${TAVILY_API_KEY}" }
}
}
}type:stdio/http/sse/ws。有url但没type会被当成 stdio(配置错误)。- 支持
${VAR}与${VAR:-default};${VAR}未定义 → 该 server 加载失败。 - 整个 server 超时可设
"timeout": 600000(毫秒,低于 1000 会被忽略)。
claude mcp add --transport http <name> <url>
claude mcp add-json <name> '{"type":"stdio","command":"npx","args":["-y","pkg"]}'
claude mcp list / get <name> / remove <name>.mcp.json 描述的是会被执行的任意命令。克隆陌生仓库先审再信任。七、常见坑
| 坑 | 正解 |
|---|---|
| JSON 里写了注释 | settings.json 严格 JSON,注释是语法错误 |
defaultMode 放顶层 | 必须在 permissions 里面 |
additionalDirectories 放顶层 | 同上 |
项目里设 defaultMode: "auto" 不生效 | auto/bypassPermissions 只在用户级或 managed 生效 |
autoUpdates 不生效 | 键不存在,用 autoUpdatesChannel |
includeCoAuthoredBy 没反应 | 已废弃,用 attribution |
outputStyle 设了不生效 | 值要首字母大写,写 "default" 不对;且改动后需重开会话 |
disableAutoMode 设 true 不生效 | 值是字符串 "disable",不是布尔 |
MCP 规则写 mcp__x__y(*) 无效 | 带括号的 MCP 规则会被跳过;用 mcp__x__* |
Write(...) 权限规则没用 | Write/MultiEdit 的路径规则永不生效,改用 Edit(...) |
hook exit 1 拦不住 | 只有 exit 2 阻断 |
| hook 找不到脚本 | 用 ${CLAUDE_PROJECT_DIR} 拼绝对路径 |
| 子代理不被自动委派 | description 要写清「何时用我」 |
想用 .claudeignore | 不存在。用权限 deny 规则排除读取 |
改了 model 但没变 | model 只在会话启动时读一次,要重开会话 |
配置随版本演进较快,以 claude doctor、claude config list、/help 的实际输出为准。
评论已关闭