defineToolPlugin 构建一个仅添加智能体可调用工具的插件:不包含
渠道、模型提供商、钩子、服务或设置后端。它会生成 OpenClaw 所需的
清单元数据,以便无需加载插件运行时代码即可发现工具。
对于提供商、渠道、钩子、服务或混合能力插件,请改从
构建插件、渠道插件
或提供商插件开始。
要求
- Node 22.22.3+、Node 24.15+ 或 Node 25.9+。
- TypeScript ESM 软件包输出。
typebox位于dependencies中(不能只位于devDependencies中,因为生成的 插件会在运行时导入它)。openclaw >=2026.5.17,即首个导出openclaw/plugin-sdk/tool-plugin的版本。- 一个会发布
dist/、openclaw.plugin.json和package.json的软件包根目录。
快速开始
plugins init 会搭建:
npm run plugin:build 会运行 npm run build(tsc),然后运行
openclaw plugins build --entry ./dist/index.js。npm run plugin:validate
会重新构建并运行 openclaw plugins validate --entry ./dist/index.js。
验证成功时会输出:
openclaw plugins init <id> 选项:
编写工具
defineToolPlugin 接受插件标识、可选配置架构和
静态工具列表。参数和配置类型从
TypeBox 架构推断。
可选工具和工厂工具
当用户应先将工具显式加入允许列表,之后才将其发送给 模型时,请设置optional: true。openclaw plugins build 会写入匹配的
toolMetadata.<tool>.optional 清单条目,因此 OpenClaw 无需加载插件运行时代码
即可发现该工具为可选工具。
factory,例如针对特定运行
选择退出、检查沙箱状态或绑定
运行时辅助函数。虽然具体工具在运行时构建,但元数据仍保持静态。
definePluginEntry。
返回值
defineToolPlugin 会将普通返回值包装为 OpenClaw 工具结果
格式:
- 当模型应看到完全一致的文本时,返回字符串。
- 当你希望模型看到格式化的 JSON,并让 OpenClaw 将原始值保留在
details中时, 返回与 JSON 兼容的值。
AgentToolResult,或希望复用现有
api.registerTool 实现时,请使用工厂工具。
输出契约
当工具返回稳定的 JSON 兼容数据时,请添加outputSchema。它描述的是
存储在 AgentToolResult.details 中的原始值,而非
content 中的格式化文本:
details 值,之后再通过桥接返回。无效的架构无法运行工具;结果不匹配会使已完成的
调用失败。请包含所有不会抛出异常的结果变体,包括结构化错误
变体;如果结果不稳定,则省略该架构。不要在架构描述中放置机密信息
或敏感值,因为受信任的输出元数据可能会对模型可见。
当你需要完整、紧凑的输出提示时,请在对象层使用 { additionalProperties: false };
开放或截断的架构仍可通过 tools.describe(...) 使用,但不会作为完整的快速索引契约进行公布。
工厂工具在其返回的具体 AnyAgentTool 上声明 outputSchema。
静态 tool({ factory }) 声明不接受单独的
输出架构,因为它可能会与运行时工具产生偏差。
配置
configSchema 是可选的。省略它时,OpenClaw 会应用严格的空对象
架构;生成的清单仍会包含 configSchema。
configSchema 时,第二个 execute 参数的类型会从中推断:
生成的元数据
OpenClaw 必须先读取插件清单,之后才能导入插件运行时代码。defineToolPlugin 会为此公开静态元数据,而
openclaw plugins build 会将其写入软件包。更改插件 ID、名称、描述、配置架构、激活设置或工具
名称后,请重新运行生成器:
contracts.tools 是重要的发现契约:它告诉 OpenClaw 每个工具
归哪个插件所有,而无需加载所有已安装插件的运行时。过期的清单
可能导致工具无法被发现,或将注册
错误错误地归咎于其他插件。
软件包元数据
openclaw plugins build 还会将 package.json 与所选运行时
入口对齐:
./dist/index.js),而不是 TypeScript 源代码入口。
源代码入口仅适用于工作区本地开发。
在 CI 中验证
当生成的元数据过期时,plugins build --check 会在不重写文件的情况下失败:
@deprecated 注解,
编辑器会将其显示为迁移警告。若要在 CI 中强制检查,请启用
类型感知规则,例如
@typescript-eslint/no-deprecated。
Oxlint 不具备类型感知能力,因此无法强制检查这些注解。因此,生成的
plugins init 脚手架不会添加弃用 lint 配置。
plugins validate 会检查:
openclaw.plugin.json存在并通过常规清单加载器。- 当前入口导出
defineToolPlugin元数据。 - 生成的清单字段与入口元数据匹配。
contracts.tools与声明的工具名称匹配。package.json将openclaw.extensions指向所选的运行时入口。
在本地安装并检查
从另一个 OpenClaw 检出目录或已安装的 CLI 安装该软件包路径:发布
软件包准备就绪后,通过 ClawHub 发布。clawhub package publish
接受一个来源:本地文件夹、GitHub 仓库(owner/repo[@ref])或
tarball URL。
故障排查
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。将其保留在 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 网关。