OpenClaw

Canal Microsoft Teams do OpenClaw

Empresarial
Médio

Conecte o OpenClaw ao Microsoft Teams usando o Bot Framework por meio de um Azure Bot Resource. Essa integração baseada em plugin permite que seu assistente de IA opere no Teams — lidando com DMs pessoais, chats em grupo e conversas em canais. O OpenClaw recebe eventos de webhook do Bot Framework em /api/messages e responde pela API de mensagens do Teams, suportando respostas em threads, Adaptive Cards, reações, compartilhamento de arquivos via SharePoint e substituições de configuração por equipe/canal.

Info rápida
DificuldadeMédio
CategoriaEmpresarial
Recursos suportados5 / 6

Microsoft Teams Recursos suportados

Mensagens de texto

Suportado

Mídia e arquivos

Suportado

Reações

Suportado

Threads

Suportado

Mensagens de voz

Não suportado

Chat em grupo

Suportado

Microsoft Teams Pré-requisitos

  • Uma conta Azure com permissões para criar um recurso Azure Bot
  • Um Azure Bot registrado com App ID, App Password (client secret) e Tenant ID (single-tenant recomendado)
  • Um Teams App Manifest (manifest.json) com configuração do bot, escopos e ícones (outline.png 32×32, color.png 192×192)
  • OpenClaw Gateway em execução e acessível via URL HTTPS pública ou túnel (porta padrão do webhook 3978)
  • O plugin do Teams instalado: openclaw plugins install @openclaw/msteams

Microsoft Teams Configuração rápida

1

Criar um recurso Azure Bot

Acesse o Portal Azure → Criar um recurso → Pesquise 'Azure Bot'. Crie com o tipo Single Tenant. No App Registration, gere um client secret. Copie o App ID, client secret e Tenant ID — você precisará dos três para a configuração do OpenClaw.

2

Instalar o plugin do Teams e configurar

Execute 'openclaw plugins install @openclaw/msteams' para instalar o plugin. Adicione a configuração do canal Teams ao seu openclaw.json com appId, appPassword e tenantId. Você também pode usar as variáveis de ambiente MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD e MSTEAMS_TENANT_ID.

3

Definir o endpoint de mensagens e habilitar o canal Teams

No Portal Azure, navegue até seu recurso Bot → Configuration. Defina o endpoint de mensagens como 'https://<your-domain>/api/messages'. Em seguida, vá para Channels → Add Microsoft Teams → Configure. Para desenvolvimento local, use um túnel (ngrok ou Tailscale Funnel) para expor a porta 3978.

4

Criar e instalar o Teams App

Crie um manifest.json com o App ID do seu bot como botId, escopos (personal, team, groupChat) e permissões RSC. Compacte-o em zip com outline.png e color.png. Faça upload pelo Teams Developer Portal ou Teams Admin Center. Para testes, faça sideload do pacote do app.

5

Testar o bot

Encontre seu bot no Teams e envie uma mensagem direta. Se estiver usando a política de pareamento padrão, aprove o remetente via 'openclaw pairing approve msteams <code>' no seu terminal. O bot deverá responder com respostas geradas por IA.

Microsoft Teams Exemplo de configuração

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 Documentação Detalhada

Visão Geral da Arquitetura

O OpenClaw se integra ao Microsoft Teams por meio do Azure Bot Framework — uma arquitetura baseada em webhook onde o Teams encaminha mensagens para o endpoint /api/messages do seu Gateway, e o OpenClaw responde pela API REST do Bot Framework. O fluxo é: Usuário envia mensagem no Teams → Bot Framework Service → webhook POST para seu Gateway (porta 3978) → OpenClaw processa com IA → resposta via API do Bot Framework → Teams entrega a resposta. O plugin do Teams é instalado separadamente via 'openclaw plugins install @openclaw/msteams'. Essa abordagem modular mantém o Gateway principal leve enquanto permite que recursos específicos do Teams (Adaptive Cards, uploads de arquivos via SharePoint, permissões RSC) sejam mantidos independentemente. A autenticação usa Azure AD: o Bot Framework valida tokens JWT nas requisições de webhook recebidas, e o OpenClaw autentica chamadas de API de saída usando seu App ID e App Password. A configuração single-tenant é recomendada para segurança, restringindo o bot ao diretório Azure AD da sua organização.
Seu Gateway deve ser acessível via URL HTTPS pública. Para desenvolvimento local, use ngrok ou Tailscale Funnel para criar um túnel para a porta 3978.
Bots single-tenant são recomendados em vez de multi-tenant para segurança organizacional — eles apenas aceitam tokens do seu diretório Azure AD.

Configuração do Azure Bot e App Registration

Configurar o bot do Teams requer a criação de recursos no Portal Azure: 1. Criar um recurso Azure Bot — Pesquise 'Azure Bot' no marketplace. Selecione Single Tenant como tipo de bot. Isso cria tanto o recurso Bot quanto um App Registration. 2. Gerar um client secret — Em App Registrations → seu app do bot → Certificates & secrets, crie um novo client secret. Copie o valor imediatamente (ele só é exibido uma vez). 3. Anote as credenciais — App (client) ID da página Overview, o valor do client secret e Directory (tenant) ID. Esses três valores são as credenciais de autenticação do seu bot. 4. Definir o endpoint de mensagens — No recurso Bot → Configuration, defina o endpoint como 'https://<your-domain>/api/messages'. É para onde o Teams envia os eventos de webhook. 5. Habilitar o canal Teams — Vá para Channels → Add channel → Microsoft Teams. Configure e salve. Variáveis de ambiente podem ser usadas em vez de valores no arquivo de configuração: MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
openclaw.json
{
  "channels": {
    "msteams": {
      "appId": "<APP_ID>",
      "appPassword": "<APP_PASSWORD>",
      "tenantId": "<TENANT_ID>"
    }
  }
}
Mantenha seu App Password seguro. Nunca faça commit dele no controle de versão. Use variáveis de ambiente (MSTEAMS_APP_PASSWORD) para implantações em produção. Faça a rotação do client secret periodicamente no Portal Azure.

Teams App Manifest e Permissões RSC

O Teams App Manifest (manifest.json) define a identidade, escopos e permissões do seu bot. Ele é empacotado com dois ícones em um arquivo .zip para instalação. Elementos essenciais do manifest: • botId — O App ID do seu Azure Bot • Scopes — personal (DMs), team (canais), groupChat (conversas em grupo) • supportsFiles: true — Habilitar cartões de consentimento de arquivo em chat pessoal • Permissões Resource-Specific Consent (RSC) — Permitir que o bot receba mensagens sem @mention Permissões RSC para canais (escopo team): • ChannelMessage.Read.Group — Receber mensagens do canal sem @mention • ChannelMessage.Send.Group — Enviar mensagens para canais • TeamMember.Read.Group, TeamSettings.Read.Group — Ler metadados da equipe Permissões RSC para chats em grupo: • ChatMessage.Read.Chat — Receber mensagens de chat em grupo sem @mention Ícones obrigatórios: • outline.png — 32×32 pixels, fundo transparente • color.png — 192×192 pixels, ícone colorido do app Compacte manifest.json + ambos os ícones em um zip, depois faça upload pelo Teams Developer Portal, Teams Admin Center ou faça sideload para testes.
Ao atualizar um app instalado (ex: adicionando permissões RSC), incremente o campo version no manifest.json, recompacte em zip, faça novo upload e reinstale em cada equipe.
Após instalar ou atualizar o app, feche completamente e reinicie o cliente Teams para garantir que as novas permissões entrem em vigor.

Políticas de DM

As políticas de DM (Mensagem Direta) controlam quem pode interagir com seu bot em chat pessoal. O OpenClaw suporta quatro políticas: • pairing (padrão) — Novos usuários que enviam mensagem ao bot recebem um código de pareamento aleatório. Aprove via 'openclaw pairing approve msteams <code>' no seu terminal. Uma vez aprovados, podem conversar livremente. • allowlist — Apenas usuários listados em allowFrom podem enviar mensagens ao bot. Suporta AAD object IDs, UPNs (user@org.com) ou nomes de exibição. • open — Qualquer usuário do Teams no seu tenant pode enviar mensagens ao bot. Requer adicionar '*' ao allowFrom como confirmação de segurança. • disabled — A funcionalidade de DM está completamente desativada. O Teams identifica usuários por AAD (Azure AD) object IDs, UPNs ou nomes de exibição. Você pode encontrá-los nos logs do Gateway quando os usuários enviam mensagens, ou consultá-los no Portal Azure em Azure Active Directory → Users.
openclaw.json
{
  "channels": {
    "msteams": {
      "dmPolicy": "allowlist",
      "allowFrom": [
        "user@org.com",
        "40a1a0ed-4ff2-4164-a219-55518990c197"
      ]
    }
  }
}
O formato UPN (user@org.com) é geralmente o mais conveniente para listas de permissão. AAD object IDs são mais estáveis caso os usuários possam mudar seus endereços de e-mail.
Use 'openclaw pairing list msteams' para ver todas as solicitações de pareamento pendentes e seus códigos.

Gerenciamento de Chats em Grupo e Canais

O OpenClaw suporta tanto canais do Teams (dentro de uma Equipe) quanto chats em grupo, cada um com controle de acesso configurável: • disabled (padrão para grupos) — Ignorar todas as mensagens de grupo/canal • allowlist — Apenas remetentes aprovados (via groupAllowFrom) podem acionar o bot • open — Responder a mensagens de todos os membros do grupo ou participantes do canal Por padrão, o bot requer @mention em canais e chats em grupo (requireMention: true). Defina requireMention como false para que o bot responda a todas as mensagens, ou configure permissões RSC para receber mensagens sem ser mencionado. Canais do Teams e chats em grupo mantêm contextos de conversa separados. Cada conversa tem sua própria sessão e histórico, isolados das DMs e de outras conversas. Substituições por equipe e por canal permitem controle granular. Você pode definir diferentes replyStyle, requireMention e configurações de ferramentas para cada equipe ou até canais individuais dentro de uma equipe.
openclaw.json
{
  "channels": {
    "msteams": {
      "groupPolicy": "allowlist",
      "groupAllowFrom": ["user@org.com"],
      "teams": {
        "My Team": {
          "channels": {
            "General": {
              "requireMention": true
            }
          }
        }
      }
    }
  }
}
Use nomes de exibição de equipes e canais ou IDs de conversa (19:...@thread.tacv2) como chaves na configuração de teams.
Substituições por canal herdam da configuração da equipe pai, que herda da configuração global do msteams.

Estilos de Resposta e Threading

O Teams oferece dois layouts distintos de UI para canais, e o comportamento de resposta do OpenClaw deve corresponder: • Posts (layout clássico) — Usa respostas em thread sob mensagens raiz. Defina replyStyle como 'thread' (padrão). A resposta do bot aparece como uma resposta ao cartão da mensagem original. • Threads (layout estilo Slack) — Usa fluxo linear de mensagens. Defina replyStyle como 'top-level'. O bot envia uma nova mensagem de nível superior em vez de criar thread. A API do Teams não expõe qual layout um canal usa, então você deve configurar replyStyle para corresponder. Configurações incompatíveis não causarão erros, mas podem resultar em fluxo de conversa subótimo. O estilo de resposta pode ser configurado globalmente, por equipe ou por canal. Isso permite que você corresponda diferentes layouts em diferentes canais na mesma organização do Teams.
openclaw.json
{
  "channels": {
    "msteams": {
      "replyStyle": "thread",
      "teams": {
        "19:abc...@thread.tacv2": {
          "channels": {
            "19:xyz...@thread.tacv2": {
              "replyStyle": "top-level"
            }
          }
        }
      }
    }
  }
}

Manipulação de Arquivos e SharePoint

O OpenClaw suporta compartilhamento de arquivos no Teams com comportamento diferente baseado no tipo de chat: Chats pessoais: • Fluxo integrado de FileConsentCard — nenhuma configuração adicional necessária. O bot envia um cartão de consentimento de arquivo, o usuário aprova e o arquivo é enviado. Chats em grupo e canais: • Requer permissão do Microsoft Graph: Sites.ReadWrite.All • Opcional: Chat.Read.All para links de compartilhamento por usuário (restringe acesso apenas aos membros do chat) • Configure sharePointSiteId para especificar o site SharePoint para uploads de arquivos • Arquivos são armazenados na pasta /OpenClawShared/ na biblioteca de documentos do SharePoint Sem Chat.Read.All, os links de arquivos compartilhados são para toda a organização. Com ele, o compartilhamento é restrito aos membros do chat atual. Anexos recebidos são automaticamente baixados e processados pelo Gateway. As configurações mediaAllowHosts e mediaAuthAllowHosts controlam quais domínios são confiáveis para download de anexos.
openclaw.json
{
  "channels": {
    "msteams": {
      "sharePointSiteId": "YOUR_SHAREPOINT_SITE_ID",
      "mediaAllowHosts": ["*.microsoft.com", "*.sharepoint.com"],
      "mediaAuthAllowHosts": ["graph.microsoft.com"]
    }
  }
}
As permissões da Graph API (Sites.ReadWrite.All, Chat.Read.All) requerem consentimento do administrador no seu tenant Azure AD. Trabalhe com seu administrador de TI para conceder essas permissões.

Adaptive Cards e Enquetes

O Microsoft Teams suporta Adaptive Cards — layouts ricos e interativos baseados em cartões que vão além de texto simples. O OpenClaw os utiliza para interações aprimoradas do bot: Enquetes: • Crie enquetes via 'openclaw message poll --channel msteams --target conversation:<id>' • Votos são coletados por meio de ações de Adaptive Card e armazenados localmente em ~/.openclaw/msteams-polls.json • O Gateway deve permanecer online para coletar votos Adaptive Cards personalizados: • Envie Adaptive Cards arbitrários via CLI: openclaw message send --channel msteams --target "conversation:<id>" --card '{...}' • Cards suportam o esquema Adaptive Card versão 1.5 • Podem incluir blocos de texto, imagens, botões de ação, campos de entrada e mais Notas de formatação: • Markdown básico (negrito, itálico, código, links) é suportado em mensagens regulares • Tabelas complexas e listas profundamente aninhadas podem não renderizar corretamente • Para layouts ricos, use Adaptive Cards em vez de formatação markdown
Use o Adaptive Cards Designer (adaptivecards.io/designer) para criar e visualizar layouts de cartões personalizados antes de enviá-los.
Ações de Adaptive Cards podem disparar eventos de postback que o OpenClaw processa como entrada do usuário.

Extração de IDs do Teams

As URLs do Teams contêm múltiplos IDs, mas nem todos são os que você precisa para configuração. Veja como extrair os IDs corretos: Team ID — Encontrado no caminho da URL (não no parâmetro de consulta groupId): https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/... → Decodifique a URL '19%3ABk4j...%40thread.tacv2' para obter o team ID Channel ID — Também no caminho da URL: https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/... → Decodifique a URL para obter o ID da conversa do canal Alvos de usuário para comandos CLI: • Por AAD ID: user:40a1a0ed-4ff2-4164-a219-55518990c197 • Por nome de exibição: user:John Smith • Conversa: conversation:19:abc...@thread.tacv2 • Raw (se contém @thread): 19:abc...@thread.tacv2
NÃO use o parâmetro de consulta 'groupId' das URLs do Teams — ele é o ID do Grupo Microsoft 365, não o ID de conversa do Teams. Sempre extraia IDs do caminho da URL e decodifique-os.

Microsoft Teams Referência de Configuração

enabled
Type: booleanDefault: true

Ativar ou desativar o canal Microsoft Teams

appId
Type: stringDefault: ""

Azure Bot App ID (Microsoft App ID). Também pode usar a variável de ambiente MSTEAMS_APP_ID

appPassword
Type: stringDefault: ""

Client secret do Azure Bot. Também pode usar a variável de ambiente MSTEAMS_APP_PASSWORD

tenantId
Type: stringDefault: ""

Azure AD Tenant ID para autenticação single-tenant. Também pode usar a variável de ambiente MSTEAMS_TENANT_ID

webhook.port
Type: numberDefault: 3978

Porta para o listener de webhook que recebe eventos do Bot Framework

webhook.path
Type: stringDefault: "/api/messages"

Caminho do endpoint de webhook para mensagens recebidas do Bot Framework

dmPolicy
Type: stringDefault: "pairing"

Controla quem pode enviar DM ao bot. Opções: pairing, allowlist, open, disabled

allowFrom
Type: string[]Default: []

AAD object IDs, UPNs ou nomes de exibição autorizados a enviar DM ao bot (quando dmPolicy é allowlist)

groupPolicy
Type: stringDefault: "allowlist"

Controle de acesso a grupos/canais. Opções: allowlist, open, disabled

groupAllowFrom
Type: string[]Default: []

Remetentes permitidos em chats em grupo. Usa allowFrom como fallback se não definido

teams
Type: objectDefault: {}

Substituições de configuração por equipe e por canal (replyStyle, requireMention, tools)

requireMention
Type: booleanDefault: true

Exigir @mention em canais e chats em grupo. Defina false com permissões RSC para responder a todas as mensagens

replyStyle
Type: stringDefault: "thread"

Estilo de layout de resposta. Opções: thread (Posts clássico), top-level (Threads estilo Slack)

configWrites
Type: booleanDefault: true

Permitir que comandos /config set|unset modifiquem configurações do canal em tempo de execução

textChunkLimit
Type: numberDefault:

Máximo de caracteres por mensagem enviada antes da fragmentação

chunkMode
Type: stringDefault: "length"

Estratégia de fragmentação de texto. Opções: length (divisão rígida), newline (ciente de parágrafos)

sharePointSiteId
Type: stringDefault: ""

ID do site SharePoint para uploads de arquivos em chats em grupo/canais

mediaAllowHosts
Type: string[]Default: MS/Teams domains

Hosts permitidos para download de anexos de mídia

mediaAuthAllowHosts
Type: string[]Default: Graph + Bot Framework

Hosts que recebem cabeçalhos Authorization ao baixar mídia

dmHistoryLimit
Type: numberDefault: 50

Número de mensagens de DM recentes incluídas como contexto da IA por conversa

historyLimit
Type: numberDefault: 50

Máximo de mensagens de canal/grupo incluídas como contexto da IA

Microsoft Teams Perguntas Frequentes

Microsoft Teams Solução de Problemas

Imagens e anexos estão faltando nas mensagens do canal

As permissões da Graph API não foram concedidas ou o consentimento do administrador está ausente. O bot recebe um stub de conteúdo em vez do arquivo real.

Certifique-se de que seu app registration tem as permissões do Graph ChannelMessage.Read.All e Chat.Read.All com consentimento do administrador. Reinstale o app do Teams após atualizar as permissões. Feche completamente e reabra o cliente Teams para atualizar as permissões em cache.
O bot não responde em canais (só funciona em DMs)

O bot requer @mention por padrão em canais e chats em grupo, ou as permissões RSC não estão configuradas.

Faça @mention do bot nas mensagens do canal, ou defina requireMention: false na sua configuração e adicione a permissão RSC ChannelMessage.Read.Group ao manifest do seu app. Reinstale o app em cada equipe após atualizar o manifest.
O manifest do Teams App não atualiza após alterações

O Teams armazena metadados do app em cache de forma agressiva. O manifest antigo ainda está em uso.

Incremente o campo version no manifest.json (ex: 1.0.0 → 1.1.0), recompacte o pacote em zip, remova o app antigo do Teams, reinstale o pacote atualizado e feche completamente e reinicie o cliente Teams.
Erros 401 Unauthorized no endpoint do webhook

O appId, appPassword ou tenantId na configuração do OpenClaw não correspondem ao registro do Azure Bot, ou está testando manualmente sem tokens JWT do Azure adequados.

Verifique se as três credenciais correspondem exatamente aos valores do Portal Azure. Teste seu bot usando o Web Chat integrado do Azure (no recurso Bot → Test in Web Chat) para confirmar que o bot funciona antes de resolver problemas específicos do Teams. Certifique-se de que seu tenantId corresponde ao diretório onde o bot foi registrado.
O bot não funciona em canais privados

O Microsoft Teams historicamente tinha suporte limitado a bots em canais privados. Desde o início de 2026, a Microsoft está implantando suporte completo a aplicativos em canais privados, mas pode ainda não estar disponível em todos os tenants.

Verifique se seu tenant recebeu a atualização de suporte a aplicativos em canais privados. Se ainda não estiver disponível, use canais padrão (públicos), chats em grupo ou DMs. Os aplicativos devem ser adicionados explicitamente a cada canal privado — a instalação no nível da equipe não se aplica automaticamente aos canais privados.