Teams MCP - Permissions
5 min read
All permissions are Delegated (not Application), meaning they act on behalf of the signed-in user and can only access data that user has access to.
Permission Summary
These are all the scopes a Teams MCP server requests. Only one of them, ChannelMessage.Read.All, needs admin consent.
Permission | Type | ID | Admin Consent | Used For |
|---|---|---|---|---|
| Delegated | No | Identify the signed-in user | |
| Delegated | No | Refresh tokens for long-lived sessions | |
| Delegated | No |
| |
| Delegated | No |
| |
| Delegated | No |
| |
| Delegated | No |
| |
| Delegated | No |
| |
| Delegated | No |
| |
| Delegated | Yes |
|
No calendar, meeting, transcript, or recording scope is requested. The server reads and sends chat and channel messages, and nothing else.
Deployments with transcript capture request more
Setting UNIQUE_INTEGRATION=enabled adds four calendar and meeting scopes on top of this set, two of which need admin consent. They are documented with the feature that uses them — see Recordings & Transcripts — Required Microsoft Graph permissions.
Deployment Modes and Scope Sets
The requested scopes are composed from two independent capability toggles:
CHAT_INTEGRATION(defaultenabled) — the Teams chat/channel messaging tools.UNIQUE_INTEGRATION(defaultdisabled) — meeting transcript/recording capture into the Unique knowledge base.
The scopes fall into three groups:
Identity (always requested, regardless of toggles):
openid,profile,email,offline_access,User.Read.Messaging (requested only when
CHAT_INTEGRATION=enabled):ChannelMessage.Send,ChatMessage.Send,Chat.ReadBasic,Chat.Read,Team.ReadBasic.All,Channel.ReadBasic.All,ChannelMessage.Read.All.Knowledge base (requested only when
UNIQUE_INTEGRATION=enabled):Calendars.Read,OnlineMeetings.Read,OnlineMeetingRecording.Read.All,OnlineMeetingTranscript.Read.All.
Mode |
|
| Scopes requested |
|---|---|---|---|
Full |
|
| identity + messaging + knowledge base |
Chat-only |
|
| identity + messaging |
Ingestion-only |
|
| identity + knowledge base (no messaging scopes) |
Both off |
|
| — (server fails fast at startup) |
Ingestion-only least-privilege scope set
An ingestion-only deployment (UNIQUE_INTEGRATION=enabled, CHAT_INTEGRATION=disabled) requests only the identity scopes plus Calendars.Read, OnlineMeetings.Read, OnlineMeetingRecording.Read.All, and OnlineMeetingTranscript.Read.All. It requests none of the messaging scopes, so the app cannot read or send any chat or channel message. This is the least-privilege app registration for transcript capture.
Understanding Consent Requirements
This is standard Microsoft behavior, not Teams MCP specific. All Microsoft 365 apps use the same consent model.
Standard Microsoft Consent Process
Admin adds the app and grants admin-required permissions
Organization-wide OR per-user
ChannelMessage.Read.Alldoes require admin consent (required forget_channel_messagesto read channel message content). It is the only one in the set above that does.Every other permission can be approved by individual users:
User.Read,offline_access,Chat.ReadBasic,Chat.Read,ChatMessage.Send,Team.ReadBasic.All,Channel.ReadBasic.All,ChannelMessage.Send.
Admin approval workflow (if tenant has it enabled)
Users request admin approval
Admin approves app for that user
This is in addition to Step 1
User consent (always required for delegated permissions)
Each user must consent individually
Required even after admin consent (Microsoft's requirement for delegated permissions)
Microsoft Documentation:
User and admin consent overview - Standard Microsoft consent flows
Grant admin consent - Step-by-step guide
Admin consent workflow - Per-user approval process
Least-Privilege Justification
Each permission is the minimum required for its function. No narrower alternatives exist.
User.Read
Aspect | Detail |
|---|---|
Purpose | Retrieve the signed-in user's profile (ID, email, display name) |
Used For | Identifying the user when storing tokens |
Why Not Less | This is the minimum permission to read any user data |
Why Not | That permission reads other users; we only need the signed-in user |
offline_access
Aspect | Detail |
|---|---|
Purpose | Obtain refresh tokens for long-lived sessions |
Used For | Refreshing expired access tokens without user re-authentication |
Why Required | Without this, users would need to re-authenticate every ~1 hour when access tokens expire |
ChannelMessage.Send
Aspect | Detail |
|---|---|
Purpose | Send messages to Microsoft Teams channels |
Used For |
|
Why Not Less | No narrower permission exists for sending channel messages |
Why Not | We only send messages, not read or modify them |
ChatMessage.Send
Aspect | Detail |
|---|---|
Purpose | Send messages to Microsoft Teams chats |
Used For |
|
Why Not Less | No narrower permission exists for sending chat messages |
Why Not | We only send messages, not read full chat content via this permission |
Chat.ReadBasic
Aspect | Detail |
|---|---|
Purpose | List the user's chats with basic metadata (topic, members, chat type) |
Used For |
|
Why Not Less | No narrower permission exists for listing chats |
Why Not |
|
Chat.Read
Aspect | Detail |
|---|---|
Purpose | Read full message content from Teams chats |
Used For |
|
Why Not Less |
|
Why Not | We do not modify or delete chat messages |
Team.ReadBasic.All
Aspect | Detail |
|---|---|
Purpose | List all Teams the user is a member of |
Used For |
|
Why Not Less | No narrower permission exists for listing joined teams |
Why Not |
|
Channel.ReadBasic.All
Aspect | Detail |
|---|---|
Purpose | List channels in a Team |
Used For |
|
Why Not Less | No narrower permission exists for listing channels |
Why Not |
|
ChannelMessage.Read.All
Aspect | Detail |
|---|---|
Purpose | Read message content from Teams channels |
Used For |
|
Why Not Less |
|
Why Not | We do not modify or delete channel messages |
Admin Consent | Required because channel messages may contain sensitive organisational content |
Why Delegated (Not Application) Permissions
Factor | Delegated | Application |
|---|---|---|
User involvement | User signs in and consents | No user; admin pre-configures |
Data access scope | Only the signed-in user's data | All users' data in tenant |
Setup requirement | None (self-service) | Admin creates Access Policies |
Least privilege | Yes - user controls their own data | No - broad tenant access |
The MCP model requires self-service user connections where each user:
Connects their own account
Controls what data they share
Can disconnect at any time
Application permissions would require tenant administrators to pre-configure access for each user, defeating the self-service model.
Permission Reference Links
Microsoft Graph Permissions Reference - Official Microsoft documentation
ChannelMessage.Read.All - Third-party permission explorer
Chat.Read - Third-party permission explorer
Microsoft Graph API - Graph API overview
Related Documentation
Architecture - System components and infrastructure
Security - Encryption, PKCE, and threat model
Flows - User connection, OAuth, token refresh, and chat tool sequences
Recordings & Transcripts - Technical Manual - The four additional calendar and meeting scopes, and where they are used