跳转至

Manifest 和权限

Teams 应用清单、其声明的资源特定同意权限,以及用于解锁媒体和历史记录的 Microsoft Graph 权限。

当前 Teams RSC 权限(manifest)

这些是我们 Teams 应用清单中现有的 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 CLI 添加 RSC 权限:

teams app rsc add <teamsAppId> ChannelMessage.Read.Group --type Application

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 注意事项(必备字段)

  • bots[].botId 必须与 Azure Bot App ID 匹配。
  • webApplicationInfo.id 必须与 Azure Bot App ID 匹配。
  • bots[].scopes 必须包含你计划使用的界面(personal、team、groupChat)。
  • bots[].supportsFiles: true 是 personal 作用域中文件处理所必需的。
  • authorization.permissions.resourceSpecific 必须包含频道读取/发送,以处理频道流量。

更新现有应用

# Download, edit, and re-upload the manifest
teams app manifest download <teamsAppId> manifest.json
# Edit manifest.json locally...
teams app manifest upload manifest.json <teamsAppId>
# Version is auto-bumped if content changed

更新后,请在每个团队中重新安装该应用,并完全退出并重新启动 Teams(不仅仅是关闭窗口),以清除缓存的应用元数据。

手动更新 manifest(不使用 CLI)
  1. 使用新设置更新 manifest.json。
  2. 递增 version 字段(例如,1.0.0 → 1.1.0)。
  3. 重新压缩 manifest 和图标(manifest.json、outline.png、color.png)。
  4. 上传新的 zip:
  5. Teams Admin Center: Teams 应用 → 管理应用 → 找到你的应用 → 上传新版本。
  6. Sideload: Teams → 应用 → 管理你的应用 → 上传自定义应用。

功能:仅 RSC 与 Graph

仅使用 Teams RSC(应用已安装,无 Graph API 权限)

可用:

  • 读取频道消息的文本内容。
  • 发送频道消息的文本内容。
  • 接收个人(DM)文件附件。

不可用:

  • 频道/群组图像或文件内容(payload 仅包含一个 HTML 存根)。
  • 下载存储在 SharePoint/OneDrive 中的附件。
  • 读取实时 webhook 事件之外的消息历史记录。

使用 Teams RSC + Microsoft Graph 应用程序权限

新增:

  • 下载托管内容(粘贴到消息中的图像)。
  • 下载存储在 SharePoint/OneDrive 中的文件附件。
  • 通过 Graph 读取频道/聊天消息历史记录。

RSC 与 Graph API

功能 RSC 权限 Graph API
实时消息 是(通过 webhook) 否(仅轮询)
历史消息 否 是(可查询历史记录)
设置复杂度 仅需应用清单 需要管理员同意 + token 流程
离线可用 否(必须正在运行) 是(可随时查询)

结论: RSC 用于实时监听;Graph API 用于历史访问。若要补全离线期间错过的消息,你需要带有 ChannelMessage.Read.All 的 Graph API(需要管理员同意)。

Graph 支持的媒体 + 历史记录

仅启用你使用的 Teams 作用域和数据所需的 Microsoft Graph 应用程序权限:

  1. Entra ID(Azure AD)应用注册 → 添加 Graph 应用程序权限:
  2. ChannelMessage.Read.All 用于频道附件和频道历史记录。
  3. Chat.Read.All 用于群聊附件和群聊历史记录。
  4. Files.Read.All 当必须从 SharePoint/OneDrive 存储下载附件字节时使用;仅历史记录的设置不需要它。
  5. 为租户授予管理员同意。
  6. 提升 Teams 应用的manifest 版本,重新上传,并在 Teams 中重新安装应用。
  7. 完全退出并重新启动 Teams,以清除缓存的应用元数据。

频道/群组文件恢复(graphMediaFallback)

Teams 可以从发送给机器人的 HTML 活动中移除文件标记。在这种情况下,Bot Framework 活动与普通 HTML 消息无法区分;完整的附件引用仅存在于该消息的 Graph 副本中。

在授予上述权限后,启用回退机制:

{
  channels: {
    msteams: {
      graphMediaFallback: true,
    },
  },
}

此设置仅适用于频道和群组聊天。每当 HTML 活动未产生可直接下载的媒体时,它会额外执行一次 Graph 消息查找,包括普通消息或仅包含提及的消息。默认值为 false,因此现有安装不会自动产生额外的 Graph 流量或权限错误。

用户提及: 对于已在对话中的用户,@mentions 开箱即用。若要动态搜索并提及不在当前对话中的用户,请添加 User.Read.All(Application)权限并授予管理员同意。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw