The example below contains no secrets - only placeholder GUIDs and product copy. Replace the
placeholders with your own values before you build and upload the package.
Download the example package
standin-teams-manifest.zip - manifest.json + placeholder icons + a README. Replace the
placeholder GUIDs and icons, then import it in the Developer Portal or upload it to Teams.Steps
Create an Azure Bot (Entra app)
In the Azure portal, create an Azure Bot resource. Note its Microsoft Entra application
(client) ID - this is your
botId. You’ll set its calling webhook + messaging endpoint to the
URLs from your StandIn dashboard.Open the Teams Developer Portal
Go to dev.teams.microsoft.com → Apps. Either Import
an app (upload a zip of the manifest below) or New app and paste the fields in the GUI. The
portal validates the manifest and manages versions for you.
Fill in the manifest
Use the example manifest and replace the placeholders -
chiefly the app
id, your botId, and validDomains (your StandIn host).Add icons
Provide a color icon (192×192 px) and an outline icon (32×32 px, transparent). In the
portal these upload under Branding; in a manual zip they’re
color.png and outline.png.Configure the bot endpoints
On the Azure Bot (same Entra app as
botId): set the Teams channel calling webhook and the
messaging endpoint to the URLs shown in your StandIn dashboard, and admin-consent the
Graph permissions.Publish or download
In the Developer Portal, Publish → Publish to your org (admin approves in Teams Admin Center),
or Download the app package and sideload it for testing.
Placeholders
The example uses obvious placeholders - do not publish with these values.| Field | Example value | Replace with |
|---|---|---|
id | 00000000-…-000000000000 | A new random GUID for the app package (unique per listing; not the bot ID). |
bots[].botId | 11111111-…-111111111111 | Your Entra application (client) ID (same as the Azure Bot’s MicrosoftAppId). |
webApplicationInfo.id | same as botId | Must equal botId for a standard single-app bot. |
validDomains | [] | Your StandIn host, e.g. ["standin.komaa.com"]. |
uuidgen (macOS/Linux), [guid]::NewGuid() (PowerShell), or
uuidgenerator.net.
Example manifest
manifest.json
supportsCalling: true (required for voice) and supportsVideo: true (required
for the CVI avatar tile). The resourceSpecific block is per-team consent (RSC) - granted when the
app is installed in a team; it does not replace the tenant-wide Graph permissions below.
Graph permissions
Set these as application permissions on the same Entra app asbotId, then admin-consent them
in your tenant (this matches the OpenClaw and
Hermes configuration pages):
| Permission | Purpose |
|---|---|
Calls.JoinGroupCall.All | answer / join Teams calls and meetings |
Calls.AccessMedia.All | real-time call audio/video media |
Calls.InitiateGroupCall.All | outbound “call me back” (skip if unused) |
Chat.Read.All | chat / thread context |
ChatMessage.Read.Chat | read messages in chats the bot is in |
Sites.ReadWrite.All | SharePoint / OneDrive file cards for meeting minutes (optional) |