defineToolPlugin erstellt ein Plugin, das ausschließlich von Agenten aufrufbare Tools hinzufügt: keinen
Kanal, Modell-Provider, Hook, Dienst und kein Einrichtungs-Backend. Es generiert die
Manifestmetadaten, die OpenClaw benötigt, um Tools zu erkennen, ohne den
Plugin-Laufzeitcode zu laden.
Für Provider-, Kanal-, Hook-, Dienst- oder Plugins mit gemischten Fähigkeiten beginnen Sie
stattdessen mit Plugins erstellen, Kanal-Plugins
oder Provider-Plugins.
Anforderungen
- Node 22.22.3+, Node 24.15+ oder Node 25.9+.
- TypeScript-ESM-Paketausgabe.
typeboxindependencies(nicht nurdevDependencies– das generierte Plugin importiert es zur Laufzeit).openclaw >=2026.5.17, die erste Version, dieopenclaw/plugin-sdk/tool-pluginexportiert.- Ein Paketstamm, der
dist/,openclaw.plugin.jsonundpackage.jsonausliefert.
Schnellstart
plugins init erzeugt folgende Grundstruktur:
npm run plugin:build führt npm run build (tsc) und anschließend
openclaw plugins build --entry ./dist/index.js aus. npm run plugin:validate
erstellt das Projekt neu und führt openclaw plugins validate --entry ./dist/index.js aus.
Bei erfolgreicher Validierung wird Folgendes ausgegeben:
openclaw plugins init <id>:
Ein Tool schreiben
defineToolPlugin akzeptiert die Plugin-Identität, ein optionales Konfigurationsschema und eine
statische Tool-Liste. Parameter- und Konfigurationstypen werden aus den
TypeBox-Schemas abgeleitet.
Optionale Tools und Factory-Tools
Legen Sieoptional: true fest, wenn Benutzer das Tool ausdrücklich in die Positivliste aufnehmen sollen, bevor es
an ein Modell gesendet wird. openclaw plugins build schreibt den entsprechenden
toolMetadata.<tool>.optional-Manifesteintrag, sodass OpenClaw erkennen kann, dass das
Tool optional ist, ohne den Plugin-Laufzeitcode zu laden.
factory, wenn ein Tool den Laufzeit-Tool-Kontext benötigt, bevor es
erstellt werden kann – etwa um es für einen bestimmten Lauf auszuschließen, den Sandbox-Status zu prüfen oder
Laufzeithelfer zu binden. Die Metadaten bleiben statisch, obwohl das konkrete Tool
zur Laufzeit erstellt wird.
definePluginEntry
direkt, wenn das Plugin Tool-Namen dynamisch berechnet oder Tools
mit Hooks, Diensten, Providern oder Befehlen kombiniert.
Rückgabewerte
defineToolPlugin verpackt einfache Rückgabewerte in das OpenClaw-Tool-Ergebnisformat:
- Geben Sie eine Zeichenfolge zurück, wenn das Modell genau diesen Text sehen soll.
- Geben Sie einen JSON-kompatiblen Wert zurück, wenn das Modell formatiertes JSON sehen
und OpenClaw den ursprünglichen Wert in
detailsbeibehalten soll.
AgentToolResult benötigen oder eine
vorhandene api.registerTool-Implementierung wiederverwenden möchten.
Ausgabeverträge
Fügen SieoutputSchema hinzu, wenn ein Tool stabile JSON-kompatible Daten zurückgibt. Es beschreibt
den in AgentToolResult.details gespeicherten ursprünglichen Wert, nicht den formatierten Text
in content:
details nach den Tool-Hooks, bevor er über die Bridge zurückgegeben wird.
Mit einem ungültigen Schema kann das Tool nicht ausgeführt werden; eine Abweichung im Ergebnis lässt den abgeschlossenen
Aufruf fehlschlagen. Berücksichtigen Sie jede Ergebnisvariante, die keinen Fehler auslöst, einschließlich strukturierter
Fehlervarianten, oder lassen Sie das Schema weg, wenn das Ergebnis nicht stabil ist. Schreiben Sie keine Geheimnisse
oder sensiblen Werte in Schemabeschreibungen, da vertrauenswürdige Ausgabemetadaten
für das Modell sichtbar werden können.
Verwenden Sie { additionalProperties: false } auf Objektebenen, wenn Sie einen vollständigen,
kompakten Ausgabehinweis wünschen; offene oder gekürzte Schemas bleiben über
tools.describe(...) verfügbar, werden jedoch nicht als vollständige Schnellindexverträge ausgewiesen.
Factory-Tools deklarieren outputSchema auf dem konkreten AnyAgentTool, das sie
zurückgeben. Die statische tool({ factory })-Deklaration akzeptiert kein separates
Ausgabeschema, da es vom Laufzeit-Tool abweichen könnte.
Konfiguration
configSchema ist optional. Lassen Sie es weg, wendet OpenClaw ein striktes Schema für ein leeres Objekt
an; das generierte Manifest enthält weiterhin configSchema.
configSchema wird der Typ des zweiten execute-Arguments daraus abgeleitet:
Generierte Metadaten
OpenClaw muss das Plugin-Manifest lesen, bevor der Plugin-Laufzeitcode importiert wird.defineToolPlugin stellt dafür statische Metadaten bereit und
openclaw plugins build schreibt sie in das Paket. Führen Sie den Generator erneut aus, nachdem
Sie Plugin-ID, Namen, Beschreibung, Konfigurationsschema, Aktivierung oder Tool-Namen
geändert haben:
contracts.tools ist der wichtige Erkennungsvertrag: Er teilt OpenClaw mit, welches
Plugin für jedes Tool zuständig ist, ohne die Laufzeit jedes installierten Plugins zu laden. Ein
veraltetes Manifest kann dazu führen, dass ein Tool bei der Erkennung fehlt oder ein Registrierungsfehler
dem falschen Plugin zugeschrieben wird.
Paketmetadaten
openclaw plugins build richtet außerdem package.json am ausgewählten Laufzeit-
Einstieg aus:
./dist/index.js) aus, keinen TypeScript-Quellcode-Einstieg.
Quellcode-Einstiege funktionieren nur für die arbeitsbereichslokale Entwicklung.
In der CI validieren
plugins build --check schlägt fehl, ohne Dateien neu zu schreiben, wenn die generierten Metadaten
veraltet sind:
@deprecated,
die von Editoren als Migrationswarnungen angezeigt werden. Um sie in der CI durchzusetzen, aktivieren Sie eine
typbewusste Regel wie
@typescript-eslint/no-deprecated.
Oxlint ist nicht typbewusst und kann diese Annotationen daher nicht durchsetzen. Das generierte
plugins init-Gerüst fügt deshalb keine Lint-Konfiguration für veraltete APIs hinzu.
plugins validate prüft Folgendes:
openclaw.plugin.jsonist vorhanden und durchläuft den normalen Manifest-Loader erfolgreich.- Der aktuelle Einstiegspunkt exportiert
defineToolPlugin-Metadaten. - Generierte Manifestfelder stimmen mit den Metadaten des Einstiegspunkts überein.
contracts.toolsstimmt mit den deklarierten Toolnamen überein.package.jsonverweist füropenclaw.extensionsauf den ausgewählten Laufzeiteinstiegspunkt.
Lokal installieren und untersuchen
Installieren Sie den Paketpfad aus einem separaten OpenClaw-Checkout oder über eine installierte CLI:Veröffentlichen
Veröffentlichen Sie das Paket über ClawHub, sobald es bereit ist.clawhub package publish
akzeptiert eine Quelle: einen lokalen Ordner, ein GitHub-Repository (owner/repo[@ref]) oder eine
Tarball-URL.
Fehlerbehebung
plugin entry not found: ./dist/index.js
Die ausgewählte Einstiegspunktdatei ist nicht vorhanden. Führen Sie npm run build aus und führen Sie anschließend
openclaw plugins build --entry ./dist/index.js oder
openclaw plugins validate --entry ./dist/index.js erneut aus.
plugin entry does not expose defineToolPlugin metadata
Der Einstiegspunkt hat keinen mit defineToolPlugin erstellten Wert exportiert. Vergewissern Sie sich, dass der
Standardexport des Moduls das Ergebnis von defineToolPlugin(...) ist, oder geben Sie mit
--entry den richtigen Einstiegspunkt an.
openclaw.plugin.json generated metadata is stale
Das Manifest stimmt nicht mehr mit den Metadaten des Einstiegspunkts überein. Führen Sie Folgendes aus:
openclaw.plugin.json als auch an package.json.
package.json openclaw.extensions must include ./dist/index.js
Die Paketmetadaten verweisen auf einen anderen Laufzeiteinstiegspunkt. Führen Sie
openclaw plugins build --entry ./dist/index.js aus, damit der Generator die
Paketmetadaten an den Einstiegspunkt anpasst, den Sie ausliefern möchten.
Cannot find package 'typebox'
Das erstellte Plugin importiert zur Laufzeit typebox. Belassen Sie es in dependencies,
installieren und erstellen Sie es erneut und führen Sie anschließend die Validierung erneut aus.
Tool wird nach der Installation nicht angezeigt
Prüfen Sie Folgendes in dieser Reihenfolge:openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.jsonenthältcontracts.toolsmit den erwarteten Toolnamen.package.jsonenthältopenclaw.extensions: ["./dist/index.js"].- Der Gateway wurde nach der Installation des Plugins neu gestartet oder neu geladen.