OpenClaw

OpenClaw Microsoft Teams チャンネル

エンタープライズ
普通

Azure Bot Resource を介した Bot Framework を使用して、OpenClaw を Microsoft Teams に接続します。このプラグインベースの統合により、AIアシスタントを Teams 上で運用でき、個人DM、グループチャット、チャンネル会話を処理できます。OpenClaw は Bot Framework から /api/messages への Webhook イベントを受信し、Teams メッセージング API を通じて応答します。スレッド返信、Adaptive Cards、リアクション、SharePoint を介したファイル共有、チームごと・チャンネルごとの設定オーバーライドに対応しています。

基本情報
難易度普通
カテゴリエンタープライズ
対応機能数5 / 6

Microsoft Teams 対応機能

テキストメッセージ

対応

メディア・ファイル

対応

リアクション

対応

スレッド

対応

音声メッセージ

非対応

グループチャット

対応

Microsoft Teams 前提条件

  • Azure Bot リソースを作成する権限を持つ Azure アカウント
  • App ID、App Password(クライアントシークレット)、Tenant ID が登録された Azure Bot(シングルテナント推奨)
  • ボット設定、スコープ、アイコン(outline.png 32×32、color.png 192×192)を含む Teams App Manifest(manifest.json)
  • パブリック HTTPS URL またはトンネル経由でアクセス可能な OpenClaw Gateway(デフォルト Webhook ポート 3978)
  • Teams プラグインのインストール: openclaw plugins install @openclaw/msteams

Microsoft Teams クイックセットアップ

1

Azure Bot リソースを作成

Azure Portal → リソースの作成 → 'Azure Bot' を検索します。Single Tenant タイプで作成します。App Registration でクライアントシークレットを生成します。App ID、クライアントシークレット、Tenant ID をコピーします — OpenClaw の設定に3つとも必要です。

2

Teams プラグインのインストールと設定

'openclaw plugins install @openclaw/msteams' を実行してプラグインをインストールします。openclaw.json に appId、appPassword、tenantId を含む Teams チャンネル設定を追加します。環境変数 MSTEAMS_APP_ID、MSTEAMS_APP_PASSWORD、MSTEAMS_TENANT_ID も使用できます。

3

メッセージングエンドポイントの設定と Teams チャンネルの有効化

Azure Portal でボットリソース → 構成に移動します。メッセージングエンドポイントを 'https://<your-domain>/api/messages' に設定します。次にチャンネル → Microsoft Teams の追加 → 構成に進みます。ローカル開発では、トンネル(ngrok または Tailscale Funnel)を使用してポート 3978 を公開します。

4

Teams アプリの作成とインストール

ボットの App ID を botId として、スコープ(personal、team、groupChat)および RSC 権限を含む manifest.json を作成します。outline.png と color.png と一緒に ZIP 圧縮します。Teams Developer Portal または Teams Admin Center からアップロードします。テスト用にはアプリパッケージをサイドロードします。

5

ボットのテスト

Teams でボットを見つけてダイレクトメッセージを送信します。デフォルトのペアリングポリシーを使用している場合、ターミナルで 'openclaw pairing approve msteams <code>' を実行して送信者を承認します。ボットがAI生成の返信で応答するはずです。

Microsoft Teams 設定例

config.json
{
  "channels": {
    "msteams": {
      "enabled": true,
      "appId": "YOUR_APP_ID",
      "appPassword": "YOUR_APP_PASSWORD",
      "tenantId": "YOUR_TENANT_ID",
      "webhook": {
        "port": 3978,
        "path": "/api/messages"
      }
    }
  }
}

Microsoft Teams 詳細ドキュメント

アーキテクチャ概要

OpenClaw は Azure Bot Framework を介して Microsoft Teams と統合します。これは Webhook ベースのアーキテクチャで、Teams がメッセージを Gateway の /api/messages エンドポイントにルーティングし、OpenClaw が Bot Framework REST API を通じて返信します。 フローは次の通りです: ユーザーが Teams でメッセージを送信 → Bot Framework Service → Gateway への Webhook POST(ポート 3978) → OpenClaw が AI で処理 → Bot Framework API 経由で返信 → Teams が応答を配信。 Teams プラグインは 'openclaw plugins install @openclaw/msteams' で個別にインストールします。このモジュラーアプローチにより、コアの Gateway を軽量に保ちながら、Teams 固有の機能(Adaptive Cards、SharePoint ファイルアップロード、RSC 権限)を独立してメンテナンスできます。 認証には Azure AD を使用します: Bot Framework は受信 Webhook リクエストの JWT トークンを検証し、OpenClaw は App ID と App Password を使用して送信 API コールを認証します。セキュリティのためシングルテナント構成が推奨されており、ボットを組織の Azure AD ディレクトリに制限します。
Gateway はパブリック HTTPS URL 経由でアクセス可能である必要があります。ローカル開発では、ngrok または Tailscale Funnel を使用してポート 3978 にトンネルします。
組織のセキュリティのため、マルチテナントよりシングルテナントボットを推奨します — Azure AD ディレクトリからのトークンのみを受け入れます。

Azure Bot セットアップとアプリ登録

Teams ボットのセットアップには、Azure Portal でのリソース作成が必要です: 1. Azure Bot リソースの作成 — マーケットプレイスで 'Azure Bot' を検索します。ボットタイプとして Single Tenant を選択します。これにより Bot リソースと App Registration の両方が作成されます。 2. クライアントシークレットの生成 — App Registrations → ボットアプリ → 証明書とシークレットで、新しいクライアントシークレットを作成します。値をすぐにコピーしてください(一度しか表示されません)。 3. 資格情報の記録 — 概要ページの App (client) ID、クライアントシークレットの値、Directory (tenant) ID。これら3つの値がボットの認証資格情報です。 4. メッセージングエンドポイントの設定 — Bot リソース → 構成で、エンドポイントを 'https://<your-domain>/api/messages' に設定します。ここに Teams が Webhook イベントを送信します。 5. Teams チャンネルの有効化 — チャンネル → チャンネルの追加 → Microsoft Teams に移動します。構成して保存します。 設定ファイルの値の代わりに環境変数を使用できます: MSTEAMS_APP_ID、MSTEAMS_APP_PASSWORD、MSTEAMS_TENANT_ID。
openclaw.json
{
  "channels": {
    "msteams": {
      "appId": "<APP_ID>",
      "appPassword": "<APP_PASSWORD>",
      "tenantId": "<TENANT_ID>"
    }
  }
}
App Password は安全に保管してください。バージョン管理にコミットしないでください。本番デプロイでは環境変数(MSTEAMS_APP_PASSWORD)を使用してください。Azure Portal でクライアントシークレットを定期的にローテーションしてください。

Teams App Manifest と RSC 権限

Teams App Manifest(manifest.json)は、ボットの ID、スコープ、権限を定義します。2つのアイコンと一緒に .zip ファイルにパッケージしてインストールします。 Manifest の必須項目: • botId — Azure Bot の App ID • スコープ — personal(DM)、team(チャンネル)、groupChat(グループ会話) • supportsFiles: true — 個人チャットでファイル同意カードを有効化 • Resource-Specific Consent(RSC)権限 — @メンションなしでメッセージを受信可能にする チャンネル用 RSC 権限(team スコープ): • ChannelMessage.Read.Group — @メンションなしでチャンネルメッセージを受信 • ChannelMessage.Send.Group — チャンネルにメッセージを送信 • TeamMember.Read.Group、TeamSettings.Read.Group — チームメタデータの読み取り グループチャット用 RSC 権限: • ChatMessage.Read.Chat — @メンションなしでグループチャットメッセージを受信 必要なアイコン: • outline.png — 32×32ピクセル、透明背景 • color.png — 192×192ピクセル、フルカラーアプリアイコン manifest.json と両方のアイコンを一緒に ZIP 圧縮し、Teams Developer Portal、Teams Admin Center からアップロード、またはテスト用にサイドロードします。
インストール済みアプリを更新する場合(RSC 権限の追加など)、manifest.json の version フィールドをインクリメントし、再 ZIP、再アップロードして、各チームに再インストールしてください。
アプリのインストールまたは更新後、新しい権限を有効にするために Teams クライアントを完全に終了して再起動してください。

DM ポリシー

DM(ダイレクトメッセージ)ポリシーは、個人チャットでボットと対話できるユーザーを制御します。OpenClaw は4つのポリシーをサポートしています: • pairing(デフォルト)— ボットにメッセージを送信した新規ユーザーにランダムなペアリングコードが発行されます。ターミナルで 'openclaw pairing approve msteams <code>' を実行して承認します。承認後は自由にチャットできます。 • allowlist — allowFrom にリストされたユーザーのみがボットにメッセージを送信できます。AAD オブジェクト ID、UPN(user@org.com)、または表示名をサポートしています。 • open — テナント内のすべての Teams ユーザーがボットにメッセージを送信できます。安全確認として allowFrom に '*' を追加する必要があります。 • disabled — DM 機能を完全にオフにします。 Teams はユーザーを AAD(Azure AD)オブジェクト ID、UPN、または表示名で識別します。ユーザーがメッセージを送信した際の Gateway ログで確認するか、Azure Portal の Azure Active Directory → ユーザーで検索できます。
openclaw.json
{
  "channels": {
    "msteams": {
      "dmPolicy": "allowlist",
      "allowFrom": [
        "user@org.com",
        "40a1a0ed-4ff2-4164-a219-55518990c197"
      ]
    }
  }
}
UPN 形式(user@org.com)は通常、許可リストに最も便利です。AAD オブジェクト ID はユーザーがメールアドレスを変更する可能性がある場合により安定しています。
'openclaw pairing list msteams' を使用して、保留中のすべてのペアリングリクエストとそのコードを確認できます。

グループチャットとチャンネル管理

OpenClaw は Teams チャンネル(チーム内)とグループチャットの両方をサポートし、それぞれにアクセス制御を設定できます: • disabled(グループのデフォルト)— すべてのグループ/チャンネルメッセージを無視 • allowlist — 承認された送信者(groupAllowFrom 経由)のみがボットをトリガーできる • open — すべてのグループメンバーまたはチャンネル参加者からのメッセージに応答 デフォルトでは、チャンネルとグループチャットでボットは @メンションを必要とします(requireMention: true)。requireMention を false に設定するとすべてのメッセージに応答するようになります。または RSC 権限を設定して @メンションなしでメッセージを受信できます。 Teams チャンネルとグループチャットは個別の会話コンテキストを維持します。各会話には独自のセッションと履歴があり、DM や他の会話とは分離されています。 チームごと・チャンネルごとのオーバーライドにより、きめ細かな制御が可能です。各チームや、チーム内の個々のチャンネルに異なる replyStyle、requireMention、ツール設定を指定できます。
openclaw.json
{
  "channels": {
    "msteams": {
      "groupPolicy": "allowlist",
      "groupAllowFrom": ["user@org.com"],
      "teams": {
        "My Team": {
          "channels": {
            "General": {
              "requireMention": true
            }
          }
        }
      }
    }
  }
}
teams 設定のキーには、チームとチャンネルの表示名または会話 ID(19:...@thread.tacv2)を使用できます。
チャンネルごとのオーバーライドは親チーム設定を継承し、チーム設定はグローバル msteams 設定を継承します。

返信スタイルとスレッド

Teams はチャンネルに2つの異なる UI レイアウトを提供しており、OpenClaw の返信動作はそれに合わせる必要があります: • Posts(クラシックレイアウト)— ルートメッセージの下にスレッド返信を使用します。replyStyle を 'thread'(デフォルト)に設定します。ボットの応答は元のメッセージカードへの返信として表示されます。 • Threads(Slack ライクレイアウト)— リニアなメッセージフローを使用します。replyStyle を 'top-level' に設定します。ボットはスレッドの代わりに新しいトップレベルメッセージを送信します。 Teams API はチャンネルがどのレイアウトを使用しているかを公開しないため、replyStyle を手動で設定する必要があります。設定が一致しなくてもエラーにはなりませんが、会話フローが最適でなくなる場合があります。 返信スタイルはグローバル、チームごと、チャンネルごとに設定できます。これにより、同じ Teams 組織内の異なるチャンネルで異なるレイアウトに対応できます。
openclaw.json
{
  "channels": {
    "msteams": {
      "replyStyle": "thread",
      "teams": {
        "19:abc...@thread.tacv2": {
          "channels": {
            "19:xyz...@thread.tacv2": {
              "replyStyle": "top-level"
            }
          }
        }
      }
    }
  }
}

ファイル処理と SharePoint

OpenClaw は Teams でのファイル共有をサポートしており、チャットタイプによって動作が異なります: 個人チャット: • 組み込みの FileConsentCard フロー — 追加設定不要。ボットがファイル同意カードを送信し、ユーザーが承認すると、ファイルがアップロードされます。 グループチャットとチャンネル: • Microsoft Graph 権限が必要: Sites.ReadWrite.All • オプション: Chat.Read.All でユーザーごとの共有リンク(チャットメンバーのみにアクセスを制限) • sharePointSiteId を設定してファイルアップロード先の SharePoint サイトを指定 • ファイルは SharePoint ドキュメントライブラリの /OpenClawShared/ フォルダに保存されます Chat.Read.All がない場合、共有ファイルリンクは組織全体にアクセス可能になります。Chat.Read.All がある場合、共有は現在のチャットメンバーに制限されます。 受信添付ファイルは Gateway により自動的にダウンロードされ処理されます。mediaAllowHosts と mediaAuthAllowHosts の設定で、添付ファイルのダウンロードで信頼するドメインを制御します。
openclaw.json
{
  "channels": {
    "msteams": {
      "sharePointSiteId": "YOUR_SHAREPOINT_SITE_ID",
      "mediaAllowHosts": ["*.microsoft.com", "*.sharepoint.com"],
      "mediaAuthAllowHosts": ["graph.microsoft.com"]
    }
  }
}
Graph API 権限(Sites.ReadWrite.All、Chat.Read.All)には Azure AD テナントでの管理者の同意が必要です。IT 管理者と協力してこれらの権限を付与してください。

Adaptive Cards とアンケート

Microsoft Teams は Adaptive Cards をサポートしています — プレーンテキストを超えたリッチでインタラクティブなカードベースのレイアウトです。OpenClaw はこれを利用してボットのインタラクションを強化します: アンケート: • 'openclaw message poll --channel msteams --target conversation:<id>' でアンケートを作成 • 投票は Adaptive Cards アクションを通じて収集され、~/.openclaw/msteams-polls.json にローカル保存されます • 投票を収集するには Gateway がオンラインである必要があります カスタム Adaptive Cards: • CLI で任意の Adaptive Cards を送信: openclaw message send --channel msteams --target "conversation:<id>" --card '{...}' • カードは Adaptive Card スキーマバージョン 1.5 をサポート • テキストブロック、画像、アクションボタン、入力フィールドなどを含めることができます フォーマットに関する注意: • 通常のメッセージでは基本的な Markdown(太字、斜体、コード、リンク)をサポート • 複雑なテーブルや深くネストされたリストは正しくレンダリングされない場合があります • リッチレイアウトには Markdown の代わりに Adaptive Cards を使用してください
Adaptive Cards Designer(adaptivecards.io/designer)を使用して、カスタムカードレイアウトを送信前にビルド・プレビューできます。
Adaptive Cards アクションは、OpenClaw がユーザー入力として処理する postback イベントをトリガーできます。

Teams ID の抽出

Teams の URL には複数の ID が含まれていますが、設定に必要なものとは限りません。正しい ID の抽出方法は以下の通りです: Team ID — URL パスに含まれています(groupId クエリパラメータではありません): https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/... → '19%3ABk4j...%40thread.tacv2' を URL デコードして Team ID を取得 Channel ID — 同じく URL パスに含まれています: https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/... → URL デコードしてチャンネル会話 ID を取得 CLI コマンドのユーザーターゲット: • AAD ID: user:40a1a0ed-4ff2-4164-a219-55518990c197 • 表示名: user:John Smith • 会話: conversation:19:abc...@thread.tacv2 • 生の形式(@thread を含む場合): 19:abc...@thread.tacv2
Teams URL の 'groupId' クエリパラメータを使用しないでください — これは Microsoft 365 Group ID であり、Teams の会話 ID ではありません。常に URL パスから ID を抽出し、URL デコードしてください。

Microsoft Teams 設定リファレンス

enabled
Type: booleanDefault: true

Microsoft Teams チャンネルの有効/無効を切り替え

appId
Type: stringDefault: ""

Azure Bot App ID(Microsoft App ID)。環境変数 MSTEAMS_APP_ID も使用可能

appPassword
Type: stringDefault: ""

Azure Bot クライアントシークレット。環境変数 MSTEAMS_APP_PASSWORD も使用可能

tenantId
Type: stringDefault: ""

シングルテナント認証用の Azure AD Tenant ID。環境変数 MSTEAMS_TENANT_ID も使用可能

webhook.port
Type: numberDefault: 3978

Bot Framework イベントを受信する Webhook リスナーのポート

webhook.path
Type: stringDefault: "/api/messages"

受信 Bot Framework メッセージ用の Webhook エンドポイントパス

dmPolicy
Type: stringDefault: "pairing"

ボットへの DM を制御。オプション: pairing、allowlist、open、disabled

allowFrom
Type: string[]Default: []

ボットへの DM が許可される AAD オブジェクト ID、UPN、または表示名(dmPolicy が allowlist の場合)

groupPolicy
Type: stringDefault: "allowlist"

グループ/チャンネルのアクセス制御。オプション: allowlist、open、disabled

groupAllowFrom
Type: string[]Default: []

グループチャットで許可される送信者。未設定の場合は allowFrom にフォールバック

teams
Type: objectDefault: {}

チームごと・チャンネルごとの設定オーバーライド(replyStyle、requireMention、tools)

requireMention
Type: booleanDefault: true

チャンネルとグループチャットで @メンションを必須にする。RSC 権限ですべてのメッセージに応答するには false に設定

replyStyle
Type: stringDefault: "thread"

返信レイアウトスタイル。オプション: thread(クラシック Posts)、top-level(Slack ライク Threads)

configWrites
Type: booleanDefault: true

/config set|unset コマンドによるチャンネル設定のランタイム変更を許可

textChunkLimit
Type: numberDefault:

チャンク分割前の送信メッセージあたりの最大文字数

chunkMode
Type: stringDefault: "length"

テキストチャンク分割方式。オプション: length(固定分割)、newline(段落認識型)

sharePointSiteId
Type: stringDefault: ""

グループチャット/チャンネルファイルアップロード用の SharePoint サイト ID

mediaAllowHosts
Type: string[]Default: MS/Teams domains

メディア添付ファイルのダウンロードを許可するホスト

mediaAuthAllowHosts
Type: string[]Default: Graph + Bot Framework

メディアダウンロード時に Authorization ヘッダーを送信するホスト

dmHistoryLimit
Type: numberDefault: 50

会話ごとに AI コンテキストとして含める最近の DM メッセージ数

historyLimit
Type: numberDefault: 50

AI コンテキストとして含めるチャンネル/グループメッセージの最大数

Microsoft Teams よくある質問

Microsoft Teams トラブルシューティング

チャンネルメッセージで画像や添付ファイルが表示されない

Graph API 権限が付与されていないか、管理者の同意が不足しています。ボットは実際のファイルではなくコンテンツのスタブを受信します。

アプリ登録に管理者の同意付きの ChannelMessage.Read.All および Chat.Read.All Graph 権限があることを確認してください。権限更新後に Teams アプリを再インストールしてください。キャッシュされた権限を更新するため、Teams クライアントを完全に終了して再起動してください。
ボットがチャンネルで応答しない(DM でのみ動作する)

チャンネルとグループチャットではデフォルトでボットに @メンションが必要か、RSC 権限が設定されていません。

チャンネルメッセージでボットを @メンションするか、設定で requireMention: false を設定し、アプリマニフェストに RSC 権限 ChannelMessage.Read.Group を追加してください。マニフェスト更新後、各チームでアプリを再インストールしてください。
変更後に Teams アプリマニフェストが更新されない

Teams はアプリメタデータを積極的にキャッシュします。古いマニフェストがまだ使用されています。

manifest.json の version フィールドをインクリメントし(例: 1.0.0 → 1.1.0)、パッケージを再 ZIP し、Teams から古いアプリを削除し、更新されたパッケージを再インストールし、Teams クライアントを完全に終了して再起動してください。
Webhook エンドポイントで 401 Unauthorized エラー

OpenClaw 設定の appId、appPassword、または tenantId が Azure Bot 登録と一致していないか、適切な Azure JWT トークンなしで手動テストしています。

3つの資格情報すべてが Azure Portal の値と正確に一致していることを確認してください。Teams 固有の問題をトラブルシューティングする前に、Azure の組み込み Web Chat(Bot リソース → Web Chat でテスト)を使用してボットが動作することを確認してください。tenantId がボットを登録したディレクトリと一致していることを確認してください。
プライベートチャンネルでボットが動作しない

Microsoft Teams は過去にプライベートチャンネルでのボットサポートに制限がありました。2026年初頭から、Microsoft はプライベートチャンネルの完全なアプリサポートを展開していますが、すべてのテナントでまだ利用できない場合があります。

テナントがプライベートチャンネルのアプリサポートアップデートを受けているか確認してください。まだ利用できない場合は、標準(パブリック)チャンネル、グループチャット、または DM を使用してください。アプリは各プライベートチャンネルに個別に追加する必要があります。チームレベルでのインストールはプライベートチャンネルには自動的に適用されません。