1. 为什么我要把 Claude Code 的六层架构拆开看
Claude Code 是一个跑在终端里的本地 AI 编程代理平台,它能读项目文件、执行命令、调用外部工具,把自然语言指令变成实际的代码操作。它适合谁?适合那些不满足于“代码补全”,想让 AI 真正参与项目级任务——重构、调试、批量改文件——的开发者。但很多人用起来只停留在“输入问题、等回答”这一层,遇到配置不生效、MCP 工具连不上、CLI 启动报错就卡住了。
我一开始也这样。直到我把它的六层设计——CLI 引导层、初始化层、TUI/REPL 交互层、Query/Agent 执行内核、Tool/Permission 层、Memory/Persistence 层,再加上横向贯穿的 MCP/Remote/Swarm 扩展层——按数据流走了一遍,才发现大部分“玄学问题”其实都出在配置层:CLI 解析参数后交给初始化层读配置,配置里决定了模型端点、工具权限、MCP 服务器地址,这些没对齐,后面全乱。
这篇不空谈架构图。我聚焦一件事:CLI 与 MCP 的协作链路,怎么落到你能直接复制的settings.json和config.toml骨架里,并且用统一的 Key/API 通道把连通性验证跑通。目标很明确——把六层设计变成可运行的配置,而不是停留在概念。
2. 前置准备:用 TaoToken 统一 Key 与 API 通道
在动配置文件之前,先把“通道”这件事解决。Claude Code 的扩展层要连模型服务,传统做法是每个提供商配一套 Key、一套端点,切换模型就得改一堆地方。我用 TaoToken 做统一入口,一个 Key 走所有模型请求,配置层只认一个base_url和一个api_key,CLI 引导层解析出来的环境变量直接喂给初始化层,链路干净。
具体动作:
第一,拿到 Key。访问控制台创建 API Key,地址是https://taotoken.net/console。创建后复制保存,后面settings.json和config.toml都要用。
第二,确认 API 端点。统一走https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为base_url写入配置。
第三,如果你要跑长期编码任务或 Agent 协作,建议同时了解 Coding Plan,地址https://taotoken.net/coding-plan,它决定了你多轮对话和工具调用的额度策略,配置层不用改,但心里要有数。
第四,验证模型通道是否通,可以先用模型对话页面发一条测试消息,地址https://taotoken.net/models。这一步是排障基线——如果这里不通,后面 CLI 报错就不用查配置文件了,先查 Key 和额度。
注意:Key 只存在本地配置文件或环境变量里,不要写进会提交到 Git 的文件。我习惯用环境变量注入,配置文件里留占位符。
3. 可复制配置:settings.json 与 config.toml 骨架
这一节是核心。Claude Code 的初始化层会读多层配置,优先级大致是命令行参数 > 环境变量 > 用户配置文件 > 默认配置。我们把关键项落到两个文件里:settings.json管 CLI 与工具权限,config.toml管模型端点与 MCP 服务器。
3.1 settings.json 骨架
这个文件放在用户配置目录下,负责 CLI 引导层解析后的行为控制,以及 Tool/Permission 层的权限边界。
{ "model": { "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "claude-sonnet-4-20250514" }, "permissions": { "allow_file_write": true, "allow_bash": true, "allowed_dirs": [ "./src", "./tests", "./docs" ], "deny_patterns": [ "rm -rf /", "curl * | sh" ] }, "memory": { "persist": true, "storage_path": "./.claude/memory" }, "mcp": { "enabled": true, "servers_config": "./config.toml" } }几个关键点解释。api_key_env指向环境变量名,而不是把 Key 明文写进去,这样 CLI 引导层在解析环境时能拿到,初始化层加载配置时不会泄露。allowed_dirs是 Permission 层的白名单,AI 只能在你划定的目录里读写,这是六层设计里“安全护栏”落到配置层的直接体现。deny_patterns拦截高风险命令,防止 Agent 内核调用 Bash 工具时执行破坏性操作。
3.2 config.toml 骨架
这个文件管 MCP 扩展层,定义外部工具服务器怎么连。
[mcp] enabled = true [[mcp.servers]] name = "filesystem" command = "npx" args = ["-y", "@modelcontextprotocol/server-filesystem", "./src"] transport = "stdio" [[mcp.servers]] name = "taotoken-bridge" command = "npx" args = ["-y", "@taotoken/mcp-bridge"] transport = "stdio" env = { TAOTOKEN_API_KEY = "${TAOTOKEN_API_KEY}", TAOTOKEN_BASE_URL = "https://taotoken.net/api" } [agent] max_concurrent_tools = 4 stream_output = truetransport = "stdio"表示 MCP 服务器通过标准输入输出与 CLI 通信,这是本地 Agent 平台最常用的方式。taotoken-bridge这个服务器把统一 API 通道包装成标准 MCP 工具,让 Query/Agent 内核在需要调用模型时,走的是同一条通道,不用在代码里硬编码端点。max_concurrent_tools对应执行内核里工具调用的并发控制,设成 4 是实测下来比较稳的值,太高容易触发限流。
3.3 环境变量注入
export TAOTOKEN_API_KEY="你的Key" export CLAUDE_CODE_CONFIG="./settings.json"CLI 引导层启动时会先读CLAUDE_CODE_CONFIG找到配置文件路径,再解析TAOTOKEN_API_KEY注入到初始化层。这两步顺序不能反,否则初始化层拿不到 Key,MCP 服务器启动会失败。
4. 验证请求:从 CLI 启动到 MCP 工具调用成功
配置写完,跑一遍完整链路,确认六层都通了。
第一步,启动 CLI 并检查配置加载。
claude-code --config ./settings.json --verbose--verbose会打印初始化层的加载日志。你应该看到类似输出:
[init] loading config from ./settings.json [init] api_key resolved from env TAOTOKEN_API_KEY [init] mcp servers: filesystem, taotoken-bridge [cli] entering REPL mode如果api_key resolved这行没出现,说明环境变量没注入成功,回到 3.3 检查。
第二步,在 REPL 里发一条测试指令,验证 Query/Agent 内核能走通模型通道。
> 读取 ./src 目录下的文件列表,告诉我有哪些文件正常情况你会看到流式输出:先出现“正在调用 filesystem 工具”,然后是文件列表。这说明 CLI 引导层 → 初始化层 → TUI/REPL 层 → Query 内核 → Tool 层 → MCP 扩展层的链路全部打通。
第三步,单独验证 MCP 服务器连通性。
claude-code mcp list输出应该列出filesystem和taotoken-bridge两个服务器,状态为connected。如果某个显示disconnected,看下一节的排查。
第四步,验证模型通道的独立连通性。用模型对话页面发一条消息,确认返回正常。这一步和 CLI 无关,纯粹确认 Key 和端点没问题,地址https://taotoken.net/models。
5. 本篇常见错排查
5.1 CLI 启动报 “config not found”
现象:claude-code启动直接退出,提示找不到配置文件。
原因:CLAUDE_CODE_CONFIG环境变量没设,或者路径写的是相对路径但当前工作目录不对。
解决:用绝对路径,或者先cd到项目根目录再启动。检查echo $CLAUDE_CODE_CONFIG是否有输出。
5.2 MCP 服务器 connected 但工具调用超时
现象:mcp list显示 connected,但实际让 AI 读文件时卡住。
原因:config.toml里args的路径参数不对。比如server-filesystem后面跟的./src是相对于 MCP 服务器进程的工作目录,不是相对于你的项目根目录。
解决:把路径改成绝对路径,或者确认启动 CLI 时的工作目录和args里的相对路径基准一致。我踩过的坑就是这里,改成绝对路径后立刻通了。
5.3 模型请求返回 401
现象:REPL 里发指令,返回认证失败。
原因:TAOTOKEN_API_KEY没注入,或者 Key 已失效。
解决:先echo $TAOTOKEN_API_KEY确认有值,再去控制台检查 Key 状态。如果 Key 没问题,检查settings.json里api_key_env写的变量名和实际导出的变量名是否一致,大小写敏感。
5.4 权限拒绝导致文件写入失败
现象:AI 尝试写文件时提示 permission denied。
原因:allowed_dirs没包含目标目录,或者allow_file_write是 false。
解决:把目标目录加进allowed_dirs,确认allow_file_write为 true。这是 Permission 层在起作用,不是 bug,是设计如此。
5.5 并发工具调用触发限流
现象:多个工具同时调用时,部分请求返回 429。
原因:max_concurrent_tools设太高,超过了通道的速率限制。
解决:降到 2 或 3,观察是否稳定。如果任务本身需要高并发,考虑升级 Coding Plan 的额度策略,地址https://taotoken.net/coding-plan。
6. 把六层设计落到配置层之后
走到这里,你应该已经有一套能跑的配置了。CLI 引导层负责解析和路由,初始化层读settings.json和config.toml建立环境,TUI/REPL 层接收你的输入,Query/Agent 内核组装上下文并调用模型,Tool/Permission 层执行工具并管控权限,Memory 层持久化会话,MCP 扩展层连接外部工具服务器。每一层都有对应的配置项,改哪一层就动哪个字段,不用全局搜索。
后续如果要扩展,比如加一个新的 MCP 服务器,只需要在config.toml里追加一个[[mcp.servers]]块,重启 CLI 即可,核心执行逻辑不用动。这就是分层解耦在配置层的直接好处。
如果你还没创建 Key,去控制台建一个,地址https://taotoken.net/console。接入文档在https://taotoken.net/doc,里面有各语言 SDK 的调用示例,方便你把统一通道集成到自己的脚本里。长期跑编码任务的话,Coding Plan 页面https://taotoken.net/coding-plan有额度说明,配置层不用改,按需调整即可。