インストール
- npm registry
- Local checkout
クイックセットアップ
プライベート/LAN/tailnetアドレス上のセルフホストMattermost: 送信されるMattermost APIリクエストは、デフォルトでプライベートIPと内部IPをブロックするSSRFガードを通過します。
channels.mattermost.network.dangerouslyAllowPrivateNetwork: trueでオプトインします(アカウントごと: channels.mattermost.accounts.<id>.network.dangerouslyAllowPrivateNetwork)。ネイティブスラッシュコマンド
ネイティブスラッシュコマンドはオプトインです。有効にすると、OpenClawはボットが所属するすべてのチームにoc_*スラッシュコマンドを登録し、Gateway HTTPサーバーでコールバックPOSTを受信します。
/oc_status、/oc_model、/oc_models、/oc_new、/oc_help、/oc_think、/oc_reasoning、/oc_verbose、/oc_queue。nativeSkills: trueの場合、Skillコマンドも/oc_<skill>として登録されます。
Behavior notes
Behavior notes
nativeとnativeSkillsのデフォルトは"auto"で、Mattermostでは無効に解決されます。明示的にtrueに設定してください。callbackPathのデフォルトは/api/channels/mattermost/commandです。callbackUrlを省略すると、OpenClawはhttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>を導出します。ワイルドカードのバインドホスト(0.0.0.0、::)はlocalhostにフォールバックします。- 複数アカウント構成では、
commandsをトップレベル、またはchannels.mattermost.accounts.<id>.commandsの下に設定できます(アカウント値はトップレベルのフィールドを上書きします)。 - 他の統合が作成した同じトリガーの既存スラッシュコマンドはそのまま残されます(登録時にスキップされます)。ボットが作成したコマンドは、コールバックURLがずれたときに更新または再作成されます。
- コマンドコールバックは、OpenClawが
oc_*コマンドを登録するときにMattermostから返されるコマンドごとのトークンで検証されます。 - OpenClawは各コールバックを受け入れる前に現在のMattermostコマンド登録を更新するため、削除または再生成されたスラッシュコマンドの古いトークンは、Gatewayを再起動しなくても受け入れられなくなります。
- Mattermost APIがコマンドがまだ現在有効であることを確認できない場合、コールバック検証はフェイルクローズします。失敗した検証は短時間キャッシュされ、同時ルックアップはまとめられ、新しいルックアップ開始はリプレイ圧を抑えるためコマンドごとにレート制限されます。
- 登録に失敗した場合、起動が部分的だった場合、またはコールバックトークンが解決されたコマンドの登録済みトークンと一致しない場合、スラッシュコールバックはフェイルクローズします(あるコマンドで有効なトークンが、別のコマンドの上流検証に到達することはできません)。
- 受け入れられたコールバックには、一時的な「処理中…」返信で応答します。実際の回答は通常のメッセージとして届きます。
Reachability requirement
Reachability requirement
コールバックエンドポイントはMattermostサーバーから到達可能である必要があります。
- MattermostがOpenClawと同じホスト/ネットワーク名前空間で実行されていない限り、
callbackUrlをlocalhostに設定しないでください。 - そのURLが
/api/channels/mattermost/commandをOpenClawへリバースプロキシしない限り、callbackUrlをMattermostのベースURLに設定しないでください。 - 簡単な確認は
curl https://<gateway-host>/api/channels/mattermost/commandです。GETは404ではなく、OpenClawから405 Method Not Allowedを返す必要があります。
Mattermost egress allowlist
Mattermost egress allowlist
コールバックの宛先がプライベート/tailnet/内部アドレスの場合は、Mattermostの
ServiceSettings.AllowedUntrustedInternalConnectionsにコールバックホスト/ドメインを含めるよう設定します。完全なURLではなく、ホスト/ドメインエントリを使用してください。- 良い例:
gateway.tailnet-name.ts.net - 悪い例:
https://gateway.tailnet-name.ts.net
環境変数(デフォルトアカウント)
env varsを使う場合は、Gatewayホストでこれらを設定します。MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
env varsはデフォルトアカウント(
default)にのみ適用されます。他のアカウントは設定値を使用する必要があります。MATTERMOST_URLはワークスペースの.envからは設定できません。ワークスペース.envファイルを参照してください。チャットモード
MattermostはDMに自動的に応答します。チャンネルの動作はchatmodeで制御されます。
- oncall (default)
- onmessage
- onchar
チャンネルでは@メンションされた場合にのみ応答します。
oncharは明示的な@メンションにも引き続き応答します。channels.mattermost.requireMentionも引き続き尊重されますが、chatmodeが優先されます。チャンネルごとのgroups.<channelId>.requireMention設定は両方より優先されます。- ボットがチャンネルスレッドで表示される返信を送信した後、その同じスレッド内の以降のメッセージには、新しい@メンションや
oncharプレフィックスなしで応答します。そのため、複数ターンのスレッド会話は継続して流れます。参加状態は、そのスレッドでボットが最後に返信してから7日間記憶され、Gatewayの再起動後も保持されます。ボットが観測しただけのスレッドには影響しません。明示的なメンションを再度必要にするには、新しいトップレベルメッセージを開始してください。
スレッドとセッション
channels.mattermost.replyToModeを使用して、チャンネルとグループへの返信をメインチャンネルに残すか、トリガーした投稿の下にスレッドを開始するかを制御します。
off(デフォルト): 受信投稿がすでにスレッド内にある場合にのみ、スレッド内で返信します。first: トップレベルのチャンネル/グループ投稿では、その投稿の下にスレッドを開始し、会話をスレッドスコープのセッションへルーティングします。allとbatched: 今日のMattermostではfirstと同じ動作です。Mattermostでいったんスレッドルートができると、後続のチャンクとメディアは同じスレッドで継続するためです。- ダイレクトメッセージはこの設定を無視し、非スレッドのままです。
アクセス制御(DM)
- デフォルト:
channels.mattermost.dmPolicy = "pairing"(未知の送信者にはペアリングコードが渡されます)。その他の値:allowlist、open、disabled。 - 承認方法:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- パブリックDM:
channels.mattermost.dmPolicy="open"に加えてchannels.mattermost.allowFrom=["*"](設定スキーマがワイルドカードを強制します)。 channels.mattermost.allowFromはユーザーID(推奨)とaccessGroup:<name>エントリを受け付けます。アクセスグループを参照してください。
チャンネル(グループ)
- デフォルト:
channels.mattermost.groupPolicy = "allowlist"(メンションゲート付き)。 channels.mattermost.groupAllowFromで送信者を許可リストに追加します(ユーザーID推奨)。channels.mattermost.groupAllowFromはaccessGroup:<name>エントリを受け付けます。アクセスグループを参照してください。- チャンネルごとのメンション上書きは、
channels.mattermost.groups.<channelId>.requireMention、またはデフォルト用のchannels.mattermost.groups["*"].requireMentionの下に置きます。 @usernameの照合は変更可能であり、channels.mattermost.dangerouslyAllowNameMatching: trueの場合にのみ有効になります。- オープンチャンネル:
channels.mattermost.groupPolicy="open"(メンションゲート付き)。 - 解決順序:
channels.mattermost.groupPolicy、次にchannels.defaults.groupPolicy、次に"allowlist"。 - ランタイム注:
channels.mattermostセクションが完全に存在しない場合、ランタイムはグループチェックに対してgroupPolicy="allowlist"へフェイルクローズし(channels.defaults.groupPolicyが設定されている場合でも)、1回限りの警告をログに記録します。
アウトバウンド配信のターゲット
openclaw message sendまたはcron/webhooksでは、これらのターゲット形式を使用します。
| ターゲット | 配信先 |
|---|---|
channel:<id> | IDによるチャンネル |
channel:<name>または#channel-name | 名前によるチャンネル。ボットが所属するチーム全体から検索されます |
user:<id>またはmattermost:<id> | そのユーザーとのDM |
@username | DM(ユーザー名はMattermost API経由で解決されます) |
DMチャンネルの再試行
OpenClawがMattermost DMターゲットへ送信し、先にダイレクトチャンネルを解決する必要がある場合、一時的なダイレクトチャンネル作成失敗をデフォルトで再試行します。 その動作をMattermost Plugin全体でグローバルに調整するにはchannels.mattermost.dmChannelRetryを使用し、1つのアカウントに対してはchannels.mattermost.accounts.<id>.dmChannelRetryを使用します。デフォルト:
- これはDMチャンネル作成(
/api/v4/channels/direct)にのみ適用され、すべてのMattermost API呼び出しには適用されません。 - 再試行はジッター付きの指数バックオフを使用し、レート制限、5xxレスポンス、ネットワークまたはタイムアウトエラーなどの一時的な失敗に適用されます。
429以外の4xxクライアントエラーは恒久的なものとして扱われ、再試行されません。
プレビューストリーミング
Mattermost は、思考、ツール活動、部分的な返信テキストを単一の下書きプレビュー投稿にストリーミングし、最終回答を安全に送信できる状態になるとその場で確定します。プレビューはチャンクごとのメッセージでチャンネルを埋めるのではなく、同じ投稿 ID 上で更新されます。メディアやエラーの最終送信では、保留中のプレビュー編集をキャンセルし、使い捨てのプレビュー投稿をフラッシュする代わりに通常の配信を使用します。 プレビューストリーミングはpartial モードでデフォルトでオンです。channels.mattermost.streaming(モード文字列、boolean、または { mode: "progress" } のようなオブジェクト)で設定します。
ストリーミングモード
ストリーミングモード
partial(デフォルト): 返信が伸びるにつれて編集され、最後に完全な回答で確定される 1 つのプレビュー投稿。blockは、プレビュー投稿内で追記形式の下書きチャンクを使用します。progressは生成中にステータスプレビューを表示し、完了時にのみ最終回答を投稿します。offはプレビューストリーミングを無効にします。
ストリーミング動作の注意事項
ストリーミング動作の注意事項
- ストリームをその場で確定できない場合(たとえば、投稿がストリーム中に削除された場合)、OpenClaw は新しい最終投稿の送信にフォールバックするため、返信が失われることはありません。
- 思考のみのペイロードは、
> Thinkingブロック引用として届くテキストも含め、チャンネル投稿から抑制されます。他のサーフェスで思考を見るには/reasoning onを設定します。Mattermost の最終投稿には回答のみが残ります。 - チャンネルマッピングのマトリクスについては、ストリーミングを参照してください。
リアクション(メッセージツール)
channel=mattermostとともにmessage action=reactを使用します。messageIdは Mattermost の投稿 ID です。emojiはthumbsupや:+1:のような名前を受け付けます(コロンは任意です)。- リアクションを削除するには
remove=true(boolean)を設定します。 - リアクションの追加/削除イベントは、メッセージと同じ DM/グループポリシーチェックの対象として、ルーティングされたエージェントセッションへシステムイベントとして転送されます。
channels.mattermost.actions.reactions: リアクションアクションを有効/無効にします(デフォルトは true)。- アカウントごとのオーバーライド:
channels.mattermost.accounts.<id>.actions.reactions。
インタラクティブボタン(メッセージツール)
クリック可能なボタン付きメッセージを送信します。ユーザーがボタンをクリックすると、エージェントは選択内容を受け取り、応答できます。 ボタンはセマンティックなpresentation ペイロード(通常のエージェント返信および message action=send 内)から生成されます。OpenClaw は value ボタンを Mattermost のインタラクティブボタンとしてレンダリングし、URL ボタンはメッセージ本文内に見える形で残し、選択メニューは読みやすいテキストにダウングレードします。
表示ラベル(エイリアス:
text)。クリック時に送り返される値で、アクション ID として使用されます(エイリアス:
callback_data, callbackData)。url が設定されていないクリック可能なボタンでは必須です。リンクボタン。インタラクティブボタンではなく、メッセージ本文内に
label: url テキストとしてレンダリングされます。ボタンスタイル。Mattermost はサポートしていない値にデフォルトのスタイルを適用します。
inlineButtons を追加します。
実装上の注意
実装上の注意
- ボタンコールバックは HMAC-SHA256 検証を使用します(自動で、設定は不要です)。
- クリック時には添付ブロック全体が置き換えられるため、すべてのボタンがまとめて削除されます。部分的な削除はできません。
- ハイフンまたはアンダースコアを含むアクション ID は自動的にサニタイズされます(Mattermost のルーティング制限)。
action_idが元の投稿上のアクションと一致しないクリックは、403(“Unknown action”)で拒否されます。
直接 API 連携(外部スクリプト)
外部スクリプトや Webhook は、エージェントのmessage ツールを経由せずに、Mattermost REST API を介してボタンを直接投稿できます。可能な場合は Plugin の buildButtonAttachments() を使用してください。生の JSON を投稿する場合は、以下のルールに従ってください。
ペイロード構造:
ボットトークンからシークレットを導出する
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) を hex エンコードします。よくある HMAC の落とし穴
よくある HMAC の落とし穴
- Python の
json.dumpsはデフォルトでスペースを追加します({"key": "val"})。JavaScript のコンパクトな出力({"key":"val"})に一致させるにはseparators=(",", ":")を使用します。 - 常に
_tokenを除くコンテキストフィールドすべてに署名してください。Gateway は_tokenを取り除いてから、残りすべてに署名します。一部だけに署名すると、検証が静かに失敗します。 sort_keys=Trueを使用してください。Gateway は署名前にキーをソートし、Mattermost はペイロード保存時にコンテキストフィールドを並べ替える場合があります。- ランダムバイトではなく、ボットトークンからシークレットを導出してください(決定的)。シークレットは、ボタンを作成するプロセスと検証する Gateway の間で同一でなければなりません。
ディレクトリアダプター
Mattermost Plugin には、Mattermost API を介してチャンネル名とユーザー名を解決するディレクトリアダプターが含まれています。これにより、openclaw message send と Cron/Webhook 配信で #channel-name および @username ターゲットを使用できます。
設定は不要です。アダプターはアカウント設定のボットトークンを使用します。
マルチアカウント
Mattermost はchannels.mattermost.accounts の下で複数のアカウントをサポートします。
channels.mattermost.defaultAccount は、指定がない場合に使用されるアカウントを選択します。
トラブルシューティング
チャンネルに返信がない
チャンネルに返信がない
ボットがチャンネル内にいることを確認し、メンションする(oncall)、トリガープレフィックスを使用する(onchar)、または
chatmode: "onmessage" を設定してください。認証またはマルチアカウントのエラー
認証またはマルチアカウントのエラー
- ボットトークン、ベース URL、アカウントが有効かどうかを確認してください。
- マルチアカウントの問題: 環境変数は
defaultアカウントにのみ適用されます。 - プライベート/LAN の Mattermost ホストには
network.dangerouslyAllowPrivateNetwork: trueが必要です(SSRF ガードはデフォルトでプライベート IP をブロックします)。
関連
- チャンネルルーティング - メッセージのセッションルーティング
- チャンネル概要 - サポートされているすべてのチャンネル
- グループ - グループチャットの動作とメンションゲート
- ペアリング - DM 認証とペアリングフロー
- セキュリティ - アクセスモデルとハードニング