コンテンツにスキップ

Microsoft Teams で OpenClaw を使うための設定ガイド

Microsoft Teamsはプラグインとして提供されており、コア・インストールには含まれていません。

重要な変更 (2026.1.15): Microsoft Teamsはコアから分離されました。この機能を利用する場合は、プラグインを個別にインストールする必要があります。

この変更により、コア・インストールを軽量に保ちつつ、Microsoft Teamsの依存関係を独立して更新できるようになりました。

CLI(npmレジストリ)経由でインストールする場合:

Terminal window
openclaw plugins install @openclaw/msteams

ローカル・チェックアウト(gitリポジトリから実行している場合):

Terminal window
openclaw plugins install ./path/to/local/msteams-plugin

セットアップ中にTeamsを選択し、gitチェックアウトが検出された場合、OpenClawは自動的にローカルのインストールパスを提案します。

詳細はこちら:Plugins

クイックセットアップ(初心者向け)

Section titled “クイックセットアップ(初心者向け)”
  1. Microsoft Teamsプラグインをインストールします。
  2. Azure Botを作成します(App ID、client secret、tenant IDを取得してください)。
  3. 取得した認証情報を使用してOpenClawを設定します。
  4. パブリックURLまたはトンネルを使用して、/api/messages(デフォルトのポートは3978)を公開します。
  5. 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と対話でき、返信が常にメッセージの送信元チャネルに正しく戻る決定的なルーティングを維持します。
  • 特に設定を変更しない限りメンションを必須とする、安全なチャネル動作をデフォルトにします。

デフォルトでは、Microsoft Teamsは/config set|unsetコマンドによる設定の更新を書き込むことが許可されています(これにはcommands.config: trueの設定が必要です)。

この機能を無効にするには、以下のように設定してください:

{
channels: { msteams: { configWrites: false } },
}

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 },
},
},
},
},
},
}
  1. Microsoft Teams プラグインをインストールします。
  2. Azure Bot を作成します(App ID、secret、tenant ID)。
  3. ボットを参照し、後述の RSC 権限を含む Teams app package を作成します。
  4. Teams アプリをチーム(または DM 用の個人スコープ)にアップロード・インストールします。
  5. ~/.openclaw/openclaw.json(または環境変数)で msteams を設定し、Gateway を起動します。
  6. Gateway はデフォルトで /api/messages への Bot Framework webhook トラフィックをリッスンします。

Azure Bot のセットアップ(事前準備)

Section titled “Azure Bot のセットアップ(事前準備)”

OpenClaw を設定する前に、Azure Bot リソースを作成する必要があります。

  1. Azure Bot の作成 に移動します。

  2. 基本タブを入力します:

    項目値
    ボット ハンドルボットの名前。例: openclaw-msteams(一意である必要があります)
    サブスクリプション使用する Azure サブスクリプションを選択
    リソース グループ新規作成または既存のものを選択
    価格レベル開発・テスト用には Free を選択
    アプリの種類シングル テナント(推奨 - 下記の注意を参照)
    作成の種類Microsoft アプリ ID の新規作成

廃止予定の通知: 2025年7月31日以降、新しいマルチテナントボットの作成は非推奨となりました。新しいボットには シングル テナント を使用してください。

  1. 確認と作成 → 作成 をクリックします(1〜2分ほど待ちます)。
  1. 作成した Azure Bot リソース → 構成 に移動します。
  2. Microsoft アプリ ID をコピーします。これが appId になります。
  3. パスワードの管理 をクリックし、アプリの登録画面へ移動します。
  4. 証明書とシークレット → 新しいクライアント シークレット → 値 をコピーします。これが appPassword になります。
  5. 概要 に移動し、ディレクトリ (テナント) ID をコピーします。これが tenantId になります。

ステップ 3: メッセージング エンドポイントの設定

Section titled “ステップ 3: メッセージング エンドポイントの設定”
  1. Azure Bot → 構成 に移動します。
  2. メッセージング エンドポイント を webhook の URL に設定します:
    • 本番環境: https://your-domain.com/api/messages
    • ローカル開発: トンネルを使用します(下記のローカル開発を参照)。

ステップ 4: Teams チャネルの有効化

Section titled “ステップ 4: Teams チャネルの有効化”
  1. Azure Bot → チャネル に移動します。
  2. Microsoft Teams をクリック → 構成 → 保存。
  3. 利用規約に同意します。

ローカル開発(トンネリング)

Section titled “ローカル開発(トンネリング)”

Teams は localhost に直接アクセスできません。ローカル開発にはトンネルを使用してください。

オプション A: ngrok

Terminal window
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

Terminal window
tailscale funnel 3978
# Use your Tailscale funnel URL as the messaging endpoint

マニフェストの ZIP ファイルを手動で作る代わりに、Teams Developer Portal を使う方法もあります。JSON を直接編集するよりも簡単なので、こちらの手順がおすすめです。

  1. + New app をクリックします。
  2. 基本情報(名前、説明、開発者情報)を入力します。
  3. App features → Bot に進みます。
  4. Enter a bot ID manually を選択し、Azure Bot の App ID を貼り付けます。
  5. スコープを確認します:Personal、Team、Group Chat。
  6. Distribute → Download app package をクリックします。
  7. Teams 側で:Apps → Manage your apps → Upload a custom app を開き、ダウンロードした ZIP を選択します。

オプション A:Azure Web Chat(まず Webhook を確認)

  1. Azure Portal で対象の Azure Bot リソースを開き、Test in Web Chat を選択します。
  2. メッセージを送信して、レスポンスが返ってくるか確認します。
  3. これにより、Teams 側の設定を行う前に Webhook エンドポイントが正しく動作していることを確認できます。

オプション B:Teams(アプリのインストール後)

  1. Teams アプリをインストールします(サイドロードまたは組織のカタログ経由)。
  2. Teams 内で Bot を探し、ダイレクトメッセージを送ります。
  3. Gateway のログを確認して、受信アクティビティがあるかチェックします。

セットアップ(テキストのみの最小構成)

Section titled “セットアップ(テキストのみの最小構成)”
  1. Microsoft Teams プラグインのインストール

    • npm から:openclaw plugins install @openclaw/msteams
    • ローカルのチェックアウトから:openclaw plugins install ./path/to/local/msteams-plugin
  2. Bot の登録

    • Azure Bot を作成し(上記参照)、以下の情報を控えておきます:
      • App ID
      • Client secret (App password)
      • Tenant ID (single-tenant)
  3. 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 にまとめます。
  4. OpenClaw の設定

    {
    channels: {
    msteams: {
    enabled: true,
    appId: "<APP_ID>",
    appPassword: "<APP_PASSWORD>",
    tenantId: "<TENANT_ID>",
    webhook: { port: 3978, path: "/api/messages" },
    },
    },
    }

    設定キーの代わりに環境変数を使うこともできます:

    • MSTEAMS_APP_ID
    • MSTEAMS_APP_PASSWORD
    • MSTEAMS_TENANT_ID
  5. Bot エンドポイント

    • Azure Bot の Messaging Endpoint を以下のように設定します:
      • https://<host>:3978/api/messages(または自身で設定したパスとポート)
  6. Gateway の実行

    • プラグインがインストールされ、認証情報を含む msteams 設定が存在すれば、Teams チャネルは自動的に起動します。

メンバー情報の取得アクション

Section titled “メンバー情報の取得アクション”

OpenClaw は Microsoft Teams 向けに Microsoft Graph を利用した member-info アクションを提供しています。これにより、エージェントや自動化ツールが Microsoft Graph から直接、チャネルメンバーの詳細情報(表示名、メールアドレス、ロール)を取得できるようになります。

要件:

  • Member.Read.Group RSC 権限(推奨マニフェストに含まれています)
  • チームをまたいだ検索の場合:管理者同意済みの User.Read.All Graph Application 権限

このアクションは channels.msteams.actions.memberInfo で制御されます(Graph の認証情報が利用可能な場合はデフォルトで有効です)。

チャットの文脈をどこまで遡って把握するかは、以下の設定で調整できます。

  • channels.msteams.historyLimit は、プロンプトに含める最近のチャネルやグループメッセージの数を制御します。
  • 設定がない場合は messages.groupChat.historyLimit の値が使用されます。無効にするには 0 を設定してください(デフォルトは 50 です)。
  • 取得されたスレッド履歴は、送信者の許可リスト(allowFrom / groupAllowFrom)によってフィルタリングされます。そのため、スレッドのコンテキストには許可された送信者からのメッセージのみが含まれるようになっています。
  • DM の履歴制限は channels.msteams.dmHistoryLimit(ユーザーのターン数)で設定可能です。また、channels.msteams.dms["<user_id>"].historyLimit を使ってユーザーごとに個別の設定を上書きすることもできます。

これらは、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 なしですべてのグループチャットメッセージを受信

以下は、必要なフィールドを含んだ最小限の有効な例です。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 権限を含める必要があります。

RSC 権限の追加などで、インストール済みの Teams アプリを更新する手順は以下の通りです。

  1. manifest.json を新しい設定で更新します。
  2. version フィールドの値を上げます(例: 1.0.0 → 1.1.0)。
  3. Manifest とアイコン(manifest.json, outline.png, color.png)を再度 zip 圧縮します。
  4. 新しい zip ファイルをアップロードします。
    • 方法 A (Teams 管理センター): Teams 管理センター → Teams アプリ → アプリを管理 → 該当アプリを検索 → 「新しいバージョンをアップロード」を選択。
    • 方法 B (サイドロード): Teams 内 → アプリ → アプリを管理 → 「カスタム アプリをアップロード」。
  5. チームチャネルの場合: 新しい権限を有効にするため、各チームでアプリを再インストールしてください。
  6. キャッシュされたアプリのメタデータをクリアするため、ウィンドウを閉じるだけでなく Teams を完全に終了して再起動してください。

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
リアルタイムメッセージ可能 (webhook 経由)不可 (ポーリングのみ)
過去のメッセージ履歴不可可能 (履歴クエリが可能)
セットアップの複雑さアプリ Manifest のみ管理者の同意 + トークンフローが必要
オフライン動作不可 (起動中のみ)可能 (いつでもクエリ可能)

結論として: RSC はリアルタイムのリスニングに適しており、Graph API は過去のデータへのアクセスに適しています。オフライン中に見逃したメッセージをキャッチアップするには、ChannelMessage.Read.All 権限(管理者の同意が必要)を持つ Graph API が必要になります。

Graph を利用したメディアと履歴(チャネルで必須)

Section titled “Graph を利用したメディアと履歴(チャネルで必須)”

チャネルで画像やファイルを使用したり、メッセージ履歴を取得したりする必要がある場合は、Microsoft Graph の権限を有効にして管理者の同意を得る必要があります。

  1. Entra ID (Azure AD) の App Registration で、以下の Microsoft Graph Application permissions を追加してください:
    • ChannelMessage.Read.All(チャネルの添付ファイルと履歴)
    • Chat.Read.All または ChatMessage.Read.All(グループチャット)
  2. テナントに対して Grant admin consent(管理者の同意を与える)を実行します。
  3. Teams アプリの manifest version を上げ、再アップロードして Teams にアプリを再インストール してください。
  4. キャッシュされたアプリのメタデータをクリアするために、Teams を完全に終了して再起動 します。

ユーザーメンションに関する追加の権限: 会話に参加しているユーザーへの @メンションは、特別な設定なしで動作します。ただし、現在の会話に参加していない ユーザーを動的に検索してメンションしたい場合は、User.Read.All (Application) 権限を追加し、管理者の同意を得てください。

Teams は HTTP Webhook を介してメッセージを配信します。LLM のレスポンスが遅い場合など、処理に時間がかかりすぎると、以下のような問題が発生することがあります。

  • Gateway タイムアウトや返信のドロップ
  • Teams によるメッセージの再試行(重複の原因)

OpenClaw は、素早くレスポンスを返し、プロアクティブに返信を送信することでこれに対処していますが、レスポンスが極端に遅い場合には依然として問題が発生する可能性があります。

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(グループチャットでのファイル送信 を参照)。
  • セッションキーは標準的なエージェント形式に従います(/concepts/session を参照):
    • ダイレクトメッセージはメインセッション(agent:<agentId>:<mainKey>)を共有します。
    • チャネル/グループメッセージは会話 ID を使用します:
      • agent:<agentId>:msteams:channel:<conversationId>
      • agent:<agentId>:msteams:group:<conversationId>

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",
},
},
},
},
},
},
}

現在の制限事項:

  • 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 フローを使用してファイルを送信できます。しかし、グループチャットやチャネルでファイルを送信するには、追加のセットアップが必要です。

コンテキストファイルの送信方法必要なセットアップ
DMFileConsentCard → ユーザーが承認 → botがアップロード標準で動作
グループチャット/チャネルSharePointへアップロード → 共有リンクを送信sharePointSiteId + Graph API権限が必要
画像 (全コンテキスト)Base64エンコードによるインライン送信標準で動作

なぜグループチャットにSharePointが必要なのか

Section titled “なぜグループチャットにSharePointが必要なのか”

botは個人のOneDriveドライブを持っていません(アプリケーションアイデンティティの場合、/me/drive Graph APIエンドポイントが機能しません)。そのため、グループチャットやチャネルでファイルを送信する場合、botはSharePointサイトにファイルをアップロードし、共有リンクを作成して対応します。

  1. Graph APIの権限を追加:Entra ID (Azure AD) の「アプリの登録」で以下の権限を付与します。

    • Sites.ReadWrite.All (アプリケーション) - SharePointへのファイルアップロードに必要
    • Chat.Read.All (アプリケーション) - 任意。ユーザーごとの共有リンクを有効にする場合に必要
  2. 管理者の同意をテナントに付与します。

  3. 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"
  4. OpenClawを設定する:

    {
    channels: {
    msteams: {
    // ... other config ...
    sharePointSiteId: "contoso.sharepoint.com,guid1,guid2",
    },
    },
    }
権限共有の挙動
Sites.ReadWrite.All のみ組織全体の共有リンク(組織内の誰でもアクセス可能)
Sites.ReadWrite.All + Chat.Read.Allユーザーごとの共有リンク(チャットメンバーのみアクセス可能)

ユーザーごとの共有は、チャットの参加者のみがファイルにアクセスできるため、より安全です。Chat.Read.All 権限がない場合、botは組織全体の共有リンクにフォールバックします。

シナリオ結果
グループチャット + ファイル + sharePointSiteId 設定済みSharePointにアップロードし、共有リンクを送信
グループチャット + ファイル + sharePointSiteId 未設定OneDriveへのアップロードを試行(失敗の可能性あり)、テキストのみ送信
個別チャット + ファイルFileConsentCardフロー(SharePointなしで動作)
全コンテキスト + 画像Base64インライン送信(SharePointなしで動作)

アップロードされたファイルは、設定されたSharePointサイトのデフォルトドキュメントライブラリ内にある /OpenClawShared/ フォルダに保存されます。

OpenClawは、Teamsの投票を Adaptive Cards として送信します(Teamsにはネイティブの投票APIが存在しないためです)。

  • CLI: openclaw message poll --channel msteams --target conversation:<id> ...
  • 投票結果は Gateway によって ~/.openclaw/msteams-polls.json に記録されます。
  • 投票を記録するためには、Gateway がオンラインである必要があります。
  • 現在、投票結果のサマリーを自動投稿する機能はありません(必要に応じて保存ファイルを確認してください)。

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:

Terminal window
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を確認してください。ターゲット形式の詳細については、以下のターゲットの形式を参照してください。

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:

Terminal window
# Send to a user by ID
openclaw 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 channel
openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Hello"
# Send an Adaptive Card to a conversation
openclaw 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:を使用してください。

プロアクティブメッセージは、ユーザーが一度インタラクションを行った後にのみ送信可能です。これは、その時点で会話のリファレンス(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 クエリパラメータは無視してください。

プライベートチャネルでは、Bot のサポートに制限があります。

機能標準チャネルプライベートチャネル
Bot のインストールはい制限あり
リアルタイムメッセージ (webhook)はい動作しない可能性があります
RSC 権限はい動作が異なる場合があります
@メンションはいBot にアクセス可能な場合
Graph API の履歴はいはい(権限が必要)

プライベートチャネルでうまく動作しない場合の回避策:

  1. Bot とのやり取りには標準チャネルを使用してください
  2. DM を活用しましょう。ユーザーはいつでも Bot に直接メッセージを送ることができます
  3. 過去の履歴にアクセスするには Graph API を使用してください(ChannelMessage.Read.All が必要です)
  • チャネルで画像が表示されない: 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 タブでレスポンスボディを確認すると、実際のエラー内容を特定できます。
  • サイドロードに失敗する場合: 「カスタムアプリをアップロード」ではなく、「組織のアプリカタログにアプリをアップロード」を試してみてください。これでサイドロードの制限を回避できることがよくあります。
  1. webApplicationInfo.id が Bot の App ID と完全に一致しているか確認してください
  2. アプリを再アップロードし、チームやチャットに再インストールしてください
  3. 組織の管理者が RSC 権限をブロックしていないか確認してください
  4. 正しいスコープを使用しているか確認しましょう。チームの場合は ChannelMessage.Read.Group、グループチャットの場合は ChatMessage.Read.Chat です

AI Setup Assistant

開発を進める上で役立つ公式ドキュメントやリソースをまとめました。詳細な仕様や最新のアップデートを確認する際は、これらのリンクを参考にしてください。

こちらの関連ドキュメントもあわせて確認することをおすすめします。

  • Channels Overview — サポートされているすべてのチャネル
  • Pairing — DMの認証とペアリングフロー
  • Groups — グループチャットの動作とメンションによる制御
  • Channel Routing — メッセージのセッションルーティング
  • Security — アクセスモデルとセキュリティの強化

AI Setup Assistant

OpenClaw

OpenClaw Expert

まだ解決しませんか?

このページで解決しない場合は、OpenClaw Expertに直接質問してください。