Skip to main content
@komaa/openclaw-msteams-bridge is a self-contained Teams CVI plugin for OpenClaw. It depends only on the published openclaw plugin-sdk + api.runtime - no fork, no vendored runtime.
This adds voice/video (CVI) on top of OpenClaw’s existing Microsoft Teams chat channel - run both for chat + calls.

Requirements

  • An OpenClaw install - host 2026.6.9.
  • A StandIn subscription (standin.komaa.com, free package) - the hosted media bridge that joins the Teams call and connects to this plugin. See Architecture.
  • Realtime mode: a realtime voice provider + key. Streaming mode: your openclaw-configured STT / TTS / agent (no realtime key needed).

Install

The package ships prebuilt (v0.1.10+): no build step, install and go.
Also on ClawHub: openclaw plugins install clawhub:@komaa/openclaw-msteams-bridge - OpenClaw falls back to npm automatically if the ClawHub fetch fails. See the plugin README.

Verify

Once installed, enable it in your config (plugins.entries."msteams-call".config.enabled: true) and start the gateway:
The plugin registers a host-managed service and binds its media WebSocket (default ws://<host>:9442/msteams/calling).

Expose the WebSocket (Agent calling URL)

StandIn connects to your plugin from the internet, so port 9442 must be reachable - a public host, or a tunnel. With Tailscale Funnel, map the path onto your single public host rather than spending a whole external port on it (Funnel offers only three). The proxy target must repeat the path, or the request reaches your plugin stripped and 404s:
Your Agent calling URL is then, with no port to mistype:
Register that URL (with a matching sharedSecret) in the StandIn sandbox or on your identity in the dashboard, then place a Teams call to your bot. Prefer a dedicated port? tailscale funnel --bg --https=8443 9442 works too - this is what the one-line installer does - and the URL then carries the port: wss://<machine>.<tailnet>.ts.net:8443/msteams/calling.
Funnel serves up to 3 external ports (443, 8443, 10000), which is why path routing is the better default: every lane can share 443. Running the Hermes plugin on the same machine? Give it its own paths on the same host (/msteams/calling there points at Hermes’s own port) and register each runtime as its own agent with its own secret.
Next: the full configuration reference for realtime, streaming, outbound, and security keys.

Source

npm

Configuration