Connects Claude directly to Microsoft Teams via the Graph API, exposing 11 tools for reading and sending messages, listing teams and channels, searching chat history, and managing both channel threads and direct messages. Built for multi-tenant use with OAuth, so any M365 user can sign in with their work account and immediately get their own Teams data without Azure setup. Runs as stdio for Claude Desktop/Code with local token caching, or as HTTP with SSE for remote deployments. If you're building workflows that need Claude to monitor team channels, respond in threads, or search across your organization's Teams conversations, this is the bridge.
Public tool metadata for what this MCP can expose to an agent.
MICROSOFT_TEAMS_ADD_MEMBER_TO_TEAMTool to add a user to a Microsoft Teams team. Use when granting or updating membership for a user.3 paramsTool to add a user to a Microsoft Teams team. Use when granting or updating membership for a user.
rolesarrayteam_idstringuser_idstringMICROSOFT_TEAMS_ARCHIVE_TEAMTool to archive a Microsoft Teams team. Use after confirming the team ID; returns 202 if accepted.2 paramsTool to archive a Microsoft Teams team. Use after confirming the team ID; returns 202 if accepted.
team_idstringshould_set_spo_site_read_only_for_membersbooleanMICROSOFT_TEAMS_CHATS_GET_ALL_CHATSRetrieves all Microsoft Teams chats a specified user is part of, supporting filtering, property selection, and pagination.4 paramsRetrieves all Microsoft Teams chats a specified user is part of, supporting filtering, property selection, and pagination.
topintegerfilterstringselectarrayuser_idstringMICROSOFT_TEAMS_CHATS_GET_ALL_MESSAGESRetrieves all messages from a specified Microsoft Teams chat using the Microsoft Graph API, automatically handling pagination; ensure `chat_id` is valid and OData expressions in `filter` or `select` are correct.3 paramsRetrieves all messages from a specified Microsoft Teams chat using the Microsoft Graph API, automatically handling pagination; ensure `chat_id` is valid and OData expressions in `filter` or `select` are correct.
topintegerfilterstringchat_idstringMICROSOFT_TEAMS_CREATE_MEETINGUse to schedule a new standalone Microsoft Teams online meeting, i.e., one not linked to any calendar event.5 paramsUse to schedule a new standalone Microsoft Teams online meeting, i.e., one not linked to any calendar event.
subjectstringparticipantsarrayend_date_timestringstart_date_timestringis_passcode_requiredbooleanMICROSOFT_TEAMS_CREATE_TEAMTool to create a new Microsoft Teams team. Use when you need to provision a team with optional template, channels, and members.6 paramsTool to create a new Microsoft Teams team. Use when you need to provision a team with optional template, channels, and members.
membersarrayvisibilitystringprivate · publicdefault: publicdescriptionstringdisplayNamestringfirstChannelNamestringtemplate_odata_bindstringMICROSOFT_TEAMS_DELETE_TEAMTool to delete a Microsoft Teams team. Use after confirming the target team ID.1 paramsTool to delete a Microsoft Teams team. Use after confirming the target team ID.
team_idstringMICROSOFT_TEAMS_GET_CHANNELTool to get a specific channel in a team. Use after obtaining valid team and channel IDs to fetch channel details.2 paramsTool to get a specific channel in a team. Use after obtaining valid team and channel IDs to fetch channel details.
team_idstringchannel_idstringMICROSOFT_TEAMS_GET_CHAT_MESSAGETool to get a specific chat message. Use after confirming chat_id and message_id.2 paramsTool to get a specific chat message. Use after confirming chat_id and message_id.
chat_idstringmessage_idstringMICROSOFT_TEAMS_GET_TEAMTool to get a specific team. Use when full details of one team by ID are needed.1 paramsTool to get a specific team. Use when full details of one team by ID are needed.
team_idstringMICROSOFT_TEAMS_LIST_MESSAGE_REPLIESTool to list replies to a channel message. Use after obtaining team, channel, and message IDs.4 paramsTool to list replies to a channel message. Use after obtaining team, channel, and message IDs.
topintegerteam_idstringchannel_idstringmessage_idstringMICROSOFT_TEAMS_LIST_TEAM_MEMBERSTool to list members of a Microsoft Teams team. Use when you need to retrieve the members of a specific team, for auditing or notifications.2 paramsTool to list members of a Microsoft Teams team. Use when you need to retrieve the members of a specific team, for auditing or notifications.
topintegerteam_idstringMICROSOFT_TEAMS_LIST_TEAMS_TEMPLATESTool to list available Microsoft Teams templates. Use when retrieving templates for team creation or customization workflows.6 paramsTool to list available Microsoft Teams templates. Use when retrieving templates for team creation or customization workflows.
topintegerskipintegercountbooleanfilterstringselectstringorderbystringMICROSOFT_TEAMS_LIST_USERSTool to list all users in the organization. Use when you need to retrieve directory users with filtering, pagination, and field selection.7 paramsTool to list all users in the organization. Use when you need to retrieve directory users with filtering, pagination, and field selection.
$topinteger$skipinteger$expandstring$filterstring$selectstring$orderbystringconsistencyLevelstringMICROSOFT_TEAMS_SEARCH_FILESSearch files in Microsoft Teams using KQL syntax. Find files by name, type, content, author, and modification date across all Teams and channels. Supports boolean logic and date ranges. Examples: 'filetype:pdf AND lastmodifiedtime>=2024-10-01', 'contract AND budget', 'filename...4 paramsSearch files in Microsoft Teams using KQL syntax. Find files by name, type, content, author, and modification date across all Teams and channels. Supports boolean logic and date ranges. Examples: 'filetype:pdf AND lastmodifiedtime>=2024-10-01', 'contract AND budget', 'filename...
sizeintegerquerystringfrom_indexintegerenable_top_resultsbooleanMICROSOFT_TEAMS_SEARCH_MESSAGESSearch Microsoft Teams messages using powerful KQL syntax. Supports sender (from:), date filters (sent:), attachments, and boolean logic. Works across all Teams chats and channels the user has access to. Examples: 'from:user@example.com AND sent>=2024-10-01', 'punchlist OR ter...4 paramsSearch Microsoft Teams messages using powerful KQL syntax. Supports sender (from:), date filters (sent:), attachments, and boolean logic. Works across all Teams chats and channels the user has access to. Examples: 'from:user@example.com AND sent>=2024-10-01', 'punchlist OR ter...
sizeintegerquerystringfrom_indexintegerenable_top_resultsbooleanMICROSOFT_TEAMS_TEAMS_CREATE_CHANNELCreates a new 'standard', 'private', or 'shared' channel within a specified Microsoft Teams team.4 paramsCreates a new 'standard', 'private', or 'shared' channel within a specified Microsoft Teams team.
namestringteam_idstringdescriptionstringmembership_typestringMICROSOFT_TEAMS_TEAMS_CREATE_CHATCreates a new chat; if a 'oneOnOne' chat with the specified members already exists, its details are returned, while 'group' chats are always newly created.3 paramsCreates a new chat; if a 'oneOnOne' chat with the specified members already exists, its details are returned, while 'group' chats are always newly created.
topicstringmembersarraychatTypestringMICROSOFT_TEAMS_TEAMS_GET_MESSAGERetrieves a specific message from a Microsoft Teams channel using its Team, Channel, and Message IDs.3 paramsRetrieves a specific message from a Microsoft Teams channel using its Team, Channel, and Message IDs.
team_idstringchannel_idstringmessage_idstringMICROSOFT_TEAMS_TEAMS_LISTRetrieves Microsoft Teams accessible by the authenticated user, allowing filtering, property selection, and pagination.3 paramsRetrieves Microsoft Teams accessible by the authenticated user, allowing filtering, property selection, and pagination.
topintegerfilterstringselectstringMICROSOFT_TEAMS_TEAMS_LIST_CHANNELSRetrieves channels for a specified Microsoft Teams team ID (must be valid and for an existing team), with options to include shared channels, filter results, and select properties.4 paramsRetrieves channels for a specified Microsoft Teams team ID (must be valid and for an existing team), with options to include shared channels, filter results, and select properties.
filterstringselectstringteam_idstringinclude_shared_channelsbooleanMICROSOFT_TEAMS_TEAMS_LIST_CHAT_MESSAGESRetrieves messages (newest first) from an existing and accessible Microsoft Teams one-on-one chat, group chat, or channel thread, specified by `chat_id`.2 paramsRetrieves messages (newest first) from an existing and accessible Microsoft Teams one-on-one chat, group chat, or channel thread, specified by `chat_id`.
topintegerchat_idstringMICROSOFT_TEAMS_TEAMS_LIST_PEOPLERetrieves a list of people relevant to a specified user from Microsoft Graph, noting the `search` parameter is only effective if `user_id` is 'me'.7 paramsRetrieves a list of people relevant to a specified user from Microsoft Graph, noting the `search` parameter is only effective if `user_id` is 'me'.
topintegerskipintegerfilterstringsearchstringselectstringorderbystringuser_idstringMICROSOFT_TEAMS_TEAMS_POST_CHANNEL_MESSAGEPosts a new text or HTML message to a specified channel in a Microsoft Teams team.4 paramsPosts a new text or HTML message to a specified channel in a Microsoft Teams team.
contentstringteam_idstringchannel_idstringcontent_typestringMICROSOFT_TEAMS_TEAMS_POST_CHAT_MESSAGESends a non-empty message (text or HTML) to a specified, existing Microsoft Teams chat; content must be valid HTML if `content_type` is 'html'.3 paramsSends a non-empty message (text or HTML) to a specified, existing Microsoft Teams chat; content must be valid HTML if `content_type` is 'html'.
chat_idstringcontentstringcontent_typestringMICROSOFT_TEAMS_TEAMS_POST_MESSAGE_REPLYSends a reply to an existing message, identified by `message_id`, within a specific `channel_id` of a given `team_id` in Microsoft Teams.5 paramsSends a reply to an existing message, identified by `message_id`, within a specific `channel_id` of a given `team_id` in Microsoft Teams.
contentstringteam_idstringchannel_idstringmessage_idstringcontent_typestringMICROSOFT_TEAMS_UNARCHIVE_TEAMTool to unarchive a Microsoft Teams team. Use when you need to restore an archived team to active state.1 paramsTool to unarchive a Microsoft Teams team. Use when you need to restore an archived team to active state.
team_idstringMICROSOFT_TEAMS_UPDATE_CHANNEL_MESSAGETool to update a message in a channel. Use when you need to modify an existing channel message after confirming channel and message IDs.5 paramsTool to update a message in a channel. Use when you need to modify an existing channel message after confirming channel and message IDs.
contentstringteam_idstringchannel_idstringmessage_idstringcontent_typestringMICROSOFT_TEAMS_UPDATE_CHAT_MESSAGETool to update a specific message in a chat. Use when you need to correct or modify a sent chat message.4 paramsTool to update a specific message in a chat. Use when you need to correct or modify a sent chat message.
chat_idstringcontentstringmessage_idstringcontent_typestringMICROSOFT_TEAMS_UPDATE_TEAMTool to update the properties of a team. Use when you need to modify team settings such as member, messaging, or fun settings.4 paramsTool to update the properties of a team. Use when you need to modify team settings such as member, messaging, or fun settings.
team_idstringfunSettingsobjectmemberSettingsobjectmessagingSettingsobjectThe first open-source Microsoft Teams connector for Claude. Any Microsoft 365 user can connect — just sign in with your work account. No setup, no credentials, no self-hosting required.
Read messages, list channels, search across Teams, send messages — all from Claude Code, Claude Desktop, or Claude Cowork.
Built by SurgeEnterpriseAI.
┌─────────────┐ Click "Connect" ┌──────────────────────┐
│ Claude User │ ──────────────────────► │ Teams MCP Server │
│ (Cowork/ │ │ (hosted by Surge) │
│ Desktop/ │ SSE/MCP Protocol │ │
│ Code) │ ◄─────────────────────► │ ┌────────────────┐ │
└─────────────┘ │ │ OAuth (common) │ │
│ │ Any M365 user │ │
User signs in with their │ │ can sign in │ │
own Microsoft account │ └───────┬────────┘ │
─────────────────────► │ │ │
│ ┌───────▼────────┐ │
│ │ Microsoft │ │
│ │ Graph API │ │
│ └────────────────┘ │
└──────────────────────┘
The user connects their own Microsoft 365 account. They see their own teams, their own channels, their own messages. Each user's tokens are isolated. The server is the bridge — it never stores messages, just passes them through.
/connect, sign in with Microsoft, doneIf someone is already hosting this server (e.g., on https://teams-mcp.surgeai.com):
No API keys, no Azure portal, no setup.
git clone https://github.com/SurgeEnterpriseAI/teams-mcp-server.git
cd teams-mcp-server
npm install
npm run build
Teams MCP Serverhttps://your-server.com/auth/callbackConfigure:
ChannelMessage.Read.All, ChannelMessage.SendChat.Read, Chat.ReadWrite, ChatMessage.SendTeam.ReadBasic.All, Channel.ReadBasic.AllUser.Readcp .env.example .env
# Set TEAMS_CLIENT_ID, TEAMS_CLIENT_SECRET
# Set BASE_URL and REDIRECT_URI to your production URL
# TEAMS_AUTHORITY=common (multi-tenant, default)
Deploy to Railway, Render, Azure App Service, or any Node.js host:
# Railway
railway login && railway init && railway up
# Or Azure
az webapp up --name teams-mcp-server --runtime "NODE:20-lts"
# Or just run directly
TRANSPORT_MODE=http node dist/index.js
Once deployed and tested, submit your server URL to Anthropic's MCP connector registry. Users will then see "Microsoft Teams" as a connect option in Claude Cowork — just like Slack and Gmail.
Add to your .mcp.json:
{
"mcpServers": {
"teams": {
"command": "node",
"args": ["/path/to/teams-mcp-server/dist/index.js"],
"cwd": "/path/to/teams-mcp-server"
}
}
}
First run will open your browser for Microsoft login. After that, tokens are cached.
| Tool | What it does |
|---|---|
teams_list_teams | List all your Teams |
teams_list_channels | List channels in a team |
teams_read_channel_messages | Read recent channel messages |
teams_send_channel_message | Send a message to a channel |
teams_reply_to_message | Reply in a channel thread |
teams_read_message_replies | Read thread replies |
teams_list_chats | List your DMs and group chats |
teams_read_chat_messages | Read messages from a chat |
teams_send_chat_message | Send a direct/group chat message |
teams_search_messages | Search messages across all Teams |
teams_get_profile | Get your Microsoft 365 profile |
src/
├── index.ts Main entry (auto-detects transport)
├── config.ts Central configuration
├── logger.ts Structured logging
├── types.ts TypeScript interfaces
├── sessions.ts Multi-user session manager
├── auth/
│ ├── oauth.ts MSAL OAuth (multi-tenant, per-user)
│ └── token-store.ts Persistent token cache
├── graph/
│ ├── client.ts Graph HTTP client with retries
│ ├── teams.ts Teams & channels API
│ ├── messages.ts Channel messages API
│ ├── chats.ts DM & group chat API
│ └── search.ts Search & profile API
├── mcp/
│ ├── server.ts MCP server factory
│ └── tools/ 11 tool definitions
├── transport/
│ ├── stdio.ts STDIO (Claude Code)
│ └── http.ts Express + SSE (Cowork / remote)
| Variable | Required | Default | Description |
|---|---|---|---|
TEAMS_CLIENT_ID | Yes | — | Azure AD app client ID |
TEAMS_CLIENT_SECRET | Yes | — | Azure AD client secret |
TEAMS_AUTHORITY | No | common | common for multi-tenant, or a specific tenant ID |
TRANSPORT_MODE | No | auto | auto, stdio, or http |
PORT | No | 3000 | HTTP server port |
BASE_URL | No | http://localhost:3000 | Public URL |
REDIRECT_URI | No | {BASE_URL}/auth/callback | OAuth callback URL |
TOKEN_STORE_PATH | No | ./.data/tokens | Token cache directory |
LOG_LEVEL | No | info | Logging level |
MIT — LICENSE
Issues and PRs welcome. Built by SurgeEnterpriseAI.
io.github.mindstone/mcp-server-microsoft-teams
com.mintmcp/outlook-email
helbertparanhos/resend-email-mcp
marlinjai/email-mcp
io.github.mindstone/mcp-server-email-imap
io.github.osamahassouna/email-playbook-mcp