Developer and self-hosted
Mattermost
Status: herunterladbares Plugin (Bot-Token + WebSocket-Ereignisse). Channels, Gruppen und DMs werden unterstützt. Mattermost ist eine selbst hostbare Team-Messaging-Plattform; Produktdetails und Downloads finden Sie auf der offiziellen Website unter mattermost.com.
Installieren
Installieren Sie Mattermost, bevor Sie den Channel konfigurieren:
npm-Registry
openclaw plugins install @openclaw/mattermostLokaler Checkout
openclaw plugins install ./path/to/local/mattermost-pluginDetails: Plugins
Schnelle Einrichtung
Sicherstellen, dass das Plugin verfügbar ist
Installieren Sie @openclaw/mattermost mit dem obigen Befehl und starten Sie anschließend den Gateway neu, falls er bereits ausgeführt wird.
Mattermost-Bot erstellen
Erstellen Sie ein Mattermost-Bot-Konto und kopieren Sie das Bot-Token.
Basis-URL kopieren
Kopieren Sie die Mattermost-Basis-URL (z. B. https://chat.example.com).
OpenClaw konfigurieren und Gateway starten
Minimale Konfiguration:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Native Slash-Befehle
Native Slash-Befehle sind optional. Wenn sie aktiviert sind, registriert OpenClaw oc_*-Slash-Befehle ü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 zum Verhalten
native: "auto"ist für Mattermost standardmäßig deaktiviert. Setzen Sienative: true, um es zu aktivieren.- Wenn
callbackUrlweggelassen wird, leitet OpenClaw eine URL aus Gateway-Host/Port +callbackPathab. - Für Multi-Account-Einrichtungen kann
commandsauf oberster Ebene oder unterchannels.mattermost.accounts.<id>.commandsgesetzt werden (Kontowerte überschreiben Felder auf oberster Ebene). - Befehls-Callbacks werden mit den pro Befehl zurückgegebenen Token validiert, die Mattermost zurückgibt, wenn OpenClaw
oc_*-Befehle registriert. - OpenClaw aktualisiert die aktuelle Mattermost-Befehlsregistrierung, bevor jeder Callback akzeptiert wird, sodass veraltete Token von gelöschten oder neu generierten Slash-Befehlen ohne Gateway-Neustart nicht mehr akzeptiert werden.
- Die Callback-Validierung schlägt geschlossen fehl, wenn die Mattermost-API nicht bestätigen kann, dass der Befehl noch aktuell ist; fehlgeschlagene Validierungen werden kurz zwischengespeichert, gleichzeitige Lookups werden zusammengeführt, und Starts frischer Lookups werden pro Befehl ratenbegrenzt, um Wiedergabedruck zu begrenzen.
- Slash-Callbacks schlagen geschlossen fehl, wenn die Registrierung fehlgeschlagen ist, der Start nur teilweise erfolgreich war oder das Callback-Token nicht mit dem registrierten Token des aufgelösten Befehls übereinstimmt (ein für einen Befehl gültiges Token kann die Upstream-Validierung für einen anderen Befehl nicht erreichen).
Erreichbarkeitsanforderung
Der Callback-Endpunkt muss vom Mattermost-Server erreichbar sein.
- Setzen Sie
callbackUrlnicht auflocalhost, es sei denn, Mattermost läuft auf demselben Host/in demselben 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 Allowedzurückgeben, nicht404.
Mattermost-Egress-Allowlist
Wenn Ihr Callback private/Tailnet-/interne Adressen ansteuert, setzen Sie Mattermost ServiceSettings.AllowedUntrustedInternalConnections so, dass der Callback-Host/die Callback-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
Umgebungsvariablen (Standardkonto)
Setzen Sie diese auf dem Gateway-Host, wenn Sie Umgebungsvariablen bevorzugen:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Chat-Modi
Mattermost antwortet automatisch auf DMs. Das Channel-Verhalten wird durch chatmode gesteuert:
oncall (Standard)
Nur antworten, wenn in Channels per @ erwähnt.
onmessage
Auf jede Channel-Nachricht antworten.
onchar
Antworten, wenn eine Nachricht mit einem Trigger-Präfix beginnt.
Konfigurationsbeispiel:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], }, },}Hinweise:
oncharreagiert weiterhin auf explizite @Erwähnungen.channels.mattermost.requireMentionwird für Legacy-Konfigurationen berücksichtigt, aberchatmodewird bevorzugt.- Nachdem der Bot in einem Channel-Thread eine sichtbare Antwort gesendet hat, werden spätere Nachrichten im selben Thread ohne neue @Erwähnung oder
onchar-Präfix beantwortet, sodass mehrstufige Thread-Unterhaltungen weiterlaufen. Die Teilnahme wird für 7 Tage Thread-Inaktivität gespeichert (bei jeder Antwort aufgefrischt) und bleibt über Gateway-Neustarts hinweg bestehen. Threads, die der Bot nur beobachtet hat, sind nicht betroffen; starten Sie eine neue Top-Level-Nachricht, um wieder eine explizite Erwähnung zu verlangen.
Threading und Sitzungen
Verwenden Sie channels.mattermost.replyToMode, um zu steuern, ob Channel- und Gruppenantworten im Haupt-Channel bleiben oder einen Thread unter dem auslösenden Post starten.
off(Standard): nur in einem Thread antworten, wenn der eingehende Post bereits in einem ist.first: bei Top-Level-Channel-/Gruppen-Posts einen Thread unter diesem Post starten und die Unterhaltung an eine Thread-bezogene Sitzung weiterleiten.all: heute dasselbe Verhalten wiefirstfür Mattermost.- Direktnachrichten ignorieren diese Einstellung und bleiben ohne Thread.
Konfigurationsbeispiel:
{ channels: { mattermost: { replyToMode: "all", }, },}Hinweise:
- Thread-bezogene Sitzungen verwenden die ID des auslösenden Posts als Thread-Stamm.
firstundallsind derzeit äquivalent, weil Folge-Chunks und Medien im selben Thread fortgesetzt werden, sobald Mattermost einen Thread-Stamm hat.
Zugriffskontrolle (DMs)
- Standard:
channels.mattermost.dmPolicy = "pairing"(unbekannte Absender erhalten einen Kopplungscode). - Genehmigen über:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Öffentliche DMs:
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"]. channels.mattermost.allowFromakzeptiertaccessGroup:<name>-Einträge. Siehe Zugriffsgruppen.
Channels (Gruppen)
- Standard:
channels.mattermost.groupPolicy = "allowlist"(erwähnungsgesteuert). - Absender mit
channels.mattermost.groupAllowFromerlauben (Benutzer-IDs empfohlen). channels.mattermost.groupAllowFromakzeptiertaccessGroup:<name>-Einträge. Siehe Zugriffsgruppen.- Erwähnungsüberschreibungen pro Channel befinden sich unter
channels.mattermost.groups.<channelId>.requireMentionoderchannels.mattermost.groups["*"].requireMentionals Standardwert. @username-Abgleich ist veränderlich und nur aktiviert, wennchannels.mattermost.dangerouslyAllowNameMatching: true.- Offene Channels:
channels.mattermost.groupPolicy="open"(erwähnungsgesteuert). - Laufzeithinweis: Wenn
channels.mattermostvollständig fehlt, fällt die Laufzeit für Gruppenprüfungen aufgroupPolicy="allowlist"zurück (auch wennchannels.defaults.groupPolicygesetzt ist).
Beispiel:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}Ziele für ausgehende Zustellung
Verwenden Sie diese Zielformate mit openclaw message send oder Cron/Webhooks:
channel:<id>für einen Channeluser:<id>für eine DM@usernamefür eine DM (über die Mattermost-API aufgelöst)
DM-Channel-Wiederholung
Wenn OpenClaw an ein Mattermost-DM-Ziel sendet und zuerst den direkten Channel auflösen muss, wiederholt es vorübergehende Fehler bei der Erstellung des direkten Channels standardmäßig.
Verwenden Sie channels.mattermost.dmChannelRetry, um dieses Verhalten global für das Mattermost-Plugin anzupassen, oder channels.mattermost.accounts.<id>.dmChannelRetry für ein Konto.
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Hinweise:
- Dies gilt nur für die Erstellung von DM-Channels (
/api/v4/channels/direct), nicht für jeden Mattermost-API-Aufruf. - Wiederholungen gelten für vorübergehende Fehler wie Ratenlimits, 5xx-Antworten sowie Netzwerk- oder Timeout-Fehler.
- 4xx-Clientfehler außer
429werden als dauerhaft behandelt und nicht erneut versucht.
Preview-Streaming
Mattermost streamt Denkprozesse, Tool-Aktivität und Teilantworttext in einen einzelnen Entwurfsvorschau-Post, der direkt finalisiert wird, sobald die endgültige Antwort sicher gesendet werden kann. Die Vorschau wird auf derselben Post-ID aktualisiert, statt den Channel mit Nachrichten pro Chunk zu fluten. Medien-/Fehler-Endzustände brechen ausstehende Vorschau-Bearbeitungen ab und verwenden normale Zustellung, statt einen wegwerfbaren Vorschau-Post zu flushen.
Aktivieren über channels.mattermost.streaming:
{ channels: { mattermost: { streaming: "partial", // off | partial | block | progress }, },}Streaming-Modi
partialist die übliche Wahl: ein Vorschau-Post, der bearbeitet wird, während die Antwort wächst, und dann mit der vollständigen Antwort finalisiert wird.blockverwendet Entwurfs-Chunks im Append-Stil innerhalb des Vorschau-Posts.progresszeigt während der Generierung eine Statusvorschau und postet die endgültige Antwort erst nach Abschluss.offdeaktiviert Preview-Streaming.
Hinweise zum Streaming-Verhalten
- Wenn der Stream nicht direkt finalisiert werden kann (zum Beispiel weil der Post während des Streams gelöscht wurde), fällt OpenClaw auf das Senden eines frischen finalen Posts zurück, damit die Antwort nie verloren geht.
- Payloads, die nur Denkprozesse enthalten, werden aus Channel-Posts unterdrückt, einschließlich Text, der als
> Thinking-Blockquote eintrifft. Setzen Sie/reasoning on, um Denkprozesse in anderen Oberflächen zu sehen; der finale Mattermost-Post enthält nur die Antwort. - Siehe Streaming für die Channel-Mapping-Matrix.
Reaktionen (Nachrichtentool)
- Verwenden Sie
message action=reactmitchannel=mattermost. messageIdist die Mattermost-Post-ID.emojiakzeptiert Namen wiethumbsupoder:+1:(Doppelpunkte sind optional).- Setzen Sie
remove=true(boolesch), um eine Reaktion zu entfernen. - Ereignisse zum Hinzufügen/Entfernen von Reaktionen werden als Systemereignisse an die geroutete Agentensitzung 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: Reaktionsaktionen aktivieren/deaktivieren (standardmäßig true).- Überschreibung pro Konto:
channels.mattermost.accounts.<id>.actions.reactions.
Interaktive Buttons (Nachrichtentool)
Senden Sie Nachrichten mit anklickbaren Buttons. Wenn ein Benutzer auf einen Button klickt, erhält der Agent die Auswahl und kann antworten.
Normale Agent-Antworten können auch semantische presentation-Payloads enthalten. OpenClaw rendert Value-Schaltflächen als interaktive Mattermost-Schaltflächen, hält URL-Schaltflächen im Nachrichtentext sichtbar und stuft Auswahlmenüs zu lesbarem Text herab.
Aktivieren Sie Schaltflächen, indem Sie inlineButtons zu den Channel-Capabilities hinzufügen:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Verwenden Sie message action=send mit einem buttons-Parameter. Schaltflächen sind ein 2D-Array (Zeilen von Schaltflächen):
message action=send channel=mattermost target=channel:<channelId> buttons=[[{"text":"Yes","callback_data":"yes"},{"text":"No","callback_data":"no"}]]Schaltflächenfelder:
textstringrequiredAnzeigebezeichnung.
callback_datastringrequiredWert, der beim Klicken zurückgesendet wird (als Aktions-ID verwendet).
style"default" | "primary" | "danger"Schaltflächenstil.
Wenn ein Benutzer auf eine Schaltfläche klickt:
Buttons replaced with confirmation
Alle Schaltflächen werden durch eine Bestätigungszeile ersetzt (z. B. "✓ Yes selected by @user").
Agent receives the selection
Der Agent empfängt die Auswahl als eingehende Nachricht und antwortet.
Implementation notes
- Schaltflächen-Callbacks verwenden HMAC-SHA256-Verifizierung (automatisch, keine Konfiguration erforderlich).
- Mattermost entfernt Callback-Daten aus seinen API-Antworten (Sicherheitsfunktion), daher werden beim Klicken alle Schaltflächen entfernt - eine teilweise Entfernung ist nicht möglich.
- Aktions-IDs, die Bindestriche oder Unterstriche enthalten, werden automatisch bereinigt (Mattermost-Routing-Einschränkung).
Config and reachability
channels.mattermost.capabilities: Array von Capability-Strings. Fügen Sie"inlineButtons"hinzu, um die Beschreibung des Schaltflächen-Tools im Agent-System-Prompt zu aktivieren.channels.mattermost.interactions.callbackBaseUrl: optionale externe Basis-URL für Schaltflächen-Callbacks (zum Beispielhttps://gateway.example.com). Verwenden Sie dies, wenn Mattermost den Gateway nicht direkt über dessen Bind-Host erreichen kann.- In Multi-Account-Setups können Sie dasselbe Feld auch unter
channels.mattermost.accounts.<id>.interactions.callbackBaseUrlsetzen. - Wenn
interactions.callbackBaseUrlausgelassen wird, leitet OpenClaw die Callback-URL ausgateway.customBindHost+gateway.portab und fällt dann aufhttp://localhost:<port>zurück. - Erreichbarkeitsregel: Die Schaltflächen-Callback-URL muss vom Mattermost-Server erreichbar sein.
localhostfunktioniert nur, wenn Mattermost und OpenClaw auf demselben Host/in demselben Netzwerk-Namespace ausgeführt werden. - Wenn Ihr Callback-Ziel privat/tailnet/intern ist, fügen Sie seinen Host bzw. seine Domain zu Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionshinzu.
Direkte API-Integration (externe Skripte)
Externe Skripte und Webhooks können Schaltflächen direkt über die Mattermost-REST-API posten, statt über das message-Tool des Agent zu gehen. Verwenden Sie nach Möglichkeit buildButtonAttachments() aus dem Plugin; wenn Sie rohes JSON posten, befolgen Sie diese 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 }, }, }, ], }, ], },}HMAC-Token-Erzeugung
Der Gateway verifiziert Schaltflächenklicks mit HMAC-SHA256. Externe Skripte müssen Tokens erzeugen, die mit der Verifizierungslogik des Gateway übereinstimmen:
Derive the secret from the bot token
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)
Build the context object
Erstellen Sie das Kontextobjekt mit allen Feldern außer _token.
Serialize with sorted keys
Serialisieren Sie mit sortierten Schlüsseln und ohne Leerzeichen (der Gateway verwendet JSON.stringify mit sortierten Schlüsseln, wodurch kompakte Ausgabe entsteht).
Sign the payload
HMAC-SHA256(key=secret, data=serializedContext)
Add the token
Fügen Sie den resultierenden Hex-Digest als _token im Kontext hinzu.
Python-Beispiel:
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}Common HMAC pitfalls
- Pythons
json.dumpsfügt standardmäßig Leerzeichen hinzu ({"key": "val"}). Verwenden Sieseparators=(",", ":"), um der kompakten JavaScript-Ausgabe ({"key":"val"}) zu entsprechen. - Signieren Sie immer alle Kontextfelder (minus
_token). Der Gateway entfernt_tokenund signiert dann alles, was übrig bleibt. Das Signieren einer Teilmenge führt zu einem stillen Verifizierungsfehler. - Verwenden Sie
sort_keys=True- der 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 Schaltflächen erstellt, und im Gateway, der verifiziert, identisch sein.
Verzeichnisadapter
Das Mattermost-Plugin enthält einen Verzeichnisadapter, der Channel- und Benutzernamen über die Mattermost-API auflöst. Dies ermöglicht #channel-name- und @username-Ziele in openclaw message send sowie Cron-/Webhook-Zustellungen.
Es ist keine Konfiguration erforderlich - der Adapter verwendet das Bot-Token aus der Account-Konfiguration.
Multi-Account
Mattermost unterstützt mehrere Accounts unter channels.mattermost.accounts:
{ 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
No replies in channels
Stellen Sie sicher, dass sich der Bot im Channel befindet, und erwähnen Sie ihn (oncall), verwenden Sie ein Trigger-Präfix (onchar), oder setzen Sie chatmode: "onmessage".
Auth or multi-account errors
- Prüfen Sie das Bot-Token, die Basis-URL und ob der Account aktiviert ist.
- Multi-Account-Probleme: Env-Vars gelten nur für den
default-Account.
Native slash commands fail
Unauthorized: invalid command token.: OpenClaw hat das Callback-Token nicht akzeptiert. Typische Ursachen:- Die Slash-Command-Registrierung ist fehlgeschlagen oder wurde beim Start nur teilweise abgeschlossen
- Der Callback trifft den falschen Gateway/Account
- Mattermost hat noch alte Commands, die auf ein früheres Callback-Ziel zeigen
- Der Gateway wurde neu gestartet, ohne Slash Commands erneut zu aktivieren
- Wenn native Slash Commands 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
callbackUrlausgelassen wird und Logs warnen, dass der Callback zuhttp://127.0.0.1:18789/...aufgelöst wurde, ist diese URL wahrscheinlich nur erreichbar, wenn Mattermost auf demselben Host/in demselben Netzwerk-Namespace wie OpenClaw läuft. Setzen Sie stattdessen eine explizite, extern erreichbarecommands.callbackUrl.
Buttons issues
- Schaltflächen erscheinen als weiße Kästen: Der Agent sendet möglicherweise fehlerhafte Schaltflächendaten. Prüfen Sie, dass jede Schaltfläche sowohl ein
text- als auch eincallback_data-Feld hat. - Schaltflächen werden gerendert, aber Klicks bewirken nichts: Stellen Sie sicher, dass
AllowedUntrustedInternalConnectionsin der Mattermost-Serverkonfiguration127.0.0.1 localhostenthält und dassEnablePostActionIntegrationin ServiceSettings auftruegesetzt ist. - Schaltflächen geben beim Klicken 404 zurück: Die Schaltflächen-
identhält wahrscheinlich Bindestriche oder Unterstriche. Mattermosts Aktions-Router scheitert bei nicht alphanumerischen IDs. Verwenden Sie nur[a-zA-Z0-9]. - Gateway-Logs melden
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 verwenden (keine Leerzeichen). Siehe den HMAC-Abschnitt oben. - Gateway-Logs melden
missing _token in context: Das_token-Feld befindet sich nicht im Kontext der Schaltfläche. Stellen Sie sicher, dass es beim Erstellen der Integrations-Payload enthalten ist. - Bestätigung zeigt rohe ID statt Schaltflächennamen:
context.action_idstimmt nicht mit deridder Schaltfläche überein. Setzen Sie beide auf denselben bereinigten Wert. - Der Agent weiß nichts von Schaltflächen: Fügen Sie
capabilities: ["inlineButtons"]zur Mattermost-Channel-Konfiguration hinzu.
Verwandt
- Channel-Routing - Session-Routing für Nachrichten
- Channel-Übersicht - alle unterstützten Channels
- Gruppen - Gruppenchat-Verhalten und Mention-Gating
- Pairing - DM-Authentifizierung und Pairing-Ablauf
- Sicherheit - Zugriffsmodell und Härtung