Skip to main content
Glama

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

teams_status

Session and registry status

teams_login

Opens Chrome so you can sign in; session is saved automatically

list_chats

Recent chats, meeting chats and channels, newest first

list_channels

Your teams and their channels

list_messages

Messages of a chat or channel, including attached files; olderCursor fetches the next older page

send_message

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); replyToMessageId replies in a channel thread. Markdown (bold, italic, strike, code, links, lists) becomes Teams formatting, @name@contoso.com mentions that person. Returns the messageId

edit_message

Change the text of one of your messages, attachments stay

react_message

Add a reaction (like, heart, laugh, surprised, sad, angry)

start_chat

Start or reopen a chat by e-mail address

search_messages

Search across chats and channels

upload_file

Upload a local file to your OneDrive and post it into a chat

download_file

Download a file from a message (SharePoint or OneDrive links only, up to 250 MB)

list_meetings

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-core drives 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 itself

Prefer 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

--onedrive-host

TEAMS_ONEDRIVE_HOST

detected at sign-in

Your OneDrive host for upload_file, e.g. contoso-my.sharepoint.com. Set it only if detection fails: open OneDrive in the browser and copy the host from the address bar.

--region

TEAMS_REGION

detected, else emea

Chat service region of your tenant, e.g. emea, amer or apac.

--partition

TEAMS_PARTITION

detected, else emea-02

Middle-tier partition used for profiles and meetings.

--chat-files-folder

TEAMS_CHAT_FILES_FOLDER

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

TEAMS_BROWSER

chrome

Browser for sign-in: chrome or msedge

--session-file

TEAMS_SESSION_FILE

data/session.json

Different session location

--endpoints-file

TEAMS_ENDPOINTS_FILE

data/endpoints.json

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.js

Claude 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_status

This 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:

  1. 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.

  2. npm run capture -- --label messages

  3. Do the action in Teams (open a channel, send a message, page back).

  4. After each action set a marker: npm run mark -- "sent message in channel X"

  5. Stop with Ctrl+C. The requests are in captures/messages-<timestamp>.jsonl.

  6. Copy the relevant request into data/endpoints.json and 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} in url is replaced by the environment variable (see Configuration)

  • {name} in url is a path parameter; all other parameters go into the query string

  • auth: cookie, bearer, cookie+bearer or none

  • bearer needs tokenSource: the audience of a token captured at sign-in (e.g. https://ic3.teams.office.com) or a cookie name

  • headers values containing {uuid} get a fresh UUID per request

Security

  • data/session.json holds 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_file and start_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_file uses a single PUT, which SharePoint caps at 250 MB.

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.

Impressum: https://godmodeai2025.github.io/MarkZimmermann/

Available Tools

11 tools
download_fileC

Download a file from a conversation to a local path

NameRequiredDescriptionDefault
outPathYesLocal output path
fileReferenceYesfileReference (SharePoint/OneDrive URL) from list_messages files[]

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)

NameRequiredDescriptionDefault
teamIdNoOnly this team (id from a previous call)

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

NameRequiredDescriptionDefault
limitNoMax conversations (default 50)

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

NameRequiredDescriptionDefault
daysNoHow many days ahead (default 7)

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

NameRequiredDescriptionDefault
kindNochannel
limitNo
cursorNoPagination cursor from previous result
conversationIdYesChannel or chat conversation ID

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

NameRequiredDescriptionDefault
kindNochannel
textYesMessage text (markdown as supported by Teams)
conversationIdYesConversation ID from list_chats, list_channels or start_chat
replyToMessageIdNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
topicNoGroup chat name
emailsYesE-mail addresses of the other participants

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
nameNoFile name in Teams (defaults to the local file name)
pathYesLocal file path to upload
textNoOptional message text shown with the file
conversationIdYesChat conversation ID from list_chats

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 11 tool updatesv0.1.0
    • First observeddownload_file
    • First observedlist_channels
    • First observedlist_chats
    • First observedlist_meetings
    • First observedlist_messages
    • First observedsearch_messages
    • First observedsend_message
    • First observedstart_chat
    • First observedteams_login
    • First observedteams_status
    • First observedupload_file

TDQS

A3.5/5.0

Scored across 11 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers