Mattermost
Status: gebündeltes Plugin (Bot-Token + WebSocket-Ereignisse). Kanäle, Gruppen und DMs werden unterstützt. Mattermost ist eine selbst hostbare Team-Messaging-Plattform; siehe die offizielle Website unter mattermost.com für Produktdetails und Downloads.Gebündeltes Plugin
Mattermost wird in aktuellen OpenClaw-Releases als gebündeltes Plugin ausgeliefert, daher benötigen normale gepackte Builds keine separate Installation. Wenn Sie einen älteren Build oder eine benutzerdefinierte Installation verwenden, die Mattermost ausschließt, installieren Sie es manuell: Installation über die CLI (npm-Registry):Schnelleinrichtung
- Stellen Sie sicher, dass das Mattermost-Plugin verfügbar ist.
- Aktuelle gepackte OpenClaw-Releases enthalten es bereits gebündelt.
- Ältere/benutzerdefinierte Installationen können es manuell mit den obigen Befehlen hinzufügen.
- Erstellen Sie ein Mattermost-Bot-Konto und kopieren Sie das Bot-Token.
- Kopieren Sie die Mattermost-Basis-URL (z. B.
https://chat.example.com). - Konfigurieren Sie OpenClaw und starten Sie das Gateway.
Native Slash-Befehle
Native Slash-Befehle sind optional. Wenn sie aktiviert sind, registriert OpenClawoc_*-Slash-Befehle über
die Mattermost-API und empfängt Callback-POSTs auf dem Gateway-HTTP-Server.
native: "auto"ist für Mattermost standardmäßig deaktiviert. Setzen Sienative: true, um es zu aktivieren.- Wenn
callbackUrlfehlt, leitet OpenClaw eine URL aus Gateway-Host/-Port +callbackPathab. - Für Multi-Account-Setups kann
commandsauf Top-Level-Ebene oder unterchannels.mattermost.accounts.<id>.commandsgesetzt werden (Account-Werte überschreiben Top-Level-Felder). - Befehls-Callbacks werden mit den pro Befehl zurückgegebenen Tokens validiert, die
Mattermost bereitstellt, wenn OpenClaw
oc_*-Befehle registriert. - Slash-Callbacks schlagen fail-closed fehl, wenn die Registrierung fehlgeschlagen ist, der Start nur teilweise erfolgte oder das Callback-Token nicht mit einem der registrierten Befehle übereinstimmt.
- Erreichbarkeitsanforderung: Der Callback-Endpunkt muss vom Mattermost-Server aus erreichbar sein.
- Setzen Sie
callbackUrlnicht auflocalhost, es sei denn, Mattermost läuft im selben Host-/Netzwerk-Namespace wie OpenClaw. - Setzen Sie
callbackUrlnicht auf Ihre Mattermost-Basis-URL, es sei denn, diese URL leitet/api/channels/mattermost/commandper Reverse-Proxy an OpenClaw weiter. - Eine schnelle Prüfung ist
curl https://<gateway-host>/api/channels/mattermost/command; ein GET sollte von OpenClaw405 Method Not Allowedund nicht404zurückgeben.
- Setzen Sie
- Mattermost-Egress-Allowlist-Anforderung:
- Wenn Ihr Callback auf private/Tailnet-/interne Adressen zielt, setzen Sie in Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionsso, dass der Callback-Host/-Domain enthalten ist. - Verwenden Sie Host-/Domain-Einträge, keine vollständigen URLs.
- Gut:
gateway.tailnet-name.ts.net - Schlecht:
https://gateway.tailnet-name.ts.net
- Gut:
- Wenn Ihr Callback auf private/Tailnet-/interne Adressen zielt, setzen Sie in Mattermost
Umgebungsvariablen (Standard-Account)
Setzen Sie diese auf dem Gateway-Host, wenn Sie Umgebungsvariablen bevorzugen:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Andere Accounts müssen Konfigurationswerte verwenden.
Chat-Modi
Mattermost antwortet automatisch auf DMs. Das Verhalten in Kanälen wird durchchatmode gesteuert:
oncall(Standard): nur in Kanälen antworten, wenn per @Mention erwähnt.onmessage: auf jede Kanalnachricht antworten.onchar: antworten, wenn eine Nachricht mit einem Trigger-Präfix beginnt.
oncharantwortet weiterhin auf explizite @Mentions.channels.mattermost.requireMentionwird für Legacy-Konfigurationen berücksichtigt, aberchatmodewird bevorzugt.
Threading und Sitzungen
Verwenden Siechannels.mattermost.replyToMode, um zu steuern, ob Antworten in Kanälen und Gruppen im
Hauptkanal bleiben oder einen Thread unter dem auslösenden Beitrag starten.
off(Standard): nur in einem Thread antworten, wenn der eingehende Beitrag sich bereits in einem befindet.first: bei Kanal-/Gruppenbeiträgen auf oberster Ebene einen Thread unter diesem Beitrag starten und die Konversation an eine threadbezogene Sitzung routen.all: aktuell dasselbe Verhalten wiefirstfür Mattermost.- Direktnachrichten ignorieren diese Einstellung und bleiben ohne Thread.
- Threadbezogene Sitzungen verwenden die ID des auslösenden Beitrags als Thread-Wurzel.
firstundallsind derzeit äquivalent, weil, sobald Mattermost eine Thread-Wurzel hat, Folgeblöcke und Medien im selben Thread fortgesetzt werden.
Zugriffskontrolle (DMs)
- Standard:
channels.mattermost.dmPolicy = "pairing"(unbekannte Absender erhalten einen Pairing-Code). - Genehmigung über:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Öffentliche DMs:
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"].
Kanäle (Gruppen)
- Standard:
channels.mattermost.groupPolicy = "allowlist"(Mention-Gating). - Absender mit
channels.mattermost.groupAllowFromauf die Allowlist setzen (Benutzer-IDs empfohlen). - Mention-Überschreibungen pro Kanal befinden sich unter
channels.mattermost.groups.<channelId>.requireMentionoderchannels.mattermost.groups["*"].requireMentionals Standard. @username-Abgleich ist veränderlich und nur aktiviert, wennchannels.mattermost.dangerouslyAllowNameMatching: true.- Offene Kanäle:
channels.mattermost.groupPolicy="open"(Mention-Gating). - Laufzeithinweis: Wenn
channels.mattermostvollständig fehlt, fällt die Laufzeit für Gruppenprüfungen aufgroupPolicy="allowlist"zurück (auch wennchannels.defaults.groupPolicygesetzt ist).
Ziele für die ausgehende Zustellung
Verwenden Sie diese Zielformate mitopenclaw message send oder Cron/Webhooks:
channel:<id>für einen Kanaluser:<id>für eine DM@usernamefür eine DM (über die Mattermost-API aufgelöst)
64ifufp...) sind in Mattermost mehrdeutig (Benutzer-ID vs. Kanal-ID).
OpenClaw löst sie zuerst als Benutzer auf:
- Wenn die ID als Benutzer existiert (
GET /api/v4/users/<id>erfolgreich), sendet OpenClaw eine DM, indem es den direkten Kanal über/api/v4/channels/directauflöst. - Andernfalls wird die ID als Kanal-ID behandelt.
user:<id> / channel:<id>).
Wiederholung für DM-Kanäle
Wenn OpenClaw an ein Mattermost-DM-Ziel sendet und dafür zuerst den direkten Kanal auflösen muss, wiederholt es standardmäßig vorübergehende Fehler bei der Erstellung direkter Kanäle. Verwenden Siechannels.mattermost.dmChannelRetry, um dieses Verhalten global für das Mattermost-Plugin anzupassen,
oder channels.mattermost.accounts.<id>.dmChannelRetry für einen einzelnen Account.
- Dies gilt nur für die Erstellung von DM-Kanälen (
/api/v4/channels/direct), nicht für jeden Mattermost-API-Aufruf. - Wiederholungen gelten für vorübergehende Fehler wie Rate Limits, 5xx-Antworten sowie Netzwerk- oder Timeout-Fehler.
- 4xx-Clientfehler außer
429werden als dauerhaft behandelt und nicht wiederholt.
Reaktionen (message-Tool)
- Verwenden Sie
message action=reactmitchannel=mattermost. messageIdist die Mattermost-Beitrags-ID.emojiakzeptiert Namen wiethumbsupoder:+1:(Doppelpunkte sind optional).- Setzen Sie
remove=true(boolean), um eine Reaktion zu entfernen. - Ereignisse zum Hinzufügen/Entfernen von Reaktionen werden als Systemereignisse an die geroutete Agent-Sitzung weitergeleitet.
channels.mattermost.actions.reactions: Reaktionsaktionen aktivieren/deaktivieren (Standard true).- Überschreibung pro Account:
channels.mattermost.accounts.<id>.actions.reactions.
Interaktive Buttons (message-Tool)
Senden Sie Nachrichten mit anklickbaren Buttons. Wenn ein Benutzer auf einen Button klickt, erhält der Agent die Auswahl und kann antworten. Aktivieren Sie Buttons, indem SieinlineButtons zu den Kanalfähigkeiten hinzufügen:
message action=send mit einem Parameter buttons. Buttons sind ein 2D-Array (Zeilen aus Buttons):
text(erforderlich): angezeigtes Label.callback_data(erforderlich): Wert, der beim Klick zurückgesendet wird (wird als Aktions-ID verwendet).style(optional):"default","primary"oder"danger".
- Alle Buttons werden durch eine Bestätigungszeile ersetzt (z. B. „✓ Yes selected by @user“).
- Der Agent erhält die Auswahl als eingehende Nachricht und antwortet.
- Button-Callbacks verwenden HMAC-SHA256-Validierung (automatisch, keine Konfiguration erforderlich).
- Mattermost entfernt Callback-Daten aus seinen API-Antworten (Sicherheitsfunktion), daher werden beim Klick alle Buttons entfernt — ein teilweises Entfernen ist nicht möglich.
- Aktions-IDs mit Bindestrichen oder Unterstrichen werden automatisch bereinigt (Einschränkung des Mattermost-Routings).
channels.mattermost.capabilities: Array von Fähigkeits-Strings. Fügen Sie"inlineButtons"hinzu, um die Tool-Beschreibung für Buttons im System-Prompt des Agenten zu aktivieren.channels.mattermost.interactions.callbackBaseUrl: optionale externe Basis-URL für Button-Callbacks (zum Beispielhttps://gateway.example.com). Verwenden Sie dies, wenn Mattermost das Gateway nicht direkt über seinen Bind-Host erreichen kann.- In Multi-Account-Setups können Sie dasselbe Feld auch unter
channels.mattermost.accounts.<id>.interactions.callbackBaseUrlsetzen. - Wenn
interactions.callbackBaseUrlfehlt, leitet OpenClaw die Callback-URL vongateway.customBindHost+gateway.portab und fällt dann aufhttp://localhost:<port>zurück. - Erreichbarkeitsregel: Die Button-Callback-URL muss vom Mattermost-Server aus erreichbar sein.
localhostfunktioniert nur, wenn Mattermost und OpenClaw im selben Host-/Netzwerk-Namespace laufen. - Wenn Ihr Callback-Ziel privat/intern/Tailnet ist, fügen Sie dessen Host/Domain zu Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionshinzu.
Direkte API-Integration (externe Skripte)
Externe Skripte und Webhooks können Buttons direkt über die Mattermost-REST-API posten, anstatt dasmessage-Tool des Agenten zu verwenden. Verwenden Sie nach Möglichkeit buildButtonAttachments() aus
der Erweiterung; wenn Sie rohes JSON posten, beachten Sie diese Regeln:
Payload-Struktur:
- Attachments gehören in
props.attachments, nicht in Top-Level-attachments(wird stillschweigend ignoriert). - Jede Aktion benötigt
type: "button"— ohne dies werden Klicks stillschweigend verschluckt. - Jede Aktion benötigt ein Feld
id— Mattermost ignoriert Aktionen ohne IDs. - Die Aktions-
iddarf nur alphanumerisch sein ([a-zA-Z0-9]). Bindestriche und Unterstriche beschädigen Mattermosts serverseitiges Aktionsrouting (liefert 404). Entfernen Sie sie vor der Verwendung. context.action_idmuss mit deriddes Buttons übereinstimmen, damit die Bestätigungsnachricht den Button-Namen (z. B. „Approve“) statt einer rohen ID anzeigt.context.action_idist erforderlich — der Interaktions-Handler gibt ohne dieses Feld 400 zurück.
- Das Secret aus dem Bot-Token ableiten:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Das Kontextobjekt mit allen Feldern außer
_tokenerstellen. - Mit sortierten Schlüsseln und ohne Leerzeichen serialisieren (das Gateway verwendet
JSON.stringifymit sortierten Schlüsseln, was kompakte Ausgabe erzeugt). - Signieren:
HMAC-SHA256(key=secret, data=serializedContext) - Den resultierenden Hex-Digest als
_tokenim Kontext hinzufügen.
- Python
json.dumpsfügt standardmäßig Leerzeichen hinzu ({"key": "val"}). Verwenden Sieseparators=(",", ":"), um Javascripts kompakter Ausgabe zu entsprechen ({"key":"val"}). - Signieren Sie immer alle Kontextfelder (abzüglich
_token). Das Gateway entfernt_tokenund signiert dann alles Verbleibende. Das Signieren einer Teilmenge führt zu stillem Verifizierungsfehler. - Verwenden Sie
sort_keys=True— das Gateway sortiert Schlüssel vor dem Signieren, und Mattermost kann Kontextfelder beim Speichern der Payload neu anordnen. - Leiten Sie das Secret aus dem Bot-Token ab (deterministisch), nicht aus zufälligen Bytes. Das Secret muss in dem Prozess, der Buttons erstellt, und im Gateway, das sie verifiziert, identisch sein.
Verzeichnisadapter
Das Mattermost-Plugin enthält einen Verzeichnisadapter, der Kanal- und Benutzernamen über die Mattermost-API auflöst. Dadurch werden#channel-name- und @username-Ziele in
openclaw message send und bei Cron-/Webhook-Zustellungen unterstützt.
Keine Konfiguration erforderlich — der Adapter verwendet das Bot-Token aus der Account-Konfiguration.
Multi-Account
Mattermost unterstützt mehrere Accounts unterchannels.mattermost.accounts:
Fehlerbehebung
- Keine Antworten in Kanälen: Stellen Sie sicher, dass der Bot im Kanal ist und erwähnen Sie ihn (oncall), verwenden Sie ein Trigger-Präfix (onchar) oder setzen Sie
chatmode: "onmessage". - Auth-Fehler: Prüfen Sie das Bot-Token, die Basis-URL und ob der Account aktiviert ist.
- Probleme mit Multi-Account: Umgebungsvariablen gelten nur für den
default-Account. - Native Slash-Befehle geben
Unauthorized: invalid command token.zurück: OpenClaw hat das Callback-Token nicht akzeptiert. Typische Ursachen:- die Registrierung des Slash-Befehls ist fehlgeschlagen oder beim Start nur teilweise abgeschlossen
- das Callback trifft das falsche Gateway/den falschen Account
- Mattermost hat noch alte Befehle, die auf ein vorheriges Callback-Ziel zeigen
- das Gateway wurde neu gestartet, ohne Slash-Befehle erneut zu aktivieren
- Wenn native Slash-Befehle nicht mehr funktionieren, prüfen Sie die Logs auf
mattermost: failed to register slash commandsodermattermost: native slash commands enabled but no commands could be registered. - Wenn
callbackUrlfehlt und Logs warnen, dass das Callback zuhttp://127.0.0.1:18789/...aufgelöst wurde, ist diese URL wahrscheinlich nur erreichbar, wenn Mattermost im selben Host-/Netzwerk-Namespace wie OpenClaw läuft. Setzen Sie stattdessen eine explizite extern erreichbarecommands.callbackUrl. - Buttons erscheinen als weiße Kästchen: Der Agent sendet möglicherweise fehlerhafte Button-Daten. Prüfen Sie, ob jeder Button sowohl
text- als auchcallback_data-Felder hat. - Buttons werden gerendert, aber Klicks bewirken nichts: Verifizieren Sie, dass
AllowedUntrustedInternalConnectionsin der Mattermost-Serverkonfiguration127.0.0.1 localhostenthält und dassEnablePostActionIntegrationinServiceSettingsauftruegesetzt ist. - Buttons geben bei Klick 404 zurück: Die Button-
identhält wahrscheinlich Bindestriche oder Unterstriche. Mattermosts Aktionsrouter funktioniert nicht mit nicht alphanumerischen IDs. Verwenden Sie nur[a-zA-Z0-9]. - Gateway protokolliert
invalid _token: HMAC stimmt nicht überein. Prüfen Sie, dass Sie alle Kontextfelder signieren (nicht nur eine Teilmenge), sortierte Schlüssel verwenden und kompaktes JSON (ohne Leerzeichen) benutzen. Siehe den HMAC-Abschnitt oben. - Gateway protokolliert
missing _token in context: Das Feld_tokenfehlt im Kontext des Buttons. Stellen Sie sicher, dass es beim Erstellen der Integrations-Payload enthalten ist. - In der Bestätigung wird eine rohe ID statt des Button-Namens angezeigt:
context.action_idstimmt nicht mit deriddes Buttons überein. Setzen Sie beide auf denselben bereinigten Wert. - Der Agent kennt Buttons nicht: Fügen Sie
capabilities: ["inlineButtons"]zur Mattermost-Kanalkonfiguration hinzu.
Verwandt
- Kanäle im Überblick — alle unterstützten Kanäle
- Pairing — DM-Authentifizierung und Pairing-Ablauf
- Gruppen — Verhalten von Gruppenchats und Mention-Gating
- Kanal-Routing — Sitzungsrouting für Nachrichten
- Sicherheit — Zugriffsmodell und Härtung