OpenClaw

OpenClaw Microsoft Teams 渠道

企业平台
中等

通过 Azure Bot Resource 使用 Bot Framework 将 OpenClaw 连接到 Microsoft Teams。这种基于插件的集成方式使你的 AI 助手能在 Teams 中运行——处理个人私信、群组聊天和频道对话。OpenClaw 在 /api/messages 接收来自 Bot Framework 的 Webhook 事件,并通过 Teams 消息 API 做出响应,支持线程回复、Adaptive Cards、消息回应、通过 SharePoint 共享文件,以及按团队/按频道的配置覆盖。

快速信息
难度中等
分类企业平台
支持功能数5 / 6

Microsoft Teams 支持的功能

文本消息

支持

媒体与文件

支持

消息反应

支持

消息线程

支持

语音消息

不支持

群聊

支持

Microsoft Teams 前置条件

  • 拥有创建 Azure Bot 资源权限的 Azure 账户
  • 已注册的 Azure Bot,包含 App ID、App Password(客户端密钥)和 Tenant ID(建议使用单租户)
  • Teams 应用清单(manifest.json),包含机器人配置、作用域和图标(outline.png 32×32、color.png 192×192)
  • OpenClaw Gateway 正在运行,并可通过公共 HTTPS URL 或隧道访问(默认 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 配置时需要这三个值。

2

安装 Teams 插件并配置

运行 'openclaw plugins install @openclaw/msteams' 安装插件。在 openclaw.json 中添加 Teams 渠道配置,包含 appId、appPassword 和 tenantId。你也可以使用环境变量 MSTEAMS_APP_ID、MSTEAMS_APP_PASSWORD 和 MSTEAMS_TENANT_ID。

3

设置消息端点并启用 Teams 渠道

在 Azure Portal 中,导航到你的 Bot 资源 → Configuration。将消息端点设置为 'https://<your-domain>/api/messages'。然后前往 Channels → Add Microsoft Teams → Configure。本地开发时,使用隧道工具(ngrok 或 Tailscale Funnel)暴露端口 3978。

4

创建并安装 Teams 应用

创建 manifest.json,将你的机器人 App ID 作为 botId,设置 scopes(personal、team、groupChat)和 RSC 权限。将其与 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 → Webhook POST 到你的 Gateway(端口 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 → 你的机器人应用 → Certificates & secrets 中,创建新的客户端密钥。立即复制该值(它只显示一次)。 3. 记录凭据——Overview 页面中的 App (client) ID、客户端密钥值和 Directory (tenant) ID。这三个值是你的机器人身份验证凭据。 4. 设置消息端点——在 Bot 资源 → Configuration 中,将端点设置为 'https://<your-domain>/api/messages'。这是 Teams 发送 Webhook 事件的地址。 5. 启用 Teams 渠道——前往 Channels → Add channel → 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 应用清单与 RSC 权限

Teams 应用清单(manifest.json)定义了你的机器人身份、作用域和权限。它与两个图标一起打包成 .zip 文件进行安装。 清单要素: • botId——你的 Azure Bot 的 App ID • Scopes——personal(私信)、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)策略控制谁可以在个人聊天中与你的机器人互动。OpenClaw 支持四种策略: • pairing(默认)——新用户向机器人发消息时会收到一个随机配对码。在终端中运行 'openclaw pairing approve msteams <code>' 进行批准。批准后即可自由聊天。 • allowlist——仅 allowFrom 列表中的用户可以向机器人发消息。支持 AAD 对象 ID、UPN(user@org.com)或显示名称。 • open——你的租户中的任何 Teams 用户都可以向机器人发消息。需要在 allowFrom 中添加 '*' 作为安全确认。 • disabled——完全关闭私信功能。 Teams 通过 AAD(Azure AD)对象 ID、UPN 或显示名称识别用户。你可以在用户发送消息时从 Gateway 日志中找到这些信息,或在 Azure Portal 的 Azure Active Directory → Users 中查找。
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 频道和群组聊天维护独立的对话上下文。每个对话有自己的会话和历史记录,与私信和其他对话隔离。 按团队和按频道的覆盖配置允许精细控制。你可以为每个团队甚至团队内的各个频道设置不同的 replyStyle、requireMention 和工具配置。
openclaw.json
{
  "channels": {
    "msteams": {
      "groupPolicy": "allowlist",
      "groupAllowFrom": ["user@org.com"],
      "teams": {
        "My Team": {
          "channels": {
            "General": {
              "requireMention": true
            }
          }
        }
      }
    }
  }
}
可以使用团队和频道的显示名称或对话 ID(19:...@thread.tacv2)作为 teams 配置中的键。
按频道的覆盖配置继承自父团队配置,父团队配置又继承自全局 msteams 配置。

回复样式与线程

Teams 为频道提供两种不同的 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 时,共享文件链接是组织范围的。有了该权限后,共享将限制为当前聊天的成员。 入站附件会被 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 Card 操作收集,存储在本地 ~/.openclaw/msteams-polls.json 中 • Gateway 必须保持在线才能收集投票 自定义 Adaptive Cards: • 通过 CLI 发送任意 Adaptive Cards:openclaw message send --channel msteams --target "conversation:<id>" --card '{...}' • 卡片支持 Adaptive Card schema 版本 1.5 • 可包含文本块、图片、操作按钮、输入字段等 格式说明: • 普通消息支持基本 markdown(粗体、斜体、代码、链接) • 复杂表格和深层嵌套列表可能无法正确渲染 • 对于丰富的布局,请使用 Adaptive Cards 而非 markdown 格式
使用 Adaptive Cards Designer(adaptivecards.io/designer)在发送前构建和预览自定义卡片布局。
Adaptive Cards 操作可以触发 postback 事件,OpenClaw 会将其作为用户输入进行处理。

Teams ID 提取

Teams URL 包含多个 ID,但并非所有 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"

控制谁可以向机器人发送私信。选项:pairing、allowlist、open、disabled

allowFrom
Type: string[]Default: []

允许向机器人发送私信的 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 上下文包含的最近私信消息数量

historyLimit
Type: numberDefault: 50

作为 AI 上下文包含的最大频道/群组消息数量

Microsoft Teams 常见问题

Microsoft Teams 故障排查

频道消息中缺少图片和附件

Graph API 权限未授予或缺少管理员同意。机器人收到的是内容占位符而非实际文件。

确保你的应用注册拥有 ChannelMessage.Read.All 和 Chat.Read.All Graph 权限并已获得管理员同意。更新权限后重新安装 Teams 应用。完全退出并重新打开 Teams 客户端以刷新缓存的权限。
机器人在频道中不响应(仅在私信中有效)

机器人默认在频道和群组聊天中需要 @提及,或者 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 令牌的情况下手动测试。

验证三个凭据是否与 Azure Portal 中的值完全匹配。使用 Azure 内置的 Web Chat(在 Bot 资源 → Test in Web Chat 中)测试机器人,确认机器人正常工作后再排查 Teams 特定的问题。确保你的 tenantId 与注册机器人时所在的目录匹配。
机器人在私有频道中不工作

Microsoft Teams 过去对私有频道的机器人支持有限。自 2026 年初起,微软正在逐步推出私有频道的完整应用支持,但可能尚未在所有租户中可用。

请检查你的租户是否已收到私有频道应用支持更新。如果尚未可用,请改用标准(公开)频道、群组聊天或私信。应用必须单独添加到每个私有频道——在团队级别安装不会自动应用到私有频道。