mcp-teams
In this read-only configuration, you can inspect your Microsoft Teams identity and content, but not post or delete.
Confirm the signed-in account with
whoami.List joined teams and their members.
List channels in a team.
Read recent channel messages, fetch a single message, and read threaded replies.
List 1:1/group chats and read their messages.
Cap result counts with
topon supported list tools.Posting, replying, chatting, and deleting are not exposed by this schema; the README says they require higher modes and extra flags.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-teams Pull up unread messages from my Teams channels"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-teams
A safe-by-default Model Context Protocol server for Microsoft Teams, over Microsoft Graph. It lets an agent read and operate Teams — list joined teams, channels and members, read channel messages and threaded replies, read 1:1/group chats and their messages, and (in higher modes) post to channels, reply in threads, send chat messages, and soft-delete a message.
Browser sign-in: on first run it opens your browser to the Microsoft sign-in page, then caches the token and refreshes it silently — the server never sees your password.
Part of the dockndevai MCP server suite — one governance model across all of them.
What it gives an agent
The server starts read-only (see Safe by default); higher-capability tools are only registered when you raise the mode.
Tool | For | Needs mode |
| confirm which account is in use | read-only |
| teams the user has joined | read-only |
| channels in a team | read-only |
| members of a team | read-only |
| recent messages in a channel | read-only |
| one channel message + body | read-only |
| a channel message's thread | read-only |
| the user's 1:1 / group chats | read-only |
| messages in a chat | read-only |
| post to a channel | read-write + |
| reply in a channel thread | read-write + |
| send a chat message | read-write + |
| soft-delete your own message | admin + |
Related MCP server: teams-mcp-server
Install
npx -y @dockndevai/mcp-teamsYou need an Entra (Azure AD) app registration. For the default browser sign-in, register a public client and add the redirect URI http://localhost (platform: Mobile and desktop applications), then use its Application (client) ID as TEAMS_CLIENT_ID. Grant delegated Team.ReadBasic.All, Channel.ReadBasic.All, ChannelMessage.Read.All (and ChannelMessage.Send / Chat.ReadWrite to post). No client secret is needed for interactive use.
Configure
{
"mcpServers": {
"teams": {
"command": "npx",
"args": ["-y", "@dockndevai/mcp-teams"],
"env": {
"TEAMS_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
"TEAMS_TENANT_ID": "common",
"TEAMS_MODE": "read-only"
}
}
}
}On first use the server opens your browser to sign in and caches the token at ~/.mcp-teams/token.json (0600); later runs refresh silently.
See docs/CLIENTS.md for Claude Code / Cursor / Codex / VS Code / Windsurf snippets, and .env.example for every supported variable.
Authentication
Auth mode is chosen automatically (override with TEAMS_AUTH):
interactive (default) — only
TEAMS_CLIENT_IDset. Authorization-code + PKCE with a loopback redirect: the browser opens, you approve once, and the access + refresh token are cached on disk. Most Teams messaging APIs are delegated-only, so this is the primary mode. The server never handles your password.client-credentials (app-only) —
TEAMS_CLIENT_SECRETpresent; the server fetches an app token itself. Note that several Teams message APIs are not available to app-only tokens without protected-API approval from Microsoft.token —
TEAMS_TOKENset to a pre-obtained Graph bearer token. You manage its lifetime.
Safe by default
The access model is enforced by src/security.ts — defence in depth on top of the Graph token's own scopes/roles:
TEAMS_MODE—read-only(default) →read-write→admin. A tool is registered only if the mode allows its capability. Read-only exposes the 9 read tools; posting needsread-write; deletes needadmin.TEAMS_ALLOW_SEND— posting a message is visible to others and can't be silently un-posted, so on top ofread-writeit also requires this flag.TEAMS_ALLOW_DELETE— deletes require this flag on top ofadminmode. Deletes are soft-deletes (recoverable), and only your own messages.TEAMS_TEAM_ALLOWLIST/TEAMS_PROTECTED_TEAMS— confine which teams can be posted to / moderated; mark teams that may be read but never posted to.Interactive confirmation — when the client supports MCP elicitation, posting (
send_channel_message/reply_channel_message/send_chat_message) anddelete_channel_messagepause and ask the human to approve before running. The prompt shows the tool, the exact (secret-redacted) arguments and a fingerprint of them; the team, channel and message length are listed separately so they stay visible when a long message is truncated in the arguments dump (the dump is cut at 1500 characters).delete_channel_messagealso pins the message's version (team + channel + message id with Graph'setag,lastModifiedDateTimeanddeletedDateTime) across the prompt and is refused if it changed. A prompt nobody answers is a refusal. Clients that can't elicit fall back to theTEAMS_ALLOW_SEND/TEAMS_ALLOW_DELETEgates.TEAMS_REQUIRE_HUMAN_APPROVAL— whentrue(defaultfalse), these operations are refused if the client cannot elicit, instead of falling back to theTEAMS_ALLOW_*gates alone.TEAMS_DRY_RUN— validate and log writes without executing them.TEAMS_AUDIT_LOG— a JSON audit line per guarded operation, on stderr (default on).
See SECURITY.md.
Developing
npm install
npm run build
# introspect the tool list without signing in (uses a fake token, no network):
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | TEAMS_TOKEN=x node dist/index.js
npm testLicence
MIT
Available Tools
9 toolsget_channel_messageGet channel messageARead-onlyIdempotent
Fetch a single channel message by id, with its full body and metadata.
Inputs: team_id (required), channel_id (required), message_id (required).
list_channel_messagesList channel messagesARead-onlyIdempotent
List the top-level messages in a channel, most recent first. Returns compact summaries (id, from, created, body, webUrl). Use list_message_replies for a message's thread.
Inputs: team_id (required), channel_id (required), top.
list_channelsList channelsARead-onlyIdempotent
List the channels in a team, with their ids, display names, and membership type (standard/private/shared).
Inputs: team_id (required).
list_chat_messagesList chat messagesARead-onlyIdempotent
List the messages in a 1:1 or group chat, most recent first. Returns compact summaries.
Inputs: chat_id (required), top.
list_chatsList chatsARead-onlyIdempotent
List the signed-in user's 1:1 and group chats (id, topic, type, last updated). Use a chat id with list_chat_messages.
Inputs: top.
list_message_repliesList message repliesARead-onlyIdempotent
List the replies in a channel message's thread, most recent first.
Inputs: team_id (required), channel_id (required), message_id (required), top.
list_team_membersList team membersARead-onlyIdempotent
List the members of a team (display name, email, roles).
Inputs: team_id (required).
list_teamsList joined teamsARead-onlyIdempotent
List the teams the signed-in user is a member of, with their ids, display names, and descriptions. Start here to get a team id for list_channels.
Inputs: no named parameters.
whoamiWho am IARead-onlyIdempotent
Return the signed-in user's identity (display name, user principal name, id). Use this to confirm which account the server is operating as before reading or posting.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Each tool targets a distinct Teams entity and action: identity, teams, channels, members, channel messages, replies, and chats. The potentially similar message tools are clearly separated by scope (channel vs. chat vs. reply) and by singular vs. plural retrieval.
The naming is overwhelmingly consistent with a list_* / get_* verb-noun pattern. The main deviation is whoami, which is a common standard command, and the distinction between list and get is semantically clear.
Nine tools is well-scoped for a read-only Microsoft Teams server. Every tool earns its place by covering a distinct read operation without unnecessary redundancy or bloat.
Core read workflows are covered well: identity, teams, channels, members, channel messages with replies, and chats. The main gaps are the lack of a full get_chat_message equivalent, no search capability, and no write actions, but these are workable for a listing-focused server.
Maintenance
Related MCP Connectors
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
Read email/chat conversations, messages, contacts and teams; draft, send and update threads.
Governed email for agents: Gmail, M365 and IMAP; per-mailbox permissions, send allowlist, audit log
Governed app access for AI agents: 1,000+ apps & 12,000+ tools via Code Mode MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables interaction with Microsoft Teams chats and channels using official Microsoft Graph API or Power Automate for enterprise environments with restricted permissions.91MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to manage Microsoft Teams through the Graph API, including sending messages, managing chats, creating teams, and searching communications.29MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Microsoft Teams, users, and organizational data via Microsoft Graph APIs, including sending messages, managing chats and channels, and searching messages.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to access Microsoft Teams, chats, users, files, and organizational data via Microsoft Graph APIs, including messaging, search, attachment handling, and user management.12 npmMIT