Microsoft Teams (плагин)
«Оставь надежду всяк сюда входящий».Обновлено: 2026-01-21 Статус: поддерживаются текст и вложения в личных сообщениях; отправка файлов в каналы/группы требует
sharePointSiteId + разрешений Graph (см. Отправка файлов в групповых чатах). Опросы отправляются через Adaptive Cards.
Требуется плагин
Microsoft Teams поставляется как плагин и не входит в базовую установку. Критическое изменение (2026.1.15): MS Teams вынесен из ядра. Если вы его используете, необходимо установить плагин. Объяснимо: это делает базовые установки легче и позволяет зависимостям MS Teams обновляться независимо. Установка через CLI (реестр npm):Быстрая настройка (для начинающих)
- Установите плагин Microsoft Teams.
- Создайте Azure Bot (App ID + client secret + tenant ID).
- Настройте OpenClaw с этими учетными данными.
- Опубликуйте
/api/messages(по умолчанию порт 3978) через публичный URL или туннель. - Установите пакет приложения Teams и запустите Gateway (шлюз).
channels.msteams.groupPolicy: "allowlist"). Чтобы разрешить ответы в группах, установите channels.msteams.groupAllowFrom (или используйте groupPolicy: "open", чтобы разрешить любого участника, с обязательным упоминанием).
Цели
- Общение с OpenClaw через личные сообщения Teams, групповые чаты или каналы.
- Детерминированная маршрутизация: ответы всегда возвращаются в тот же канал, откуда пришли.
- Безопасное поведение каналов по умолчанию (требуются упоминания, если не настроено иначе).
Запись конфига
По умолчанию Microsoft Teams разрешено записывать обновления конфига, инициированные/config set|unset (требуется commands.config: true).
Отключить:
Контроль доступа (личные сообщения + группы)
Доступ к личным сообщениям- По умолчанию:
channels.msteams.dmPolicy = "pairing". Неизвестные отправители игнорируются до одобрения. channels.msteams.allowFromпринимает AAD object ID, UPN или отображаемые имена. Мастер настраивания разрешает имена в ID через Microsoft Graph при наличии учетных данных.
- По умолчанию:
channels.msteams.groupPolicy = "allowlist"(заблокировано, пока вы не добавитеgroupAllowFrom). Используйтеchannels.defaults.groupPolicyдля переопределения значения по умолчанию, если оно не задано. channels.msteams.groupAllowFromуправляет тем, какие отправители могут инициировать события в групповых чатах/каналах (с откатом кchannels.msteams.allowFrom).- Установите
groupPolicy: "open", чтобы разрешить любого участника (по умолчанию все равно требуется упоминание). - Чтобы запретить все каналы, установите
channels.msteams.groupPolicy: "disabled".
- Ограничивайте ответы в группах/каналах, перечисляя команды и каналы в
channels.msteams.teams. - Ключами могут быть ID или имена команд; ключами каналов — ID диалогов или имена.
- Когда включен
groupPolicy="allowlist"и присутствует allowlist команд, принимаются только перечисленные команды/каналы (с обязательным упоминанием). - Мастер конфигурации принимает записи
Team/Channelи сохраняет их за вас. - При запуске OpenClaw разрешает имена команд/каналов и пользователей из allowlist в ID (если позволяют разрешения Graph) и логирует сопоставление; неразрешённые записи сохраняются как введены.
Как это работает
- Установите плагин Microsoft Teams.
- Создайте Azure Bot (App ID + secret + tenant ID).
- Соберите пакет приложения Teams, который ссылается на бота и включает разрешения RSC ниже.
- Загрузите/установите приложение Teams в команду (или в личную область для личных сообщений).
- Настройте
msteamsв~/.openclaw/openclaw.json(или через переменные окружения) и запустите Gateway (шлюз). - Gateway (шлюз) по умолчанию принимает трафик вебхуков Bot Framework на
/api/messages.
Настройка Azure Bot (Предварительные требования)
Перед конфигурацией OpenClaw необходимо создать ресурс Azure Bot.Шаг 1: Создание Azure Bot
- Перейдите на Create Azure Bot
-
Заполните вкладку Basics:
Уведомление об устаревании: Создание новых мультиарендных ботов было прекращено после 2025-07-31. Для новых ботов используйте Single Tenant.
- Нажмите Review + create → Create (подождите ~1–2 минуты)
Шаг 2: Получение учетных данных
- Перейдите в ресурс Azure Bot → Configuration
- Скопируйте Microsoft App ID → это ваш
appId - Нажмите Manage Password → перейдите в App Registration
- В Certificates & secrets → New client secret → скопируйте Value → это ваш
appPassword - Перейдите в Overview → скопируйте Directory (tenant) ID → это ваш
tenantId
Шаг 3: Настройка конечной точки сообщений
- В Azure Bot → Configuration
- Установите Messaging endpoint на URL вашего вебхука:
- Продакшн:
https://your-domain.com/api/messages - Локальная разработка: используйте туннель (см. Локальная разработка ниже)
- Продакшн:
Шаг 4: Включение канала Teams
- В Azure Bot → Channels
- Нажмите Microsoft Teams → Configure → Save
- Примите Условия использования
Локальная разработка (туннелирование)
Teams не может обратиться кlocalhost. Для локальной разработки используйте туннель:
Вариант A: ngrok
Teams Developer Portal (альтернатива)
Вместо ручного создания ZIP-манифеста вы можете использовать Teams Developer Portal:- Нажмите + New app
- Заполните базовую информацию (имя, описание, данные разработчика)
- Перейдите в App features → Bot
- Выберите Enter a bot ID manually и вставьте App ID вашего Azure Bot
- Отметьте области: Personal, Team, Group Chat
- Нажмите Distribute → Download app package
- В Teams: Apps → Manage your apps → Upload a custom app → выберите ZIP
Тестирование бота
Вариант A: Azure Web Chat (сначала проверьте вебхук)- В Azure Portal → ресурс Azure Bot → Test in Web Chat
- Отправьте сообщение — вы должны увидеть ответ
- Это подтверждает, что конечная точка вебхука работает до настройки Teams
- Установите приложение Teams (sideload или каталог организации)
- Найдите бота в Teams и отправьте личное сообщение
- Проверьте логи Gateway (шлюза) на входящую активность
Настройка (минимальная, только текст)
-
Установка плагина Microsoft Teams
- Из npm:
openclaw plugins install @openclaw/msteams - Из локального чекаута:
openclaw plugins install ./extensions/msteams
- Из npm:
-
Регистрация бота
- Создайте Azure Bot (см. выше) и запишите:
- App ID
- Client secret (пароль приложения)
- Tenant ID (single-tenant)
- Создайте Azure Bot (см. выше) и запишите:
-
Манифест приложения Teams
- Добавьте запись
botсbotId = <App ID>. - Области:
personal,team,groupChat. supportsFiles: true(обязательно для обработки файлов в личной области).- Добавьте разрешения RSC (ниже).
- Создайте иконки:
outline.png(32x32) иcolor.png(192x192). - Упакуйте все три файла в ZIP:
manifest.json,outline.png,color.png.
- Добавьте запись
-
Настройка OpenClaw
Вы также можете использовать переменные окружения вместо ключей конфига:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_ID
-
Конечная точка бота
- Установите Messaging Endpoint Azure Bot в:
https://<host>:3978/api/messages(или выбранный вами путь/порт).
- Установите Messaging Endpoint Azure Bot в:
-
Запуск Gateway (шлюза)
- Канал Teams запускается автоматически, когда плагин установлен и существует конфиг
msteamsс учетными данными.
- Канал Teams запускается автоматически, когда плагин установлен и существует конфиг
Контекст истории
channels.msteams.historyLimitуправляет тем, сколько последних сообщений канала/группы включается в prompt.- С откатом к
messages.groupChat.historyLimit. Установите0, чтобы отключить (по умолчанию 50). - История личных сообщений может быть ограничена с помощью
channels.msteams.dmHistoryLimit(повороты пользователя). Переопределения для конкретных пользователей:channels.msteams.dms["<user_id>"].historyLimit.
Текущие разрешения Teams RSC (манифест)
Это существующие resourceSpecific разрешения в нашем манифесте приложения Teams. Они применяются только внутри команды/чата, где установлено приложение. Для каналов (область команды):ChannelMessage.Read.Group(Application) — получение всех сообщений канала без @упоминания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) — получение всех сообщений группового чата без @упоминания
Пример манифеста Teams (сокращённый)
Минимальный, корректный пример с обязательными полями. Замените ID и URL.Ограничения манифеста (обязательные поля)
bots[].botIdдолжен совпадать с Azure Bot App ID.webApplicationInfo.idдолжен совпадать с Azure Bot App ID.bots[].scopesдолжен включать поверхности, которые вы планируете использовать (personal,team,groupChat).bots[].supportsFiles: trueтребуется для обработки файлов в личной области.authorization.permissions.resourceSpecificдолжен включать чтение/отправку каналов, если вы хотите трафик каналов.
Обновление существующего приложения
Чтобы обновить уже установленное приложение Teams (например, для добавления разрешений RSC):- Обновите ваш
manifest.jsonс новыми настройками - Увеличьте поле
version(например,1.0.0→1.1.0) - Переупакуйте ZIP манифеста с иконками (
manifest.json,outline.png,color.png) - Загрузите новый ZIP:
- Вариант A (Teams Admin Center): Teams Admin Center → Teams apps → Manage apps → найдите приложение → Upload new version
- Вариант B (Sideload): В Teams → Apps → Manage your apps → Upload a custom app
- Для каналов команды: переустановите приложение в каждой команде, чтобы новые разрешения вступили в силу
- Полностью закройте и перезапустите Teams (не просто закройте окно), чтобы очистить кэш метаданных приложения
Возможности: только RSC vs Graph
С только Teams RSC (приложение установлено, без разрешений Graph API)
Работает:- Чтение текста сообщений каналов.
- Отправка текста сообщений каналов.
- Получение вложений файлов в личных сообщениях.
- Изображения или файлы в каналах/группах (в полезной нагрузке только HTML-заглушка).
- Загрузка вложений, хранящихся в SharePoint/OneDrive.
- Чтение истории сообщений (кроме события живого вебхука).
С Teams RSC + разрешениями Microsoft Graph (Application)
Добавляется:- Загрузка размещённого контента (изображения, вставленные в сообщения).
- Загрузка файловых вложений из SharePoint/OneDrive.
- Чтение истории сообщений каналов/чатов через Graph.
RSC vs Graph API
Итог: RSC — для прослушивания в реальном времени; Graph API — для доступа к истории. Чтобы догонять пропущенные сообщения в офлайне, нужен Graph API с
ChannelMessage.Read.All (требуется согласие администратора).
Медиа и история с Graph (требуется для каналов)
Если вам нужны изображения/файлы в каналах или получение истории сообщений, необходимо включить разрешения Microsoft Graph и выдать согласие администратора.- В Entra ID (Azure AD) → App Registration добавьте разрешения Microsoft Graph Application:
ChannelMessage.Read.All(вложения каналов + история)Chat.Read.AllилиChatMessage.Read.All(групповые чаты)
- Выдайте согласие администратора для арендатора.
- Увеличьте версию манифеста приложения Teams, повторно загрузите и переустановите приложение в Teams.
- Полностью закройте и перезапустите Teams, чтобы очистить кэш метаданных приложения.
User.Read.All (Application) и предоставьте согласие администратора.
Известные ограничения
Тайм-ауты вебхука
Teams доставляет сообщения через HTTP-вебхук. Если обработка занимает слишком много времени (например, медленные ответы LLM), вы можете увидеть:- Тайм-ауты Gateway (шлюза)
- Повторные попытки Teams (вызывающие дубликаты)
- Потерянные ответы
Форматирование
Markdown в Teams более ограничен, чем в Slack или Discord:- Базовое форматирование работает: жирный, курсив,
code, ссылки - Сложный markdown (таблицы, вложенные списки) может отображаться некорректно
- Adaptive Cards поддерживаются для опросов и произвольных карточек (см. ниже)
Конфигурация
Ключевые настройки (см./gateway/configuration для общих шаблонов каналов):
channels.msteams.enabled: включить/выключить канал.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: учетные данные бота.channels.msteams.webhook.port(по умолчанию3978)channels.msteams.webhook.path(по умолчанию/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(по умолчанию: pairing)channels.msteams.allowFrom: список разрешённых для личных сообщений (AAD object ID, UPN или отображаемые имена). Мастер разрешает имена в ID во время настройки при наличии доступа Graph.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(см. Стиль ответа).channels.msteams.teams.<teamId>.replyStyle: переопределение для команды.channels.msteams.teams.<teamId>.requireMention: переопределение для команды.channels.msteams.teams.<teamId>.tools: значения по умолчанию переопределений политик инструментов для команды (allow/deny/alsoAllow), используемые, когда отсутствует переопределение канала.channels.msteams.teams.<teamId>.toolsBySender: значения по умолчанию переопределений политик инструментов для команды и отправителя ("*"поддерживает wildcard).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: переопределения политик инструментов для канала и отправителя ("*"поддерживает wildcard).channels.msteams.sharePointSiteId: ID сайта SharePoint для загрузки файлов в групповых чатах/каналах (см. Отправка файлов в групповых чатах).
Маршрутизация и сессии
- Ключи сессий следуют стандартному формату агента (см. /concepts/session):
- Личные сообщения используют основную сессию (
agent:<agentId>:<mainKey>). - Сообщения каналов/групп используют ID диалога:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Личные сообщения используют основную сессию (
Стиль ответа: Threads vs Posts
Недавно Teams представил два UI-стиля каналов поверх одной и той же модели данных:
Проблема: API Teams не сообщает, какой UI-стиль используется в канале. Если выбрать неверный
replyStyle:
threadв канале со стилем Threads → ответы выглядят неудачно вложеннымиtop-levelв канале со стилем Posts → ответы появляются как отдельные верхнеуровневые посты, а не в треде
replyStyle для каждого канала в зависимости от его настройки:
Вложения и изображения
Текущие ограничения:- Личные сообщения: изображения и файловые вложения работают через API файлов бота Teams.
- Каналы/группы: вложения хранятся в M365 (SharePoint/OneDrive). Полезная нагрузка вебхука содержит только HTML-заглушку, а не байты файла. Для загрузки вложений каналов требуются разрешения Graph API.
channels.msteams.mediaAllowHosts (используйте ["*"], чтобы разрешить любой хост).
Заголовки Authorization добавляются только для хостов из channels.msteams.mediaAuthAllowHosts (по умолчанию хосты Graph + Bot Framework). Держите этот список строгим (избегайте многопользовательских суффиксов).
Отправка файлов в групповых чатах
Боты могут отправлять файлы в личных сообщениях, используя поток FileConsentCard (встроенный). Однако отправка файлов в групповых чатах/каналах требует дополнительной настройки:Почему группам нужен SharePoint
У ботов нет личного диска OneDrive (конечная точка Graph API/me/drive не работает для application identity). Чтобы отправлять файлы в групповых чатах/каналах, бот загружает их на сайт SharePoint и создаёт ссылку общего доступа.
Настройка
-
Добавьте разрешения Graph API в Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) — загрузка файлов в SharePointChat.Read.All(Application) — необязательно, включает ссылки общего доступа для каждого пользователя
- Выдайте согласие администратора для арендатора.
-
Получите ID сайта SharePoint:
-
Настройте OpenClaw:
Поделиться поведением
Общий доступ для каждого пользователя более безопасен, так как файл доступен только участникам чата. Если отсутствует разрешение
Chat.Read.All, бот использует общий доступ для организации.
Резервное поведение
Место хранения файлов
Загруженные файлы хранятся в папке/OpenClawShared/ в стандартной библиотеке документов настроенного сайта SharePoint.
Опросы (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 (произвольные)
Отправляйте любой JSON Adaptive Card пользователям или в диалоги Teams с помощью инструмента или CLImessage.
Параметр card принимает объект JSON Adaptive Card. При указании card текст сообщения необязателен.
Инструмент агента:
Целевые форматы
Цели MSTeams используют префиксы для различения пользователей и диалогов:
Примеры CLI:
user: имена по умолчанию разрешаются как группы/команды. Всегда используйте user: при обращении к людям по отображаемому имени.
Проактивные сообщения
- Проактивные сообщения возможны только после того, как пользователь взаимодействовал, так как мы сохраняем ссылки диалогов в этот момент.
- См.
/gateway/configurationдляdmPolicyи ограничений allowlist.
ID команд и каналов (частая ошибка)
Параметр запросаgroupId в URL Teams НЕ является ID команды для конфигурации. Извлекайте ID из пути URL:
URL команды:
- ID команды = сегмент пути после
/team/(URL-decoded, например19:[email protected]) - ID канала = сегмент пути после
/channel/(URL-decoded) - Игнорируйте параметр запроса
groupId
Приватные каналы
Поддержка ботов в приватных каналах ограничена:
Обходные пути, если приватные каналы не работают:
- Используйте стандартные каналы для взаимодействия с ботом
- Используйте личные сообщения — пользователи всегда могут написать боту напрямую
- Используйте Graph API для доступа к истории (требуется
ChannelMessage.Read.All)
Распространённые проблемы
Распространённые проблемы
- Изображения не отображаются в каналах: отсутствуют разрешения Graph или согласие администратора. Переустановите приложение Teams и полностью закройте/откройте Teams.
- Нет ответов в канале: по умолчанию требуются упоминания; установите
channels.msteams.requireMention=falseили настройте для команды/канала. - Несоответствие версий (Teams показывает старый манифест): удалите и снова добавьте приложение и полностью перезапустите Teams для обновления.
- 401 Unauthorized от вебхука: ожидаемо при ручном тестировании без JWT Azure — означает, что конечная точка доступна, но аутентификация не прошла. Используйте Azure Web Chat для корректного теста.
Ошибки загрузки манифеста
- «Icon file cannot be empty»: манифест ссылается на иконки нулевого размера. Создайте корректные PNG-иконки (32x32 для
outline.png, 192x192 дляcolor.png). - «webApplicationInfo.Id already in use»: приложение всё ещё установлено в другой команде/чате. Найдите и удалите его или подождите 5–10 минут для распространения.
- «Something went wrong» при загрузке: загрузите через https://admin.teams.microsoft.com, откройте DevTools браузера (F12) → вкладка Network и проверьте тело ответа с фактической ошибкой.
- Сбой sideload: попробуйте «Upload an app to your org’s app catalog» вместо «Upload a custom app» — это часто обходит ограничения sideload.
Разрешения RSC не работают
- Проверьте, что
webApplicationInfo.idточно совпадает с App ID вашего бота - Повторно загрузите приложение и переустановите его в команде/чате
- Убедитесь, что администратор организации не заблокировал разрешения RSC
- Подтвердите, что используется правильная область:
ChannelMessage.Read.Groupдля команд,ChatMessage.Read.Chatдля групповых чатов
Ссылки
- 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