2026年 OpenClaw Microsoft Teams を独占リモート Mac SSH ヘッドレスでデプロイ
デプロイ・運用 2026-05-19

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 が使えない場合)

  1. Azure Bot を作成:Type of App は Single Tenant(2025-07-31 以降の新規 Bot は Multi-Tenant 非推奨)。
  2. Configuration の Microsoft App ID → appId;App Registration → Certificates & secrets → New client secret → appPassword;Overview の Directory (tenant) ID → tenantId。
  3. Messaging endpoint:https://<your-domain>/api/messages(OpenClaw webhook と一致)。
  4. Channels → Microsoft Teams → Configure → Save(ToS 同意)。
  5. manifest 自作(personal/team/groupChat scopes、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)

  1. teams app doctor <teamsAppId> — Bot 登録、AAD、manifest、SSO。
  2. openclaw doctor — プラグイン、msteams キー、ゲートウェイ待受。
  3. ローカル:curl -sS -o /dev/null -w "%{http_code}" http://127.0.0.1:3978/api/messages(Bot 署名なしは 405/401 が多く、ポート待受の目安)。
  4. トンネル経由:curl -sS -o /dev/null -w "%{http_code}" https://<tunnel>/api/messages。
  5. Teams クライアントから DM → ログで msteams、activity。
  6. 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 マトリクスを長期ホストできる土台にしてください。

おすすめプラン

M4.S 人気商品

10-Core 16GB 256GB
$105.9
/月〜
今すぐ購入