Skip to content

Connecting to StandIn

StandIn is the hosted media bridge that joins the Microsoft Teams call and connects it to your agent. This page explains the connection model and the three tiers you can connect through.

Your plugin runs a WebSocket server inside the OpenClaw gateway. StandIn is the client: for each call it opens an authenticated WebSocket to your plugin and streams audio/video over it. You do not dial out and you never handle Teams media yourself.

Teams call <-> StandIn media bridge ==WebSocket (StandIn dials in)==> @komaa/openclaw-msteams-bridge

What you configure to make this work:

SettingWhy
bindAddressSet to 0.0.0.0 so the hosted bridge can reach the plugin. Default 127.0.0.1 is local-only.
portThe port the plugin listens on (default 9442). Make it reachable by StandIn.
pathThe WebSocket route (default /voice/msteams/stream).
sharedSecretThe HMAC secret. It must match the value StandIn uses, or the handshake is rejected.

Every connection is authenticated with a replay-proof HMAC handshake - see the Wire Protocol. This is the same regardless of which tier you use; only the identity and limits differ. For the bigger picture of what runs where, see Architecture.

Pick a tier by where you are in your journey. From the plugin’s side the mechanics are identical - you always get a shared secret and StandIn dials in.

  • What it is: a shared StandIn bot that joins a Teams meeting you generate. No Azure/Teams bot of your own required.
  • Limits: time-limited (about 5 minutes/day per session).
  • Use it for: your first call and quick experiments.
  • Start: standin.komaa.com/sandbox - it walks you through generating a meeting link and gives you the shared secret to paste into sharedSecret.
  • What it is: the developer tier. You bring your own Microsoft Teams bot (an Azure Bot) and pair it in the StandIn dashboard. Pairing issues the shared secret for that identity.
  • Limits: daily-capped (5 minutes/day), on its own slot.
  • Use it for: building and testing against a real inbound number/identity you control.
  • Start: standin.komaa.com - create an account and pair your bot.
  • What it is: your own Teams bot with no daily cap, managed in the StandIn dashboard.
  • Use it for: real, always-on deployments.
  • Start: standin.komaa.com.

When you move past the sandbox, you register your Teams bot with OpenClaw’s Teams chat channel and pair it with StandIn for voice. The Teams bot credentials are supplied to OpenClaw through the channel environment variables:

Env varMeaning
MSTEAMS_APP_IDYour Teams bot (Azure Bot) app id
MSTEAMS_APP_PASSWORDThe bot app secret
MSTEAMS_TENANT_IDYour Microsoft Entra (AAD) tenant id

Pairing in the StandIn dashboard links that bot identity to a shared secret; put the secret in sharedSecret. From then on, inbound calls to your bot are bridged to your plugin.

Inbound calls are gated by policy, and the gate is closed until you open it: with inboundPolicy unset (or disabled), every inbound call is rejected.

  • inboundPolicy: disabled | allowlist | pairing | open. Unset = deny all.
  • allowFrom: the allowed callers, matched by AAD object id (case-insensitive) or phone number (digits only).

The usual progression: open for your first sandbox call, then allowlist + allowFrom for everything after.

See the Configuration Reference for details.

When a tier limit is reached mid-call (sandbox time cap, free daily budget, or a paid max-minutes governor), StandIn sends an assistant.say message with a short goodbye line. The agent speaks it, then the call ends gracefully rather than cutting off abruptly.