Microsoft Teams
Connect Claude to Microsoft Teams — read/send messages, list channels, search chats.
Open source Open in the app JSON README (API)
About
Connect Claude to Microsoft Teams — read/send messages, list channels, search chats.
Details
- Kind
- MCP servers
- Topic
- Communication
- Publisher
- surgeenterpriseai
- Origin
- official
- Category
- ferramentas
- Transport
- local
- Version
- 1.0.0
- Stars
- 2
- Forks
- 1
- Open pull requests
- 3
- Last push
- 2026-04-12T07:41:45Z
- Repository state
- ativo
- Language
- TypeScript
- License
- MIT
- Added
- 2026-08-29 03:02:16
- Updated
- 2026-08-29 03:02:16
- Origin id
io.github.SurgeEnterpriseAI/teams-mcp-server
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).