Building, integrating, or customizing apps and workflows within Microsoft Teams using developer tools and APIs
Hi @MK
Based on the current Teams/Bot Framework guidance, I would separate two concepts here:
- The Azure Bot / Bot Framework identity used for bot messaging
- The Microsoft Entra application used to obtain Microsoft Graph tokens
A bot configured as Single Tenant in Azure Bot Service can still be used in a Teams app distribution scenario, and Microsoft’s Teams Developer Portal documentation states that bots created in Developer Portal are single tenant by default. The same documentation also clarifies that multi-tenant bot configuration in Azure Bot Service is deprecated, but multi-tenant Microsoft Entra app registrations remain supported, and that these app registrations are separate from the bot tenant configuration in Azure Bot Service. It also explicitly states that a bot configured as single tenant in Azure Bot Service can use a multi-tenant application.
Reference: Manage your apps in Developer Portal
For the Bot Framework / proactive messaging side, the important configuration is that the bot requests the correct Bot Framework token using the tenant where the bot’s backing Microsoft Entra app is registered. Microsoft’s documentation notes that for single-tenant bots, the developer must include the tenant ID as part of the environment variables when requesting the access token.
Reference: Add authentication to your Teams bot
For the Microsoft Graph side, the deciding factor is not simply whether the Azure Bot itself is single tenant. Graph access depends on the Microsoft Entra application used as the OAuth client, the permissions configured on that app, and whether the user or admin in the customer tenant has consented to those permissions. Teams app permissions documentation states that Microsoft Graph API permissions are managed in Microsoft Entra ID, and that the user or administrator must grant the correct permissions through a consent process.
Reference: Permissions in Teams app
For the APIs mentioned:
- To list the Teams a signed-in user has joined, Microsoft Graph supports
GET`` ``/me/joinedTeamsorGET`` ``/users/{id`` ``|`` ``user-principal-name}/joinedTeams. The least privileged delegated permission listed isTeam.ReadBasic.All; application permissionTeam.ReadBasic.Allis also listed. - To list channels in a team, Microsoft Graph supports
GET`` ``/teams/{team-id}/channels. The least privileged delegated permission listed isChannel.ReadBasic.All; the documentation also notes that Teams members cannot see private or shared channels they are not members of in the response.
For an installation-time experience where an end user signs in and selects a Team/channel for notifications, a delegated Graph flow is usually the right model, because the result should reflect what that signed-in user is allowed to see. If the app needs tenant-wide discovery or app-only access, then application permissions and admin consent would be required.
Regarding your question about whether any application that shares the same MicrosoftAppTenantId as the published Teams app would work, sharing the same MicrosoftAppTenantId only indicates that the app registrations belong to the same home tenant. For Graph, the client application must still be the correct OAuth client, must request the required Graph permissions, and must have consent in the customer tenant. The token must be issued for the tenant/resource being accessed, and the Graph call must be made with a token that contains the appropriate delegated scopes or application roles.
Hope this helps clarify the separation between the Bot Framework identity and the Microsoft Graph OAuth client.
If the answer is helpful, please click "Yes" and kindly upvote it. If you have extra questions about this answer, please click "Comment".
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.