Microsoft Teams(Teams)
Microsoft Teams ボット:対応状況、機能、設定(Bot Framework + RSC + 任意で Graph)。
Tutorial.alert.info
Update: 2026-01-21
Status: Supports text and DM attachments; channel/group file sending requires sharePointSiteId + Graph permissions. Polls are sent via Adaptive Cards.
プラグインのインストールが必要
Microsoft Teams はプラグインとして提供されており、コアインストールにはバンドルされていません。
破壊的変更(2026.1.15): Teams がコアから移動されました。Teams を使用するにはプラグインをインストールする必要があります(これによりコアが軽量化され、Teams の依存関係を独立して更新できます)。
CLI 経由でインストール(npm registry):
openclaw plugins install @openclaw/msteams
ローカルインストール(git リポジトリから実行する場合):
openclaw plugins install ./extensions/msteams
configure/onboarding で Teams を選択し、git checkout が検出された場合、OpenClaw は自動的にローカルインストールパスを提供します。
Details: ''/plugin''
初心者向けクイックセットアップ
1. Microsoft Teams プラグインをインストールします。
2. Azure Bot を作成します(App ID + client secret + tenant ID)。
3. 認証情報を OpenClaw 設定に書き込みます。
4. 公開 URL またはトンネル経由で /api/messages を公開します(デフォルトポート 3978)。
5. Teams アプリパッケージをインストール/アップロードし、gateway を起動します。
Minimal configuration:
{
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" を使用して任意のメンバーを許可しますが、デフォルトではメンションが必要です)。
Goals
- Teams の DM、グループチャット、またはチャンネルで OpenClaw とチャットします。
- 決定論的ルーティングを維持:返信は常に元の会話に戻ります。
- デフォルトのセキュリティ:グループ/チャンネルはデフォルトでメンションが必要(設定で変更しない限り)。
設定の書き戻し(Config writes)
デフォルトでは、Teams が /config set|unset によってトリガーされた設定更新を設定ファイルに書き戻すことが許可されています(commands.config: true が必要)。
Disable:
{
channels: { msteams: { configWrites: false } },
}アクセス制御(DM + グループ/チャンネル)
ダイレクトメッセージ(DMs)
- デフォルト:channels.msteams.dmPolicy = "pairing"。不明な送信者は承認されるまで無視されます。
- channels.msteams.allowFrom は AAD オブジェクト ID、UPN(メール形式)、または表示名をサポートします。ウィザードは Graph が利用可能な場合、名前を ID に解決します。
グループ/チャンネル
- デフォルト:channels.msteams.groupPolicy = "allowlist"(groupAllowFrom を追加しない限りブロックされます)。
- channels.msteams.groupAllowFrom はグループチャット/チャンネルで誰がトリガーできるかを制御します(設定されていない場合は channels.msteams.allowFrom にフォールバック)。
- groupPolicy: "open" は任意のメンバーを許可します(デフォルトではメンションが必要)。
- チャンネル/グループチャットを完全に無効化する場合:channels.msteams.groupPolicy: "disabled"。
Example:
{
channels: {
msteams: {
groupPolicy: "allowlist",
groupAllowFrom: ["[email protected]"],
},
},
}ChannelsMsteamsPage step 05: P10
Team/Channel 許可リスト(オプション)
channels.msteams.teams で許可されたチームとチャンネルを一覧表示できます:
- チームのキーはチーム ID または名前
- チャンネルのキーは会話 ID または名前
- groupPolicy="allowlist" でチーム許可リストが存在する場合、一覧表示されたチーム/チャンネルのみが受け入れられます(デフォルトではメンションが必要)
- ウィザードは Team/Channel 入力を受け入れ、設定に書き込みます
- 起動時に、チーム/チャンネルとユーザー許可リストの名前を ID に解決しようとし、ログを出力します(対応する Graph 権限が必要)
Example:
{
channels: {
msteams: {
groupPolicy: "allowlist",
teams: {
"My Team": {
channels: {
General: { requireMention: true },
},
},
},
},
},
}仕組み(簡略)
1. Teams プラグインをインストールします。
2. Azure Bot を作成します(App ID + secret + tenant ID)。
3. Teams アプリパッケージ(manifest.zip)を構築し、ボットを参照し、必要な RSC 権限を含めます(以下を参照)。
4. アプリを対象チームにアップロード/インストールします(または DM のための個人スコープ)。
5. ~/.openclaw/openclaw.json(または環境変数)を設定し、gateway を起動します。
6. Gateway は Bot Framework webhook をリッスンします(デフォルト POST /api/messages)。
Azure Bot の設定(コアステップ)
#
1)Azure Bot を作成
1. 開く:''Create Azure Bot''
2. <strong>Basics</strong> に入力します(例):
| フィールド | 值 |
| ------------------- | ------------------------------------------------------------- |
| Posts(クラシック) | カードスタイルのメイン投稿 + 下部のスレッド返信 | thread(デフォルト) |
| Threads(Slack風)| 線形メッセージフロー、Slack に近い | top-level |
誤って設定した場合:
- 線形 Threads チャンネルで <code>thread</code> を使用:返信が奇妙にネストされます
- クラシック Posts チャンネルで <code>top-level</code> を使用:返信がスレッドの下ではなく、新しいトップレベル投稿になります
チャンネルごとのオーバーライド:
{
"msteams": {
"replyStyle": "thread",
"teams": {
"19:[email protected]": {
"channels": {
"19:[email protected]": { "replyStyle": "top-level" }
}
}
}
}
}添付ファイルと画像
現在の制限:
- ダイレクトメッセージ(DMs): 画像とファイル添付が利用可能(Teams ボットファイル API)。
- チャンネル/グループチャット: 添付ファイルは M365(SharePoint/OneDrive)に保存されます。Webhook ペイロードには HTML スタブのみが含まれ、実際のファイルバイトは含まれません。チャンネル添付ファイルをダウンロードするには、Graph API 権限を有効にする必要があります。
Graph 権限がない場合、チャンネル内の画像はプレーンテキストとしてコンテキストに入ります(ボットは画像コンテンツを見ることができません)。
デフォルトでは、OpenClaw は Microsoft/Teams のホスト名からのみメディアをダウンロードします。channels.msteams.mediaAllowHosts でオーバーライドできます(["*"] は任意のホストを許可)。
グループ/チャンネルでファイルを送信
ボットは DM で FileConsentCard を使用してファイルを送信できます(組み込みフロー)。しかし、グループチャット/チャンネルでファイルを送信するには追加の設定が必要です:
| シナリオ | 送信方法 | 必要な設定 |
| ---------------------------- | -------------------------------------------- | ----------------------------------------- |
| User (by ID) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| User (by name) | user:<display-name> | user:John Smith (requires Graph) |
| Group/Channel | conversation:<conversation-id> | conversation:19:[email protected] |
| Group/Channel (raw) | <conversation-id> | 19:[email protected] (when contains @thread) |
user: プレフィックスなしの場合、名前はデフォルトでグループ/チームとして解決されます。人にメッセージを送信する場合は常に user: を使用してください。
Proactive messaging
- プロアクティブメッセージングは、ユーザーがボットと対話した後にのみ可能です(その時点で会話参照を保存します)。
- dmPolicy と許可リストはプロアクティブメッセージにも適用されます(/gateway/configurationを参照)。
Team/Channel IDs(一般的な落とし穴)
Teams URL の groupId クエリパラメータは、設定で使用されるチーム IDではありません。URL パスから抽出し、URL デコードする必要があります:
Team URL:
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...
└────────────────────────────┘
Team ID(URL-decode)Channel URL:
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...
└─────────────────────────┘
Channel ID(URL-decode)When configuring:
- Team ID = /team/ の後のパスセグメント(URL デコード済み)
- Channel ID = /channel/ の後のパスセグメント(URL デコード済み)
- <code>groupId</code> クエリパラメータを無視
プライベートチャンネル
プライベートチャンネルでのボットサポートは制限されています:
| 機能 | 標準チャンネル | プライベートチャンネル |
| ----------------------------- | --------------- | ---------------------------- |
| ボットをインストール | はい | 制限あり |
| リアルタイムメッセージ(webhook) | はい | 利用できない場合あり |
| RSC 権限 | はい | 動作が異なる場合あり |
| @mentions | はい | ボットがアクセス可能な場合利用可能 |
| Graph 履歴クエリ | はい | はい(権限があれば) |
プライベートチャンネルが動作しない場合:
1. ボットの対話を標準チャンネルで行わせます
2. DM を使用します(ユーザーは常にボットに DM できます)
3. Graph を使用して履歴を取得します(ChannelMessage.Read.All が必要)
トラブルシューティング
一般的な問題:
- チャンネルで画像が見えない:Graph 権限または管理者の同意が不足しています。Teams アプリを再インストールし、Teams を完全に終了/再起動します。
- チャンネルで返信がない:デフォルトではメンションが必要です。<code>channels.msteams.requireMention=false</code> を設定するか、チーム/チャンネルごとに設定します。
- バージョンが更新されない(Teams が古いマニフェストを表示):アプリを削除して再度追加し、Teams を完全に終了してキャッシュをクリアします。
- Webhook テストが 401 を返す:Azure JWT なしの手動 curl テストは正常であり、エンドポイントに到達可能ですが認証に失敗したことを意味します。正しいテストには Azure Web Chat を使用します。
マニフェストアップロードエラー:
- "Icon file cannot be empty":マニフェストで参照されているアイコンファイルが 0 バイトです。有効な PNG を作成します(<code>outline.png</code> 32×32、<code>color.png</code> 192×192)。
- "webApplicationInfo.Id already in use":アプリが他のチーム/チャットにまだインストールされています。まずアンインストールするか、5–10 分待って伝播させます。
- アップロード時に "Something went wrong":https://admin.teams.microsoft.com 経由でアップロードを試し、DevTools(F12)→ Network を開いて実際のエラー応答本文を確認します。
- サイドロードが失敗する:"Upload a custom app" の代わりに "Upload an app to your org's app catalog" を試します。
RSC 権限が動作しない:
1. <code>webApplicationInfo.id</code> がボット App ID と完全に一致していることを確認します
2. アプリを再アップロードし、チーム/チャットに再インストールします
3. 組織のポリシーが RSC をブロックしていないか確認します
4. スコープを確認:チームは ChannelMessage.Read.Group を使用;グループチャットは ChatMessage.Read.Chat を使用