ms-teams-mcp
# @anupam365/ms-teams-mcp
MCP server for Microsoft Teams via the Graph API. Exposes **73 tools** for managing teams, channels, chats, messages, meetings, planner, calendar, apps, tabs, scheduling, search, and authentication.
## Prerequisites
- **Node.js 18+**
- **Microsoft 365 subscription** with Teams enabled
- **Azure AD app registration** with appropriate Graph API permissions
## Setup
### 1. Create an Azure AD App
1. Go to [Azure Portal](https://portal.azure.com) → **App Registrations** → **New registration**
2. Name it (e.g., `Teams MCP`), leave redirect URI blank, click **Register**
3. Copy the **Application (client) ID** and **Directory (tenant) ID**
### 2. Add API Permissions
**API Permissions** → **Add a permission** → **Microsoft Graph**
#### Application permissions (for client-credentials auth):
| Permission | Type | Required for |
|---|---|---|
| `Channel.Create` | Application | Creating channels |
| `Channel.Delete.All` | Application | Deleting channels |
| `Channel.ReadBasic.All` | Application | Reading channel metadata |
| `ChannelMessage.Read.All` | Application | Reading channel messages |
| `ChannelMessage.UpdatePolicyViolation.All` | Application | Message policy |
| `Calendars.ReadWrite` | Application | Creating calendar events |
| `Group.Create` | Application | Creating teams |
| `Group.Read.All` | Application | Listing teams |
| `Group.ReadWrite.All` | Application | Updating teams |
| `Member.Read.Hidden` | Application | Reading hidden memberships |
| `OnlineMeetings.ReadWrite.All` | Application | Creating online meetings |
| `Team.Create` | Application | Creating teams |
| `Team.ReadBasic.All` | Application | Reading team metadata |
| `User.Read.All` | Application | Reading user info |
| `User.ReadBasic.All` | Application | Basic user info |
Click **Grant admin consent** → **Yes**
#### Delegated permissions (for device-code auth):
- `Team.ReadBasic.All`, `Channel.ReadBasic.All`, `ChannelMessage.Send`, `ChannelMessage.Read.All`, `Member.Read.All`, `OnlineMeetings.ReadWrite.All`, `Calendars.ReadWrite`, `User.Read.All`
### 3. Create a Client Secret
**Certificates & secrets** → **Client secrets** → **New client secret** → Copy the **Value**
## Configuration
### Via environment variables
```env
TEAMS_TENANT_ID=your-tenant-id
TEAMS_CLIENT_ID=your-client-id
TEAMS_CLIENT_SECRET=your-client-secret
TEAMS_AUTH_MODE=client-credentials
```
For device-code auth (interactive):
```env
TEAMS_AUTH_MODE=device-code
# No TEAMS_CLIENT_SECRET needed
```
For direct token (bypasses OAuth flows):
```env
TEAMS_AUTH_TOKEN=eyJ...
# TEAMS_TENANT_ID and TEAMS_CLIENT_ID not required
```
Read-only mode (reduced scopes):
```env
TEAMS_READ_ONLY=true
```
### MCP Client Config (opencode.json)
```json
{
"mcpServers": {
"microsoft-teams": {
"command": "npx",
"args": ["-y", "@anupam365/ms-teams-mcp"],
"env": {
"TEAMS_TENANT_ID": "...",
"TEAMS_CLIENT_ID": "...",
"TEAMS_CLIENT_SECRET": "...",
"TEAMS_AUTH_MODE": "client-credentials"
}
}
}
}
```
## Run
```bash
npx -y @anupam365/ms-teams-mcp
```
## Tools
### Teams (8)
| Tool | Description |
|---|---|
| `list_teams` | List all teams |
| `get_team` | Get team details |
| `create_team` | Create a new team |
| `update_team` | Update team metadata |
| `delete_team` | Delete a team |
| `archive_team` | Archive a team |
| `unarchive_team` | Restore an archived team |
| `clone_team` | Clone an existing team |
### Channels (7)
| Tool | Description |
|---|---|
| `list_channels` | List channels in a team |
| `get_channel` | Get channel details |
| `create_channel` | Create a new channel |
| `update_channel` | Update channel settings |
| `delete_channel` | Delete a channel |
| `archive_channel` | Archive a channel |
| `unarchive_channel` | Restore an archived channel |
### Channel Members (3)
| Tool | Description |
|---|---|
| `list_channel_members` | List channel members |
| `add_channel_member` | Add a user to a channel |
| `remove_channel_member` | Remove a user from a channel |
### Channel Messages (5)
| Tool | Description |
|---|---|
| `send_channel_message` | Send a message (supports format, importance, @mentions) |
| `list_channel_messages` | List recent channel messages |
| `reply_to_channel_message` | Reply to a channel message |
| `update_channel_message` | Edit an existing channel message |
| `delete_channel_message` | Delete a channel message |
### Chats (8)
| Tool | Description |
|---|---|
| `list_chats` | List 1-on-1 and group chats |
| `get_chat` | Get chat details |
| `create_chat` | Create a new 1-on-1 or group chat |
| `send_chat_message` | Send a chat message (supports format, importance) |
| `list_chat_messages` | List chat messages |
| `list_chat_members` | List chat members |
| `add_chat_member` | Add a user to a group chat |
| `list_chat_tabs` | List tabs in a chat |
### Chat Messages (2)
| Tool | Description |
|---|---|
| `update_chat_message` | Edit an existing chat message |
| `delete_chat_message` | Delete a chat message |
### Apps & Tabs (7)
| Tool | Description |
|---|---|
| `list_available_apps` | List tenant app catalog |
| `list_team_installed_apps` | List apps installed in a team |
| `install_app_in_team` | Install an app in a team |
| `uninstall_app_from_team` | Remove an app from a team |
| `list_channel_tabs` | List tabs in a channel |
| `add_channel_tab` | Add a tab to a channel |
| `remove_channel_tab` | Remove a tab from a channel |
### Planner (4)
| Tool | Description |
|---|---|
| `list_team_plans` | List plans in a team |
| `list_plan_buckets` | List buckets in a plan |
| `list_plan_tasks` | List tasks in a plan |
| `create_planner_task` | Create a new task |
### Calendar & Meetings (7)
| Tool | Description |
|---|---|
| `list_team_events` | List team calendar events |
| `create_event` | Create a team calendar event |
| `create_user_event` | Create event on a user's calendar |
| `get_event` | Get event details |
| `create_online_meeting` | Create a Teams meeting |
| `get_online_meeting` | Get meeting details |
| `list_online_meetings` | List upcoming meetings |
### Presence & Settings (4)
| Tool | Description |
|---|---|
| `get_user_presence` | Get user presence status |
| `get_team_settings` | Get team settings |
| `update_team_member_settings` | Update team settings |
| `list_team_members` | List all team members |
### Tags (3)
| Tool | Description |
|---|---|
| `list_team_tags` | List tags in a team |
| `create_tag` | Create a new tag |
| `delete_tag` | Delete a tag |
### Scheduling (6)
| Tool | Description |
|---|---|
| `list_scheduling_groups` | List scheduling groups |
| `list_shifts` | List shifts |
| `create_shift` | Create a shift |
| `list_time_off_reasons` | List time-off reasons |
| `list_time_off` | List time-off entries |
| `list_time_off_requests` | List time-off requests |
### Subscriptions (3)
| Tool | Description |
|---|---|
| `create_subscription` | Create a webhook subscription |
| `list_subscriptions` | List active subscriptions |
| `delete_subscription` | Delete a subscription |
### Search & Users (3)
| Tool | Description |
|---|---|
| `search_users` | Search users in the organization |
| `search_messages` | Search across all Teams messages |
| `get_my_mentions` | Get messages where you are @mentioned |
### Files (1)
| Tool | Description |
|---|---|
| `list_channel_files` | List files in a channel's folder |
### Auth Management (2)
| Tool | Description |
|---|---|
| `check_auth` | Check authentication status and mode |
| `logout` | Clear cached tokens and log out |
## Auth Modes
| Mode | Description | Best for |
|---|---|---|
| `token` | Direct AUTH_TOKEN env var | Testing, CI |
| `client-credentials` | App-only, no user interaction | Automated/headless use |
| `device-code` | Interactive browser login with persistent token cache | Personal/local use |
### Token Persistence
In device-code mode, the auth record is saved to `~/.microsoft-teams-mcp/auth-record.json`. On subsequent starts, the token is silently refreshed without re-prompting. If the refresh fails, the device-code prompt appears again.
### Read-Only Mode
Set `TEAMS_READ_ONLY=true` to restrict Graph scopes to `User.Read.All` and `Group.Read.All` only. Write operations will fail.
## Development
```bash
git clone <repo>
cd ms-teams-mcp
npm install
npm run dev # watch mode
npm run build # compile
```
## License
MIT
TDQS
Scored across 73 tools
Most tools target distinct resources and actions, but some overlap exists between similar operations like create_event vs create_user_event or list_shifts vs list_time_off vs list_time_off_requests. The large number of tools increases the chance of misselection, though descriptions generally clarify.
All tool names follow a consistent verb_noun or verb_noun_noun pattern using snake_case (e.g., create_channel, list_team_members, send_channel_message). No mixing of conventions or vague verbs like 'process' or 'run'.
With 73 tools, the server covers a wide range of Teams functionality, but the count feels slightly excessive for common use. While each tool serves a distinct purpose, a more focused subset could reduce complexity. Still within a reasonable range for a comprehensive integration.
The surface covers most CRUD operations for teams, channels, chats, messages, meetings, planner, shifts, time-off, apps, and tabs. Notable gaps include missing update operations for shifts and planner tasks, and no delete for chats or meetings. Overall, core workflows are well-supported.