Auth model
Installed plugin + Bot Framework / Azure app credentials + tenant policy
Enterprise messaging with identity, policy, and app-registration gravity.
Microsoft Teams support for OpenClaw covers plugin-backed Azure Bot setup, Teams app manifest and RSC permissions, Graph-dependent media behavior, and tenant-scoped routing boundaries.
Auth model
Installed plugin + Bot Framework / Azure app credentials + tenant policy
Safety stance
Treat Azure registration, tenant policy, and Teams app visibility as one combined deployment problem.
Verification ritual
Verify tenant install, one direct chat, and one team/channel flow with the exact org policies you expect in production.
Rollout mode
45β90 min setup
Microsoft Teams plugin
Teams supports DMs, group chats, and channels, defaults groups to allowlist plus mention gating, and needs SharePoint plus Graph permissions for channel or group file sends.
Watch `/api/messages`
Teams failures often originate in tenant policy or app registration, not the bot code path you test last.
Microsoft Teams is the lane where operators most often confuse bot credentials with deployment readiness. The official plugin can work well, but only when you treat Azure Bot registration, Teams app packaging, tenant permissions, and OpenClaw policy as one coordinated rollout rather than one config block.
If those pieces feel scattered, keep /guides/control-ui-auth-and-pairing and /guides/openclaw-deployment-troubleshooting close at hand so token, manifest, and pairing conversations stay aligned.
Teams is worth the effort when the organization already lives inside Microsoft 365 and wants the assistant to meet users in the same place they already handle direct chats, team channels, and group chats.
The official status is intentionally specific:
sharePointSiteId plus Graph permissions,That means Teams is absolutely usable, but it should be run with a clear understanding of what comes from RSC permissions, what additionally needs Microsoft Graph, and what still depends on Teams client behavior.
A stable Teams rollout has three distinct systems:
dmPolicy, group allowlists, requireMention, and replyStyle decide how the lane behaves once messages arrive.Most Teams confusion comes from mixing those layers together. For example:
When you hit one of those scenarios, revisit /guides/openclaw-configuration for precedence guidance and /blog/openclaw-model-routing-and-cost-strategy for how routing, policy, and provider choices interact.
Start with a text-first baseline that proves the bot identity and one DM before you optimize anything else:
{
channels: {
msteams: {
enabled: true,
appId: '<APP_ID>',
appPassword: '<APP_PASSWORD>',
tenantId: '<TENANT_ID>',
webhook: { port: 3978, path: '/api/messages' },
dmPolicy: 'pairing',
groupPolicy: 'allowlist',
requireMention: true,
replyStyle: 'thread',
},
},
}
That baseline is intentionally conservative:
Also keep the first pass RSC-only unless you already know you need channel media, historical catch-up, or broader user lookup.
The official quick start is clear:
appId, appPassword, and tenantId,/api/messages,The docs also recommend Single Tenant for new bots and note that new multi-tenant bot creation was deprecated after July 31, 2025. That matters because Teams is not just a messaging connector here; it inherits tenant-level decisions from Azure.
Before touching the Teams app package, confirm two things:
For local development, the docs recommend a tunnel such as ngrok or Tailscale Funnel because Teams cannot call localhost directly.
Teams does not discover your bot automatically. You need a Teams app package whose manifest lines up with the Azure Bot registration.
The official must-have fields are worth following exactly:
bots[].botId must match the Azure Bot App ID,webApplicationInfo.id must also match that App ID,bots[].scopes must include the surfaces you plan to use: personal, team, groupChat,supportsFiles: true is required for personal scope file handling,manifest.json, outline.png, and color.png.If you do not want to hand-edit the manifest ZIP, the docs point to the Teams Developer Portal as a valid alternative workflow.
The official docs draw a useful line between Teams RSC only and Teams RSC + Microsoft Graph.
With RSC only, you get:
Without Graph, you do not get:
Add Graph only when the operator actually needs those capabilities. The docs specifically call out:
ChannelMessage.Read.All for channel attachments and history,Chat.Read.All or ChatMessage.Read.All for group chats,User.Read.All if you need to dynamically search and mention users outside the current conversation.Frame that permission and consent discussion with /guides/openclaw-cost-and-guardrails-checklist so finance and security stakeholders see the cost/performance trade-offs while the tenant admins review Graph grants.
That separation keeps the first rollout smaller and the permission conversation with tenant admins much easier.
Teams supports DMs, group chats, and channels, but the official docs consistently steer operators toward stable IDs.
For DMs:
channels.msteams.dmPolicy = "pairing",allowFrom should use stable AAD object IDs,dangerouslyAllowNameMatching.For groups and channels:
channels.msteams.groupPolicy = "allowlist",groupAllowFrom controls who may trigger in group chats and channels,teams and nested channels let you scope the exact places where the lane is allowed to operate.The docs allow names in some places and describe resolution behavior when Graph can help, but the operator-safe rule is the same as elsewhere: use names for setup convenience, use stable IDs for durable policy.
The official testing flow recommends Azure Web Chat as the first check. That is smart because it validates the webhook path before you debug Teams packaging.
A disciplined verification sequence looks like this:
replyStyle accordingly and retest.The docs also call out an easy ID mistake: the groupId query parameter in Teams URLs is not the team ID used for config. Team and channel IDs come from the URL path segment and should be URL-decoded there. If you wind up with ambiguous symptoms, /guides/openclaw-symptom-first-triage-card keeps the order of checks consistent while you decide whether this is Azure, Graph, mention, or routing noise.
Teams now has both classic Posts style and newer Threads style channels, but the API does not tell OpenClaw which UI style a channel uses. The plugin therefore exposes replyStyle and per-team/per-channel overrides.
That makes reply layout an operator decision, not something to leave to guesswork.
The docs distinguish live webhook handling from historical access. historyLimit and dmHistoryLimit shape prompt context, but true historical recovery and channel attachment downloads still require Graph permissions.
Proactive messages are only possible after a user has interacted, because the plugin stores conversation references at that point. That is a subtle but important operational boundary for alerting and follow-up workflows.
The docs describe private-channel support as limited. Real-time webhook behavior and bot accessibility may differ from standard channels, even when Graph history access is possible. Treat private channels as an exception case, not your first production validation target.
The official docs already tell you where the sharp edges are:
groupId instead of the URL path.These are not cosmetic issues. They are the normal interaction between Azure, Teams, Graph, and the gateway. When pairing or approvals get stuck, /troubleshooting/solutions/control-ui-pairing-required documents the Control UI cues that point you to the right workflow.
For most teams, the safest rollout looks like this:
dmPolicy: "pairing",groupPolicy: "allowlist",requireMention: true,This is the channel where operational patience saves the most time.
Teams is strongest when the assistant is meant to live inside an existing enterprise collaboration estate with tenant governance, admin consent, and formal app distribution.
The useful boundary is:
That makes Teams a powerful internal lane, but not a casual one. It should be treated like an application rollout with messaging behavior, not just like βanother bot token.β
Continue the Teams path by looping in /guides/openclaw-operability-and-observability for visibility requirements and /blog/openclaw-deployment-form-factors-comparison when you need to explain how this lane fits the broader self-hosted enterprise story.
After the first rollout, keep these references close:
/tools/plugin and /gateway/configuration/guides/openclaw-multi-agent-routingThere is no Teams-specific CoClaw troubleshooting note in src/content/troubleshooting/solutions yet, so keep the upstream verification sequence and manifest checklist in your operator runbook until a local note exists.
Verification & references
References