sharePointSiteId + Graph-machtigingen vereist (zie Bestanden verzenden in groepschats). Peilingen worden via Adaptive Cards verzonden. Berichtacties bieden expliciete upload-file voor verzendingen waarbij het bestand vooropstaat.
Gebundelde Plugin
Microsoft Teams wordt in huidige OpenClaw-releases als gebundelde Plugin geleverd; in de normale verpakte build is geen afzonderlijke installatie vereist. Installeer bij een oudere build of een aangepaste installatie zonder gebundelde Teams de npm-package rechtstreeks:Snelle installatie
@microsoft/teams.cli verzorgt botregistratie, het maken van het manifest en het genereren van inloggegevens met één opdracht.
1. Installeren en aanmelden
De Teams CLI bevindt zich momenteel in preview. Opdrachten en vlaggen kunnen tussen releases veranderen.
--allow-anonymous is vereist omdat Teams zich niet bij devtunnels kan verifiëren. Elk binnenkomend botverzoek wordt nog steeds door de Teams SDK gevalideerd.ngrok http 3978 of tailscale funnel 3978 (URL’s kunnen elke sessie veranderen).
3. De app maken
CLIENT_ID, CLIENT_SECRET, TENANT_ID en een Teams App ID; er wordt ook aangeboden de app rechtstreeks in Teams te installeren.
4. OpenClaw configureren met de inloggegevens uit de uitvoer:
MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
5. De app in Teams installeren
teams app create vraagt je de app te installeren; selecteer “Install in Teams”. Voer het volgende uit om de installatielink later op te halen:
Groepschats worden standaard geblokkeerd (
channels.msteams.groupPolicy: "allowlist"). Stel channels.msteams.groupAllowFrom in om groepsantwoorden toe te staan, of gebruik groupPolicy: "open" om elk lid toe te staan (alleen bij vermelding).Doelen
- Praat met OpenClaw via DM’s, groepschats of kanalen in Teams.
- Houd routering deterministisch: antwoorden gaan altijd terug naar het kanaal waarop ze zijn binnengekomen.
- Gebruik standaard veilig kanaalgedrag (vermeldingen vereist, tenzij anders geconfigureerd).
Configuratieschrijven
Microsoft Teams kan standaard configuratie-updates schrijven die door/config set|unset worden geactiveerd (vereist commands.config: true).
Schakel dit uit met:
Toegangsbeheer (DM’s + groepen)
DM-toegang- Standaard:
channels.msteams.dmPolicy = "pairing". Onbekende afzenders worden genegeerd totdat ze zijn goedgekeurd. channels.msteams.allowFrommoet stabiele AAD-object-ID’s of statische afzendertoegangsgroepen gebruiken, zoalsaccessGroup:core-team.- Vertrouw voor toelatingslijsten niet op overeenkomsten met UPN/weergavenaam; deze kunnen veranderen. OpenClaw schakelt rechtstreekse naamvergelijking standaard uit; schakel dit in met
channels.msteams.dangerouslyAllowNameMatching: true. - De wizard kan namen via Microsoft Graph naar ID’s omzetten wanneer de inloggegevens dit toestaan.
- Standaard:
channels.msteams.groupPolicy = "allowlist"(geblokkeerd tenzij jegroupAllowFromtoevoegt).channels.defaults.groupPolicykan de gedeelde standaardwaarde overschrijven wanneerchannels.msteams.groupPolicyniet is ingesteld. channels.msteams.groupAllowFrombepaalt welke afzenders of statische afzendertoegangsgroepen acties in groepschats/kanalen kunnen activeren (valt terug opchannels.msteams.allowFrom).- Stel
groupPolicy: "open"in om elk lid toe te staan (standaard nog steeds alleen bij vermelding). - Stel
channels.msteams.groupPolicy: "disabled"in om alle kanalen te blokkeren.
- Beperk antwoorden in groepen/kanalen door teams en kanalen onder
channels.msteams.teamste vermelden. - Gebruik stabiele Teams-gespreks-ID’s uit Teams-links als sleutels, niet veranderlijke weergavenamen (zie Team- en kanaal-ID’s).
- Wanneer
groupPolicy="allowlist"en een toelatingslijst voor teams aanwezig zijn, worden alleen vermelde teams/kanalen geaccepteerd (alleen bij vermelding). - De configuratiewizard accepteert
Team/Channel-vermeldingen en slaat deze voor je op. - Bij het opstarten zet OpenClaw namen uit de toelatingslijsten voor teams/kanalen en gebruikers om naar ID’s (wanneer Graph-machtigingen dit toestaan) en registreert de toewijzing in het logboek. Niet-omgezette namen blijven zoals ingevoerd behouden, maar worden voor routering genegeerd, tenzij
channels.msteams.dangerouslyAllowNameMatching: trueis ingesteld.
Gefedereerde authenticatie (certificaat plus beheerde identiteit)
Voor productie ondersteunt OpenClaw gefedereerde authenticatie viachannels.msteams.authType: "federated" als alternatief voor clientgeheimen. Er zijn twee methoden:
Optie A: Authenticatie op basis van een certificaat
Gebruik een PEM-certificaat dat bij je Entra ID-appregistratie is geregistreerd. Installatie:- Genereer of verkrijg een certificaat (PEM-indeling met privésleutel).
- Entra ID → App Registration → Certificates & secrets → Certificates → upload het openbare certificaat.
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
Optie B: Azure Managed Identity
Gebruik Azure Managed Identity voor authenticatie zonder wachtwoord op Azure-infrastructuur (AKS, App Service, Azure-VM’s). Hoe het werkt:- De botpod/VM heeft een beheerde identiteit (door het systeem of de gebruiker toegewezen).
- Een inloggegeven voor gefedereerde identiteit koppelt de beheerde identiteit aan de Entra ID-appregistratie.
- Tijdens runtime gebruikt OpenClaw
@azure/identityom tokens van het Azure IMDS-eindpunt te verkrijgen. - Het token wordt voor botverificatie aan de Teams SDK doorgegeven.
- Azure-infrastructuur waarvoor beheerde identiteit is ingeschakeld (AKS-workloadidentiteit, App Service, VM).
- Referentie voor federatieve identiteit aangemaakt voor de Entra ID-appregistratie.
- Netwerktoegang tot IMDS (
169.254.169.254:80) vanuit de pod/VM.
managedIdentityClientId: "<MI_CLIENT_ID>" toe aan het bovenstaande blok.
Omgevingsvariabelen:
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(alleen door de gebruiker toegewezen)
AKS-workloadidentiteit instellen
Voor AKS-implementaties die workloadidentiteit gebruiken:- Schakel workloadidentiteit in voor je AKS-cluster.
-
Maak een referentie voor federatieve identiteit aan voor de Entra ID-appregistratie:
-
Voorzie het Kubernetes-serviceaccount van een annotatie met de client-id van de app:
-
Voorzie de pod van een label voor het injecteren van de workloadidentiteit:
-
Sta netwerktoegang toe tot IMDS (
169.254.169.254): voeg bij gebruik van NetworkPolicy een uitgaande regel toe voor169.254.169.254/32op poort 80.
Vergelijking van verificatietypen
certificateThumbprint kan naast certificatePath worden ingesteld, maar wordt momenteel niet door het verificatiepad gelezen; het wordt alleen geaccepteerd voor toekomstige compatibiliteit.
Standaard: wanneer authType niet is ingesteld, gebruikt OpenClaw verificatie met een clientgeheim (appPassword). Bestaande configuraties blijven ongewijzigd werken.
Lokale ontwikkeling (tunneling)
Teams kanlocalhost niet bereiken. Gebruik een permanente ontwikkelingstunnel, zodat de URL tussen sessies stabiel blijft:
ngrok http 3978 of tailscale funnel 3978 (URL’s kunnen per sessie veranderen).
Werk het eindpunt bij als de tunnel-URL verandert:
De bot testen
Voer diagnostiek uit:- Installeer de Teams-app (installatielink uit
teams app get <id> --install-link). - Zoek de bot in Teams en stuur een privébericht.
- Controleer de Gateway-logboeken op binnenkomende activiteit.
Omgevingsvariabelen
Deze verificatiegerelateerde configuratiesleutels kunnen via omgevingsvariabelen worden ingesteld in plaats van viaopenclaw.json (andere configuratiesleutels, zoals groupPolicy of historyLimit, kunnen alleen via de configuratie worden ingesteld):
Actie voor lidgegevens
OpenClaw biedt voor Microsoft Teams een door Graph ondersteunde actiemember-info, zodat agents en automatiseringen geverifieerde roosterdetails voor een geconfigureerd gesprek kunnen opzoeken.
Vereisten:
ChannelSettings.Read.Group- enTeamMember.Read.Group-RSC-machtigingen (al opgenomen in het aanbevolen manifest).
channels.msteams.actions.memberInfo.
Zoekacties in standaardkanalen retourneren de overeenkomende identiteit in het teamrooster, de weergavenaam, het e-mailadres en de rollen.
In het huidige privébericht of de huidige groepschat kan de actie de stabiele gebruikers-id van de vertrouwde afzender retourneren.
Voor het opzoeken van leden in privé-/gedeelde kanalen en niet-huidige chats zijn aanvullende roostermachtigingen vereist
en deze zoekacties worden door de standaardmachtigingen geweigerd.
Geschiedeniscontext
channels.msteams.historyLimitbepaalt hoeveel recente kanaal-/groepsberichten in de prompt worden opgenomen. Valt terug opmessages.groupChat.historyLimiten vervolgens standaard op 50. Stel0in om dit uit te schakelen.- Opgehaalde threadgeschiedenis wordt gefilterd op basis van toegestane afzenders (
allowFrom/groupAllowFrom), zodat het vullen van de threadcontext alleen berichten van toegestane afzenders bevat. - De context van geciteerde bijlagen (geparseerd uit de HTML van het Skype Reply-schema in de eigen bijlagen van een antwoord) wordt ongefilterd doorgegeven; momenteel wordt het filter voor toegestane afzenders alleen toegepast bij het vullen vanuit de threadgeschiedenis.
- De geschiedenis van privéberichten kan worden beperkt met
channels.msteams.dmHistoryLimit(gebruikersbeurten). Overschrijvingen per gebruiker:channels.msteams.dms["<user_id>"].historyLimit.
Huidige Teams-RSC-machtigingen (manifest)
Dit zijn de bestaande resourceSpecific-machtigingen in ons Teams-appmanifest. Ze zijn alleen van toepassing binnen het team/de chat waarin de app is geïnstalleerd. Voor kanalen (teambereik):ChannelMessage.Read.Group(Application) - alle kanaalberichten ontvangen zonder @vermeldingChannelMessage.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) - alle groepschatberichten ontvangen zonder @vermelding
Voorbeeld van een Teams-manifest (geredigeerd)
Minimaal, geldig voorbeeld met de vereiste velden. Vervang id’s en URL’s.Aandachtspunten voor het manifest (verplichte velden)
bots[].botIdmoet overeenkomen met de Azure Bot App ID.webApplicationInfo.idmoet overeenkomen met de Azure Bot App ID.bots[].scopesmoet de oppervlakken bevatten die je wilt gebruiken (personal,team,groupChat).bots[].supportsFiles: trueis vereist voor bestandsverwerking binnen het persoonlijke bereik.authorization.permissions.resourceSpecificmoet het lezen/verzenden van kanaalverkeer omvatten.
Een bestaande app bijwerken
Mogelijkheden: alleen RSC tegenover Graph
Met alleen Teams RSC (app geïnstalleerd, geen Graph API-machtigingen)
Werkt:- De tekstuele inhoud van kanaalberichten lezen.
- De tekstuele inhoud van kanaalberichten verzenden.
- Bestandsbijlagen in persoonlijke berichten (privéberichten) ontvangen.
- De inhoud van afbeeldingen of bestanden in kanalen/groepen (de payload bevat alleen een HTML-placeholder).
- Bijlagen downloaden die in SharePoint/OneDrive zijn opgeslagen.
- De berichtgeschiedenis lezen buiten de live Webhook-gebeurtenis.
Met Teams RSC + Microsoft Graph-toepassingsmachtigingen
Voegt het volgende toe:- Gehoste inhoud downloaden (afbeeldingen die in berichten zijn geplakt).
- Bestandsbijlagen downloaden die in SharePoint/OneDrive zijn opgeslagen.
- De geschiedenis van kanaal-/chatberichten lezen via Graph.
RSC tegenover Graph API
Kortom: RSC is voor realtime luisteren; Graph API is voor toegang tot historische gegevens. Om gemiste berichten na offlinegebruik in te halen, heb je Graph API met
ChannelMessage.Read.All nodig (vereist beheerderstoestemming).
Media + geschiedenis met Graph
Schakel alleen de Microsoft Graph-toepassingsmachtigingen in die nodig zijn voor de Teams-bereiken en gegevens die je gebruikt:- Entra ID (Azure AD) App Registration → voeg Graph Application permissions toe:
ChannelMessage.Read.Allvoor kanaalbijlagen en kanaalgeschiedenis.Chat.Read.Allvoor groepschatbijlagen en groepschatgeschiedenis.Files.Read.Allwanneer bijlagebytes uit SharePoint-/OneDrive-opslag moeten worden gedownload; configuraties die alleen geschiedenis gebruiken, hebben dit niet nodig.
- Grant admin consent voor de tenant.
- Verhoog de manifest version van de Teams-app, upload deze opnieuw en installeer de app opnieuw in Teams.
- Sluit Teams volledig af en start het opnieuw om app-metadata uit de cache te wissen.
Herstel van kanaal-/groepsbestanden (graphMediaFallback)
Teams kan bestandsmarkeringen verwijderen uit de HTML-activiteit die naar een bot wordt verzonden. In dat geval is de Bot Framework-activiteit niet te onderscheiden van een gewoon HTML-bericht; de volledige bijlageverwijzing bestaat alleen in de Graph-kopie van het bericht.
Schakel de fallback in nadat je de bovenstaande machtigingen hebt verleend:
false, zodat bestaande installaties niet automatisch extra Graph-verkeer of machtigingsfouten krijgen.
Gebruikersvermeldingen: @vermeldingen werken direct voor gebruikers die al aan het gesprek deelnemen. Om dynamisch gebruikers te zoeken en te vermelden die niet aan het huidige gesprek deelnemen, voeg je de machtiging User.Read.All (Application) toe en verleen je beheerderstoestemming.
Bekende beperkingen
Webhook-time-outs
Teams levert berichten via een HTTP-webhook. OpenClaw past vaste time-outs van de HTTP-server toe op die webhooklistener: 30s inactiviteit, 30s totale aanvraagduur en 15s om headers te ontvangen. Optionele verrijking van inkomende media en context heeft een gedeeld budget van 10 seconden. De SDK retourneert nadat de onbewerkte activiteit duurzaam is toegevoegd; de agentbeurt wordt onafhankelijk verwerkt en antwoorden worden proactief verzonden. Als de afhandeling van de aanvraag of duurzame toelating het transportvenster mist, kan Teams de activiteit opnieuw proberen en wijst de ingress-tombstone een herhaalde gebeurtenis-ID af.Ondersteuning voor Teams-clouds en service-URL’s
Dit door de SDK ondersteunde Teams-pad is live gevalideerd voor de openbare cloud van Microsoft Teams. Inkomende antwoorden gebruiken de Teams SDK-beurtcontext van het inkomende bericht. Proactieve bewerkingen buiten de context — verzendingen, bewerkingen, verwijderingen, kaarten, peilingen, berichten voor bestandstoestemming en in de wachtrij geplaatste langlopende antwoorden — gebruiken de opgeslagen gespreksverwijzingserviceUrl. De openbare cloud gebruikt standaard de openbare-cloudomgeving van de Teams SDK en staat opgeslagen verwijzingen toe op de openbare Teams Connector-host: https://smba.trafficmanager.net/.
De openbare cloud is de standaard. Voor normale bots in de openbare cloud hoef je channels.msteams.cloud of channels.msteams.serviceUrl niet in te stellen.
Stel voor niet-openbare Teams-clouds cloud en de bijbehorende proactieve grens in wanneer Microsoft er een publiceert:
channels.msteams.cloudselecteert de Teams SDK-cloudpreset voor authenticatie, JWT-validatie, tokenservices en Graph-bereik.channels.msteams.serviceUrlselecteert de Bot Connector-eindpuntgrens die wordt gebruikt om opgeslagen gespreksverwijzingen te valideren vóór proactieve verzendingen, bewerkingen, verwijderingen, kaarten, peilingen, berichten voor bestandstoestemming en in de wachtrij geplaatste langlopende antwoorden. Dit is vereist voor USGov- en DoD-SDK-clouds. Voor China/21Vianet gebruikt OpenClaw de SDK-presetChinaen accepteert het opgeslagen/geconfigureerde service-URL’s alleen op Azure China Bot Framework-kanaalhosts.
serviceUrl van de inkomende activiteit; gebruik anders de onderstaande tabel van Microsoft.
Voorbeeld voor GCC, waarvoor Microsoft een afzonderlijke proactieve service-URL documenteert, maar de Teams SDK geen afzonderlijke GCC-cloudpreset beschikbaar stelt:
channels.msteams.serviceUrl is beperkt tot ondersteunde Microsoft Teams Bot Connector-hosts. Wanneer een service-URL is geconfigureerd, controleert OpenClaw vóór proactieve verzendingen, bewerkingen, verwijderingen, kaarten, peilingen of langlopende antwoorden in de wachtrij worden uitgevoerd of de opgeslagen serviceUrl van het gesprek dezelfde host gebruikt. Met de standaardconfiguratie voor de openbare cloud weigert OpenClaw de bewerking als een opgeslagen gesprek naar een locatie buiten de openbare Teams Connector-host verwijst. Ontvang na het wijzigen van de cloud-/service-URL-instellingen een nieuw bericht uit het gesprek, zodat de opgeslagen gespreksverwijzing actueel is.
China/21Vianet heeft geen afzonderlijke wereldwijde proactieve smba-URL in de tabel met proactieve Teams-eindpunten van Microsoft. Configureer cloud: "China", zodat de Teams SDK Azure China-eindpunten voor authenticatie, tokens en JWT gebruikt. Proactieve verzendingen vereisen vervolgens een opgeslagen gespreksverwijzing uit een inkomende China Teams-activiteit, of een expliciet geconfigureerde service-URL, binnen de Azure China Bot Framework-kanaalgrens (*.botframework.azure.cn). Teams-helpers die Graph gebruiken, zijn uitgeschakeld voor cloud: "China" totdat OpenClaw Graph-aanvragen via het Azure China Graph-eindpunt routeert.
Opmaak
Teams-markdown is beperkter dan Slack- of Discord-markdown:- Basisopmaak werkt: vet, cursief,
code, links. - Complexe markdown (tabellen, geneste lijsten) wordt mogelijk niet correct weergegeven.
- Adaptive Cards worden ondersteund voor peilingen en semantische presentatieweergaven (zie hieronder).
Configuratie
Belangrijkste instellingen (zie /gateway/configuration voor gedeelde kanaalpatronen):channels.msteams.enabled: het kanaal in-/uitschakelen.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: botreferenties.channels.msteams.cloud: Teams SDK-cloudomgeving (Public,USGov,USGovDoDofChina; standaardPublic). Stel dit metserviceUrlin voor USGov/DoD SDK-clouds; China gebruikt de SDK-voorinstelling en opgeslagen Azure China Bot Framework-gespreksreferenties, waarbij Graph-ondersteunde helpers zijn uitgeschakeld totdat routering voor Azure China Graph beschikbaar is.channels.msteams.serviceUrl: grens van de Bot Connector-service-URL voor proactieve SDK-bewerkingen. De openbare cloud gebruikt de SDK-standaardwaarde; stel dit in voor GCC (https://smba.infra.gcc.teams.microsoft.com/teams), GCC High of DoD. China accepteert Azure China Bot Framework-kanaalhosts wanneer de opgeslagen gespreksreferentie afkomstig is van Teams dat door 21Vianet wordt beheerd.channels.msteams.webhook.port(standaard3978).channels.msteams.webhook.path(standaard/api/messages).channels.msteams.dmPolicy:pairing | allowlist | open | disabled(standaardpairing).channels.msteams.allowFrom: toelatingslijst voor privéberichten (AAD-object-id’s aanbevolen). De wizard zet tijdens de configuratie namen om in id’s wanneer Graph-toegang beschikbaar is.channels.msteams.dangerouslyAllowNameMatching: noodschakelaar om veranderlijke overeenkomsten op basis van UPN/weergavenaam en directe routering op team-/kanaalnaam opnieuw in te schakelen.channels.msteams.textChunkLimit: grootte van uitgaande tekstsegmenten in tekens (standaard4000en strikt begrensd op4000, ongeacht een hoger geconfigureerde waarde).channels.msteams.streaming.chunkMode:length(standaard) ofnewlineom vóór segmentering op lengte te splitsen bij lege regels (alineagrenzen).channels.msteams.mediaAllowHosts: toelatingslijst voor hosts van inkomende bijlagen (standaard Microsoft-/Teams-domeinen: Graph, SharePoint/OneDrive, Teams CDN, Bot Framework, Azure Media Services).channels.msteams.mediaAuthAllowHosts: toelatingslijst voor het toevoegen van Authorization-headers bij nieuwe pogingen voor media (standaard Graph- en Bot Framework-hosts).channels.msteams.graphMediaFallback: Graph-zoekopdrachten voor berichten inschakelen wanneer HTML van kanalen/groepen geen bestandsmarkeringen bevat (standaardfalse; zie Bestandsherstel voor kanalen/groepen).channels.msteams.mediaMaxMb: afwijkende maximale mediagrootte per kanaal in MB. Valt terug opagents.defaults.mediaMaxMbwanneer dit niet is ingesteld.channels.msteams.requireMention: @vermelding vereisen in kanalen/groepen (standaardtrue).channels.msteams.replyStyle:thread | top-level(zie Antwoordstijl).channels.msteams.teams.<teamId>.replyStyle: afwijkende instelling per team.channels.msteams.teams.<teamId>.requireMention: afwijkende instelling per team.channels.msteams.teams.<teamId>.tools: standaard afwijkende instellingen voor het toolbeleid per team (allow/deny/alsoAllow) die worden gebruikt wanneer een afwijkende kanaalinstelling ontbreekt.channels.msteams.teams.<teamId>.toolsBySender: standaard afwijkende instellingen voor het toolbeleid per afzender en per team (jokerteken"*"wordt ondersteund).channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: afwijkende instelling per kanaal.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: afwijkende instelling per kanaal.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: afwijkende instellingen voor het toolbeleid per kanaal (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: afwijkende instellingen voor het toolbeleid per afzender en per kanaal (jokerteken"*"wordt ondersteund).- Sleutels voor
toolsBySendermoeten expliciete voorvoegsels gebruiken:channel:,id:,e164:,username:,name:(verouderde sleutels zonder voorvoegsel worden nog steeds uitsluitend aanid:gekoppeld). channels.msteams.authType: authenticatietype:"secret"(standaard) of"federated".channels.msteams.certificatePath: pad naar het PEM-certificaatbestand (gefedereerde authenticatie en certificaatauthenticatie).channels.msteams.certificateThumbprint: certificaatvingerafdruk; wordt geaccepteerd, maar is niet vereist voor authenticatie.channels.msteams.useManagedIdentity: authenticatie met beheerde identiteit inschakelen (gefedereerde modus).channels.msteams.managedIdentityClientId: client-id voor een door de gebruiker toegewezen beheerde identiteit.channels.msteams.sharePointSiteId: SharePoint-site-id voor bestandsuploads in groepschats/kanalen (zie Bestanden verzenden in groepschats).channels.msteams.welcomeCard,channels.msteams.groupWelcomeCard,channels.msteams.promptStarters: Adaptive Card als welkomstbericht, weergegeven bij het eerste contact via een privébericht/groep, en de bijbehorende knoppen met voorgestelde prompts.channels.msteams.responsePrefix: tekst die vóór uitgaande antwoorden wordt geplaatst.channels.msteams.feedbackEnabled(standaardtrue),channels.msteams.feedbackReflection(standaardtrue),channels.msteams.feedbackReflectionCooldownMs: feedback met duim omhoog/omlaag op antwoorden en de reflectievervolgstap na negatieve feedback.channels.msteams.sso,channels.msteams.delegatedAuth: Bot Framework OAuth-verbinding en gedelegeerde Graph-bereiken voor door SSO ondersteunde flows;sso.enabled: truevereistsso.connectionName.
Routering en sessies
- Sessiesleutels volgen de standaardindeling voor agents (zie /concepts/session):
- Privéberichten delen de hoofdsessie (
agent:<agentId>:<mainKey>). - Kanaal-/groepsberichten gebruiken de gespreks-id:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Privéberichten delen de hoofdsessie (
Antwoordstijl: threads versus posts
Teams heeft twee kanaal-UI-stijlen boven op hetzelfde onderliggende gegevensmodel:
Het probleem: de Teams-API maakt niet bekend welke UI-stijl een kanaal gebruikt. Als je de verkeerde
replyStyle gebruikt:
threadin een kanaal met Threads-stijl → antwoorden worden onhandig genest weergegeven.top-levelin een kanaal met Posts-stijl → antwoorden verschijnen als afzonderlijke posts op het hoogste niveau in plaats van in de thread.
replyStyle per kanaal op basis van de manier waarop het kanaal is ingesteld:
Resolutievolgorde
Wanneer de bot een antwoord naar een kanaal verzendt, wordtreplyStyle bepaald vanaf de meest specifieke afwijkende instelling tot en met de standaardwaarde. De eerste waarde die niet undefined is, wordt gebruikt:
- Per kanaal -
channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle - Per team -
channels.msteams.teams.<teamId>.replyStyle - Globaal -
channels.msteams.replyStyle - Impliciete standaardwaarde - afgeleid van
requireMention:requireMention: true→threadrequireMention: false→top-level
requireMention: false globaal instelt zonder een expliciete replyStyle, verschijnen vermeldingen in kanalen met Posts-stijl als posts op het hoogste niveau, zelfs wanneer het inkomende bericht een antwoord in een thread was. Zet replyStyle: "thread" vast op globaal, team- of kanaalniveau om verrassingen te voorkomen.
Voor proactieve verzendingen naar een opgeslagen kanaalgesprek (antwoorden op toolaanroepen in de wachtrij, langlopende agents) geldt dezelfde resolutie voor team en kanaal; groepschats en persoonlijke gesprekken (privéberichten) worden bij proactieve verzendingen altijd omgezet naar top-level, ongeacht replyStyle.
Behoud van threadcontext
WanneerreplyStyle: "thread" van kracht is en de bot vanuit een kanaalthread met @ is vermeld, koppelt OpenClaw de oorspronkelijke threadroot opnieuw aan de uitgaande gespreksreferentie (19:...@thread.tacv2;messageid=<root>), zodat het antwoord in dezelfde thread terechtkomt. Dit geldt zowel voor live verzendingen (binnen dezelfde beurt) als voor proactieve verzendingen nadat de beurtcontext van Bot Framework is verlopen (bijvoorbeeld bij langlopende agents en antwoorden op toolaanroepen in de wachtrij via mcp__openclaw__message).
De threadroot wordt opgehaald uit de opgeslagen threadId in de gespreksreferentie. Oudere opgeslagen referenties die van vóór threadId dateren, vallen terug op activityId (de inkomende activiteit waarmee het gesprek het laatst is geïnitialiseerd), zodat bestaande implementaties blijven werken zonder opnieuw te worden geïnitialiseerd.
Wanneer replyStyle: "top-level" van kracht is, worden inkomende berichten in kanaalthreads bewust beantwoord als nieuwe posts op het hoogste niveau; er wordt geen threadsuffix toegevoegd. Dit is correct voor kanalen met Threads-stijl; posts op het hoogste niveau waar je antwoorden in threads verwachtte, betekenen dat replyStyle voor dat kanaal verkeerd is ingesteld.
Bijlagen en afbeeldingen
Huidige beperkingen:- Privéberichten: afbeeldingen en bestandsbijlagen werken via de bestands-API’s voor Teams-bots.
- Kanalen/groepen: bijlagen bevinden zich in M365-opslag (SharePoint/OneDrive). De Webhook-payload bevat alleen een HTML-placeholder, niet de daadwerkelijke bestandsbytes. Graph API-machtigingen zijn vereist om kanaalbijlagen te downloaden.
- Gebruik voor expliciete verzendingen waarbij het bestand vooropstaat
action=upload-filemetmedia/filePath/path; de optionelemessagewordt de begeleidende tekst/opmerking enfilename(oftitle) overschrijft de geüploade naam.
channels.msteams.mediaAllowHosts (gebruik ["*"] om elke host toe te staan).
Authorization-headers worden alleen toegevoegd voor hosts in channels.msteams.mediaAuthAllowHosts (standaard Graph- en Bot Framework-hosts). Houd deze lijst strikt (vermijd suffixen voor meerdere tenants).
Bestanden verzenden in groepschats
Bots kunnen met de ingebouwde FileConsentCard-flow bestanden in privéberichten verzenden. Voor het verzenden van bestanden in groepschats/kanalen is aanvullende configuratie nodig:Waarom groepschats SharePoint nodig hebben
Bots gebruiken een toepassingsidentiteit, terwijl de/me-resource van Microsoft Graph een aangemelde gebruiker vereist. Om bestanden in groepschats/kanalen te verzenden, uploadt de bot ze naar een SharePoint-site en maakt deze een koppeling voor delen.
Configuratie
-
Voeg Graph API-machtigingen toe in Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) - bestanden uploaden naar SharePoint.ChatMember.Read.All(Application) - tenantbrede machtiging met minimale bevoegdheden voor het verzenden van bestanden in groepschats.Chat.Read.Allwerkt ook en dekt dit al wanneer de geschiedenis van groepschats is ingeschakeld. Gebruik als alternatief per chat deChatMember.Read.Chat-machtiging voor resourcespecifieke toestemming.
- Verleen beheerderstoestemming voor de tenant.
-
Haal de id van je SharePoint-site op:
-
OpenClaw configureren:
Deelgedrag
Delen per gebruiker is veiliger, omdat alleen chatdeelnemers toegang tot het bestand hebben. OpenClaw vereist dat leden voor groepschats succesvol worden opgezocht; bij time-outs, transportfouten, lege resultaten en weigeringen door de Graph API mislukt het verzenden in plaats van de toegang uit te breiden tot de organisatie.
Terugvalgedrag
Opslaglocatie van bestanden
Geüploade bestanden worden opgeslagen in een map/OpenClawShared/ in de standaarddocumentbibliotheek van de geconfigureerde SharePoint-site.
Peilingen (Adaptive Cards)
OpenClaw verzendt Teams-peilingen als Adaptive Cards (er bestaat geen systeemeigen API voor Teams-peilingen).- CLI:
openclaw message poll --channel msteams --target conversation:<id> --poll-question "..." --poll-option "..." --poll-option "...". - Stemmen worden door de Gateway vastgelegd in de SQLite-pluginstatus van OpenClaw onder
state/openclaw.sqlite. - Bestaande
msteams-polls.json-bestanden worden geïmporteerd dooropenclaw doctor --fix, niet door de actieve Plugin. - De Gateway moet online blijven om stemmen vast te leggen.
- Peilingen plaatsen niet automatisch samenvattingen van resultaten en er is nog geen CLI voor peilingresultaten.
Presentatiekaarten
Verzend semantische presentatiepayloads naar Teams-gebruikers of -gesprekken met het hulpprogrammamessage, de CLI of normale antwoordbezorging. OpenClaw rendert ze als Teams Adaptive Cards vanuit het algemene presentatiecontract.
De parameter presentation accepteert semantische blokken. Wanneer presentation is opgegeven, is de berichttekst optioneel. Knoppen worden gerenderd als verzend- of URL-acties van Adaptive Cards. Selectiemenu’s zijn niet systeemeigen in de Teams-renderer, dus zet OpenClaw ze vóór bezorging om in leesbare tekst.
Agent-hulpprogramma:
Doelindelingen
MSTeams-doelen gebruiken voorvoegsels om onderscheid te maken tussen gebruikers en gesprekken:
CLI-voorbeelden:
Zonder het voorvoegsel
user: worden namen standaard als groep of team omgezet. Gebruik altijd user: wanneer je personen op basis van hun weergavenaam als doel instelt.Proactieve berichten
- Proactieve berichten zijn alleen mogelijk nadat een gebruiker interactie heeft gehad, omdat OpenClaw op dat moment gespreksverwijzingen opslaat.
- Zie /gateway/configuration voor
dmPolicyen beperking via de toelatingslijst.
Team- en kanaal-ID’s (veelvoorkomende valkuil)
De queryparametergroupId in Teams-URL’s is NIET de team-ID die voor configuratie wordt gebruikt. Extraheer de ID’s in plaats daarvan uit het URL-pad:
Team-URL:
- Teamsleutel = padsegment na
/team/(URL-gedecodeerd, bijvoorbeeld19:Bk4j...@thread.tacv2; oudere tenants kunnen@thread.skypetonen, wat ook geldig is). - Kanaalsleutel = padsegment na
/channel/(URL-gedecodeerd). - Negeer de queryparameter
groupIdvoor OpenClaw-routering. Dit is de Microsoft Entra-groeps-ID, niet de Bot Framework-gespreks-ID die in inkomende Teams-activiteiten wordt gebruikt.
Privékanalen
Bots worden beperkt ondersteund in privékanalen:
Tijdelijke oplossingen als privékanalen niet werken:
- Gebruik standaardkanalen voor interacties met bots.
- Gebruik privéberichten; gebruikers kunnen de bot altijd rechtstreeks een bericht sturen.
- Gebruik de Graph API voor toegang tot de geschiedenis (vereist
ChannelMessage.Read.All).
Problemen oplossen
Veelvoorkomende problemen
- Afbeeldingen worden niet weergegeven in kanalen: Graph-machtigingen of beheerderstoestemming ontbreken. Installeer de Teams-app opnieuw, sluit Teams volledig af en open het opnieuw.
- Geen antwoorden in het kanaal: vermeldingen zijn standaard vereist; stel
channels.msteams.requireMention=falsein of configureer dit per team/kanaal. - Versie komt niet overeen (Teams toont nog steeds het oude manifest): verwijder de app, voeg deze opnieuw toe en sluit Teams volledig af om te vernieuwen.
- 401 Unauthorized van de Webhook: verwacht bij handmatig testen zonder Azure-JWT; dit betekent dat het eindpunt bereikbaar is, maar dat authenticatie is mislukt. Gebruik Azure Web Chat om correct te testen.
Fouten bij het uploaden van het manifest
- “Icon file cannot be empty”: het manifest verwijst naar pictogrambestanden van 0 bytes. Maak geldige PNG-pictogrammen (32x32 voor
outline.png, 192x192 voorcolor.png). - “webApplicationInfo.Id already in use”: de app is nog geïnstalleerd in een ander team/andere chat. Zoek en verwijder deze installatie eerst, of wacht 5-10 minuten op de verspreiding.
- “Something went wrong” bij uploaden: upload in plaats daarvan via https://admin.teams.microsoft.com, open de DevTools van de browser (F12) → tabblad Network en controleer de hoofdtekst van het antwoord op de werkelijke fout.
- Sideloaden mislukt: probeer “Upload an app to your org’s app catalog” in plaats van “Upload a custom app”; hiermee worden beperkingen voor sideloaden vaak omzeild.
RSC-machtigingen werken niet
- Controleer of
webApplicationInfo.idexact overeenkomt met de App ID van je bot. - Upload de app opnieuw en installeer deze opnieuw in het team/de chat.
- Controleer of de beheerder van je organisatie RSC-machtigingen heeft geblokkeerd.
- Controleer of je het juiste bereik gebruikt:
ChannelMessage.Read.Groupvoor teams,ChatMessage.Read.Chatvoor groepschats.
Verwijzingen
- Azure Bot maken - installatiehandleiding voor Azure Bot
- Teams Developer Portal - Teams-apps maken/beheren
- Schema voor Teams-appmanifesten
- Kanaalberichten ontvangen met RSC
- Naslaginformatie voor RSC-machtigingen
- Bestandsverwerking door Teams-bots (kanaal/groep vereist Graph)
- Proactieve berichten
- @microsoft/teams.cli - Teams CLI voor botbeheer
Gerelateerd
- Overzicht van kanalen - alle ondersteunde kanalen
- Koppelen - DM-authenticatie en koppelingsflow
- Groepen - gedrag van groepschats en vermelding als voorwaarde
- Kanaalroutering - sessieroutering voor berichten
- Beveiliging - toegangsmodel en versterking