defineToolPlugin crée un plugin qui ajoute uniquement des outils appelables par l’agent : aucun
canal, fournisseur de modèles, hook, service ni backend de configuration. Il génère les
métadonnées de manifeste dont OpenClaw a besoin pour découvrir les outils sans charger le code
d’exécution du plugin.
Pour les plugins de fournisseur, de canal, de hook, de service ou à capacités mixtes, commencez
plutôt par Créer des plugins, Plugins de canal
ou Plugins de fournisseur.
Prérequis
- Node 22.22.3+, Node 24.15+ ou Node 25.9+.
- Sortie de package TypeScript ESM.
typeboxdansdependencies(pas seulementdevDependencies— le plugin généré l’importe à l’exécution).openclaw >=2026.5.17, la première version qui exporteopenclaw/plugin-sdk/tool-plugin.- Une racine de package qui fournit
dist/,openclaw.plugin.jsonetpackage.json.
Démarrage rapide
plugins init génère la structure suivante :
npm run plugin:build exécute npm run build (tsc), puis
openclaw plugins build --entry ./dist/index.js. npm run plugin:validate
reconstruit et exécute openclaw plugins validate --entry ./dist/index.js.
Une validation réussie affiche :
openclaw plugins init <id> :
Écrire un outil
defineToolPlugin accepte l’identité du plugin, un schéma de configuration facultatif et une
liste statique d’outils. Les types des paramètres et de la configuration sont déduits des
schémas TypeBox.
Outils facultatifs et fabriques d’outils
Définissezoptional: true lorsque les utilisateurs doivent explicitement ajouter l’outil à la liste d’autorisation avant qu’il
soit envoyé à un modèle. openclaw plugins build écrit l’entrée de manifeste
toolMetadata.<tool>.optional correspondante, afin qu’OpenClaw puisse déterminer que
l’outil est facultatif sans charger le code d’exécution du plugin.
factory lorsqu’un outil a besoin du contexte d’outil d’exécution avant de pouvoir être
créé — pour le désactiver lors d’une exécution précise, examiner l’état du bac à sable ou lier
des assistants d’exécution. Les métadonnées restent statiques même si l’outil concret est créé
à l’exécution.
definePluginEntry
lorsque le plugin calcule dynamiquement les noms d’outils ou combine des outils
avec des hooks, des services, des fournisseurs ou des commandes.
Valeurs de retour
defineToolPlugin encapsule les valeurs de retour simples dans le format de résultat
d’outil OpenClaw :
- Renvoyez une chaîne lorsque le modèle doit voir exactement ce texte.
- Renvoyez une valeur compatible avec JSON lorsque vous souhaitez que le modèle voie du JSON mis en forme
et qu’OpenClaw conserve la valeur d’origine dans
details.
AgentToolResult personnalisé ou souhaitez réutiliser une
implémentation api.registerTool existante.
Configuration
configSchema est facultatif. Si vous l’omettez, OpenClaw applique un schéma strict d’objet vide ;
le manifeste généré inclut tout de même configSchema.
configSchema, le type du deuxième argument de execute est déduit de celui-ci :
Métadonnées générées
OpenClaw doit lire le manifeste du plugin avant d’importer le code d’exécution de celui-ci.defineToolPlugin expose des métadonnées statiques à cette fin, et
openclaw plugins build les écrit dans le package. Relancez le générateur après
avoir modifié l’identifiant, le nom, la description, le schéma de configuration, l’activation ou les noms
d’outils du plugin :
contracts.tools est le contrat de découverte essentiel : il indique à OpenClaw quel
plugin possède chaque outil sans charger le code d’exécution de tous les plugins installés. Un
manifeste obsolète peut empêcher la découverte d’un outil ou attribuer une erreur
d’enregistrement au mauvais plugin.
Métadonnées du package
openclaw plugins build aligne également package.json sur le point d’entrée d’exécution
sélectionné :
./dist/index.js), et non un point d’entrée source TypeScript.
Les points d’entrée source ne fonctionnent que pour le développement local dans l’espace de travail.
Valider dans la CI
plugins build --check échoue sans réécrire les fichiers lorsque les métadonnées générées
sont obsolètes :
plugins validate vérifie que :
openclaw.plugin.jsonexiste et réussit le chargement par le chargeur de manifeste normal.- Le point d’entrée actuel exporte les métadonnées
defineToolPlugin. - Les champs du manifeste généré correspondent aux métadonnées du point d’entrée.
contracts.toolscorrespond aux noms d’outils déclarés.package.jsonfait pointeropenclaw.extensionsvers le point d’entrée d’exécution sélectionné.
Installer et examiner localement
Depuis un autre checkout d’OpenClaw ou une CLI installée, installez le chemin du package :Publier
Publiez via ClawHub une fois le package prêt.clawhub package publish
accepte une source : un dossier local, un dépôt GitHub (owner/repo[@ref]) ou une
URL d’archive.
Dépannage
plugin entry not found: ./dist/index.js
Le fichier de point d’entrée sélectionné n’existe pas. Exécutez npm run build, puis relancez
openclaw plugins build --entry ./dist/index.js ou
openclaw plugins validate --entry ./dist/index.js.
plugin entry does not expose defineToolPlugin metadata
Le point d’entrée n’a pas exporté une valeur créée par defineToolPlugin. Vérifiez que
l’exportation par défaut du module est le résultat de defineToolPlugin(...), ou transmettez le
bon point d’entrée avec --entry.
openclaw.plugin.json generated metadata is stale
Le manifeste ne correspond plus aux métadonnées du point d’entrée. Exécutez :
openclaw.plugin.json et de package.json.
package.json openclaw.extensions must include ./dist/index.js
Les métadonnées du package pointent vers un autre point d’entrée d’exécution. Exécutez
openclaw plugins build --entry ./dist/index.js afin que le générateur aligne
les métadonnées du package sur le point d’entrée que vous souhaitez fournir.
Cannot find package 'typebox'
Le plugin compilé importe typebox à l’exécution. Conservez-le dans dependencies,
réinstallez, reconstruisez, puis relancez la validation.
L’outil n’apparaît pas après l’installation
Vérifiez les éléments suivants dans l’ordre :openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.jsonpossèdecontracts.toolsavec les noms d’outils attendus.package.jsonpossèdeopenclaw.extensions: ["./dist/index.js"].- Le Gateway a été redémarré ou rechargé après l’installation du Plugin.