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"

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>",
  },
}

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.

Your own cloud agent, set up for you.

Everpod runs OpenClaw on a private, always-on computer of its own: set up, secured and backed up, with model usage included. You name your agent, and say hello about fifteen minutes later.

Create your agent

First month half price, then $29/mo · model usage included · cancel anytime

Wondering what you’d do with one? See what a cloud agent can do