Microsoft Teams
„Lasst, die ihr eintretet, alle Hoffnung fahren.“Aktualisiert: 2026-03-25 Status: Text + DM-Anhänge werden unterstützt; das Senden von Dateien in Kanälen/Gruppen erfordert
sharePointSiteId + Graph-Berechtigungen (siehe Dateien in Gruppenchats senden). Polls werden über Adaptive Cards gesendet. Nachrichtenaktionen stellen explizit upload-file für dateiorientierte Sendungen bereit.
Gebündeltes Plugin
Microsoft Teams wird in aktuellen OpenClaw-Releases als gebündeltes Plugin ausgeliefert, daher ist in der normalen paketierten Build-Variante keine separate Installation erforderlich. Wenn du eine ältere Build-Version oder eine benutzerdefinierte Installation verwendest, die gebündelte Teams-Unterstützung ausschließt, installiere es manuell:Schnelle Einrichtung (Einsteiger)
- Stelle sicher, dass das Microsoft Teams-Plugin verfügbar ist.
- Aktuelle paketierte OpenClaw-Releases enthalten es bereits gebündelt.
- Ältere/benutzerdefinierte Installationen können es mit den obigen Befehlen manuell hinzufügen.
- Erstelle einen Azure Bot (App-ID + Client-Secret + Mandanten-ID).
- Konfiguriere OpenClaw mit diesen Anmeldedaten.
- Stelle
/api/messages(standardmäßig Port 3978) über eine öffentliche URL oder einen Tunnel bereit. - Installiere das Teams-App-Paket und starte das Gateway.
channels.msteams.groupPolicy: "allowlist"). Um Gruppenantworten zu erlauben, setze channels.msteams.groupAllowFrom (oder verwende groupPolicy: "open", um jedes Mitglied zuzulassen, mention-gesteuert).
Ziele
- Mit OpenClaw über Teams-DMs, Gruppenchats oder Kanäle kommunizieren.
- Routing deterministisch halten: Antworten gehen immer an den Kanal zurück, über den sie eingegangen sind.
- Standardmäßig sicheres Kanalverhalten verwenden (Erwähnungen erforderlich, sofern nicht anders konfiguriert).
Konfigurationsschreibvorgänge
Standardmäßig darf Microsoft Teams Konfigurationsaktualisierungen schreiben, die durch/config set|unset ausgelöst werden (erfordert commands.config: true).
Deaktivieren mit:
Zugriffskontrolle (DMs + Gruppen)
DM-Zugriff- Standard:
channels.msteams.dmPolicy = "pairing". Unbekannte Absender werden ignoriert, bis sie genehmigt werden. channels.msteams.allowFromsollte stabile AAD-Objekt-IDs verwenden.- UPNs/Anzeigenamen sind veränderlich; direktes Matching ist standardmäßig deaktiviert und wird nur mit
channels.msteams.dangerouslyAllowNameMatching: trueaktiviert. - Der Assistent kann Namen über Microsoft Graph in IDs auflösen, wenn die Anmeldedaten das zulassen.
- Standard:
channels.msteams.groupPolicy = "allowlist"(blockiert, außer du fügstgroupAllowFromhinzu). Verwendechannels.defaults.groupPolicy, um den Standard zu überschreiben, wenn er nicht gesetzt ist. channels.msteams.groupAllowFromsteuert, welche Absender in Gruppenchats/Kanälen auslösen dürfen (fällt aufchannels.msteams.allowFromzurück).- Setze
groupPolicy: "open", um jedes Mitglied zuzulassen (standardmäßig weiterhin mention-gesteuert). - Um keine Kanäle zuzulassen, setze
channels.msteams.groupPolicy: "disabled".
- Begrenze Gruppen-/Kanalantworten, indem du Teams und Kanäle unter
channels.msteams.teamsauflistest. - Schlüssel sollten stabile Team-IDs und Kanal-Konversations-IDs verwenden.
- Wenn
groupPolicy="allowlist"und eine Teams-Zulassungsliste vorhanden ist, werden nur aufgelistete Teams/Kanäle akzeptiert (mention-gesteuert). - Der Konfigurationsassistent akzeptiert
Team/Kanal-Einträge und speichert sie für dich. - Beim Start löst OpenClaw Team-/Kanal- und Benutzer-Zulassungslistennamen in IDs auf (wenn Graph-Berechtigungen das zulassen)
und protokolliert die Zuordnung; nicht aufgelöste Team-/Kanalnamen werden wie eingegeben beibehalten, aber standardmäßig für das Routing ignoriert, außer
channels.msteams.dangerouslyAllowNameMatching: trueist aktiviert.
So funktioniert es
- Stelle sicher, dass das Microsoft Teams-Plugin verfügbar ist.
- Aktuelle paketierte OpenClaw-Releases enthalten es bereits gebündelt.
- Ältere/benutzerdefinierte Installationen können es mit den obigen Befehlen manuell hinzufügen.
- Erstelle einen Azure Bot (App-ID + Secret + Mandanten-ID).
- Erstelle ein Teams-App-Paket, das auf den Bot verweist und die untenstehenden RSC-Berechtigungen enthält.
- Lade die Teams-App hoch/installiere sie in einem Team (oder im persönlichen Bereich für DMs).
- Konfiguriere
msteamsin~/.openclaw/openclaw.json(oder über Umgebungsvariablen) und starte das Gateway. - Das Gateway lauscht standardmäßig auf Bot Framework-Webhook-Traffic unter
/api/messages.
Azure Bot-Einrichtung (Voraussetzungen)
Bevor du OpenClaw konfigurierst, musst du eine Azure Bot-Ressource erstellen.Schritt 1: Azure Bot erstellen
- Gehe zu Azure Bot erstellen
-
Fülle die Registerkarte Basics aus:
Feld Wert Bot handle Dein Bot-Name, z. B. openclaw-msteams(muss eindeutig sein)Subscription Wähle dein Azure-Abonnement aus Resource group Neu erstellen oder vorhandene verwenden Pricing tier Free für Entwicklung/Tests Type of App Single Tenant (empfohlen – siehe Hinweis unten) Creation type Create new Microsoft App ID
Hinweis zur Einstellung: Die Erstellung neuer mandantenübergreifender Bots wurde nach dem 2025-07-31 eingestellt. Verwende für neue Bots Single Tenant.
- Klicke auf Review + create → Create (warte ca. 1–2 Minuten)
Schritt 2: Anmeldedaten abrufen
- Gehe zu deiner Azure Bot-Ressource → Configuration
- Kopiere Microsoft App ID → das ist deine
appId - Klicke auf Manage Password → gehe zur App-Registrierung
- Unter Certificates & secrets → New client secret → kopiere den Value → das ist dein
appPassword - Gehe zu Overview → kopiere Directory (tenant) ID → das ist deine
tenantId
Schritt 3: Nachrichtenendpunkt konfigurieren
- In Azure Bot → Configuration
- Setze Messaging endpoint auf deine Webhook-URL:
- Produktion:
https://your-domain.com/api/messages - Lokale Entwicklung: Verwende einen Tunnel (siehe unten Lokale Entwicklung)
- Produktion:
Schritt 4: Teams-Kanal aktivieren
- In Azure Bot → Channels
- Klicke auf Microsoft Teams → Configure → Save
- Akzeptiere die Nutzungsbedingungen
Föderierte Authentifizierung (Zertifikat + Managed Identity)
Hinzugefügt in 2026.3.24Für Produktionsbereitstellungen unterstützt OpenClaw föderierte Authentifizierung als sicherere Alternative zu Client-Secrets. Es sind zwei Methoden verfügbar:
Option A: Zertifikatbasierte Authentifizierung
Verwende ein PEM-Zertifikat, das in deiner Entra ID-App-Registrierung registriert ist. Einrichtung:- Erzeuge oder beschaffe ein Zertifikat (PEM-Format mit privatem Schlüssel).
- In Entra ID → App Registration → Certificates & secrets → Certificates → lade das öffentliche Zertifikat hoch.
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
Option B: Azure Managed Identity
Verwende Azure Managed Identity für passwortlose Authentifizierung. Das ist ideal für Bereitstellungen auf Azure-Infrastruktur (AKS, App Service, Azure-VMs), bei denen eine Managed Identity verfügbar ist. So funktioniert es:- Der Bot-Pod/die Bot-VM hat eine Managed Identity (systemzugewiesen oder benutzerzugewiesen).
- Eine federated identity credential verknüpft die Managed Identity mit der Entra ID-App-Registrierung.
- Zur Laufzeit verwendet OpenClaw
@azure/identity, um Tokens vom Azure IMDS-Endpunkt (169.254.169.254) abzurufen. - Das Token wird zur Bot-Authentifizierung an das Teams SDK übergeben.
- Azure-Infrastruktur mit aktivierter Managed Identity (AKS Workload Identity, App Service, VM)
- Erstellte föderierte Identitätsanmeldeinformation in der Entra ID-App-Registrierung
- Netzwerkzugriff auf IMDS (
169.254.169.254:80) vom Pod/von der VM
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(nur für benutzerzugewiesene)
AKS Workload Identity-Einrichtung
Für AKS-Bereitstellungen mit Workload Identity:- Aktiviere Workload Identity in deinem AKS-Cluster.
-
Erstelle eine föderierte Identitätsanmeldeinformation in der Entra ID-App-Registrierung:
-
Versehe das Kubernetes-Servicekonto mit einer Annotation für die App-Client-ID:
-
Kennzeichne den Pod für die Workload Identity-Injektion:
-
Stelle Netzwerkzugriff auf IMDS (
169.254.169.254) sicher — wenn du NetworkPolicy verwendest, füge eine Egress-Regel hinzu, die Traffic zu169.254.169.254/32auf Port 80 erlaubt.
Vergleich der Authentifizierungstypen
| Methode | Konfiguration | Vorteile | Nachteile |
|---|---|---|---|
| Client-Secret | appPassword | Einfache Einrichtung | Secret-Rotation erforderlich, weniger sicher |
| Zertifikat | authType: "federated" + certificatePath | Kein gemeinsames Secret über das Netzwerk | Aufwand für Zertifikatsverwaltung |
| Managed Identity | authType: "federated" + useManagedIdentity | Passwortlos, keine Secrets zu verwalten | Azure-Infrastruktur erforderlich |
authType nicht gesetzt ist, verwendet OpenClaw standardmäßig Client-Secret-Authentifizierung. Bestehende Konfigurationen funktionieren ohne Änderungen weiter.
Lokale Entwicklung (Tunneling)
Teams kannlocalhost nicht erreichen. Verwende für die lokale Entwicklung einen Tunnel:
Option A: ngrok
Teams Developer Portal (Alternative)
Anstatt ein Manifest-ZIP manuell zu erstellen, kannst du das Teams Developer Portal verwenden:- Klicke auf + New app
- Fülle die Basisinformationen aus (Name, Beschreibung, Entwicklerinfo)
- Gehe zu App features → Bot
- Wähle Enter a bot ID manually und füge deine Azure Bot App-ID ein
- Aktiviere die Bereiche: Personal, Team, Group Chat
- Klicke auf Distribute → Download app package
- In Teams: Apps → Manage your apps → Upload a custom app → wähle die ZIP-Datei aus
Den Bot testen
Option A: Azure Web Chat (zuerst Webhook überprüfen)- Im Azure-Portal → deine Azure Bot-Ressource → Test in Web Chat
- Sende eine Nachricht – du solltest eine Antwort sehen
- Das bestätigt, dass dein Webhook-Endpunkt funktioniert, bevor du Teams einrichtest
- Installiere die Teams-App (Sideload oder Organisationskatalog)
- Finde den Bot in Teams und sende eine DM
- Prüfe die Gateway-Logs auf eingehende Aktivitäten
Einrichtung (minimal, nur Text)
-
Stelle sicher, dass das Microsoft Teams-Plugin verfügbar ist
- Aktuelle paketierte OpenClaw-Releases enthalten es bereits gebündelt.
- Ältere/benutzerdefinierte Installationen können es manuell hinzufügen:
- Von npm:
openclaw plugins install @openclaw/msteams - Von einem lokalen Checkout:
openclaw plugins install ./path/to/local/msteams-plugin
- Von npm:
-
Bot-Registrierung
- Erstelle einen Azure Bot (siehe oben) und notiere:
- App-ID
- Client-Secret (App-Passwort)
- Mandanten-ID (Single-Tenant)
- Erstelle einen Azure Bot (siehe oben) und notiere:
-
Teams-App-Manifest
- Füge einen
bot-Eintrag mitbotId = <App ID>hinzu. - Bereiche:
personal,team,groupChat. supportsFiles: true(erforderlich für die Dateiverarbeitung im persönlichen Bereich).- Füge RSC-Berechtigungen hinzu (unten).
- Erstelle Symbole:
outline.png(32x32) undcolor.png(192x192). - Verpacke alle drei Dateien zusammen in eine ZIP-Datei:
manifest.json,outline.png,color.png.
- Füge einen
-
OpenClaw konfigurieren
Du kannst auch Umgebungsvariablen anstelle von Konfigurationsschlüsseln verwenden:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_IDMSTEAMS_AUTH_TYPE(optional:"secret"oder"federated")MSTEAMS_CERTIFICATE_PATH(föderiert + Zertifikat)MSTEAMS_CERTIFICATE_THUMBPRINT(optional, für die Authentifizierung nicht erforderlich)MSTEAMS_USE_MANAGED_IDENTITY(föderiert + Managed Identity)MSTEAMS_MANAGED_IDENTITY_CLIENT_ID(nur für benutzerzugewiesene MI)
-
Bot-Endpunkt
- Setze den Azure Bot Messaging Endpoint auf:
https://<host>:3978/api/messages(oder deinen gewählten Pfad/Port).
- Setze den Azure Bot Messaging Endpoint auf:
-
Gateway ausführen
- Der Teams-Kanal startet automatisch, wenn das gebündelte oder manuell installierte Plugin verfügbar ist und die
msteams-Konfiguration mit Anmeldedaten vorhanden ist.
- Der Teams-Kanal startet automatisch, wenn das gebündelte oder manuell installierte Plugin verfügbar ist und die
Aktion für Mitgliedsinformationen
OpenClaw stellt für Microsoft Teams eine Graph-gestütztemember-info-Aktion bereit, sodass Agents und Automatisierungen Mitgliedsdetails von Kanälen direkt über Microsoft Graph auflösen können (Anzeigename, E-Mail, Rolle).
Anforderungen:
- RSC-Berechtigung
Member.Read.Group(bereits im empfohlenen Manifest enthalten) - Für teamübergreifende Abfragen: Graph-Anwendungsberechtigung
User.Read.Allmit Administratorzustimmung
channels.msteams.actions.memberInfo gesteuert (Standard: aktiviert, wenn Graph-Anmeldedaten verfügbar sind).
Verlaufskontext
channels.msteams.historyLimitsteuert, wie viele aktuelle Kanal-/Gruppennachrichten in den Prompt eingebettet werden.- Fällt auf
messages.groupChat.historyLimitzurück. Setze0, um dies zu deaktivieren (Standard 50). - Der abgerufene Thread-Verlauf wird durch Absender-Zulassungslisten (
allowFrom/groupAllowFrom) gefiltert, sodass die Thread-Kontextinitialisierung nur Nachrichten von zugelassenen Absendern enthält. - Zitierter Anhangskontext (
ReplyTo*, abgeleitet aus Teams-Antwort-HTML) wird derzeit unverändert weitergegeben. - Anders gesagt: Zulassungslisten steuern, wer den Agent auslösen kann; aktuell werden nur bestimmte ergänzende Kontextpfade gefiltert.
- Der DM-Verlauf kann mit
channels.msteams.dmHistoryLimitbegrenzt werden (Benutzer-Turns). Überschreibungen pro Benutzer:channels.msteams.dms["<user_id>"].historyLimit.
Aktuelle Teams-RSC-Berechtigungen (Manifest)
Dies sind die vorhandenen resourceSpecific-Berechtigungen in unserem Teams-App-Manifest. Sie gelten nur innerhalb des Teams/Chats, in dem die App installiert ist. Für Kanäle (Team-Bereich):ChannelMessage.Read.Group(Application) - alle Kanalnachrichten ohne @mention empfangenChannelMessage.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 Gruppenchats-Nachrichten ohne @mention empfangen
Beispiel für ein Teams-Manifest (redigiert)
Minimales, gültiges Beispiel mit den erforderlichen Feldern. Ersetze IDs und URLs.Hinweise zum Manifest (erforderliche Felder)
bots[].botIdmuss mit der Azure Bot App-ID übereinstimmen.webApplicationInfo.idmuss mit der Azure Bot App-ID übereinstimmen.bots[].scopesmuss die Bereiche enthalten, die du verwenden möchtest (personal,team,groupChat).bots[].supportsFiles: trueist für die Dateiverarbeitung im persönlichen Bereich erforderlich.authorization.permissions.resourceSpecificmuss Lese-/Sendeberechtigungen für Kanäle enthalten, wenn du Kanalverkehr verwenden möchtest.
Eine vorhandene App aktualisieren
So aktualisierst du eine bereits installierte Teams-App (z. B. um RSC-Berechtigungen hinzuzufügen):- Aktualisiere deine
manifest.jsonmit den neuen Einstellungen - Erhöhe das Feld
version(z. B.1.0.0→1.1.0) - Erstelle die ZIP-Datei neu mit Manifest und Symbolen (
manifest.json,outline.png,color.png) - Lade die neue ZIP-Datei hoch:
- Option A (Teams Admin Center): Teams Admin Center → Teams apps → Manage apps → finde deine App → Upload new version
- Option B (Sideload): In Teams → Apps → Manage your apps → Upload a custom app
- Für Team-Kanäle: Installiere die App in jedem Team erneut, damit die neuen Berechtigungen wirksam werden
- Beende Teams vollständig und starte es neu (nicht nur das Fenster schließen), um zwischengespeicherte App-Metadaten zu löschen
Funktionen: nur RSC vs. Graph
Mit nur Teams RSC (App installiert, keine Graph API-Berechtigungen)
Funktioniert:- Textinhalt von Kanalnachrichten lesen.
- Textinhalt von Kanalnachrichten senden.
- Dateianhänge in persönlichen Nachrichten (DMs) empfangen.
- Bild- oder Dateiinhalte in Kanälen/Gruppen (die Nutzlast enthält nur einen HTML-Stub).
- Herunterladen von Anhängen, die in SharePoint/OneDrive gespeichert sind.
- Lesen des Nachrichtenverlaufs (über das Live-Webhook-Ereignis hinaus).
Mit Teams RSC + Microsoft Graph-Anwendungsberechtigungen
Zusätzlich möglich:- Herunterladen gehosteter Inhalte (in Nachrichten eingefügte Bilder).
- Herunterladen von Dateianhängen, die in SharePoint/OneDrive gespeichert sind.
- Lesen des Kanal-/Chat-Nachrichtenverlaufs über Graph.
RSC vs. Graph API
| Funktion | RSC-Berechtigungen | Graph API |
|---|---|---|
| Echtzeitnachrichten | Ja (über Webhook) | Nein (nur Polling) |
| Historische Nachrichten | Nein | Ja (Verlauf kann abgefragt werden) |
| Komplexität der Einrichtung | Nur App-Manifest | Erfordert Administratorzustimmung + Token-Flow |
| Funktioniert offline | Nein (muss laufen) | Ja (jederzeit abfragbar) |
ChannelMessage.Read.All (erfordert Administratorzustimmung).
Graph-aktivierte Medien + Verlauf (erforderlich für Kanäle)
Wenn du Bilder/Dateien in Kanälen benötigst oder den Nachrichtenverlauf abrufen möchtest, musst du Microsoft Graph-Berechtigungen aktivieren und Administratorzustimmung erteilen.- Füge in der Entra ID (Azure AD) App Registration Microsoft Graph-Anwendungsberechtigungen hinzu:
ChannelMessage.Read.All(Kanalanhänge + Verlauf)Chat.Read.AlloderChatMessage.Read.All(Gruppenchats)
- Erteile Administratorzustimmung für den Mandanten.
- Erhöhe die Manifestversion der Teams-App, lade sie erneut hoch und installiere die App in Teams erneut.
- Beende Teams vollständig und starte es neu, um zwischengespeicherte App-Metadaten zu löschen.
User.Read.All hinzu und erteile Administratorzustimmung.
Bekannte Einschränkungen
Webhook-Zeitüberschreitungen
Teams stellt Nachrichten über HTTP-Webhooks zu. Wenn die Verarbeitung zu lange dauert (z. B. langsame LLM-Antworten), kann Folgendes auftreten:- Gateway-Zeitüberschreitungen
- Teams versucht erneut, die Nachricht zuzustellen (verursacht Duplikate)
- Verlorene Antworten
Formatierung
Teams-Markdown ist eingeschränkter als Slack oder Discord:- Grundlegende Formatierung funktioniert: fett, kursiv,
code, Links - Komplexes Markdown (Tabellen, verschachtelte Listen) wird möglicherweise nicht korrekt dargestellt
- Adaptive Cards werden für Polls und beliebige Karten-Sendungen unterstützt (siehe unten)
Konfiguration
Wichtige Einstellungen (siehe/gateway/configuration für gemeinsame Kanalmuster):
channels.msteams.enabled: den Kanal aktivieren/deaktivieren.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: Bot-Anmeldedaten.channels.msteams.webhook.port(Standard3978)channels.msteams.webhook.path(Standard/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(Standard: pairing)channels.msteams.allowFrom: DM-Zulassungsliste (AAD-Objekt-IDs empfohlen). Der Assistent löst bei der Einrichtung Namen in IDs auf, wenn Graph-Zugriff verfügbar ist.channels.msteams.dangerouslyAllowNameMatching: Notfall-Schalter, um veränderliches UPN-/Anzeigenamen-Matching und direktes Team-/Kanalnamen-Routing wieder zu aktivieren.channels.msteams.textChunkLimit: Größe von ausgehendem Text-Chunking.channels.msteams.chunkMode:length(Standard) odernewline, um an Leerzeilen (Absatzgrenzen) vor dem Chunking nach Länge zu trennen.channels.msteams.mediaAllowHosts: Zulassungsliste für Hosts eingehender Anhänge (standardmäßig Microsoft-/Teams-Domains).channels.msteams.mediaAuthAllowHosts: Zulassungsliste, um bei MedienwiederholungenAuthorization-Header anzuhängen (standardmäßig Graph- + Bot Framework-Hosts).channels.msteams.requireMention: @mention in Kanälen/Gruppen erforderlich machen (Standard true).channels.msteams.replyStyle:thread | top-level(siehe Antwortstil).channels.msteams.teams.<teamId>.replyStyle: Überschreibung pro Team.channels.msteams.teams.<teamId>.requireMention: Überschreibung pro Team.channels.msteams.teams.<teamId>.tools: Standardüberschreibungen der Tool-Richtlinie pro Team (allow/deny/alsoAllow), verwendet, wenn eine Kanalüberschreibung fehlt.channels.msteams.teams.<teamId>.toolsBySender: Standardüberschreibungen der Tool-Richtlinie pro Team und Absender ("*"-Wildcard wird unterstützt).channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: Überschreibung pro Kanal.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: Überschreibung pro Kanal.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: Überschreibungen der Tool-Richtlinie pro Kanal (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: Überschreibungen der Tool-Richtlinie pro Kanal und Absender ("*"-Wildcard wird unterstützt).toolsBySender-Schlüssel sollten explizite Präfixe verwenden:id:,e164:,username:,name:(ältere Schlüssel ohne Präfix werden weiterhin nur aufid:abgebildet).channels.msteams.actions.memberInfo: die Graph-gestützte Aktion für Mitgliedsinformationen aktivieren oder deaktivieren (Standard: aktiviert, wenn Graph-Anmeldedaten verfügbar sind).channels.msteams.authType: Authentifizierungstyp —"secret"(Standard) oder"federated".channels.msteams.certificatePath: Pfad zur PEM-Zertifikatdatei (föderiert + Zertifikatsauthentifizierung).channels.msteams.certificateThumbprint: Zertifikat-Fingerabdruck (optional, für die Authentifizierung nicht erforderlich).channels.msteams.useManagedIdentity: Managed Identity-Authentifizierung aktivieren (föderierter Modus).channels.msteams.managedIdentityClientId: Client-ID für benutzerzugewiesene Managed Identity.channels.msteams.sharePointSiteId: SharePoint-Site-ID für Datei-Uploads in Gruppenchats/Kanälen (siehe Dateien in Gruppenchats senden).
Routing & Sitzungen
- Sitzungsschlüssel folgen dem Standard-Agent-Format (siehe /concepts/session):
- Direktnachrichten verwenden die Hauptsitzung (
agent:<agentId>:<mainKey>). - Kanal-/Gruppennachrichten verwenden die Konversations-ID:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Direktnachrichten verwenden die Hauptsitzung (
Antwortstil: Threads vs. Posts
Teams hat kürzlich zwei Kanal-UI-Stile über demselben zugrunde liegenden Datenmodell eingeführt:| Stil | Beschreibung | Empfohlener replyStyle |
|---|---|---|
| Posts (klassisch) | Nachrichten erscheinen als Karten mit Thread-Antworten darunter | thread (Standard) |
| Threads (Slack-ähnlich) | Nachrichten fließen linearer, eher wie in Slack | top-level |
replyStyle verwendest:
threadin einem Kanal im Threads-Stil → Antworten erscheinen ungeschickt verschachtelttop-levelin einem Kanal im Posts-Stil → Antworten erscheinen als separate Top-Level-Posts statt im Thread
replyStyle pro Kanal je nachdem, wie der Kanal eingerichtet ist:
Anhänge & Bilder
Aktuelle Einschränkungen:- DMs: Bilder und Dateianhänge funktionieren über Teams-Bot-Datei-APIs.
- Kanäle/Gruppen: Anhänge liegen im M365-Speicher (SharePoint/OneDrive). Die Webhook-Nutzlast enthält nur einen HTML-Stub, nicht die tatsächlichen Dateibytes. Graph API-Berechtigungen sind erforderlich, um Kanalanhänge herunterzuladen.
- Für explizite dateiorientierte Sendungen verwende
action=upload-filemitmedia/filePath/path; optionalesmessagewird zum begleitenden Text/Kommentar, undfilenameüberschreibt den hochgeladenen Namen.
channels.msteams.mediaAllowHosts (verwende ["*"], um jeden Host zuzulassen).
Authorization-Header werden nur für Hosts in channels.msteams.mediaAuthAllowHosts angehängt (standardmäßig Graph- + Bot Framework-Hosts). Halte diese Liste eng gefasst (vermeide mandantenübergreifende Suffixe).
Dateien in Gruppenchats senden
Bots können Dateien in DMs mit dem FileConsentCard-Ablauf senden (integriert). Allerdings erfordert das Senden von Dateien in Gruppenchats/Kanälen zusätzliche Einrichtung:| Kontext | Art des Dateiversands | Erforderliche Einrichtung |
|---|---|---|
| DMs | FileConsentCard → Benutzer akzeptiert → Bot lädt hoch | Funktioniert sofort |
| Gruppenchats/Kanäle | Upload zu SharePoint → Freigabelink | Erfordert sharePointSiteId + Graph-Berechtigungen |
| Bilder (jeder Kontext) | Base64-kodiert inline | Funktioniert sofort |
Warum Gruppenchats SharePoint benötigen
Bots haben kein persönliches OneDrive-Laufwerk (der Graph API-Endpunkt/me/drive funktioniert nicht für Anwendungsidentitäten). Um Dateien in Gruppenchats/Kanälen zu senden, lädt der Bot in eine SharePoint-Site hoch und erstellt einen Freigabelink.
Einrichtung
-
Füge Graph API-Berechtigungen hinzu in Entra ID (Azure AD) → App Registration:
Sites.ReadWrite.All(Application) - Dateien zu SharePoint hochladenChat.Read.All(Application) - optional, aktiviert Freigabelinks pro Benutzer
- Erteile Administratorzustimmung für den Mandanten.
-
Rufe deine SharePoint-Site-ID ab:
-
OpenClaw konfigurieren:
Freigabeverhalten
| Berechtigung | Freigabeverhalten |
|---|---|
Sites.ReadWrite.All allein | Organisationsweiter Freigabelink (jede Person in der Organisation kann zugreifen) |
Sites.ReadWrite.All + Chat.Read.All | Freigabelink pro Benutzer (nur Chat-Mitglieder können zugreifen) |
Chat.Read.All fehlt, greift der Bot auf organisationsweite Freigabe zurück.
Fallback-Verhalten
| Szenario | Ergebnis |
|---|---|
Gruppenchat + Datei + sharePointSiteId konfiguriert | Upload zu SharePoint, Freigabelink senden |
Gruppenchat + Datei + keine sharePointSiteId | OneDrive-Upload versuchen (kann fehlschlagen), nur Text senden |
| Persönlicher Chat + Datei | FileConsentCard-Ablauf (funktioniert ohne SharePoint) |
| Beliebiger Kontext + Bild | Base64-kodiert inline (funktioniert ohne SharePoint) |
Speicherort der Dateien
Hochgeladene Dateien werden in einem Ordner/OpenClawShared/ in der Standarddokumentbibliothek der konfigurierten SharePoint-Site gespeichert.
Polls (Adaptive Cards)
OpenClaw sendet Teams-Polls als Adaptive Cards (es gibt keine native Teams-Poll-API).- CLI:
openclaw message poll --channel msteams --target conversation:<id> ... - Stimmen werden vom Gateway in
~/.openclaw/msteams-polls.jsongespeichert. - Das Gateway muss online bleiben, um Stimmen zu erfassen.
- Polls veröffentlichen derzeit noch keine Ergebniszusammenfassungen automatisch (prüfe bei Bedarf die Speicherdatei).
Adaptive Cards (beliebig)
Sende beliebiges Adaptive Card-JSON an Teams-Benutzer oder Konversationen mit demmessage-Tool oder der CLI.
Der Parameter card akzeptiert ein Adaptive Card-JSON-Objekt. Wenn card angegeben ist, ist der Nachrichtentext optional.
Agent-Tool:
Zielformate
MSTeams-Ziele verwenden Präfixe, um zwischen Benutzern und Konversationen zu unterscheiden:| Zieltyp | Format | Beispiel |
|---|---|---|
| Benutzer (nach ID) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| Benutzer (nach Name) | user:<display-name> | user:John Smith (erfordert Graph API) |
| Gruppe/Kanal | conversation:<conversation-id> | conversation:19:abc123...@thread.tacv2 |
| Gruppe/Kanal (roh) | <conversation-id> | 19:abc123...@thread.tacv2 (wenn @thread enthalten ist) |
user: werden Namen standardmäßig als Gruppen-/Teamauflösung behandelt. Verwende immer user:, wenn du Personen über ihren Anzeigenamen ansprichst.
Proaktives Messaging
- Proaktive Nachrichten sind nur nachdem ein Benutzer interagiert hat möglich, da wir erst dann Konversationsreferenzen speichern.
- Siehe
/gateway/configurationfürdmPolicyund die Steuerung per Zulassungsliste.
Team- und Kanal-IDs (häufiger Stolperstein)
Der AbfrageparametergroupId in Teams-URLs ist nicht die Team-ID, die für die Konfiguration verwendet wird. Extrahiere IDs stattdessen aus dem URL-Pfad:
Team-URL:
- Team-ID = Pfadsegment nach
/team/(URL-dekodiert, z. B.19:Bk4j...@thread.tacv2) - Kanal-ID = Pfadsegment nach
/channel/(URL-dekodiert) - Den Abfrageparameter
groupIdignorieren
Private Kanäle
Bots haben eingeschränkte Unterstützung in privaten Kanälen:| Funktion | Standardkanäle | Private Kanäle |
|---|---|---|
| Bot-Installation | Ja | Eingeschränkt |
| Echtzeitnachrichten (Webhook) | Ja | Funktioniert möglicherweise nicht |
| RSC-Berechtigungen | Ja | Verhalten kann abweichen |
| @mentions | Ja | Wenn der Bot zugänglich ist |
| Graph API-Verlauf | Ja | Ja (mit Berechtigungen) |
- Verwende Standardkanäle für Bot-Interaktionen
- Verwende DMs - Benutzer können dem Bot immer direkt schreiben
- Verwende Graph API für den Verlaufzugriff (erfordert
ChannelMessage.Read.All)
Fehlerbehebung
Häufige Probleme
- Bilder werden in Kanälen nicht angezeigt: Graph-Berechtigungen oder Administratorzustimmung fehlen. Installiere die Teams-App erneut und beende/öffne Teams vollständig neu.
- Keine Antworten im Kanal: Erwähnungen sind standardmäßig erforderlich; setze
channels.msteams.requireMention=falseoder konfiguriere dies pro Team/Kanal. - Versionskonflikt (Teams zeigt weiterhin altes Manifest): Entferne die App und füge sie erneut hinzu, und beende Teams vollständig, um zu aktualisieren.
- 401 Unauthorized vom Webhook: Beim manuellen Testen ohne Azure-JWT erwartet - bedeutet, der Endpunkt ist erreichbar, aber die Authentifizierung ist fehlgeschlagen. Verwende Azure Web Chat für einen korrekten Test.
Fehler beim Manifest-Upload
- “Icon file cannot be empty”: Das Manifest verweist auf Symbol-Dateien mit 0 Bytes. Erstelle gültige PNG-Symbole (32x32 für
outline.png, 192x192 fürcolor.png). - “webApplicationInfo.Id already in use”: Die App ist noch in einem anderen Team/Chat installiert. Finde sie und deinstalliere sie zuerst oder warte 5-10 Minuten auf die Übernahme.
- “Something went wrong” beim Upload: Lade stattdessen über https://admin.teams.microsoft.com hoch, öffne die Browser-DevTools (F12) → Registerkarte Network, und prüfe den Response-Body auf den tatsächlichen Fehler.
- Sideload schlägt fehl: Versuche „Upload an app to your org’s app catalog“ statt „Upload a custom app“ - das umgeht oft Sideload-Beschränkungen.
RSC-Berechtigungen funktionieren nicht
- Überprüfe, dass
webApplicationInfo.idexakt mit der App-ID deines Bots übereinstimmt - Lade die App erneut hoch und installiere sie im Team/Chat erneut
- Prüfe, ob dein Organisationsadministrator RSC-Berechtigungen blockiert hat
- Bestätige, dass du den richtigen Bereich verwendest:
ChannelMessage.Read.Groupfür Teams,ChatMessage.Read.Chatfür Gruppenchats
Referenzen
- Azure Bot erstellen - Anleitung zur Azure Bot-Einrichtung
- Teams Developer Portal - Teams-Apps erstellen/verwalten
- Schema für Teams-App-Manifeste
- Kanalnachrichten mit RSC empfangen
- RSC-Berechtigungsreferenz
- Teams-Bot-Dateiverarbeitung (Kanal/Gruppe erfordert Graph)
- Proaktives Messaging
Verwandt
- Kanalübersicht — alle unterstützten Kanäle
- Pairing — DM-Authentifizierung und Pairing-Ablauf
- Gruppen — Verhalten in Gruppenchats und Steuerung per Erwähnung
- Kanal-Routing — Sitzungsrouting für Nachrichten
- Sicherheit — Zugriffsmodell und Härtung