Microsoft Teams
“Abandonai toda esperança, vós que aqui entrais.”Atualizado: 2026-03-25 Status: texto + anexos em DM são compatíveis; o envio de arquivos em canal/grupo exige
sharePointSiteId + permissões do Graph (consulte Envio de arquivos em chats de grupo). Enquetes são enviadas por meio de Adaptive Cards. As ações de mensagem expõem upload-file explícito para envios com arquivo primeiro.
Plugin incluído
O Microsoft Teams é fornecido como um plugin incluído nas versões atuais do OpenClaw, portanto nenhuma instalação separada é necessária na compilação empacotada normal. Se você estiver em uma versão mais antiga ou em uma instalação personalizada que exclui o Teams incluído, instale-o manualmente:Configuração rápida (iniciante)
- Verifique se o plugin do Microsoft Teams está disponível.
- As versões empacotadas atuais do OpenClaw já o incluem.
- Instalações antigas/personalizadas podem adicioná-lo manualmente com os comandos acima.
- Crie um Azure Bot (App ID + segredo do cliente + ID do locatário).
- 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 aplicativo 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, condicionado a menção).
Objetivos
- Conversar com o OpenClaw por DMs, chats em grupo ou canais do Teams.
- Manter o roteamento determinístico: as respostas sempre voltam para o canal em que chegaram.
- Adotar por padrão um comportamento seguro no canal (menções obrigatórias, salvo configuração em contrário).
Escritas 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 por DM- 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 fica desativada por padrão e só é ativada com
channels.msteams.dangerouslyAllowNameMatching: true. - O assistente pode resolver nomes para IDs por meio do Microsoft Graph quando as credenciais permitirem.
- Padrão:
channels.msteams.groupPolicy = "allowlist"(bloqueado, a menos que você adicionegroupAllowFrom). Usechannels.defaults.groupPolicypara substituir o padrão quando não 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 condicionado a menção por padrão). - Para não permitir nenhum canal, defina
channels.msteams.groupPolicy: "disabled".
- Delimite respostas em grupos/canais 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 houver uma lista de permissões de equipes, somente as equipes/canais listados serão aceitos (condicionados a menção). - O assistente de configuração aceita entradas
Team/Channele as armazena para você. - Na inicialização, o OpenClaw resolve nomes de equipe/canal e nomes de usuários da lista 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
- Verifique se o plugin do Microsoft Teams está disponível.
- As versões empacotadas atuais do OpenClaw já o incluem.
- Instalações antigas/personalizadas podem adicioná-lo manualmente com os comandos acima.
- Crie um Azure Bot (App ID + segredo + ID do locatário).
- Crie um pacote de aplicativo Teams que faça referência ao bot e inclua as permissões RSC abaixo.
- Envie/instale o aplicativo 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 Create Azure Bot
-
Preencha a guia Basics:
Campo Valor Bot handle O 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 - consulte 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 é o seu
appId - Clique em Manage Password → vá para o Registro de Aplicativo
- Em Certificates & secrets → New client secret → copie o Value → este é o seu
appPassword - Acesse Overview → copie Directory (tenant) ID → este é o seu
tenantId
Etapa 3: Configurar 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 canal Teams
- Em Azure Bot → Channels
- Clique em Microsoft Teams → Configure → Save
- Aceite os Termos de Serviço
Autenticação federada (Certificado + Identidade Gerenciada)
Adicionado em 2026.3.24Para implantações em produção, o OpenClaw oferece suporte a autenticação federada como uma alternativa mais segura aos segredos do cliente. Há dois métodos disponíveis:
Opção A: Autenticação baseada em certificado
Use um certificado PEM registrado no registro do aplicativo Entra ID. Configuração:- Gere ou obtenha um certificado (formato PEM com chave privada).
- Em Entra ID → App Registration → Certificates & secrets → Certificates → envie o certificado público.
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
Opção B: Identidade Gerenciada do Azure
Use a Identidade Gerenciada do Azure para autenticação sem senha. Isso é ideal para implantações na infraestrutura do Azure (AKS, App Service, VMs do Azure) em que uma identidade gerenciada está disponível. Como funciona:- O pod/VM do bot tem uma identidade gerenciada (atribuída pelo sistema ou pelo usuário).
- Uma credencial de identidade federada vincula a identidade gerenciada ao registro do aplicativo Entra ID.
- Em tempo de execução, o OpenClaw usa
@azure/identitypara adquirir tokens do endpoint Azure IMDS (169.254.169.254). - O token é passado ao SDK do Teams para autenticação do bot.
- Infraestrutura do Azure com identidade gerenciada ativada (identidade de workload do AKS, App Service, VM)
- Credencial de identidade federada criada no registro do aplicativo Entra ID
- Acesso de rede ao IMDS (
169.254.169.254:80) a partir do pod/VM
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(somente para atribuição pelo usuário)
Configuração da identidade de workload do AKS
Para implantações do AKS usando identidade de workload:- Ative a identidade de workload no cluster do AKS.
-
Crie uma credencial de identidade federada no registro do aplicativo Entra ID:
-
Anote a conta de serviço do Kubernetes com o ID do cliente do aplicativo:
-
Rotule o pod para injeção da identidade de workload:
-
Garanta o acesso de rede ao IMDS (
169.254.169.254) — se estiver usandoNetworkPolicy, adicione uma regra de saída permitindo tráfego para169.254.169.254/32na porta 80.
Comparação dos tipos de autenticação
| Método | Configuração | Prós | Contras |
|---|---|---|---|
| Client secret | appPassword | Configuração simples | Rotação de segredo necessária, menos seguro |
| Certificate | authType: "federated" + certificatePath | Sem segredo compartilhado pela rede | Sobrecarga de gerenciamento de certificado |
| Managed Identity | authType: "federated" + useManagedIdentity | Sem senha, sem segredos para gerenciar | Infraestrutura do Azure obrigatória |
authType não está definido, o OpenClaw usa autenticação por segredo do cliente por padrão. As configurações existentes continuam funcionando sem alterações.
Desenvolvimento local (Tunelamento)
O Teams não consegue alcançarlocalhost. Use um túnel para desenvolvimento local:
Opção A: ngrok
Portal do Desenvolvedor do Teams (Alternativa)
Em vez de criar manualmente um ZIP de manifesto, você pode usar o Portal do Desenvolvedor do Teams:- Clique em + New app
- Preencha as informações básicas (nome, descrição, informações do desenvolvedor)
- Vá para 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 Portal do Azure → seu recurso Azure Bot → Test in Web Chat
- Envie uma mensagem — você deverá ver uma resposta
- Isso confirma que seu endpoint de webhook funciona antes da configuração do Teams
- Instale o aplicativo 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 (mínima, somente texto)
-
Verifique se o plugin do Microsoft Teams está disponível
- As versões empacotadas atuais do OpenClaw já o incluem.
- Instalações 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 (consulte acima) e anote:
- App ID
- Segredo do cliente (senha do aplicativo)
- ID do locatário (locatário único)
- Crie um Azure Bot (consulte acima) e anote:
-
Manifesto do aplicativo 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_IDMSTEAMS_AUTH_TYPE(opcional:"secret"ou"federated")MSTEAMS_CERTIFICATE_PATH(federada + certificado)MSTEAMS_CERTIFICATE_THUMBPRINT(opcional, não obrigatório para autenticação)MSTEAMS_USE_MANAGED_IDENTITY(federada + identidade gerenciada)MSTEAMS_MANAGED_IDENTITY_CLIENT_ID(somente MI atribuída pelo usuário)
-
Endpoint do bot
- Defina o endpoint de mensagens do Azure Bot como:
https://<host>:3978/api/messages(ou o caminho/porta que você escolher).
- Defina o endpoint de mensagens do Azure Bot como:
-
Execute o gateway
- O canal Teams inicia automaticamente quando o plugin incluído ou instalado manualmente está disponível e existe configuração
msteamscom credenciais.
- O canal Teams inicia automaticamente quando o plugin incluído ou instalado manualmente está disponível e existe 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á incluída no manifesto recomendado) - Para consultas entre equipes: permissão de Aplicativo do Graph
User.Read.Allcom consentimento de administrador
channels.msteams.actions.memberInfo (padrão: ativada quando credenciais do Graph estão disponíveis).
Contexto do histórico
channels.msteams.historyLimitcontrola quantas mensagens recentes de canal/grupo são incluídas no prompt.- Usa
messages.groupChat.historyLimitcomo fallback. Defina0para desativar (padrão: 50). - O histórico de thread obtido é filtrado pelas listas de permissões de remetentes (
allowFrom/groupAllowFrom), portanto 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 é repassado como recebido. - Em outras palavras, as listas de permissões controlam quem pode acionar o agente; hoje, apenas caminhos específicos de contexto suplementar são filtrados.
- 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 nosso manifesto do aplicativo Teams. Elas só se aplicam dentro da equipe/chat onde o aplicativo está instalado. Para canais (escopo de equipe):ChannelMessage.Read.Group(Application) - receber todas as 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 (redigido)
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 aplicativo existente
Para atualizar um aplicativo 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 aplicativo → Upload new version
- Opção B (Sideload): No Teams → Apps → Manage your apps → Upload a custom app
- Para canais de equipe: reinstale o aplicativo em cada equipe para que as novas permissões entrem em vigor
- Feche completamente e reabra o Teams (não apenas feche a janela) para limpar os metadados em cache do aplicativo
Capacidades: somente RSC vs Graph
Com somente Teams RSC (aplicativo instalado, sem permissões da API Graph)
Funciona:- Ler conteúdo de texto de mensagens do canal.
- Enviar conteúdo de texto para mensagens do canal.
- Receber anexos de arquivos em escopo pessoal (DM).
- Conteúdo de imagem ou arquivo de canal/grupo (a carga inclui apenas um stub HTML).
- Download de anexos armazenados no SharePoint/OneDrive.
- Leitura do histórico de mensagens (além do evento de webhook em tempo real).
Com Teams RSC + permissões de Aplicativo do Microsoft Graph
Adiciona:- Download de conteúdos hospedados (imagens coladas em mensagens).
- Download de anexos de arquivos 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 o histórico) |
| Complexidade de configuração | Somente manifesto do aplicativo | 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 com Graph ativado (obrigatório para canais)
Se você precisar de imagens/arquivos em canais ou quiser obter o histórico de mensagens, deve ativar as 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 em grupo)
- Conceda consentimento de administrador para o locatário.
- Aumente a versão do manifesto do aplicativo Teams, envie novamente e reinstale o aplicativo no Teams.
- Feche completamente e reabra o Teams para limpar os metadados em cache do aplicativo.
User.Read.All (Application) e conceda consentimento de administrador.
Limitações conhecidas
Timeouts de webhook
O Teams entrega mensagens por webhook HTTP. Se o processamento levar muito tempo (por exemplo, respostas lentas do LLM), você poderá ver:- Timeouts do gateway
- O Teams tentando reenviar a mensagem (causando duplicatas)
- Respostas descartadas
Formatação
O markdown do Teams é mais limitado que o do Slack ou Discord:- A formatação básica funciona: negrito, itálico,
code, links - Markdown complexo (tabelas, listas aninhadas) pode não ser renderizado corretamente
- Adaptive Cards são compatíveis para enquetes e envios arbitrários de cartões (consulte abaixo)
Configuração
Principais configurações (consulte/gateway/configuration para padrões compartilhados de canal):
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 (recomendam-se IDs de objeto AAD). O assistente resolve nomes para IDs durante a configuração quando o acesso ao Graph está disponível.channels.msteams.dangerouslyAllowNameMatching: opção de emergência para reativar a correspondência por UPN/nome de exibição mutáveis e o roteamento direto por nome de equipe/canal.channels.msteams.textChunkLimit: tamanho do bloco de texto de saída.channels.msteams.chunkMode:length(padrão) ounewlinepara dividir em linhas em branco (limites de parágrafo) antes da divisão por comprimento.channels.msteams.mediaAllowHosts: lista de permissões para hosts de anexos de entrada (por padrão, domínios da Microsoft/Teams).channels.msteams.mediaAuthAllowHosts: lista de permissões para anexar cabeçalhosAuthorizationem novas tentativas de mídia (por padrão, hosts do 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 não há uma substituição de canal.channels.msteams.teams.<teamId>.toolsBySender: substituições padrão de política de ferramentas por equipe e por remetente (compatível com curinga"*").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 (compatível com curinga"*").- As chaves de
toolsBySenderdevem usar prefixos explícitos:id:,e164:,username:,name:(chaves legadas sem prefixo ainda são mapeadas apenas paraid:). channels.msteams.actions.memberInfo: ativa ou desativa a ação de informações de membro com suporte do Graph (padrão: ativada quando credenciais do Graph estão disponíveis).channels.msteams.authType: tipo de autenticação —"secret"(padrão) ou"federated".channels.msteams.certificatePath: caminho para o arquivo de certificado PEM (federada + autenticação por certificado).channels.msteams.certificateThumbprint: impressão digital do certificado (opcional, não obrigatória para autenticação).channels.msteams.useManagedIdentity: ativa autenticação por identidade gerenciada (modo federado).channels.msteams.managedIdentityClientId: ID do cliente para identidade gerenciada atribuída pelo usuário.channels.msteams.sharePointSiteId: ID do site do SharePoint para uploads de arquivos 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 publicações
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 cartões com respostas em thread abaixo | thread (padrão) |
| Threads (semelhante ao Slack) | As mensagens fluem linearmente, mais parecido com o Slack | top-level |
replyStyle errado:
threadem um canal no estilo Threads → as respostas aparecem aninhadas de forma estranhatop-levelem um canal no estilo Posts → as respostas aparecem como publicações separadas de nível superior em vez de na 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 por meio das APIs de arquivo do bot do Teams.
- Canais/grupos: anexos ficam armazenados no 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 explícitos com arquivo primeiro, use
action=upload-filecommedia/filePath/path;messageopcional torna-se o texto/comentário que acompanha, efilenamesubstitui o nome enviado.
channels.msteams.mediaAllowHosts (use ["*"] para permitir qualquer host).
Cabeçalhos de autorização são anexados apenas para hosts em channels.msteams.mediaAuthAllowHosts (por padrão, hosts do Graph + 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 exige configuração adicional:| Contexto | Como os arquivos são enviados | Configuração necessária |
|---|---|---|
| DMs | FileConsentCard → usuário aceita → bot envia | Funciona imediatamente |
| Chats/canais de grupo | Upload para o SharePoint → compartilhar link | Requer sharePointSiteId + permissões do Graph |
| Imagens (qualquer contexto) | Inline codificado em Base64 | Funciona imediatamente |
Por que chats de grupo exigem SharePoint
Bots não têm um drive pessoal do 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) - enviar arquivos para o SharePointChat.Read.All(Application) - opcional, ativa links de compartilhamento por usuário
- Conceda consentimento de administrador para o locatário.
-
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 na organização 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 usa como fallback o compartilhamento para toda a organização.
Comportamento de fallback
| Cenário | Resultado |
|---|---|
Chat em grupo + arquivo + sharePointSiteId configurado | Upload para o SharePoint, envio de link de compartilhamento |
Chat em grupo + arquivo + sem sharePointSiteId | Tenta upload no OneDrive (pode falhar), envia apenas 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 do SharePoint configurado.
Enquetes (Adaptive Cards)
O OpenClaw envia enquetes do Teams como Adaptive Cards (não há API nativa de enquetes do 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 automaticamente resumos de resultados (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 entre usuários e 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 interagiu, porque armazenamos referências de conversa nesse momento.
- Consulte
/gateway/configurationparadmPolicye controle por lista de permissões.
IDs de equipe e canal (pegadinha comum)
O parâmetro de consultagroupId nas URLs do Teams NÃO é o ID de equipe usado para 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 | Podem 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 - os 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 em canais: faltam permissões do Graph ou consentimento de administrador. Reinstale o aplicativo Teams e feche/reabra completamente 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 (o Teams ainda mostra o manifesto antigo): remova e adicione o aplicativo novamente e feche completamente 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 no envio do manifesto
- “Icon file cannot be empty”: o manifesto faz referência a arquivos de ícone com 0 bytes. Crie ícones PNG válidos (32x32 para
outline.png, 192x192 paracolor.png). - “webApplicationInfo.Id already in use”: o aplicativo ainda está instalado em outra equipe/chat. Localize e desinstale-o primeiro ou aguarde de 5 a 10 minutos pela propagação.
- “Something went wrong” ao enviar: faça o envio por https://admin.teams.microsoft.com, abra as DevTools do navegador (F12) → aba Network e verifique o corpo da resposta para ver 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 funcionam
- Verifique se
webApplicationInfo.idcorresponde exatamente ao App ID do seu bot - Envie novamente o aplicativo 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 em grupo
Referências
- Create Azure Bot - guia de configuração do Azure Bot
- Teams Developer Portal - criar/gerenciar aplicativos do Teams
- Teams app manifest schema
- Receive channel messages with RSC
- RSC permissions reference
- Teams bot file handling (canal/grupo requer Graph)
- Proactive messaging
Relacionado
- Visão geral dos canais — todos os canais compatíveis
- Pareamento — autenticação por DM e fluxo de pareamento
- Grupos — comportamento de chat em grupo e exigência de menção
- Roteamento de canal — roteamento de sessão para mensagens
- Segurança — modelo de acesso e proteção 강화