Skip to main content
Part 3 of the Microsoft Teams setup. You have the app package - now put it in front of Microsoft Teams users. Pick the route that matches how widely the bot should be available.

Choose an upload route

Best for testing and personal use. In Microsoft Teams, go to Apps → Manage your apps → Upload an app:
Microsoft Teams Apps page with Manage your apps and the Upload an app button highlighted

Microsoft Teams: Apps > Manage your apps > Upload an app.

Choose Upload a custom app and select the zip. The bot is then available to you; open it and call.
Microsoft Teams Upload an app dialog with the Upload a custom app option highlighted

Pick Upload a custom app for a package you built or downloaded from StandIn.

This requires custom app upload to be allowed for your account - if the button is missing, ask your Microsoft Teams admin (policy reference: Manage custom app policies and settings).Official walkthrough: Upload your app in Microsoft Teams.

Register your agent in StandIn

In your StandIn dashboard, register your Agent calling URL (wss://<your-public-host>/msteams/calling) and the matching HMAC secret. The quickstart covers both, and Expose your agent covers making that URL reachable. On this SDK there is no chat URL to set: ChatChannel dials out to StandIn. The optional Agent chat URL field applies only when you serve Microsoft Teams chat yourself.

Place the first call

Before you do, prove the agent side on its own. The SDK ships an install check that rings your handler on loopback and reports whether audio came back, with no tunnel and no tenant involved, so a silent first call does not leave you guessing which of the two halves is at fault: Checking the install (Python, TypeScript). Then search for the app in Microsoft Teams (or open it under Apps → Built for your org after an org publish) and call the bot. StandIn answers, dials your worker, and your agent speaks.
First chat message ignored? Using OpenClaw, its chat channel drops direct messages from senders you have not approved (dmPolicy: pairing, the default) - approve yourself with openclaw pairing approve msteams <CODE>. Using Hermes, an unknown sender gets a pairing-code reply instead of an answer - approve it with hermes pairing approve teams <CODE> (with TEAMS_ALLOWED_USERS set, unlisted senders are dropped silently instead). Details: the bot ignores Microsoft Teams chat.

If something does not work

  • Bot never joins the call → check the calling webhook on the Microsoft Teams channel and that Graph permissions are admin-consented.
  • Bot joins but stays silent → usually a secret mismatch or an unreachable Agent calling URL; see Troubleshooting.
  • Upload rejected → re-check the package layout (files at the zip root) and bump the manifest version on republish.