Mainstream messaging
Microsoft Teams
Status: Text- und DM-Anhänge werden unterstützt; das Senden von Dateien in Kanälen/Gruppen erfordert 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:
openclaw plugins install @openclaw/msteamsVerwenden Sie das Paket ohne Versionsangabe, um dem aktuellen offiziellen Release-Tag zu folgen. Fixieren Sie eine exakte Version nur, wenn Sie eine reproduzierbare Installation benötigen.
Lokaler Checkout (Ausführung aus einem Git-Repository):
openclaw plugins install ./path/to/local/msteams-pluginDetails: Plugins
Schnelleinrichtung
@microsoft/teams.cli übernimmt Bot-Registrierung, Manifest-Erstellung und Generierung von Anmeldedaten mit einem einzigen Befehl.
1. Installieren und anmelden
npm install -g @microsoft/teams.cli@previewteams loginteams status # Prüfen, ob Sie angemeldet sind, und Mandanteninformationen anzeigen2. Einen Tunnel starten (Teams kann localhost nicht erreichen)
Installieren und authentifizieren Sie bei Bedarf die devtunnel CLI (Leitfaden für die ersten Schritte).
# Einmalige Einrichtung (dauerhafte URL über Sitzungen hinweg):devtunnel create my-openclaw-bot --allow-anonymousdevtunnel port create my-openclaw-bot -p 3978 --protocol auto # Für jede Entwicklungssitzung:devtunnel host my-openclaw-bot# Ihr Endpunkt: https://<tunnel-id>.devtunnels.ms/api/messagesAlternativen: ngrok http 3978 oder tailscale funnel 3978 (URLs können sich bei jeder Sitzung ändern).
3. Die App erstellen
teams app create \ --name "OpenClaw" \ --endpoint "https://<your-tunnel-url>/api/messages"Dadurch wird eine Entra ID-Anwendung (Azure AD) erstellt, ein Client-Geheimnis generiert, ein Teams-App-Manifest (mit Symbolen) erstellt und hochgeladen sowie ein von Teams verwalteter Bot registriert (kein Azure-Abonnement erforderlich). Die Ausgabe enthält 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:
{ channels: { msteams: { enabled: true, appId: "<CLIENT_ID>", appPassword: "<CLIENT_SECRET>", tenantId: "<TENANT_ID>", webhook: { port: 3978, path: "/api/messages" }, }, },}Alternativ können Sie direkt Umgebungsvariablen verwenden: 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:
teams app get <teamsAppId> --install-link6. Prüfen, ob alles funktioniert
teams app doctor <teamsAppId>Führt Diagnosen für Bot-Registrierung, AAD-App-Konfiguration, Manifestgültigkeit und SSO-Einrichtung aus.
Erwägen Sie für den Produktionseinsatz föderierte Authentifizierung (Zertifikat oder verwaltete Identität) anstelle von Client-Geheimnissen.
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:
{ channels: { msteams: { configWrites: false } },}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.
Gruppenzugriff
- 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".
Beispiel:
{ channels: { msteams: { groupPolicy: "allowlist", groupAllowFrom: ["00000000-0000-0000-0000-000000000000", "accessGroup:core-team"], }, },}Zulassungsliste für Team + Kanal
- 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.
Beispiel:
{ channels: { msteams: { groupPolicy: "allowlist", teams: { "My Team": { channels: { General: { requireMention: true }, }, }, }, }, },}Manuelle Einrichtung (ohne Teams CLI)
Funktionsweise
- Stellen Sie sicher, dass das Microsoft Teams-Plugin verfügbar ist (in aktuellen Releases gebündelt).
- Erstellen Sie einen Azure Bot (App-ID + Geheimnis + Mandanten-ID).
- Erstellen Sie ein Teams-App-Paket, das auf den Bot verweist und die unten aufgeführten RSC-Berechtigungen enthält.
- Laden/installieren Sie die Teams-App in einem Team (oder im persönlichen Bereich für DMs).
- Konfigurieren Sie
msteamsin~/.openclaw/openclaw.json(oder Umgebungsvariablen) und starten Sie das Gateway. - Das Gateway lauscht standardmäßig unter
/api/messagesauf Webhook-Datenverkehr des Bot Framework.
Schritt 1: Azure Bot erstellen
-
Rufen Sie Create Azure Bot auf.
-
Füllen Sie die Registerkarte Basics aus:
Feld Wert Bot handle Ihr Bot-Name, z. B. openclaw-msteams(muss eindeutig sein)Subscription Wählen Sie Ihr Azure-Abonnement aus Resource group Erstellen Sie eine neue oder verwenden Sie eine vorhandene Pricing tier Free für Entwicklung/Tests Type of App Single Tenant (empfohlen; siehe Hinweis unten) Creation type Create new Microsoft App ID
- Klicken Sie auf Review + create und anschließend auf Create (~1-2 Minuten).
Schritt 2: Anmeldedaten abrufen
- Azure Bot-Ressource → Configuration → kopieren Sie die Microsoft App ID (Ihre
appId). - Manage Password → App-Registrierung → Certificates & secrets → New client secret → kopieren Sie den Value (Ihr
appPassword). - Overview → kopieren Sie die Directory (tenant) ID (Ihre
tenantId).
Schritt 3: Messaging-Endpunkt konfigurieren
- Azure Bot → Configuration.
- Legen Sie den Messaging endpoint fest:
- Produktion:
https://your-domain.com/api/messages - Lokale Entwicklung: Verwenden Sie einen Tunnel (siehe Lokale Entwicklung).
- Produktion:
Schritt 4: Teams-Kanal aktivieren
- Azure Bot → Channels.
- Klicken Sie auf Microsoft Teams → Configure → Save.
- Akzeptieren Sie die Nutzungsbedingungen.
Schritt 5: Teams-App-Manifest erstellen
- Fügen Sie einen
bot-Eintrag mitbotId = <App ID>ein. - Bereiche:
personal,team,groupChat. supportsFiles: true(für die Dateiverarbeitung im persönlichen Bereich erforderlich).- Fügen Sie RSC-Berechtigungen hinzu (siehe RSC-Berechtigungen).
- Erstellen Sie Symbole:
outline.png(32x32) undcolor.png(192x192). - Komprimieren Sie
manifest.json,outline.pngundcolor.pnggemeinsam in eine ZIP-Datei.
Schritt 6: OpenClaw konfigurieren
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", appPassword: "<APP_PASSWORD>", tenantId: "<TENANT_ID>", webhook: { port: 3978, path: "/api/messages" }, }, },}Umgebungsvariablen: MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID.
Schritt 7: Gateway ausführen
Der Teams-Kanal startet automatisch, wenn das Plugin verfügbar ist und die msteams-Konfiguration Anmeldedaten enthält.
Föderierte Authentifizierung (Zertifikat plus verwaltete Identität)
Für den Produktionseinsatz unterstützt OpenClaw über channels.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.
Konfiguration:
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", tenantId: "<TENANT_ID>", authType: "federated", certificatePath: "/path/to/cert.pem", webhook: { port: 3978, path: "/api/messages" }, }, },}Umgebungsvariablen:
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.
Voraussetzungen:
- 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.
Konfiguration (systemseitig zugewiesene verwaltete Identität):
{ channels: { msteams: { enabled: true, appId: "<APP_ID>", tenantId: "<TENANT_ID>", authType: "federated", useManagedIdentity: true, webhook: { port: 3978, path: "/api/messages" }, }, },}Konfiguration (benutzerseitig zugewiesene verwaltete Identität): Fügen Sie dem obigen Block 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:
bash az ad app federated-credential create --id <APP_OBJECT_ID> --parameters '{ "name": "my-bot-workload-identity", "issuer": "<AKS_OIDC_ISSUER_URL>", "subject": "system:serviceaccount:<NAMESPACE>:<SERVICE_ACCOUNT>", "audiences": ["api://AzureADTokenExchange"]}' -
Versehen Sie das Kubernetes-Dienstkonto mit einer Annotation für die Client-ID der App:
yaml apiVersion: v1kind: ServiceAccountmetadata: name: my-bot-sa annotations: azure.workload.identity/client-id: "<APP_CLIENT_ID>" -
Versehen Sie den Pod mit einem Label für die Einbindung der Workloadidentität:
yaml metadata: labels: azure.workload.identity/use: "true" -
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
| Methode | Konfiguration | Vorteile | Nachteile |
|---|---|---|---|
| Clientgeheimnis | appPassword |
Einfache Einrichtung | Rotation des Geheimnisses erforderlich, weniger sicher |
| Zertifikat | authType: "federated" + certificatePath |
Kein gemeinsames Geheimnis über das Netzwerk | Aufwand für die Zertifikatsverwaltung |
| Verwaltete Identität | authType: "federated" + useManagedIdentity |
Kennwortlos, keine Geheimnisse zu verwalten | Azure-Infrastruktur erforderlich |
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 kann localhost nicht erreichen. Verwenden Sie einen persistenten Entwicklungstunnel, damit die URL sitzungsübergreifend stabil bleibt:
# Einmalige Einrichtung:devtunnel create my-openclaw-bot --allow-anonymousdevtunnel port create my-openclaw-bot -p 3978 --protocol auto # Bei jeder Entwicklungssitzung:devtunnel host my-openclaw-botAlternativen: 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:
teams app update <teamsAppId> --endpoint "https://<new-url>/api/messages"Bot testen
Diagnose ausführen:
teams app doctor <teamsAppId>Prüft Bot-Registrierung, AAD-App, Manifest und SSO-Konfiguration in einem Durchlauf.
Testnachricht senden:
- 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 von openclaw.json über Umgebungsvariablen festgelegt werden (andere Konfigurationsschlüssel wie groupPolicy oder historyLimit können nur in der Konfiguration festgelegt werden):
| Umgebungsvariable | Konfigurationsschlüssel | Hinweise |
|---|---|---|
MSTEAMS_APP_ID |
appId |
|
MSTEAMS_APP_PASSWORD |
appPassword |
|
MSTEAMS_TENANT_ID |
tenantId |
|
MSTEAMS_AUTH_TYPE |
authType |
"secret" oder "federated" |
MSTEAMS_CERTIFICATE_PATH |
certificatePath |
Verbundidentität + Zertifikat |
MSTEAMS_CERTIFICATE_THUMBPRINT |
certificateThumbprint |
akzeptiert, für die Authentifizierung nicht erforderlich |
MSTEAMS_USE_MANAGED_IDENTITY |
useManagedIdentity |
Verbundidentität + verwaltete Identität |
MSTEAMS_MANAGED_IDENTITY_CLIENT_ID |
managedIdentityClientId |
nur benutzerseitig zugewiesene verwaltete Identität |
Aktion für Mitgliedsinformationen
OpenClaw stellt für Microsoft Teams eine Graph-gestützte Aktion member-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).
Die Aktion ist immer verfügbar, wenn Graph-Anmeldeinformationen konfiguriert sind; es gibt keinen separaten Schalter 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)
Für Gruppenchats:
ChatMessage.Read.Chat(Application) – alle Gruppenchatnachrichten ohne @Erwähnung empfangen
Fügen Sie RSC-Berechtigungen über die Teams-CLI hinzu:
teams app rsc add <teamsAppId> ChannelMessage.Read.Group --type ApplicationBeispiel für ein Teams-Manifest (geschwärzt)
Minimales, gültiges Beispiel mit den erforderlichen Feldern. Ersetzen Sie IDs und URLs.
{ $schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json", manifestVersion: "1.23", version: "1.0.0", id: "00000000-0000-0000-0000-000000000000", name: { short: "OpenClaw" }, developer: { name: "Ihre Organisation", websiteUrl: "https://example.com", privacyUrl: "https://example.com/privacy", termsOfUseUrl: "https://example.com/terms", }, description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" }, icons: { outline: "outline.png", color: "color.png" }, accentColor: "#5B6DEF", bots: [ { botId: "11111111-1111-1111-1111-111111111111", scopes: ["personal", "team", "groupChat"], isNotificationOnly: false, supportsCalling: false, supportsVideo: false, supportsFiles: true, }, ], webApplicationInfo: { id: "11111111-1111-1111-1111-111111111111", }, authorization: { permissions: { resourceSpecific: [ { name: "ChannelMessage.Read.Group", type: "Application" }, { name: "ChannelMessage.Send.Group", type: "Application" }, { name: "Member.Read.Group", type: "Application" }, { name: "Owner.Read.Group", type: "Application" }, { name: "ChannelSettings.Read.Group", type: "Application" }, { name: "TeamMember.Read.Group", type: "Application" }, { name: "TeamSettings.Read.Group", type: "Application" }, { name: "ChatMessage.Read.Chat", type: "Application" }, ], }, },}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
# Manifest herunterladen, bearbeiten und erneut hochladenteams app manifest download <teamsAppId> manifest.json# manifest.json lokal bearbeiten ...teams app manifest upload manifest.json <teamsAppId># Die Version wird automatisch erhöht, wenn sich der Inhalt geändert hatInstallieren Sie die App nach der Aktualisierung in jedem Team neu und beenden Sie Teams vollständig und starten Sie es neu (schließen Sie nicht nur das Fenster), um zwischengespeicherte App-Metadaten zu löschen.
Manuelle Manifestaktualisierung (ohne CLI)
- Aktualisieren Sie
manifest.jsonmit den neuen Einstellungen. - Erhöhen Sie das Feld
version(z. B.1.0.0→1.1.0). - Erstellen Sie die ZIP-Datei erneut und schließen Sie die Symbole ein (
manifest.json,outline.png,color.png). - Laden Sie die neue ZIP-Datei hoch:
- Teams Admin Center: Teams apps → Manage apps → suchen Sie Ihre App → Upload new version.
- Querladen: Teams → Apps → Manage your apps → Upload a custom app.
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.
Funktioniert NICHT:
- 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
| Funktion | RSC-Berechtigungen | Graph API |
|---|---|---|
| Echtzeitnachrichten | Ja (über Webhook) | Nein (nur Polling) |
| Historische Nachrichten | Nein | Ja (Verlauf kann abgefragt werden) |
| Einrichtungskomplexität | Nur App-Manifest | Erfordert Administratoreinwilligung + Token-Ablauf |
| Funktioniert offline | Nein (muss ausgeführt werden) | Ja (jederzeit abfragbar) |
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:
{ channels: { msteams: { graphMediaFallback: true, }, },}Dies gilt nur für Kanäle und Gruppenchats. Es fügt immer dann eine Graph-Nachrichtenabfrage hinzu, wenn eine HTML-Aktivität keine direkt herunterladbaren Medien erzeugt hat, einschließlich gewöhnlicher Nachrichten oder Nachrichten, die nur eine Erwähnung enthalten. Der Standardwert ist 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 Unterhaltungsreferenz serviceUrl. 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.
Microsoft veröffentlicht die globalen proaktiven Bot-Connector-Endpunkte im Abschnitt Unterhaltung erstellen der Teams-Dokumentation zu proaktiven Nachrichten. Verwenden Sie serviceUrl der eingehenden Aktivität, wenn verfügbar; verwenden Sie andernfalls die nachfolgende Tabelle von Microsoft.
| Teams-Umgebung | OpenClaw-Konfiguration | Proaktive serviceUrl |
|---|---|---|
| Öffentlich | keine Cloud-/serviceUrl-Konfiguration erforderlich | https://smba.trafficmanager.net/teams |
| GCC | serviceUrl festlegen; es gibt keine separate Cloud-Voreinstellung des Teams SDK |
https://smba.infra.gcc.teams.microsoft.com/teams |
| GCC High | cloud: "USGov" + serviceUrl |
https://smba.infra.gov.teams.microsoft.us/teams |
| DoD | cloud: "USGovDoD" + serviceUrl |
https://smba.infra.dod.teams.microsoft.us/teams |
| China/21Vianet | cloud: "China" |
serviceUrl der eingehenden Aktivität verwenden |
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": "https://smba.infra.gcc.teams.microsoft.com/teams" } }}Beispiel für GCC High:
{ "channels": { "msteams": { "cloud": "USGov", "serviceUrl": "https://smba.infra.gov.teams.microsoft.us/teams" } }}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:
| Stil | Beschreibung | Empfohlenes replyStyle |
|---|---|---|
| Beiträge (klassisch) | Nachrichten erscheinen als Karten mit darunter angeordneten Antworten in Threads | thread (Standardwert) |
| Threads (Slack-ähnlich) | Nachrichten verlaufen linear, ähnlich wie in Slack | top-level |
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.
Lösung: Konfigurieren Sie replyStyle für jeden Kanal entsprechend seiner Einrichtung:
{ channels: { msteams: { replyStyle: "thread", teams: { "19:abc...@thread.tacv2": { channels: { "19:xyz...@thread.tacv2": { replyStyle: "top-level", }, }, }, }, }, },}Auflösungsreihenfolge
Wenn der Bot eine Antwort in einen Kanal sendet, wird replyStyle 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
Wenn Sie 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
Wenn replyStyle: "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.
Ohne Graph-Berechtigungen gehen Kanalnachrichten mit Bildern nur als Text ein (der Bot kann nicht auf den Bildinhalt zugreifen).
Standardmäßig lädt OpenClaw Medien nur von Microsoft-/Teams-Hostnamen herunter. Dies kann mit 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:
| Kontext | So werden Dateien gesendet | Erforderliche Einrichtung |
|---|---|---|
| Direktnachrichten | FileConsentCard → Benutzer akzeptiert → Bot lädt hoch | Funktioniert ohne zusätzliche Einrichtung |
| Gruppenchats/Kanäle | Upload zu SharePoint → native Dateikarte | Erfordert sharePointSiteId und Graph-Berechtigungen |
| Bilder (jeder Kontext) | Base64-kodiert und eingebettet | Funktioniert ohne 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:
bash # Über Graph Explorer oder curl mit einem gültigen Token:curl -H "Authorization: Bearer $TOKEN" \ "https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}" # Beispiel: für eine Website unter "contoso.sharepoint.com/sites/BotFiles"curl -H "Authorization: Bearer $TOKEN" \ "https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles" # Die Antwort enthält: "id": "contoso.sharepoint.com,guid1,guid2" -
OpenClaw konfigurieren:
json5 { channels: { msteams: { // ... weitere Konfiguration ... sharePointSiteId: "contoso.sharepoint.com,guid1,guid2", }, },}
Freigabeverhalten
| Kontext und Berechtigung | Freigabeverhalten |
|---|---|
Kanal + Sites.ReadWrite.All |
Organisationsweiter Freigabelink (alle in der Organisation haben Zugriff) |
Gruppenchat + Sites.ReadWrite.All + eine unterstützte Leseberechtigung für Chatmitglieder |
Benutzerspezifischer Freigabelink (nur Chatmitglieder haben Zugriff) |
| Gruppenchat ohne unterstützte Leseberechtigung für Chatmitglieder | Senden schlägt sicher geschlossen fehl |
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
| Szenario | Ergebnis |
|---|---|
| Gruppenchat + Datei + SharePoint- und Mitgliederberechtigungen konfiguriert | In SharePoint hochladen, native Dateikarte senden |
| Gruppenchat + Datei + fehlende SharePoint- oder Mitgliederberechtigungen | Mit einem umsetzbaren Konfigurationsfehler fehlschlagen |
Kanal + Datei + sharePointSiteId konfiguriert |
In SharePoint hochladen, native Dateikarte senden |
| Persönlicher Chat + Datei | FileConsentCard-Ablauf (funktioniert ohne SharePoint) |
| Beliebiger Kontext + Bild | Base64-codiert inline (funktioniert ohne SharePoint) |
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 Tool message, 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:
{ action: "send", channel: "msteams", target: "user:<id>", presentation: { title: "Hallo", blocks: [{ type: "text", text: "Hallo!" }], },}CLI:
openclaw message send --channel msteams \ --target "conversation:19:abc...@thread.tacv2" \ --presentation '{"title":"Hallo","blocks":[{"type":"text","text":"Hallo!"}]}'Details zu Zielformaten finden Sie weiter unten unter Zielformate.
Zielformate
MSTeams-Ziele verwenden Präfixe, um zwischen Benutzern und Unterhaltungen 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, 19:...@unq.gbl.spaces oder eine reine a:-/8:orgid:-/29:-Bot-Framework-ID |
CLI-Beispiele:
# An einen Benutzer nach ID sendenopenclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Hallo" # An einen Benutzer nach Anzeigename senden (löst eine Graph-API-Suche aus)openclaw message send --channel msteams --target "user:John Smith" --message "Hallo" # An einen Gruppenchat oder Kanal sendenopenclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Hallo" # Eine Präsentationskarte an eine Unterhaltung sendenopenclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" \ --presentation '{"title":"Hallo","blocks":[{"type":"text","text":"Hallo"}]}'Beispiele für das Agent-Tool:
{ action: "send", channel: "msteams", target: "user:John Smith", message: "Hallo!",}{ action: "send", channel: "msteams", target: "conversation:19:abc...@thread.tacv2", presentation: { title: "Hallo", blocks: [{ type: "text", text: "Hallo" }], },}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 Abfrageparameter groupId in Teams-URLs ist NICHT die für die Konfiguration verwendete Team-ID. Extrahieren Sie die IDs stattdessen aus dem URL-Pfad:
Team-URL:
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=... └────────────────────────────┘ Team-Unterhaltungs-ID (URL-decodieren)Kanal-URL:
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=... └─────────────────────────┘ Kanal-ID (URL-decodieren)Für die Konfiguration:
- 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:
| Funktion | Standardkanäle | Private Kanäle |
|---|---|---|
| Bot-Installation | Ja | Eingeschränkt |
| Echtzeitnachrichten (Webhook) | Ja | Funktionieren möglicherweise nicht |
| RSC-Berechtigungen | Ja | Können sich anders verhalten |
| @Erwähnungen | Ja | Wenn der Bot erreichbar ist |
| Graph-API-Verlauf | Ja | Ja (mit Berechtigungen) |
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