> ## Documentation Index
> Fetch the complete documentation index at: https://docs.komaa.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Installation

> Install @komaa/openclaw-msteams-bridge into an OpenClaw host.

[`@komaa/openclaw-msteams-bridge`](https://www.npmjs.com/package/@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.

<Note>
  This adds **voice/video (CVI)** on top of OpenClaw's existing
  [Microsoft Teams chat channel](https://docs.openclaw.ai/channels/msteams) - run both for chat + calls.
</Note>

## Requirements

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

## Install

```bash theme={null}
openclaw plugins install npm:@komaa/openclaw-msteams-bridge
```

The package ships **prebuilt** (v0.1.10+): no build step, install and go.

<Note>
  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](https://github.com/komaa-com/openclaw-msteams-bridge#install).
</Note>

## Verify

Once installed, enable it in your config (`plugins.entries."msteams-voice".config.enabled: true`) and
start the gateway:

```bash theme={null}
openclaw gateway run
```

The plugin registers a host-managed service and binds its media WebSocket (default
`ws://<host>:9442/voice/msteams/stream`).

## Expose the WebSocket (Agent voice URL)

StandIn connects to your plugin **from the internet**, so port `9442` must be reachable - a public
host, or a tunnel. With Tailscale Funnel, put voice on the **8443** slot (this is what the installer
does, and it keeps the 443 slot free for the Teams **chat** webhook):

```bash theme={null}
tailscale funnel --bg --https=8443 9442
```

Your **Agent voice URL** is then:

```
wss://<machine>.<tailnet>.ts.net:8443/voice/msteams/stream
```

Register that URL (with a **matching `sharedSecret`**) in the
[StandIn sandbox](https://standin.komaa.com/sandbox) or on your identity in the
[dashboard](https://standin.komaa.com/dashboard), then place a Teams call to your bot. Include the
port - a bare host means the 443 slot, which is normally your chat webhook, not voice.

<Note>
  Funnel serves up to 3 external ports (443, 8443, 10000). The usual layout on one machine:
  **443 -> 3978** (Teams chat webhook), **8443 -> 9442** (OpenClaw voice). Running the **Hermes**
  plugin too? Put it on the remaining slot: `tailscale funnel --bg --https=10000 8443` →
  `wss://<machine>.<tailnet>.ts.net:10000/voice/msteams/stream`, and register each runtime as its own
  agent with its own secret.
</Note>

<Note>
  Next: the full [configuration reference](/openclaw/configuration) for realtime, streaming, outbound,
  and security keys.
</Note>

## Links

<CardGroup cols={3}>
  <Card title="Source" icon="github" href="https://github.com/komaa-com/openclaw-msteams-bridge" />

  <Card title="npm" icon="npm" href="https://www.npmjs.com/package/@komaa/openclaw-msteams-bridge" />

  <Card title="Configuration" icon="gear" href="/openclaw/configuration" />
</CardGroup>
