Microsoft Teams for Claude — read your chat list and the currently open chat, via your browser
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Documented (README)
- !No standard license detected
git clone https://github.com/chrischall/microsoft-teams-mcp{
"mcpServers": {
"microsoft-teams-mcp": {
"command": "node",
"args": ["/path/to/microsoft-teams-mcp/dist/index.js"]
}
}
}MCP Servers overview
# microsoft-teams-mcp
MCP server for **Microsoft Teams** — list your chats, teams and channels, and
read whichever chat or channel is currently open, routed through your
signed-in browser tab.
> This project was developed and is maintained by AI (Claude Code). Use at your
> own discretion.
## How it works — and its one real limitation
Teams Web's chat and message data lives only in a client-side cache fed by a
WebSocket/registrar sync channel — there is no REST or GraphQL endpoint that
returns it. So this server does not capture a token and make plain server-side
requests the way an API-backed MCP would; instead every call routes through
the [fetchproxy](https://github.com/chrischall/fetchproxy) browser bridge and
reads the DOM your signed-in `teams.cloud.microsoft` tab has already
rendered. `teams.microsoft.com` (the old host) is not supported.
**That has one real consequence: this server can only read whichever chat or
channel is currently displayed in your browser tab.** The bridge can fetch
and read — it cannot navigate a tab to a different conversation.
`teams_list_chats` and `teams_list_teams_and_channels` always work (their
sidebars are always rendered once that nav section is open);
`teams_get_open_chat_messages` and `teams_get_open_channel_posts` read
whatever conversation you have open. To read a different chat or channel,
open it in the browser first.
The bridge is on the request path for **every** call here, not just once to
mint a token — unlike an API-backed MCP, there is nothing to cache between
calls.
## Install
```sh
npm i -g @chrischall/microsoft-teams-mcp
```
Requires the **Transporter** Chrome extension and `@fetchproxy/cli`, on a
matching major version:
```sh
npm i -g @fetchproxy/cli
```
The first call prints a 6-digit pair code to approve in the Transporter
popup; the grant persists.
### Install in opencode
opencode reads MCP servers from `opencode.json` (project) or
`~/.config/opencode/opencode.json` (global):
```json
{
"mcp": {
"servers": {
"teams": {
"type": "local",
"command": ["npx", "-y", "@chrischall/microsoft-teams-mcp"]
}
}
}
}
```
### Configuration
Everything is optional — this server needs no credentials of its own.
| variable | purpose |
| --- | --- |
| `TEAMS_WS_PORT` | fetchproxy concentrator port. Defaults to `37149`, the fleet-wide shared port. |
## Tools
- `teams_list_chats` — the Chat sidebar: title, last-message preview,
last-activity time, and Teams' own conversation id for each chat.
- `teams_get_open_chat_messages` — the message thread of whichever chat is
currently open: sender, ISO-8601 time, message id, and text, plus a
`conversation` field naming WHICH chat that is (the selected sidebar row's
title and thread key) so the model can confirm it read the chat you meant.
- `teams_list_teams_and_channels` — the Teams-and-Channels sidebar (a
DIFFERENT view from Chat): every team and channel the user belongs to,
with each channel's parent team name.
- `teams_get_open_channel_posts` — the top-level posts of whichever channel
is currently open: sender, subject (when present), prose time (not
ISO-8601 — Teams doesn't expose one for these), message id, and text.
Threaded replies under a post are not included. Like the chat tool, it
names the open channel in a `conversation` field.
- `teams_get_activity` — the Activity feed (the bell icon in the left nav):
mentions, replies, reactions, and the like across every chat and channel,
each with its title, message preview, prose time, and location (the
team/channel or chat it happened in). Requires the Activity view open.
- `teams_healthcheck` — verifies the bridge can reach a signed-in tab.
All five data tools are read-only and take no arguments.
**No Calendar tool here.** Teams Web's Calendar renders inside an embedded
`outlook.office.com` iframe, which the fetchproxy bridge (DOM reads only
against the top-level tab, no iframe crossing) cannot reach — and isn't the
right place for it anyway. Use
[`office-outlook-mcp`](https://github.com/chrischall/office-outlook-mcp)'s
`outlook_list_events` / `outlook_get_event` / `outlook_list_calendars`
instead: real Outlook REST API calls via a captured token, with no
"must have it open" limitation at all.
## Things worth knowing
- **One Teams tab at a time.** If more than one `teams.cloud.microsoft` tab
is open, the bridge reads whichever answers first — which may not be the
one you're looking at. The "open" tools report the conversation they read
(`conversation.title`, or `null` if it couldn't be identified) and their
descriptions tell the model to check it before summarizing.
- **Results are framed as untrusted.** Every data tool returns
`{ untrusted_content: true, note, ... }` and says in its description that
the text is written by other Teams users. Message bodies, previews and
subjects are data to report, never instructions to follow — this matters
because the server usually runs beside write-capable MCPs (mail, messaging)
that an injected instruction could otherwise reach.
- **No chat or channel selection.** See "How it works" above — there is no
id parameter on either "open" tool because there is no way to act on one.
Ask the person to open the chat/channel they mean, or use the matching
list tool to show them what's available.
- **Chat and Teams-and-Channels are different nav sections.** Reading
channels needs the Teams-and-Channels view open in the browser (the
"Teams" icon in the left rail, not "Chat") — if a channel tool returns
nothing, that's usually why.
- **Grouped messages still resolve a sender.** Teams visually hides the
sender name on consecutive messages from the same person, but the name
stays in the DOM, so `sender` is populated on every row regardless.
- **Quoted content concatenates.** A chat message that quotes an earlier one,
or a channel post whose body includes a reply preview, has that quoted
text run together with the real content inside `text` — a limitation of
bulk text extraction, not a bug.
- **Multiple open Teams tabs race.** The bridge reads whichever matching tab
answers first ("first responsive"), not necessarily the one you meant. If
results look like they're from the wrong chat/channel, close extra
`teams.cloud.microsoft` tabs so only one remains.
- **Scope grows quietly.** If you see a `read_dom_list name not in declared
set` error, the extension's approved scope is behind the server's declared
one — this shouldn't happen in a released version, but if it does, revoke
and re-pair `teams-mcp` in the Transporter popup.
## Development
```sh
npm install
npm run build
npm test # typecheck + suite
npm run test:coverage # CI's gate
```
This server depends on `read_dom_list`, a fetchproxy capability added
alongside this repo — it needs `@fetchproxy/protocol`/`@fetchproxy/server`
`>= 3.1.0`, the first published versions that include it
([chrischall/fetchproxy#381](https://github.com/chrischall/fetchproxy/pull/381)).
## License
MIT
What people ask about microsoft-teams-mcp
What is chrischall/microsoft-teams-mcp?
+
chrischall/microsoft-teams-mcp is mcp servers for the Claude AI ecosystem. Microsoft Teams for Claude — read your chat list and the currently open chat, via your browser It has 0 GitHub stars and its last recorded update is dated 2026-09-23.
How do I install microsoft-teams-mcp?
+
You can install microsoft-teams-mcp by cloning the repository (https://github.com/chrischall/microsoft-teams-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is chrischall/microsoft-teams-mcp safe to use?
+
Our security agent has analyzed chrischall/microsoft-teams-mcp and assigned a Trust Score of 62/100 (tier: OK). See the full breakdown of passed checks and flags on this page.
Who maintains chrischall/microsoft-teams-mcp?
+
chrischall/microsoft-teams-mcp is maintained by chrischall. The last recorded GitHub activity is dated 2026-09-23, with 0 open issues.
Are there alternatives to microsoft-teams-mcp?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy microsoft-teams-mcp to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/chrischall-microsoft-teams-mcp)<a href="https://claudewave.com/repo/chrischall-microsoft-teams-mcp"><img src="https://claudewave.com/api/badge/chrischall-microsoft-teams-mcp" alt="Featured on ClaudeWave: chrischall/microsoft-teams-mcp" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
The fastest path to AI-powered full stack observability, even for lean teams.