Skip to main content
Glama

Teams MCP Server

The 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.

How It Works

┌─────────────┐     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.

Related MCP server: Microsoft 365 MCP Server

Features

  • One-click connect — visit /connect, sign in with Microsoft, done

  • Multi-tenant — any Microsoft 365 organization, any user

  • 11 tools — teams, channels, messages, chats, search, profile

  • Dual transport — STDIO for Claude Code, HTTP/SSE for Cowork & remote

  • Multi-user — each session gets isolated OAuth tokens

  • Auto-detect — picks the right transport based on launch method

  • Token caching — silent refresh, no re-login every session

  • Retry logic — automatic retries on throttled Graph API calls

  • TypeScript — fully typed, clean architecture, MIT licensed

For Users: Connect in 1 Click

If someone is already hosting this server (e.g., on https://teams-mcp.surgeai.com):

  1. Claude asks you to connect Microsoft Teams

  2. You click the auth link

  3. Sign in with your Microsoft work account

  4. Done — Claude can now read your Teams

No API keys, no Azure portal, no setup.

For Developers: Self-Host

1. Clone & Install

git clone https://github.com/SurgeEnterpriseAI/teams-mcp-server.git
cd teams-mcp-server
npm install
npm run build

2. Azure AD App Registration

  1. Go to Azure PortalApp registrationsNew registration

  2. Name: Teams MCP Server

  3. Supported account types: "Accounts in any organizational directory (Any Azure AD directory - Multitenant)"

  4. Redirect URI: Webhttps://your-server.com/auth/callback

  5. Click Register

Configure:

  • Certificates & secrets → New client secret → copy the Value

  • API Permissions → Add Delegated (Microsoft Graph):

    • ChannelMessage.Read.All, ChannelMessage.Send

    • Chat.Read, Chat.ReadWrite, ChatMessage.Send

    • Team.ReadBasic.All, Channel.ReadBasic.All

    • User.Read

  • Click Grant admin consent (for your own tenant; other tenants consent on first login)

3. Configure & Deploy

cp .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

4. Submit to MCP Registry

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.

For Claude Code Users: Local STDIO Mode

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.

Available Tools

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

Architecture

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)

Environment Variables

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

License

MIT — LICENSE

Contributing

Issues and PRs welcome. Built by SurgeEnterpriseAI.

A
license - permissive license
Not graded
quality - not tested
D
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Drive your real WhatsApp inbox from Claude — send, reply, label, assign, and triage via TimelinesAI.

  • Connect Claude to Fathom meeting recordings, transcripts, and summaries

  • WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SurgeEnterpriseAI/teams-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server