Skip to main content
There are two ways to connect an agent to Microsoft Teams. They differ in who owns the Teams bot, and that single difference decides how much Azure work you do. Both modes connect your own agent: StandIn is the bridge, never the brain. And both need the same one-time admin consent before calling works - chat works without it.

StandIn Managed Bot

StandIn publishes and operates one Teams bot; your Microsoft organization is routed to your agent by a connection you create in the StandIn portal.
  1. In Teams, add StandIn from the Store.
  2. Type signin to the bot and sign in with your StandIn account. That link is how StandIn learns which Microsoft organization to connect - you do not type a tenant id anywhere.
  3. In the StandIn portal, deploy an identity and choose Use the StandIn bot. Paste your agent’s address; the portal gives you back the secrets.
  4. A Microsoft 365 administrator approves calling once for the organization. Chat works before this; calling switches on when the approval lands.
You get one connection secret, covering both calls and chat - paste it once:
Advanced deployments can split the lanes with the per-lane overrides (calling_secret/messages_secret on Hermes) - when set, they win over secret. OpenClaw has no per-lane override: one secret covers both lanes. Prefer not to edit config by hand? Run the one-line installer with --connection managed and that secret: it writes both lanes, mounts /msteams/calling and /msteams/messages on your Tailscale Funnel, and prints the two URLs to paste into the connection - see Quickstart: StandIn Managed Bot.
One agent instance serves one connection. The secrets belong to a single Microsoft organization - run a second instance for a second organization, and never share a secret across tenants.

Bring your own Azure bot

You register a Microsoft Entra app, create an Azure Bot resource, and upload your own Teams app package. The bot carries your name and lives entirely in your tenant. Follow Azure bot setup and App package. This is the right choice when identity custody matters more than setup time, or when you need the bot to be visibly yours.

Endpoints

StandIn dials your agent, so the endpoint you save in the portal has to match the path your agent actually listens on. Give the portal a bare host and it fills in the default below; paste a full URL instead if your bridge serves something else. Calling is the same in both modes. Only chat differs, and that is the line people get wrong: A bring-your-own-bot identity therefore uses /api/messages, served by your runtime’s own Teams channel (OpenClaw’s msteams channel, the Hermes gateway’s Teams platform) rather than by the voice plugin. That is a different process from voice, which is why it has its own port. The portal suggests the right one of the two when you deploy the identity, so take the value it offers.

Expose your agent

The mount commands that publish these paths, what a healthy probe looks like on each lane, and the --http1.1 gotcha that makes a working voice mount look broken.