Microsoft Teams で OpenClaw を使うための設定ガイド
プラグインが必要です
Section titled “プラグインが必要です”Microsoft Teamsはプラグインとして提供されており、コア・インストールには含まれていません。
重要な変更 (2026.1.15): Microsoft Teamsはコアから分離されました。この機能を利用する場合は、プラグインを個別にインストールする必要があります。
この変更により、コア・インストールを軽量に保ちつつ、Microsoft Teamsの依存関係を独立して更新できるようになりました。
CLI(npmレジストリ)経由でインストールする場合:
openclaw plugins install @openclaw/msteamsローカル・チェックアウト(gitリポジトリから実行している場合):
openclaw plugins install ./path/to/local/msteams-pluginセットアップ中にTeamsを選択し、gitチェックアウトが検出された場合、OpenClawは自動的にローカルのインストールパスを提案します。
詳細はこちら:Plugins
クイックセットアップ(初心者向け)
Section titled “クイックセットアップ(初心者向け)”- Microsoft Teamsプラグインをインストールします。
- Azure Botを作成します(App ID、client secret、tenant IDを取得してください)。
- 取得した認証情報を使用してOpenClawを設定します。
- パブリックURLまたはトンネルを使用して、
/api/messages(デフォルトのポートは3978)を公開します。 - Teamsアプリパッケージをインストールし、Gatewayを起動します。
最小限の構成例:
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", appPassword: "<APP_PASSWORD>", tenantId: "<TENANT_ID>", webhook: { port: 3978, path: "/api/messages" }, }, },}注意:グループチャットはデフォルトでブロックされています(channels.msteams.groupPolicy: "allowlist")。グループ内での返信を許可するには、channels.msteams.groupAllowFromを設定するか、groupPolicy: "open"を使用して(メンションによる制限はありますが)すべてのメンバーを許可するように設定してください。
- TeamsのDM、グループチャット、またはチャネルを通じてOpenClawと対話でき、返信が常にメッセージの送信元チャネルに正しく戻る決定的なルーティングを維持します。
- 特に設定を変更しない限りメンションを必須とする、安全なチャネル動作をデフォルトにします。
設定の書き込み
Section titled “設定の書き込み”デフォルトでは、Microsoft Teamsは/config set|unsetコマンドによる設定の更新を書き込むことが許可されています(これにはcommands.config: trueの設定が必要です)。
この機能を無効にするには、以下のように設定してください:
{ channels: { msteams: { configWrites: false } },}アクセス制御(DMとグループ)
Section titled “アクセス制御(DMとグループ)”DM(ダイレクトメッセージ)のアクセス
- デフォルト設定:
channels.msteams.dmPolicy = "pairing"。承認されるまで、不明な送信者からのメッセージは無視されます。 channels.msteams.allowFromには、安定した AAD object ID を使用してください。- UPNや表示名は変更される可能性があるため、名前による直接マッチングはデフォルトで無効になっています。有効にするには
channels.msteams.dangerouslyAllowNameMatching: trueを設定してください。 - 適切な資格情報がある場合、ウィザードを使用して Microsoft Graph 経由で名前を ID に解決できます。
グループのアクセス
- デフォルト設定:
channels.msteams.groupPolicy = "allowlist"(groupAllowFromに追加しない限りブロックされます)。未設定時のデフォルトを上書きするにはchannels.defaults.groupPolicyを使用します。 channels.msteams.groupAllowFromで、グループチャットやチャネルで動作をトリガーできる送信者を制御します(設定がない場合はchannels.msteams.allowFromが使用されます)。- すべてのメンバーを許可するには
groupPolicy: "open"に設定します(デフォルトではメンションが必要です)。 - チャネルを一切許可しない場合は、
channels.msteams.groupPolicy: "disabled"に設定してください。
例:
{ channels: { msteams: { groupPolicy: "allowlist", groupAllowFrom: ["user@org.com"], }, },}Teamsとチャネルの許可リスト
channels.msteams.teamsの下にチームとチャネルをリストすることで、グループやチャネルでの返信範囲を制限できます。- キーには、安定したチーム ID とチャネルの会話 ID を使用してください。
groupPolicy="allowlist"かつチームの許可リストがある場合、リストされたチームやチャネルのみが受け入れられます(メンションが必要です)。- 設定ウィザードで「Team/Channel」のエントリを入力すると、自動的に保存されます。
- 起動時、OpenClaw はチーム/チャネルやユーザーの許可リストの名前を ID に解決し(Graph 権限がある場合)、そのマッピングをログに出力します。解決できない名前は入力されたまま保持されますが、
channels.msteams.dangerouslyAllowNameMatching: trueが有効でない限り、ルーティングでは無視されます。
例:
{ channels: { msteams: { groupPolicy: "allowlist", teams: { "My Team": { channels: { General: { requireMention: true }, }, }, }, }, },}動作の仕組み
Section titled “動作の仕組み”- Microsoft Teams プラグインをインストールします。
- Azure Bot を作成します(App ID、secret、tenant ID)。
- ボットを参照し、後述の RSC 権限を含む Teams app package を作成します。
- Teams アプリをチーム(または DM 用の個人スコープ)にアップロード・インストールします。
~/.openclaw/openclaw.json(または環境変数)でmsteamsを設定し、Gateway を起動します。- Gateway はデフォルトで
/api/messagesへの Bot Framework webhook トラフィックをリッスンします。
Azure Bot のセットアップ(事前準備)
Section titled “Azure Bot のセットアップ(事前準備)”OpenClaw を設定する前に、Azure Bot リソースを作成する必要があります。
ステップ 1: Azure Bot の作成
Section titled “ステップ 1: Azure Bot の作成”-
Azure Bot の作成 に移動します。
-
基本タブを入力します:
項目 値 ボット ハンドル ボットの名前。例: openclaw-msteams(一意である必要があります)サブスクリプション 使用する Azure サブスクリプションを選択 リソース グループ 新規作成または既存のものを選択 価格レベル 開発・テスト用には Free を選択 アプリの種類 シングル テナント(推奨 - 下記の注意を参照) 作成の種類 Microsoft アプリ ID の新規作成
廃止予定の通知: 2025年7月31日以降、新しいマルチテナントボットの作成は非推奨となりました。新しいボットには シングル テナント を使用してください。
- 確認と作成 → 作成 をクリックします(1〜2分ほど待ちます)。
ステップ 2: 認証情報の取得
Section titled “ステップ 2: 認証情報の取得”- 作成した Azure Bot リソース → 構成 に移動します。
- Microsoft アプリ ID をコピーします。これが
appIdになります。 - パスワードの管理 をクリックし、アプリの登録画面へ移動します。
- 証明書とシークレット → 新しいクライアント シークレット → 値 をコピーします。これが
appPasswordになります。 - 概要 に移動し、ディレクトリ (テナント) ID をコピーします。これが
tenantIdになります。
ステップ 3: メッセージング エンドポイントの設定
Section titled “ステップ 3: メッセージング エンドポイントの設定”- Azure Bot → 構成 に移動します。
- メッセージング エンドポイント を webhook の URL に設定します:
- 本番環境:
https://your-domain.com/api/messages - ローカル開発: トンネルを使用します(下記のローカル開発を参照)。
- 本番環境:
ステップ 4: Teams チャネルの有効化
Section titled “ステップ 4: Teams チャネルの有効化”- Azure Bot → チャネル に移動します。
- Microsoft Teams をクリック → 構成 → 保存。
- 利用規約に同意します。
ローカル開発(トンネリング)
Section titled “ローカル開発(トンネリング)”Teams は localhost に直接アクセスできません。ローカル開発にはトンネルを使用してください。
オプション A: ngrok
ngrok http 3978# Copy the https URL, e.g., https://abc123.ngrok.io# Set messaging endpoint to: https://abc123.ngrok.io/api/messagesオプション B: Tailscale Funnel
tailscale funnel 3978# Use your Tailscale funnel URL as the messaging endpointTeams Developer Portal(代替案)
Section titled “Teams Developer Portal(代替案)”マニフェストの ZIP ファイルを手動で作る代わりに、Teams Developer Portal を使う方法もあります。JSON を直接編集するよりも簡単なので、こちらの手順がおすすめです。
- + New app をクリックします。
- 基本情報(名前、説明、開発者情報)を入力します。
- App features → Bot に進みます。
- Enter a bot ID manually を選択し、Azure Bot の App ID を貼り付けます。
- スコープを確認します:Personal、Team、Group Chat。
- Distribute → Download app package をクリックします。
- Teams 側で:Apps → Manage your apps → Upload a custom app を開き、ダウンロードした ZIP を選択します。
Bot のテスト
Section titled “Bot のテスト”オプション A:Azure Web Chat(まず Webhook を確認)
- Azure Portal で対象の Azure Bot リソースを開き、Test in Web Chat を選択します。
- メッセージを送信して、レスポンスが返ってくるか確認します。
- これにより、Teams 側の設定を行う前に Webhook エンドポイントが正しく動作していることを確認できます。
オプション B:Teams(アプリのインストール後)
- Teams アプリをインストールします(サイドロードまたは組織のカタログ経由)。
- Teams 内で Bot を探し、ダイレクトメッセージを送ります。
- Gateway のログを確認して、受信アクティビティがあるかチェックします。
セットアップ(テキストのみの最小構成)
Section titled “セットアップ(テキストのみの最小構成)”-
Microsoft Teams プラグインのインストール
- npm から:
openclaw plugins install @openclaw/msteams - ローカルのチェックアウトから:
openclaw plugins install ./path/to/local/msteams-plugin
- npm から:
-
Bot の登録
- Azure Bot を作成し(上記参照)、以下の情報を控えておきます:
- App ID
- Client secret (App password)
- Tenant ID (single-tenant)
- Azure Bot を作成し(上記参照)、以下の情報を控えておきます:
-
Teams アプリのマニフェスト
botId = <App ID>を含むbotエントリを追加します。- スコープ:
personal、team、groupChatを指定します。 supportsFiles: true(パーソナルスコープでのファイル操作に必要)を設定します。- RSC 権限を追加します(後述)。
- アイコンを作成します:
outline.png(32x32) とcolor.png(192x192)。 manifest.json、outline.png、color.pngの 3 つのファイルを ZIP にまとめます。
-
OpenClaw の設定
{channels: {msteams: {enabled: true,appId: "<APP_ID>",appPassword: "<APP_PASSWORD>",tenantId: "<TENANT_ID>",webhook: { port: 3978, path: "/api/messages" },},},}設定キーの代わりに環境変数を使うこともできます:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_ID
-
Bot エンドポイント
- Azure Bot の Messaging Endpoint を以下のように設定します:
https://<host>:3978/api/messages(または自身で設定したパスとポート)
- Azure Bot の Messaging Endpoint を以下のように設定します:
-
Gateway の実行
- プラグインがインストールされ、認証情報を含む
msteams設定が存在すれば、Teams チャネルは自動的に起動します。
- プラグインがインストールされ、認証情報を含む
メンバー情報の取得アクション
Section titled “メンバー情報の取得アクション”OpenClaw は Microsoft Teams 向けに Microsoft Graph を利用した member-info アクションを提供しています。これにより、エージェントや自動化ツールが Microsoft Graph から直接、チャネルメンバーの詳細情報(表示名、メールアドレス、ロール)を取得できるようになります。
要件:
Member.Read.GroupRSC 権限(推奨マニフェストに含まれています)- チームをまたいだ検索の場合:管理者同意済みの
User.Read.AllGraph Application 権限
このアクションは channels.msteams.actions.memberInfo で制御されます(Graph の認証情報が利用可能な場合はデフォルトで有効です)。
履歴のコンテキスト
Section titled “履歴のコンテキスト”チャットの文脈をどこまで遡って把握するかは、以下の設定で調整できます。
channels.msteams.historyLimitは、プロンプトに含める最近のチャネルやグループメッセージの数を制御します。- 設定がない場合は
messages.groupChat.historyLimitの値が使用されます。無効にするには0を設定してください(デフォルトは 50 です)。 - 取得されたスレッド履歴は、送信者の許可リスト(
allowFrom/groupAllowFrom)によってフィルタリングされます。そのため、スレッドのコンテキストには許可された送信者からのメッセージのみが含まれるようになっています。 - DM の履歴制限は
channels.msteams.dmHistoryLimit(ユーザーのターン数)で設定可能です。また、channels.msteams.dms["<user_id>"].historyLimitを使ってユーザーごとに個別の設定を上書きすることもできます。
現在の Teams RSC 権限 (Manifest)
Section titled “現在の Teams RSC 権限 (Manifest)”これらは、Teams アプリの Manifest に記述されている既存の resourceSpecific(リソース固有)権限です。これらの権限は、アプリがインストールされているチームまたはチャット内でのみ適用されます。
チャネル(チームスコープ)の場合:
ChannelMessage.Read.Group(Application) - @mention なしですべてのチャネルメッセージを受信ChannelMessage.Send.Group(Application)Member.Read.Group(Application)Owner.Read.Group(Application)ChannelSettings.Read.Group(Application)TeamMember.Read.Group(Application)TeamSettings.Read.Group(Application)
グループチャットの場合:
ChatMessage.Read.Chat(Application) - @mention なしですべてのグループチャットメッセージを受信
Teams Manifest の例 (編集済み)
Section titled “Teams Manifest の例 (編集済み)”以下は、必要なフィールドを含んだ最小限の有効な例です。ID や URL は実際の環境に合わせて置き換えてください。
{ $schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json", manifestVersion: "1.23", version: "1.0.0", id: "00000000-0000-0000-0000-000000000000", name: { short: "OpenClaw" }, developer: { name: "Your Org", websiteUrl: "https://example.com", privacyUrl: "https://example.com/privacy", termsOfUseUrl: "https://example.com/terms", }, description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" }, icons: { outline: "outline.png", color: "color.png" }, accentColor: "#5B6DEF", bots: [ { botId: "11111111-1111-1111-1111-111111111111", scopes: ["personal", "team", "groupChat"], isNotificationOnly: false, supportsCalling: false, supportsVideo: false, supportsFiles: true, }, ], webApplicationInfo: { id: "11111111-1111-1111-1111-111111111111", }, authorization: { permissions: { resourceSpecific: [ { name: "ChannelMessage.Read.Group", type: "Application" }, { name: "ChannelMessage.Send.Group", type: "Application" }, { name: "Member.Read.Group", type: "Application" }, { name: "Owner.Read.Group", type: "Application" }, { name: "ChannelSettings.Read.Group", type: "Application" }, { name: "TeamMember.Read.Group", type: "Application" }, { name: "TeamSettings.Read.Group", type: "Application" }, { name: "ChatMessage.Read.Chat", type: "Application" }, ], }, },}Manifest の注意点(必須フィールド)
Section titled “Manifest の注意点(必須フィールド)”bots[].botIdは、Azure Bot の App ID と一致している必要があります。webApplicationInfo.idも、Azure Bot の App ID と一致させる必要があります。bots[].scopesには、使用予定の場所(personal,team,groupChat)を含めてください。- 個人用スコープでファイルを扱うには、
bots[].supportsFiles: trueが必須です。 - チャネルのトラフィックを取得したい場合は、
authorization.permissions.resourceSpecificにチャネルの Read/Send 権限を含める必要があります。
既存アプリの更新方法
Section titled “既存アプリの更新方法”RSC 権限の追加などで、インストール済みの Teams アプリを更新する手順は以下の通りです。
manifest.jsonを新しい設定で更新します。versionフィールドの値を上げます(例:1.0.0→1.1.0)。- Manifest とアイコン(
manifest.json,outline.png,color.png)を再度 zip 圧縮します。 - 新しい zip ファイルをアップロードします。
- 方法 A (Teams 管理センター): Teams 管理センター → Teams アプリ → アプリを管理 → 該当アプリを検索 → 「新しいバージョンをアップロード」を選択。
- 方法 B (サイドロード): Teams 内 → アプリ → アプリを管理 → 「カスタム アプリをアップロード」。
- チームチャネルの場合: 新しい権限を有効にするため、各チームでアプリを再インストールしてください。
- キャッシュされたアプリのメタデータをクリアするため、ウィンドウを閉じるだけでなく Teams を完全に終了して再起動してください。
機能比較:RSC のみ vs Graph
Section titled “機能比較:RSC のみ vs Graph”Teams RSC のみ の場合(アプリをインストール済み、Graph API 権限なし)
Section titled “Teams RSC のみ の場合(アプリをインストール済み、Graph API 権限なし)”できること:
- チャネルメッセージのテキスト内容の読み取りと送信。
- 個人用(DM)の添付ファイルの受信。
できないこと:
- チャネルやグループ内での画像・ファイル内容の取得(ペイロードには HTML スタブのみが含まれます)。
- SharePoint や OneDrive に保存された添付ファイルのダウンロード。
- メッセージ履歴の読み取り(リアルタイムの webhook イベント以外の取得)。
- オフライン中のメッセージの遡り。
Teams RSC + Microsoft Graph アプリケーション権限 の場合
Section titled “Teams RSC + Microsoft Graph アプリケーション権限 の場合”以下の機能が追加されます:
- ホストされたコンテンツ(メッセージに貼り付けられた画像など)のダウンロード。
- SharePoint や OneDrive に保存された添付ファイルのダウンロード。
- Graph を介したチャネルやチャットのメッセージ履歴の読み取り。
RSC と Graph API の違い
Section titled “RSC と Graph API の違い”| 機能 | RSC 権限 | Graph API |
|---|---|---|
| リアルタイムメッセージ | 可能 (webhook 経由) | 不可 (ポーリングのみ) |
| 過去のメッセージ履歴 | 不可 | 可能 (履歴クエリが可能) |
| セットアップの複雑さ | アプリ Manifest のみ | 管理者の同意 + トークンフローが必要 |
| オフライン動作 | 不可 (起動中のみ) | 可能 (いつでもクエリ可能) |
結論として: RSC はリアルタイムのリスニングに適しており、Graph API は過去のデータへのアクセスに適しています。オフライン中に見逃したメッセージをキャッチアップするには、ChannelMessage.Read.All 権限(管理者の同意が必要)を持つ Graph API が必要になります。
Graph を利用したメディアと履歴(チャネルで必須)
Section titled “Graph を利用したメディアと履歴(チャネルで必須)”チャネルで画像やファイルを使用したり、メッセージ履歴を取得したりする必要がある場合は、Microsoft Graph の権限を有効にして管理者の同意を得る必要があります。
- Entra ID (Azure AD) の App Registration で、以下の Microsoft Graph Application permissions を追加してください:
ChannelMessage.Read.All(チャネルの添付ファイルと履歴)Chat.Read.AllまたはChatMessage.Read.All(グループチャット)
- テナントに対して Grant admin consent(管理者の同意を与える)を実行します。
- Teams アプリの manifest version を上げ、再アップロードして Teams にアプリを再インストール してください。
- キャッシュされたアプリのメタデータをクリアするために、Teams を完全に終了して再起動 します。
ユーザーメンションに関する追加の権限: 会話に参加しているユーザーへの @メンションは、特別な設定なしで動作します。ただし、現在の会話に参加していない ユーザーを動的に検索してメンションしたい場合は、User.Read.All (Application) 権限を追加し、管理者の同意を得てください。
既知の制限事項
Section titled “既知の制限事項”Webhook のタイムアウト
Section titled “Webhook のタイムアウト”Teams は HTTP Webhook を介してメッセージを配信します。LLM のレスポンスが遅い場合など、処理に時間がかかりすぎると、以下のような問題が発生することがあります。
- Gateway タイムアウトや返信のドロップ
- Teams によるメッセージの再試行(重複の原因)
OpenClaw は、素早くレスポンスを返し、プロアクティブに返信を送信することでこれに対処していますが、レスポンスが極端に遅い場合には依然として問題が発生する可能性があります。
フォーマット
Section titled “フォーマット”Teams の Markdown は Slack や Discord よりも制限されています。
- 基本的なフォーマット(太字、斜体、
code、リンク)は動作しますが、複雑な Markdown(テーブル、ネストされたリスト)は正しくレンダリングされない場合があります。 - 投票や任意のカード送信のために Adaptive Cards がサポートされています(詳細は以下を参照)。
主要な設定項目は以下の通りです(共有チャネルのパターンについては /gateway/configuration を参照してください)。
channels.msteams.enabled: チャネルの有効化/無効化。channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: Bot の認証情報。channels.msteams.webhook.port(デフォルト3978)channels.msteams.webhook.path(デフォルト/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(デフォルト: pairing)channels.msteams.allowFrom: DM の許可リスト(AAD のオブジェクト ID を推奨)。Graph アクセスが可能な場合、セットアップウィザードが名前を ID に解決します。channels.msteams.dangerouslyAllowNameMatching: 変更可能な UPN/表示名によるマッチングや、チーム/チャネル名による直接ルーティングを再有効化するための緊急用トグル。channels.msteams.textChunkLimit: 送信テキストのチャンクサイズ。channels.msteams.chunkMode:length(デフォルト) またはnewline(長さで分割する前に、空行(段落の境界)で分割する)。channels.msteams.mediaAllowHosts: 受信添付ファイルのホスト許可リスト(デフォルトは Microsoft/Teams のドメイン)。channels.msteams.mediaAuthAllowHosts: メディアの再試行時に Authorization ヘッダーを付与するホストの許可リスト(デフォルトは Graph + Bot Framework のホスト)。channels.msteams.requireMention: チャネルやグループで @メンションを必須にするかどうか(デフォルトは true)。channels.msteams.replyStyle:thread | top-level(Reply Style を参照)。channels.msteams.teams.<teamId>.replyStyle: チームごとのオーバーライド。channels.msteams.teams.<teamId>.requireMention: チームごとのオーバーライド。channels.msteams.teams.<teamId>.tools: チャネルごとの設定がない場合に使用される、チームごとのデフォルトツールポリシー(allow/deny/alsoAllow)。channels.msteams.teams.<teamId>.toolsBySender: チームごと、送信者ごとのデフォルトツールポリシー("*"ワイルドカードをサポート)。channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: チャネルごとのオーバーライド。channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: チャネルごとのオーバーライド。channels.msteams.teams.<teamId>.channels.<conversationId>.tools: チャネルごとのツールポリシー(allow/deny/alsoAllow)。channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: チャネルごと、送信者ごとのツールポリシー("*"ワイルドカードをサポート)。toolsBySenderのキーには明示的なプレフィックスを使用してください:id:,e164:,username:,name:(プレフィックスのないレガシーなキーはid:にのみマップされます)。channels.msteams.actions.memberInfo: Graph を利用したメンバー情報取得アクションの有効化/無効化(デフォルト:Graph の認証情報がある場合に有効)。channels.msteams.sharePointSiteId: グループチャットやチャネルでのファイルアップロード用 SharePoint サイト ID(グループチャットでのファイル送信 を参照)。
ルーティングとセッション
Section titled “ルーティングとセッション”- セッションキーは標準的なエージェント形式に従います(/concepts/session を参照):
- ダイレクトメッセージはメインセッション(
agent:<agentId>:<mainKey>)を共有します。 - チャネル/グループメッセージは会話 ID を使用します:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- ダイレクトメッセージはメインセッション(
返信スタイル:Threads vs Posts
Section titled “返信スタイル:Threads vs Posts”Teamsでは最近、同じデータモデルに対して2つのチャネルUIスタイルが導入されました。
| スタイル | 説明 | 推奨される replyStyle |
|---|---|---|
| Posts (クラシック) | メッセージがカードとして表示され、その下にスレッド返信が並ぶ | thread (デフォルト) |
| Threads (Slack風) | メッセージがSlackのようにリニア(直線的)に流れる | top-level |
問題点: Teams APIは、チャネルがどちらのUIスタイルを使用しているかという情報を公開していません。そのため、誤った replyStyle を使用すると以下のような問題が発生します。
- Threadsスタイルのチャネルで
threadを使用:返信が不自然に入れ子になって表示される - Postsスタイルのチャネルで
top-levelを使用:返信がスレッド内ではなく、独立した新しい投稿として表示される
解決策: チャネルのセットアップ状況に合わせて、チャネルごとに replyStyle を設定してください。
{ channels: { msteams: { replyStyle: "thread", teams: { "19:abc...@thread.tacv2": { channels: { "19:xyz...@thread.tacv2": { replyStyle: "top-level", }, }, }, }, }, },}添付ファイルと画像
Section titled “添付ファイルと画像”現在の制限事項:
- DM: 画像やファイルの添付は、Teamsのbot file API経由で動作します。
- チャネル/グループ: 添付ファイルはM365ストレージ(SharePoint/OneDrive)に保存されます。WebhookのペイロードにはHTMLのスタブのみが含まれ、実際のファイルデータは含まれません。チャネルの添付ファイルをダウンロードするには、Graph APIの権限が必要です。
- 明示的にファイルを送信する場合は、
action=upload-fileを使用し、media/filePath/pathを指定します。オプションのmessageは添え字(コメント)になり、filenameを指定するとアップロード時の名前を上書きできます。
Graph APIの権限がない場合、画像付きのチャネルメッセージはテキストのみとして受信されます(botが画像コンテンツにアクセスできないためです)。
デフォルトでは、OpenClawはMicrosoft/Teamsのホスト名からのみメディアをダウンロードします。これを変更するには channels.msteams.mediaAllowHosts を設定してください(["*"] ですべてのホストを許可できます)。
認証ヘッダーは、channels.msteams.mediaAuthAllowHosts にリストされているホストに対してのみ付与されます(デフォルトはGraph + Bot Frameworkのホストです)。このリストは厳格に管理してください。
グループチャットでのファイル送信
Section titled “グループチャットでのファイル送信”DMでは、組み込みの FileConsentCard フローを使用してファイルを送信できます。しかし、グループチャットやチャネルでファイルを送信するには、追加のセットアップが必要です。
| コンテキスト | ファイルの送信方法 | 必要なセットアップ |
|---|---|---|
| DM | FileConsentCard → ユーザーが承認 → botがアップロード | 標準で動作 |
| グループチャット/チャネル | SharePointへアップロード → 共有リンクを送信 | sharePointSiteId + Graph API権限が必要 |
| 画像 (全コンテキスト) | Base64エンコードによるインライン送信 | 標準で動作 |
なぜグループチャットにSharePointが必要なのか
Section titled “なぜグループチャットにSharePointが必要なのか”botは個人のOneDriveドライブを持っていません(アプリケーションアイデンティティの場合、/me/drive Graph APIエンドポイントが機能しません)。そのため、グループチャットやチャネルでファイルを送信する場合、botはSharePointサイトにファイルをアップロードし、共有リンクを作成して対応します。
セットアップ
Section titled “セットアップ”-
Graph APIの権限を追加:Entra ID (Azure AD) の「アプリの登録」で以下の権限を付与します。
Sites.ReadWrite.All(アプリケーション) - SharePointへのファイルアップロードに必要Chat.Read.All(アプリケーション) - 任意。ユーザーごとの共有リンクを有効にする場合に必要
-
管理者の同意をテナントに付与します。
-
SharePointサイトIDを取得する:
Terminal window # Via Graph Explorer or curl with a valid token:curl -H "Authorization: Bearer $TOKEN" \"https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}"# Example: for a site at "contoso.sharepoint.com/sites/BotFiles"curl -H "Authorization: Bearer $TOKEN" \"https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles"# Response includes: "id": "contoso.sharepoint.com,guid1,guid2" -
OpenClawを設定する:
{channels: {msteams: {// ... other config ...sharePointSiteId: "contoso.sharepoint.com,guid1,guid2",},},}
| 権限 | 共有の挙動 |
|---|---|
Sites.ReadWrite.All のみ | 組織全体の共有リンク(組織内の誰でもアクセス可能) |
Sites.ReadWrite.All + Chat.Read.All | ユーザーごとの共有リンク(チャットメンバーのみアクセス可能) |
ユーザーごとの共有は、チャットの参加者のみがファイルにアクセスできるため、より安全です。Chat.Read.All 権限がない場合、botは組織全体の共有リンクにフォールバックします。
フォールバックの挙動
Section titled “フォールバックの挙動”| シナリオ | 結果 |
|---|---|
グループチャット + ファイル + sharePointSiteId 設定済み | SharePointにアップロードし、共有リンクを送信 |
グループチャット + ファイル + sharePointSiteId 未設定 | OneDriveへのアップロードを試行(失敗の可能性あり)、テキストのみ送信 |
| 個別チャット + ファイル | FileConsentCardフロー(SharePointなしで動作) |
| 全コンテキスト + 画像 | Base64インライン送信(SharePointなしで動作) |
ファイルの保存場所
Section titled “ファイルの保存場所”アップロードされたファイルは、設定されたSharePointサイトのデフォルトドキュメントライブラリ内にある /OpenClawShared/ フォルダに保存されます。
投票(Adaptive Cards)
Section titled “投票(Adaptive Cards)”OpenClawは、Teamsの投票を Adaptive Cards として送信します(Teamsにはネイティブの投票APIが存在しないためです)。
- CLI:
openclaw message poll --channel msteams --target conversation:<id> ... - 投票結果は Gateway によって
~/.openclaw/msteams-polls.jsonに記録されます。 - 投票を記録するためには、Gateway がオンラインである必要があります。
- 現在、投票結果のサマリーを自動投稿する機能はありません(必要に応じて保存ファイルを確認してください)。
Adaptive Cards (任意)
Section titled “Adaptive Cards (任意)”messageツールやCLIを使って、任意のAdaptive Card JSONをTeamsのユーザーや会話に送信できます。
cardパラメータはAdaptive Card JSONオブジェクトを受け取ります。cardを指定した場合、メッセージのテキストは省略可能です。
Agent tool:
{ action: "send", channel: "msteams", target: "user:<id>", card: { type: "AdaptiveCard", version: "1.5", body: [{ type: "TextBlock", text: "Hello!" }], },}CLI:
openclaw message send --channel msteams \ --target "conversation:19:abc...@thread.tacv2" \ --card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello!"}]}'カードのスキーマや例については、Adaptive Cards documentationを確認してください。ターゲット形式の詳細については、以下のターゲットの形式を参照してください。
ターゲットの形式
Section titled “ターゲットの形式”MSTeamsのターゲットでは、ユーザーと会話を区別するためにプレフィックスを使用します。
| ターゲットタイプ | 形式 | 例 |
|---|---|---|
| ユーザー (ID指定) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| ユーザー (名前指定) | user:<display-name> | user:John Smith (Graph APIが必要) |
| グループ/チャネル | conversation:<conversation-id> | conversation:19:abc123...@thread.tacv2 |
| グループ/チャネル (raw) | <conversation-id> | 19:abc123...@thread.tacv2 (@threadを含む場合) |
CLI examples:
# Send to a user by IDopenclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Hello"
# Send to a user by display name (triggers Graph API lookup)openclaw message send --channel msteams --target "user:John Smith" --message "Hello"
# Send to a group chat or channelopenclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Hello"
# Send an Adaptive Card to a conversationopenclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" \ --card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello"}]}'Agent tool examples:
{ action: "send", channel: "msteams", target: "user:John Smith", message: "Hello!",}{ action: "send", channel: "msteams", target: "conversation:19:abc...@thread.tacv2", card: { type: "AdaptiveCard", version: "1.5", body: [{ type: "TextBlock", text: "Hello" }], },}注意:user:プレフィックスがない場合、名前はデフォルトでグループまたはチームとして解決されます。表示名で個人を指定する場合は、必ずuser:を使用してください。
プロアクティブメッセージ
Section titled “プロアクティブメッセージ”プロアクティブメッセージは、ユーザーが一度インタラクションを行った後にのみ送信可能です。これは、その時点で会話のリファレンス(conversation references)を保存する仕組みになっているためです。
dmPolicy や許可リスト(allowlist)による制限については、/gateway/configuration を参照してください。
チームとチャネルの ID(よくある落とし穴)
Section titled “チームとチャネルの ID(よくある落とし穴)”Teams の URL に含まれる groupId クエリパラメータは、設定に使用するチーム ID ではありません。代わりに、以下のように URL のパス部分から ID を抽出してください。
チームの URL:
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=... └────────────────────────────┘ Team ID (URL-decode this)チャネルの URL:
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=... └─────────────────────────┘ Channel ID (URL-decode this)設定時の注意点:
- チーム ID =
/team/の後のパスセグメント(URL デコードしたもの。例:19:Bk4j...@thread.tacv2) - チャネル ID =
/channel/の後のパスセグメント(URL デコードしたもの) groupIdクエリパラメータは無視してください。
プライベートチャネル
Section titled “プライベートチャネル”プライベートチャネルでは、Bot のサポートに制限があります。
| 機能 | 標準チャネル | プライベートチャネル |
|---|---|---|
| Bot のインストール | はい | 制限あり |
| リアルタイムメッセージ (webhook) | はい | 動作しない可能性があります |
| RSC 権限 | はい | 動作が異なる場合があります |
| @メンション | はい | Bot にアクセス可能な場合 |
| Graph API の履歴 | はい | はい(権限が必要) |
プライベートチャネルでうまく動作しない場合の回避策:
- Bot とのやり取りには標準チャネルを使用してください
- DM を活用しましょう。ユーザーはいつでも Bot に直接メッセージを送ることができます
- 過去の履歴にアクセスするには Graph API を使用してください(
ChannelMessage.Read.Allが必要です)
トラブルシューティング
Section titled “トラブルシューティング”よくある問題
Section titled “よくある問題”- チャネルで画像が表示されない: Graph の権限不足か、管理者による同意が得られていない可能性があります。Teams アプリを再インストールし、Teams を完全に終了してから再起動してください。
- チャネルで応答がない: デフォルトではメンションが必要です。
channels.msteams.requireMention=falseを設定するか、チームやチャネルごとに設定を行ってください。 - バージョンの不一致(Teams に古いマニフェストが表示される): アプリを一度削除して追加し直し、Teams を完全に終了してリフレッシュしてください。
- webhook からの 401 Unauthorized: Azure JWT なしで手動テストを行うとこのエラーが発生しますが、これはエンドポイントに到達できているものの認証に失敗したことを示しています。正しくテストするには Azure Web Chat を使用してください。
マニフェストのアップロードエラー
Section titled “マニフェストのアップロードエラー”- “Icon file cannot be empty”(アイコンファイルが空です): マニフェストが参照しているアイコンファイルが 0 バイトになっています。有効な PNG アイコンを作成してください(
outline.pngは 32x32、color.pngは 192x192)。 - “webApplicationInfo.Id already in use”(IDが既に使用されています): アプリがまだ他のチームやチャットにインストールされています。まずそれを見つけてアンインストールするか、反映まで 5〜10 分ほど待ってください。
- アップロード時に “Something went wrong” と表示される場合: 代わりに https://admin.teams.microsoft.com からアップロードしてみてください。ブラウザの DevTools (F12) を開き、Network タブでレスポンスボディを確認すると、実際のエラー内容を特定できます。
- サイドロードに失敗する場合: 「カスタムアプリをアップロード」ではなく、「組織のアプリカタログにアプリをアップロード」を試してみてください。これでサイドロードの制限を回避できることがよくあります。
RSC 権限が動作しない場合
Section titled “RSC 権限が動作しない場合”webApplicationInfo.idが Bot の App ID と完全に一致しているか確認してください- アプリを再アップロードし、チームやチャットに再インストールしてください
- 組織の管理者が RSC 権限をブロックしていないか確認してください
- 正しいスコープを使用しているか確認しましょう。チームの場合は
ChannelMessage.Read.Group、グループチャットの場合はChatMessage.Read.Chatです
リファレンス
Section titled “リファレンス”開発を進める上で役立つ公式ドキュメントやリソースをまとめました。詳細な仕様や最新のアップデートを確認する際は、これらのリンクを参考にしてください。
- Create Azure Bot - Azure Botのセットアップガイド
- Teams Developer Portal - Teamsアプリの作成と管理
- Teams app manifest schema
- Receive channel messages with RSC
- RSC permissions reference
- Teams bot file handling(チャネルやグループでの利用にはGraphが必要です)
- Proactive messaging
こちらの関連ドキュメントもあわせて確認することをおすすめします。
- Channels Overview — サポートされているすべてのチャネル
- Pairing — DMの認証とペアリングフロー
- Groups — グループチャットの動作とメンションによる制御
- Channel Routing — メッセージのセッションルーティング
- Security — アクセスモデルとセキュリティの強化
OpenClaw Expert
まだ解決しませんか?
このページで解決しない場合は、OpenClaw Expertに直接質問してください。