プラグインが必要
Mattermost はプラグインとして提供されており、コアインストールには同梱されていません。 CLI (npm レジストリ) 経由でインストールします:クイックセットアップ
- Mattermost プラグインをインストールします。
- Mattermost ボットアカウントを作成し、ボットトークンをコピーします。
- Mattermost のベース URL(例:
https://chat.example.com)をコピーします。 - OpenClaw を設定し、ゲートウェイを起動します。
ネイティブのスラッシュコマンド
ネイティブのスラッシュコマンドはオプトイン方式です。有効にすると、OpenClaw は Mattermost API を介してoc_* スラッシュコマンドを登録し、ゲートウェイの HTTP サーバーでコールバック POST を受信します。
native: "auto"の場合、Mattermost ではデフォルトで無効になります。有効にするにはnative: trueを設定してください。callbackUrlが省略された場合、OpenClaw はゲートウェイのホスト/ポート +callbackPathから自動的に導出します。- マルチアカウント設定の場合、
commandsはトップレベル、またはchannels.mattermost.accounts.<id>.commands配下で設定可能です(アカウントごとの値が最上位フィールドを上書きします)。 - コマンドコールバックはコマンドごとのトークンで検証され、チェックに失敗した場合は安全のために実行を拒否(フェールクローズ)します。
- 到達可能性の要件: コールバックエンドポイントは Mattermost サーバーから到達可能である必要があります。
- Mattermost が OpenClaw と同じホスト/ネットワーク名前空間で実行されていない限り、
callbackUrlをlocalhostに設定しないでください。 - URL が OpenClaw への
/api/channels/mattermost/commandをリバースプロキシしている場合を除き、callbackUrlを Mattermost のベース URL と同じに設定しないでください。 - 簡単な確認方法として、
curl https://<gateway-host>/api/channels/mattermost/commandを実行してください。OpenClaw から404ではなく405 Method Not Allowedが返ってくれば正常です。
- Mattermost が OpenClaw と同じホスト/ネットワーク名前空間で実行されていない限り、
- Mattermost の送信(Egress)許可リストの要件:
- コールバック先がプライベート/Tailscale/内部アドレスの場合は、Mattermost の
ServiceSettings.AllowedUntrustedInternalConnectionsにコールバックホスト/ドメインを追加してください。 - 完全な URL ではなく、ホスト/ドメインのみを指定します。
- 良い例:
gateway.tailnet-name.ts.net - 悪い例:
https://gateway.tailnet-name.ts.net
- 良い例:
- コールバック先がプライベート/Tailscale/内部アドレスの場合は、Mattermost の
環境変数 (デフォルトアカウント)
環境変数を使用したい場合は、ゲートウェイホストで以下を設定します:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default) にのみ適用されます。その他のアカウントは構成ファイルの値を使用する必要があります。
チャットモード
Mattermost は DM に自動的に応答します。チャネルでの動作はchatmode で制御されます:
oncall(デフォルト): チャネルで @メンションされた場合にのみ応答します。onmessage: すべてのチャネルメッセージに応答します。onchar: メッセージが特定のトリガープレフィックスで始まる場合に応答します。
oncharモードでも、明示的な @メンションには引き続き応答します。- レガシーな構成では
channels.mattermost.requireMentionも尊重されますが、chatmodeの使用を推奨します。
アクセス制御 (DM)
- デフォルト:
channels.mattermost.dmPolicy = "pairing"(未知の送信者にはペアリングコードが送信されます)。 - 承認方法:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- パブリック DM:
channels.mattermost.dmPolicy="open"かつchannels.mattermost.allowFrom=["*"]。
チャネル (グループ)
- デフォルト:
channels.mattermost.groupPolicy = "allowlist"(メンション制限あり)。 channels.mattermost.groupAllowFromで送信者を許可リストに登録します(ユーザー ID を推奨)。@usernameによる照合は変更可能であり、channels.mattermost.dangerouslyAllowNameMatching: trueが設定されている場合にのみ有効になります。- オープンチャネル:
channels.mattermost.groupPolicy="open"(メンション制限あり)。 - ランタイムに関する注意:
channels.mattermostセクションが完全に欠落している場合、ランタイムはグループチェックのためにgroupPolicy="allowlist"にフォールバックします(channels.defaults.groupPolicyが設定されている場合でも)。
アウトバウンド配信のターゲット
openclaw message send や Cron/Webhook で使用できるターゲット形式は以下の通りです:
- チャネルの場合:
channel:<id> - DM の場合:
user:<id> - DM の場合:
@username(Mattermost API 経由で解決)
リアクション (メッセージツール)
channel=mattermostでmessage action=reactを使用します。messageIdは Mattermost の投稿 ID です。emojiはthumbsupや:+1:のような名前を受け入れます(コロンは任意)。- リアクションを削除するには
remove=true(boolean) を設定します。 - リアクションの追加/削除イベントは、ルーティングされたエージェントセッションにシステムイベントとして転送されます。
channels.mattermost.actions.reactions: リアクション操作を有効/無効にします(デフォルト: true)。- アカウントごとのオーバーライド:
channels.mattermost.accounts.<id>.actions.reactions。
インタラクティブボタン (メッセージツール)
クリック可能なボタン付きのメッセージを送信できます。ユーザーがボタンをクリックすると、エージェントはその選択内容を受け取って応答できます。 チャネル機能にinlineButtons を追加してボタンを有効にします:
buttons パラメータを指定して message action=send を使用します。ボタンは 2 次元配列(ボタンの行)です:
text(必須): 表示ラベル。callback_data(必須): クリック時に返される値(アクション ID として使用)。style(任意):"default","primary", または"danger"。
- すべてのボタンが確認メッセージに置き換わります(例: 「✓ はい が @user によって選択されました」)。
- エージェントは選択内容をインバウンドメッセージとして受け取り、応答します。
- ボタンのコールバックは HMAC-SHA256 検証を使用します(自動で行われ、設定は不要です)。
- Mattermost は API レスポンスからコールバックデータを削除するため(セキュリティ機能)、クリック時にはすべてのボタンが削除されます。部分的な削除はできません。
- ハイフンやアンダースコアを含むアクション ID は自動的にサニタイズされます(Mattermost のルーティング制限のため)。
channels.mattermost.capabilities: 機能文字列の配列。エージェントのシステムプロンプトでボタンツールの説明を有効にするには、"inlineButtons"を追加してください。channels.mattermost.interactions.callbackBaseUrl: ボタンコールバック用のオプションの外部ベース URL(例:https://gateway.example.com)。Mattermost がゲートウェイのバインドアドレスに直接到達できない場合に使用します。- マルチアカウント設定では、
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl配下でも同じフィールドを設定できます。 interactions.callbackBaseUrlが省略された場合、OpenClaw はgateway.customBindHost+gateway.portから導出し、さらにhttp://localhost:<port>にフォールバックします。- 到達可能性ルール: ボタンのコールバック URL は Mattermost サーバーから到達可能である必要があります。
localhostは、Mattermost と OpenClaw が同じホスト/ネットワーク名前空間で実行されている場合にのみ機能します。 - コールバック先がプライベート/Tailscale/内部アドレスの場合は、Mattermost の
ServiceSettings.AllowedUntrustedInternalConnectionsにそのホスト/ドメインを追加してください。
直接 API 連携 (外部スクリプト)
外部スクリプトや Webhook は、エージェントのmessage ツールを通さずに、Mattermost REST API 経由で直接ボタンを投稿できます。可能な限り拡張機能の buildButtonAttachments() を使用してください。生の JSON を投稿する場合は、以下のルールに従ってください:
ペイロード構造:
- アタッチメントは、トップレベルの
attachmentsではなくprops.attachmentsに入れる必要があります(トップレベルは無視されます)。 - すべてのアクションに
type: "button"が必要です。これがないとクリックが通知されません。 - すべてのアクションに
idフィールドが必要です。Mattermost は ID のないアクションを無視します。 - アクションの
idは英数字のみ ([a-zA-Z0-9]) である必要があります。ハイフンやアンダースコアは Mattermost のサーバー側アクションルーティングを破壊します(404 が返ります)。使用前に除去してください。 context.action_idはボタンのidと一致させる必要があります。これにより、確認メッセージに生の ID ではなくボタン名(例: 「承認」)が表示されます。context.action_idは必須です。これがないとインタラクションハンドラーは 400 を返します。
- ボットトークンからシークレットを導出します:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) _tokenを除くすべてのフィールドを含むコンテキストオブジェクトを構築します。- キーをソートし、スペースなしでシリアル化します(ゲートウェイはソートされたキーで
JSON.stringifyを行い、コンパクトな出力を生成します)。 - 署名します:
HMAC-SHA256(key=secret, data=serializedContext) - 生成された 16 進ダイジェストを
_tokenとしてコンテキストに追加します。
- Python の
json.dumpsはデフォルトでスペースを追加します ({"key": "val"})。JavaScript のコンパクトな出力 ({"key":"val"}) に合わせるため、separators=(",", ":")を使用してください。 - 常にすべてのコンテキストフィールド(
_token以外)を署名対象にしてください。ゲートウェイは_tokenを除去した後、残ったすべてを署名します。一部のフィールドのみを署名すると検証に失敗します。 sort_keys=Trueを使用してください。ゲートウェイは署名前にキーをソートします。また、Mattermost はペイロード保存時にコンテキストフィールドの順序を変更することがあります。- シークレットはランダムなバイトではなく、ボットトークンから(決定論的に)導出してください。ボタンを作成するプロセスと検証するゲートウェイで同じシークレットを使用する必要があります。
ディレクトリアダプター
Mattermost プラグインには、Mattermost API 経由でチャネル名やユーザー名を解決するディレクトリアダプターが含まれています。これにより、openclaw message send や Cron/Webhook 配信において #channel-name や @username をターゲットとして指定できるようになります。
設定は不要です。アダプターはアカウント構成のボットトークンを自動的に使用します。
マルチアカウント
Mattermost はchannels.mattermost.accounts 配下で複数のアカウントをサポートしています:
トラブルシューティング
- チャネルで返信がない: ボットがチャネルに参加していることを確認し、メンションするか(oncall モード)、プレフィックスを使用するか(onchar モード)、または
chatmode: "onmessage"を設定してください。 - 認証エラー: ボットトークン、ベース URL、およびアカウントが有効になっているかを確認してください。
- マルチアカウントの問題: 環境変数は
defaultアカウントにのみ適用されます。 - ボタンが白い箱として表示される: エージェントが不正な形式のボタンデータを送信している可能性があります。各ボタンに
textとcallback_dataフィールドの両方が含まれているか確認してください。 - ボタンは表示されるがクリックしても何も起きない: Mattermost サーバー設定の
AllowedUntrustedInternalConnectionsに127.0.0.1 localhostが含まれているか、またServiceSettings.EnablePostActionIntegrationがtrueになっているかを確認してください。 - ボタンをクリックすると 404 が返る: ボタンの
idにハイフンやアンダースコアが含まれている可能性があります。Mattermost のアクションルーターは英数字以外の ID で動作しません。[a-zA-Z0-9]のみを使用してください。 - ゲートウェイログに
invalid _tokenと出る: HMAC が一致していません。すべてのコンテキストフィールドを署名しているか(一部ではない)、キーをソートしているか、コンパクトな JSON(スペースなし)を使用しているかを確認してください。上記の HMAC セクションを参照してください。 - ゲートウェイログに
missing _token in contextと出る: ボタンのコンテキストに_tokenフィールドが含まれていません。連携ペイロード構築時に必ず含めるようにしてください。 - 確認メッセージにボタン名ではなく生の ID が表示される:
context.action_idがボタンのidと一致していません。両方に同じサニタイズ後の値を設定してください。 - エージェントがボタンについて知らない: Mattermost チャネル構成に
capabilities: ["inlineButtons"]を追加してください。