/ Directory / Playground / Microsoft Teams
● Community InditexTech 🔑 Needs your key

Microsoft Teams

by InditexTech · InditexTech/mcp-teams-server

Read Teams channels, post messages, and @-mention engineers in natural language — a chat-ops bridge for teams that live in Microsoft Teams.

Inditex's community MCP for Microsoft Teams wraps the Graph API to let an agent read channel messages, post messages/replies, @-mention users, and list teams/channels. Requires Azure AD app registration with chosen Graph scopes. Great for incident comms and standup automation.

Why use it

Key features

Live Demo

What it looks like in practice

ms-teams.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "ms-teams": {
      "command": "uvx",
      "args": [
        "mcp-teams-server"
      ]
    }
  }
}

Open Claude Desktop → Settings → Developer → Edit Config. Restart after saving.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "ms-teams": {
      "command": "uvx",
      "args": [
        "mcp-teams-server"
      ]
    }
  }
}

Cursor uses the same mcpServers schema as Claude Desktop. Project config wins over global.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "ms-teams": {
      "command": "uvx",
      "args": [
        "mcp-teams-server"
      ]
    }
  }
}

Click the MCP Servers icon in the Cline sidebar, then "Edit Configuration".

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "ms-teams": {
      "command": "uvx",
      "args": [
        "mcp-teams-server"
      ]
    }
  }
}

Same shape as Claude Desktop. Restart Windsurf to pick up changes.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "ms-teams",
      "command": "uvx",
      "args": [
        "mcp-teams-server"
      ]
    }
  ]
}

Continue uses an array of server objects rather than a map.

~/.config/zed/settings.json
{
  "context_servers": {
    "ms-teams": {
      "command": {
        "path": "uvx",
        "args": [
          "mcp-teams-server"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add ms-teams -- uvx mcp-teams-server

One-liner. Verify with claude mcp list. Remove with claude mcp remove.

Use Cases

Real-world ways to use Microsoft Teams

Mirror an incident Slack-style thread into a Teams channel

👤 Ops / on-call in Microsoft-shop orgs ⏱ ~30 min advanced

When to use: Sentry fires a critical issue; you want the summary plus @-mention of on-call posted in your #incidents Teams channel.

Prerequisites
  • Azure AD app registration with Graph scopes ChannelMessage.Send, Channel.ReadBasic.All, User.Read.All — entra.microsoft.com → App registrations → New, grant admin consent
  • Team ID and Channel ID of target channel — Right-click channel → Get link to channel; IDs embedded in URL
Flow
  1. Compose the alert
    From the Sentry issue [paste], draft a 3-line incident summary: what broke, user impact, suspected release.✓ Copied
    → Concise summary
  2. Identify who to @-mention
    Who's on-call? Resolve their Teams user id from their email [email]. Return the mention object.✓ Copied
    → Resolved user + AAD id
  3. Post to the channel
    Post the summary to channel <id>, @-mentioning the on-call engineer. Also post a follow-up reply with a link to the Sentry issue.✓ Copied
    → messageId returned; visible in Teams

Outcome: Every incident gets a structured message in Teams with the right people tagged.

Pitfalls
  • @-mentions need a mention object with AAD id; plain @name text doesn't notify — Resolve user AAD id via Graph first, pass in the mentions array of the message payload
  • Admin consent required; app won't work until consent granted org-wide — Ask an AAD admin to grant admin consent for your app's scopes
Combine with: sentry

Post a daily engineering standup digest to a team channel

👤 Tech leads on MS-Teams orgs ⏱ ~20 min intermediate

When to use: Every morning: post 'yesterday's merged PRs + today's on-call + open P1s' to #eng-standup.

Flow
  1. Assemble the digest upstream
    Pull yesterday's merged GitHub PRs for our repos + current on-call + open P1 tickets. Summarize in 8 bullets.✓ Copied
    → Digest content
  2. Post with formatting
    Post to channel <id> with markdown headings (Teams supports basic formatting in messages).✓ Copied
    → Message visible
  3. Pin the thread
    Optionally, reply to yesterday's standup thread marking it outdated.✓ Copied
    → Reply posted

Outcome: A predictable daily standup in Teams; nobody has to run it manually.

Pitfalls
  • Teams markdown rendering is limited — some GitHub markdown breaks — Use plain text + bold + lists only; avoid tables and nested code blocks
Combine with: github · linear

Summarize what happened in a busy channel while you were away

👤 Anyone returning from PTO or a long meeting ⏱ ~10 min beginner

When to use: You missed 200 messages in #platform and want the gist.

Flow
  1. Fetch recent messages
    Get last 200 messages in channel <id>. Return text + author + timestamp.✓ Copied
    → Message stream
  2. Cluster into topics
    Group messages into 3–5 topical threads. Name each topic and list key takeaways.✓ Copied
    → Topic summaries
  3. Flag anything directed at me
    Highlight any message that @-mentions me (email <email>) or is a reply to my past messages. Those are must-reads.✓ Copied
    → Personal-action list

Outcome: A 30-second catch-up on a noisy channel.

Pitfalls
  • Pulling long threads hits message-size limits — Page in batches of 50; summarize per-batch before final rollup

Route inbound customer questions to the right team via @-mentions

👤 Customer-success ops ⏱ ~20 min intermediate

When to use: A partner asks a technical question in a shared channel; you want it routed to the domain expert.

Flow
  1. Classify the question
    Read this message [paste]. Which internal team owns this (billing, integrations, data)?✓ Copied
    → Single team label
  2. Resolve the right engineer
    From our on-call rota [paste or lookup], who's on-call for that team today? Return AAD id.✓ Copied
    → Person + AAD id
  3. Reply with the mention
    Reply in the same thread @-mentioning that person and asking them to take a look.✓ Copied
    → Reply posted with working mention

Outcome: Questions never languish unowned in a shared channel.

Pitfalls
  • Routing to someone on PTO is worse than not routing — Cross-reference against the calendar/out-of-office; escalate to backup if primary is out

Combinations

Pair with other MCPs for X10 leverage

ms-teams + sentry

Post Sentry alerts to Teams with @-mention to on-call

For Sentry issue <id>, summarize and post to Teams channel <id>, mentioning on-call engineer <email>.✓ Copied
ms-teams + github

Post GitHub PR review requests to Teams

When a PR is opened tagged 'needs-platform-review', post a Teams message in #platform with a link and @-mention the reviewer rotation.✓ Copied
ms-teams + monday

Post monday.com status updates to a Teams project channel

Every Friday, summarize monday board <id> items moved this week, post to Teams #proj-atlas.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
list_teams Discover teams the bot is a member of 1 Graph call
list_channels team_id Inventory channels in a team 1 Graph call
list_messages team_id, channel_id, top? Read recent channel messages 1 Graph call
send_message team_id, channel_id, content, mentions? Post to a channel 1 Graph call
send_reply team_id, channel_id, message_id, content, mentions? Reply inside an existing thread 1 Graph call
resolve_user email|user_principal_name Before building a mention object 1 Graph call

Cost & Limits

What this costs to run

API quota
Microsoft Graph throttling: ~10k requests per 10 min per app per tenant
Tokens per call
Channel message fetch: 200–1500 tokens per page.
Monetary
Free with an M365 org that has Teams licenses.
Tip
Cache team/channel IDs — they rarely change. Resolve user AAD ids once per email and reuse.

Security

Permissions, secrets, blast radius

Minimum scopes: ChannelMessage.Send Channel.ReadBasic.All User.Read.All
Credential storage: Azure AD client id, client secret, tenant id as env vars
Data egress: All calls to graph.microsoft.com (within your tenant)
Never grant: Group.ReadWrite.All Directory.ReadWrite.All

Troubleshooting

Common errors and fixes

AADSTS70011: Invalid scope

Scope name wrong or not granted. Admin consent required for Graph app scopes.

Verify: Check App Registration → API Permissions → Status column must show 'Granted'
403 Forbidden on sendMessage

App lacks ChannelMessage.Send permission, or user isn't a member of the team.

@-mention doesn't notify the user

You used plain text @name instead of the mentions array with AAD id. Resolve user first, then include mention object.

429 throttled

Too many Graph calls. Back off exponentially; batch when possible; cache IDs.

Alternatives

Microsoft Teams vs others

AlternativeWhen to use it insteadTradeoff
Slack MCPTeam is on SlackDifferent platform; Slack MCP is simpler to auth
Power Automate / FlowYou want no-code automation within M365Less flexible for AI agent driven workflows

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills