Mcp Teams

io.github.dockndevaiPublished by GitHub account dockndevaiv0.2.0Updated Oct 24, 2026

Read Microsoft Teams teams, channels, chats and messages, and post/reply/send, safe by default.

Overview

AI-generated overview

A safe-by-default local MCP server that lets an assistant read Microsoft Teams teams, channels, chats and messages, and optionally post, reply or soft-delete.

What you can do
Confirm the signed-in account and list joined teams, channels and team members, with recent channel messages, single messages and threaded replies read-only by default. List the user's 1:1 and group chats and read their messages. In read-write mode with sending enabled, post to channels, reply in threads and send chat messages. In admin mode with deletes enabled, soft-delete the user's own messages.
When to use it
Use it when an assistant should answer questions from Teams conversations or summarize channels and chats, or when you want it to post or reply in Teams under explicit, gated permissions. It suits users who want read access first and writes only after deliberately raising the mode.
Requirements
Runs locally via npx, so Node.js is needed. Requires an Entra (Azure AD) app registration: TEAMS_CLIENT_ID, plus TEAMS_TENANT_ID (default common), with delegated Graph scopes such as Team.ReadBasic.All, Channel.ReadBasic.All and ChannelMessage.Read.All, and send/chat scopes to post. Interactive browser sign-in is the default and caches a token on disk; alternatively TEAMS_CLIENT_SECRET for app-only auth or TEAMS_TOKEN for a pre-obtained Graph token. Network access to Microsoft Graph.
Before you install
Posting is visible to others and cannot be silently undone, so it needs read-write mode plus TEAMS_ALLOW_SEND; deletes need admin mode plus TEAMS_ALLOW_DELETE and only affect your own messages. TEAMS_CLIENT_SECRET and TEAMS_TOKEN are secrets; the cached token is stored on disk. App-only tokens may lack access to several Teams message APIs. Optional allowlists, dry-run and audit logging exist to limit writes.

Installation

In SourceWeft

  1. Open Mcp Teams in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

mcp-teams

[npm] [CI] [licence]

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.

ToolForNeeds mode
whoamiconfirm which account is in useread-only
list_teamsteams the user has joinedread-only
list_channelschannels in a teamread-only
list_team_membersmembers of a teamread-only
list_channel_messagesrecent messages in a channelread-only
get_channel_messageone channel message + bodyread-only
list_message_repliesa channel message's threadread-only
list_chatsthe user's 1:1 / group chatsread-only
list_chat_messagesmessages in a chatread-only
send_channel_messagepost to a channelread-write + TEAMS_ALLOW_SEND
reply_channel_messagereply in a channel threadread-write + TEAMS_ALLOW_SEND
send_chat_messagesend a chat messageread-write + TEAMS_ALLOW_SEND
delete_channel_messagesoft-delete your own messageadmin + TEAMS_ALLOW_DELETE

Install

bash
npx -y @dockndevai/mcp-teams

You 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

json
{  "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_ID set. 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_SECRET present; 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_TOKEN set 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 needs read-write; deletes need admin.
  • TEAMS_ALLOW_SEND — posting a message is visible to others and can't be silently un-posted, so on top of read-write it also requires this flag.
  • TEAMS_ALLOW_DELETE — deletes require this flag on top of admin mode. 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 and deleting pause and ask the human to approve the exact target before running; clients that can't elicit fall back to the TEAMS_ALLOW_SEND / TEAMS_ALLOW_DELETE gates.
  • 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

bash
npm installnpm 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.jsnpm test

Licence

MIT

Source: README.md at commit 684d1de

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

2
  1. v0.2.0LatestSep 29, 2026
  2. v0.1.0Sep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts