1. 为什么 OpenClaw Tools 值得单独写一篇配置实战
OpenClaw Tools 是 AI 智能体直接操作外部世界的标准化接口,你可以把它理解成给智能体装上的“钳子”:能开浏览器、跑命令、读写文件、发消息、控设备。它和 Skills 的区别很直白——Tools 是工具箱里的功能单元,Skills 是操作手册,两者配合,智能体才从“只会说”变成“会动手”。适合谁看?正在阿里云上部署 OpenClaw、准备把工具组接进生产流程的 AI 智能体开发者,尤其是需要统一 Key 通道、又不想把权限一次性开到最大的人。
我这次把重点放在三件事:10 大工具组怎么按场景裁剪、多层防护怎么落到 config.toml 和 settings.json、以及用 TaoToken 做统一 Key/API 通道后怎么验证工具真的被调起来。部署环境选阿里云轻量应用服务器,2 核 4GB 起步,系统镜像用 OpenClaw 预置镜像,省掉装 Node、Docker 的时间。下面所有配置都可以直接复制,改掉路径和 Key 就能跑。
2. TaoToken 前置:统一 Key 与 API 通道
OpenClaw 的工具组里,group:web、group:memory、group:sessions 这些都会向外发模型请求。如果每个工具组各配一套 Key,后面排障会非常痛苦。我的做法是先用 TaoToken 把模型通道统一掉,再让 OpenClaw 只认一个 base_url。
TaoToken 在这里的角色是统一 API 通道:你拿到一个 Key,就能在 OpenClaw 的模型配置里指向同一个入口,工具组调用时不用再关心上游是谁。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,注意 API 地址后面不加 UTM 参数,配置里写干净地址就行。
操作顺序建议这样:先登录控制台创建 API Key,再进模型对话页确认通道可用,最后回到 OpenClaw 写配置。控制台地址 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 管理页 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。如果你后面要长期跑编码类 Agent,可以顺带看 Coding Plan 页 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,把额度模型先定下来。
注意:Key 只写在服务端配置文件里,不要提交到 Git,也不要在前端页面里硬编码。OpenClaw 的 settings.json 建议放在 /opt/openclaw/tools 下并限制 600 权限。
3. 可复制配置:config.toml 与 settings.json 骨架
3.1 config.toml:工具组裁剪与多层防护
OpenClaw 的工具策略是三级配置:全局 profile、组级 allow/deny、单工具参数校验。下面这份 config.toml 以 coding 场景为底,禁用 group:nodes 和 gateway,只保留 fs、runtime、sessions、memory、web,同时给 exec 加白名单。
# /opt/openclaw/tools/config.toml [server] host = "0.0.0.0" port = 18789 workspace = "/app/workspace" log_dir = "/app/logs" [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" model = "claude-sonnet-4-20250514" timeout_seconds = 120 [tools] profile = "coding" deny = ["group:nodes", "gateway", "group:openclaw"] [tools.exec] security = "allowlist" allowlist = ["npm", "git", "pnpm", "node", "python3"] ask = "on-miss" askFallback = "deny" deny_path_override = true [tools.fs] root = "/app/workspace" read_only_paths = ["/etc", "/root"] max_file_size_mb = 20 [tools.browser] defaultProfile = "openclaw" headless = true [tools.browser.profiles.openclaw] cdpPort = 18800 color = "#FF4500" [security] loop_detection = true max_tool_calls_per_turn = 12 sandbox_mode = "all"几个关键点解释一下。deny_path_override = true是防二进制劫持的,避免工具通过改 PATH 调到非白名单命令。loop_detection防的是智能体反复调同一个工具停不下来,max_tool_calls_per_turn给单轮调用设上限。sandbox_mode = "all"让 exec 在 Docker 沙箱里跑,和宿主机隔离。
3.2 settings.json:运行时开关与浏览器隔离
settings.json 管的是运行时行为,和 config.toml 分工不同。config.toml 定策略,settings.json 定当前会话实际启用哪些工具组。
{ "runtime": { "profile": "coding", "enabledGroups": [ "group:fs", "group:runtime", "group:sessions", "group:memory", "group:web" ], "disabledGroups": [ "group:nodes", "group:automation", "group:messaging" ] }, "tools": { "exec": { "security": "allowlist", "allowlist": ["npm", "git", "pnpm", "node", "python3"], "ask": "on-miss", "askFallback": "deny" }, "browser": { "defaultProfile": "openclaw", "profiles": { "openclaw": { "cdpPort": 18800, "color": "#FF4500" }, "work": { "cdpPort": 18801, "color": "#0066CC" } } } }, "model": { "baseUrl": "https://taotoken.net/api", "apiKeyEnv": "TAOTOKEN_API_KEY" } }浏览器多配置隔离这块,我建议至少留两个 profile:openclaw 给智能体用,work 给自己调试用,端口错开,颜色区分,避免智能体操作污染你日常浏览的登录态。
3.3 阿里云侧的一键部署命令
镜像选好后,进实例执行下面这组命令,把目录、环境变量、容器一次拉起来。
# 1. 创建持久化目录 mkdir -p /opt/openclaw/tools /opt/openclaw/logs /opt/openclaw/workspace # 2. 写入 TaoToken Key(只写一次,后续容器读取) echo 'export TAOTOKEN_API_KEY="你的Key"' >> /etc/profile.d/openclaw.sh source /etc/profile.d/openclaw.sh # 3. 启动容器,挂载配置与工作区 docker run -d \ --name openclaw-tools \ --restart always \ -p 18789:18789 \ -v /opt/openclaw/tools:/app/tools \ -v /opt/openclaw/logs:/app/logs \ -v /opt/openclaw/workspace:/app/workspace \ -e TAOTOKEN_API_KEY="${TAOTOKEN_API_KEY}" \ -e SANDBOX_MODE="all" \ -e TOOL_PROFILE="coding" \ openclaw/openclaw:tools-full-2026 # 4. 生成管理员 Token docker exec -it openclaw-tools openclaw token generate --admin # 5. 查看工具组加载状态 docker exec -it openclaw-tools openclaw tools list第 5 步的输出会列出每个工具组的启用状态,如果 group:nodes 显示 disabled,说明 deny 生效了。
4. 验证请求:确认工具组真的被调起来
配置写完不算完,得验证。我一般分三层验:模型通道通不通、工具组加载对不对、实际调用能不能成。
4.1 验证 TaoToken 通道
先用 curl 打一次模型接口,确认 Key 和 base_url 没问题。
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'返回里有 choices 字段就说明通道通了。如果 401,检查 Key 有没有带 Bearer 前缀;如果 404,检查 base_url 是不是写成了带路径的地址。
4.2 验证工具组加载
docker exec -it openclaw-tools openclaw tools list --json重点看三处:group:fs、group:runtime、group:web 是不是 enabled;group:nodes 是不是 disabled;exec 的 security 是不是 allowlist。这三处对了,防护骨架就立住了。
4.3 验证 exec 白名单与 browser 调用
在控制台里发一条指令,让智能体执行git status,再让它打开一个页面截图。exec 走白名单会直接放行,browser 会返回元素引用。
{ "tool": "exec", "params": { "command": "git status", "security": "allowlist" } }{ "tool": "browser", "action": "snapshot", "mode": "ai" }snapshot 返回类似<button ref="12">提交</button>的结构,后面点击就用 ref,不要用坐标,坐标会随页面滚动失效。
5. 本篇常见错排查
5.1 容器起来了但工具组全是 disabled
大概率是 settings.json 里的 enabledGroups 和 config.toml 的 profile 冲突。profile 是底,enabledGroups 是覆盖层,两边都写 coding 时以 settings.json 为准。检查 /opt/openclaw/tools/settings.json 有没有被容器正确挂载,docker exec -it openclaw-tools cat /app/tools/settings.json看一眼内容对不对。
5.2 exec 一直 ask 或直接 deny
白名单没匹配上。allowlist 里写的是命令名,不是完整路径,npm install匹配npm,但/usr/local/bin/npm不会匹配。另外askFallback = "deny"意味着没人审批时直接拒,如果你在无人值守环境跑,要么把常用命令加进白名单,要么把 askFallback 改成 allow 并接受风险。
5.3 browser 工具报 cdpPort 占用
两个 profile 用了同一个端口。openclaw 用 18800,work 用 18801,别写重。如果端口被别的进程占了,ss -lntp | grep 18800查一下,改配置里的端口号再重启容器。
5.4 模型请求 401 但 Key 明明是对的
检查环境变量有没有传进容器。docker exec -it openclaw-tools env | grep TAOTOKEN看一眼。如果为空,说明 docker run 时 -e 没生效,或者 /etc/profile.d 里的变量没 source。最稳的做法是在 docker run 命令里直接写 -e TAOTOKEN_API_KEY="xxx",不依赖宿主机环境。
5.5 工具调用循环停不下来
loop_detection 开了但 max_tool_calls_per_turn 设太大。默认 12 次,复杂任务可以放到 20,但别不设上限。如果发现智能体反复调同一个工具,先看日志tail -f /opt/openclaw/logs/tool.log,定位是哪个工具在循环,再决定是收紧白名单还是拆任务。
6. 把通道和工具组接稳之后
配置到这一步,OpenClaw Tools 的 10 大工具组已经按 coding 场景裁剪好,多层防护落在 config.toml 和 settings.json 两层,TaoToken 统一了模型通道。接下来你要做的,是把 API Key 管好、把接入文档过一遍,再决定要不要开长期编码额度。
API Keys 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。如果你要验证模型对话效果,直接进 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 试一轮;如果准备把 OpenClaw 当长期编码 Agent 跑,Coding Plan 页 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 里有额度说明。Claude Code 相关的接入细节在 https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。
最后留一个我踩过的坑:容器重启后 settings.json 如果被覆盖,工具组会回到 profile 默认值。把 settings.json 放在挂载目录里,并且用chmod 600锁住,重启后先openclaw tools list确认一遍再放任务进去。