TeamsBridgeMCP
Summary: An MCP server that drives Microsoft Teams through the web client's own internal REST endpoints (no Graph, no Azure app registration), reusing a Chrome/Edge sign-in session to read and act on your chats and channels.
Session management:
teams_statusreports session and endpoint-registry health;teams_loginopens Chrome so you can sign in and saves the session automatically.Discovery:
list_chats(recent chats, meeting chats, channels),list_channels(your teams and their channels),list_messages(channel/chat messages with pagination).Messaging:
send_messageposts to a chat or channel, with optionalreplyToMessageIdto reply in a channel thread;search_messagessearches across chats and channels.Files:
upload_filepushes a local file to your OneDrive Teams chat folder, shares it with chat members and posts it as a message;download_filesaves a SharePoint/OneDrive file from a message to a local path.Contacts:
start_chatopens or reopens a 1:1 or group chat by e-mail address and returns theconversationIdused by other tools.Calendar:
list_meetingslists upcoming meetings from your calendar.Not available in this schema: the README also advertises
edit_messageandreact_message, and calls the pagination parameterolderCursorinlist_messageswhere the schema exposescursor— so editing, reacting and the documented cursor name are not usable as described.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TeamsBridgeMCPlist my recent Teams chats and show the latest message in each"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TeamsBridgeMCP
An MCP server for Microsoft Teams that talks to the same internal REST endpoints the Teams web client (teams.microsoft.com) uses. It does not use Microsoft Graph, so you need no Azure app registration and no admin consent. You sign in once in Chrome with your normal account and the server reuses that session.
All endpoints live in one registry file (data/endpoints.json). When Microsoft changes something, you patch that file, not the code.
Landing page with architecture diagram: https://godmodeai2025.github.io/TeamsBridgeMCP/
Independent open-source project, not affiliated with, sponsored or endorsed by Microsoft. See Trademarks. The endpoints used here are undocumented and can change at any time. Check your organization's policies before using this with a work account.
Tools
Tool | What it does |
| Session and registry status |
| Opens Chrome so you can sign in; session is saved automatically |
| Recent chats, meeting chats and channels, newest first |
| Your teams and their channels |
| Messages of a chat or channel, including attached files; |
| Send to a chat or channel (the same text to the same chat within 30 s is sent once, so a client retry does not post twice); |
| Change the text of one of your messages, attachments stay |
| Add a reaction (like, heart, laugh, surprised, sad, angry) |
| Start or reopen a chat by e-mail address |
| Search across chats and channels |
| Upload a local file to your OneDrive and post it into a chat |
| Download a file from a message (SharePoint or OneDrive links only, up to 250 MB) |
| Upcoming meetings from your calendar |
Related MCP server: Microsoft Teams MCP Server
Requirements
Node.js 20 or newer
Google Chrome or Microsoft Edge installed (
playwright-coredrives your local browser and does not download one)A Microsoft 365 account with Teams
Setup
git clone https://github.com/GodModeAI2025/TeamsBridgeMCP.git
cd TeamsBridgeMCP
npm install
npm run build
npm run login # Chrome opens, sign in, the window closes by itselfPrefer Edge? npm run login -- --browser msedge, and pass --browser msedge to the server. The commands are the same on macOS and Windows (Terminal, cmd or PowerShell).
npm run login writes data/session.json (gitignored; mode 0600 on macOS and Linux, on Windows it is protected by the folder's permissions, so keep the project inside your user profile) and keeps a browser profile in data/browser-profile/ so later sign-ins usually need no password. You can also call the teams_login tool from your agent instead.
Expired tokens (chat about 24 h, files about 1 h) are refreshed by the server itself with a headless sign-in. Only when Microsoft asks for password or MFA does it open the Chrome window again. If Microsoft asks "Stay signed in?" during the first sign-in, choose yes: on a Mac without company device sign-in the silent refresh only works then, otherwise the stored profile keeps no login. HTTP 403 is passed through unchanged: it means no access to that chat or a wrong region, and a new sign-in would not help.
Configuration
Usually nothing to configure. At sign-in the server reads the chat region, the partition and your OneDrive host from the Teams client's own requests and stores them with the session; teams_status shows them. Flags or environment variables override the detected values, flags win over the environment.
Flag | Variable | Default | When to change it |
|
| detected at sign-in | Your OneDrive host for |
|
| detected, else | Chat service region of your tenant, e.g. |
|
| detected, else | Middle-tier partition used for profiles and meetings. |
|
| found in your OneDrive | OneDrive folder Teams uses for chat uploads. The server looks for the English and German name and takes the newer one; set this if Teams runs in another language. |
|
|
| Browser for sign-in: |
|
|
| Different session location |
|
|
| Your own registry file |
Finding region and partition by hand is only needed after npm run export-session (that path does not detect them) or when every chat returns HTTP 403, which is how a wrong region shows up. Open Teams in the browser, open DevTools (Network tab), click into a chat. Requests to .../api/chatsvc/<region>/v1/... show the region, requests to .../api/mt/part/<partition>/... show the partition.
Register with an MCP client
Claude Code:
claude mcp add teams -- node /absolute/path/TeamsBridgeMCP/dist/index.jsClaude Desktop (claude_desktop_config.json) and most other clients, here with a flag that overrides a detected value:
{
"mcpServers": {
"teams": {
"command": "node",
"args": [
"/absolute/path/TeamsBridgeMCP/dist/index.js",
"--region", "emea"
]
}
}
}The same with environment variables:
{
"mcpServers": {
"teams": {
"command": "node",
"args": ["/absolute/path/TeamsBridgeMCP/dist/index.js"],
"env": { "TEAMS_BROWSER": "msedge" }
}
}
}On Windows the path in args needs forward slashes or doubled backslashes, e.g. "C:/Users/you/TeamsBridgeMCP/dist/index.js".
An unknown flag stops the server with an error, so typos show up right away.
Test
npm test # builds, checks URL expansion, starts the server and calls teams_statusThis needs no Teams session.
When an endpoint breaks: capture workflow
Tools report HTTP 404/410 or auth errors when Microsoft moved an endpoint. Re-capture it:
Start Chrome with a debug port and a separate profile (current Chrome ignores the port on the default profile):
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ --remote-debugging-port=9222 --user-data-dir="$HOME/.teams-cdp-profile"On Windows (PowerShell):
& "$env:ProgramFiles\Google\Chrome\Application\chrome.exe" ` --remote-debugging-port=9222 --user-data-dir="$env:USERPROFILE\.teams-cdp-profile"Edge works the same, e.g.
& "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe". Open https://teams.microsoft.com there and sign in.npm run capture -- --label messagesDo the action in Teams (open a channel, send a message, page back).
After each action set a marker:
npm run mark -- "sent message in channel X"Stop with Ctrl+C. The requests are in
captures/messages-<timestamp>.jsonl.Copy the relevant request into
data/endpoints.jsonand call the tool again.
npm run export-session exports the cookies of that debug browser to data/session.json if you prefer it over npm run login.
Registry format
{
"version": 1,
"updated": "2026-10-29T14:00:00.000Z",
"endpoints": {
"messages.send": {
"method": "POST",
"url": "https://teams.cloud.microsoft/api/chatsvc/${TEAMS_REGION}/v1/users/ME/conversations/{conversationId}/messages",
"auth": "bearer",
"tokenSource": "https://ic3.teams.office.com",
"bodyType": "json",
"params": [{ "name": "conversationId", "in": "path", "required": true }]
}
}
}${NAME}inurlis replaced by the environment variable (see Configuration){name}inurlis a path parameter; all other parameters go into the query stringauth:cookie,bearer,cookie+bearerornonebearerneedstokenSource: the audience of a token captured at sign-in (e.g.https://ic3.teams.office.com) or a cookie nameheadersvalues containing{uuid}get a fresh UUID per request
Security
data/session.jsonholds your full Teams session. Never commit or share it. If it leaks, sign out of Teams everywhere or reset your password.captures/contains request headers and bodies, including tokens. Gitignored, do not share.The server can do exactly what your signed-in account can do, nothing more.
Messages from other people are input your agent reads. Keep tool approval on in your MCP client for
send_message,edit_message,react_message,upload_fileandstart_chat, so a crafted message cannot make the agent post or share files unseen.
Limits
Undocumented endpoints, no support from Microsoft. Use at your own risk.
No real-time events (push/WebSocket); reads poll.
Meetings: list and details yes, joining or controlling no.
upload_fileuses a single PUT, which SharePoint caps at 250 MB.
Legal background
This section explains why the author considers publishing this project lawful. It is provided for transparency only and is not legal advice.
Interfaces are not protected as such. Under EU law, the functionality of a computer program, its programming language and its data formats are not protected by copyright (Court of Justice of the European Union, judgment of 2 May 2012, SAS Institute, C-406/10). This project describes and uses interfaces. It does not copy any part of Microsoft's software.
Observing a program is permitted. A lawful user may observe, study and test the functioning of a program in order to determine the ideas and principles behind it, while running it as intended (Art. 5(3) Directive 2009/24/EC, implemented in Germany as § 69d(3) UrhG). The endpoints were identified by observing the network traffic of the Teams web client during normal, authorized use. No code was decompiled or disassembled.
Reverse engineering of available products is permitted. Acquiring information by observing, studying or testing a product that has been made available to the public is lawful (Art. 3(1)(b) Directive (EU) 2016/943, implemented in Germany as § 3(1) No. 2 GeschGehG).
No protection measures are circumvented. The software only uses the session the user establishes by signing in with their own account in a regular browser. It grants no additional rights and works only with the permissions that account already has.
Contractual terms remain the user's responsibility. Terms of service of Microsoft and the policies of the organization that manages a tenant may restrict automated access. They bind the user of an account, not the publication of this source code. Each user is responsible for checking that their use complies with the terms and policies that apply to them.
Private project
TeamsBridgeMCP is a private project. The author created it entirely in their own time, with their own equipment and resources, on their own initiative. It was not created in the course of any employment, as part of any job duties, or on behalf of or commissioned by any employer, client or other organization. It contains no code, data, documents or confidential information belonging to any employer or client. No employer or organization owns, maintains, endorses or is responsible for this project.
Responsible use
Use it only with an account you are allowed to automate. On a work or school tenant, check your organization's IT and acceptable-use policies first, or ask your administrator.
Chats contain other people's messages and personal data. Do not collect, export or monitor conversations beyond what you would do by hand.
The software comes as is, without warranty (Apache License 2.0, sections 7 and 8).
Trademarks
Microsoft, Microsoft Teams, Microsoft 365, Microsoft Edge, Entra ID, OneDrive and SharePoint are trademarks of the Microsoft group of companies. Chrome is a trademark of Google LLC. They are used here only to describe what this software works with. This project is independent and not affiliated with, sponsored or endorsed by Microsoft or Google. It ships no Microsoft logos, icons or code. All other names belong to their respective owners.
License
Apache License 2.0, see LICENSE.
Legal notice
Available Tools
11 toolsdownload_fileC
Download a file from a conversation to a local path
| Name | Required | Description | Default |
|---|---|---|---|
| outPath | Yes | Local output path | |
| fileReference | Yes | fileReference (SharePoint/OneDrive URL) from list_messages files[] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden and discloses almost nothing behavioral. It does not say whether an existing file at outPath is overwritten, what permissions or auth are required, what happens on failure, or what the tool returns on success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the action front-loaded and no padding. It is short rather than bloated, though brevity here comes at the cost of the behavioral detail noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter, non-destructive-looking read-and-save tool, the description plus a fully documented schema is roughly sufficient to invoke it. However, with no annotations and no output schema, the omission of overwrite and return-value behavior leaves a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains that fileReference is a SharePoint/OneDrive URL from list_messages files[]. The description adds only the mapping of the output to a 'local path', which the schema states anyway, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a file') plus the source ('from a conversation') and destination ('to a local path'), which inherently separates it from sibling upload_file. It stops short of naming its counterpart explicitly, but the direction of data flow is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from a conversation' hints at scope, but there is no statement of when to use this rather than upload_file, nor any prerequisite such as needing a fileReference obtained from list_messages. An agent must infer the whole workflow from the schema hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_channelsB
List your teams and their channels (channel id works with list_messages and send_message)
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | No | Only this team (id from a previous call) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It doesn't mention that this is a read-only operation, whether authentication (teams_login) is required, pagination behavior, or what the returned team/channel objects look like. The only behavioral hint is the downstream id compatibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with the core purpose front-loaded and no wasted text. The parenthetical is slightly awkward but conveys real routing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema list tool, the description covers the basic return ('teams and their channels') and id interoperability, but omits auth requirements and result structure. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional teamId is documented in the schema as 'Only this team (id from a previous call)'. The description adds nothing about scoping or the id format, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List your teams and their channels'), which is clear enough to distinguish from siblings like list_chats, list_meetings, and list_messages. It doesn't explicitly say how it differs from those list tools, keeping it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical explains downstream usage — the channel id it returns works with list_messages and send_message — which implies a discovery/entry-point workflow. However, it never states when to use this versus list_chats or list_messages, nor any prerequisites such as needing teams_login first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsB
List recent conversations (chats, meeting chats, channels) of the signed-in user, newest activity first
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max conversations (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It usefully indicates a read-style listing scoped to the signed-in user and ordered by newest activity first, but it does not mention permissions, pagination behavior, or what the returned conversation objects contain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no filler. It efficiently states the resource, scope, included conversation types, and ordering.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one optional, fully documented parameter, the description covers the core purpose, scope, and ordering. It does not describe the return shape, but the tool is simple enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has only one optional parameter, and the schema fully documents it with a default and min/max bounds. The description adds no parameter-specific details, but schema coverage is 100%, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ("List") and resource ("recent conversations"), and clarifies the resource includes chats, meeting chats, and channels. It distinguishes the scope as the signed-in user and specifies ordering, though it does not explicitly name sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool lists but gives no explicit guidance on when to use it versus siblings such as search_messages, list_messages, list_channels, or list_meetings. Any usage context must be inferred from the resource description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_meetingsB
List meetings in your calendar from now on
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days ahead (default 7) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It implies a read-only listing and a temporal scope, but omits pagination, maximum results, permissions, and return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no filler. For a simple one-parameter tool, this is appropriately sized and every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read tool with full schema coverage and no output schema, so the description does not need to explain every return value. Still, it lacks details on return format, pagination, and boundary behavior, making it adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter, 'days', and the schema already provides 100% coverage including minimum, maximum, and default. The description adds no parameter detail beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'List' and resource 'meetings in your calendar' are specific, and the phrase distinguishes meetings from sibling chat/message tools. However, it does not name an alternative or clarify meeting types, so it falls short of a full 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives only a temporal scope ('from now on') and provides no when-to-use guidance, prerequisites, or comparison to alternatives such as list_chats or list_messages. The days schema hints at an upcoming horizon, but the description does not route between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_messagesC
List messages of a channel or chat conversation
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | channel | |
| limit | No | ||
| cursor | No | Pagination cursor from previous result | |
| conversationId | Yes | Channel or chat conversation ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and provides almost nothing: no ordering, read-only nature, permission requirements, pagination behavior, or result shape are disclosed. The presence of a cursor parameter suggests pagination, but the description never explains it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and free of waste, which is structurally good. However, it is under-specified for a tool with pagination and filtering parameters, so the brevity comes at the cost of completeness rather than being genuinely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There are no annotations, no output schema, and only 50% schema description coverage, so the description needs to do heavy lifting. It does not explain pagination, default ordering, limits, or what a returned message contains, leaving meaningful gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, but the description only echoes the 'channel or chat conversation' scope covered by the schema. It adds no meaning for 'limit', 'cursor', or the kind enum, and does not compensate for the undocumented half of the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('messages') scoped to a channel or chat conversation, so the core operation is unambiguous. It does not distinguish itself from the sibling 'search_messages', which could also return messages, leaving some ambiguity about which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this instead of 'search_messages', 'list_chats', or 'list_channels'. The reader must infer that this is for enumerating messages in a known conversation, but the description never says so explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesC
Search messages across chats and channels
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses almost nothing: not whether results are ranked, whether the search is full-text vs. prefix, whether it covers private chats, or whether it is read-only (implied but unstated). The only behavioral hint is that the search spans both chats and channels.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the resource and scope are front-loaded. It is not padded; it is simply thin, which is penalized under other dimensions rather than here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no annotations, no output schema, and fully undocumented parameters, one sentence is not enough to invoke it correctly. The agent cannot tell what form results take, how paging works, or how this differs from list_messages.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description adds nothing about either parameter. It does not explain the required `query` (matching semantics, operators) or the optional `limit` (default value, max 100), so the agent learns nothing beyond the raw schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Search messages") plus a scope ("across chats and channels"), which is more than a tautology. However, it never distinguishes itself from the sibling list_messages, so an agent must guess which one to use for retrieving messages in a known chat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus list_messages or list_channels/list_chats, and no prerequisites or query-syntax guidance. The phrase "across chats and channels" weakly implies a cross-conversation use case, but the agent is left to infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageB
Send a message to a chat or channel; in channels pass replyToMessageId (the thread's root post id) to reply in that thread
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | channel | |
| text | Yes | Message text (markdown as supported by Teams) | |
| conversationId | Yes | Conversation ID from list_chats, list_channels or start_chat | |
| replyToMessageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It explains thread-reply behavior, but it does not mention permissions, authentication requirements, rate limits, side effects, or what the tool returns after sending.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the primary action first and then adds the key channel-thread nuance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple send-message tool, the description covers the core action and the non-obvious replyToMessageId behavior. However, with no annotations or output schema, it still leaves out behavioral details such as authentication requirements and response behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description adds important meaning for replyToMessageId by explaining that it should be the thread's root post id. It does not explain the kind parameter beyond the enum/default already in the schema, and conversationId meaning is mostly left to the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: sending a message to a chat or channel. It also clarifies channel thread replies via replyToMessageId. The action is clear and effectively unique among the siblings, though it does not explicitly contrast itself with alternatives such as start_chat or upload_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one useful conditional guideline: in channels, pass replyToMessageId to reply in a thread. However, it does not explain when to use this tool versus other sibling tools or describe prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_chatA
Start (or reopen) a chat with people by e-mail; returns the conversationId for send_message/upload_file. One person without topic = 1:1 chat (existing one is reused), otherwise a new group chat.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Group chat name | |
| emails | Yes | E-mail addresses of the other participants |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the reuse behavior ('existing one is reused' for 1:1) and the creation behavior for groups, but omits permissions/auth needs, what happens if a topic is supplied with a single e-mail, and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the action and its downstream use, then the branching rule. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with an easily inferred result, the description covers the key facts: what it returns and how the mode is chosen. Minor gaps remain around permissions and edge cases (e.g. duplicate emails), but nothing blocks a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond it by explaining the interaction between 'emails' and 'topic' (one person without topic = 1:1; topic implies a named group). That conditional coupling is not expressed anywhere in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start (or reopen) a chat') and explains the resulting artifact: a conversationId consumed by send_message/upload_file. It also disambiguates the two modes (1:1 vs group) so the agent knows exactly which resource is produced.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly positions this as the prerequisite step for send_message and upload_file, which tells the agent when to reach for it. It lacks explicit exclusions or a named alternative (e.g. list_chats for finding existing conversations), keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_loginA
Open Chrome on Teams so the user can sign in; the session is saved automatically. Returns immediately, check teams_status afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the behavioral burden and does a decent job: it discloses that a real browser window is launched, that credentials/session persistence is automatic, and critically that the call is non-blocking and returns before sign-in completes. It doesn't say what happens on failure or whether user presence is mandatory at the machine.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact clauses carry the action, the side effect, and the follow-up tool. The asynchronous caveat is front-loaded in the second sentence exactly where an agent needs it before deciding what to do next.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, annotation-free, output-schema-free side-effecting tool, the essential facts an agent needs — it launches a UI, the user must act, the call returns early, and status must be polled via teams_status — are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline score applies; no parameter claims are made or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific action (open Chrome for Teams sign-in) applied to a specific resource, and makes clear this is an authentication flow rather than data access. The mention of teams_status as the follow-up distinguishes it from every listing/messaging sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the condition that selects this tool (a sign-in is needed) and explicitly routes the agent to teams_status afterwards, which is the correct next step. It stops short of stating the negative case, e.g. not to call it when a session already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_statusC
Check Teams session export and endpoint registry status
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, yet it discloses nothing about what the check returns, whether it is read-only, or what a failure/unauthenticated state looks like. For a status/diagnostic tool the absence of any return or condition indication is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no wasted words. It is terse to the point of under-specification, but structurally sound.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Zero parameters keeps complexity low, but with no annotations and no output schema, the description should say what a 'status' result tells the agent and how to act on it. It stops just short of that, leaving the agent to call it blind.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Schema coverage is also reported at 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a verb ('Check') and two objects ('Teams session export' and 'endpoint registry status'), which does separate it from siblings that all deal with chats/messages/files. However, 'session export' and 'endpoint registry' are unexplained internal jargon, so an agent cannot be sure what state is actually being inspected.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus the sibling tools (teams_login, list_chats, etc.) or what condition it diagnoses. The diagnostic intent is only implied by the word 'status'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileA
Send a local file to a chat: uploads it to your OneDrive Teams chat files folder, gives the chat members read access and posts it as a message (like Teams does). Use conversationId '48:notes' to send to yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | File name in Teams (defaults to the local file name) | |
| path | Yes | Local file path to upload | |
| text | No | Optional message text shown with the file | |
| conversationId | Yes | Chat conversation ID from list_chats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does well: it explains the destination (OneDrive Teams chat files folder), permission change (chat members get read access), and posting behavior. It omits auth requirements, size limits, overwrite behavior, and failure modes, so not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation is front-loaded in one sentence, followed by a compact special-case note. There is no wasted text, and the side effects are stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with full schema coverage and no output schema, the description covers purpose, destination, permissions, posting behavior, and a key special case. It leaves out return values, error behavior, and file-size constraints, but the definition is otherwise complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description adds meaningful semantics beyond the schema by explaining the special conversationId value '48:notes' for sending to yourself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Send a local file to a chat") and explains the full operation: upload to OneDrive, grant read access, and post as a message. This clearly distinguishes it from siblings like download_file and send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: sending a local file to a chat, plus a special case for self-sending via conversationId '48:notes'. It does not explicitly compare this to send_message or state when not to use it, but the intended use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
download_file - First observed
list_channels - First observed
list_chats - First observed
list_meetings - First observed
list_messages - First observed
search_messages - First observed
send_message - First observed
start_chat - First observed
teams_login - First observed
teams_status - First observed
upload_file
TDQS
Scored across 11 tools
Each tool targets a distinct Teams resource and action: chats, channels, messages, meetings, files, and session/auth handling. The closest pairs, list_chats vs list_channels and list_messages vs search_messages, are clearly separated by their descriptions and intended use.
Most names follow a readable snake_case verb_noun pattern such as list_chats, send_message, upload_file, and search_messages. The main deviation is teams_status and teams_login using a teams_ prefix instead of a verb, but the convention is still mostly predictable.
Eleven tools is well within a reasonable range for a Teams bridge and each tool maps to a concrete operation. Auth/status, discovery, messaging, files, and meetings are all represented without excessive fragmentation.
The surface covers core workflows: listing chats/channels/messages, sending and searching messages, starting chats, transferring files, and listing meetings. Some gaps remain around message edit/delete, channel creation, meeting creation/details, and member listing, but these are workable for the apparent bridge scope.
Maintenance
Related MCP Connectors
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
Workspace messaging: conversations, contacts, agents, and connected lines through scoped OAuth.
Read email/chat conversations, messages, contacts and teams; draft, send and update threads.
Agent-to-agent messaging: directory, public lobby, DMs, channels, search. Stateless MCP + REST.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Microsoft Teams through direct API calls, supporting message search, sending replies, managing favorites, and more without Azure AD registration.1,521 npm29MIT
- AlicenseAqualityDmaintenanceEnables AI agents to interact with Microsoft Teams through Microsoft Graph API, using delegated device-code authentication to act on behalf of the user.169 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to read conversations, send messages, and manage members in Microsoft Teams via the Teams Chat Service REST API.352 npm8MIT
- AlicenseAqualityAmaintenanceEnables agents to read Microsoft Teams data and, with elevated modes, post messages, reply in threads, and send chats via Microsoft Graph, with safe-by-default permission gates.941 npmMIT