Microsoft Teams (plugin)
”Övergiv allt hopp, ni som träder in här.”Uppdaterad: 2026-01-21 Status: text + DM bilagor stöds; kanal/grupp filsändning kräver
sharePointSiteId + Grafiska behörigheter (se Skickar filer i gruppchatt). Undersökningar skickas via Adaptive Cards.
Plugin krävs
Microsoft Teams levereras som ett plugin och ingår inte i kärninstallationen. Breaking change (2026.1.15): MS Teams flyttade ut ur kärnan. Om du använder den måste du installera plugin. Förklaring: håller kärninstallationer lättare och låter MS Teams-beroenden uppdateras oberoende. Installera via CLI (npm-registret):Snabbstart (nybörjare)
- Installera Microsoft Teams-pluginet.
- Skapa en Azure Bot (App ID + klienthemlighet + tenant-ID).
- Konfigurera OpenClaw med dessa uppgifter.
- Exponera
/api/messages(port 3978 som standard) via en publik URL eller tunnel. - Installera Teams-appaketet och starta gatewayn.
channels.msteams.groupPolicy: "allowlist"). För att tillåta gruppsvar, ange channels.msteams.groupAllowFrom (eller använd groupPolicy: "open" för att tillåta någon medlem, nämn-gated).
Mål
- Prata med OpenClaw via Teams-DM:er, gruppchattar eller kanaler.
- Håll routning deterministisk: svar går alltid tillbaka till kanalen de kom från.
- Standard till säkert kanalbeteende (omnämnanden krävs om inget annat konfigureras).
Konfigskrivningar
Som standard får Microsoft Teams skriva konfiguppdateringar som triggas av/config set|unset (kräver commands.config: true).
Inaktivera med:
Åtkomstkontroll (DM:er + grupper)
DM-åtkomst- Standard:
channels.msteams.dmPolicy = "pairing". Okända avsändare ignoreras tills de är godkända. channels.msteams.allowFromaccepterar AAD objekt-ID, UPNs eller visningsnamn. Guiden löser namn till ID via Microsoft Graph när referenser tillåter.
- Standard:
channels.msteams.groupPolicy = "allowlist"(blockerad såvida du inte lägger tillgroupAllowFrom). Användchannels.defaults.groupPolicyför att åsidosätta standard när du inaktiverar. channels.msteams.groupAllowFromstyr vilka avsändare som kan trigga i gruppchattar/kanaler (faller tillbaka tillchannels.msteams.allowFrom).- Sätt
groupPolicy: "open"för att tillåta alla medlemmar (fortfarande omnämnandestyrt som standard). - För att tillåta inga kanaler, sätt
channels.msteams.groupPolicy: "disabled".
- Avgränsa grupp-/kanalsvar genom att lista team och kanaler under
channels.msteams.teams. - Nycklar kan vara team-ID:n eller namn; kanalnycklar kan vara konversations-ID:n eller namn.
- När
groupPolicy="allowlist"och en team-tillåtelselista finns, accepteras endast listade team/kanaler (omnämnandestyrt). - Konfigureringsguiden accepterar
Team/Channel-poster och lagrar dem åt dig. - Vid uppstart löser OpenClaw namn i team-/kanal- och användartillåtelselistor till ID:n (när Graph-behörigheter tillåter) och loggar mappningen; olösta poster behålls som de är skrivna.
Hur det fungerar
- Installera Microsoft Teams-pluginet.
- Skapa en Azure Bot (App ID + hemlighet + tenant-ID).
- Bygg ett Teams-appaket som refererar till boten och inkluderar RSC-behörigheterna nedan.
- Ladda upp/installera Teams-appen i ett team (eller personligt scope för DM:er).
- Konfigurera
msteamsi~/.openclaw/openclaw.json(eller miljövariabler) och starta gatewayn. - Gatewayn lyssnar efter Bot Framework-webhooktrafik på
/api/messagessom standard.
Azure Bot-konfigurering (Förutsättningar)
Innan du konfigurerar OpenClaw behöver du skapa en Azure Bot-resurs.Steg 1: Skapa Azure Bot
- Gå till Skapa Azure Bot
-
Fyll i fliken Basics:
Fält Värde Botnamn Ditt bot namn, t.ex., openclaw-msteams(måste vara unik)Prenumeration Välj din Azure-prenumeration Resursgrupp Skapa ny eller använd befintlig Prisnivå Free för utveckling/test Typ av app Single Tenant (rekommenderas – se noten nedan) Skapandetyp Skapa nytt Microsoft App-ID
Avskrivningsanmälan: Skapandet av nya flerhyresgäster försågs efter 2025-07-31. Använd Enstaka hyresgäst för nya botar.
- Klicka Review + create → Create (vänta ~1–2 minuter)
Steg 2: Hämta uppgifter
- Gå till din Azure Bot-resurs → Configuration
- Kopiera Microsoft App ID → detta är ditt
appId - Klicka Manage Password → gå till App Registration
- Under Certificates & secrets → New client secret → kopiera Value → detta är ditt
appPassword - Gå till Overview → kopiera Directory (tenant) ID → detta är ditt
tenantId
Steg 3: Konfigurera Messaging Endpoint
- I Azure Bot → Configuration
- Sätt Messaging endpoint till din webhook-URL:
- Produktion:
https://your-domain.com/api/messages - Lokal utveckling: använd en tunnel (se Lokal utveckling nedan)
- Produktion:
Steg 4: Aktivera Teams-kanalen
- I Azure Bot → Channels
- Klicka Microsoft Teams → Configure → Save
- Acceptera användarvillkoren
Lokal utveckling (Tunneling)
Lagen kan inte nålocalhost. Använd en tunnel för lokal utveckling:
Alternativ A: ngrok
Teams Developer Portal (Alternativ)
I stället för att manuellt skapa ett manifest-ZIP kan du använda Teams Developer Portal:- Klicka + New app
- Fyll i grundinfo (namn, beskrivning, utvecklarinfo)
- Gå till App features → Bot
- Välj Enter a bot ID manually och klistra in ditt Azure Bot App ID
- Markera scopes: Personal, Team, Group Chat
- Klicka Distribute → Download app package
- I Teams: Apps → Manage your apps → Upload a custom app → välj ZIP-filen
Testa boten
Alternativ A: Azure Web Chat (verifiera webhook först)- I Azure Portal → din Azure Bot-resurs → Test in Web Chat
- Skicka ett meddelande – du bör se ett svar
- Detta bekräftar att din webhook-endpoint fungerar innan Teams-konfiguration
- Installera Teams-appen (sideload eller organisationskatalog)
- Hitta boten i Teams och skicka ett DM
- Kontrollera gateway-loggar för inkommande aktivitet
Konfigurering (minimal, endast text)
-
Installera Microsoft Teams-pluginet
- Från npm:
openclaw plugins install @openclaw/msteams - Från lokal utcheckning:
openclaw plugins install ./extensions/msteams
- Från npm:
-
Botregistrering
- Skapa en Azure Bot (se ovan) och notera:
- App ID
- Klienthemlighet (App-lösenord)
- Tenant-ID (single-tenant)
- Skapa en Azure Bot (se ovan) och notera:
-
Teams-appmanifest
- Inkludera en
bot-post medbotId = <App ID>. - Scopes:
personal,team,groupChat. supportsFiles: true(krävs för filhantering i personligt scope).- Lägg till RSC-behörigheter (nedan).
- Skapa ikoner:
outline.png(32x32) ochcolor.png(192x192). - Zippa alla tre filer tillsammans:
manifest.json,outline.png,color.png.
- Inkludera en
-
Konfigurera OpenClaw
Du kan också använda miljövariabler i stället för konfignycklar:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_ID
-
Bot-endpoint
- Sätt Azure Bot Messaging Endpoint till:
https://<host>:3978/api/messages(eller vald sökväg/port).
- Sätt Azure Bot Messaging Endpoint till:
-
Kör gatewayn
- Teams-kanalen startar automatiskt när pluginet är installerat och
msteams-konfig finns med uppgifter.
- Teams-kanalen startar automatiskt när pluginet är installerat och
Historikkontext
channels.msteams.historyLimitstyr hur många senaste kanal-/gruppmeddelanden som paketeras i prompten.- Faller tillbaka till
messages.groupChat.historyLimit. Sätt0till att inaktivera (standard 50). - DM historia kan begränsas med
channels.msteams.dmHistoryLimit(användarvändar). Åsidosättningar per användare:channels.msteams.dms["<user_id>"].historyLimit.
Aktuella Teams RSC-behörigheter (Manifest)
Dessa är befintliga resursSpecifika behörigheter i vårt Teams app-manifest. De gäller bara inne i teamet/chatten där appen är installerad. För kanaler (team-scope):ChannelMessage.Read.Group(Application) – ta emot alla kanalmeddelanden utan @omnämnandeChannelMessage.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) – ta emot alla gruppchattmeddelanden utan @omnämnande
Exempel på Teams-manifest (redigerat)
Minimal, giltigt exempel med obligatoriska fält. Ersätt ID och webbadresser.Manifest-varningar (måste-ha-fält)
bots[].botIdmåste matcha Azure Bot App ID.webApplicationInfo.idmåste matcha Azure Bot App ID.bots[].scopesmåste inkludera ytorna du planerar att använda (personal,team,groupChat).bots[].supportsFiles: truekrävs för filhantering i personligt scope.authorization.permissions.resourceSpecificmåste inkludera kanal-läs/skicka om du vill ha kanaltrafik.
Uppdatera en befintlig app
För att uppdatera en redan installerad Teams-app (t.ex. för att lägga till RSC-behörigheter):- Uppdatera ditt
manifest.jsonmed de nya inställningarna - Öka
version-fältet (t.ex.,1.0.0→1.1.0) - Zippa om manifestet med ikoner (
manifest.json,outline.png,color.png) - Ladda upp den nya zip-filen:
- Alternativ A (Teams Admin Center): Teams Admin Center → Teams apps → Manage apps → hitta din app → Upload new version
- Alternativ B (Sideload): I Teams → Apps → Manage your apps → Upload a custom app
- För teamkanaler: Installera om appen i varje team för att nya behörigheter ska gälla
- Avsluta Teams helt och starta om (inte bara stäng fönstret) för att rensa cachead appmetadata
Förmågor: endast RSC vs Graph
Med endast Teams RSC (app installerad, inga Graph API-behörigheter)
Fungerar:- Läsa kanalmeddelandens text.
- Skicka kanalmeddelandens text.
- Ta emot personliga (DM) filbilagor.
- Kanal-/gruppers bild- eller filinnehåll (payloaden innehåller endast HTML-stub).
- Nedladdning av bilagor lagrade i SharePoint/OneDrive.
- Läsa meddelandehistorik (utöver den live webhook-händelsen).
Med Teams RSC + Microsoft Graph Application-behörigheter
Tillkommer:- Nedladdning av hostat innehåll (bilder inklistrade i meddelanden).
- Nedladdning av filbilagor lagrade i SharePoint/OneDrive.
- Läsa kanal-/chattmeddelandehistorik via Graph.
RSC vs Graph API
| Förmåga | RSC-behörigheter | Graph API |
|---|---|---|
| Realtidsmeddelanden | Ja (via webhook) | Nej (endast polling) |
| Historiska meddelanden | Nej | Ja (kan fråga historik) |
| Konfigkomplexitet | Endast appmanifest | Kräver adminmedgivande + tokenflöde |
| Fungerar offline | Nej (måste vara igång) | Ja (kan fråga när som helst) |
ChannelMessage.Read.All (kräver administratörens samtycke).
Graph-aktiverade medier + historik (krävs för kanaler)
Om du behöver bilder/filer i kanaler eller vill hämta meddelandehistorik måste du aktivera Microsoft Graph-behörigheter och ge adminmedgivande.- I Entra ID (Azure AD) App Registration, lägg till Microsoft Graph Application permissions:
ChannelMessage.Read.All(kanalbilagor + historik)Chat.Read.AllellerChatMessage.Read.All(gruppchattar)
- Ge adminmedgivande för tenant.
- Öka Teams-appens manifestversion, ladda upp igen och installera om appen i Teams.
- Avsluta Teams helt och starta om för att rensa cachead appmetadata.
User.Read.All (Application) och ge administratörssamtycke.
Webhook-timeouts
Webhook-timeouts
Teams levererar meddelanden via HTTP-webhook. Om behandlingen tar för lång tid (t.ex., långsam LLM svar), kan du se:- Gateway-timeouts
- Teams som försöker igen (orsakar dubbletter)
- Tappade svar
Formatering
Teams-markdown är mer begränsad än Slack eller Discord:- Grundläggande formatering fungerar: fet, kursiv,
code, länkar - Komplex markdown (tabeller, nästlade listor) kanske inte renderas korrekt
- Adaptive Cards stöds för omröstningar och godtyckliga kort (se nedan)
Konfiguration
Nyckelinställningar (se/gateway/configuration för delade kanal-mönster):
channels.msteams.enabled: aktivera/inaktivera kanalen.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: botuppgifter.channels.msteams.webhook.port(standard3978)channels.msteams.webhook.path(standard/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(standard: pairing)channels.msteams.allowFrom: allowlist för DMs (AAD objekt ID, UPN, eller visningsnamn). Guiden löser namn på ID under installationen när Graph tillgång är tillgänglig.channels.msteams.textChunkLimit: utgående text-chunkstorlek.channels.msteams.chunkMode:length(standard) ellernewlineför att dela på tomrader (styckegränser) före längdchunkning.channels.msteams.mediaAllowHosts: tillåtelselista för inkommande bilagevärdar (standard Microsoft/Teams-domäner).channels.msteams.mediaAuthAllowHosts: tillåtelselista för att bifoga Authorization-headers vid medieomförsök (standard Graph + Bot Framework-värdar).channels.msteams.requireMention: kräver @omnämnande i kanaler/grupper (standard true).channels.msteams.replyStyle:thread | top-level(se Svarsformat).channels.msteams.teams.<teamId>.replyStyle: åsidosätter per lag.channels.msteams.teams.<teamId>.requireMention: åsidosättning per lag.channels.msteams.teams.<teamId>.tools: standard policy för per-team overrides (allow/deny/alsoAllow) som används när en kanaloverride saknas.channels.msteams.teams.<teamId>.toolsBySender: standard per-team per-sender tool policy overrides ("*"wildcard stöds).channels.msteams.team.<teamId>.kanaler.<conversationId>.replyStyle: åsidosätter per kanal.channels.msteams.team.<teamId>.kanaler.<conversationId>.requireMention: åsidosättning per kanal.channels.msteams.team.<teamId>.kanaler.<conversationId>.tools: policy för verktyg per kanal åsidosätter (allow/deny/alsoAllow).channels.msteams.team.<teamId>.kanaler.<conversationId>.toolsBySender: per-channel per-sender tool policy overrides ("*"wildcard stöds).channels.msteams.sharePointSiteId: SharePoint-site-ID för filuppladdningar i gruppchattar/kanaler (se Skicka filer i gruppchattar).
Routning & sessioner
- Sessionsnycklar följer standard agentformat (se /concepts/session):
- Direktmeddelanden delar huvudsessionen (
agent:<agentId>:<mainKey>). - Kanal-/gruppmeddelanden använder konversations-ID:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Direktmeddelanden delar huvudsessionen (
Svarsformat: Trådar vs inlägg
Teams har nyligen introducerat två kanal-UI-stilar ovanpå samma underliggande datamodell:| Stil | Beskrivning | Rekommenderad replyStyle |
|---|---|---|
| Inlägg (klassisk) | Meddelanden visas som kort med trådade svar under | thread (standard) |
| Trådar (Slack-lik) | Meddelanden flyter linjärt, mer som Slack | top-level |
replyStyle:
threadi en Trådar-kanal → svar visas klumpigt nästladetop-leveli en Inlägg-kanal → svar visas som separata toppnivåinlägg i stället för i tråd
replyStyle per kanal baserat på hur kanalen är uppsatt:
Bilagor & bilder
Nuvarande begränsningar:- DM:er: Bilder och filbilagor fungerar via Teams bot-fil-API:er.
- Kanaler/grupper: Bilagor live i M365-lagring (SharePoint/OneDrive). Webhook payload innehåller endast en HTML-stub, inte den faktiska filen bytes. Grafik API-behörigheter krävs för att ladda ner kanalbilagor.
channels.msteams.mediaAllowHosts (använd ["*"] för att tillåta alla värdar).
Auktoriseringshuvuden är bara kopplade för värdar i channels.msteams.mediaAuthAllowHosts (standard är Graph + Bot Framework värd). Håll denna lista strikt (undvik multi-tenant-suffix).
Skicka filer i gruppchattar
Bots kan skicka filer i DMs med hjälp av flödet FileConsentCard (inbyggd). skicka filer i gruppchatt/kanaler kräver dock ytterligare inställningar:| Kontext | Hur filer skickas | Krävd konfigurering |
|---|---|---|
| DM:er | FileConsentCard → användaren accepterar → boten laddar upp | Fungerar direkt |
| Gruppchattar/kanaler | Ladda upp till SharePoint → dela länk | Kräver sharePointSiteId + Graph-behörigheter |
| Bilder (alla kontexter) | Base64-kodade inline | Fungerar direkt |
Varför gruppchattar behöver SharePoint
Bots har ingen personlig OneDrive-enhet (/me/drive Graph API slutpunkt fungerar inte för applikationsidentiteter). För att skicka filer i gruppchattar/kanaler laddar roboten upp till en SharePoint-webbplats och skapar en delningslänk.
Konfigurering
-
Lägg till Graph API-behörigheter i Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) – ladda upp filer till SharePointChat.Read.All(Application) – valfri, aktiverar per-användare-delning
- Ge adminmedgivande för tenant.
-
Hämta ditt SharePoint-site-ID:
-
Konfigurera OpenClaw:
Delningsbeteende
| Behörighet | Delningsbeteende |
|---|---|
Sites.ReadWrite.All endast | Organisationsomfattande delningslänk (alla i orgen) |
Sites.ReadWrite.All + Chat.Read.All | Per-användare-delning (endast chattmedlemmar) |
Fallback-beteende
| Scenario | Resultat |
|---|---|
Gruppchatt + fil + sharePointSiteId konfigurerad | Ladda upp till SharePoint, skicka delningslänk |
Gruppchatt + fil + ingen sharePointSiteId | Försök OneDrive-uppladdning (kan misslyckas), skicka endast text |
| Personlig chatt + fil | FileConsentCard-flöde (fungerar utan SharePoint) |
| Valfri kontext + bild | Base64-kodad inline (fungerar utan SharePoint) |
Lagringsplats för filer
Uppladdade filer lagras i en mapp/OpenClawShared/ i den konfigurerade SharePoint-sitens standarddokumentbibliotek.
Omröstningar (Adaptive Cards)
OpenClaw skickar Teams-omröstningar som Adaptive Cards (det finns inget inbyggt Teams-API för omröstningar).- CLI:
openclaw message poll --channel msteams --target conversation:<id> ... - Röster registreras av gatewayn i
~/.openclaw/msteams-polls.json. - Gatewayn måste vara online för att registrera röster.
- Omröstningar publicerar ännu inte automatiskt sammanfattningar (inspektera lagringsfilen vid behov).
Adaptive Cards (godtyckliga)
Skicka valfri Adaptive Card-JSON till Teams-användare eller konversationer med verktyget eller CLImessage.
Parametern card accepterar ett Adaptive Card JSON-objekt. När card anges är meddelandetexten frivillig.
Agentverktyg:
Målformat
MSTeams-mål använder prefix för att skilja mellan användare och konversationer:| Måltyp | Format | Exempel |
|---|---|---|
| Användare (via ID) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| Användare (via namn) | user:<display-name> | user:John Smith (kräver Graph API) |
| Grupp/kanal | conversation:<conversation-id> | conversation:19:[email protected] |
| Grupp/kanal (rå) | <conversation-id> | 19:[email protected] (om innehåller @thread) |
user: , namn standard för grupp/team upplösning. Använd alltid användare: när du riktar personer genom visningsnamn.
Proaktiva meddelanden
- Proaktiva meddelanden är endast möjliga efter att en användare har interagerat, eftersom vi lagrar konversationsreferenser då.
- Se
/gateway/configurationfördmPolicyoch tillåtelselistegrindning.
Team- och kanal-ID:n (vanlig fallgrop)
groupId-frågeparametern i Teams URL:er är INTE team-ID som används för konfiguration. Extrahera ID från URL-sökvägen istället:
Team-URL:
- Lag ID = sökväg segment efter
/team/(URL-avkodad, t.ex.,19:[email protected]) - Kanal-ID = sökvägssegmentet efter
/channel/(URL-avkodat) - Ignorera query-parametern
groupId
Privata kanaler
Botar har begränsat stöd i privata kanaler:| Funktion | Standardkanaler | Privata kanaler |
|---|---|---|
| Botinstallation | Ja | Begränsad |
| Realtidsmeddelanden (webhook) | Ja | Kanske fungerar inte |
| RSC-behörigheter | Ja | Kan bete sig annorlunda |
| @omnämnanden | Ja | Om boten är åtkomlig |
| Graph API-historik | Ja | Ja (med behörigheter) |
- Använd standardkanaler för botinteraktioner
- Använd DM:er – användare kan alltid skriva direkt till boten
- Använd Graph API för historisk åtkomst (kräver
ChannelMessage.Read.All)
Vanliga problem
Vanliga problem
- Bilder som inte visas i kanaler: Grafbehörigheter eller administratörens samtycke saknas. Installera om Teams appen och avsluta / öppna Teams.
- Inga svar i kanal: omnämnanden krävs som standard; sätt
channels.msteams.requireMention=falseeller konfigurera per team/kanal. - Versionsmismatch (Teams visar gammalt manifest): ta bort + lägg till appen igen och avsluta Teams helt för att uppdatera.
- 401 Obehörig från webhook: Förväntad vid testning manuellt utan Azure JWT - betyder att slutpunkten kan nås, men auth misslyckades. Använd Azure Web Chat för att testa korrekt.
Fel vid uppladdning av manifest
- “Ikonfil kan inte vara tom”: De manifest-referensikonfiler som är 0 bytes. Skapa giltiga PNG-ikoner (32x32 för
outline.png, 192x192 förcolor.png). - “webApplicationInfo.Id används redan”: Appen är fortfarande installerad i en annan team/chatt. Hitta och avinstallera det först, eller vänta 5-10 minuter för förökning.
- ”Something went wrong” vid uppladdning: Ladda upp via https://admin.teams.microsoft.com i stället, öppna webbläsarens DevTools (F12) → Network-fliken och kontrollera svarskroppen för det faktiska felet.
- Sideload misslyckas: Prova ”Upload an app to your org’s app catalog” i stället för ”Upload a custom app” – detta kringgår ofta sideload-restriktioner.
RSC-behörigheter fungerar inte
- Verifiera att
webApplicationInfo.idmatchar botens App ID exakt - Ladda upp appen igen och installera om i teamet/chatten
- Kontrollera om din organisationsadmin har blockerat RSC-behörigheter
- Bekräfta att du använder rätt scope:
ChannelMessage.Read.Groupför team,ChatMessage.Read.Chatför gruppchattar
Referenser
- Skapa Azure Bot – guide för Azure Bot-konfigurering
- Teams Developer Portal – skapa/hantera Teams-appar
- Teams app manifest schema
- Ta emot kanalmeddelanden med RSC
- RSC-behörighetsreferens
- Teams bot-filhantering (kanal/grupp kräver Graph)
- Proaktiva meddelanden