teams-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TEAMS_MCP_SCOPES | No | Optional comma-separated scopes | |
| TEAMS_MCP_CLIENT_ID | Yes | App registration client ID | |
| TEAMS_MCP_TENANT_ID | Yes | Azure AD tenant ID |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_teamsA | List all Microsoft Teams you are a member of. Returns team id, name, and description for each team. Use a team_id with list_channels to see its channels. |
| list_channelsA | List channels in a Microsoft Teams team. Use list_teams first to get the team_id. Returns channel id, name, description, and membership type. |
| list_team_tagsA | List TEAM-level tags of a team (id, name, member count). Requires the TeamworkTag.Read delegated permission. These ids work as mention tag_ids in STANDARD channels. Shared channels have their own channel-scoped tags that Graph does not expose via any API - a team-level id posted there renders a phantom tag (no name, 0 members). For shared channels, reuse the tag id from the "mentions" entities of an existing message where a human @mentioned the tag. |
| list_chatsA | List recent chats with participant names. Does NOT include channel conversations - use list_teams + list_channels for those. Returns chat id, topic, type, and member names. |
| list_channel_messagesA | List recent top-level messages in a Teams channel. Use list_teams -> list_channels to get team_id and channel_id. Replies are not
included - read a thread with list_thread_replies. Returns up to |
| list_thread_repliesA | List replies in a channel message thread. Use list_channel_messages to get the parent message_id (a top-level message).
Returns the parent message followed by up to |
| list_chat_messagesA | List messages in a chat, newest first, a page at a time. Use list_chats to get the chat_id. Returns {"messages": [...], "next_before": ...}
with up to |
| get_messageA | Get one chat or channel message by its Teams link or by ids. link: a message link copied from Teams, shaped like https://teams.microsoft.com/l/message//?... Without a link, pass message_id with chat_id, or with team_id + channel_id (plus parent_message_id, the thread root id, for a reply in a channel thread). Returns where the message lives (chat_id, or team_id + channel_id and, for a reply, parent_message_id) and the message with id, sender, createdDateTime and content. To see what led up to a chat message, call list_chat_messages with before=. Pages come newest first, so for what followed pass after= together with a before a little later (an hour on, for example); after alone returns the newest messages of the chat. |
| send_channel_messageA | Send a message to a Teams channel. Use list_teams -> list_channels to get team_id and channel_id. For replies to existing messages, use reply_to_channel_message instead. content is plain text: newlines are kept and URLs become links; Markdown and HTML show literally. Each mention's "@" must appear in content exactly as given in name, or that mention is dropped without an error. mentions: optional JSON array of users or team tags to @mention. Format: [{"user_id": "...", "name": "Display Name"} | {"tag_id": "...", "name": "TagName"}] Get tag_id from list_team_tags (tags work only in channel messages). Use @DisplayName in content where the mention should appear. Get user_id from list_team_members, list_channel_members, or get_user. |
| send_chat_messageA | Send a message to a Teams chat. Use list_chats to get the chat_id. reply_to: optional message ID to reply to (shows as a quoted reply). Use list_chat_messages to get the message_id. content is plain text: newlines are kept and URLs become links; Markdown and HTML show literally. Each mention's "@" must appear in content exactly as given in name, or that mention is dropped without an error. mentions: optional JSON array of users to @mention: [{"user_id": "...", "name": "Display Name"}]. Team tags cannot be mentioned in chats. Get user_id from list_chat_members or get_user. Use @DisplayName in content where the mention should appear. |
| reply_to_channel_messageA | Reply to a message in a Teams channel thread. Use list_channel_messages to get the message_id to reply to. For new top-level messages, use send_channel_message instead. content is plain text: newlines are kept and URLs become links; Markdown and HTML show literally. Each mention's "@" must appear in content exactly as given in name, or that mention is dropped without an error. mentions: optional JSON array of users or team tags to @mention. Format: [{"user_id": "...", "name": "Display Name"} | {"tag_id": "...", "name": "TagName"}] Get tag_id from list_team_tags (tags work only in channel messages). Use @DisplayName in content where the mention should appear. |
| create_chatA | Send a message in the 1:1 chat with a user, creating the chat if needed. If a 1:1 chat with this user already exists, Graph returns it, so there is no need to look it up with list_chats first. Returns chat_id and the sent message. user_email: the user's sign-in address (userPrincipalName) or user id from get_user; a mail alias that differs from the sign-in address may not resolve. |
| list_team_membersA | List members of a Microsoft Teams team. Returns member id, display name, email, and roles (owner/member). Use list_teams to get the team_id. |
| list_channel_membersA | List members of a specific channel. Returns member id, display name, email, and roles. Use list_channels to get the channel_id. |
| list_chat_membersB | List members of a chat. Returns member id, display name, email, and roles. Use list_chats to get the chat_id. |
| delete_messageA | Soft-delete a message you sent. For channel messages: provide team_id + channel_id + message_id. For chat messages: provide chat_id + message_id. Works on top-level channel messages and on chat messages; channel thread replies are not supported (Graph addresses them under their parent message). Other members then see "This message has been deleted"; this server has no undo tool. |
| update_messageA | Edit a message you sent. For channel messages: provide team_id + channel_id + message_id. For chat messages: provide chat_id + message_id. Works on top-level channel messages and on chat messages; channel thread replies are not supported (Graph addresses them under their parent message). Replaces the whole body with plain-text content; @mentions cannot be added on edit and existing ones become plain text. Only available in Global cloud (not GCC/DOD). |
| set_reactionA | React to a message with an emoji. For channel messages: provide team_id + channel_id + message_id. For chat messages: provide chat_id + message_id. Works on top-level channel messages and on chat messages; channel thread replies are not supported (Graph addresses them under their parent message). Common reactions: like, angry, sad, laugh, heart, surprised. Custom reactions: any unicode emoji. |
| unset_reactionA | Remove a reaction from a message. For channel messages: provide team_id + channel_id + message_id. For chat messages: provide chat_id + message_id. Works on top-level channel messages and on chat messages; channel thread replies are not supported (Graph addresses them under their parent message). |
| create_group_chatA | Create a new group chat with you and at least two other users. For one other person use create_chat. Every call creates a new chat; Graph does not reuse an existing group chat with the same members. member_emails: comma-separated sign-in addresses of the other members (e.g. "a@org.com, b@org.com"). topic: optional chat topic/name. message: optional first message to send. |
| pin_messageA | Pin a message in a chat. Only works in chats, not channels. Use list_chat_messages to get the message_id. |
| unpin_messageA | Unpin a message from a chat. Use list_pinned_messages to get the pinned_message_info_id (NOT the message_id). |
| list_pinned_messagesB | List pinned messages in a chat. Returns pinned message info including the message content. Use list_chats to get the chat_id. |
| mark_chat_readB | Mark a chat as read for the current user. Use list_chats to get the chat_id. |
| mark_chat_unreadB | Mark a chat as unread for the current user. last_message_read_date_time: ISO 8601 timestamp of the last message that should be considered as read (e.g. "2026-03-26T10:00:00Z"). Messages after this timestamp will appear as unread. |
| get_user_presenceA | Get the presence/availability status of a user. Returns availability (Available, Busy, DoNotDisturb, Away, Offline, etc.) and activity (InACall, InAMeeting, Presenting, etc.). Get the user_id from list_team_members, list_chat_members, or get_user. |
| search_messagesA | Search Teams messages in all chats and channels the signed-in user can see. Matches message content, including attachments (Microsoft Search). Returns up to
|
| get_userA | Find users whose display name or email address starts with Prefix match only (Graph startsWith on displayName or mail): a surname or a
fragment from the middle of a name finds nothing. Returns up to |
| download_attachmentA | Download an inline image (hosted content) from a message. For channel messages: provide team_id + channel_id + message_id.
For content inside a channel REPLY: additionally pass parent_message_id
(the thread root id) - Graph serves reply content only under
/messages/{parent}/replies/{reply}.
For chat messages: provide chat_id + message_id.
hosted_content_id: from the hostedContents array in message data.
Returns the local file path to the downloaded image. File attachments listed under
|
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 29 tools
Most tools target a distinct resource+action pair and descriptions actively guide selection (e.g. list_channel_messages vs list_thread_replies, send_channel_message vs reply_to_channel_message). The main overlap is create_chat vs send_chat_message, since create_chat is really a send-to-1:1 operation and could be confused with the general chat sender. Otherwise boundaries are clear.
All 29 tools use a predictable snake_case verb_noun convention (list_*, get_*, send_*, create_*, delete_*, update_*, set_/unset_*, pin_/unpin_*, mark_*). Verb pairs like pin/unpin and set/unset are symmetric and readable. No camelCase or mixed conventions appear.
29 tools is on the heavy side for a single server and pushes past the comfortable range, even though Teams is a genuinely broad domain. Each tool is fairly granular (separate read/unread, pin/unpin, set/unset reaction), so consolidation would be possible. The count is borderline rather than clearly wrong.
The messaging lifecycle is well covered: discovery, reading, sending, replying, editing, deleting, reactions, pins, read state, presence, members and attachment download. Minor gaps exist (edit/delete/reaction on channel thread replies are explicitly unsupported, and file/SharePoint attachments cannot be downloaded), but agents can work around them.