sharePointSiteId + Graph-Berechtigungen (siehe Dateien in Gruppenchats senden). Umfragen werden über Adaptive Cards gesendet. Nachrichtenaktionen stellen explizit upload-file für Sendungen bereit, bei denen die Datei an erster Stelle steht.
Gebündeltes Plugin
Microsoft Teams wird in aktuellen OpenClaw-Versionen als gebündeltes Plugin ausgeliefert; im normalen paketierten Build ist keine separate Installation erforderlich. Installieren Sie bei einem älteren Build oder einer benutzerdefinierten Installation, die das gebündelte Teams ausschließt, das npm-Paket direkt:Schnelleinrichtung
@microsoft/teams.cli übernimmt Bot-Registrierung, Manifest-Erstellung und Generierung von Anmeldedaten mit einem einzigen Befehl.
1. Installieren und anmelden
Die Teams CLI befindet sich derzeit in der Vorschauphase. Befehle und Flags können sich zwischen Releases ändern.
--allow-anonymous ist erforderlich, da Teams sich nicht bei devtunnels authentifizieren kann. Jede eingehende Bot-Anfrage wird weiterhin durch das Teams SDK validiert.ngrok http 3978 oder tailscale funnel 3978 (URLs können sich bei jeder Sitzung ändern).
3. Die App erstellen
CLIENT_ID, CLIENT_SECRET, TENANT_ID und eine Teams App ID; außerdem wird angeboten, die App direkt in Teams zu installieren.
4. OpenClaw konfigurieren – verwenden Sie dazu die Anmeldedaten aus der Ausgabe:
MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
5. Die App in Teams installieren
teams app create fordert Sie zur Installation der App auf; wählen Sie “Install in Teams”. So erhalten Sie den Installationslink später:
Gruppenchats sind standardmäßig blockiert (
channels.msteams.groupPolicy: "allowlist"). Um Gruppenantworten zuzulassen, setzen Sie channels.msteams.groupAllowFrom, oder verwenden Sie groupPolicy: "open", um jedes Mitglied zuzulassen (Erwähnung erforderlich).Ziele
- Kommunizieren Sie über Teams-DMs, Gruppenchats oder Kanäle mit OpenClaw.
- Halten Sie das Routing deterministisch: Antworten gehen immer an den Kanal zurück, über den sie eingegangen sind.
- Verwenden Sie standardmäßig ein sicheres Kanalverhalten (Erwähnungen erforderlich, sofern nicht anders konfiguriert).
Konfigurationsänderungen
Standardmäßig kann Microsoft Teams durch/config set|unset ausgelöste Konfigurationsänderungen schreiben (erfordert commands.config: true).
Deaktivieren mit:
Zugriffskontrolle (DMs + Gruppen)
DM-Zugriff- Standard:
channels.msteams.dmPolicy = "pairing". Unbekannte Absender werden ignoriert, bis sie genehmigt wurden. channels.msteams.allowFromsollte stabile AAD-Objekt-IDs oder statische Absenderzugriffsgruppen wieaccessGroup:core-teamverwenden.- Verlassen Sie sich bei Zulassungslisten nicht auf den Abgleich von UPNs/Anzeigenamen; diese können sich ändern. OpenClaw deaktiviert den direkten Namensabgleich standardmäßig; aktivieren Sie ihn mit
channels.msteams.dangerouslyAllowNameMatching: true. - Der Assistent kann Namen über Microsoft Graph in IDs auflösen, sofern die Anmeldedaten dies erlauben.
- Standard:
channels.msteams.groupPolicy = "allowlist"(blockiert, sofern Sie nichtgroupAllowFromhinzufügen).channels.defaults.groupPolicykann den gemeinsamen Standardwert überschreiben, wennchannels.msteams.groupPolicynicht gesetzt ist. channels.msteams.groupAllowFromsteuert, welche Absender oder statischen Absenderzugriffsgruppen in Gruppenchats/Kanälen eine Aktion auslösen können (greift aufchannels.msteams.allowFromzurück).- Setzen Sie
groupPolicy: "open", um jedes Mitglied zuzulassen (standardmäßig ist weiterhin eine Erwähnung erforderlich). - Um alle Kanäle zu blockieren, setzen Sie
channels.msteams.groupPolicy: "disabled".
- Begrenzen Sie Gruppen-/Kanalantworten, indem Sie Teams und Kanäle unter
channels.msteams.teamsaufführen. - Verwenden Sie stabile Teams-Unterhaltungs-IDs aus Teams-Links als Schlüssel, nicht veränderliche Anzeigenamen (siehe Team- und Kanal-IDs).
- Wenn
groupPolicy="allowlist"und eine Teams-Zulassungsliste vorhanden sind, werden nur aufgeführte Teams/Kanäle akzeptiert (Erwähnung erforderlich). - Der Konfigurationsassistent akzeptiert
Team/Channel-Einträge und speichert sie für Sie. - Beim Start löst OpenClaw die Namen in Team-/Kanal- und Benutzerzulassungslisten in IDs auf (sofern Graph-Berechtigungen dies erlauben) und protokolliert die Zuordnung. Nicht aufgelöste Namen bleiben wie eingegeben erhalten, werden beim Routing jedoch ignoriert, sofern
channels.msteams.dangerouslyAllowNameMatching: truenicht gesetzt ist.
Föderierte Authentifizierung (Zertifikat plus verwaltete Identität)
Für den Produktionseinsatz unterstützt OpenClaw überchannels.msteams.authType: "federated" föderierte Authentifizierung als Alternative zu Client-Geheimnissen. Es gibt zwei Methoden:
Option A: Zertifikatbasierte Authentifizierung
Verwenden Sie ein PEM-Zertifikat, das bei Ihrer Entra ID-App-Registrierung registriert ist. Einrichtung:- Generieren oder beschaffen Sie ein Zertifikat (PEM-Format mit privatem Schlüssel).
- Entra ID → App-Registrierung → Certificates & secrets → Certificates → laden Sie das öffentliche Zertifikat hoch.
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem
Option B: Verwaltete Azure-Identität
Verwenden Sie eine verwaltete Azure-Identität für die kennwortlose Authentifizierung auf Azure-Infrastruktur (AKS, App Service, Azure-VMs). Funktionsweise:- Der Bot-Pod/die VM verfügt über eine verwaltete Identität (system- oder benutzerseitig zugewiesen).
- Anmeldedaten für eine föderierte Identität verknüpfen die verwaltete Identität mit der Entra ID-App-Registrierung.
- Zur Laufzeit verwendet OpenClaw
@azure/identity, um Token vom Azure-IMDS-Endpunkt abzurufen. - Das Token wird zur Bot-Authentifizierung an das Teams SDK übergeben.
- Azure-Infrastruktur mit aktivierter verwalteter Identität (AKS-Workloadidentität, App Service, VM).
- Für die Entra-ID-App-Registrierung erstellte Anmeldeinformationen für die Verbundidentität.
- Netzwerkzugriff auf IMDS (
169.254.169.254:80) vom Pod bzw. von der VM.
managedIdentityClientId: "<MI_CLIENT_ID>" hinzu.
Umgebungsvariablen:
MSTEAMS_AUTH_TYPE=federatedMSTEAMS_USE_MANAGED_IDENTITY=trueMSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>(nur benutzerseitig zugewiesen)
Einrichtung der AKS-Workloadidentität
Für AKS-Bereitstellungen mit Workloadidentität:- Aktivieren Sie die Workloadidentität für Ihren AKS-Cluster.
-
Erstellen Sie Anmeldeinformationen für die Verbundidentität in der Entra-ID-App-Registrierung:
-
Versehen Sie das Kubernetes-Dienstkonto mit einer Annotation für die Client-ID der App:
-
Versehen Sie den Pod mit einem Label für die Einbindung der Workloadidentität:
-
Erlauben Sie den Netzwerkzugriff auf IMDS (
169.254.169.254): Wenn Sie NetworkPolicy verwenden, fügen Sie für169.254.169.254/32an Port 80 eine ausgehende Regel hinzu.
Vergleich der Authentifizierungstypen
certificateThumbprint kann zusammen mit certificatePath festgelegt werden, wird vom Authentifizierungspfad derzeit jedoch nicht gelesen; der Wert wird ausschließlich aus Gründen der Vorwärtskompatibilität akzeptiert.
Standard: Wenn authType nicht festgelegt ist, verwendet OpenClaw die Authentifizierung mit Clientgeheimnis (appPassword). Bestehende Konfigurationen funktionieren unverändert weiter.
Lokale Entwicklung (Tunneling)
Teams kannlocalhost nicht erreichen. Verwenden Sie einen persistenten Entwicklungstunnel, damit die URL sitzungsübergreifend stabil bleibt:
ngrok http 3978 oder tailscale funnel 3978 (URLs können sich bei jeder Sitzung ändern).
Wenn sich die Tunnel-URL ändert, aktualisieren Sie den Endpunkt:
Bot testen
Diagnose ausführen:- Installieren Sie die Teams-App (Installationslink aus
teams app get <id> --install-link). - Suchen Sie den Bot in Teams und senden Sie ihm eine Direktnachricht.
- Prüfen Sie die Gateway-Protokolle auf eingehende Aktivitäten.
Umgebungsvariablen
Diese authentifizierungsbezogenen Konfigurationsschlüssel können anstelle vonopenclaw.json über Umgebungsvariablen festgelegt werden (andere Konfigurationsschlüssel wie groupPolicy oder historyLimit können nur in der Konfiguration festgelegt werden):
Aktion für Mitgliedsinformationen
OpenClaw stellt für Microsoft Teams eine Graph-gestützte Aktionmember-info bereit, damit Agenten und Automatisierungen verifizierte Teilnehmerdetails für eine konfigurierte Unterhaltung auflösen können.
Anforderungen:
ChannelSettings.Read.Group- undTeamMember.Read.Group-RSC-Berechtigungen (bereits im empfohlenen Manifest enthalten).
channels.msteams.actions.memberInfo.
Abfragen für Standardkanäle geben die passende Identität aus der Teammitgliederliste, den Anzeigenamen, die E-Mail-Adresse und die Rollen zurück.
In der aktuellen Direktnachricht oder im aktuellen Gruppenchat kann die Aktion die stabile Benutzer-ID des vertrauenswürdigen Absenders zurückgeben.
Abfragen von Mitgliedern privater/freigegebener Kanäle und nicht aktueller Chats erfordern zusätzliche Berechtigungen für Mitgliederlisten
und werden von der standardmäßigen Berechtigungsbasis abgelehnt.
Verlaufskontext
channels.msteams.historyLimitsteuert, wie viele der letzten Kanal-/Gruppennachrichten in den Prompt eingebettet werden. Als Rückfallwert wirdmessages.groupChat.historyLimitverwendet, danach gilt standardmäßig 50. Legen Sie0fest, um die Funktion zu deaktivieren.- Der abgerufene Threadverlauf wird anhand der Absender-Zulassungslisten (
allowFrom/groupAllowFrom) gefiltert, sodass die anfängliche Befüllung des Threadkontexts nur Nachrichten von zulässigen Absendern enthält. - Der Kontext zitierter Anhänge (aus dem HTML des Skype-Reply-Schemas in den eigenen Anhängen einer Antwort analysiert) wird ungefiltert weitergegeben; derzeit wendet nur die anfängliche Befüllung aus dem Threadverlauf den Filter der Absender-Zulassungsliste an.
- Der Verlauf von Direktnachrichten kann mit
channels.msteams.dmHistoryLimit(Benutzerbeiträge) begrenzt werden. Benutzerspezifische Überschreibungen: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 (Teambereich):ChannelMessage.Read.Group(Application) – alle Kanalnachrichten ohne @Erwähnung 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 Gruppenchatnachrichten ohne @Erwähnung empfangen
Beispiel für ein Teams-Manifest (geschwärzt)
Minimales, gültiges Beispiel mit den erforderlichen Feldern. Ersetzen Sie IDs und URLs.Einschränkungen des Manifests (Pflichtfelder)
bots[].botIdmuss mit der App-ID des Azure-Bots übereinstimmen.webApplicationInfo.idmuss mit der App-ID des Azure-Bots übereinstimmen.bots[].scopesmuss die Oberflächen enthalten, die Sie verwenden möchten (personal,team,groupChat).bots[].supportsFiles: trueist für die Dateiverarbeitung im persönlichen Bereich erforderlich.authorization.permissions.resourceSpecificmuss Lese-/Sendeberechtigungen für Kanalverkehr enthalten.
Vorhandene App aktualisieren
Funktionen: nur RSC im Vergleich zu 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 (Direktnachrichten) empfangen.
- Bild- oder Dateiinhalte in Kanälen/Gruppen (die Nutzlast enthält nur einen HTML-Platzhalter).
- In SharePoint/OneDrive gespeicherte Anhänge herunterladen.
- Nachrichtenverlauf über das Live-Webhook-Ereignis hinaus lesen.
Mit Teams RSC + Microsoft-Graph-Anwendungsberechtigungen
Ermöglicht zusätzlich:- Gehostete Inhalte herunterladen (in Nachrichten eingefügte Bilder).
- In SharePoint/OneDrive gespeicherte Dateianhänge herunterladen.
- Kanal-/Chatnachrichtenverlauf über Graph lesen.
RSC im Vergleich zur Graph-API
Fazit: RSC dient zum Echtzeit-Mithören; die Graph API dient dem Zugriff auf den Verlauf. Um offline verpasste Nachrichten nachträglich abzurufen, benötigen Sie die Graph API mit
ChannelMessage.Read.All (erfordert Administratoreinwilligung).
Graph-gestützte Medien und Verlauf
Aktivieren Sie nur die Microsoft-Graph-Anwendungsberechtigungen, die für die von Ihnen verwendeten Teams-Bereiche und -Daten erforderlich sind:- Entra ID (Azure AD) App Registration → Graph-Anwendungsberechtigungen hinzufügen:
ChannelMessage.Read.Allfür Kanalanhänge und Kanalverlauf.Chat.Read.Allfür Gruppenchat-Anhänge und Gruppenchat-Verlauf.Files.Read.All, wenn Anhangsdaten aus dem SharePoint-/OneDrive-Speicher heruntergeladen werden müssen; reine Verlaufsinstallationen benötigen diese Berechtigung nicht.
- Grant admin consent für den Mandanten.
- Die Manifestversion der Teams-App erhöhen, erneut hochladen und die App in Teams neu installieren.
- Teams vollständig beenden und neu starten, um zwischengespeicherte App-Metadaten zu löschen.
Wiederherstellung von Kanal-/Gruppendateien (graphMediaFallback)
Teams kann Dateimarkierungen aus der HTML-Aktivität entfernen, die an einen Bot gesendet wird. In diesem Fall ist die Bot-Framework-Aktivität nicht von einer gewöhnlichen HTML-Nachricht zu unterscheiden; die vollständige Anhangsreferenz ist nur in der Graph-Kopie der Nachricht vorhanden.
Aktivieren Sie nach Erteilung der oben genannten Berechtigungen den Fallback:
false, damit bestehende Installationen nicht automatisch zusätzlichen Graph-Datenverkehr oder Berechtigungsfehler verursachen.
Benutzererwähnungen: @Erwähnungen funktionieren standardmäßig für Benutzer, die bereits an der Unterhaltung beteiligt sind. Um Benutzer, die nicht an der aktuellen Unterhaltung beteiligt sind, dynamisch zu suchen und zu erwähnen, fügen Sie die Berechtigung User.Read.All (Anwendung) hinzu und erteilen Sie die Administratoreinwilligung.
Bekannte Einschränkungen
Webhook-Zeitüberschreitungen
Teams übermittelt Nachrichten über einen HTTP-Webhook. OpenClaw wendet auf diesen Webhook-Listener feste HTTP-Server- Zeitüberschreitungen an: 30s Inaktivität, 30s Gesamtanforderungsdauer und 15s für den Empfang der Header. Für optionale eingehende Medien und die Kontextanreicherung gilt ein gemeinsames Budget von 10 Sekunden. Das SDK kehrt zurück, nachdem die Rohaktivität dauerhaft angefügt wurde; der Agent-Durchlauf wird unabhängig abgearbeitet und antwortet proaktiv. Wenn die Anforderungsverarbeitung oder dauerhafte Annahme das Transportzeitfenster verpasst, versucht Teams möglicherweise erneut, die Aktivität zuzustellen, und der Ingress-Tombstone weist eine wiederholte Ereignis-ID zurück.Unterstützung für Teams-Clouds und Dienst-URLs
Dieser SDK-gestützte Teams-Pfad wird live für die öffentliche Microsoft-Teams-Cloud validiert. Eingehende Antworten verwenden den Teams-SDK-Durchlaufkontext der eingehenden Nachricht. Kontextunabhängige proaktive Vorgänge – Senden, Bearbeiten, Löschen, Karten, Umfragen, Dateieinwilligungsnachrichten und in die Warteschlange gestellte lang laufende Antworten – verwenden die gespeicherte UnterhaltungsreferenzserviceUrl. Die öffentliche Cloud verwendet standardmäßig die öffentliche Cloud-Umgebung des Teams SDK und erlaubt gespeicherte Referenzen auf dem öffentlichen Teams-Connector-Host: https://smba.trafficmanager.net/.
Die öffentliche Cloud ist die Standardeinstellung. Für normale Bots in der öffentlichen Cloud müssen Sie channels.msteams.cloud oder channels.msteams.serviceUrl nicht festlegen.
Legen Sie für nicht öffentliche Teams-Clouds cloud und die entsprechende proaktive Begrenzung fest, sobald Microsoft eine veröffentlicht:
channels.msteams.cloudwählt die Cloud-Voreinstellung des Teams SDK für Authentifizierung, JWT-Validierung, Token-Dienste und den Graph-Bereich aus.channels.msteams.serviceUrlwählt die Bot-Connector-Endpunktbegrenzung aus, mit der gespeicherte Unterhaltungsreferenzen vor proaktivem Senden, Bearbeiten, Löschen, Karten, Umfragen, Dateieinwilligungsnachrichten und in die Warteschlange gestellten lang laufenden Antworten validiert werden. Sie ist für die SDK-Clouds USGov und DoD erforderlich. Für China/21Vianet verwendet OpenClaw die SDK-VoreinstellungChinaund akzeptiert gespeicherte/konfigurierte Dienst-URLs nur auf Azure-China-Hosts des Bot-Framework-Kanals.
serviceUrl der eingehenden Aktivität, wenn verfügbar; verwenden Sie andernfalls die nachfolgende Tabelle von Microsoft.
Beispiel für GCC, für das Microsoft eine separate proaktive Dienst-URL dokumentiert, das Teams SDK jedoch keine separate GCC-Cloud-Voreinstellung bereitstellt:
channels.msteams.serviceUrl ist auf unterstützte Microsoft-Teams-Bot-Connector-Hosts beschränkt. Wenn eine Dienst-URL konfiguriert ist, prüft OpenClaw, ob serviceUrl der gespeicherten Unterhaltung denselben Host verwendet, bevor proaktives Senden, Bearbeiten, Löschen, Karten, Umfragen oder in die Warteschlange gestellte lang laufende Antworten ausgeführt werden. Bei der standardmäßigen Konfiguration für die öffentliche Cloud verweigert OpenClaw den Vorgang, wenn eine gespeicherte Unterhaltung auf einen Host außerhalb des öffentlichen Teams-Connector-Hosts verweist. Empfangen Sie nach einer Änderung der Cloud-/Dienst-URL-Einstellungen eine neue Nachricht aus der Unterhaltung, damit die gespeicherte Unterhaltungsreferenz aktuell ist.
China/21Vianet hat in Microsofts Teams-Tabelle für proaktive Endpunkte keine separate globale proaktive smba-URL. Konfigurieren Sie cloud: "China", damit das Teams SDK die Azure-China-Endpunkte für Authentifizierung, Token und JWT verwendet. Proaktives Senden erfordert dann eine gespeicherte Unterhaltungsreferenz aus einer eingehenden China-Teams-Aktivität oder eine explizit konfigurierte Dienst-URL innerhalb der Azure-China-Begrenzung des Bot-Framework-Kanals (*.botframework.azure.cn). Graph-gestützte Teams-Hilfsfunktionen sind für cloud: "China" deaktiviert, bis OpenClaw Graph-Anfragen über den Azure-China-Graph-Endpunkt weiterleitet.
Formatierung
Teams-Markdown ist stärker eingeschränkt 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 Umfragen und semantische Präsentationssendungen unterstützt (siehe unten).
Konfiguration
Wichtige Einstellungen (gemeinsame Kanalmuster finden Sie unter /gateway/configuration):channels.msteams.enabled: den Kanal aktivieren/deaktivieren.channels.msteams.appId,channels.msteams.appPassword,channels.msteams.tenantId: Bot-Anmeldedaten.channels.msteams.cloud: Teams-SDK-Cloud-Umgebung (Public,USGov,USGovDoDoderChina; StandardwertPublic). Für USGov-/DoD-SDK-Clouds mitserviceUrlfestlegen; China verwendet die SDK-Voreinstellung und gespeicherte Azure-China-Bot-Framework-Konversationsreferenzen, wobei Graph-basierte Hilfsfunktionen deaktiviert bleiben, bis Azure-China-Graph-Routing verfügbar ist.channels.msteams.serviceUrl: URL-Grenze des Bot-Connector-Dienstes für proaktive SDK-Vorgänge. Die öffentliche Cloud verwendet den SDK-Standardwert; für GCC (https://smba.infra.gcc.teams.microsoft.com/teams), GCC High oder DoD festlegen. China akzeptiert Azure-China-Bot-Framework-Kanalhosts, wenn die gespeicherte Konversationsreferenz aus dem von 21Vianet betriebenen Teams stammt.channels.msteams.webhook.port(Standardwert3978).channels.msteams.webhook.path(Standardwert/api/messages).channels.msteams.dmPolicy:pairing | allowlist | open | disabled(Standardwertpairing).channels.msteams.allowFrom: Zulassungsliste für Direktnachrichten (AAD-Objekt-IDs empfohlen). Der Assistent löst Namen während der Einrichtung in IDs auf, wenn Graph-Zugriff verfügbar ist.channels.msteams.dangerouslyAllowNameMatching: Notfall-Umschalter, um den veränderlichen Abgleich von UPN/Anzeigenamen und das direkte Routing über Team-/Kanalnamen wieder zu aktivieren.channels.msteams.textChunkLimit: Größe ausgehender Textabschnitte in Zeichen (Standardwert4000; unabhängig von einem höher konfigurierten Wert fest auf4000begrenzt).channels.msteams.streaming.chunkMode:length(Standardwert) odernewline, um vor der längenbasierten Aufteilung an Leerzeilen (Absatzgrenzen) zu trennen.channels.msteams.mediaAllowHosts: Zulassungsliste für Hosts eingehender Anhänge (standardmäßig Microsoft-/Teams-Domains: Graph, SharePoint/OneDrive, Teams CDN, Bot Framework, Azure Media Services).channels.msteams.mediaAuthAllowHosts: Zulassungsliste für das Anhängen von Authorization-Headern bei erneuten Medienabrufen (standardmäßig Graph- und Bot-Framework-Hosts).channels.msteams.graphMediaFallback: Graph-Nachrichtensuchen aktivieren, wenn Kanal-/Gruppen-HTML keine Dateimarkierungen enthält (Standardwertfalse; siehe Wiederherstellung von Kanal-/Gruppendateien).channels.msteams.mediaMaxMb: kanalspezifische Überschreibung der Mediengrößenbegrenzung in MB. Fällt aufagents.defaults.mediaMaxMbzurück, wenn nicht festgelegt.channels.msteams.requireMention: @Erwähnung in Kanälen/Gruppen verlangen (Standardwerttrue).channels.msteams.replyStyle:thread | top-level(siehe Antwortstil).channels.msteams.teams.<teamId>.replyStyle: teamspezifische Überschreibung.channels.msteams.teams.<teamId>.requireMention: teamspezifische Überschreibung.channels.msteams.teams.<teamId>.tools: standardmäßige teamspezifische Überschreibungen der Werkzeugrichtlinie (allow/deny/alsoAllow), die verwendet werden, wenn eine Kanalüberschreibung fehlt.channels.msteams.teams.<teamId>.toolsBySender: standardmäßige teamspezifische und absenderspezifische Überschreibungen der Werkzeugrichtlinie (Platzhalter"*"wird unterstützt).channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: kanalspezifische Überschreibung.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: kanalspezifische Überschreibung.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: kanalspezifische Überschreibungen der Werkzeugrichtlinie (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: kanal- und absenderspezifische Überschreibungen der Werkzeugrichtlinie (Platzhalter"*"wird unterstützt).toolsBySender-Schlüssel sollten explizite Präfixe verwenden:channel:,id:,e164:,username:,name:(ältere Schlüssel ohne Präfix werden weiterhin nurid:zugeordnet).channels.msteams.authType: Authentifizierungstyp –"secret"(Standardwert) oder"federated".channels.msteams.certificatePath: Pfad zur PEM-Zertifikatsdatei (föderierte Authentifizierung und Zertifikatsauthentifizierung).channels.msteams.certificateThumbprint: Zertifikatfingerabdruck; wird akzeptiert, ist für die Authentifizierung jedoch nicht erforderlich.channels.msteams.useManagedIdentity: Authentifizierung mit verwalteter Identität aktivieren (föderierter Modus).channels.msteams.managedIdentityClientId: Client-ID für eine benutzerseitig zugewiesene verwaltete Identität.channels.msteams.sharePointSiteId: SharePoint-Website-ID für Datei-Uploads in Gruppenchats/Kanälen (siehe Dateien in Gruppenchats senden).channels.msteams.welcomeCard,channels.msteams.groupWelcomeCard,channels.msteams.promptStarters: Adaptive Card zur Begrüßung, die beim ersten Direktnachrichten-/Gruppenkontakt angezeigt wird, sowie deren Schaltflächen mit vorgeschlagenen Prompts.channels.msteams.responsePrefix: Text, der ausgehenden Antworten vorangestellt wird.channels.msteams.feedbackEnabled(Standardwerttrue),channels.msteams.feedbackReflection(Standardwerttrue),channels.msteams.feedbackReflectionCooldownMs: Feedback per Daumen hoch/runter zu Antworten und anschließende Reflexion bei negativem Feedback.channels.msteams.sso,channels.msteams.delegatedAuth: Bot-Framework-OAuth-Verbindung und delegierte Graph-Bereiche für SSO-basierte Abläufe;sso.enabled: trueerfordertsso.connectionName.
Routing und Sitzungen
- Sitzungsschlüssel folgen dem standardmäßigen Agentenformat (siehe /concepts/session):
- Direktnachrichten verwenden gemeinsam die Hauptsitzung (
agent:<agentId>:<mainKey>). - Kanal-/Gruppennachrichten verwenden die Konversations-ID:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- Direktnachrichten verwenden gemeinsam die Hauptsitzung (
Antwortstil: Threads oder Beiträge
Teams bietet für dasselbe zugrunde liegende Datenmodell zwei Kanaloberflächen:
Das Problem: Die Teams-API gibt nicht an, welche Oberfläche ein Kanal verwendet. Wenn Sie das falsche
replyStyle verwenden:
threadin einem Kanal mit Threads-Oberfläche → Antworten erscheinen unübersichtlich verschachtelt.top-levelin einem Kanal mit Beitragsoberfläche → Antworten erscheinen als separate Beiträge auf oberster Ebene statt innerhalb des Threads.
replyStyle für jeden Kanal entsprechend seiner Einrichtung:
Auflösungsreihenfolge
Wenn der Bot eine Antwort in einen Kanal sendet, wirdreplyStyle von der spezifischsten Überschreibung bis zum Standardwert aufgelöst. Der erste Wert, der nicht undefined ist, wird verwendet:
- Pro Kanal –
channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle - Pro Team –
channels.msteams.teams.<teamId>.replyStyle - Global –
channels.msteams.replyStyle - Impliziter Standardwert – abgeleitet aus
requireMention:requireMention: true→threadrequireMention: false→top-level
requireMention: false global ohne ein explizites replyStyle festlegen, erscheinen Erwähnungen in Kanälen mit Beitragsoberfläche als Beiträge auf oberster Ebene, selbst wenn die eingehende Nachricht eine Thread-Antwort war. Legen Sie replyStyle: "thread" auf globaler, Team- oder Kanalebene fest, um Überraschungen zu vermeiden.
Für proaktive Sendevorgänge in eine gespeicherte Kanalkonversation (Antworten auf Werkzeugaufrufe in der Warteschlange, lang laufende Agenten) gilt dieselbe Team-/Kanalauflösung; Gruppenchats und persönliche Konversationen (Direktnachrichten) werden bei proaktiven Sendevorgängen unabhängig von replyStyle immer zu top-level aufgelöst.
Beibehaltung des Thread-Kontexts
WennreplyStyle: "thread" gilt und der Bot innerhalb eines Kanal-Threads per @Erwähnung angesprochen wurde, hängt OpenClaw den ursprünglichen Thread-Ausgangspunkt wieder an die ausgehende Konversationsreferenz (19:...@thread.tacv2;messageid=<root>) an, damit die Antwort im selben Thread landet. Dies gilt sowohl für direkte Sendevorgänge (innerhalb des aktuellen Durchlaufs) als auch für proaktive Sendevorgänge, nachdem der Bot-Framework-Durchlaufkontext abgelaufen ist (z. B. lang laufende Agenten oder Antworten auf Werkzeugaufrufe in der Warteschlange über mcp__openclaw__message).
Der Thread-Ausgangspunkt wird dem gespeicherten threadId der Konversationsreferenz entnommen. Ältere gespeicherte Referenzen, die vor threadId erstellt wurden, fallen auf activityId zurück (die eingehende Aktivität, die die Konversation zuletzt initialisiert hat), sodass bestehende Bereitstellungen ohne erneute Initialisierung weiter funktionieren.
Wenn replyStyle: "top-level" gilt, werden eingehende Kanal-Thread-Nachrichten absichtlich als neue Beiträge auf oberster Ebene beantwortet; es wird kein Thread-Suffix angehängt. Dies ist für Kanäle mit Threads-Oberfläche korrekt. Wenn Beiträge auf oberster Ebene erscheinen, obwohl Sie Thread-Antworten erwartet haben, ist replyStyle für diesen Kanal falsch festgelegt.
Anhänge und Bilder
Aktuelle Einschränkungen:- Direktnachrichten: Bilder und Dateianhänge funktionieren über die Teams-Bot-Datei-APIs.
- Kanäle/Gruppen: Anhänge befinden sich im M365-Speicher (SharePoint/OneDrive). Die Webhook-Nutzlast enthält nur ein HTML-Fragment, nicht die tatsächlichen Dateibytes. Zum Herunterladen von Kanalanhängen sind Graph-API-Berechtigungen erforderlich.
- Verwenden Sie für explizite dateiorientierte Sendevorgänge
action=upload-filemitmedia/filePath/path; das optionalemessagewird zum begleitenden Text/Kommentar undfilename(odertitle) überschreibt den Namen der hochgeladenen Datei.
channels.msteams.mediaAllowHosts überschrieben werden (verwenden Sie ["*"], um jeden Host zuzulassen).
Authorization-Header werden nur für Hosts in channels.msteams.mediaAuthAllowHosts angehängt (standardmäßig Graph- und Bot-Framework-Hosts). Halten Sie diese Liste strikt (vermeiden Sie mandantenübergreifende Suffixe).
Dateien in Gruppenchats senden
Bots können Dateien in Direktnachrichten über den integrierten FileConsentCard-Ablauf senden. Das Senden von Dateien in Gruppenchats/Kanälen erfordert eine zusätzliche Einrichtung:Warum Gruppenchats SharePoint benötigen
Bots verwenden eine Anwendungsidentität, während die/me-Ressource von Microsoft Graph einen angemeldeten Benutzer erfordert. Um Dateien in Gruppenchats/Kanälen zu senden, lädt der Bot sie auf eine SharePoint-Website hoch und erstellt einen Freigabelink.
Einrichtung
-
Fügen Sie Graph-API-Berechtigungen unter Entra ID (Azure AD) → App Registration hinzu:
Sites.ReadWrite.All(Application) – Dateien zu SharePoint hochladen.ChatMember.Read.All(Application) – mandantenweite Berechtigung mit den geringsten Rechten für das Senden von Dateien in Gruppenchats.Chat.Read.Allfunktioniert ebenfalls und deckt dies bereits ab, wenn der Gruppenchatverlauf aktiviert ist. Verwenden Sie als chatbezogene Alternative die ressourcenspezifische EinwilligungsberechtigungChatMember.Read.Chat.
- Erteilen Sie die Administratoreinwilligung für den Mandanten.
-
Rufen Sie Ihre SharePoint-Website-ID ab:
-
OpenClaw konfigurieren:
Freigabeverhalten
Die benutzerspezifische Freigabe ist sicherer, da nur Chatteilnehmende auf die Datei zugreifen können. OpenClaw erfordert für Gruppenchats eine erfolgreiche Mitgliedersuche; Zeitüberschreitungen, Transportfehler, leere Ergebnisse und Ablehnungen durch die Graph API führen dazu, dass das Senden fehlschlägt, statt den Zugriff auf die Organisation auszuweiten.
Fallback-Verhalten
Speicherort der Dateien
Hochgeladene Dateien werden in einem Ordner/OpenClawShared/ in der standardmäßigen Dokumentbibliothek der konfigurierten SharePoint-Website gespeichert.
Umfragen (Adaptive Cards)
OpenClaw sendet Teams-Umfragen als Adaptive Cards (es gibt keine native Teams-Umfrage-API).- CLI:
openclaw message poll --channel msteams --target conversation:<id> --poll-question "..." --poll-option "..." --poll-option "...". - Stimmen werden vom Gateway im SQLite-Plugin-Status von OpenClaw unter
state/openclaw.sqlitegespeichert. - Vorhandene
msteams-polls.json-Dateien werden durchopenclaw doctor --fiximportiert, nicht durch das laufende Plugin. - Das Gateway muss online bleiben, um Stimmen zu erfassen.
- Umfragen veröffentlichen nicht automatisch Ergebniszusammenfassungen, und es gibt noch keine CLI für Umfrageergebnisse.
Präsentationskarten
Senden Sie semantische Präsentationsnutzlasten mit dem Toolmessage, der CLI oder der normalen Antwortzustellung an Teams-Benutzer oder -Unterhaltungen. OpenClaw rendert sie gemäß dem generischen Präsentationsvertrag als Teams Adaptive Cards.
Der Parameter presentation akzeptiert semantische Blöcke. Wenn presentation angegeben ist, ist der Nachrichtentext optional. Schaltflächen werden als Adaptive-Card-Übermittlungs- oder URL-Aktionen gerendert. Auswahlmenüs sind im Teams-Renderer nicht nativ verfügbar, daher stuft OpenClaw sie vor der Zustellung zu lesbarem Text herab.
Agent-Tool:
Zielformate
MSTeams-Ziele verwenden Präfixe, um zwischen Benutzern und Unterhaltungen zu unterscheiden:
CLI-Beispiele:
Ohne das Präfix
user: werden Namen standardmäßig als Gruppe oder Team aufgelöst. Verwenden Sie immer user:, wenn Sie Personen anhand ihres Anzeigenamens adressieren.Proaktive Nachrichten
- Proaktive Nachrichten sind nur möglich, nachdem ein Benutzer interagiert hat, da OpenClaw zu diesem Zeitpunkt Unterhaltungsreferenzen speichert.
- Informationen zu
dmPolicyund zur Zulassungslistensteuerung finden Sie unter /gateway/configuration.
Team- und Kanal-IDs (häufiger Stolperstein)
Der AbfrageparametergroupId in Teams-URLs ist NICHT die für die Konfiguration verwendete Team-ID. Extrahieren Sie die IDs stattdessen aus dem URL-Pfad:
Team-URL:
- Team-Schlüssel = Pfadsegment nach
/team/(URL-decodiert, z. B.19:Bk4j...@thread.tacv2; ältere Mandanten zeigen möglicherweise@thread.skype, was ebenfalls gültig ist). - Kanal-Schlüssel = Pfadsegment nach
/channel/(URL-decodiert). - Ignorieren Sie den Abfrageparameter
groupIdfür das OpenClaw-Routing. Dabei handelt es sich um die Microsoft-Entra-Gruppen-ID, nicht um die Bot-Framework-Unterhaltungs-ID, die in eingehenden Teams-Aktivitäten verwendet wird.
Private Kanäle
Bots werden in privaten Kanälen nur eingeschränkt unterstützt:
Problemumgehungen, wenn private Kanäle nicht funktionieren:
- Verwenden Sie Standardkanäle für Bot-Interaktionen.
- Verwenden Sie Direktnachrichten; Benutzer können dem Bot jederzeit direkt schreiben.
- Verwenden Sie die Graph API für den historischen Zugriff (erfordert
ChannelMessage.Read.All).
Fehlerbehebung
Häufige Probleme
- Bilder werden in Kanälen nicht angezeigt: Graph-Berechtigungen oder Administratoreinwilligung fehlen. Installieren Sie die Teams-App neu, beenden Sie Teams vollständig und öffnen Sie es erneut.
- Keine Antworten im Kanal: Erwähnungen sind standardmäßig erforderlich; legen Sie
channels.msteams.requireMention=falsefest oder konfigurieren Sie dies je Team/Kanal. - Versionsabweichung (Teams zeigt weiterhin das alte Manifest): Entfernen Sie die App, fügen Sie sie erneut hinzu, beenden Sie Teams vollständig und öffnen Sie es zur Aktualisierung erneut.
- 401 Unauthorized vom Webhook: Wird beim manuellen Testen ohne Azure-JWT erwartet; dies bedeutet, dass der Endpunkt erreichbar ist, die Authentifizierung jedoch fehlgeschlagen ist. Verwenden Sie Azure Web Chat für einen ordnungsgemäßen Test.
Fehler beim Hochladen des Manifests
- “Icon file cannot be empty”: Das Manifest verweist auf Symboldateien mit einer Größe von 0 Byte. Erstellen Sie 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. Suchen und deinstallieren Sie sie zuerst oder warten Sie 5-10 Minuten auf die Übernahme der Änderung.
- “Something went wrong” beim Hochladen: Laden Sie sie stattdessen über https://admin.teams.microsoft.com hoch, öffnen Sie die Browser-Entwicklertools (F12) → Registerkarte Network und prüfen Sie den Antworttext auf den tatsächlichen Fehler.
- Querladen schlägt fehl: Versuchen Sie “Upload an app to your org’s app catalog” anstelle von “Upload a custom app”; dadurch werden Einschränkungen für das Querladen häufig umgangen.
RSC-Berechtigungen funktionieren nicht
- Überprüfen Sie, ob
webApplicationInfo.idexakt mit der App-ID Ihres Bots übereinstimmt. - Laden Sie die App erneut hoch und installieren Sie sie im Team/Chat neu.
- Prüfen Sie, ob der Administrator Ihrer Organisation RSC-Berechtigungen blockiert hat.
- Vergewissern Sie sich, dass Sie den richtigen Bereich verwenden:
ChannelMessage.Read.Groupfür Teams,ChatMessage.Read.Chatfür Gruppenchats.
Referenzen
- Azure Bot erstellen - Einrichtungsanleitung für Azure Bot
- Teams Developer Portal - Teams-Apps erstellen/verwalten
- Schema des Teams-App-Manifests
- Kanalnachrichten mit RSC empfangen
- Referenz zu RSC-Berechtigungen
- Dateiverarbeitung für Teams-Bots (Kanal/Gruppe erfordert Graph)
- Proaktive Nachrichten
- @microsoft/teams.cli - Teams-CLI zur Bot-Verwaltung
Verwandte Themen
- Kanalübersicht - alle unterstützten Kanäle
- Kopplung - DM-Authentifizierung und Kopplungsablauf
- Gruppen - Verhalten von Gruppenchats und erwähnungsbasierte Freigabe
- Kanal-Routing - Sitzungs-Routing für Nachrichten
- Sicherheit - Zugriffsmodell und Absicherung