# Microsoft Teams

**Category:** 💬 Communication  
**Repository:** https://github.com/SurgeEnterpriseAI/teams-mcp-server  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/microsoft-teams

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

## Claude Desktop Quick Installation
Heuristic fallback — verify the package name and runner against the repository README before running it. Uses `npx` (confidence: low):

```json
"mcpServers": {
  "microsoft-teams": {
    "command": "npx",
    "args": ["-y","microsoft-teams"]
  }
}
```

## Documentation & README

# 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](https://github.com/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

```bash
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 Portal](https://portal.azure.com) → **App registrations** → **New registration**
2. Name: `Teams MCP Server`
3. **Supported account types: "Accounts in any organizational directory (Any Azure AD directory - Multitenant)"**
4. Redirect URI: **Web** → `https://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

```bash
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:

```bash
# 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`:

```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](LICENSE)

## Contributing

Issues and PRs welcome. Built by [SurgeEnterpriseAI](https://github.com/SurgeEnterpriseAI).

