Microsoft Teams
“Abandonai toda esperança, vós que entrais aqui.”Atualizado: 2026-01-21 Status: texto + anexos em DMs são compatíveis; envio de arquivos em canais/grupos requer
sharePointSiteId + permissões do Graph (consulte Envio de arquivos em chats de grupo). Enquetes são enviadas via Adaptive Cards. As ações de mensagem expõem upload-file explícito para envios centrados em arquivos.
Plugin integrado
O Microsoft Teams é distribuído como um plugin integrado nas versões atuais do OpenClaw, portanto nenhuma instalação separada é necessária na compilação empacotada normal. Se você estiver em uma compilação mais antiga ou em uma instalação personalizada que exclui o Teams integrado, instale-o manualmente:Configuração rápida (iniciante)
- Certifique-se de que o plugin do Microsoft Teams esteja disponível.
- As versões empacotadas atuais do OpenClaw já o incluem.
- Instalações mais antigas/personalizadas podem adicioná-lo manualmente com os comandos acima.
- Crie um Azure Bot (App ID + segredo do cliente + tenant ID).
- Configure o OpenClaw com essas credenciais.
- Exponha
/api/messages(porta 3978 por padrão) por meio de uma URL pública ou túnel. - Instale o pacote do app do Teams e inicie o gateway.
channels.msteams.groupPolicy: "allowlist"). Para permitir respostas em grupo, defina channels.msteams.groupAllowFrom (ou use groupPolicy: "open" para permitir qualquer membro, com bloqueio por menção).
Objetivos
- Conversar com o OpenClaw via DMs, chats de grupo ou canais do Teams.
- Manter o roteamento determinístico: as respostas sempre voltam para o canal em que chegaram.
- Adotar um comportamento seguro por padrão nos canais (menções obrigatórias, salvo configuração em contrário).
Gravações de configuração
Por padrão, o Microsoft Teams pode gravar atualizações de configuração acionadas por/config set|unset (requer commands.config: true).
Desative com:
Controle de acesso (DMs + grupos)
Acesso a DMs- Padrão:
channels.msteams.dmPolicy = "pairing". Remetentes desconhecidos são ignorados até serem aprovados. channels.msteams.allowFromdeve usar IDs de objeto AAD estáveis.- UPNs/nomes de exibição são mutáveis; a correspondência direta é desativada por padrão e só é ativada com
channels.msteams.dangerouslyAllowNameMatching: true. - O assistente de configuração pode resolver nomes para IDs via Microsoft Graph quando as credenciais permitem.
- Padrão:
channels.msteams.groupPolicy = "allowlist"(bloqueado a menos que você adicionegroupAllowFrom). Usechannels.defaults.groupPolicypara substituir o padrão quando não estiver definido. channels.msteams.groupAllowFromcontrola quais remetentes podem acionar em chats/canais de grupo (usachannels.msteams.allowFromcomo fallback).- Defina
groupPolicy: "open"para permitir qualquer membro (ainda com bloqueio por menção por padrão). - Para não permitir nenhum canal, defina
channels.msteams.groupPolicy: "disabled".
- Restrinja respostas em grupo/canal listando equipes e canais em
channels.msteams.teams. - As chaves devem usar IDs estáveis de equipe e IDs de conversa de canal.
- Quando
groupPolicy="allowlist"e uma lista de permissões de equipes estiver presente, somente as equipes/canais listados serão aceitos (com bloqueio por menção). - O assistente de configuração aceita entradas
Equipe/Canale as armazena para você. - Na inicialização, o OpenClaw resolve nomes de equipe/canal e de usuários em listas de permissões para IDs (quando as permissões do Graph permitem)
e registra o mapeamento em log; nomes de equipe/canal não resolvidos são mantidos como digitados, mas ignorados para roteamento por padrão, a menos que
channels.msteams.dangerouslyAllowNameMatching: trueesteja ativado.
Como funciona
- Certifique-se de que o plugin do Microsoft Teams esteja disponível.
- As versões empacotadas atuais do OpenClaw já o incluem.
- Instalações mais antigas/personalizadas podem adicioná-lo manualmente com os comandos acima.
- Crie um Azure Bot (App ID + segredo + tenant ID).
- Crie um pacote de app do Teams que faça referência ao bot e inclua as permissões RSC abaixo.
- Envie/instale o app do Teams em uma equipe (ou no escopo pessoal para DMs).
- Configure
msteamsem~/.openclaw/openclaw.json(ou variáveis de ambiente) e inicie o gateway. - O gateway escuta o tráfego de webhook do Bot Framework em
/api/messagespor padrão.
Configuração do Azure Bot (pré-requisitos)
Antes de configurar o OpenClaw, você precisa criar um recurso Azure Bot.Etapa 1: Criar Azure Bot
- Acesse Criar Azure Bot
-
Preencha a aba Basics:
Campo Valor Bot handle Nome do seu bot, por exemplo, openclaw-msteams(deve ser único)Subscription Selecione sua assinatura do Azure Resource group Crie um novo ou use um existente Pricing tier Free para desenvolvimento/testes Type of App Single Tenant (recomendado - veja a observação abaixo) Creation type Create new Microsoft App ID
Aviso de descontinuação: a criação de novos bots multilocatário foi descontinuada após 2025-07-31. Use Single Tenant para novos bots.
- Clique em Review + create → Create (aguarde ~1-2 minutos)
Etapa 2: Obter credenciais
- Acesse seu recurso Azure Bot → Configuration
- Copie Microsoft App ID → este é seu
appId - Clique em Manage Password → vá para o App Registration
- Em Certificates & secrets → New client secret → copie o Value → este é seu
appPassword - Vá em Overview → copie Directory (tenant) ID → este é seu
tenantId
Etapa 3: Configurar o endpoint de mensagens
- Em Azure Bot → Configuration
- Defina Messaging endpoint como a URL do seu webhook:
- Produção:
https://your-domain.com/api/messages - Desenvolvimento local: use um túnel (consulte Desenvolvimento local abaixo)
- Produção:
Etapa 4: Ativar o canal Teams
- Em Azure Bot → Channels
- Clique em Microsoft Teams → Configure → Save
- Aceite os Termos de Serviço
Desenvolvimento local (tunelamento)
O Teams não consegue acessarlocalhost. Use um túnel para desenvolvimento local:
Opção A: ngrok
Teams Developer Portal (alternativa)
Em vez de criar manualmente um ZIP de manifesto, você pode usar o Teams Developer Portal:- Clique em + New app
- Preencha as informações básicas (nome, descrição, informações do desenvolvedor)
- Vá em App features → Bot
- Selecione Enter a bot ID manually e cole o App ID do seu Azure Bot
- Marque os escopos: Personal, Team, Group Chat
- Clique em Distribute → Download app package
- No Teams: Apps → Manage your apps → Upload a custom app → selecione o ZIP
Testando o bot
Opção A: Azure Web Chat (verifique o webhook primeiro)- No Azure Portal → seu recurso Azure Bot → Test in Web Chat
- Envie uma mensagem - você deve ver uma resposta
- Isso confirma que seu endpoint de webhook funciona antes da configuração do Teams
- Instale o app do Teams (sideload ou catálogo da organização)
- Encontre o bot no Teams e envie uma DM
- Verifique os logs do gateway para atividade recebida
Configuração (somente texto mínimo)
-
Certifique-se de que o plugin do Microsoft Teams esteja disponível
- As versões empacotadas atuais do OpenClaw já o incluem.
- Instalações mais antigas/personalizadas podem adicioná-lo manualmente:
- Do npm:
openclaw plugins install @openclaw/msteams - De um checkout local:
openclaw plugins install ./path/to/local/msteams-plugin
- Do npm:
-
Registro do bot
- Crie um Azure Bot (veja acima) e anote:
- App ID
- Segredo do cliente (senha do app)
- Tenant ID (single-tenant)
- Crie um Azure Bot (veja acima) e anote:
-
Manifesto do app do Teams
- Inclua uma entrada
botcombotId = <App ID>. - Escopos:
personal,team,groupChat. supportsFiles: true(obrigatório para manipulação de arquivos no escopo pessoal).- Adicione permissões RSC (abaixo).
- Crie ícones:
outline.png(32x32) ecolor.png(192x192). - Compacte os três arquivos juntos:
manifest.json,outline.png,color.png.
- Inclua uma entrada
-
Configure o OpenClaw
Você também pode usar variáveis de ambiente em vez de chaves de configuração:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_ID
-
Endpoint do bot
- Defina o Azure Bot Messaging Endpoint como:
https://<host>:3978/api/messages(ou o caminho/porta escolhidos).
- Defina o Azure Bot Messaging Endpoint como:
-
Execute o gateway
- O canal Teams é iniciado automaticamente quando o plugin integrado ou instalado manualmente está disponível e a configuração
msteamsexiste com credenciais.
- O canal Teams é iniciado automaticamente quando o plugin integrado ou instalado manualmente está disponível e a configuração
Ação de informações do membro
O OpenClaw expõe uma açãomember-info com suporte do Graph para o Microsoft Teams, para que agentes e automações possam resolver detalhes de membros do canal (nome de exibição, email, função) diretamente do Microsoft Graph.
Requisitos:
- Permissão RSC
Member.Read.Group(já presente no manifesto recomendado) - Para buscas entre equipes: permissão de Aplicativo Graph
User.Read.Allcom consentimento de administrador
channels.msteams.actions.memberInfo (padrão: ativada quando há credenciais do Graph disponíveis).
Contexto do histórico
channels.msteams.historyLimitcontrola quantas mensagens recentes do canal/grupo são incluídas no prompt.- Usa
messages.groupChat.historyLimitcomo fallback. Defina0para desativar (padrão 50). - O histórico da thread obtido é filtrado pelas listas de permissões do remetente (
allowFrom/groupAllowFrom), então a semeadura de contexto da thread inclui apenas mensagens de remetentes permitidos. - O contexto de anexo citado (
ReplyTo*derivado do HTML de resposta do Teams) atualmente é transmitido como recebido. - Em outras palavras, as listas de permissões controlam quem pode acionar o agente; apenas caminhos específicos de contexto suplementar são filtrados atualmente.
- O histórico de DM pode ser limitado com
channels.msteams.dmHistoryLimit(turnos do usuário). Substituições por usuário:channels.msteams.dms["<user_id>"].historyLimit.
Permissões RSC atuais do Teams (manifesto)
Estas são as permissões resourceSpecific existentes no manifesto do nosso app do Teams. Elas se aplicam apenas dentro da equipe/chat onde o app está instalado. Para canais (escopo de equipe):ChannelMessage.Read.Group(Application) - receber todo o conteúdo de texto das mensagens do canal sem @mençãoChannelMessage.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) - receber todas as mensagens de chat em grupo sem @menção
Exemplo de manifesto do Teams (com trechos ocultados)
Exemplo mínimo e válido com os campos obrigatórios. Substitua IDs e URLs.Observações sobre o manifesto (campos obrigatórios)
bots[].botIddeve corresponder ao App ID do Azure Bot.webApplicationInfo.iddeve corresponder ao App ID do Azure Bot.bots[].scopesdeve incluir as superfícies que você pretende usar (personal,team,groupChat).bots[].supportsFiles: trueé obrigatório para manipulação de arquivos no escopo pessoal.authorization.permissions.resourceSpecificdeve incluir leitura/envio de canal se você quiser tráfego de canal.
Atualizando um app existente
Para atualizar um app do Teams já instalado (por exemplo, para adicionar permissões RSC):- Atualize seu
manifest.jsoncom as novas configurações - Incremente o campo
version(por exemplo,1.0.0→1.1.0) - Compacte novamente o manifesto com os ícones (
manifest.json,outline.png,color.png) - Envie o novo zip:
- Opção A (Teams Admin Center): Teams Admin Center → Teams apps → Manage apps → encontre seu app → Upload new version
- Opção B (sideload): No Teams → Apps → Manage your apps → Upload a custom app
- Para canais de equipe: reinstale o app em cada equipe para que as novas permissões entrem em vigor
- Feche totalmente e reabra o Teams (não apenas feche a janela) para limpar os metadados de app em cache
Capacidades: somente RSC vs Graph
Com somente Teams RSC (app instalado, sem permissões da API Graph)
Funciona:- Ler conteúdo de texto de mensagens de canal.
- Enviar conteúdo de texto de mensagens de canal.
- Receber anexos de arquivos em escopo pessoal (DM).
- Conteúdo de imagem ou arquivo de canal/grupo (a carga útil inclui apenas um stub HTML).
- Baixar anexos armazenados no SharePoint/OneDrive.
- Ler histórico de mensagens (além do evento de webhook ao vivo).
Com Teams RSC + permissões de Aplicativo do Microsoft Graph
Adiciona:- Download de conteúdos hospedados (imagens coladas em mensagens).
- Download de anexos de arquivo armazenados no SharePoint/OneDrive.
- Leitura do histórico de mensagens de canal/chat via Graph.
RSC vs API Graph
| Capacidade | Permissões RSC | API Graph |
|---|---|---|
| Mensagens em tempo real | Sim (via webhook) | Não (somente polling) |
| Mensagens históricas | Não | Sim (pode consultar histórico) |
| Complexidade de configuração | Apenas manifesto do app | Requer consentimento de administrador + fluxo de token |
| Funciona offline | Não (deve estar em execução) | Sim (consulta a qualquer momento) |
ChannelMessage.Read.All (requer consentimento de administrador).
Mídia + histórico habilitados por Graph (obrigatório para canais)
Se você precisa de imagens/arquivos em canais ou quer buscar histórico de mensagens, deve ativar permissões do Microsoft Graph e conceder consentimento de administrador.- No App Registration do Entra ID (Azure AD), adicione permissões de Aplicativo do Microsoft Graph:
ChannelMessage.Read.All(anexos de canal + histórico)Chat.Read.AllouChatMessage.Read.All(chats de grupo)
- Conceda consentimento de administrador para o tenant.
- Aumente a versão do manifesto do app do Teams, reenvie-o e reinstale o app no Teams.
- Feche totalmente e reabra o Teams para limpar os metadados de app em cache.
User.Read.All e conceda consentimento de administrador.
Limitações conhecidas
Timeouts de webhook
O Teams entrega mensagens via webhook HTTP. Se o processamento demorar muito (por exemplo, respostas lentas do LLM), você pode ver:- Timeouts do gateway
- O Teams tentando reenviar a mensagem (causando duplicatas)
- Respostas descartadas
Formatação
O markdown do Teams é mais limitado do que no Slack ou Discord:- A formatação básica funciona: negrito, itálico,
code, links - Markdown complexo (tabelas, listas aninhadas) pode não renderizar corretamente
- Adaptive Cards são compatíveis para enquetes e envios arbitrários de cards (consulte abaixo)
Configuração
Configurações principais (consulte/gateway/configuration para padrões compartilhados entre canais):
channels.msteams.enabled: ativa/desativa o canal.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: credenciais do bot.channels.msteams.webhook.port(padrão3978)channels.msteams.webhook.path(padrão/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(padrão: pairing)channels.msteams.allowFrom: lista de permissões de DM (IDs de objeto AAD recomendados). O assistente resolve nomes para IDs durante a configuração quando há acesso ao Graph.channels.msteams.dangerouslyAllowNameMatching: alternância break-glass para reativar correspondência mutável por UPN/nome de exibição e roteamento direto por nome de equipe/canal.channels.msteams.textChunkLimit: tamanho de fragmento de texto de saída.channels.msteams.chunkMode:length(padrão) ounewlinepara dividir em linhas em branco (limites de parágrafo) antes da fragmentação por tamanho.channels.msteams.mediaAllowHosts: lista de permissões para hosts de anexos recebidos (o padrão são domínios Microsoft/Teams).channels.msteams.mediaAuthAllowHosts: lista de permissões para anexar cabeçalhos Authorization em novas tentativas de mídia (o padrão são hosts Graph + Bot Framework).channels.msteams.requireMention: exige @menção em canais/grupos (padrão true).channels.msteams.replyStyle:thread | top-level(consulte Estilo de resposta).channels.msteams.teams.<teamId>.replyStyle: substituição por equipe.channels.msteams.teams.<teamId>.requireMention: substituição por equipe.channels.msteams.teams.<teamId>.tools: substituições padrão de política de ferramentas por equipe (allow/deny/alsoAllow) usadas quando uma substituição de canal está ausente.channels.msteams.teams.<teamId>.toolsBySender: substituições padrão de política de ferramentas por equipe e por remetente (o curinga"*"é compatível).channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: substituição por canal.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: substituição por canal.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: substituições de política de ferramentas por canal (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: substituições de política de ferramentas por canal e por remetente (o curinga"*"é compatível).- As chaves
toolsBySenderdevem usar prefixos explícitos:id:,e164:,username:,name:(chaves legadas sem prefixo ainda são mapeadas somente paraid:). channels.msteams.actions.memberInfo: ativa ou desativa a ação member info com suporte do Graph (padrão: ativada quando há credenciais do Graph disponíveis).channels.msteams.sharePointSiteId: ID do site do SharePoint para uploads de arquivo em chats/canais de grupo (consulte Envio de arquivos em chats de grupo).
Roteamento e sessões
- As chaves de sessão seguem o formato padrão de agente (consulte /concepts/session):
- Mensagens diretas compartilham a sessão principal (
agent:<agentId>:<mainKey>). - Mensagens de canal/grupo usam o ID da conversa:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Mensagens diretas compartilham a sessão principal (
Estilo de resposta: threads vs posts
O Teams introduziu recentemente dois estilos de interface de canal sobre o mesmo modelo de dados subjacente:| Estilo | Descrição | replyStyle recomendado |
|---|---|---|
| Posts (clássico) | As mensagens aparecem como cards com respostas em thread abaixo | thread (padrão) |
| Threads (semelhante ao Slack) | As mensagens fluem linearmente, mais como no Slack | top-level |
replyStyle errado:
threadem um canal estilo Threads → as respostas aparecem aninhadas de forma estranhatop-levelem um canal estilo Posts → as respostas aparecem como posts independentes no nível superior em vez de dentro da thread
replyStyle por canal com base em como o canal está configurado:
Anexos e imagens
Limitações atuais:- DMs: imagens e anexos de arquivo funcionam via APIs de arquivo do bot do Teams.
- Canais/grupos: anexos vivem no armazenamento M365 (SharePoint/OneDrive). A carga útil do webhook inclui apenas um stub HTML, não os bytes reais do arquivo. Permissões da API Graph são obrigatórias para baixar anexos de canal.
- Para envios centrados explicitamente em arquivo, use
action=upload-filecommedia/filePath/path;messageopcional se torna o texto/comentário acompanhante, efilenamesubstitui o nome enviado.
channels.msteams.mediaAllowHosts (use ["*"] para permitir qualquer host).
Cabeçalhos Authorization só são anexados para hosts em channels.msteams.mediaAuthAllowHosts (o padrão é Graph + hosts do Bot Framework). Mantenha essa lista restrita (evite sufixos multilocatário).
Envio de arquivos em chats de grupo
Bots podem enviar arquivos em DMs usando o fluxo FileConsentCard (integrado). No entanto, enviar arquivos em chats/canais de grupo requer configuração adicional:| Contexto | Como os arquivos são enviados | Configuração necessária |
|---|---|---|
| DMs | FileConsentCard → usuário aceita → bot faz upload | Funciona imediatamente |
| Chats/canais de grupo | Upload para SharePoint → compartilhar link | Requer sharePointSiteId + permissões do Graph |
| Imagens (qualquer contexto) | Inline codificado em Base64 | Funciona imediatamente |
Por que chats de grupo precisam de SharePoint
Bots não têm um drive pessoal no OneDrive (o endpoint/me/drive da API Graph não funciona para identidades de aplicativo). Para enviar arquivos em chats/canais de grupo, o bot faz upload para um site do SharePoint e cria um link de compartilhamento.
Configuração
-
Adicione permissões da API Graph em Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) - upload de arquivos para o SharePointChat.Read.All(Application) - opcional, ativa links de compartilhamento por usuário
- Conceda consentimento de administrador para o tenant.
-
Obtenha o ID do seu site do SharePoint:
-
Configure o OpenClaw:
Comportamento de compartilhamento
| Permissão | Comportamento de compartilhamento |
|---|---|
Sites.ReadWrite.All apenas | Link de compartilhamento para toda a organização (qualquer pessoa da org pode acessar) |
Sites.ReadWrite.All + Chat.Read.All | Link de compartilhamento por usuário (somente membros do chat podem acessar) |
Chat.Read.All estiver ausente, o bot recorre ao compartilhamento para toda a organização.
Comportamento de fallback
| Cenário | Resultado |
|---|---|
Chat de grupo + arquivo + sharePointSiteId configurado | Upload para SharePoint, envio de link de compartilhamento |
Chat de grupo + arquivo + sem sharePointSiteId | Tenta upload no OneDrive (pode falhar), envia só texto |
| Chat pessoal + arquivo | Fluxo FileConsentCard (funciona sem SharePoint) |
| Qualquer contexto + imagem | Inline codificado em Base64 (funciona sem SharePoint) |
Local onde os arquivos são armazenados
Os arquivos enviados são armazenados em uma pasta/OpenClawShared/ na biblioteca de documentos padrão do site SharePoint configurado.
Enquetes (Adaptive Cards)
O OpenClaw envia enquetes do Teams como Adaptive Cards (não há API nativa de enquetes no Teams).- CLI:
openclaw message poll --channel msteams --target conversation:<id> ... - Os votos são registrados pelo gateway em
~/.openclaw/msteams-polls.json. - O gateway deve permanecer online para registrar votos.
- As enquetes ainda não publicam resumos de resultados automaticamente (inspecione o arquivo de armazenamento, se necessário).
Adaptive Cards (arbitrários)
Envie qualquer JSON de Adaptive Card para usuários ou conversas do Teams usando a ferramentamessage ou a CLI.
O parâmetro card aceita um objeto JSON de Adaptive Card. Quando card é fornecido, o texto da mensagem é opcional.
Ferramenta do agente:
Formatos de destino
Os destinos do MSTeams usam prefixos para distinguir usuários de conversas:| Tipo de destino | Formato | Exemplo |
|---|---|---|
| Usuário (por ID) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| Usuário (por nome) | user:<display-name> | user:John Smith (requer API Graph) |
| Grupo/canal | conversation:<conversation-id> | conversation:19:abc123...@thread.tacv2 |
| Grupo/canal (bruto) | <conversation-id> | 19:abc123...@thread.tacv2 (se contiver @thread) |
user:, os nomes usam por padrão a resolução de grupo/equipe. Sempre use user: ao direcionar pessoas por nome de exibição.
Mensagens proativas
- Mensagens proativas só são possíveis depois que um usuário interage, porque armazenamos referências de conversa nesse momento.
- Consulte
/gateway/configurationparadmPolicye controle por lista de permissões.
IDs de equipe e canal (armadilha comum)
O parâmetro de consultagroupId nas URLs do Teams NÃO é o ID de equipe usado na configuração. Extraia os IDs do caminho da URL:
URL da equipe:
- ID da equipe = segmento do caminho após
/team/(decodificado da URL, por exemplo,19:Bk4j...@thread.tacv2) - ID do canal = segmento do caminho após
/channel/(decodificado da URL) - Ignore o parâmetro de consulta
groupId
Canais privados
Bots têm suporte limitado em canais privados:| Recurso | Canais padrão | Canais privados |
|---|---|---|
| Instalação do bot | Sim | Limitado |
| Mensagens em tempo real (webhook) | Sim | Pode não funcionar |
| Permissões RSC | Sim | Pode se comportar de forma diferente |
| @menções | Sim | Se o bot estiver acessível |
| Histórico via API Graph | Sim | Sim (com permissões) |
- Use canais padrão para interações com o bot
- Use DMs - usuários sempre podem enviar mensagens diretamente ao bot
- Use a API Graph para acesso histórico (requer
ChannelMessage.Read.All)
Solução de problemas
Problemas comuns
- Imagens não aparecem nos canais: permissões do Graph ou consentimento de administrador ausentes. Reinstale o app do Teams e feche/reabra totalmente o Teams.
- Sem respostas no canal: menções são obrigatórias por padrão; defina
channels.msteams.requireMention=falseou configure por equipe/canal. - Incompatibilidade de versão (Teams ainda mostra o manifesto antigo): remova + adicione novamente o app e feche totalmente o Teams para atualizar.
- 401 Unauthorized do webhook: esperado ao testar manualmente sem JWT do Azure - significa que o endpoint está acessível, mas a autenticação falhou. Use o Azure Web Chat para testar corretamente.
Erros de upload de manifesto
- “Icon file cannot be empty”: o manifesto referencia arquivos de ícone com 0 bytes. Crie ícones PNG válidos (32x32 para
outline.png, 192x192 paracolor.png). - “webApplicationInfo.Id already in use”: o app ainda está instalado em outra equipe/chat. Encontre-o e desinstale-o primeiro, ou aguarde 5-10 minutos pela propagação.
- “Something went wrong” no upload: faça o upload por https://admin.teams.microsoft.com, abra as DevTools do navegador (F12) → aba Network e verifique o corpo da resposta para o erro real.
- Falha no sideload: tente “Upload an app to your org’s app catalog” em vez de “Upload a custom app” - isso geralmente contorna restrições de sideload.
Permissões RSC não funcionando
- Verifique se
webApplicationInfo.idcorresponde exatamente ao App ID do seu bot - Reenvie o app e reinstale-o na equipe/chat
- Verifique se o administrador da sua organização bloqueou permissões RSC
- Confirme se você está usando o escopo correto:
ChannelMessage.Read.Grouppara equipes,ChatMessage.Read.Chatpara chats de grupo
Referências
- Criar Azure Bot - guia de configuração do Azure Bot
- Teams Developer Portal - criar/gerenciar apps do Teams
- Esquema de manifesto do app do Teams
- Receber mensagens de canal com RSC
- Referência de permissões RSC
- Manipulação de arquivos do bot do Teams (canal/grupo requer Graph)
- Mensagens proativas
Relacionado
- Visão geral dos canais — todos os canais compatíveis
- Pairing — autenticação de DM e fluxo de pairing
- Grupos — comportamento de chat em grupo e bloqueio por menção
- Roteamento de canais — roteamento de sessão para mensagens
- Segurança — modelo de acesso e reforço de segurança