Microsoft 365 Teams via Graph: list chats, read/send messages, list teams/channels, presence.
Microsoft 365 Teams via Graph: list chats, read/send messages, list teams/channels, presence.
Microsoft 365 Teams · v0.1.1
by Mindstone
@mindstone/mcp-server-microsoft-teams
Microsoft 365 Teams MCP server — list and read Teams chats, send chat messages, list teams and channels, and read presence via the Microsoft Graph API.
Cohort-style Microsoft 365 Teams MCP. Reuses the OAuth surface owned by @mindstone/mcp-server-microsoft-mail so the host signs in once and gets Teams plus mail plus calendar plus files plus SharePoint from the same credentials.
Status
- Version: 0.1.1 · npm
- Auth: OAuth (host-orchestrated, shared with
mcp-server-microsoft-mail) (MS_CLIENT_ID) - Tools: 7 (chats, messages, teams, channels, presence)
- Surface: cloud-api
- Hosts tested: Mindstone Rebel
- Machine-readable:
STATUS.json - Shared library:
@mindstone/mcp-server-microsoft-shared
Why this exists
When we ported this in May 2026, Microsoft's own Graph MCP lineup did not yet ship a stand-alone Teams server, and the community options at the time treated Teams as its own login surface — every connector ran a separate OAuth dance and stored its own copy of the refresh token. We pulled the bundled connector out of MindstoneRebel as a 1:1 port so that the same five-connector Microsoft 365 cohort (mail, calendar, files, teams, SharePoint) shares a single set of credentials, a single shared-library package for token persistence and request timeouts, and the structured auth_required envelope the host already knows how to recover from. Teams reuses @mindstone/mcp-server-microsoft-mail's authenticate_microsoft_account tool rather than declaring its own. Some Teams Graph APIs may require tenant admin approval — see Microsoft's Teams Graph docs.
Example interaction
"Show me my last 10 messages in the project chat with Alice and Bob."
Tools the host calls:
list_chats— filters chats by participantsalice@example.comandbob@example.com.list_chat_messages— returns the latest 10 messages from the resolved chat ID.
Response (trimmed):
{
"chat": {
"id": "19:meeting_...@thread.v2",
"topic": "Project planning",
"members": ["alice@example.com", "bob@example.com"]
},
"messages": [
{ "id": "171...", "from": "Alice", "body": "Pushed the updated forecast", "createdDateTime": "2026-05-19T08:42:00Z" }
]
}
Requirements
- Node.js 20+
- npm
- A host application that performs the Microsoft OAuth flow and writes per-account token files into
${MS_CONFIG_DIR}/credentials/${sanitised-email}.token.jsonand an${MS_CONFIG_DIR}/accounts.jsonindex. This server reads those files; it does not initiate OAuth itself.
One-click install
After clicking the button, your host will prompt you to fill: MS_CLIENT_ID, MS_CONFIG_DIR, MS_MCP_PACKAGE_ID, MICROSOFT_REQUEST_TIMEOUT_MS.
Manual config for Claude Desktop / Claude Code / Goose / Continue.dev (Microsoft 365 Teams)
{
"mcpServers": {
"Microsoft 365 Teams": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-microsoft-teams"
],
"env": {
"MS_CLIENT_ID": "",
"MS_CONFIG_DIR": "",
"MS_MCP_PACKAGE_ID": "Microsoft365Teams",
"MICROSOFT_REQUEST_TIMEOUT_MS": "60000"
}
}
}
}
Quick Start
Install & build
cd <path-to-repo>/connectors/microsoft-teams
npm install
npm run build
npx (once published)
npx -y @mindstone/mcp-server-microsoft-teams
Local
node dist/index.js
Configuration
This server runs alongside a host application that owns the Microsoft 365 OAuth flow. The host writes credentials to disk; this server reads them.
Required environment variables
| Name | Description |
|---|---|
MS_CLIENT_ID |
Microsoft Entra (Azure AD) application client ID. |
MS_CONFIG_DIR |
Path to the per-user Microsoft config directory (credentials/, accounts.json). |
Optional environment variables
| Name | Description | Default |
|---|---|---|
MS_ACCOUNT_EMAIL |
Account email when running in multi-account per-instance mode. | First account in accounts.json. |
MS_MCP_PACKAGE_ID |
Logical package ID surfaced in error responses. | Microsoft365Teams |
MICROSOFT_REQUEST_TIMEOUT_MS |
Override the upstream Microsoft Graph request timeout (max 300000 ms). |
60000 |
MICROSOFT_DISABLE_REFRESH |
Set to 1 to disable token refresh on this surface. Tools fail closed with the structured auth_required response so the host can drive reauth. Cloud surfaces set this to 1. |
unset |
Host configuration examples
Claude Desktop / Cursor
{
"mcpServers": {
"Microsoft365Teams": {
"command": "npx",
"args": ["-y", "@mindstone/mcp-server-microsoft-teams"],
"env": {
"MS_CLIENT_ID": "your-entra-application-client-id",
"MS_CONFIG_DIR": "/absolute/path/to/microsoft-config"
}
}
}
}
Sign in via @mindstone/mcp-server-microsoft-mail's authenticate_microsoft_account first; the Teams tools then reuse the credentials it writes to ${MS_CONFIG_DIR}/.
Local development (no npm publish needed)
{
"mcpServers": {
"Microsoft365Teams": {
"command": "node",
"args": ["<path-to-repo>/connectors/microsoft-teams/dist/index.js"],
"env": {
"MS_CLIENT_ID": "your-entra-application-client-id",
"MS_CONFIG_DIR": "/absolute/path/to/microsoft-config"
}
}
}
}
Tools (7)
| Tool | Description |
|---|---|
list_chats |
List recent Teams chats. |
get_chat |
Get details about a specific chat. |
list_chat_messages |
List recent messages from a chat. |
send_chat_message |
Send a message to a chat. |
list_teams |
List teams you are a member of. |
list_channels |
List channels in a team. |
get_presence |
Get your current presence status. |
Some Teams Graph APIs may require tenant admin approval.
Security notes
- No authentication tool of its own; sign-in is delegated to
@mindstone/mcp-server-microsoft-mailso the cohort has a single OAuth surface. - Per-tool Graph calls run under a composed caller + cohort timeout signal.
Licence
FSL-1.1-MIT — Functional Source License, Version 1.1, with MIT future licence. Free for non-competing use; relicenses to MIT on the converter date in LICENSE.