Skip to main content
Part 1 of the Teams setup. At the end of this page you will have a bot identity (client ID + tenant ID + client secret) wired to StandIn’s endpoints, with the Graph permissions consented. All screenshots are from the Azure portal; the values shown are placeholders.

1. Register a Microsoft Entra app

In the Azure portal, search for App registrations:
Azure portal search bar with App registrations typed in and the App registrations service shown in the results

The portal search finds App registrations under Services.

Select New registration:
  • Name: anything you like (users never see it; the Teams app name comes from the manifest).
  • Supported account types: Single tenant only is the right choice for a bot that serves your own organization.
  • Redirect URI: leave empty.
Register an application form in the Azure portal with a name filled in and Single tenant only selected

App registrations > New registration: name it and keep Single tenant only.

Official reference: Register an application with the Microsoft identity platform.

2. Record the IDs

On the app’s Overview page, copy two values - you will need them repeatedly:
  • Application (client) ID - this is your botId (and the MicrosoftAppId of the Azure Bot).
  • Directory (tenant) ID - your tenant.
Entra app registration overview page highlighting the client ID and tenant ID fields

The Overview page shows the Application (client) ID and Directory (tenant) ID.

3. Create a client secret

Under Certificates & secrets, select New client secret and copy the secret Value immediately - it is shown only once. StandIn uses this credential (App ID + secret + tenant) to authenticate as your bot; you provide it during pairing or in the dashboard when registering the identity.
Treat the client secret like a password: store it in a secret manager, never commit it, and set a reminder before its expiry date - calls stop when it lapses.

4. Create the Azure Bot resource

Search the portal for Bot and open Bot Services:
Azure portal search bar with Bot typed in and the Bot Services service shown in the results

The portal search: Bot Services is where Azure Bot resources live.

Create an Azure Bot and fill in the basics:
  • Bot handle / subscription / resource group: your choice.
  • Data residency: Global is typical.
  • Pricing tier: the free F0 tier is fine (Standard channels like Teams are free).
  • Type of App: Single Tenant, matching the app registration.
Create an Azure Bot basics form in the Azure portal

Create an Azure Bot: pick a handle, subscription, and pricing tier.

Under Microsoft App ID, choose Use existing app registration and paste the App ID (client ID) and App tenant ID from step 2, then Review + create.
Create an Azure Bot form showing Use existing app registration selected with App ID and tenant ID fields

Creation type: Use existing app registration, with the client ID and tenant ID from step 2.

Once deployment finishes, the resource’s Overview shows the essentials - pricing tier, location, and (after step 7) the messaging endpoint:
Azure Bot resource overview page showing resource group, subscription, pricing tier, and messaging endpoint

The Azure Bot Overview page after creation.

Official reference: Create an Azure Bot resource.

5. Enable the Microsoft Teams channel

Open the new Azure Bot resource, go to Settings → Channels, and select Microsoft Teams. Accept the terms and apply; the channel appears under connected channels as Healthy.
Azure Bot Channels page showing the Microsoft Teams channel connected with a healthy status

Channels: Microsoft Teams connected and Healthy.

Opening the channel shows three tabs - Messaging, Calling, and Publish. Messaging is on by default (Microsoft Teams Commercial is right for most tenants); the next step configures Calling.
Microsoft Teams channel Messaging tab showing Microsoft Teams Commercial selected

The Teams channel opens on the Messaging tab.

6. Enable calling and set the webhook

Still in the Teams channel, open the Calling tab:
  1. Check Enable calling.
  2. Set Webhook (for calling) to the calling webhook URL from your StandIn dashboard (shown on your identity after you register it).
  3. Apply.
Microsoft Teams channel Calling tab with Enable calling checked and the webhook field highlighted

Calling tab: Enable calling, webhook from your StandIn dashboard.

Official references: Registering a calling bot (Microsoft Graph communications samples - covers this whole page end to end) and Register a calling bot for Teams.

7. Set the messaging endpoint (optional, for chat)

Voice works without this step. If you also want Teams chat, go to Settings → Configuration and set Messaging endpoint to the URL from your StandIn dashboard.
Azure Bot Configuration page with the messaging endpoint field highlighted

Configuration: the messaging endpoint powers Teams chat.

Chat only works after you also set your Agent chat URL in the StandIn dashboard - the https:// URL where your agent serves Bot Framework chat messages, e.g. https://<your-public-host>/api/messages (paste the bare host and StandIn appends /api/messages for you). Until then, chat messages get a “chat endpoint not configured” reply.On both OpenClaw and Hermes that public /api/messages must reach 127.0.0.1:3978, path /api/messages - your runtime’s own Teams channel, a different process and port from the voice plugin, which serves /msteams/calling on 9442 on both runtimes. See Expose your agent for the two mount commands.
Two different sets of endpoints, and mixing them up breaks the setup. The URLs on this page - the calling webhook in step 6 and the messaging endpoint in step 7 - are StandIn’s hosted addresses (https://<identity>.standin.komaa.com/api/calling and /api/messages), taken from your dashboard and pasted into Azure. The /msteams/calling and /api/messages paths you publish from your own machine are a separate layer, and they go in the StandIn dashboard, never in the Azure portal.

8. Grant Graph permissions

Back on the app registration (the same Entra app as botId): API permissions → Add a permission → Microsoft Graph → Application permissions, add the list below, then select Grant admin consent for your tenant (requires an admin).
Azure portal API permissions blade with Add a permission opening the Microsoft Graph API panel

API permissions > Add a permission > Microsoft Graph.

This is the canonical list - it applies to all six bridges and plugins:
PermissionPurpose
Calls.JoinGroupCall.Allanswer / join Teams calls and meetings
Calls.JoinGroupCallAsGuest.Alljoin meetings as a guest participant
Calls.AccessMedia.Allaccess real-time Teams call audio/video media
Calls.Initiate.Alloutbound 1:1 “call me back” (skip if unused)
Calls.InitiateGroupCall.Alloutbound group “call me back” (skip if unused)
Chat.Read.Allresolve chat / thread ids and read message context
ChatMessage.Read.Chatread messages in chats the bot is installed in
Sites.ReadWrite.Allupload files / minutes to SharePoint (OneDrive) for chat attachments (optional; not needed on Hermes - its minutes file card rides the Bot Framework attachment contract with bot credentials only)
After consent, every row shows a green Granted status:
API permissions page listing the Calls application permissions, each with a green Granted status

Configured permissions with admin consent granted for the calling permissions.

Official references: Registering a calling bot (lists the Calls.* permissions), Grant tenant-wide admin consent, and the cloud communications API overview.

Checkpoint

You should now have:
  • Client ID (botId), tenant ID, and a client secret
  • An Azure Bot with the Teams channel enabled
  • Calling enabled and the webhook pointed at StandIn
  • (Optional) Messaging endpoint set for chat
  • Graph permissions admin-consented
Next: Get the Teams app package.