1. 为什么你的 Claude Code 越用越乱:从零散技巧到工程化扩展
Claude Code 是 Anthropic 推出的系统级 AI Agent,它和普通代码补全工具最大的区别在于:它能读写文件、执行命令、管理进程,还能通过 MCP、Skills、Hooks 三类扩展机制接入外部能力。如果你已经用它跑通过几个小任务,大概率会遇到一个瓶颈——每次都要重复交代同样的规则,换个项目就得重新解释一遍技术栈,危险命令拦不住,代码格式还得手动跑一遍。
这不是模型能力的问题,而是扩展层没有配置好。MCP 负责让 Claude Code 够得着外部工具和数据源,Skills 负责把重复的工作流封装成可复用的技能包,Hooks 负责在关键节点自动执行脚本做拦截和格式化。三者配合起来,才能把「每次都要说一遍」变成「配置一次,长期生效」。
这篇文章面向已经上手 Claude Code 的开发者,不讲安装和环境变量配置,直接进入 MCP 服务接入、Skills 复用、Hooks 自动化三类扩展能力的落地配置。我会给出可复制的 settings 与 MCP 配置片段,演示一次从触发到验证的完整流程,并对照真实报错给出排查路径。适合谁:已经能用 Claude Code 完成日常编码,但想让它在团队协作和长期项目里更稳定、更省心的开发者。
2. TaoToken 前置:给 Claude Code 一个稳定的模型接入层
Claude Code 本身是一个客户端,它需要一个兼容 Anthropic API 的模型服务来驱动。你可以把它理解成:Claude Code 是方向盘和仪表盘,模型服务是发动机。发动机不稳定,再好的扩展配置也跑不起来。
TaoToken 在这里扮演的角色是模型接入层。它提供兼容 Anthropic API 的接口,你只需要把 Base URL 指向https://taotoken.net/api,配上 API Key 和 Model ID,Claude Code 就能正常发起请求。对于需要长期跑 Agent 任务的场景,接入层的稳定性直接决定了 Hooks 和 MCP 能不能可靠触发。
配置方式有两种。第一种是环境变量,适合快速验证:
export ANTHROPIC_BASE_URL=https://taotoken.net/api export ANTHROPIC_AUTH_TOKEN=你的APIKey export ANTHROPIC_MODEL=你的ModelID第二种是写进 Claude Code 的 settings 文件,适合长期使用。路径是~/.claude/settings.json(用户级)或项目根目录的.claude/settings.json(项目级)。项目级配置会覆盖用户级,团队协作时把项目级配置提交到仓库,所有人共享同一套接入参数。
这里有个容易踩的坑:环境变量和 settings 文件同时存在时,环境变量的优先级更高。如果你在 settings 里改了 Base URL 但没生效,先检查终端里有没有残留的ANTHROPIC_BASE_URL。用echo $ANTHROPIC_BASE_URL确认一下,有的话unset掉再重启 Claude Code。
API Key 的获取入口在 TaoToken 控制台的 API Keys 页面,建议给 Claude Code 单独创建一个 Key,方便后续按项目追踪用量。模型对话功能可以用来快速验证 Key 是否有效,不用每次都启动完整的 Claude Code 会话。
3. 可复制配置:MCP、Skills、Hooks 三件套的 settings 片段
这一节给出可以直接复制粘贴的配置片段。路径和原文保持一致,你只需要替换 Key 和 Model ID。
3.1 settings.json 基础配置
先看~/.claude/settings.json的完整结构。这个文件同时承载模型接入、Hooks 和权限配置:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "你的APIKey", "ANTHROPIC_MODEL": "你的ModelID" }, "hooks": { "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "bun run format || true" } ] } ], "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "~/.claude/hooks/check-dangerous.sh" } ] } ] }, "permissions": { "allow": ["Read", "Write", "Edit", "Bash(git:*)"], "deny": ["Bash(rm -rf:*)"] } }注意env块里的三个变量:Base URL 指向 TaoToken 的 API 地址,Auth Token 是你的 Key,Model 是你要用的模型 ID。这三个是 Claude Code 能跑起来的前提。
3.2 MCP 配置片段
MCP 配置写在~/.claude/mcp.json或项目级.claude/mcp.json。下面是一个包含文件系统和 GitHub 两个 MCP Server 的配置:
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/yourname/projects"], "disabled": false }, "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "your_github_token_here" }, "disabled": false } } }filesystem这个 Server 让 Claude Code 能访问指定目录之外的文件,github让它能直接读 Issue、PR 和仓库内容。配置完成后用claude mcp list验证是否加载成功。
3.3 Skills 目录结构
Skills 放在~/.claude/skills/下,每个 Skill 一个目录。最小结构只需要两个文件:
~/.claude/skills/my-skill/ ├── skill.json └── skill.mdskill.json定义元数据:
{ "name": "api-doc-generator", "description": "从路由文件自动生成 API 文档", "version": "1.0.0", "skill": { "file": "skill.md", "description": "扫描 Express 路由并输出 Markdown 格式的 API 文档" } }skill.md写具体的工作流指令。Claude Code 在匹配到相关任务时会自动加载这个 Skill 的内容作为上下文。
3.4 Hooks 脚本示例
危险命令拦截脚本~/.claude/hooks/check-dangerous.sh:
#!/bin/bash TOOL_INPUT=$(cat) COMMAND=$(echo "$TOOL_INPUT" | jq -r '.tool_input.command // empty') DANGEROUS_PATTERNS=("rm -rf /" "mkfs" "dd if=" "> /dev/sda") for pattern in "${DANGEROUS_PATTERNS[@]}"; do if [[ "$COMMAND" == *"$pattern"* ]]; then echo "拦截:检测到危险命令 $pattern" >&2 exit 2 fi done exit 0exit 2表示阻止这次工具调用,Claude Code 会收到拦截信号并停止执行。exit 0表示放行。这个脚本挂在PreToolUse的Bashmatcher 上,每次执行 Bash 命令前都会先跑一遍。
4. 验证请求:从触发到成功的完整流程
配置写完了,得验证它真的在工作。这一节演示一次完整流程:写一个文件,触发 PostToolUse Hook 自动格式化,然后通过 MCP 读取外部目录,最后确认 Skills 被正确加载。
4.1 验证模型接入
先确认 Claude Code 能正常连上模型服务。启动 Claude Code 后输入一个简单请求:
帮我列出当前目录下的文件如果返回了文件列表,说明 Base URL、Key、Model 三个参数都正确。如果报 401,跳到第 5 节排查。
4.2 验证 Hooks 触发
让 Claude Code 写一个故意格式混乱的 JS 文件:
创建一个 test.js,内容是一段没有缩进的 JavaScript 函数写入完成后,PostToolUse Hook 会自动执行bun run format。检查test.js的内容,如果缩进被自动修正了,说明 Hook 生效。你可以在 Hook 命令里加一行日志来确认:
{ "type": "command", "command": "echo \"[$(date)] Hook triggered\" >> ~/.claude/hooks.log && bun run format || true" }然后tail -f ~/.claude/hooks.log实时观察触发记录。
4.3 验证 MCP 连接
在 Claude Code 里输入:
用 filesystem mcp 列出 /Users/yourname/projects 下的所有目录如果返回了目录列表,说明 MCP Server 加载成功。如果提示找不到工具,用claude mcp list检查 Server 状态,确认disabled字段是false。
4.4 验证 Skills 加载
输入/skills查看已加载的 Skill 列表。找到你配置的api-doc-generator,然后触发它:
使用 api-doc-generator skill 为 src/routes 下的路由生成文档Claude Code 会读取skill.md里的指令,扫描路由文件,输出 Markdown 文档。如果 Skill 没出现在列表里,检查skill.json的 JSON 格式是否合法,以及目录是否放在~/.claude/skills/下。
4.5 完整链路验证
把上面几步串起来跑一次:让 Claude Code 写一个新路由文件,PostToolUse Hook 自动格式化,然后调用 Skill 生成文档,最后通过 MCP 把文档推到 GitHub。这一套跑通,说明三类扩展能力都在正常工作。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易撞上四类报错。这一节对照真实错误信息给出排查路径。
5.1 401 Unauthorized
报错长这样:
API Error: 401 {"error":{"message":"Invalid API key"}}原因通常是 Key 不对或没传进去。排查顺序:先echo $ANTHROPIC_AUTH_TOKEN确认环境变量存在;再检查~/.claude/settings.json里env.ANTHROPIC_AUTH_TOKEN的值有没有多余空格;最后确认 Key 没有过期或被禁用。如果用的是项目级 settings,确认文件路径是.claude/settings.json而不是.claude/settings.local.json。
5.2 local proxy failed
报错信息:
Error: local proxy failed to start: listen tcp 127.0.0.1:xxxx: bind: address already in use这是端口被占用。Claude Code 启动时会起一个本地代理端口,如果上一个会话没正常退出,端口还占着。解决办法:lsof -i :端口号找到进程,kill -9 PID干掉,然后重启 Claude Code。或者直接重启终端。
5.3 reading choices 相关报错
报错信息:
Error reading choices: unexpected end of JSON input这通常出现在 MCP Server 返回了非 JSON 格式的输出。MCP 协议要求 Server 通过 stdout 输出 JSON-RPC 消息,如果你的 Server 脚本里混入了console.log调试语句,就会污染输出流。检查 MCP Server 的代码,把所有调试输出改成console.error,保证 stdout 只有协议消息。
5.4 OAuth 相关报错
报错信息:
OAuth error: invalid_grant如果你用的是需要 OAuth 的 MCP Server(比如某些云服务集成),token 过期后会报这个。重新走一遍授权流程,或者检查 refresh token 是否还在有效期内。对于 GitHub MCP,直接用 Personal Access Token 走env.GITHUB_TOKEN更省事,不用折腾 OAuth。
5.5 配置三件套检查清单
任何接入问题,先对照这三项:
| 检查项 | 正确值 | 常见错误 |
|---|---|---|
| Base URL | https://taotoken.net/api | 多了尾部斜杠或路径 |
| API Key | 控制台生成的 Key | 复制时带了空格 |
| Model ID | 控制台显示的模型名 | 大小写不一致 |
这三项在settings.json的env块里,或者在环境变量里。两处都有时环境变量优先,排查时先看环境变量。
6. 把扩展配置沉淀为团队资产
配置跑通之后,下一步是让它变成团队可复用的资产。项目级的.claude/settings.json、.claude/mcp.json、.claude/skills/都可以提交到 Git 仓库,新成员 clone 下来就能用同一套扩展配置。Hooks 脚本放在.claude/hooks/下,记得加执行权限chmod +x。
一个实用的技巧:把 Hooks 的日志输出到项目内的.claude/hooks.log,并在.gitignore里排除掉。这样每个人都能看到自己的 Hook 触发记录,又不会污染仓库。
如果你需要长期跑 Agent 任务,Coding Plan 提供了更稳定的调用配额,适合把 Claude Code 作为日常开发主力工具的团队。模型对话入口可以用来快速验证配置改动,不用每次都启动完整会话。接入文档里有完整的参数说明和示例,遇到配置问题时可以先对照一遍。
最后留一个我踩过的坑:Skills 的skill.md里不要写太泛的指令,比如「帮我优化代码」这种。Claude Code 会在很多不相关的任务里误加载这个 Skill,反而干扰正常流程。指令写得越具体,触发越精准。