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 能够:

  1. 知道何时使用:当用户说"帮我搜一下今天的天气",Skill 告诉 Agent 应该用 web_search 还是调用天气 API。
  2. 知道怎么使用:Skill 记录了工具的参数限制、常见错误、最佳实践。
  3. 知道业务逻辑:比如某个 skill 可以告诉 Agent"闲鱼选品要看闲鱼指数",这是业务知识,不属于工具能力本身。

Skill 文件是普通 Markdown,可以放在工作区、共享目录或插件里。OpenClaw 会自动把所有适用的 Skill 注入到系统提示里。

打个比方:工具是刀,Skill 是用刀手册。刀本身不会告诉你第3步要往哪里切——那是手册的事。


工具调用原理:完整流程

梳理一下一个工具从"Agent 决定调用"到"结果返回给 Agent"的全流程:

  1. 系统启动时:OpenClaw 加载所有已启用的插件,注册工具 schema
  2. 会话初始化:工具 schema(经过权限过滤后)作为系统提示的一部分发给模型
  3. 对话进行中:用户发送消息 → 模型决定调用工具 → 生成函数调用参数
  4. 执行:OpenClaw 接收函数调用 → 检查权限(allow/deny) → 在正确环境(沙箱/宿主机)执行 → 捕获输出
  5. 结果返回:工具执行结果作为消息内容追加到上下文 → 模型看到结果 → 继续推理或生成最终回复

这个循环对用户来说是透明的——你只管说话,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 官方工具文档 编写,内容已融入个人理解。