Microsoft Teams

SurgeEnterpriseAI/teams-mcp-server
1 starsMITCommunity

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

Connect Claude to Microsoft Teams — read/send messages, list channels, search chats.

README.md

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.

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 servers

Browse all →