1. 从 settings.json 看 Claude Code 的配置骨架
Claude Code 是 Anthropic 推出的代理式编程工具,它能代表你运行 Shell 命令、编辑文件、调用外部服务,核心是一个「调用模型 → 执行工具 → 收集结果 → 再调用模型」的 while 循环。但真正决定这个循环行为边界的,不是循环本身,而是循环外面的配置层——settings.json就是这层配置的入口文件。如果你在用 TypeScript 构建 AI Agent,或者想把 Claude Code 接入统一的 API 通道,理解settings.json的结构比读源码更实用,因为它直接决定了权限模式、工具白名单、Hook 触发时机和模型路由。
我试过把 Claude Code 的配置层拆成三块来看:第一块是权限与安全策略,决定哪些工具调用需要人工确认、哪些可以自动放行;第二块是扩展与工具装配,决定 MCP 服务器、插件、技能如何进入工具池;第三块是模型与通道配置,决定请求发往哪个 API 端点、用哪个 Key 认证。这三块在settings.json里各有对应的字段,而且互相之间有优先级关系——拒绝规则永远高于允许规则,会话级权限不会跨恢复继承,这些设计都直接体现在配置的解析顺序里。
本文面向使用 TypeScript 构建 AI Agent 的开发者,以settings.json为切入点,梳理从配置文件到统一 Key/API 通道的完整骨架,给出可复制的配置片段和验证动作。你不需要读完整个 Claude Code 源码,只需要理解配置层如何影响 Agent 行为,就能在自己的项目里复用这套结构。下面从实际场景出发,先看配置层要解决什么问题,再一步步搭出可运行的骨架。
2. 配置层要解决的原问题与场景
2.1 为什么 Agent 需要独立的配置层
一个能自主执行 Shell 命令和编辑文件的 Agent,如果没有任何配置约束,行为边界完全由模型输出决定。这在演示环境里没问题,但在真实项目里会出三类问题:模型可能执行破坏性命令、可能把敏感文件内容发到外部服务、可能在不同会话之间继承不该继承的权限。Claude Code 的解法是把这些约束从模型推理中抽出来,放到确定性的配置层里,让 Harness 在模型调用前后做检查。
配置层要回答的核心问题有三个:哪些工具模型能看到、哪些调用需要人工批准、请求走哪条 API 通道。第一个问题影响上下文成本,因为工具 Schema 会占用 token;第二个问题影响安全姿态,默认拒绝还是默认询问;第三个问题影响可用性和成本,统一 Key 通道能简化多项目多 Key 的管理。
2.2 典型场景:多项目共用一套 Agent 配置
假设你在三个 TypeScript 项目里都用 Claude Code 做辅助开发,每个项目有自己的测试命令、代码规范和目录结构。如果每个项目单独配一套 Key 和权限规则,维护成本会随项目数线性增长。更合理的做法是把模型通道和基础权限规则抽到用户级配置,项目级配置只覆盖差异部分。Claude Code 的配置层级正好支持这种拆分:托管记忆、用户记忆、项目记忆、本地记忆四层,后加载的优先级更高,越接近当前目录的规则越优先。
这个场景里,settings.json承担的是「骨架」角色——它不写具体业务逻辑,只定义 Agent 的行为边界和资源通道。你可以在用户级配置里放统一的 API 端点和 Key 引用,在项目级配置里放该项目的工具白名单和 Hook,本地配置放个人偏好。这样换项目时不需要重新配 Key,改权限规则也不会影响其他项目。
2.3 配置层与 Agent 循环的关系
Claude Code 的查询循环在每次模型调用前会做上下文装配,装配过程会读取配置层解析出的权限回调、工具池、模型参数。配置不是循环的一部分,但循环的每一步都依赖配置的输出。比如工具调度阶段,assembleToolPool()会合并内置工具和 MCP 工具,合并前先做拒绝规则预过滤——被 blanket deny 的工具根本不进入模型视野。这个预过滤的规则来源就是settings.json里的权限配置。
理解这层关系后,你会发现配置文件的字段不是孤立的,它们按固定顺序参与解析:先解析系统提示和用户上下文,再初始化可变状态,然后装配上下文,最后才进入模型调用。配置字段如果放错层级,可能在解析顺序里被覆盖或忽略。下一节先讲 TaoToken 的前置准备,再进入具体配置。
3. TaoToken 前置:统一 Key 与 API 通道准备
3.1 为什么需要统一 Key 通道
Claude Code 默认走 Anthropic 官方 API,但在多项目、多环境场景下,直接管理多个官方 Key 有几个不便:Key 分散在各处容易泄露、不同项目的用量无法统一查看、切换环境时要改配置。TaoToken 提供统一的 API 通道,把模型调用收敛到一个端点和一个 Key 上,配置层只需要引用这个统一通道,不用关心底层是哪个模型服务。
TaoToken 的官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数,配置里填的就是这个纯端点。统一 Key 的好处是:你可以在一个地方管理所有项目的模型调用,权限和用量集中可见,换模型时只改通道配置不用动项目代码。
3.2 获取 API Key 的步骤
进入控制台后创建 API Key,建议按项目或环境分开创建,方便后续做用量隔离。创建时注意两点:一是 Key 只在创建时完整显示一次,要立即保存;二是可以给 Key 设置备注,比如「claude-code-dev」或「agent-test」,后续排查问题时能快速定位。
拿到 Key 后不要直接写进项目里的settings.json并提交到 Git。正确做法是把 Key 放在环境变量里,配置文件引用环境变量名。Claude Code 的配置支持从环境变量读取认证信息,这样 Key 不会进入版本历史。
3.3 配置通道时的关键参数
统一通道需要配三个核心参数:API 端点、认证 Key、模型标识。端点是https://taotoken.net/api,认证用上一步创建的 Key,模型标识按你实际使用的模型填写。这三个参数在settings.json里的位置和写法下一节详细展开。
注意:API 端点不要带任何查询参数,认证信息通过请求头传递,不要拼在 URL 里。配置文件里引用环境变量时用标准的环境变量语法,不同操作系统下语法一致。
如果你需要查看完整的接入文档和参数说明,可以访问接入文档页面,里面有各语言 SDK 的配置示例。对于长期编码和 Agent 场景,Coding Plan 提供了更适合持续调用的通道方案,可以在控制台里查看。
4. 可复制的 settings.json 配置骨架
4.1 配置文件的位置与层级
Claude Code 的配置按作用域分四层,加载顺序从低到高:托管配置(系统级)、用户配置(~/.claude/settings.json)、项目配置(项目根目录.claude/settings.json)、本地配置(.claude/settings.local.json,通常被 Git 忽略)。后加载的配置覆盖先加载的同名字段,但权限规则里的拒绝规则例外——拒绝规则永远优先,不受加载顺序影响。
实际使用时,建议把模型通道和基础权限放用户级,项目特有的工具白名单和 Hook 放项目级,个人调试用的临时配置放本地级。这样团队协作时项目配置可以提交到 Git,个人 Key 和偏好留在本地。
4.2 模型通道配置片段
下面是一个用户级settings.json的模型通道配置片段,把 API 请求指向 TaoToken 统一通道:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "${TAOTOKEN_API_KEY}", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }这里ANTHROPIC_BASE_URL指向 TaoToken 的 API 端点,ANTHROPIC_AUTH_TOKEN引用环境变量TAOTOKEN_API_KEY,实际 Key 值放在 shell 环境里。ANTHROPIC_MODEL指定默认模型,你可以按项目需要覆盖。这种写法的好处是配置文件可以安全提交,Key 通过环境变量注入。
设置环境变量的方式按操作系统不同:Linux/macOS 下在~/.zshrc或~/.bashrc里加export TAOTOKEN_API_KEY="你的Key",Windows 下用系统环境变量设置界面。设置完新开一个终端让变量生效。
4.3 权限与工具配置片段
权限配置决定工具调用的审批行为。下面这个片段演示了拒绝规则、允许规则和权限模式的组合:
{ "permissions": { "defaultMode": "default", "deny": [ "Bash(rm -rf:*)", "Bash(curl:* | sh)", "Read(./.env)", "Read(./secrets/**)" ], "allow": [ "Bash(npm test:*)", "Bash(npm run lint:*)", "Read(./src/**)", "Edit(./src/**)" ] } }defaultMode设为default表示标准交互模式,大多数操作需要批准。deny里的规则永远优先,即使allow里有更具体的匹配。注意Bash(rm -rf:*)这种写法匹配命令前缀,Read(./.env)匹配具体文件路径。拒绝规则里放的是绝对不能执行的操作,允许规则里放的是高频且低风险的操作,减少审批打扰。
权限模式有七种可选:plan要求先生成计划再执行,default标准交互,acceptEdits自动批准工作目录内的编辑,auto启用分类器评估,dontAsk不询问但仍执行拒绝规则,bypassPermissions跳过多数提示但保留安全检查,bubble用于子 Agent 升级权限请求。日常开发建议用default或acceptEdits,自动化场景用auto。
4.4 Hook 与扩展配置片段
Hook 让你在工具调用的生命周期节点插入自定义逻辑。下面这个片段演示了 PreToolUse 和 PostToolUse 的配置:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "node ./scripts/check-command.js" } ] } ], "PostToolUse": [ { "matcher": "Edit", "hooks": [ { "type": "command", "command": "npx prettier --write $CLAUDE_FILE_PATH" } ] } ] } }PreToolUse在工具执行前触发,可以拒绝、询问或修改工具输入。PostToolUse在工具执行后触发,可以注入额外上下文或做格式化。matcher字段匹配工具名,支持精确匹配和正则。Hook 命令通过标准输入输出与主进程通信,退出码非零表示阻止操作。
MCP 服务器配置放在mcpServers字段下,每个服务器指定传输方式和启动命令。插件和技能通过各自的清单文件声明,在settings.json里启用。这四类扩展机制的上下文成本不同:MCP 工具 Schema 成本最高,插件视组件而定,技能通常只放描述,Hook 默认零成本。配置时按实际需要选择,不要把所有机制都打开。
5. 验证请求与成功结果
5.1 验证配置是否生效
配置写完后先做语法检查,用jq或 Node 解析一遍:
node -e "JSON.parse(require('fs').readFileSync(process.env.HOME + '/.claude/settings.json', 'utf8')); console.log('JSON 语法正确')"然后验证环境变量是否被正确读取:
echo $TAOTOKEN_API_KEY | head -c 8应该输出 Key 的前 8 位,如果为空说明环境变量没生效,检查 shell 配置文件是否 source 过。
5.2 发一个最小请求验证通道
用 curl 直接测试 TaoToken 通道是否可达:
curl -s -X POST https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 64, "messages": [{"role": "user", "content": "回复 OK 两个字母"}] }'如果返回包含content字段且文本是「OK」,说明通道和 Key 都正常。如果返回 401,检查 Key 是否正确;返回 404,检查端点路径;返回超时,检查网络连通性。
5.3 在 Claude Code 里验证权限规则
启动 Claude Code 后,让它执行一个被拒绝规则匹配的命令,比如rm -rf /tmp/test。预期行为是直接拒绝,不弹出审批提示。再执行一个允许规则里的命令,比如npm test,预期行为是自动放行或只弹一次确认。如果拒绝规则没生效,检查规则写法是否匹配——Bash(rm -rf:*)里的冒号是分隔符,前缀匹配要写对。
验证 Hook 是否触发,可以在 Hook 脚本里加一行日志输出到文件,然后执行匹配的工具调用,看日志文件是否新增记录。Hook 脚本的退出码决定是否阻止操作,测试时先用exit 0确保不阻断流程。
5.4 验证模型对话与 Coding Plan
如果你想先验证模型对话是否正常,可以打开模型对话页面直接测试,不用配本地环境。对于长期编码和 Agent 场景,Coding Plan 提供了更适合持续调用的方案,可以在控制台里查看用量和切换。API Keys 管理页面可以创建和吊销 Key,接入文档页面有各语言 SDK 的完整示例。
6. 本篇常见错排查
6.1 配置不生效的排查顺序
配置不生效时按这个顺序查:先确认文件位置对不对,用户级是~/.claude/settings.json,项目级是项目根目录.claude/settings.json;再确认 JSON 语法有没有错,用上面的 Node 命令验证;然后确认字段名拼写,Claude Code 的字段名区分大小写;最后确认加载顺序,项目级覆盖用户级,但拒绝规则例外。
一个常见错误是把permissions写成permission,或者把defaultMode的值写成不存在的模式名。模式名是固定的七个值,写错会回退到默认行为。另一个常见错误是环境变量引用语法写错,${TAOTOKEN_API_KEY}是标准写法,写成$TAOTOKEN_API_KEY在 JSON 里不会被解析。
6.2 API 通道报错排查
401 错误通常是 Key 无效或没传对。检查请求头里用的是x-api-key还是Authorization,TaoToken 通道用x-api-key。检查 Key 有没有多余空格,从控制台复制时容易带上换行符。403 错误可能是 Key 权限不足或用量超限,去控制台看用量和权限设置。
404 错误检查端点路径,https://taotoken.net/api后面接/v1/messages是标准路径,不要多加或少加斜杠。429 错误是频率限制,降低请求频率或联系支持调整配额。超时错误先检查网络,再检查端点是否可达,用 curl 的-v参数看详细连接过程。
6.3 权限规则匹配问题
拒绝规则不生效,最常见的原因是规则写法不匹配实际命令。Bash(rm -rf:*)匹配的是以rm -rf开头的命令,如果实际命令是sudo rm -rf,前缀不匹配就不会被拒绝。规则里的路径匹配是相对于当前工作目录的,Read(./.env)只匹配当前目录下的.env,子目录里的不匹配。
允许规则被拒绝规则覆盖是预期行为,拒绝优先是设计原则。如果你发现某个操作被意外拒绝,先检查有没有更宽泛的拒绝规则匹配到了它。规则匹配是前缀匹配和路径匹配的组合,写规则时尽量精确,避免误伤。
6.4 Hook 执行失败排查
Hook 不触发先检查matcher是否匹配工具名,工具名区分大小写,Bash和bash不一样。Hook 命令的路径要写绝对路径或相对于项目根目录的路径,相对路径在不同工作目录下会失效。Hook 脚本要有执行权限,Linux/macOS 下用chmod +x加上。
Hook 脚本超时会导致主流程卡住,脚本里避免长时间阻塞操作。Hook 的输出格式要符合协议,标准输出会被解析为 JSON,格式错误会导致解析失败。调试时先在脚本里加日志,确认脚本被调用了再排查逻辑问题。
6.5 会话恢复与权限继承
恢复会话时权限不会继承,这是安全设计。如果你恢复会话后发现之前批准过的操作又要重新批准,这是预期行为。会话被视为独立信任域,恢复旧授权可能把陈旧信任带入已变化的上下文。如果确实需要跨会话保持某些权限,把它们写进settings.json的允许规则里,而不是依赖会话级批准。
分叉会话同样不继承权限。子 Agent 的权限覆盖有优先级规则:父会话处于bypassPermissions、acceptEdits或auto模式时,子 Agent 的权限覆盖不会取代父模式。配置子 Agent 权限时注意这个优先级,避免预期外的行为。
7. 配置骨架的复用与下一步
把settings.json当作 Agent 的配置骨架,核心思路是把模型通道、权限规则、扩展机制三块分开管理。模型通道放用户级,用环境变量注入 Key,指向 TaoToken 统一端点;权限规则按项目差异放项目级,拒绝规则写绝对禁止的操作,允许规则写高频低风险操作;扩展机制按上下文成本选择,Hook 和技能成本低可以多用,MCP 工具 Schema 成本高按需开启。
这套骨架可以直接复用到你自己的 TypeScript Agent 项目里。如果你用 Agent SDK 构建,配置层的解析逻辑可以复用同样的层级结构:用户级配置提供默认值,项目级配置覆盖差异,运行时配置做最终调整。权限检查放在工具调度之前,Hook 放在工具执行前后,模型通道参数从配置读取而不是硬编码。
下一步可以做的验证:把配置片段复制到你的项目里,改掉 Key 引用和路径,跑一遍上面的 curl 测试和权限规则测试。如果通道正常、权限规则按预期生效,说明骨架搭好了。后续要加新工具或新 Hook,按同样的层级结构往里加,不要把所有配置堆在一个文件里。遇到通道或接入问题,去 API Keys 页面检查 Key 状态,接入文档页面查参数说明;验证模型行为去模型对话页面;长期编码场景看 Coding Plan 的通道方案。