Mattermost
Status: plugin bawaan (token bot + event WebSocket). Channel, grup, dan DM didukung. Mattermost adalah platform perpesanan tim yang dapat di-host sendiri; lihat situs resmi di mattermost.com untuk detail produk dan unduhan.Plugin bawaan
Mattermost dikirim sebagai plugin bawaan dalam rilis OpenClaw saat ini, jadi build paket normal tidak memerlukan instalasi terpisah. Jika Anda menggunakan build lama atau instalasi kustom yang tidak menyertakan Mattermost, instal secara manual: Instal melalui CLI (registry npm):Penyiapan cepat
- Pastikan plugin Mattermost tersedia.
- Rilis OpenClaw terpaket saat ini sudah menyertakannya.
- Instalasi lama/kustom dapat menambahkannya secara manual dengan perintah di atas.
- Buat akun bot Mattermost dan salin token bot.
- Salin URL dasar Mattermost (misalnya
https://chat.example.com). - Konfigurasikan OpenClaw dan jalankan gateway.
Native slash commands
Native slash commands bersifat opt-in. Saat diaktifkan, OpenClaw mendaftarkan slash commandoc_* melalui
Mattermost API dan menerima POST callback pada server HTTP gateway.
native: "auto"secara default dinonaktifkan untuk Mattermost. Setelnative: trueuntuk mengaktifkannya.- Jika
callbackUrldihilangkan, OpenClaw akan menurunkannya dari host/port gateway +callbackPath. - Untuk penyiapan multi-akun,
commandsdapat disetel di tingkat atas atau di bawahchannels.mattermost.accounts.<id>.commands(nilai akun menimpa field tingkat atas). - Callback perintah divalidasi dengan token per perintah yang dikembalikan oleh
Mattermost saat OpenClaw mendaftarkan perintah
oc_*. - Callback slash gagal secara tertutup saat pendaftaran gagal, startup parsial, atau token callback tidak cocok dengan salah satu perintah yang terdaftar.
- Persyaratan keterjangkauan: endpoint callback harus dapat dijangkau dari server Mattermost.
- Jangan setel
callbackUrlkelocalhostkecuali Mattermost berjalan pada host/network namespace yang sama dengan OpenClaw. - Jangan setel
callbackUrlke URL dasar Mattermost Anda kecuali URL tersebut melakukan reverse-proxy/api/channels/mattermost/commandke OpenClaw. - Pemeriksaan cepat:
curl https://<gateway-host>/api/channels/mattermost/command; GET harus mengembalikan405 Method Not Alloweddari OpenClaw, bukan404.
- Jangan setel
- Persyaratan allowlist egress Mattermost:
- Jika callback Anda menargetkan alamat privat/tailnet/internal, setel Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionsagar menyertakan host/domain callback. - Gunakan entri host/domain, bukan URL lengkap.
- Baik:
gateway.tailnet-name.ts.net - Buruk:
https://gateway.tailnet-name.ts.net
- Baik:
- Jika callback Anda menargetkan alamat privat/tailnet/internal, setel Mattermost
Variabel lingkungan (akun default)
Setel ini pada host gateway jika Anda lebih memilih env var:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Akun lain harus menggunakan nilai konfigurasi.
Mode chat
Mattermost merespons DM secara otomatis. Perilaku channel dikendalikan olehchatmode:
oncall(default): hanya merespons saat di-@mention di channel.onmessage: merespons setiap pesan channel.onchar: merespons saat pesan dimulai dengan prefiks pemicu.
onchartetap merespons @mention eksplisit.channels.mattermost.requireMentiondihormati untuk konfigurasi lama, tetapichatmodelebih disukai.
Threading dan sesi
Gunakanchannels.mattermost.replyToMode untuk mengontrol apakah balasan channel dan grup tetap berada di
channel utama atau memulai thread di bawah post pemicu.
off(default): hanya membalas dalam thread saat post masuk memang sudah berada di thread.first: untuk post channel/grup tingkat atas, mulai thread di bawah post tersebut dan rutekan percakapan ke sesi dengan cakupan thread.all: perilakunya sama denganfirstuntuk Mattermost saat ini.- Pesan langsung mengabaikan pengaturan ini dan tetap non-threaded.
- Sesi dengan cakupan thread menggunakan id post pemicu sebagai akar thread.
firstdanallsaat ini setara karena setelah Mattermost memiliki akar thread, chunk lanjutan dan media akan tetap berada di thread yang sama.
Kontrol akses (DM)
- Default:
channels.mattermost.dmPolicy = "pairing"(pengirim yang tidak dikenal mendapatkan kode pairing). - Setujui melalui:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- DM publik:
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"].
Channel (grup)
- Default:
channels.mattermost.groupPolicy = "allowlist"(dibatasi mention). - Allowlist pengirim dengan
channels.mattermost.groupAllowFrom(ID pengguna direkomendasikan). - Override mention per channel ada di bawah
channels.mattermost.groups.<channelId>.requireMentionatauchannels.mattermost.groups["*"].requireMentionsebagai default. - Pencocokan
@usernamebersifat dapat berubah dan hanya diaktifkan saatchannels.mattermost.dangerouslyAllowNameMatching: true. - Channel terbuka:
channels.mattermost.groupPolicy="open"(dibatasi mention). - Catatan runtime: jika
channels.mattermostsama sekali tidak ada, runtime akan fallback kegroupPolicy="allowlist"untuk pemeriksaan grup (bahkan jikachannels.defaults.groupPolicydisetel).
Target untuk pengiriman keluar
Gunakan format target ini denganopenclaw message send atau cron/webhook:
channel:<id>untuk channeluser:<id>untuk DM@usernameuntuk DM (di-resolve melalui Mattermost API)
64ifufp...) ambigu di Mattermost (ID pengguna vs ID channel).
OpenClaw me-resolve-nya dengan prioritas pengguna terlebih dahulu:
- Jika ID ada sebagai pengguna (
GET /api/v4/users/<id>berhasil), OpenClaw mengirim DM dengan me-resolve channel langsung melalui/api/v4/channels/direct. - Jika tidak, ID diperlakukan sebagai ID channel.
user:<id> / channel:<id>).
Percobaan ulang channel DM
Saat OpenClaw mengirim ke target DM Mattermost dan perlu me-resolve channel langsung terlebih dahulu, OpenClaw secara default mencoba ulang kegagalan sementara pada pembuatan channel langsung. Gunakanchannels.mattermost.dmChannelRetry untuk menyetel perilaku itu secara global untuk plugin Mattermost,
atau channels.mattermost.accounts.<id>.dmChannelRetry untuk satu akun.
- Ini hanya berlaku untuk pembuatan channel DM (
/api/v4/channels/direct), bukan setiap panggilan Mattermost API. - Percobaan ulang berlaku untuk kegagalan sementara seperti rate limit, respons 5xx, dan kesalahan jaringan atau timeout.
- Kesalahan klien 4xx selain
429diperlakukan sebagai permanen dan tidak dicoba ulang.
Reaksi (message tool)
- Gunakan
message action=reactdenganchannel=mattermost. messageIdadalah id post Mattermost.emojimenerima nama sepertithumbsupatau:+1:(titik dua opsional).- Setel
remove=true(boolean) untuk menghapus reaksi. - Event tambah/hapus reaksi diteruskan sebagai event sistem ke sesi agent yang dirutekan.
channels.mattermost.actions.reactions: aktifkan/nonaktifkan tindakan reaksi (default true).- Override per akun:
channels.mattermost.accounts.<id>.actions.reactions.
Tombol interaktif (message tool)
Kirim pesan dengan tombol yang dapat diklik. Saat pengguna mengklik tombol, agent menerima pilihan tersebut dan dapat merespons. Aktifkan tombol dengan menambahkaninlineButtons ke capability channel:
message action=send dengan parameter buttons. Tombol adalah array 2D (baris tombol):
text(wajib): label tampilan.callback_data(wajib): nilai yang dikirim kembali saat diklik (digunakan sebagai action ID).style(opsional):"default","primary", atau"danger".
- Semua tombol diganti dengan baris konfirmasi (misalnya, ”✓ Yes selected by @user”).
- Agent menerima pilihan sebagai pesan masuk dan merespons.
- Callback tombol menggunakan verifikasi HMAC-SHA256 (otomatis, tidak perlu konfigurasi).
- Mattermost menghapus callback data dari respons API-nya (fitur keamanan), sehingga semua tombol dihapus saat diklik — penghapusan sebagian tidak dimungkinkan.
- Action ID yang berisi tanda hubung atau garis bawah disanitasi secara otomatis (keterbatasan routing Mattermost).
channels.mattermost.capabilities: array string capability. Tambahkan"inlineButtons"untuk mengaktifkan deskripsi tool tombol dalam prompt sistem agent.channels.mattermost.interactions.callbackBaseUrl: URL dasar eksternal opsional untuk callback tombol (misalnyahttps://gateway.example.com). Gunakan ini saat Mattermost tidak dapat menjangkau gateway pada bind host-nya secara langsung.- Dalam penyiapan multi-akun, Anda juga dapat menyetel field yang sama di bawah
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Jika
interactions.callbackBaseUrldihilangkan, OpenClaw menurunkan URL callback darigateway.customBindHost+gateway.port, lalu fallback kehttp://localhost:<port>. - Aturan keterjangkauan: URL callback tombol harus dapat dijangkau dari server Mattermost.
localhosthanya berfungsi jika Mattermost dan OpenClaw berjalan pada host/network namespace yang sama. - Jika target callback Anda bersifat privat/tailnet/internal, tambahkan host/domain-nya ke Mattermost
ServiceSettings.AllowedUntrustedInternalConnections.
Integrasi API langsung (skrip eksternal)
Skrip eksternal dan webhook dapat mem-posting tombol langsung melalui Mattermost REST API alih-alih melaluimessage tool milik agent. Gunakan buildButtonAttachments() dari
ekstensi bila memungkinkan; jika mem-posting JSON mentah, ikuti aturan ini:
Struktur payload:
- Attachment ditempatkan di
props.attachments, bukanattachmentstingkat atas (kalau tidak akan diabaikan secara diam-diam). - Setiap action memerlukan
type: "button"— tanpa itu, klik akan tertelan secara diam-diam. - Setiap action memerlukan field
id— Mattermost mengabaikan action tanpa ID. idaction harus hanya alfanumerik ([a-zA-Z0-9]). Tanda hubung dan garis bawah merusak routing action sisi server Mattermost (mengembalikan 404). Hapus karakter tersebut sebelum digunakan.context.action_idharus cocok denganidtombol agar pesan konfirmasi menampilkan nama tombol (misalnya, “Approve”), bukan ID mentah.context.action_idwajib — handler interaksi mengembalikan 400 tanpanya.
- Turunkan secret dari token bot:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Bangun objek context dengan semua field kecuali
_token. - Serialisasikan dengan kunci yang diurutkan dan tanpa spasi (gateway menggunakan
JSON.stringifydengan kunci yang diurutkan, yang menghasilkan output ringkas). - Tanda tangani:
HMAC-SHA256(key=secret, data=serializedContext) - Tambahkan hex digest yang dihasilkan sebagai
_tokendalam context.
json.dumpsPython secara default menambahkan spasi ({"key": "val"}). Gunakanseparators=(",", ":")agar cocok dengan output ringkas JavaScript ({"key":"val"}).- Selalu tanda tangani semua field context (tanpa
_token). Gateway menghapus_tokenlalu menandatangani semua yang tersisa. Menandatangani subset akan menyebabkan kegagalan verifikasi diam-diam. - Gunakan
sort_keys=True— gateway mengurutkan kunci sebelum penandatanganan, dan Mattermost dapat mengubah urutan field context saat menyimpan payload. - Turunkan secret dari token bot (deterministik), bukan byte acak. Secret harus sama di seluruh proses yang membuat tombol dan gateway yang memverifikasi.
Adapter direktori
Plugin Mattermost menyertakan adapter direktori yang me-resolve nama channel dan pengguna melalui Mattermost API. Ini memungkinkan target#channel-name dan @username dalam
openclaw message send dan pengiriman cron/webhook.
Tidak diperlukan konfigurasi — adapter menggunakan token bot dari konfigurasi akun.
Multi-akun
Mattermost mendukung beberapa akun di bawahchannels.mattermost.accounts:
Pemecahan masalah
- Tidak ada balasan di channel: pastikan bot ada di channel dan sebut bot tersebut (oncall), gunakan prefiks pemicu (onchar), atau setel
chatmode: "onmessage". - Kesalahan autentikasi: periksa token bot, URL dasar, dan apakah akun diaktifkan.
- Masalah multi-akun: env var hanya berlaku untuk akun
default. - Native slash commands mengembalikan
Unauthorized: invalid command token.: OpenClaw tidak menerima token callback. Penyebab umum:- pendaftaran slash command gagal atau hanya selesai sebagian saat startup
- callback mengenai gateway/akun yang salah
- Mattermost masih memiliki perintah lama yang menunjuk ke target callback sebelumnya
- gateway direstart tanpa mengaktifkan kembali slash commands
- Jika native slash commands berhenti berfungsi, periksa log untuk
mattermost: failed to register slash commandsataumattermost: native slash commands enabled but no commands could be registered. - Jika
callbackUrldihilangkan dan log memperingatkan bahwa callback di-resolve kehttp://127.0.0.1:18789/..., URL tersebut kemungkinan hanya dapat dijangkau saat Mattermost berjalan pada host/network namespace yang sama dengan OpenClaw. Setelcommands.callbackUrleksplisit yang dapat dijangkau dari luar. - Tombol muncul sebagai kotak putih: agent mungkin mengirim data tombol yang tidak valid. Pastikan setiap tombol memiliki field
textdancallback_data. - Tombol dirender tetapi klik tidak melakukan apa-apa: verifikasi
AllowedUntrustedInternalConnectionspada konfigurasi server Mattermost menyertakan127.0.0.1 localhost, danEnablePostActionIntegrationbernilaitruedi ServiceSettings. - Tombol mengembalikan 404 saat diklik:
idtombol kemungkinan berisi tanda hubung atau garis bawah. Router action Mattermost rusak pada ID non-alfanumerik. Gunakan hanya[a-zA-Z0-9]. - Log gateway
invalid _token: HMAC tidak cocok. Periksa bahwa Anda menandatangani semua field context (bukan subset), menggunakan kunci yang diurutkan, dan JSON ringkas (tanpa spasi). Lihat bagian HMAC di atas. - Log gateway
missing _token in context: field_tokentidak ada dalam context tombol. Pastikan field tersebut disertakan saat membangun payload integrasi. - Konfirmasi menampilkan ID mentah alih-alih nama tombol:
context.action_idtidak cocok denganidtombol. Setel keduanya ke nilai tersanitasi yang sama. - Agent tidak mengetahui tombol: tambahkan
capabilities: ["inlineButtons"]ke konfigurasi channel Mattermost.
Terkait
- Ikhtisar Channels — semua channel yang didukung
- Pairing — autentikasi DM dan alur pairing
- Groups — perilaku obrolan grup dan pembatasan mention
- Channel Routing — routing sesi untuk pesan
- Security — model akses dan hardening