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.

Related MCP Connectors

Related MCP Servers