Zum Inhalt springen

OpenClaw Plugins nutzen und konfigurieren

Kennst du das Problem? Du arbeitest mit einem System, aber ein spezifisches Feature oder eine bestimmte Integration fehlt einfach. Den Core-Code selbst zu ändern ist meist keine gute Idee, da das zukünftige Updates erschwert.

Plugins lösen dieses Problem. Sie sind kleine Code-Module, die Commands, Tools, Channels oder komplette Integrationen hinzufügen. Ich nutze Plugins für alles Mögliche, von Voice Calls bis hin zu Custom Slack-Integrationen. Wenn du das Prinzip einmal verstanden hast, lassen sie sich extrem einfach einbauen.

  • OpenClaw installiert und gestartet
  • Grundkenntnisse in TypeScript (falls du eigene Plugins schreiben willst)

Schau dir zuerst an, was bereits geladen ist:

Terminal-Fenster
openclaw plugins list

Installiere zum Beispiel das Voice-Call-Plugin:

Terminal-Fenster
openclaw plugins install @openclaw/voice-call

Starte dein Gateway neu und füge die Konfiguration unter plugins.entries.<id>.config hinzu:

{
plugins: {
entries: {
"voice-call": {
enabled: true,
config: {
provider: "twilio"
}
}
}
}
}

Dein neues Plugin ist damit einsatzbereit.

PluginPackageBeschreibung
Voice Call@openclaw/voice-callAnrufe tätigen und empfangen
Microsoft Teams@openclaw/msteamsTeams Channel Integration
Matrix@openclaw/matrixMatrix Chat Protokoll
Nostr@openclaw/nostrDezentraler Nostr Chat
Zalo@openclaw/zaloVietnamesische Messaging App

Bundled Plugins (standardmäßig deaktiviert):

  • Memory (Core) — einfache Suche im Speicher
  • Memory (LanceDB) — Langzeitgedächtnis mit Auto-Recall
  • Google/Gemini/Qwen OAuth — Authentifizierung für Provider

Aktiviere Bundled Plugins so:

Terminal-Fenster
openclaw plugins enable memory-lancedb

OpenClaw sucht in dieser Reihenfolge nach Plugins:

  1. Config paths — plugins.load.paths
  2. Workspace extensions — .openclaw/extensions/*.ts
  3. Global extensions — ~/.openclaw/extensions/*.ts
  4. Bundled — direkt in OpenClaw enthalten

Der erste Treffer wird verwendet, spätere Kopien ignoriert OpenClaw.

Hier siehst du ein Beispiel für eine vollständige Konfiguration:

{
plugins: {
enabled: true,
allow: ["voice-call"], // Allowlist (optional)
deny: ["untrusted-plugin"], // Denylist hat Priorität
load: {
paths: ["~/my-plugins/custom"]
},
entries: {
"voice-call": {
enabled: true,
config: { provider: "twilio" }
}
}
}
}

Wichtig: Nach Änderungen an der Konfiguration musst du das Gateway neu starten.

Einige Kategorien erlauben nur ein einziges aktives Plugin (zum Beispiel Memory Provider):

{
plugins: {
slots: {
memory: "memory-lancedb" // oder "memory-core" oder "none"
}
}
}

Mit diesen Befehlen verwaltest du deine Plugins:

Terminal-Fenster
openclaw plugins list # Alle Plugins anzeigen
openclaw plugins info <id> # Details zum Plugin
openclaw plugins install &lt;path|npm&gt; # Plugin installieren
openclaw plugins install -l <path> # Link für die Entwicklung
openclaw plugins enable <id> # Plugin aktivieren
openclaw plugins disable <id> # Plugin deaktivieren
openclaw plugins update <id> # NPM-Plugin aktualisieren
openclaw plugins update --all # Alle NPM-Plugins aktualisieren
openclaw plugins doctor # Probleme diagnostizieren

Falls ein Plugin nicht wie erwartet funktioniert, ist das der erste Schritt zur Lösung:

  • Diagnose-Tool nutzen: Führe openclaw plugins doctor aus, um Konfigurationsfehler oder Ladeprobleme zu finden.
  • Neustart vergessen: Prüfe, ob du das Gateway nach der Installation oder Konfigurationsänderung neu gestartet hast.

Hast du Fragen zur Einrichtung? Nutze den AI Setup Assistant.

Du hast eine Idee für eine neue Funktion, aber die vorhandenen Tools lassen sich nicht so anpassen, wie du es brauchst. Oft verbringt man mehr Zeit damit, Workarounds für starre Systeme zu finden, anstatt die eigentliche Logik zu schreiben.

Wenn du eine API anbinden oder einen spezifischen Workflow automatisieren willst, ist ein eigenes Plugin der richtige Weg. So behältst du die volle Kontrolle über die Ausführung und die Integration.

  • Eine installierte Instanz von OpenClaw
  • Node.js Umgebung für die Entwicklung
  • Zugriff auf das Verzeichnis ~/.openclaw/extensions/
  • Grundkenntnisse in TypeScript

In weniger als 5 Minuten erstellst du dein erstes Plugin.

  1. Erstelle den Ordner ~/.openclaw/extensions/my-plugin/.
  2. Erstelle die Datei index.ts in diesem Ordner:
export default function(api) {
api.registerGatewayMethod("myplugin.status", ({ respond }) => {
respond(true, { status: "running" });
});
}
  1. Erstelle die Datei openclaw.plugin.json im selben Verzeichnis:
{
"id": "my-plugin",
"name": "My Custom Plugin",
"version": "1.0.0"
}
  1. Starte das Gateway neu. Dein Plugin ist sofort live.

Du kannst Tools registrieren, die vom AI-Modell aufgerufen werden können.

export default function(api) {
api.registerTool({
name: "my_tool",
description: "Does something useful",
parameters: {
type: "object",
properties: {
input: { type: "string" }
}
},
handler: async ({ input }) => {
return { result: `Processed: ${input}` };
}
});
}

Slash Commands sind ideal für schnelle Status-Checks, da sie die AI nicht involvieren.

export default function(api) {
api.registerCommand({
name: "mystatus",
description: "Show plugin status",
handler: (ctx) => ({
text: `Plugin running on ${ctx.channel}`
})
});
}

Wenn du Nachrichten über einen eigenen Dienst senden willst, registriere einen Channel.

const plugin = {
id: "acmechat",
meta: {
label: "AcmeChat",
docsPath: "/channels/acmechat",
blurb: "AcmeChat messaging."
},
capabilities: { chatTypes: ["direct"] },
config: {
listAccountIds: (cfg) =>
Object.keys(cfg.channels?.acmechat?.accounts ?? {}),
resolveAccount: (cfg, id) =>
cfg.channels?.acmechat?.accounts?.[id ?? "default"]
},
outbound: {
deliveryMode: "direct",
sendText: async ({ text }) => {
// Nachricht senden
return { ok: true };
}
}
};
export default function(api) {
api.registerChannel({ plugin });
}

Plugins können Hooks enthalten und diese zur Laufzeit registrieren. Das ermöglicht event-gesteuerte Automatisierung ohne separate Installation eines Hook-Packs.

import { registerPluginHooksFromDir } from "openclaw/plugin-sdk";
export default function register(api) {
registerPluginHooksFromDir(api, "./hooks");
}

Hinweise:

  • Hook-Verzeichnisse müssen die Struktur aus HOOK.md und handler.ts einhalten.
  • Plugin-Hooks erscheinen in der Liste openclaw hooks list mit dem Präfix plugin:<id>.
  • Die Eligibility Rules (OS, Binaries, Env, Config) gelten weiterhin.
  • Das Aktivieren oder Deaktivieren des Plugins steuert auch dessen Hooks.

Über api.runtime greifen Plugins auf Core-Funktionen zu, wie zum Beispiel Telephony TTS:

const result = await api.runtime.tts.textToSpeechTelephony({
text: "Hello from OpenClaw",
cfg: api.config,
});

Hinweise:

  • Diese Funktion nutzt die messages.tts Konfiguration (OpenAI oder ElevenLabs).
  • Du erhältst einen PCM Audio Buffer und die Sample Rate zurück.
  • Plugins sind selbst für das Resampling oder Encoding für ihre Provider verantwortlich.
  • Edge TTS wird für Telephony nicht unterstützt.

Du kannst Auth-Flows für Model Provider registrieren, damit Nutzer OAuth oder API-Keys direkt in OpenClaw einrichten können.

api.registerProvider({
id: "acme",
label: "AcmeAI",
auth: [
{
id: "oauth",
label: "OAuth",
kind: "oauth",
run: async (ctx) => {
// OAuth Flow ausführen und Profile zurückgeben
return {
profiles: [
{
profileId: "acme:default",
credential: {
type: "oauth",
provider: "acme",
access: "...",
refresh: "...",
expires: Date.now() + 3600 * 1000,
},
},
],
defaultModel: "acme/opus-1",
};
},
},
],
});

Hinweise:

  • Die run Funktion erhält einen ProviderAuthContext mit Helfern wie prompter, runtime und openUrl.
  • Nutze configPatch, um Standardmodelle hinzuzufügen.
  • Mit defaultModel kann --set-default die Agent-Standards aktualisieren.

Nutzer authentifizieren sich dann über das CLI:

Terminal-Fenster
openclaw models auth login --provider acme --method oauth
  • Hooks werden nicht geladen: Prüfe, ob alle Anforderungen in der Hook-Struktur (OS, Umgebungsvariablen) erfüllt sind.
  • Audio-Probleme bei TTS: Stelle sicher, dass dein Plugin das Resampling korrekt handhabt, da nur PCM Buffer geliefert werden.
  • Plugin wird nicht erkannt: Kontrolliere, ob die id in der openclaw.plugin.json exakt mit dem Verzeichnisnamen übereinstimmt.
  • Fehlende Berechtigungen: Stelle sicher, dass der Prozess Schreibrechte für das Verzeichnis ~/.openclaw/extensions/ besitzt.

Falls du Hilfe bei der Konfiguration benötigst, frag den AI Setup Assistant.

Du kennst das: Ein Nutzer stellt eine simple Frage und dein AI-Agent fängt an zu grübeln, obwohl die Antwort feststeht. Das frisst unnötig Token und Zeit. Manchmal willst du einfach, dass dein Plugin sofort antwortet, ohne den Umweg über die AI zu gehen.

Eigene Slash-Commands sind der beste Weg, um diese Abkürzung zu nehmen. So reagiert dein Plugin direkt auf spezifische Eingaben, spart Ressourcen und gibt dem Nutzer sofortiges Feedback.

  • Eine bestehende OpenClaw Plugin-Struktur
  • Grundverständnis von TypeScript und Node.js

In 5 Minuten hast du deinen ersten eigenen Befehl am Laufen. Folge einfach diesen Schritten:

  1. Nutze api.registerCommand in deiner Plugin-Hauptfunktion.
  2. Definiere einen Namen und einen Handler für die Antwort.
  3. Lege fest, ob der Befehl eine Autorisierung benötigt.
  4. Starte dein Plugin neu und teste den Befehl im Channel.

Hier ist das minimale Code-Beispiel:

export default function(api) {
api.registerCommand({
name: "mystatus",
description: "Show plugin status",
acceptsArgs: false,
requireAuth: true,
handler: (ctx) => ({
text: `Plugin running on ${ctx.channel}`
})
});
}

Wenn ein Befehl ausgeführt wird, erhält der Handler einen Context (ctx). Diese Daten kannst du nutzen:

FeldBeschreibung
senderIdID des Absenders
channelChannel, in dem der Befehl gesendet wurde
isAuthorizedSenderOb der Absender autorisiert ist
argsArgumente (wenn acceptsArgs: true)
commandBodyVollständiger Text des Befehls
configAktuelle OpenClaw-Konfiguration

Du hast verschiedene Optionen, um das Verhalten deines Befehls zu steuern:

OptionBeschreibung
nameName des Befehls (ohne /)
descriptionHilfetext
acceptsArgsOb Argumente akzeptiert werden (Standard: false)
requireAuthErfordert autorisierten Absender (Standard: true)
handlerFunktion, die { text: string } zurückgibt

Neben Befehlen kannst du Services starten, die im Hintergrund laufen:

export default function(api) {
api.registerService({
id: "my-service",
start: () => api.logger.info("ready"),
stop: () => api.logger.info("bye"),
});
}

Für direkte Interaktionen über das Terminal kannst du CLI-Befehle hinzufügen:

export default function(api) {
api.registerCli(({ program }) => {
program.command("mycmd").action(() => {
console.log("Hello");
});
}, { commands: ["mycmd"] });
}

Jedes Plugin benötigt eine openclaw.plugin.json:

{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"configSchema": {
"type": "object",
"properties": {
"apiKey": { "type": "string" }
}
},
"uiHints": {
"apiKey": { "label": "API Key", "sensitive": true }
}
}
  1. Füge dies zu deiner package.json hinzu:
{
"name": "@yourscope/my-plugin",
"openclaw": {
"extensions": ["./index.ts"]
}
}
  1. Veröffentlichen: npm publish

  2. Installation durch Nutzer:

Terminal-Fenster
openclaw plugins install @yourscope/my-plugin
  • Befehl wird ignoriert: Plugin-Befehle werden verarbeitet, bevor eingebaute Befehle oder der AI-Agent greifen. Prüfe, ob der Name korrekt registriert wurde.
  • Reservierte Namen: Du kannst keine reservierten Befehle wie help, status oder reset überschreiben.
  • Groß-/Kleinschreibung: Befehlsnamen sind case-insensitive, es spielt also keine Rolle, ob der Nutzer /MyStatus oder /mystatus schreibt.

Benötigst du Hilfe bei der Einrichtung? Frag den AI Setup Assistant.

Kennst du das? Du hast dein Plugin fertig geschrieben, aber es taucht einfach nicht in der Liste auf. Du starrst auf den Monitor und fragst dich, ob es an einem Tippfehler in der Config oder an einer fehlenden Datei liegt. Solche Hürden kosten Zeit und nerven, wenn man eigentlich nur Features bauen will.

Oft sind es kleinteilige Validierungsfehler oder falsch gesetzte Pfade, die den Start verhindern. In diesem Guide erfährst du, wie du Plugins richtig konfigurierst und Fehler schnell behebst, damit dein Setup stabil läuft.

  • Eine installierte Instanz von OpenClaw
  • Zugriff auf das Verzeichnis ~/.openclaw/extensions/
  • Node.js und npm für die Verwaltung von Abhängigkeiten
  • Die Datei openclaw.plugin.json oder eine package.json für dein Plugin

In fünf Minuten zum funktionierenden Plugin:

  1. Aktivierung prüfen: Stelle sicher, dass in deiner Config plugins.enabled auf true gesetzt ist.
  2. Dateien validieren: Prüfe, ob die Datei openclaw.plugin.json im Plugin-Ordner liegt.
  3. Abhängigkeiten laden: Falls dein Plugin npm-Pakete nutzt, wechsle in den Plugin-Ordner und führe npm install aus.
  4. Neustart: Starte OpenClaw neu, um die Änderungen zu übernehmen.

Prüfe diese Punkte:

  1. Ist plugins.enabled in der Konfiguration auf true gesetzt?
  2. Steht das Plugin versehentlich auf der deny Liste?
  3. Ist die Datei openclaw.plugin.json im Verzeichnis vorhanden?
  4. Sind alle Pfade in der Config korrekt angegeben?

Ursache: Wenn du unbekannte Plugin-IDs in deiner Config verwendest, führt das zu strikten Fehlern.

Lösung: Entferne alle Referenzen auf Plugins, die deaktiviert oder deinstalliert wurden, aus den Abschnitten entries, allow und deny.

Ursache: Es befinden sich mehrere Plugins mit derselben ID im System.

Lösung: OpenClaw lädt nur das Plugin, das zuerst entdeckt wird. Du musst Duplikate aus deinen Extension-Verzeichnissen entfernen.

Ein Plugin-Verzeichnis kann eine package.json enthalten, die das Feld openclaw.extensions nutzt:

{
"name": "my-pack",
"openclaw": {
"extensions": ["./src/safety.ts", "./src/tools.ts"]
}
}

Dabei wird jeder Eintrag als einzelnes Plugin behandelt. Wenn ein Pack mehrere Extensions auflistet, setzt sich die Plugin-ID aus name/<fileBase> zusammen.

Falls dein Plugin npm-Abhängigkeiten importiert, musst du diese direkt in diesem Verzeichnis installieren:

Terminal-Fenster
cd ~/.openclaw/extensions/my-pack
npm install

Channel-Plugins können Onboarding-Metadaten über openclaw.channel und Installationshinweise über openclaw.install bereitstellen:

{
"name": "@openclaw/nextcloud-talk",
"openclaw": {
"extensions": ["./index.ts"],
"channel": {
"id": "nextcloud-talk",
"label": "Nextcloud Talk",
"selectionLabel": "Nextcloud Talk (self-hosted)",
"docsPath": "/channels/nextcloud-talk",
"blurb": "Self-hosted chat via Nextcloud Talk webhook bots.",
"order": 65,
"aliases": ["nc-talk", "nc"]
},
"install": {
"npmSpec": "@openclaw/nextcloud-talk",
"localPath": "extensions/nextcloud-talk",
"defaultChoice": "npm"
}
}
}

Du kannst JSON-Dateien für Kataloge an folgenden Orten hinterlegen:

  • ~/.openclaw/mpm/plugins.json
  • ~/.openclaw/mpm/catalog.json
  • ~/.openclaw/plugins/catalog.json

Alternativ kannst du die Umgebungsvariable OPENCLAW_PLUGIN_CATALOG_PATHS nutzen, um eigene Pfade zu definieren.

Du kommst nicht weiter? Unser AI Setup Assistant hilft dir beim Debugging deines Plugin-Setups.

Du hast eine großartige AI-Anwendung gebaut, aber sie steckt in einem Silo fest. Die Anbindung an neue Chat-Plattformen ist oft nervig, weil jede API ihr eigenes Süppchen kocht. Du verbringst mehr Zeit mit Boilerplate-Code für die Verbindung als mit den eigentlichen Features deines Agents.

Dieses Guide zeigt dir, wie du eine neue Chat-Oberfläche (einen Messaging Channel) baust, damit dein Agent dort erreichbar ist, wo deine Nutzer sind.

  • Eine eindeutige Channel-ID
  • Eine definierte Config-Struktur
  • Metadaten für das UI/CLI
  • Implementierte Adapters für die Kommunikation

In 5 Minuten steht das Grundgerüst für deinen eigenen Channel. Folge diesen Schritten:

Die gesamte Channel-Konfiguration wird unter channels.<id> gespeichert. So sieht die Struktur in der JSON5-Datei aus:

{
channels: {
acmechat: {
accounts: {
default: { token: "TOKEN", enabled: true }
}
}
}
}

Die Metadaten steuern, wie dein Channel im CLI oder im UI erscheint.

FieldPurpose
meta.labelAnzeigename im CLI/UI
meta.selectionLabelLängerer Text für die Auswahl
meta.docsPathLink zur Dokumentation (z. B. /channels/acmechat)
meta.blurbKurze Beschreibung
meta.aliasesAlternative Channel-IDs
meta.preferOverErsetzt einen anderen Channel

Hier definierst du die Logik, wie Accounts aufgelöst werden und wie Nachrichten rausgehen.

const plugin = {
id: "acmechat",
meta: { /* ... */ },
capabilities: { chatTypes: ["direct"] },
config: {
listAccountIds: (cfg) => Object.keys(cfg.channels?.acmechat?.accounts ?? {}),
resolveAccount: (cfg, id) => cfg.channels?.acmechat?.accounts?.[id ?? "default"]
},
outbound: {
deliveryMode: "direct",
sendText: async ({ text }) => ({ ok: true })
}
};

Je nachdem, was dein Channel unterstützen soll, kannst du diese Adapters ergänzen:

AdapterPurpose
setupIntegration in den Setup-Wizard
securityRichtlinien für Direct Messages (DM)
statusStatus-Checks und Diagnosen
gatewayStart/Stop/Login Aktionen
mentionsHandhabung von @mentions
threadingUnterstützung für Threads
streamingAntworten per Streaming übertragen
actionsNachrichten-Aktionen
commandsNatives Verhalten für Befehle

Exportiere die Funktion, um das Plugin im System anzumelden:

export default function(api) {
api.registerChannel({ plugin });
}

Halte dich an diese Konventionen, um Konflikte mit Core-Befehlen zu vermeiden:

TypeConventionExample
Gateway methodspluginId.actionvoicecall.status
Toolssnake_casevoice_call
CLI commandskebab-casevoicecall-start

Deine Plugins können eigene Skills mitliefern. Erstelle dafür einfach ein skills/ Verzeichnis in deiner Plugin-Struktur:

my-plugin/
├── index.ts
├── openclaw.plugin.json
└── skills/
└── my-skill/
└── SKILL.md

Aktiviere Skills über plugins.entries.<id>.enabled und stelle sicher, dass sie in deinen verwalteten Skill-Verzeichnissen liegen.

Plugins laufen in-process direkt mit dem Gateway. Behandle sie daher als vertrauenswürdigen Code.

  • Problem: Änderungen am Plugin werden nicht übernommen. Lösung: Starte das Gateway nach jeder Code-Änderung neu.
  • Problem: Sicherheitsbedenken bei Drittanbieter-Plugins. Lösung: Nutze plugins.allow Whitelists und prüfe den Source Code, bevor du ein Plugin aktivierst.
  • Problem: Plugin verhält sich instabil. Lösung: Stelle sicher, dass du Tests mitlieferst. In-Repo Plugins nutzen Vitest unter src/** (z. B. src/plugins/voice-call.plugin.test.ts).

Für veröffentlichte Plugins solltest du eine eigene CI nutzen und validieren, dass openclaw.extensions auf den korrekten Entrypoint zeigt.

Terminal-Fenster
# Plugin-Tests ausführen
cd ~/.openclaw/extensions/my-plugin
npm test

Du brauchst Hilfe bei der Umsetzung? Frage den AI Setup Assistant oder besuche uns auf Discord.

OpenClaw

OpenClaw Expert

Noch festgefahren?

Wenn diese Seite nicht hilft, frage OpenClaw Expert nach Schritt-fuer-Schritt-Loesungen.