Microsoft Teams

Microsoft Teams bot integration via Azure Bot Framework with DMs, channels, groups, Adaptive Cards, polls, file sharing via SharePoint, and RSC permissions.

Microsoft Teams is the enterprise workplace juggernaut, and OpenClaw's Teams integration brings AI agent capabilities into the platform where millions of knowledge workers already spend their day. Built on the Azure Bot Framework, the plugin handles DMs, group chats, and team channels with Adaptive Cards for rich content delivery, polls, thread-aware replies, and file sharing via SharePoint integration. The setup is the most complex of any OpenClaw channel — the docs open with 'Abandon all hope, ye who enter here' for good reason. You need an Azure Bot resource, App Registration credentials (App ID, client secret, tenant ID), a Teams app manifest with RSC (Resource-Specific Consent) permissions, a publicly reachable webhook endpoint, and careful attention to Microsoft's deprecation of multi-tenant bots. But once configured, the integration is stable and feature-rich. RSC permissions are a major enabler: ChannelMessage.Read.Group lets the bot receive all channel messages without requiring @mentions, while ChatMessage.Read.Chat does the same for group chats. The Graph API handles media downloads, user avatar resolution, and message history retrieval. File sending in group chats requires a SharePoint site ID and additional Graph permissions. Adaptive Cards power the poll system — they render beautifully in Teams with action buttons. Thread awareness means the bot can reply in-thread or at the top level, configurable per deployment. Config writes are enabled by default, letting admins adjust settings via /config commands directly from Teams. Multi-account support means you can run separate bot personalities for different teams or tenants from one OpenClaw instance.

Tags: workspace, microsoft, enterprise, azure

Category: Workspace

Use Cases

  • Enterprise AI assistant accessible to all employees via Teams
  • IT helpdesk bot with Adaptive Card-based polls and surveys
  • Project management AI integrated into team channels
  • Meeting summarizer bot deployed in Teams group chats
  • Company knowledge base Q&A bot with controlled channel access
  • Multi-tenant AI deployment for managed service providers

Tips

  • Use the Teams Developer Portal (dev.teams.microsoft.com) to create app packages — it's easier than hand-editing JSON manifests
  • Test your webhook with Azure Web Chat first before installing in Teams — it validates the endpoint works
  • Use Tailscale Funnel for local development instead of ngrok — it's free and stable
  • Set commands.config: true to allow admins to adjust OpenClaw settings directly from Teams via /config
  • Use the team/channel allowlist to scope bot access precisely — prevents unwanted channel pollution
  • For large organizations, use groupAllowFrom with AAD object IDs for deterministic access control
  • Set historyLimit to control how many recent messages are included in the AI prompt context
  • Include supportsFiles: true in the bot manifest for file handling in personal scope

Known Issues & Gotchas

  • Multi-tenant bot creation was deprecated after 2025-07-31 — always use Single Tenant for new bots
  • The messaging endpoint must be publicly reachable — localhost won't work without a tunnel (ngrok, Tailscale Funnel)
  • RSC permissions only apply within the team/chat where the app is installed — they're not tenant-wide
  • Updating an installed Teams app requires incrementing the manifest version and re-uploading the ZIP
  • After updating the Teams app, fully quit and relaunch Teams to clear cached app metadata
  • bots[].botId AND webApplicationInfo.id in the manifest MUST match the Azure Bot App ID
  • allowFrom should use stable AAD object IDs, not UPNs or display names (which can change)
  • groupPolicy defaults to 'allowlist' — group chats are blocked until you explicitly configure groupAllowFrom or set groupPolicy to 'open'
  • File sending in DMs works natively, but group chat files require sharePointSiteId configuration
  • Env vars (MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID) only apply to the default account

Alternatives

  • Slack
  • Mattermost
  • Google Chat
  • Discord

Community Feedback

The Teams setup is no joke — Azure Bot Framework, app manifests, RSC permissions. But once you get through the gauntlet, having an AI assistant right in Teams where your team already works is incredibly powerful.

— HackerNoon

Tried connecting OpenClaw to Teams. The Azure Bot setup is rough compared to Telegram or Discord, but the Adaptive Cards and thread support make it worthwhile for enterprise use.

— Reddit r/MicrosoftTeams

The 'Abandon all hope' warning in the Teams docs is earned. But the step-by-step Azure Bot walkthrough they added recently makes it much more manageable. Graph API integration for files is a nice touch.

— GitHub Discussions

Frequently Asked Questions

Why is the Teams setup so complex?

Microsoft requires Azure Bot Framework registration, App Registration credentials, RSC permissions in a Teams app manifest, and a publicly reachable webhook endpoint. This is Microsoft's architecture, not OpenClaw's — the plugin abstracts as much as possible but can't eliminate Azure's requirements.

Do I need a paid Azure subscription?

No. The Azure Bot resource has a Free pricing tier that works for development and testing. Production deployments with high message volume may benefit from a paid tier, but most personal/small team use cases are fine on Free.

Can I use multi-tenant bots?

Microsoft deprecated creation of new multi-tenant bots after July 2025. Use Single Tenant for all new bot registrations. Existing multi-tenant bots continue to work but new ones cannot be created.

How do I send files in group chats?

File sending in group chats requires configuring sharePointSiteId in your OpenClaw config and granting Graph API permissions for SharePoint access. DM file sending works natively without additional configuration.

Is the Teams plugin bundled with OpenClaw?

No. As of 2026.1.15, Microsoft Teams was moved out of core into a separate plugin. Install it with: openclaw plugins install @openclaw/msteams.

How do I test locally without a public URL?

Use ngrok (ngrok http 3978) or Tailscale Funnel (tailscale funnel 3978) to create a tunnel. Set the resulting public URL as your Azure Bot messaging endpoint. You can also test basic webhook connectivity via Azure Web Chat before deploying to Teams.

Configuration Examples

Minimal DM-only setup

channels:
  msteams:
    enabled: true
    appId: "<APP_ID>"
    appPassword: "<APP_PASSWORD>"
    tenantId: "<TENANT_ID>"
    webhook:
      port: 3978
      path: "/api/messages"
    dmPolicy: pairing

Team channels with allowlist

channels:
  msteams:
    enabled: true
    appId: "<APP_ID>"
    appPassword: "<APP_PASSWORD>"
    tenantId: "<TENANT_ID>"
    webhook:
      port: 3978
      path: "/api/messages"
    groupPolicy: allowlist
    teams:
      "Engineering":
        channels:
          General:
            requireMention: true
          AI-Help:
            requireMention: false

Full-featured with SharePoint files

channels:
  msteams:
    enabled: true
    appId: "<APP_ID>"
    appPassword: "<APP_PASSWORD>"
    tenantId: "<TENANT_ID>"
    webhook:
      port: 3978
      path: "/api/messages"
    groupPolicy: open
    sharePointSiteId: "<SHAREPOINT_SITE_ID>"
    historyLimit: 50
    dmPolicy: allowlist
    allowFrom:
      - "<AAD_OBJECT_ID>"

Installation

openclaw plugins install @openclaw/msteams