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):
openclaw plugins install @openclaw/msteams
Lokal utcheckning (när du kör från ett git-repo):
openclaw plugins install ./extensions/msteams
Om du väljer Teams under konfigurering/introduktion och en git-utcheckning upptäcks, erbjuder OpenClaw automatiskt den lokala installationssökvägen.
Detaljer: Plugins
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.
Minimal konfig:
{
channels: {
msteams: {
enabled: true,
appId: "<APP_ID>",
appPassword: "<APP_PASSWORD>",
tenantId: "<TENANT_ID>",
webhook: { port: 3978, path: "/api/messages" },
},
},
}
Obs: gruppchattar blockeras som standard (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:
{
channels: { msteams: { configWrites: false } },
}
Å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.
Gruppåtkomst
- 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".
Exempel:
{
channels: {
msteams: {
groupPolicy: "allowlist",
groupAllowFrom: ["user@org.com"],
},
},
}
Teams + kanal-tillåtelselista
- 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.
Exempel:
{
channels: {
msteams: {
groupPolicy: "allowlist",
teams: {
"My Team": {
channels: {
General: { requireMention: true },
},
},
},
},
},
}
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)
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
ngrok http 3978
# Copy the https URL, e.g., https://abc123.ngrok.io
# Set messaging endpoint to: https://abc123.ngrok.io/api/messages
Alternativ B: Tailscale Funnel
tailscale funnel 3978
# Use your Tailscale funnel URL as the messaging endpoint
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
Detta är ofta enklare än att handredigera JSON-manifest.
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
Alternativ B: Teams (efter appinstallation)
- 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 -
Botregistrering - Skapa en Azure Bot (se ovan) och notera:
- App ID
- Klienthemlighet (App-lösenord)
- Tenant-ID (single-tenant)
-
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. -
Konfigurera OpenClaw
json
{
"msteams": {
"enabled": true,
"appId": "<APP_ID>",
"appPassword": "<APP_PASSWORD>",
"tenantId": "<TENANT_ID>",
"webhook": { "port": 3978, "path": "/api/messages" }
}
}
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).
-
Kör gatewayn - Teams-kanalen startar automatiskt när pluginet är installerat och
msteams-konfig finns med uppgifter.
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)
För gruppchattar:
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.
{
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json",
"manifestVersion": "1.23",
"version": "1.0.0",
"id": "00000000-0000-0000-0000-000000000000",
"name": { "short": "OpenClaw" },
"developer": {
"name": "Your Org",
"websiteUrl": "https://example.com",
"privacyUrl": "https://example.com/privacy",
"termsOfUseUrl": "https://example.com/terms"
},
"description": { "short": "OpenClaw in Teams", "full": "OpenClaw in Teams" },
"icons": { "outline": "outline.png", "color": "color.png" },
"accentColor": "#5B6DEF",
"bots": [
{
"botId": "11111111-1111-1111-1111-111111111111",
"scopes": ["personal", "team", "groupChat"],
"isNotificationOnly": false,
"supportsCalling": false,
"supportsVideo": false,
"supportsFiles": true
}
],
"webApplicationInfo": {
"id": "11111111-1111-1111-1111-111111111111"
},
"authorization": {
"permissions": {
"resourceSpecific": [
{ "name": "ChannelMessage.Read.Group", "type": "Application" },
{ "name": "ChannelMessage.Send.Group", "type": "Application" },
{ "name": "Member.Read.Group", "type": "Application" },
{ "name": "Owner.Read.Group", "type": "Application" },
{ "name": "ChannelSettings.Read.Group", "type": "Application" },
{ "name": "TeamMember.Read.Group", "type": "Application" },
{ "name": "TeamSettings.Read.Group", "type": "Application" },
{ "name": "ChatMessage.Read.Chat", "type": "Application" }
]
}
}
}
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.
Fungerar INTE:
- 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) |
Nedre raden: RSC är för realtidslyssnande; Graph API är för historisk åtkomst. För att komma ikapp missade meddelanden medan du är offline behöver du Graph API med 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.
Kända begränsningar¶
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
OpenClaw hanterar detta genom att svara snabbt och skicka svar proaktivt, men mycket långsamma svar kan fortfarande orsaka problem.
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.team.<teamId>.replyStyle: åsidosätter per lag.channels.msteams.team.<teamId>.requireMention: åsidosättning per lag.channels.msteams.team.<teamId>.tools: standard policy för per-team overrides (allow/deny/alsoAllow) som används när en kanaloverride saknas.channels.msteams.team.<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>
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 |
Problemet: Teams API avslöjar inte vilken UI-stil en kanal använder. Om du använder fel 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
Lösning: Konfigurera replyStyle per kanal baserat på hur kanalen är uppsatt:
{
"msteams": {
"replyStyle": "thread",
"teams": {
"19:abc...@thread.tacv2": {
"channels": {
"19:xyz...@thread.tacv2": {
"replyStyle": "top-level"
}
}
}
}
}
}
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.
Utan Graph behörigheter kommer kanalmeddelanden med bilder att tas emot som text-only (bildinnehållet är inte tillgängligt för boten).
Som standard laddar OpenClaw endast ner media från Microsoft/Teams värdnamn. Åsidosätt med 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 SharePoint -Chat.Read.All(Application) – valfri, aktiverar per-användare-delning -
Ge adminmedgivande för tenant.
-
Hämta ditt SharePoint-site-ID:
```bash # Via Graph Explorer or curl with a valid token: curl -H "Authorization: Bearer $TOKEN" \ "https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}"
# Example: for a site at "contoso.sharepoint.com/sites/BotFiles" curl -H "Authorization: Bearer $TOKEN" \ "https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles"
# Response includes: "id": "contoso.sharepoint.com,guid1,guid2" ```
- Konfigurera OpenClaw:
json5
{
channels: {
msteams: {
// ... other config ...
sharePointSiteId: "contoso.sharepoint.com,guid1,guid2",
},
},
}
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) |
Delning per användare är säkrare eftersom endast chattdeltagare kan komma åt filen. Om 'Chat.Read.All' tillstånd saknas, faller boten tillbaka till hela organisationen.
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 CLI message.
Parametern card accepterar ett Adaptive Card JSON-objekt. När card anges är meddelandetexten frivillig.
Agentverktyg:
{
"action": "send",
"channel": "msteams",
"target": "user:<id>",
"card": {
"type": "AdaptiveCard",
"version": "1.5",
"body": [{ "type": "TextBlock", "text": "Hello!" }]
}
}
CLI:
openclaw message send --channel msteams \
--target "conversation:19:abc...@thread.tacv2" \
--card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello!"}]}'
Se Adaptive Cards documentation för kortschema och exempel. För information om målformat, se Målformat nedan.
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:abc123...@thread.tacv2 |
| Grupp/kanal (rå) | <conversation-id> |
19:abc123...@thread.tacv2 (om innehåller @thread) |
CLI-exempel:
# Send to a user by ID
openclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Hello"
# Send to a user by display name (triggers Graph API lookup)
openclaw message send --channel msteams --target "user:John Smith" --message "Hello"
# Send to a group chat or channel
openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Hello"
# Send an Adaptive Card to a conversation
openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" \
--card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello"}]}'
Agentverktygsexempel:
{
"action": "send",
"channel": "msteams",
"target": "user:John Smith",
"message": "Hello!"
}
{
"action": "send",
"channel": "msteams",
"target": "conversation:19:abc...@thread.tacv2",
"card": {
"type": "AdaptiveCard",
"version": "1.5",
"body": [{ "type": "TextBlock", "text": "Hello" }]
}
}
Obs: Utan prefixet 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:
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...
└────────────────────────────┘
Team ID (URL-decode this)
Kanal-URL:
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...
└─────────────────────────┘
Channel ID (URL-decode this)
För konfig:
- Lag ID = sökväg segment efter
/team/(URL-avkodad, t.ex.,19:Bk4j...@thread.tacv2) - 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) |
Workarounds om privata kanaler inte fungerar:
- 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)
Felsökning¶
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