defineToolPlugin。
推荐流程如下:
- 使用
openclaw plugins init搭建一个包。 - 使用
defineToolPlugin编写工具。 - 构建 JavaScript。
- 使用
openclaw plugins build生成openclaw.plugin.json和package.json元数据。 - 在发布或安装前验证生成的元数据。
要求
- Node >= 22。
- TypeScript ESM 包输出。
- 用于配置和工具参数 schema 的
typebox。 openclaw >=2026.5.17,这是第一个导出openclaw/plugin-sdk/tool-plugin的 OpenClaw 版本。- 一个可以发布
dist/、openclaw.plugin.json和package.json的包根目录。
typebox,因此请将 typebox 保留在 dependencies 中,而不只是 devDependencies。
快速开始
创建一个新的插件包:src/index.ts:一个带有echo工具的defineToolPlugin入口。src/index.test.ts:一个小型的元数据测试。tsconfig.json:输出到dist/的 NodeNext TypeScript。package.json:脚本、运行时依赖,以及openclaw.extensions: ["./dist/index.js"]。openclaw.plugin.json:初始工具的生成清单元数据。
编写工具
defineToolPlugin 接受插件标识、一个可选的配置 schema,以及一个静态工具列表。参数和配置类型会从 TypeBox schemas 中推断。
可选工具和工厂工具
当用户应该在工具发送给模型之前显式允许列表化时,将optional: true 设为开启:
openclaw plugins build 会写入匹配的 toolMetadata.<tool>.optional 清单条目,这样 OpenClaw 就可以在不加载插件运行时代码的情况下发现该工具。
当工具在创建之前需要运行时工具上下文时,请使用 factory。工厂会保持元数据静态,同时允许工具针对特定运行选择退出、检查沙箱状态,或绑定运行时辅助函数。
definePluginEntry。
返回值
defineToolPlugin 会将普通返回值包装为 OpenClaw 工具结果格式:
- 当模型应看到那段精确文本时,返回一个字符串。
- 当你希望模型看到格式化的 JSON,并且 OpenClaw 将原始值保留在
details中时,返回一个兼容 JSON 的值。
AgentToolResult,或重用已有的 api.registerTool 实现时,请使用工厂工具。当你需要完全动态的工具或混合插件能力时,请使用 definePluginEntry,而不是 defineToolPlugin。
配置
configSchema 是可选的。如果省略它,OpenClaw 会使用严格的空对象 schema,生成的清单中仍然会包含 configSchema。
configSchema 时,第二个 execute 参数会从该 schema 中进行类型推断:
生成的元数据
OpenClaw 通过冷元数据发现已安装插件。它必须能够在导入插件运行时代码之前读取插件清单。defineToolPlugin 因此会暴露静态元数据,而 openclaw plugins build 会将该元数据写入包中。
在更改插件 id、名称、描述、配置 schema、激活方式或工具名称后,请运行生成器:
contracts.tools 是重要的发现契约。它会告诉 OpenClaw 每个工具由哪个插件拥有,而无需加载每个已安装插件的运行时。如果清单过期,工具可能无法被发现,或者注册错误可能会被归咎到错误的插件。
包元数据
对于简单的工具插件工作流,openclaw plugins build 会将 package.json 对齐到选定的单一运行时入口:
./dist/index.js 这样的构建后 JavaScript。源文件入口在工作区开发中很有用,但已发布的包不应依赖于 TypeScript 运行时加载。
在 CI 中验证
使用plugins build --check 在生成元数据过期时让 CI 失败,而不重写文件:
plugins validate 会检查以下内容:
openclaw.plugin.json是否存在并通过常规清单加载器。- 当前入口是否导出
defineToolPlugin元数据。 - 生成的清单字段是否与入口元数据匹配。
contracts.tools是否与声明的工具名称匹配。package.json是否将openclaw.extensions指向所选的运行时入口。
在本地安装和检查
从另一个 OpenClaw 检出目录或已安装的 CLI 中,安装包路径:发布
当包准备就绪时,通过 ClawHub 发布:故障排查
plugin entry not found: ./dist/index.js
所选的入口文件不存在。运行 npm run build,然后重新执行
openclaw plugins build --entry ./dist/index.js 或
openclaw plugins validate --entry ./dist/index.js。
plugin entry does not expose defineToolPlugin metadata
该入口没有导出由 defineToolPlugin 创建的值。请检查
模块的默认导出是否为 defineToolPlugin(...) 的结果,或者通过 --entry
传入正确的入口。
openclaw.plugin.json generated metadata is stale
清单不再与入口元数据匹配。运行:
openclaw.plugin.json 和 package.json 的更改。
package.json openclaw.extensions must include ./dist/index.js
包元数据指向了不同的运行时入口。运行
openclaw plugins build --entry ./dist/index.js,这样生成器就会将
包元数据与您打算发布的入口对齐。
Cannot find package 'typebox'
构建后的插件在运行时导入了 typebox。请将 typebox 保持在
dependencies 中,重新安装包依赖,重新构建,并再次运行验证。
安装后工具没有出现
按以下顺序检查:openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.json的contracts.tools中包含预期的工具名称。package.json包含openclaw.extensions: ["./dist/index.js"]。- 安装插件后,Gateway 已重启或重新加载。