defineToolPlugin crea un plugin que solo añade herramientas invocables por el agente: sin
canal, proveedor de modelos, hook, servicio ni backend de configuración. Genera los
metadatos del manifiesto que OpenClaw necesita para descubrir herramientas sin cargar el código
de ejecución del plugin.
Para plugins de proveedor, canal, hook, servicio o capacidades mixtas, se debe comenzar con
Creación de plugins, Plugins de canal
o Plugins de proveedor.
Requisitos
- Node 22.22.3+, Node 24.15+ o Node 25.9+.
- Salida de paquete ESM de TypeScript.
typeboxendependencies(no solodevDependencies; el plugin generado lo importa durante la ejecución).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 la estructura de:
npm run plugin:build ejecuta npm run build (tsc) y después
openclaw plugins build --entry ./dist/index.js. npm run plugin:validate
vuelve a compilar y ejecuta openclaw plugins validate --entry ./dist/index.js.
Una validación correcta muestra:
openclaw plugins init <id>:
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 de TypeBox.
Herramientas opcionales y de fábrica
Se debe estableceroptional: true cuando los usuarios deban incluir explícitamente la herramienta en la lista de permitidas antes de
enviarla a un modelo. openclaw plugins build escribe la entrada de manifiesto
toolMetadata.<tool>.optional correspondiente, para que OpenClaw pueda determinar que la
herramienta es opcional sin cargar el código de ejecución del plugin.
factory cuando una herramienta necesite el contexto de herramientas de ejecución antes de poder
crearse: para excluirla de una ejecución específica, inspeccionar el estado del entorno aislado o vincular
utilidades de ejecución. Los metadatos permanecen estáticos aunque la herramienta concreta se cree
durante la ejecución.
definePluginEntry
directamente cuando el plugin calcule los nombres de las herramientas de forma dinámica o combine herramientas
con hooks, servicios, proveedores o comandos.
Valores devueltos
defineToolPlugin encapsula los valores devueltos simples en el formato de resultado de herramientas
de OpenClaw:
- Se debe devolver una cadena cuando el modelo deba ver exactamente ese texto.
- Se debe devolver un valor compatible con JSON cuando se quiera que el modelo vea JSON con formato
y que OpenClaw conserve el valor original en
details.
AgentToolResult personalizado o se quiera reutilizar una
implementación existente de api.registerTool.
Contratos de salida
Se debe añadiroutputSchema cuando una herramienta devuelva datos estables compatibles con JSON. Describe
el valor original almacenado en AgentToolResult.details, no el texto con formato
de content:
details tras los hooks de herramientas, antes de devolverlo mediante el puente.
Un esquema no válido impide ejecutar la herramienta; una discrepancia en el resultado hace que falle la llamada
completada. Se deben incluir todas las variantes de resultados que no generen excepciones, incluidas las variantes de error
estructuradas, u omitir el esquema cuando el resultado no sea estable. No se deben incluir secretos
ni valores confidenciales en las descripciones del esquema, ya que los metadatos de salida de confianza pueden
quedar visibles para el modelo.
Se debe usar { additionalProperties: false } en las capas de objetos cuando se quiera una indicación de salida
compacta y completa; los esquemas abiertos o truncados siguen estando disponibles mediante
tools.describe(...), pero no se anuncian como contratos completos de índice rápido.
Las herramientas de fábrica declaran outputSchema en el AnyAgentTool concreto que
devuelven. La declaración estática tool({ factory }) no acepta un esquema de salida
independiente porque podría divergir de la herramienta de ejecución.
Configuración
configSchema es opcional. Si se omite, OpenClaw aplica un esquema estricto de objeto vacío;
el manifiesto generado sigue 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 ejecución del plugin.defineToolPlugin expone metadatos estáticos para ello y
openclaw plugins build los escribe en el paquete. Se debe volver a ejecutar el generador después de
cambiar el id, el nombre, la descripción, el esquema de configuración, la activación o los nombres de las herramientas
del plugin:
contracts.tools es el contrato de descubrimiento importante: indica a OpenClaw qué
plugin posee cada herramienta sin cargar el entorno de ejecución de todos los plugins instalados. Un
manifiesto obsoleto puede hacer que una herramienta no aparezca en el 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 ejecución
seleccionada:
./dist/index.js), no una entrada de código fuente TypeScript.
Las entradas de código fuente solo funcionan para el desarrollo local en el espacio de trabajo.
Validación en CI
plugins build --check falla sin reescribir archivos cuando los metadatos generados
están obsoletos:
@deprecated de TypeScript,
que los editores muestran como advertencias de migración. Para aplicarlas en CI, se debe habilitar una
regla con conocimiento de tipos como
@typescript-eslint/no-deprecated.
Oxlint no tiene conocimiento de tipos, por lo que no puede aplicar estas anotaciones. Por tanto, la estructura
plugins init generada no añade una configuración de lint para elementos obsoletos.
plugins validate comprueba que:
openclaw.plugin.jsonexiste y pasa el cargador de manifiestos normal.- La entrada actual exporta los metadatos de
defineToolPlugin. - Los campos del manifiesto generado coinciden con los metadatos de la entrada.
contracts.toolscoincide con los nombres de herramientas declarados.package.jsondirigeopenclaw.extensionsa la entrada de runtime seleccionada.
Instalar e inspeccionar localmente
Desde otro checkout de OpenClaw o una CLI instalada, instale la ruta del paquete:Publicar
Publique mediante ClawHub cuando el paquete esté listo.clawhub package publish
acepta un origen: una carpeta local, un repositorio de GitHub (owner/repo[@ref]) o una
URL de un archivo tar.
Solución de problemas
plugin entry not found: ./dist/index.js
El archivo de entrada seleccionado no existe. Ejecute npm run build y, a continuación, vuelva 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. Confirme que la
exportación predeterminada del módulo sea el resultado de defineToolPlugin(...) o proporcione la
entrada correcta mediante --entry.
openclaw.plugin.json generated metadata is stale
El manifiesto ya no coincide con los metadatos de la entrada. Ejecute:
openclaw.plugin.json y package.json.
package.json openclaw.extensions must include ./dist/index.js
Los metadatos del paquete apuntan a una entrada de runtime diferente. Ejecute
openclaw plugins build --entry ./dist/index.js para que el generador alinee los
metadatos del paquete con la entrada que se pretende publicar.
Cannot find package 'typebox'
El plugin compilado importa typebox durante el runtime. Manténgalo en dependencies,
vuelva a instalar, compile de nuevo y repita la validación.
La herramienta no aparece después de la instalación
Compruebe lo siguiente 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 recargó después de instalar el plugin.