defineToolPlugin crea un Plugin que solo agrega herramientas invocables por agentes: sin
canal, proveedor de modelos, hook, servicio ni backend de configuración. Genera los
metadatos de manifiesto que OpenClaw necesita para descubrir herramientas sin cargar el
código de runtime del Plugin.
Para plugins de proveedor, canal, hook, servicio o capacidades mixtas, empieza con
Crear plugins, Plugins de canal
o Plugins de proveedor.
Requisitos
- Node 22.19+, Node 23.11+ o Node 24+.
- Salida de paquete TypeScript ESM.
typeboxendependencies(no solo endevDependencies; el Plugin generado lo importa en runtime).openclaw >=2026.5.17, la primera versión que exportaopenclaw/plugin-sdk/tool-plugin.- Una raíz de paquete que distribuya
dist/,openclaw.plugin.jsonypackage.json.
Inicio rápido
plugins init genera:
| Archivo | Propósito |
|---|---|
src/index.ts | Entrada de defineToolPlugin con una herramienta echo |
src/index.test.ts | Prueba de metadatos que valida la lista de herramientas |
tsconfig.json | Salida TypeScript NodeNext a dist/ |
vitest.config.ts | Configuración de Vitest para src/**/*.test.ts |
package.json | Scripts, dependencias de runtime, openclaw.extensions: ["./dist/index.js"] |
openclaw.plugin.json | Metadatos de manifiesto generados para la herramienta inicial |
npm run plugin:build ejecuta npm run build (tsc) y luego
openclaw plugins build --entry ./dist/index.js. npm run plugin:validate
recompila y ejecuta openclaw plugins validate --entry ./dist/index.js.
Una validación correcta imprime:
openclaw plugins init <id>:
| Flag | Valor predeterminado | Efecto |
|---|---|---|
--directory <path> | <id> | Directorio de salida |
--name <name> | <id> en título | Nombre para mostrar |
--type <type> | tool | Tipo de plantilla: tool o provider |
--force | desactivado | Sobrescribe un directorio de salida existente |
Escribir una herramienta
defineToolPlugin recibe la identidad del Plugin, un esquema de configuración
opcional y una lista estática de herramientas. Los tipos de parámetros y
configuración se infieren de los esquemas TypeBox.
Herramientas opcionales y con factory
Defineoptional: true cuando los usuarios deban permitir explícitamente la
herramienta antes de enviarla a un modelo. openclaw plugins build escribe la
entrada de manifiesto toolMetadata.<tool>.optional correspondiente, para que
OpenClaw pueda ver que la herramienta es opcional sin cargar el código de
runtime del Plugin.
factory cuando una herramienta necesite el contexto de herramienta de
runtime antes de poder crearse: para excluirse de una ejecución concreta,
inspeccionar el estado del sandbox o enlazar helpers de runtime. Los metadatos
siguen siendo estáticos aunque la herramienta concreta se construya en runtime.
definePluginEntry directamente cuando el Plugin calcule nombres de
herramientas de forma dinámica o combine herramientas con hooks, servicios,
proveedores o comandos.
Valores de retorno
defineToolPlugin envuelve valores de retorno simples en el formato de
resultado de herramienta de OpenClaw:
- Devuelve una cadena cuando el modelo deba ver exactamente ese texto.
- Devuelve un valor compatible con JSON cuando quieras que el modelo vea JSON
formateado y que OpenClaw conserve el valor original en
details.
AgentToolResult
personalizado o quieras reutilizar una implementación existente de
api.registerTool.
Configuración
configSchema es opcional. Omítelo y OpenClaw aplicará un esquema estricto de
objeto vacío; el manifiesto generado seguirá incluyendo configSchema.
configSchema, el segundo argumento de execute se tipa a partir de él:
Metadatos generados
OpenClaw debe leer el manifiesto del Plugin antes de importar el código de runtime del Plugin.defineToolPlugin expone metadatos estáticos para esto, y
openclaw plugins build los escribe en el paquete. Vuelve a ejecutar el
generador después de cambiar el id, nombre, descripción, esquema de
configuración, activación o nombres de herramientas del Plugin:
contracts.tools es el contrato de descubrimiento importante: le indica a
OpenClaw qué Plugin posee cada herramienta sin cargar el runtime de todos los
plugins instalados. Un manifiesto obsoleto significa que una herramienta puede
desaparecer del descubrimiento o que un error de registro se atribuya al
Plugin equivocado.
Metadatos del paquete
openclaw plugins build también alinea package.json con la entrada de runtime
seleccionada:
./dist/index.js), no una entrada de código
fuente TypeScript. Las entradas de código fuente solo funcionan para desarrollo
local dentro del workspace.
Validar en CI
plugins build --check falla sin reescribir archivos cuando los metadatos
generados están obsoletos:
plugins validate comprueba que:
openclaw.plugin.jsonexista y pase el cargador de manifiestos normal.- La entrada actual exporte metadatos de
defineToolPlugin. - Los campos de manifiesto generados coincidan con los metadatos de la entrada.
contracts.toolscoincida con los nombres de herramientas declarados.package.jsonapunteopenclaw.extensionsa la entrada de runtime seleccionada.
Instalar e inspeccionar localmente
Desde otro checkout de OpenClaw o una CLI instalada, instala la ruta del paquete:Publicar
Publica a través de ClawHub una vez que el paquete esté listo.clawhub package publish
recibe un origen: una carpeta local, un repositorio de GitHub (owner/repo[@ref]) o una
URL de tarball.
Solución de problemas
plugin entry not found: ./dist/index.js
El archivo de entrada seleccionado no existe. Ejecuta npm run build y luego
vuelve a ejecutar openclaw plugins build --entry ./dist/index.js o
openclaw plugins validate --entry ./dist/index.js.
plugin entry does not expose defineToolPlugin metadata
La entrada no exportó un valor creado por defineToolPlugin. Confirma que la
exportación predeterminada del módulo sea el resultado de
defineToolPlugin(...), o pasa la entrada correcta con --entry.
openclaw.plugin.json generated metadata is stale
El manifiesto ya no coincide con los metadatos de la entrada. Ejecuta:
openclaw.plugin.json como los de package.json.
package.json openclaw.extensions must include ./dist/index.js
Los metadatos del paquete apuntan a una entrada de runtime diferente. Ejecuta
openclaw plugins build --entry ./dist/index.js para que el generador alinee
los metadatos del paquete con la entrada que quieres distribuir.
Cannot find package 'typebox'
El Plugin compilado importa typebox en runtime. Mantenlo en dependencies,
reinstala, recompila y vuelve a ejecutar la validación.
La herramienta no aparece después de instalar
Comprueba esto en orden:openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.jsontienecontracts.toolscon los nombres de herramientas esperados.package.jsontieneopenclaw.extensions: ["./dist/index.js"].- El Gateway se reinició o se recargó después de instalar el plugin.