2026年 OpenClaw Microsoft Teams プラグインを独占リモート Mac(SSH ヘッドレス)に載せる:teams.cli + Bot Webhook と Client Secret/フェデレーション認証の選び方——devtunnel 永続 URL、groupPolicy とパブリックトンネル再現可能デプロイメントマトリクス+FAQ
Microsoft Teams のインバウンドは Bot Framework HTTP Webhook(既定 3978、パス /api/messages)です。Slack Socket Mode の「外向き長期接続」とはモデルが異なります。2026 年以降 OpenClaw は msteams を同梱プラグインとして配布し、@microsoft/teams.cli で Entra アプリ・manifest・Messaging Endpoint を一括登録できます。本稿は Teams チャネルに限定し、独占リモート Mac(SSH ヘッドレス)で teams.cli vs Azure Portal、devtunnel 永続 URL vs ngrok/Tailscale Funnel、Client Secret vs フェデレーション証明書/マネージド ID の選定と、groupPolicy・replyStyle・受け入れコマンドを整理します。Slack/Telegram を並行運用する場合は
OpenClaw × Slack の Socket Mode と公開ゲートウェイ選定、パブリック入口の比較は
Tailscale Serve/Funnel と Cloudflare Tunnel の比較を参照してください。
1. 2026 Teams チャネル構成:同梱プラグインと Slack/Discord との違い
OpenClaw の Teams チャネルは Azure Bot + Bot Framework Adapter 上にあります。Microsoft 365 がアクティビティを Messaging Endpoint へ POST し、ゲートウェイがローカル webhook を待ち受けて非同期に返信します。Slack Socket Mode(アプリトークンで Slack へ外向き接続)と比べ、Teams 側は Bot 登録 URL がパブリック(または devtunnel 等の到達可能面)から届くことが必須で、各インバウンドは SDK で署名検証されます。
| 軸 | Microsoft Teams (msteams) | Slack Socket Mode(対照) |
|---|---|---|
| 接続方向 | Teams → あなたの HTTPS /api/messages |
ゲートウェイ → Slack WebSocket(外向き) |
| 既定ポート/パス | 3978 / /api/messages |
固定インバウンドポートなし |
| プラグイン形態(2026) | 同梱;旧ビルドは openclaw plugins install @openclaw/msteams |
コアチャネル(本稿対象外) |
| グループ既定 | groupPolicy: "allowlist"(未設定時はグループ無応答) |
Slack App と OpenClaw 設定に依存 |
2. 独占リモート Mac の事前確認:Node、3978、launchd、SSH 環境の一致
- Node:OpenClaw ゲートウェイと同一メジャー(SSH の
nvm useと launchd のEnvironmentVariablesを分けない)。経路選定は OpenClaw インストール経路:install.sh・npm・Docker Composeを参照。 - ポート:
3978が Gateway/msteams のみで使われていること。同機 Nginx/Caddy との競合は ゲートウェイ同機リバースプロキシ記事で整理。 - ユーザー:launchd Job の
UserNameと~/.openclaw/openclaw.json・証明書 PEM の所有者を一致。 - 環境変数:
MSTEAMS_APP_ID、MSTEAMS_APP_PASSWORD、MSTEAMS_TENANT_IDを plist のEnvironmentVariablesに書き、対話 SSH の.zshrcだけに置かない。 - ヘッドレス:GUI は不要。Teams アプリのインストールリンクはデスクトップクライアントで完了(管理者代行可)。
3. インストール経路マトリクス:同梱 vs 明示インストールとバージョン pin
| シナリオ | コマンド/操作 | 補足 |
|---|---|---|
| 公式パッケージビルド(既定) | channels.msteams を設定するだけ |
ゲートウェイ起動時にプラグイン読込 |
| Teams 欠落のカスタムビルド | openclaw plugins install @openclaw/msteams |
公式 tag に追従;再現性が必要なら厳密 pin |
| ローカル開発プラグイン | openclaw plugins install ./path/to/msteams |
内部 fork のみ |
アップグレード後チャネルが出ない場合は openclaw doctor でプラグイン一覧を確認。msteams とゲートウェイのメジャーを揃える。ヘッドレス Mac で launchctl bootstrap が PATH/権限で失敗する事例は、非ログイン shell に Node パスがない、同一 Label の二重 bootstrapが典型です。
4. teams.cli 高速経路:devtunnel、teams app create、openclaw.json
プレビュー CLI は Entra アプリ、Client Secret、manifest アップロード、Bot 登録を一括化します。PoC と SSH ヘッドレスでの初回開通に向きます。
npm install -g @microsoft/teams.cli@preview
teams login
teams status
# 一度だけ:永続 devtunnel(URL はセッション跨ぎで安定)
devtunnel create my-openclaw-bot --allow-anonymous
devtunnel port create my-openclaw-bot -p 3978 --protocol auto
# 開発/受け入れのたびに:
devtunnel host my-openclaw-bot
# メモ:https://<tunnel-id>.devtunnels.ms
teams app create \
--name "OpenClaw" \
--endpoint "https://<tunnel-id>.devtunnels.ms/api/messages"
openclaw plugins install @openclaw/msteams # 同梱が無い場合のみ
最小 openclaw.json 断片(環境変数でも可):
{
channels: {
msteams: {
enabled: true,
appId: "<CLIENT_ID>",
appPassword: "<CLIENT_SECRET>",
tenantId: "<TENANT_ID>",
webhook: { port: 3978, path: "/api/messages" },
groupPolicy: "allowlist",
groupAllowFrom: ["<AAD_OBJECT_ID>"],
requireMention: true,
replyStyle: "thread"
}
}
}
環境変数:MSTEAMS_APP_ID、MSTEAMS_APP_PASSWORD、MSTEAMS_TENANT_ID。2026.5.x 以降は Teams で streaming.mode による進捗表示(ゲートウェイ版のドキュメントに従う)。アプリ導入:teams app get <teamsAppId> --install-link。
5. Azure Portal 手動 Runbook(CLI が使えない場合)
- Azure Bot を作成:Type of App は Single Tenant(2025-07-31 以降の新規 Bot は Multi-Tenant 非推奨)。
- Configuration の Microsoft App ID →
appId;App Registration → Certificates & secrets → New client secret →appPassword;Overview の Directory (tenant) ID →tenantId。 - Messaging endpoint:
https://<your-domain>/api/messages(OpenClaw webhook と一致)。 - Channels → Microsoft Teams → Configure → Save(ToS 同意)。
- manifest 自作(
personal/team/groupChatscopes、RSC、supportsFiles: true)を zip でアップロードまたは sideload。
6. 並列選定:登録方式 × トンネル × 認証
6.1 teams.cli vs Azure Portal
| 軸 | teams.cli | Azure Portal 手動 |
|---|---|---|
| 向く用途 | PoC、SSH ヘッドレス初回、manifest 反復 | 既存 Azure ガバナンス、変更承認の監査 |
| RSC/manifest | CLI 生成・アップロード;teams app rsc add |
JSON を完全自控、セキュリティレビュー向き |
| 本番 federated | 作成後 Portal で証明書/MI に差し替え可 | 最初から証明書またはマネージド ID |
6.2 devtunnel vs ngrok vs Tailscale Funnel(3978)
| トンネル | URL 安定性 | 備考 |
|---|---|---|
| devtunnel | create 後 URL をセッション跨ぎで再利用 | --allow-anonymous;各リクエストは Bot SDK で検証 |
| ngrok | 無料枠はドメインが変わりやすい | ngrok http 3978;変更時は teams app update --endpoint |
| Tailscale Funnel | tailnet ポリシー依存 | tailscale funnel 3978;既存 tailnet 向き |
| 固定ドメイン + 逆プロキシ | 本番推奨 | Nginx/Caddy で TLS 終端 → loopback:3978 |
トンネル URL 変更時:
teams app update <teamsAppId> --endpoint "https://<new-host>/api/messages"
6.3 Client Secret vs フェデレーション証明書 vs Managed Identity
2026.4.11 以降 authType: "federated"(certificatePath または useManagedIdentity: true)をサポート。
| 方式 | 設定要点 | 独占 Mac |
|---|---|---|
| Client Secret | appPassword / MSTEAMS_APP_PASSWORD |
最速;SecretRef と期限ローテーション Runbook が必要 |
| 証明書 federated | authType: "federated" + certificatePath |
長期 Secret 禁止テナント向き;PEM は暗号化ボリュームへ |
| Managed Identity | useManagedIdentity: true |
物理 Mac mini は通常 Azure IMDS なし;AKS/VM 向き |
7. 意思決定マトリクス(Runbook に貼れる形)
| 制約 | 推奨組み合わせ |
|---|---|
| 固定パブリックドメインなし、DM 検証 | teams.cli + devtunnel + Client Secret + dmPolicy: pairing |
| 本番固定ドメイン + 長期 Secret 禁止 | Portal/CLI で App 作成 → federated 証明書へ → TLS 逆プロキシ → Secret 削除 |
| チャンネル @mention 当番 Bot | groupAllowFrom + RSC;Posts チャンネルは replyStyle: "thread" |
| チャンネル画像/履歴の取得 | Graph ChannelMessage.Read.All 等 + 管理者同意(テナント方針に従う) |
| iOS CI と同機で CPU 争奪 | ゲートウェイ並列制限;重 CI 時は Teams historyLimit を下げるかノード分離 |
8. アクセス制御と返信形態
- DM:既定
dmPolicy: "pairing";allowFromは AAD Object ID(表示 UPN に依存しない)。 - グループ:既定
groupPolicy: "allowlist"。groupAllowFrom未設定時はグループメッセージ無視——「@ したのに無反応」の第一原因。 - 開放テスト:
groupPolicy: "open"でも既定requireMention: true。 - replyStyle:Posts チャンネルは
thread、Threads(Slack 風)はtop-level;API は UI スタイルを露出しないためチャンネルごとに実測。
9. Graph と添付の境界
RSC のみの場合、チャンネル/グループ添付は webhook 上 HTML stub になりバイナリ取得不可。DM ファイルは Bot ファイル API。チャンネル画像や履歴取得には Entra で Graph Application 権限(例 ChannelMessage.Read.All)と管理者同意が必要。manifest 昇格後はTeams を完全終了して再起動しキャッシュを更新。SharePoint 一括ファイルは sharePointSiteId も要検討(テナント方針に従う)。
10. 運用事例
事例 A — 開発当番チャンネル:「Platform-OnCall」に App を導入し groupAllowFrom に on-call グループの AAD ID。CI 失敗は Webhook インバウンド
OpenClaw Webhooks × GitHub/GitLab CIで Agent を起動し、Teams で @mention スレッド要約;replyStyle: "thread" で串台防止。
事例 B — 人事/IT チケット DM:dmPolicy: pairing で初回 DM を承認。高リスク Exec は
Exec Approvals 無 UI 承認へ回し、結果を同一 Teams 会話へ返す。
11. SSH ヘッドレス受け入れチェックリスト(HowTo)
teams app doctor <teamsAppId>— Bot 登録、AAD、manifest、SSO。openclaw doctor— プラグイン、msteams キー、ゲートウェイ待受。- ローカル:
curl -sS -o /dev/null -w "%{http_code}" http://127.0.0.1:3978/api/messages(Bot 署名なしは 405/401 が多く、ポート待受の目安)。 - トンネル経由:
curl -sS -o /dev/null -w "%{http_code}" https://<tunnel>/api/messages。 - Teams クライアントから DM → ログで
msteams、activity。 - endpoint 変更後は Azure Bot Configuration と
teams app updateを同期。
12. FAQ
Q1:401/403 認証エラー?
A:Single Tenant の tenantId、Secret 期限、フェデレーション証明書の一致、launchd の MSTEAMS_* を確認。
Q2:Messaging Endpoint 502?
A:トンネル未 host、逆プロキシタイムアウト、ゲートウェイが 3978 を聴いていない。ローカル curl → パブリック URL の順。
Q3:devtunnel/ngrok URL が変わった?
A:teams app update <id> --endpoint "https://.../api/messages" と Azure Bot Configuration を更新。
Q4:グループ @mention 無反応?
A:groupPolicy と groupAllowFrom。既定 allowlist は未許可送信者を破棄。
Q5:replyStyle が串台/トップレベル投稿になる?
A:Posts は thread、Threads 風は top-level;team/channel ID で上書き。
Q6:Webhook タイムアウトで重複メッセージ?
A:Teams は遅い応答を再送。ゲートウェイは速く ACK し非同期返信。極遅 LLM では冪等キーとレート制限。
Q7:チャンネル画像が HTML stub のみ?
A:Graph 権限で hosted content を取得。RSC のみではバイナリ不可。
Q8:RSC 更新が効かない?
A:manifest 昇格、管理センターで再インストール、Teams プロセス完全終了後に再起動。
Q9:SSH では動くが launchd だけ失敗?
A:plist に PATH、HOME、MSTEAMS_*。同一 Label の二重 bootstrap を避ける。
Q10:プラグインとゲートウェイのバージョン不一致?
A:openclaw plugins list でメジャー整合。同梱時はゲートウェイ優先でアップグレード。
Q11:Quick Start の msteams install 失敗?
A:ネットワーク/npm registry/Node 版。既に同梱なら再 install 不要。
Q12:長期 Client Secret 禁止のコンプライアンス?
A:authType: "federated" + 証明書。Entra で旧 Secret を削除し監査。
独占リモート Mac で Teams Bot を載せるなら Mac mini が向く理由
Teams Bot は低トラフィック・長期 HTTP・低ジッタ負荷です。3978 の安定待受、予測可能な launchd 再起動、iOS CI(xcodebuild)との CPU 分離が要点です。macOS のネイティブ Unix、OpenSSH、Gatekeeper/SIP/FileVault は無人ノードの攻撃面を抑えやすく、Mac mini M4 の待機電力はおおむね 4W 級で、ゲートウェイ + Teams プラグインを 7×24 で載せてもコンパイルピークと電力を分けやすいです。
独占リモート Mac 上で OpenClaw Agent と Xcode CI を同居させるなら、Teams インバウンドを静かで監査可能・低消費電力の Mac mini M4 に固定するのが、Webhook 安定性とビルド突発のメモリ帯域を両立しやすい選択です。今すぐ手に入れ、本稿の teams.cli・devtunnel・groupPolicy マトリクスを長期ホストできる土台にしてください。