OpenClaw 工具系统完全解读:Agent 如何操控你的电脑
大语言模型本身只会说话——它能生成漂亮的文本,但无法帮你打开文件、运行命令、发消息、搜索网页。工具(Tools) 就是 OpenClaw 赋予 Agent “动手能力"的机制:每一个工具都是一个 typed function,Agent 通过调用它来真正影响外部世界。
理解 OpenClaw 的工具系统,是掌握整个框架能力上限的关键。本文从工具的定义、内置工具一览、插件生态、权限控制、Skill 引导层五个维度,完整解读这套系统。
工具是什么:从文本到行动
在 OpenClaw 里,工具是 Agent 可以调用的、带结构化参数函数。Agent 并不是"学会了"如何使用工具——它是通过函数定义(function signature)来理解每个工具能做什么、接受什么参数。
当你配置好 OpenClaw 后,系统会把可用工具的 schema 发给模型 API,模型根据对话上下文决定调用哪个工具、传什么参数,然后 OpenClaw 执行这个调用并把结果返回给模型。这是一个完整的感知-决策-执行循环。
这和直接让模型执行 Python 代码不同:工具是显式声明的、受控的、可审计的,而任意代码执行是"全有或全无"的授权。
三层架构:工具、Skill、插件
OpenClaw 的工具体系分为三层,理解它们的区别至关重要:
第一层:工具(Tools)
工具是 Agent 实际调用的函数。比如 exec(运行 Shell 命令)、read(读文件)、browser(控制浏览器)、message(发消息)。工具的 schema 直接暴露给模型,模型看到的是结构化的函数签名和参数描述。
第二层:Skill
Skill 是一份 Markdown 文档(SKILL.md),告诉 Agent 在什么场景下、怎么用某个工具。Skill 不提供代码能力,而是提供"经验和约束”——比如某个 API 的调用顺序、某个工具的参数限制、需要避免的错误。
Skill 会被注入到系统提示里,作为 Agent 的背景知识。Skill 可以存在于:
- 工作区本地(
~/.openclaw/workspace/skills/) - 共享目录
- 插件内部
第三层:插件(Plugins)
插件是把工具、Skill、渠道、模型提供商等打包在一起的发布单元。插件可以注册任意组合的能力:一个插件可以同时包含工具、Skill、消息渠道和语音合成。OpenClaw 自带一批核心(core)插件,社区也可以在 npm 上发布外部插件。
这个分层的意义在于:能力注册在插件层,选择使用在工具层,知道何时用、怎么用靠 Skill 层。三者配合,才是一套完整的 Agent 工具链。
内置工具一览
OpenClaw 预装的核心工具,不需要安装任何插件就能用:
| 工具 | 功能 |
|---|---|
exec / process |
运行 Shell 命令、管理后台进程 |
code_execution |
沙箱化远程 Python 分析 |
browser |
控制 Chromium 浏览器(导航、点击、截图) |
web_search |
搜索网页内容 |
x_search |
搜索 X(Twitter)帖子 |
web_fetch |
获取页面内容(Markdown 提取) |
read |
读取工作区文件 |
write |
写入/创建工作区文件 |
edit |
对文件进行精确替换编辑 |
apply_patch |
多区块文件补丁 |
message |
向所有配置的渠道发送消息 |
canvas |
控制节点 Canvas(展示、快照) |
nodes |
发现并定位已配对的设备 |
cron / gateway |
管理定时任务、重启网关 |
image |
分析图片内容 |
image_generate |
生成或编辑图片 |
sessions_* |
会话管理、子 Agent |
agents_list |
查看可用 Agent |
下面重点介绍几个最常用的工具。
exec/process:Shell 命令执行
exec 是 OpenClaw 最强大也最危险的工具——它让你可以在宿主机(或沙箱容器)上运行任意 Shell 命令。你可以:
- 运行脚本、安装依赖、编译代码
- 管理 Docker 容器、进程
- 执行任何终端能做的事
process 是 exec 的后台进程管理版本,可以启动一个持续运行的后台进程,并在后续对话中继续向它发送输入。
重要:如果你配置了沙箱,exec 会跑在沙箱里;如果没有沙箱,它直接跑在宿主机上。权限由沙箱配置决定。
browser:浏览器自动化
browser 工具控制一个无头 Chromium 实例,支持:
- 导航到 URL
- 点击页面元素
- 填写表单
- 截图和页面快照
- JavaScript 执行
如果配置了沙箱浏览器,Chromium 跑在独立的沙箱容器里,不会影响宿主机上的任何东西。浏览器工具有自己的沙箱网络隔离,且 noVNC 访问默认有密码保护。
web_search / web_fetch:网络访问
web_search:调用 Brave Search API(或配置的搜索提供商)搜索网页web_fetch:抓取指定 URL 并提取可读内容(Markdown 格式)
这两个工具让 Agent 拥有了实时获取外部信息的能力,是回答时事问题、研究任务的基础。
message:跨渠道发消息
message 工具可以向所有已配置的消息渠道发送消息——一次调用,覆盖所有渠道。你可以用它来:
- 把分析结果同步到 Discord/Telegram
- 通过飞书/钉钉通知团队
- 跨渠道广播
插件工具生态
除了内置工具,OpenClaw 的插件系统让整个社区都能扩展 Agent 的能力边界。官方文档里提到的插件工具包括:
Lobster
typed 工作流运行时,支持可恢复的审批流程。适合需要人工确认的复杂自动化任务。
LLM Task
纯 JSON 输出的 LLM 调用步骤,强制模型返回结构化数据,适合需要精确输出的场景(比如提取表单数据、分类、实体识别)。
Diffs
代码差异查看和渲染工具,可以把 git diff 渲染成人类可读的格式。
OpenProse
Markdown 先行的任务编排工作流,适合把长任务拆成多个步骤。
社区可以在 npm 上发布插件,OpenClaw 支持通过插件管理器(openclaw plugin install)安装外部插件。
工具权限控制:谁可以调用什么
工具系统里最关键的安全机制是权限控制。OpenClaw 提供了细粒度的 allow/deny 机制:
Allow 和 Deny 列表
{
tools: {
allow: ["group:fs", "browser", "web_search"],
deny: ["exec"]
}
}
规则很简单:Deny 永远覆盖 Allow。即使你在 allow 里列了一百个工具,只要 deny 里有一个,所有会话都无法调用它。
工具组(Tool Groups)
手动列出每个工具太麻烦,OpenClaw 提供了工具组快捷方式:
| 组名 | 包含的工具 |
|---|---|
group:runtime |
exec, bash, process, code_execution |
group:fs |
read, write, edit, apply_patch |
group:sessions |
sessions_list, sessions_history, sessions_send, sessions_spawn, sessions_yield, subagents, session_status |
group:memory |
memory_search, memory_get |
group:web |
web_search, x_search, web_fetch |
group:ui |
browser, canvas |
group:automation |
cron, gateway |
group:messaging |
message |
group:nodes |
nodes |
group:openclaw |
所有内置 OpenClaw 工具(不含插件工具) |
工具 Profile(配置文件预设)
Profile 是预设的工具组合,适合快速切换不同安全级别的配置:
| Profile | 包含的工具 |
|---|---|
full |
所有工具(默认) |
coding |
文件 I/O、运行时、会话、内存、图片 |
messaging |
消息、会话列表/历史/发送/状态 |
minimal |
仅 session_status |
按提供商差异化配置
有时同一个模型在不同提供商那里需要不同的工具集:
{
tools: {
profile: "coding",
byProvider: {
"google-antigravity": { profile: "minimal" }
}
}
}
这让你可以在全局用 coding profile,但某个特定提供商的模型只能用 minimal 工具集。
沙箱里的工具权限
前面说了沙箱,这里和工具权限的关系需要单独说明:
- 沙箱控制在哪里执行(宿主机 vs 容器)
- 工具权限控制可以调用哪些工具
两者是正交的:你可以有完整的工具权限但被限制在沙箱容器里(无法访问宿主机文件系统),也可以有所有工具但沙箱关闭(工具直接跑在宿主机上)。
tools.elevated 是例外——它允许的工具始终绕过沙箱,直接在宿主机上运行。
Skill 层:工具的使用说明书
工具本身只是能力,Skill 告诉你怎么用才能不出错。OpenClaw 的 Skill 系统让 Agent 能够:
- 知道何时使用:当用户说"帮我搜一下今天的天气",Skill 告诉 Agent 应该用
web_search还是调用天气 API。 - 知道怎么使用:Skill 记录了工具的参数限制、常见错误、最佳实践。
- 知道业务逻辑:比如某个 skill 可以告诉 Agent"闲鱼选品要看闲鱼指数",这是业务知识,不属于工具能力本身。
Skill 文件是普通 Markdown,可以放在工作区、共享目录或插件里。OpenClaw 会自动把所有适用的 Skill 注入到系统提示里。
打个比方:工具是刀,Skill 是用刀手册。刀本身不会告诉你第3步要往哪里切——那是手册的事。
工具调用原理:完整流程
梳理一下一个工具从"Agent 决定调用"到"结果返回给 Agent"的全流程:
- 系统启动时:OpenClaw 加载所有已启用的插件,注册工具 schema
- 会话初始化:工具 schema(经过权限过滤后)作为系统提示的一部分发给模型
- 对话进行中:用户发送消息 → 模型决定调用工具 → 生成函数调用参数
- 执行:OpenClaw 接收函数调用 → 检查权限(allow/deny) → 在正确环境(沙箱/宿主机)执行 → 捕获输出
- 结果返回:工具执行结果作为消息内容追加到上下文 → 模型看到结果 → 继续推理或生成最终回复
这个循环对用户来说是透明的——你只管说话,OpenClaw 负责在后台协调模型推理和工具执行。
常见场景:如何配置工具集
场景一:纯研究 Agent(只读)
{
tools: {
allow: ["group:web", "group:fs", "group:memory"],
deny: ["group:runtime", "group:automation"]
}
}
能读文件、搜网页、查记忆,但不能运行命令或发消息。
场景二:开发 Agent(允许命令)
{
tools: {
profile: "coding"
}
}
允许文件 I/O、代码执行、会话管理、图片处理,覆盖大多数开发场景。
场景三:消息通知 Agent
{
tools: {
allow: ["group:messaging", "group:web"],
deny: ["group:runtime", "group:fs"]
}
}
只能发消息和搜索,不能读写文件或运行命令。
工具系统的设计哲学
看完这套体系,你会发现 OpenClaw 的工具系统有几个明显的设计倾向:
最小权限原则:默认情况下工具权限是开放的(full profile),但你可以通过 deny 精确撤销危险操作,而不是从零开始一点点加权限。
声明式优于命令式:你声明"哪些工具可用",而不是告诉 Agent “第一步做什么第二步做什么”。Agent 自己根据上下文决定调用顺序。
工具是能力,Skill 是智慧:工具只管"能不能做",Skill 管"什么时候做、怎么做、要注意什么"。这种分离让工具本身保持简洁,同时通过 Skill 层实现领域特定的行为约束。
沙箱和权限是正交的安全层:执行位置(沙箱)和执行权限(allow/deny)是两套独立的控制机制,组合起来提供了相当灵活的纵深防御。
理解了这套体系,你就能真正掌握 OpenClaw Agent 的能力边界——而不是把它当成一个"什么都能做的魔法黑盒"。
本文基于 OpenClaw 官方工具文档 编写,内容已融入个人理解。