plugins.entries."msteams-voice".config in your OpenClaw config.
sharedSecret must match the secret you set in StandIn for the hosted bridge that connects to
this plugin’s media WebSocket.
Mode selection
Setmode to "realtime" or "streaming". If omitted, the runtime auto-selects realtime when a
realtime provider resolves, else streaming. Both modes honor the inbound allowlist, outbound
call-backs, recording gate, and sessionScope agent memory. See Modes.
stt.provider / stt.providers if set, else your
openclaw-configured transcription provider; if none resolves it falls back to VAD-segmented file
transcription. The realtime.* block is ignored except the echo-guard knobs
(suppressInputDuringPlayback, echoSuppressionWindowMs, echoBargeInRms), which apply in both modes.
Outbound call-backs (optional, either mode)
placeCall(userObjectId, { message, mode }) is implemented on the runtime (no-answer / declined →
voicemail / no-answer); the outbound block enables it.
workerBaseUrl is StandIn’s outbound API URL from your dashboard - not a server you host.Key reference
| Key | Applies | Meaning |
|---|---|---|
enabled | both | master on/off |
mode | both | "realtime" | "streaming" (auto if omitted) |
port / bindAddress / path | both | media WebSocket server the StandIn bridge connects to |
sharedSecret | both | HMAC secret - must match the secret set in StandIn (secret input) |
requireRecordingStatus | both | only engage once Teams reports recording active |
inboundPolicy | both | disabled | allowlist | pairing | open - enforced on inbound |
allowFrom | both | allowlisted caller ids (Teams aadId or phone digits) |
inboundGreeting | both | opening line |
sessionScope | both | per-phone | per-call | per-thread agent-memory scope |
maxConcurrentCalls / maxDurationSeconds / staleCallReaperSeconds | both | capacity + reaper |
groupCall.{requireAddress,wakePhrases,followUpWindowMs} | both | speak-only-when-addressed gating |
maxVisionPerMinute | both | vision spend cap |
meetingRecap / bilingual | both | post-call minutes / Arabic-English |
realtime.{provider,providers,instructions,toolPolicy,…} | realtime (echo knobs: both) | realtime voice provider + behavior; provider key is a secret input |
stt.{provider,providers} | streaming | live transcription provider (else openclaw STT / file fallback); provider key is a secret input |
outbound.{enabled,workerBaseUrl,tenantId,answerTimeoutMs,defaultMode} | both | outbound call-backs / voicemail |
Microsoft Graph permissions
You bring your own Teams bot: register an Azure AD app + Azure Bot resource in your tenant, admin-consent the application permissions below, and point its calling webhook at StandIn (the URL is shown in your StandIn dashboard).| Permission | Enables |
|---|---|
Calls.JoinGroupCall.All | answer / join Teams calls and meetings |
Calls.AccessMedia.All | access real-time Teams call audio/video media |
Chat.Read.All | resolve chat / thread ids and read message context |
ChatMessage.Read.Chat | read messages in chats the bot is installed in |
Sites.ReadWrite.All | upload files / minutes to SharePoint (OneDrive) for chat attachments |
Calls.InitiateGroupCall.All | outbound “call me back” (skip if unused) |