Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.
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.
Best when you want validation and versioning. Go to
dev.teams.microsoft.com → Apps → Import app and upload
the zip (or New app and paste the manifest fields in the GUI). The portal validates the
manifest, hosts the icons, and can then Preview in Microsoft Teams, Download the finished
package, or Publish → Publish to your org.Official reference: Microsoft Teams Developer Portal.
Best for making the bot callable by everyone in your tenant. Either publish from the
Developer Portal (Publish → Publish to your org) or have an admin upload the zip directly
in the Microsoft Teams admin center (Microsoft Teams apps → Manage apps → Upload new app). A Microsoft Teams admin
approves the pending app before it appears for users.Official reference: Publish a custom app to your organization.
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.
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.
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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"StandIn","description":"Put your AI agent into a Microsoft Teams call. One SDK in Python and TypeScript, framework plugins, and runnable examples.","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/komaa/dDa-H7ldVx0Vm3cx/logo/light.svg?fit=max\u0026auto=format\u0026n=dDa-H7ldVx0Vm3cx\u0026q=85\u0026s=329d65e363c2423533726331726d3c90","dark":"https://mintcdn.com/komaa/dDa-H7ldVx0Vm3cx/logo/dark.svg?fit=max\u0026auto=format\u0026n=dDa-H7ldVx0Vm3cx\u0026q=85\u0026s=6cc60417d5aeca269a970dae10057880"},"favicon":"https://mintcdn.com/komaa/XPHp_Vc2MiRO51D_/favicon.svg?fit=max\u0026auto=format\u0026n=XPHp_Vc2MiRO51D_\u0026q=85\u0026s=df38ab86788d11c4a8b1a7612f742628","navbar":{"links":[{"href":"https://teams.microsoft.com/l/app/efcbbdea-3d93-47f7-b106-f2c33126d0b5","label":"Add to Microsoft Teams"},{"href":"https://github.com/komaa-com/standin","label":"GitHub"}],"primary":{"type":"button","label":"Get started","href":"/quickstart"}},"footer":{"socials":{"github":"https://github.com/komaa-com/standin"}},"seo":{"metatags":{"og:type":"website","og:site_name":"StandIn","og:image":"https://www.komaa.com/opengraph-image","og:image:width":"1200","og:image:height":"630","twitter:card":"summary_large_image"},"indexing":"all"},"integrations":{"ga4":{"measurementId":"G-M02N9C42XH"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"komaa","hasAudioNarration":false,"actualSubdomain":"komaa","customDomains":["docs.komaa.com"],"gitSource":{"type":"github","owner":"komaa-com","repo":"standin","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"collectionId":"43555bfc-014e-4df1-aa3a-b6244ac710cf","liveDeploymentHistoryId":"6ab62459be3b606b97845c3d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ab62459be3b606b97845c3d"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ab62459be3b606b97845c3d","clientVersion":"0.0.3969","searchFilterCounts":[{"language":"default","tag":"Docs","count":53},{"language":"default","tag":"The SDK","count":36},{"language":"default","tag":"TypeScript SDK","count":27},{"language":"default","tag":"Python SDK","count":26},{"language":"default","tag":"Home","count":13},{"language":"default","tag":"Plugins","count":13},{"language":"default","tag":"Microsoft Teams setup","count":5},{"language":"default","tag":"Get started","count":4},{"language":"default","tag":"Concepts","count":3},{"language":"default","tag":"Dev tools","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"teams/publish","slug":"/teams/publish","pageMetadata":{"title":"Upload to Microsoft Teams and go live","sidebarTitle":"Upload and go live","description":"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.","keywords":["upload custom app Microsoft Teams","sideload Microsoft Teams app","publish Microsoft Teams app to org","Microsoft Teams admin center","Microsoft Teams Developer Portal import","test Microsoft Teams calling bot"],"href":"/teams/publish"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Frame,Heading,Note,OptimizedImage,Tab,Tabs}=_components;if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Part 3 of the `,_jsx(_components.a,{href:`/teams/overview`,children:`Microsoft Teams setup`}),`. You have the `,_jsx(_components.a,{href:`/teams/app-package`,children:`app package`}),` -\nnow put it in front of Microsoft Teams users. Pick the route that matches how widely the bot should be\navailable.`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-an-upload-route`,children:`Choose an upload route`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Microsoft Teams client (fastest)`,id:`microsoft-teams-client-fastest`,children:[_jsxs(_components.p,{children:[`Best for testing and personal use. In Microsoft Teams, go to `,_jsx(_components.strong,{children:`Apps → Manage your apps → Upload an app`}),`:`]}),_jsx(Frame,{caption:`Microsoft Teams: Apps > Manage your apps > Upload an app.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=3f6d15629a62821426320d36fb290eec`,alt:`Microsoft Teams Apps page with Manage your apps and the Upload an app button highlighted`,\"data-og-width\":`914`,width:`914`,\"data-og-height\":`719`,height:`719`,\"data-path\":`images/teams/teams-upload-an-app.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?w=280\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=0f6d7de3110e268462379571b8274ae5 280w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?w=560\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=23934095d3237eea6cc9bf901ae0ab3c 560w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?w=840\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=79a3d363d599a0942cd7913f466ad92a 840w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?w=1100\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=dd079629b72635508abeba1eebc3f459 1100w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?w=1650\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=130e23f74b27ddf446db1c97e07e8b61 1650w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?w=2500\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=0fcba902e7dc39d1a47162af57bd08b5 2500w`})}),_jsxs(_components.p,{children:[`Choose `,_jsx(_components.strong,{children:`Upload a custom app`}),` and select the zip. The bot is then available to `,_jsx(_components.strong,{children:`you`}),`; open\nit and call.`]}),_jsx(Frame,{caption:`Pick Upload a custom app for a package you built or downloaded from StandIn.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=899fa3fa8a6d71413bdd6b96434f7489`,alt:`Microsoft Teams Upload an app dialog with the Upload a custom app option highlighted`,\"data-og-width\":`500`,width:`500`,\"data-og-height\":`293`,height:`293`,\"data-path\":`images/teams/teams-upload-custom-app.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?w=280\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=8f208d131fa2107ad697e40d9270eecd 280w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?w=560\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=c0db4cbd3bdec0398d5fa53b3d1a5883 560w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?w=840\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=29d86c916202500582d30dd208e6b661 840w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?w=1100\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=55acbf95bc1454513631a8b447ad7b3d 1100w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?w=1650\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=b35c0e8bd0718cb05133be98b1bc5e9c 1650w, https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?w=2500\u0026fit=max\u0026auto=format\u0026n=pa0qxKzF_T-m0SMe\u0026q=85\u0026s=f6878efbee370de7e7946c39c36c0256 2500w`})}),_jsxs(_components.p,{children:[`This requires `,_jsx(_components.strong,{children:`custom app upload`}),` to be allowed for your account - if the button is missing,\nask your Microsoft Teams admin (policy reference:\n`,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/microsoftteams/teams-custom-app-policies-and-settings`,children:`Manage custom app policies and settings`}),`).`]}),_jsxs(_components.p,{children:[`Official walkthrough: `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload`,children:`Upload your app in Microsoft Teams`}),`.`]})]}),_jsxs(Tab,{title:`Developer Portal`,id:`developer-portal`,children:[_jsxs(_components.p,{children:[`Best when you want validation and versioning. Go to\n`,_jsx(_components.a,{href:`https://dev.teams.microsoft.com/`,children:`dev.teams.microsoft.com`}),` → `,_jsx(_components.strong,{children:`Apps → Import app`}),` and upload\nthe zip (or `,_jsx(_components.strong,{children:`New app`}),` and paste the manifest fields in the GUI). The portal validates the\nmanifest, hosts the icons, and can then `,_jsx(_components.strong,{children:`Preview in Microsoft Teams`}),`, `,_jsx(_components.strong,{children:`Download`}),` the finished\npackage, or `,_jsx(_components.strong,{children:`Publish → Publish to your org`}),`.`]}),_jsxs(_components.p,{children:[`Official reference: `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/teams-developer-portal`,children:`Microsoft Teams Developer Portal`}),`.`]})]}),_jsxs(Tab,{title:`Publish to your org`,id:`publish-to-your-org`,children:[_jsxs(_components.p,{children:[`Best for making the bot callable by `,_jsx(_components.strong,{children:`everyone in your tenant`}),`. Either publish from the\nDeveloper Portal (`,_jsx(_components.strong,{children:`Publish → Publish to your org`}),`) or have an admin upload the zip directly\nin the `,_jsx(_components.strong,{children:`Microsoft Teams admin center`}),` (`,_jsx(_components.strong,{children:`Microsoft Teams apps → Manage apps → Upload new app`}),`). A Microsoft Teams admin\napproves the pending app before it appears for users.`]}),_jsxs(_components.p,{children:[`Official reference: `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/microsoftteams/upload-custom-apps`,children:`Publish a custom app to your organization`}),`.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`register-your-agent-in-standin`,children:`Register your agent in StandIn`}),`\n`,_jsxs(_components.p,{children:[`In your StandIn dashboard, register your `,_jsx(_components.strong,{children:`Agent calling URL`}),`\n(`,_jsx(_components.code,{children:`wss://\u003cyour-public-host>/msteams/calling`}),`) and the matching HMAC `,_jsx(_components.code,{children:`secret`}),`. The\n`,_jsx(_components.a,{href:`/quickstart#3-register-the-agent-voice-url`,children:`quickstart`}),` covers both, and\n`,_jsx(_components.a,{href:`/expose`,children:`Expose your agent`}),` covers making that URL reachable.`]}),`\n`,_jsxs(_components.p,{children:[`On this SDK there is no chat URL to set: `,_jsx(_components.code,{children:`ChatChannel`}),` dials out to StandIn. The\noptional `,_jsx(_components.strong,{children:`Agent chat URL`}),` field applies only when you serve Microsoft Teams chat yourself.`]}),`\n`,_jsx(Heading,{level:`2`,id:`place-the-first-call`,children:`Place the first call`}),`\n`,_jsxs(_components.p,{children:[`Before you do, prove the agent side on its own. The SDK ships an install check that rings your\nhandler on loopback and reports whether audio came back, with no tunnel and no tenant involved, so a\nsilent first call does not leave you guessing which of the two halves is at fault: Checking the\ninstall (`,_jsx(_components.a,{href:`/python-sdk/checking-the-install`,children:`Python`}),`,\n`,_jsx(_components.a,{href:`/typescript-sdk/checking-the-install`,children:`TypeScript`}),`).`]}),`\n`,_jsxs(_components.p,{children:[`Then search for the app in Microsoft Teams (or open it under `,_jsx(_components.strong,{children:`Apps → Built for your org`}),` after an\norg publish) and `,_jsx(_components.strong,{children:`call the bot`}),`. StandIn answers, dials your worker, and your agent speaks.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`First chat message ignored?`}),` Using `,_jsx(_components.strong,{children:`OpenClaw`}),`, its chat channel drops direct messages from\nsenders you have not approved (`,_jsx(_components.code,{children:`dmPolicy: pairing`}),`, the default) - approve yourself with\n`,_jsx(_components.code,{children:`openclaw pairing approve msteams \u003cCODE>`}),`. Using `,_jsx(_components.strong,{children:`Hermes`}),`, an unknown sender gets a\n`,_jsx(_components.strong,{children:`pairing-code reply`}),` instead of an answer - approve it with `,_jsx(_components.code,{children:`hermes pairing approve teams \u003cCODE>`}),`\n(with `,_jsx(_components.code,{children:`TEAMS_ALLOWED_USERS`}),` set, unlisted senders are dropped silently instead). Details:\n`,_jsx(_components.a,{href:`/troubleshooting#the-bot-answers-calls-but-ignores-microsoft-teams-chat-dm-pairing`,children:`the bot ignores Microsoft Teams chat`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`if-something-does-not-work`,children:`If something does not work`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Bot never joins the call → check the `,_jsx(_components.strong,{children:`calling webhook`}),` on the\n`,_jsx(_components.a,{href:`/teams/azure-bot#6-enable-calling-and-set-the-webhook`,children:`Microsoft Teams channel`}),` and that\n`,_jsx(_components.a,{href:`/teams/azure-bot#8-grant-graph-permissions`,children:`Graph permissions`}),` are admin-consented.`]}),`\n`,_jsxs(_components.li,{children:[`Bot joins but stays silent → usually a `,_jsx(_components.code,{children:`secret`}),` mismatch or an unreachable Agent calling URL;\nsee `,_jsx(_components.a,{href:`/troubleshooting`,children:`Troubleshooting`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Upload rejected → re-check the `,_jsx(_components.a,{href:`/teams/app-package#packaging-it-manually`,children:`package layout`}),` (files\nat the zip root) and bump the manifest `,_jsx(_components.code,{children:`version`}),` on republish.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Upload to Microsoft Teams and go live","sidebarTitle":"Upload and go live","description":"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.","keywords":["upload custom app Microsoft Teams","sideload Microsoft Teams app","publish Microsoft Teams app to org","Microsoft Teams admin center","Microsoft Teams Developer Portal import","test Microsoft Teams calling bot"],"href":"/teams/publish"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Choose an upload route","slug":"choose-an-upload-route","depth":2,"children":[]},{"title":"Register your agent in StandIn","slug":"register-your-agent-in-standin","depth":2,"children":[]},{"title":"Place the first call","slug":"place-the-first-call","depth":2,"children":[]},{"title":"If something does not work","slug":"if-something-does-not-work","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/komaa/741972939358f3dc/cloudflare-analytics.js"],"subdomain":"komaa","siteName":"StandIn","title":"Upload to Microsoft Teams and go live - StandIn","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-13T14:20:27.315Z","originalFileLocation":"teams/publish.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.\">\u003cmeta data-mint-head name=\"application-name\" content=\"StandIn\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Upload to Microsoft Teams and go live - StandIn\">\u003cmeta data-mint-head property=\"og:description\" content=\"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"StandIn\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.komaa.com/teams/publish\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://www.komaa.com/opengraph-image\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Upload to Microsoft Teams and go live - StandIn\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://www.komaa.com/opengraph-image\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/komaa/bvvtRedFKOOzhFVz/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"StandIn\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.komaa.com/teams/publish\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/teams/publish.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.komaa.com/#organization\",\"name\":\"StandIn\",\"url\":\"https://docs.komaa.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/komaa/dDa-H7ldVx0Vm3cx/logo/light.svg?fit=max\u0026auto=format\u0026n=dDa-H7ldVx0Vm3cx\u0026q=85\u0026s=329d65e363c2423533726331726d3c90\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.komaa.com#website\",\"name\":\"StandIn\",\"url\":\"https://docs.komaa.com\",\"publisher\":{\"@id\":\"https://docs.komaa.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.komaa.com/teams/publish#webpage\",\"url\":\"https://docs.komaa.com/teams/publish\",\"name\":\"Upload to Microsoft Teams and go live\",\"description\":\"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.\",\"dateModified\":\"2026-09-13T14:20:27.315Z\",\"isPartOf\":{\"@id\":\"https://docs.komaa.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.komaa.com/teams/publish#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.komaa.com/teams/publish#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Microsoft Teams setup\",\"item\":\"https://docs.komaa.com/teams/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Upload to Microsoft Teams and go live\",\"item\":\"https://docs.komaa.com/teams/publish\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.komaa.com/teams/publish#article\",\"headline\":\"Upload to Microsoft Teams and go live\",\"name\":\"Upload to Microsoft Teams and go live\",\"description\":\"Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.\",\"url\":\"https://docs.komaa.com/teams/publish\",\"mainEntityOfPage\":{\"@id\":\"https://docs.komaa.com/teams/publish#webpage\"},\"image\":\"https://www.komaa.com/opengraph-image\",\"dateModified\":\"2026-09-13T14:20:27.315Z\",\"keywords\":\"upload custom app Microsoft Teams, sideload Microsoft Teams app, publish Microsoft Teams app to org, Microsoft Teams admin center, Microsoft Teams Developer Portal import, test Microsoft Teams calling bot\",\"publisher\":{\"@id\":\"https://docs.komaa.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.komaa.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"StandIn\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"StandIn","nav":{"global":null,"products":[{"product":"Home","icon":"house","groups":[{"group":"Welcome","icon":"hand-wave","pages":[{"title":"StandIn","href":""},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Microsoft Teams setup","icon":"microsoft","pages":[{"title":"Microsoft Teams setup overview","sidebarTitle":"Setup overview","href":"/teams/overview"},{"title":"Connection modes","href":"/teams/connection-modes"},{"title":"Create the Azure bot","sidebarTitle":"Create Azure bot","href":"/teams/azure-bot"},{"title":"Get the Microsoft Teams app package","sidebarTitle":"Get app package","description":"Download the generated Microsoft Teams app package (manifest zip) from StandIn, or build it yourself from the example manifest.","href":"/teams/app-package"},{"title":"Upload to Microsoft Teams and go live","sidebarTitle":"Upload and go live","href":"/teams/publish"}]},{"group":"Concepts","icon":"book","pages":[{"title":"Architecture","description":"What the StandIn service owns, what the SDK owns, and what your plugin owns: the handler seam, the session, the two lanes, and the wire facts.","href":"/concepts/architecture"},{"title":"Dialogue modes","href":"/concepts/modes"},{"title":"What the SDK gives you","sidebarTitle":"SDK capabilities","href":"/concepts/features"}]},{"group":"Dev tools","icon":"wrench","pages":[{"title":"Tiers and what each gives you","sidebarTitle":"Tiers","href":"/tiers"},{"title":"Expose your agent","href":"/expose"},{"title":"Troubleshooting","href":"/troubleshooting"}]}]},{"product":"Python SDK","icon":"python","description":"standin-sdk: answer Microsoft Teams calls from Python","pages":[{"title":"Python SDK","href":"/python-sdk/overview"}]},{"product":"TypeScript SDK","icon":"js","description":"@komaa/standin-sdk: answer Microsoft Teams calls from TypeScript","pages":[{"title":"TypeScript SDK","href":"/typescript-sdk/overview"}]}]},"title":"Upload to Microsoft Teams and go live - StandIn","buildId":"dpl_G8u2B2Ji9qJYF9umedjv293TxycS","deploymentId":"dpl_G8u2B2Ji9qJYF9umedjv293TxycS","dynamics":["07c022d89b","a74be98ba7","a9bb46feb3"],"chunks":["Frame-CKfAdMi0.js","DynamicMarkdown-DpsHMHVL.js","zoom-image-lightbox-Io6GMTYV.js","lightbox-handle-r17bVUz3.js","Markdown-DZ-stgDu.js","clsx-Dfme4k4V.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CPNs0ebX.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-3JVAA-i3.js"]}