OpenClaw mit Mattermost verbinden: Schnelle Einrichtung
Plugin erforderlich
Abschnitt betitelt „Plugin erforderlich“Mattermost wird als Plugin bereitgestellt und ist nicht in der Core-Installation enthalten. Am besten installierst du es direkt über die CLI (npm registry):
openclaw plugins install @openclaw/mattermostFalls du mit einem lokalen Git-Repo arbeitest, kannst du den lokalen Pfad nutzen:
openclaw plugins install ./path/to/local/mattermost-pluginWenn du Mattermost während des Setups auswählst und ein Git-Checkout erkannt wird, bietet OpenClaw dir den lokalen Installationspfad automatisch an.
Details findest du hier: Plugins
Schnelle Einrichtung
Abschnitt betitelt „Schnelle Einrichtung“- Installiere das Mattermost-Plugin.
- Erstelle einen Mattermost-Bot-Account und kopiere das bot token.
- Kopiere die Mattermost base URL (z. B.
https://chat.example.com). - Konfiguriere OpenClaw und starte das Gateway.
Minimale Konfiguration:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Native Slash-Commands
Abschnitt betitelt „Native Slash-Commands“Native Slash-Commands sind optional. Wenn du sie aktivierst, registriert OpenClaw oc_* Slash-Commands über die Mattermost API und empfängt Callback-POSTs auf dem Gateway-HTTP-Server.
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Use when Mattermost cannot reach the gateway directly (reverse proxy/public URL). callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}Hinweise:
native: "auto"ist für Mattermost standardmäßig deaktiviert. Setzenative: true, um es zu aktivieren.- Wenn
callbackUrlfehlt, leitet OpenClaw die URL aus dem Gateway-Host/Port und demcallbackPathab. - Bei Setups mit mehreren Accounts kannst du
commandsglobal oder unterchannels.mattermost.accounts.<id>.commandsdefinieren (Account-Werte überschreiben globale Felder). - Command-Callbacks werden mit Tokens pro Befehl validiert und schlagen fehl, wenn die Prüfung nicht erfolgreich ist.
- Erreichbarkeit: Der Callback-Endpunkt muss vom Mattermost-Server aus erreichbar sein.
- Setze
callbackUrlnicht auflocalhost, außer Mattermost läuft auf demselben Host oder im selben Netzwerk-Namespace wie OpenClaw. - Setze
callbackUrlnicht auf deine Mattermost-Base-URL, außer diese URL leitet/api/channels/mattermost/commandper Reverse-Proxy an OpenClaw weiter. - Ein schneller Test:
curl https://<gateway-host>/api/channels/mattermost/command; ein GET sollte von OpenClaw ein405 Method Not Allowedzurückgeben, kein404.
- Setze
- Mattermost Egress-Allowlist:
- Wenn dein Callback private, Tailnet- oder interne Adressen nutzt, musst du in den Mattermost-Einstellungen
ServiceSettings.AllowedUntrustedInternalConnectionsden Callback-Host oder die Domain hinzufügen. - Nutze Host/Domain-Einträge, keine vollständigen URLs.
- Gut:
gateway.tailnet-name.ts.net - Schlecht:
https://gateway.tailnet-name.ts.net
- Gut:
- Wenn dein Callback private, Tailnet- oder interne Adressen nutzt, musst du in den Mattermost-Einstellungen
Umgebungsvariablen (Standard-Account)
Abschnitt betitelt „Umgebungsvariablen (Standard-Account)“Falls du Umgebungsvariablen bevorzugst, kannst du diese auf dem Gateway-Host setzen:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Diese Variablen gelten nur für den Standard-Account (default). Für alle anderen Accounts musst du die Konfigurationswerte nutzen.
Chat-Modi
Abschnitt betitelt „Chat-Modi“Mattermost antwortet automatisch auf DMs. Das Verhalten in Channels steuerst du über chatmode:
oncall(Standard): Antwortet nur, wenn du in Channels mit @ erwähnt wirst.onmessage: Antwortet auf jede Nachricht im Channel.onchar: Antwortet, wenn eine Nachricht mit einem bestimmten Präfix beginnt.
Konfigurationsbeispiel:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], }, },}Hinweise:
oncharreagiert trotzdem auf explizite @mentions.channels.mattermost.requireMentionwird für Legacy-Konfigurationen unterstützt, aberchatmodeist die bessere Wahl.
Threading und Sessions
Abschnitt betitelt „Threading und Sessions“Nutze channels.mattermost.replyToMode, um zu steuern, ob Antworten in Channels und Gruppen im Haupt-Channel bleiben oder einen Thread unter dem auslösenden Post starten.
off(Standard): Antwortet nur dann in einem Thread, wenn der eingehende Post bereits Teil eines Threads ist.first: Erstellt bei Top-Level-Posts in Channels oder Gruppen einen Thread und leitet die Konversation in eine Session mit Thread-Scope.all: Verhält sich aktuell genau wiefirst.- Direct messages ignorieren diese Einstellung und bleiben immer ohne Thread.
Konfigurationsbeispiel:
{ channels: { mattermost: { replyToMode: "all", }, },}Hinweise:
- Sessions mit Thread-Scope nutzen die ID des auslösenden Posts als Thread-Root.
firstundallsind momentan identisch, da Mattermost nach der Erstellung eines Thread-Roots alle weiteren Chunks und Medien in demselben Thread fortführt.
Zugriffskontrolle (DMs)
Abschnitt betitelt „Zugriffskontrolle (DMs)“- Standard:
channels.mattermost.dmPolicy = "pairing"(unbekannte Absender erhalten einen Pairing-Code). - Freigabe über:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Öffentliche DMs:
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"].
Channels (Gruppen)
Abschnitt betitelt „Channels (Gruppen)“- Standard:
channels.mattermost.groupPolicy = "allowlist"(Zugriff nur per Mention). - Absender auf die Allowlist setzen mit
channels.mattermost.groupAllowFrom(User-IDs werden empfohlen). @usernameMatching ist veränderbar und nur aktiv, wennchannels.mattermost.dangerouslyAllowNameMatching: truegesetzt ist.- Offene Channels:
channels.mattermost.groupPolicy="open"(ebenfalls per Mention gesteuert). - Runtime-Hinweis: Wenn
channels.mattermostkomplett fehlt, nutzt die Runtime automatischgroupPolicy="allowlist"für Gruppen-Checks (selbst wennchannels.defaults.groupPolicykonfiguriert ist).
Ziele für den Outbound-Versand
Abschnitt betitelt „Ziele für den Outbound-Versand“Nutze diese Zielformate mit openclaw message send oder Cron/Webhooks:
channel:<id>für einen Channeluser:<id>für eine DM@usernamefür eine DM (aufgelöst über die Mattermost API)
Einfache IDs (wie 64ifufp...) sind in Mattermost nicht eindeutig, da sie sowohl eine User-ID als auch eine Channel-ID sein könnten.
OpenClaw löst diese nach dem Prinzip „User zuerst“ auf:
- Wenn die ID als User existiert (
GET /api/v4/users/<id>ist erfolgreich), sendet OpenClaw eine DM, indem der direkte Channel über/api/v4/channels/directermittelt wird. - Andernfalls wird die ID als Channel-ID behandelt.
Wenn du ein eindeutiges Verhalten willst, solltest du immer die expliziten Präfixe (user:<id> oder channel:<id>) verwenden.
DM-Channel-Wiederholungsversuche
Abschnitt betitelt „DM-Channel-Wiederholungsversuche“Wenn OpenClaw an ein Mattermost DM-Ziel sendet und zuerst den direkten Channel auflösen muss, werden vorübergehende Fehler bei der Erstellung des direkten Channels standardmäßig wiederholt.
Nutze channels.mattermost.dmChannelRetry, um dieses Verhalten global für das Mattermost-Plugin zu konfigurieren, oder channels.mattermost.accounts.<id>.dmChannelRetry für einen spezifischen Account.
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Hinweise:
- Das gilt nur für die Erstellung von DM-Channels (
/api/v4/channels/direct) und nicht für jeden beliebigen Mattermost API-Aufruf. - Wiederholungen erfolgen bei vorübergehenden Fehlern wie Rate Limits, 5xx-Antworten sowie Netzwerk- oder Timeout-Problemen.
- 4xx-Client-Fehler (außer
429) gelten als dauerhaft und werden nicht erneut versucht.
Reaktionen (message tool)
Abschnitt betitelt „Reaktionen (message tool)“- Nutze
message action=reactmitchannel=mattermost. messageIdist die Mattermost Post-ID.emojiakzeptiert Namen wiethumbsupoder:+1:(Doppelpunkte sind optional).- Setze
remove=true(Boolean), um eine Reaktion zu entfernen. - Events zum Hinzufügen oder Entfernen von Reaktionen werden als System-Events an die Session des Agents weitergeleitet.
Beispiele:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueKonfiguration:
channels.mattermost.actions.reactions: Aktiviert oder deaktiviert Reaktions-Aktionen (Standard ist true).- Override pro Account:
channels.mattermost.accounts.<id>.actions.reactions.
Interaktive Buttons (message tool)
Abschnitt betitelt „Interaktive Buttons (message tool)“Sende Nachrichten mit klickbaren Buttons. Wenn ein User auf einen Button klickt, erhält der Agent die Auswahl und kann darauf antworten.
Aktiviere Buttons, indem du inlineButtons zu den Channel-Capabilities hinzufügst:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Nutze message action=send mit einem buttons Parameter. Buttons sind ein 2D-Array (Reihen von Buttons):
message action=send channel=mattermost target=channel:<channelId> buttons=[[{"text":"Yes","callback_data":"yes"},{"text":"No","callback_data":"no"}]]Button-Felder:
text(erforderlich): Anzeigename.callback_data(erforderlich): Wert, der beim Klick zurückgesendet wird (wird als Action-ID genutzt).style(optional):"default","primary","danger".
Wenn ein User auf einen Button klickt:
- Alle Buttons werden durch eine Bestätigungszeile ersetzt (z. B. ”✓ Yes ausgewählt von @user”).
- Der Agent erhält die Auswahl als eingehende Nachricht und antwortet.
Hinweise:
- Button-Callbacks nutzen HMAC-SHA256 Verifizierung (automatisch, keine Konfiguration nötig).
- Mattermost entfernt Callback-Daten aus seinen API-Antworten (Sicherheitsfeature), daher werden beim Klick alle Buttons entfernt — ein teilweises Entfernen ist nicht möglich.
- Action-IDs mit Bindestrichen oder Unterstrichen werden automatisch bereinigt (eine Einschränkung beim Mattermost-Routing).
Konfiguration:
channels.mattermost.capabilities: Array aus Capability-Strings. Füge"inlineButtons"hinzu, um die Beschreibung des Button-Tools im System-Prompt des Agents zu aktivieren.channels.mattermost.interactions.callbackBaseUrl: Optionale externe Basis-URL für Button-Callbacks (zum Beispielhttps://gateway.example.com). Nutze dies, wenn Mattermost das Gateway nicht direkt über den Bind-Host erreichen kann.- In Setups mit mehreren Accounts kannst du dasselbe Feld auch unter
channels.mattermost.accounts.<id>.interactions.callbackBaseUrlsetzen. - Wenn
interactions.callbackBaseUrlfehlt, leitet OpenClaw die Callback-URL vongateway.customBindHost+gateway.portab und nutzt sonsthttp://localhost:<port>. - Erreichbarkeit: Die Button-Callback-URL muss vom Mattermost-Server aus erreichbar sein.
localhostfunktioniert nur, wenn Mattermost und OpenClaw auf demselben Host oder im selben Netzwerk-Namespace laufen. - Wenn dein Callback-Ziel privat, ein Tailnet oder intern ist, füge den Host oder die Domain zu
ServiceSettings.AllowedUntrustedInternalConnectionsin Mattermost hinzu.
Direkte API-Integration (externe Skripte)
Abschnitt betitelt „Direkte API-Integration (externe Skripte)“Externe Skripte und Webhooks können Buttons direkt über die Mattermost REST API posten, anstatt das message Tool des Agents zu nutzen. Nutze nach Möglichkeit buildButtonAttachments() aus der Extension; wenn du rohes JSON postest, folge diesen Regeln:
Payload-Struktur:
{ channel_id: "<channelId>", message: "Choose an option:", props: { attachments: [ { actions: [ { id: "mybutton01", // alphanumeric only — see below type: "button", // required, or clicks are silently ignored name: "Approve", // display label style: "primary", // optional: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // must match button id (for name lookup) action: "approve", // ... any custom fields ... _token: "<hmac>", // see HMAC section below }, }, }, ], }, ], },}Wichtige Regeln:
- Attachments gehören in
props.attachments, nicht in das Top-Level-Feldattachments(wird sonst ignoriert). - Jede Action braucht
type: "button"— ohne diesen Typ werden Klicks einfach ignoriert. - Jede Action braucht ein
idFeld — Mattermost ignoriert Actions ohne IDs. - Die Action-
iddarf nur alphanumerisch sein ([a-zA-Z0-9]). Bindestriche und Unterstriche stören das serverseitige Routing von Mattermost (führt zu 404). Entferne sie vor der Nutzung. context.action_idmuss mit deriddes Buttons übereinstimmen, damit die Bestätigungsnachricht den Button-Namen (z. B. “Approve”) statt einer ID anzeigt.context.action_idist erforderlich — der Interaction-Handler gibt ohne diesen Wert einen 400-Fehler zurück.
HMAC-Token-Generierung:
Das Gateway verifiziert Button-Klicks mit HMAC-SHA256. Externe Skripte müssen Token generieren, die zur Verifizierungslogik des Gateways passen:
- Leite das Secret vom Bot-Token ab:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Erstelle das Context-Objekt mit allen Feldern außer
_token. - Serialisiere es mit sortierten Keys und ohne Leerzeichen (das Gateway nutzt
JSON.stringifymit sortierten Keys für kompakten Output). - Signiere:
HMAC-SHA256(key=secret, data=serializedContext) - Füge den resultierenden Hex-Digest als
_tokenzum Context hinzu.
Python-Beispiel:
import hmac, hashlib, json
secret = hmac.new( b"openclaw-mattermost-interactions", bot_token.encode(), hashlib.sha256).hexdigest()
ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
context = {**ctx, "_token": token}Häufige HMAC-Fehler:
- Pythons
json.dumpsfügt standardmäßig Leerzeichen hinzu ({"key": "val"}). Nutzeseparators=(",", ":"), um den kompakten JavaScript-Output zu erzeugen ({"key":"val"}). - Signiere immer alle Context-Felder (außer
_token). Das Gateway entfernt_tokenund signiert den Rest. Wenn du nur einen Teil signierst, schlägt die Verifizierung fehl. - Nutze
sort_keys=True— das Gateway sortiert Keys vor dem Signieren, und Mattermost könnte die Reihenfolge beim Speichern ändern. - Leite das Secret vom Bot-Token ab (deterministisch), nicht von Zufallswerten. Das Secret muss beim Erstellen der Buttons und beim Gateway identisch sein.
Nächste Schritte
Abschnitt betitelt „Nächste Schritte“Directory-Adapter
Abschnitt betitelt „Directory-Adapter“Das Mattermost-Plugin enthält einen Directory-Adapter, der Channel- und Benutzernamen über die Mattermost API auflöst. Das ermöglicht dir die Nutzung von #channel-name und @username als Ziele in openclaw message send sowie bei automatisierten Zustellungen über Cron-Jobs oder Webhooks.
Du musst dafür nichts extra konfigurieren — der Adapter nutzt einfach das Bot-Token aus deiner Account-Konfiguration.
Multi-Account
Abschnitt betitelt „Multi-Account“Mattermost unterstützt mehrere Accounts unter channels.mattermost.accounts. Ich empfehle diesen Aufbau, wenn du verschiedene Teams oder Umgebungen sauber voneinander trennen möchtest:
{ channels: { mattermost: { accounts: { default: { name: "Primary", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Alerts", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}Fehlerbehebung
Abschnitt betitelt „Fehlerbehebung“- Keine Antworten in Channels: Stell sicher, dass der Bot im Channel ist, erwähne ihn (oncall), nutze einen Trigger-Präfix (onchar) oder setze
chatmode: "onmessage". - Auth-Fehler: Prüfe das Bot-Token und die Base-URL.
- Probleme mit mehreren Accounts: Umgebungsvariablen gelten nur für den
defaultAccount. - Buttons erscheinen als weiße Boxen: Der Agent sendet eventuell fehlerhafte Button-Daten. Prüfe, ob jeder Button sowohl
textals auchcallback_dataFelder hat. - Buttons werden angezeigt, aber Klicks bewirken nichts: Verifiziere, dass
AllowedUntrustedInternalConnectionsin der Mattermost-Serverkonfiguration127.0.0.1 localhostenthält undEnablePostActionIntegrationin den ServiceSettings auftruesteht. - Buttons geben beim Klick einen 404-Fehler zurück: Die Button-
identhält wahrscheinlich Bindestriche oder Unterstriche. Der Action-Router von Mattermost bricht bei nicht-alphanumerischen IDs ab. Nutze nur[a-zA-Z0-9]. - Gateway loggt
invalid _token: HMAC-Abweichung. Prüfe, ob du alle Context-Felder signierst, sortierte Keys verwendest, kompaktes JSON nutzt und keine Leerzeichen einfügst. Schau dir dazu den HMAC-Abschnitt oben an. - Gateway loggt
missing _token in context: Das_token-Feld fehlt im Context des Buttons. Stell sicher, dass es beim Erstellen des Integration-Payloads enthalten ist. - Die Bestätigung zeigt die rohe ID statt des Button-Namens:
context.action_idstimmt nicht mit der Button-idüberein. Setze beide auf denselben bereinigten Wert. - Agent weiß nichts von Buttons: Füge
capabilities: ["inlineButtons"]zur Mattermost-Channel-Konfiguration hinzu.
Verwandte Themen
Abschnitt betitelt „Verwandte Themen“- Channels Overview — alle unterstützten Channels
- Pairing — DM-Authentifizierung und Pairing-Flow
- Groups — Verhalten in Gruppen-Chats und Mention-Gating
- Channel Routing — Session-Routing für Nachrichten
- Security — Zugriffsmodell und Hardening
OpenClaw Expert
Noch festgefahren?
Wenn diese Seite nicht hilft, frage OpenClaw Expert nach Schritt-fuer-Schritt-Loesungen.