GuidesChannels

Connecting OpenClaw to Microsoft Teams, step by step

Teams ships bundled with OpenClaw, but the platform side runs through Microsoft's preview CLI, an Azure bot, and a tunnel. The working path, the single-tenant rule, and the file-sending catch.

August 10, 2026The Everpod team
The short answer

The Teams plugin ships bundled with OpenClaw: nothing to install on the agent side. The work is all on Microsoft’s side: an Azure bot registration created through Microsoft’s preview Teams CLI, a tunnel so Teams can reach your machine (“Teams cannot reach localhost”), and a single-tenant app (Microsoft deprecated new multi-tenant bots in mid-2025). Once wired, DMs work well including attachments; group channels come with real caveats around files and threading. Budget an evening, not five minutes.

The working path

Microsoft’s own CLI is the documented golden path (it’s in preview; flags can drift):

npm install -g @microsoft/teams.cli@preview
teams login
teams app create --name "OpenClaw" \
  --endpoint "https://<your-tunnel-url>/api/messages"
Copied

That one create command does the Azure heavy lifting (bot registration plus app registration) and hands back the three values OpenClaw needs: CLIENT_ID, CLIENT_SECRET, and TENANT_ID, plus a Teams App ID. Note the tenant rule: new bots are single-tenant (Microsoft closed multi-tenant bot creation after July 2025), which is fine for the run-it-for-your-own-org case this serves.

Teams delivers messages by calling your endpoint, so the gateway’s webhook (port 3978, /api/messages) needs a public HTTPS front: the docs offer devtunnel (persistent), ngrok, or Tailscale Funnel. Then the OpenClaw side is three keys:

channels: {
  msteams: {
    enabled: true,
    appId: "<CLIENT_ID>",
    appPassword: "<CLIENT_SECRET>",
    tenantId: "<TENANT_ID>",
  },
}
Copied

Install the app into Teams via teams app get <teamsAppId> --install-link, sanity-check with teams app doctor, restart the gateway, and message the bot. One ritual the docs are emphatic about: after any manifest change, reinstall the app and fully quit and relaunch Teams. The client caches aggressively.

Access control

Standard OpenClaw posture with Teams-flavored identifiers: DMs are pairing-gated by default; allowlists should use stable AAD object IDs rather than display names; and group/channel access is blocked by default (groupPolicy: "allowlist"), mention-gated even when opened up. Per-team and per-channel overrides exist, keyed by those long 19:…@thread.tacv2 IDs, which you pull from the Teams URL path, not the groupId query parameter.

The caveats that actually bite

Worth it?

Same verdict shape as Google Chat: if Teams is where your organization lives, this is the supported route and it works. For a personal agent’s first channel, the consumer apps are radically less ceremony. And the agent answering in Teams is only as available as the machine and tunnel underneath it, which is the part that has to stay up around the clock.

Give your AI agents a permanent cloud computer.

We set it up and secure it, so all you do is use them. Run Claude Code, Codex or any agent you use, more at once than your laptop can hold, and keep them working when it’s closed. Or have OpenClaw set up and run for you.

See the developer pod

From $24/mo · your own plan or API key

Get your OpenClaw agent

$29/mo, cancel anytime · model usage included