<!-- Generated by `just docs` from catalog/toolkits/microsoft_teams.yaml, catalog/expansions/microsoft_teams.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Microsoft Teams

Chat and meetings. Send channel and chat messages, work with teams and their membership, and schedule online meetings.

| Property | Value |
| --- | --- |
| Slug | `microsoft_teams` |
| Definition version | `0.1.0` |
| Base URL | `https://graph.microsoft.com/v1.0` |
| Auth schemes | `oauth2` |
| Action tools | 38 |
| By class | 19 read, 12 write, 7 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

59 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 38 cases written by hand and 18 cases from the paraphrase pass, plus 3 context cases whose intent names no app and is decided by the session. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 39/59 | 66.1% |
| top-8 | 57/59 | 96.6% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://login.microsoftonline.com/common/oauth2/v2.0/authorize` |
| Token URL | `https://login.microsoftonline.com/common/oauth2/v2.0/token` |
| Default scopes | `Chat.ReadWrite`, `ChannelMessage.Send`, `Team.ReadBasic.All`, `offline_access` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

## Tools

38 action tools. The catalog-wide slug is `microsoft_teams.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `microsoft_teams.list_chats`

List the connected account's Microsoft Teams chats: 1:1 conversations, group chats, and meeting chats. Use to browse recent chats or find a chat id by its topic before sending a message. For a team's channels instead of chats, use list_channels.

Class `read` (reads only). Scopes `Chat.Read`. Calls `GET /me/chats`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `filter` | string | no | Raw OData $filter expression, e.g. "chatType eq 'group'". |
| `top` | integer | no | Page size, default 20. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `@odata.nextLink` | string |  |
| `value` | array of object |  |
| `value[].chatType` | string |  |
| `value[].createdDateTime` | string |  |
| `value[].id` | string |  |
| `value[].lastUpdatedDateTime` | string |  |
| `value[].topic` | string |  |

Also retrieved by: "show me my recent conversations in Microsoft Teams", "what dms do I have open in Teams", "pull up who I've been talking to on Teams lately", "browse my Teams direct messages", "see all my Teams one on ones and group threads".

### `microsoft_teams.get_chat`

Get one Microsoft Teams chat's details by chat id: its topic, type (one-on-one, group, or meeting), and when it was created. Use after list_chats to confirm which chat you have, or before send_chat_message when the chat id is already known.

Class `read` (reads only). Scopes `Chat.Read`. Calls `GET /chats/{{params.chat_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id from list_chats. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `chatType` | string |  |
| `createdDateTime` | string |  |
| `id` | string |  |
| `topic` | string |  |
| `webUrl` | string |  |

Also retrieved by: "what is this Teams thread actually about", "who's in this particular Teams conversation", "pull up the details on that Teams dm", "check when this Microsoft Teams conversation started".

### `microsoft_teams.create_chat`

Start a new Microsoft Teams chat: a 1:1 direct message or a group chat with several people. Use when the user wants to message, start a conversation with, or set up a group chat with specific people who do not already share a chat. Returns the chat id to pass to send_chat_message. To message inside a team channel instead, use send_channel_message.

Class `write` (writes, no confirmation needed). Scopes `Chat.ReadWrite`. Calls `POST /chats`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_type` | string, one of oneOnOne, group | **yes** | "oneOnOne" for two people, "group" for three or more. |
| `members` | array of object | **yes** | Chat members in Graph's conversationMember shape, e.g. [{"@odata.type": "#microsoft.graph.aadUserConversationMember", "roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('priya@acme.com')"}]. Every chat, including a 1:1, must include the connected account itself as a member. |
| `topic` | string | no | Group chat name. Ignored for oneOnOne; required for group. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `chatType` | string |  |
| `id` | string |  |
| `webUrl` | string |  |

Also retrieved by: "start a new Teams conversation with a coworker", "kick off a Microsoft Teams group thread with a few people", "get a Teams dm going with someone", "set up a side conversation in Teams outside any team", "open a direct line with the design lead on Microsoft Teams".

### `microsoft_teams.send_chat_message`

Send a message in a Microsoft Teams chat. Use when the user wants to message, tell, or reply to a person or group in Teams chat, not a channel. Content can be plain text or simple HTML. For a channel instead of a chat, use send_channel_message.

Class `write` (writes, no confirmation needed). Scopes `ChatMessage.Send`. Calls `POST /chats/{{params.chat_id}}/messages`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id from list_chats or create_chat. |
| `content` | string | **yes** | Message text or HTML. |
| `content_type` | string, one of text, html | no | Format of content. Default text. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `body` | object |  |
| `body.content` | string |  |
| `body.contentType` | string |  |
| `createdDateTime` | string |  |
| `id` | string |  |

Also retrieved by: "ping someone directly in Microsoft Teams, not a channel", "drop a quick note to a coworker on Teams", "reply to that person in our private Teams thread", "let them know one on one over Microsoft Teams", "shoot someone a message on Teams".

### `microsoft_teams.list_chat_messages`

Fetch recent messages from a Microsoft Teams chat, newest first. Use when the user wants to read, catch up on, or summarize a Teams chat. For a channel's messages instead, use list_channel_messages.

Class `read` (reads only). Scopes `Chat.Read`. Calls `GET /chats/{{params.chat_id}}/messages`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id to read from. |
| `top` | integer | no | Page size, default 20. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `@odata.nextLink` | string |  |
| `value` | array of object |  |
| `value[].body` | object |  |
| `value[].body.content` | string |  |
| `value[].body.contentType` | string |  |
| `value[].createdDateTime` | string |  |
| `value[].from` | object |  |
| `value[].from.user` | object |  |
| `value[].id` | string |  |

Also retrieved by: "catch me up on what we've been discussing on Teams", "pull the history of this Microsoft Teams conversation", "what has this person been saying lately on Teams", "scroll back through our recent Teams back and forth".

### `microsoft_teams.update_chat_message`

Edit the text of a message already posted in a Microsoft Teams chat. Use when the user wants to fix, correct, or change something they already sent in a chat. Identify the message by its chat and message id. For a channel message instead, there is no equivalent edit tool here; channel messages are edited in the Teams client.

Class `write` (writes, no confirmation needed). Scopes `Chat.ReadWrite`. Calls `PATCH /chats/{{params.chat_id}}/messages/{{params.message_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id containing the message. |
| `content` | string | **yes** | Replacement message text or HTML. |
| `content_type` | string, one of text, html | no | Format of content. Default text. |
| `message_id` | string | **yes** | Message id to edit, from list_chat_messages. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `lastEditedDateTime` | string |  |

Also retrieved by: "fix a typo in something I sent them on Teams", "reword what I already told them in Microsoft Teams", "correct what I typed in our Teams conversation", "clean up the wording of my last Teams note".

### `microsoft_teams.delete_chat_message`

Delete a message from a Microsoft Teams chat. Use when the user wants to remove, retract, or take back something they posted in a chat. Identify the message by its chat and message id. Permanent; the message cannot be restored.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `Chat.ReadWrite`. Calls `POST /chats/{{params.chat_id}}/messages/{{params.message_id}}/softDelete`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id containing the message. |
| `message_id` | string | **yes** | Message id to delete, from list_chat_messages. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "take back something I sent on Teams by accident", "erase that Microsoft Teams note I regret sending", "pull down what I just typed to them in Teams", "undo a Teams message I fired off too fast".

### `microsoft_teams.list_chat_members`

List the members of a Microsoft Teams chat: who is in a 1:1 or group chat and their roles. Use when the user asks who is in a chat. For a channel's members instead, use list_channel_members.

Class `read` (reads only). Scopes `ChatMember.Read`. Calls `GET /chats/{{params.chat_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id to list members of. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].displayName` | string |  |
| `value[].email` | string |  |
| `value[].id` | string |  |
| `value[].roles` | array of string |  |
| `value[].userId` | string |  |

Also retrieved by: "who's actually in this Microsoft Teams group thread", "see everyone on this Teams conversation", "how many people are on this Teams dm".

### `microsoft_teams.add_chat_member`

Add a person to an existing Microsoft Teams group chat. Use when the user wants to add, invite, or bring someone into a chat that already exists. For a brand-new chat, use create_chat instead.

Class `write` (writes, no confirmation needed). Scopes `ChatMember.ReadWrite`. Calls `POST /chats/{{params.chat_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id to add the person to. |
| `roles` | array of string | **yes** | [] for an ordinary chat member, ["owner"] for an owner. A group chat has no owners, so [] is the usual value. |
| `user` | string | **yes** | The person to add, as their Entra user id or user principal name, e.g. "priya@acme.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `roles` | array of string |  |

Also retrieved by: "loop someone into this Microsoft Teams conversation", "bring another coworker into the Teams thread", "invite a person into this Teams group dm".

### `microsoft_teams.remove_chat_member`

Remove a person from a Microsoft Teams group chat. Use when the user wants to remove or take someone out of a group chat. The person loses access to the chat immediately. Cannot be used on a 1:1 chat.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `ChatMember.ReadWrite`. Calls `DELETE /chats/{{params.chat_id}}/members/{{params.membership_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `chat_id` | string | **yes** | Chat id to remove the person from. |
| `membership_id` | string | **yes** | Membership id from list_chat_members, not the person's user id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "take someone out of this Microsoft Teams group thread", "drop a person from this Teams conversation", "cut someone out of the Teams dm".

### `microsoft_teams.list_joined_teams`

List the Microsoft Teams teams the connected account belongs to. Use to browse teams or resolve a team's display name to its id before calling list_channels or another team-scoped tool.

Class `read` (reads only). Scopes `Team.ReadBasic.All`. Calls `GET /me/joinedTeams`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].description` | string |  |
| `value[].displayName` | string |  |
| `value[].id` | string |  |

Also retrieved by: "what Microsoft Teams teams am I actually part of", "show every Teams workspace I belong to", "browse my teams in the Microsoft Teams app".

### `microsoft_teams.get_team`

Get one Microsoft Teams team's details by team id: display name, description, visibility, and whether it is archived. Use when the user asks about a specific team rather than a channel inside it.

Class `read` (reads only). Scopes `Team.ReadBasic.All`. Calls `GET /teams/{{params.team_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `team_id` | string | **yes** | Team id from list_joined_teams. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `description` | string |  |
| `displayName` | string |  |
| `id` | string |  |
| `isArchived` | boolean |  |
| `visibility` | string |  |

Also retrieved by: "tell me about this particular Microsoft Teams team", "is this Teams team still active", "pull up the info on that Microsoft Teams workspace".

### `microsoft_teams.archive_team`

Archive a Microsoft Teams team, making it read-only for every member: no new posts, and channel files locked. Use when the user wants to archive, retire, or freeze a team for good. Reversible only through a separate unarchive call outside this toolkit, and it disrupts every member immediately.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `TeamSettings.ReadWrite.All`. Calls `POST /teams/{{params.team_id}}/archive`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `set_spo_site_read_only` | boolean | no | Also make the team's SharePoint site read-only for members. Default false. |
| `team_id` | string | **yes** | Team id to archive. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `archived` | boolean |  |

Also retrieved by: "freeze this Microsoft Teams team, we're done with it", "shut this Teams team down for good", "retire this Microsoft Teams workspace, nobody needs it anymore", "lock this Teams team so nobody can post".

### `microsoft_teams.list_team_members`

List everyone on a Microsoft Teams team, with their roles. Use when the user asks who is on a team, as opposed to one channel within it; for a channel's members, use list_channel_members.

Class `read` (reads only). Scopes `TeamMember.Read.All`. Calls `GET /teams/{{params.team_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `team_id` | string | **yes** | Team id to list members of. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].displayName` | string |  |
| `value[].email` | string |  |
| `value[].id` | string |  |
| `value[].roles` | array of string |  |
| `value[].userId` | string |  |

Also retrieved by: "who's on this whole Microsoft Teams team", "see the full roster for this Teams workspace", "how many people belong to this team in Microsoft Teams".

### `microsoft_teams.add_team_member`

Add a person to a Microsoft Teams team. Use when the user wants to add, invite, or bring someone onto a whole team rather than into one channel. For one private channel only, use add_channel_member instead.

Class `write` (writes, no confirmation needed). Scopes `TeamMember.ReadWrite.All`. Calls `POST /teams/{{params.team_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `roles` | array of string | **yes** | [] for an ordinary team member, ["owner"] for a team owner. |
| `team_id` | string | **yes** | Team id to add the person to. |
| `user` | string | **yes** | The person to add, as their Entra user id or user principal name, e.g. "priya@acme.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `roles` | array of string |  |

Also retrieved by: "bring a new hire onto the Microsoft Teams team", "add someone to the whole Teams workspace", "get this person into every Microsoft Teams channel here".

### `microsoft_teams.remove_team_member`

Remove a person from a Microsoft Teams team. Use when the user wants to remove, kick, or take someone off a whole team. They lose access to every channel in the team immediately.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `TeamMember.ReadWrite.All`. Calls `DELETE /teams/{{params.team_id}}/members/{{params.membership_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `membership_id` | string | **yes** | Membership id from list_team_members, not the person's user id. |
| `team_id` | string | **yes** | Team id to remove the person from. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "take someone off the whole Microsoft Teams team", "offboard this person from the Teams workspace", "cut this coworker out of everything in Microsoft Teams".

### `microsoft_teams.list_channels`

List the channels in a Microsoft Teams team. Use to browse a team's channels or find a channel id from its name before reading or posting messages. For chats outside any team, use list_chats.

Class `read` (reads only). Scopes `Channel.ReadBasic.All`. Calls `GET /teams/{{params.team_id}}/channels`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `team_id` | string | **yes** | Team id from list_joined_teams. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].description` | string |  |
| `value[].displayName` | string |  |
| `value[].id` | string |  |
| `value[].membershipType` | string |  |

Also retrieved by: "what channels does this Microsoft Teams team have", "browse the rooms inside this Teams workspace", "show me every topic area in this Teams team".

### `microsoft_teams.get_channel`

Get one Microsoft Teams channel's details: display name, description, membership type (standard or private), and its web link. Use when the user asks about a specific channel.

Class `read` (reads only). Scopes `Channel.ReadBasic.All`. Calls `GET /teams/{{params.team_id}}/channels/{{params.channel_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id from list_channels. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `description` | string |  |
| `displayName` | string |  |
| `id` | string |  |
| `membershipType` | string |  |
| `webUrl` | string |  |

Also retrieved by: "what's this particular Microsoft Teams room about", "tell me the details on that Teams channel", "is this Microsoft Teams channel private or open to everyone".

### `microsoft_teams.create_channel`

Create a new channel in a Microsoft Teams team. Use when the user wants to make, start, or set up a new channel. Standard channels are visible to the whole team; a private channel is visible only to the members it is created with.

Class `write` (writes, no confirmation needed). Scopes `Channel.Create`. Calls `POST /teams/{{params.team_id}}/channels`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | Optional description of what the channel is for. |
| `display_name` | string | **yes** | Channel name, e.g. "Incident Response". |
| `membership_type` | string, one of standard, private | no | standard is visible to the whole team. Default standard. |
| `team_id` | string | **yes** | Team id to create the channel in. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `displayName` | string |  |
| `id` | string |  |
| `webUrl` | string |  |

Also retrieved by: "set up a new Microsoft Teams topic area for the team", "make a private Teams room for a smaller group", "spin up a channel for this project on Microsoft Teams".

### `microsoft_teams.update_channel`

Rename a Microsoft Teams channel or change its description. Use when the user wants to rename, retitle, or update what a channel is called or about. Does not change its membership type or delete it.

Class `write` (writes, no confirmation needed). Scopes `ChannelSettings.ReadWrite.All`. Calls `PATCH /teams/{{params.team_id}}/channels/{{params.channel_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to update. |
| `description` | string | no | New description text. |
| `display_name` | string | no | New channel name. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `description` | string |  |
| `displayName` | string |  |
| `id` | string |  |

Also retrieved by: "rename this Microsoft Teams room to something clearer", "fix the description on this Teams channel", "retitle that Microsoft Teams topic area".

### `microsoft_teams.delete_channel`

Permanently delete a channel from a Microsoft Teams team, its messages included. Use when the user wants to delete or remove a channel for good, not just archive the team. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `Channel.Delete.All`. Calls `DELETE /teams/{{params.team_id}}/channels/{{params.channel_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to delete. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "get rid of this Microsoft Teams channel for good", "wipe out this Teams room entirely", "remove this Microsoft Teams topic area and its history".

### `microsoft_teams.list_channel_members`

List the members of one Microsoft Teams channel, most relevant for a private channel where membership differs from the team. Use when the user asks who is in a channel. For the whole team's members, use list_team_members.

Class `read` (reads only). Scopes `ChannelMember.Read.All`. Calls `GET /teams/{{params.team_id}}/channels/{{params.channel_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to list members of. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].displayName` | string |  |
| `value[].email` | string |  |
| `value[].id` | string |  |
| `value[].roles` | array of string |  |
| `value[].userId` | string |  |

Also retrieved by: "who has access to this private Microsoft Teams room", "see everyone allowed in this Teams channel", "check the membership on this Microsoft Teams topic area".

### `microsoft_teams.add_channel_member`

Give a person access to one Microsoft Teams channel by adding them to it. Use when the user wants to add someone to a single, usually private, channel rather than the whole team. Standard channels are open to every team member already; this tool matters most for private channels. For the whole team, use add_team_member.

Class `write` (writes, no confirmation needed). Scopes `ChannelMember.ReadWrite.All`. Calls `POST /teams/{{params.team_id}}/channels/{{params.channel_id}}/members`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to add the person to. |
| `roles` | array of string | **yes** | [] for an ordinary channel member, ["owner"] for a channel owner. |
| `team_id` | string | **yes** | Team id containing the channel. |
| `user` | string | **yes** | The person to add, as their Entra user id or user principal name, e.g. "priya@acme.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `roles` | array of string |  |

Also retrieved by: "give someone access to this private Microsoft Teams room", "let a person into just this one Teams channel", "add a teammate to this specific Microsoft Teams topic area".

### `microsoft_teams.remove_channel_member`

Remove a person from one Microsoft Teams channel, most relevant for a private channel. Use when the user wants to remove or take someone out of a channel specifically. The rest of the team is unaffected unless also removed with remove_team_member.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `ChannelMember.ReadWrite.All`. Calls `DELETE /teams/{{params.team_id}}/channels/{{params.channel_id}}/members/{{params.membership_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to remove the person from. |
| `membership_id` | string | **yes** | Membership id from list_channel_members, not the person's user id. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "pull someone's access to just this Microsoft Teams room", "take a person out of this one Teams channel", "revoke access to this private Microsoft Teams topic area".

### `microsoft_teams.send_channel_message`

Post a new top-level message in a Microsoft Teams channel. Use when the user wants to post, announce, or share something with a whole channel, not a single person. For a reply inside an existing thread, use reply_to_channel_message; for a chat instead of a channel, use send_chat_message.

Class `write` (writes, no confirmation needed). Scopes `ChannelMessage.Send`. Calls `POST /teams/{{params.team_id}}/channels/{{params.channel_id}}/messages`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to post in. |
| `content` | string | **yes** | Message text or HTML. |
| `content_type` | string, one of text, html | no | Format of content. Default text. |
| `subject` | string | no | Optional bold subject line shown above the message. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `createdDateTime` | string |  |
| `id` | string |  |
| `subject` | string |  |
| `webUrl` | string |  |

Also retrieved by: "post something in Microsoft Teams for the whole team to see", "announce this in the group's main Teams room", "drop an update in the project channel on Microsoft Teams".

### `microsoft_teams.list_channel_messages`

Fetch recent top-level messages from a Microsoft Teams channel, newest first. Use when the user wants to read, catch up on, or summarize a channel. Returns top-level posts only; use list_message_replies for the replies under one of them.

Class `read` (reads only). Scopes `ChannelMessage.Read.All`. Calls `GET /teams/{{params.team_id}}/channels/{{params.channel_id}}/messages`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id to read from. |
| `team_id` | string | **yes** | Team id containing the channel. |
| `top` | integer | no | Page size, default 20. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `@odata.nextLink` | string |  |
| `value` | array of object |  |
| `value[].body` | object |  |
| `value[].body.content` | string |  |
| `value[].body.contentType` | string |  |
| `value[].createdDateTime` | string |  |
| `value[].from` | object |  |
| `value[].from.user` | object |  |
| `value[].id` | string |  |
| `value[].subject` | string |  |

Also retrieved by: "what's been posted in this Microsoft Teams room lately", "catch me up on the Teams channel's activity", "show recent posts in this Microsoft Teams topic area".

### `microsoft_teams.get_channel_message`

Get one Microsoft Teams channel message's full content by message id: sender, subject, body, and link. Use after list_channel_messages to read a specific post in full.

Class `read` (reads only). Scopes `ChannelMessage.Read.All`. Calls `GET /teams/{{params.team_id}}/channels/{{params.channel_id}}/messages/{{params.message_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id containing the message. |
| `message_id` | string | **yes** | Message id from list_channel_messages. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `body` | object |  |
| `body.content` | string |  |
| `body.contentType` | string |  |
| `createdDateTime` | string |  |
| `from` | object |  |
| `from.user` | object |  |
| `from.user.displayName` | string |  |
| `from.user.id` | string |  |
| `id` | string |  |
| `subject` | string |  |
| `webUrl` | string |  |

Also retrieved by: "pull up that specific Microsoft Teams post in full", "read the whole thing someone posted in Teams", "open that Microsoft Teams update in detail".

### `microsoft_teams.reply_to_channel_message`

Reply inside the thread under an existing Microsoft Teams channel message. Use when the user wants to reply, respond, or comment on a specific post rather than start a new one. For a brand-new top-level post, use send_channel_message.

Class `write` (writes, no confirmation needed). Scopes `ChannelMessage.Send`. Calls `POST /teams/{{params.team_id}}/channels/{{params.channel_id}}/messages/{{params.message_id}}/replies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id containing the parent message. |
| `content` | string | **yes** | Reply text or HTML. |
| `content_type` | string, one of text, html | no | Format of content. Default text. |
| `message_id` | string | **yes** | Parent message id to reply to, from list_channel_messages. |
| `team_id` | string | **yes** | Team id containing the channel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `createdDateTime` | string |  |
| `id` | string |  |

Also retrieved by: "respond under that post in Microsoft Teams", "comment on what someone shared in the Teams channel", "answer back in that Microsoft Teams thread".

### `microsoft_teams.list_message_replies`

Fetch the replies under one Microsoft Teams channel message, the parent included. Use when the user wants to read a thread or its replies. For a channel's top-level posts, use list_channel_messages.

Class `read` (reads only). Scopes `ChannelMessage.Read.All`. Calls `GET /teams/{{params.team_id}}/channels/{{params.channel_id}}/messages/{{params.message_id}}/replies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `channel_id` | string | **yes** | Channel id containing the parent message. |
| `message_id` | string | **yes** | Parent message id, from list_channel_messages. |
| `team_id` | string | **yes** | Team id containing the channel. |
| `top` | integer | no | Page size, default 20. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].body` | object |  |
| `value[].body.content` | string |  |
| `value[].body.contentType` | string |  |
| `value[].createdDateTime` | string |  |
| `value[].from` | object |  |
| `value[].from.user` | object |  |
| `value[].id` | string |  |

Also retrieved by: "what did people say back on that post in Microsoft Teams", "pull up the responses under that Teams update", "read the thread under that message on Microsoft Teams".

### `microsoft_teams.create_meeting`

Schedule a new Microsoft Teams online meeting for the connected account. Use when someone wants to set up, schedule, or book a Teams video call or meeting. Returns the joinWebUrl to share with attendees. To update it afterward, use update_meeting.

Class `write` (writes, no confirmation needed). Scopes `OnlineMeetings.ReadWrite`. Calls `POST /me/onlineMeetings`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `end_date_time` | string | **yes** | Meeting end, RFC 3339. |
| `start_date_time` | string | **yes** | Meeting start, RFC 3339, e.g. "2026-08-04T15:00:00Z". |
| `subject` | string | no | Meeting title, e.g. "Q3 planning". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `endDateTime` | string |  |
| `id` | string |  |
| `joinWebUrl` | string |  |
| `startDateTime` | string |  |
| `subject` | string |  |

Also retrieved by: "set up a Microsoft Teams video call with the team", "book a Teams call for tomorrow afternoon", "get a Teams video conference on the calendar", "schedule time to talk over video in Microsoft Teams".

### `microsoft_teams.get_meeting`

Get a Microsoft Teams online meeting's details by meeting id: subject, scheduled time, and its joinWebUrl. Use when the user asks about a meeting they already scheduled through create_meeting.

Class `read` (reads only). Scopes `OnlineMeetings.Read`. Calls `GET /me/onlineMeetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Online meeting id from create_meeting. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `endDateTime` | string |  |
| `id` | string |  |
| `joinWebUrl` | string |  |
| `startDateTime` | string |  |
| `subject` | string |  |

Also retrieved by: "pull up the link for that Microsoft Teams video call", "what time is that Teams call I booked", "check the details on that scheduled Microsoft Teams call".

### `microsoft_teams.update_meeting`

Change the subject or time of an already-scheduled Microsoft Teams online meeting. Use when the user wants to reschedule, retitle, or move a meeting they already set up. To cancel it instead, use cancel_meeting.

Class `write` (writes, no confirmation needed). Scopes `OnlineMeetings.ReadWrite`. Calls `PATCH /me/onlineMeetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `end_date_time` | string | no | New end time, RFC 3339. |
| `meeting_id` | string | **yes** | Online meeting id to update. |
| `start_date_time` | string | no | New start time, RFC 3339. |
| `subject` | string | no | New meeting title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `endDateTime` | string |  |
| `id` | string |  |
| `startDateTime` | string |  |
| `subject` | string |  |

Also retrieved by: "push that Microsoft Teams call back an hour", "retitle the Teams video call I set up", "move that Microsoft Teams meeting to a different time".

### `microsoft_teams.cancel_meeting`

Cancel a Microsoft Teams online meeting that was already set up. Use when the user wants to cancel, call off, or delete a meeting they no longer need. Irreversible; attendees keep whatever calendar invite they already have unless cancelled separately.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `OnlineMeetings.ReadWrite`. Calls `DELETE /me/onlineMeetings/{{params.meeting_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Online meeting id to cancel. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "call off the Microsoft Teams video meeting", "scrap that Teams call, we don't need it", "take that Microsoft Teams meeting off the calendar".

### `microsoft_teams.list_meeting_transcripts`

List the transcripts generated for a past Microsoft Teams meeting. Use when the user wants the transcript, notes, or a written record of what was said in a meeting that already happened. Requires transcription to have been turned on during the meeting.

Class `read` (reads only). Scopes `OnlineMeetingTranscript.Read.All`. Calls `GET /me/onlineMeetings/{{params.meeting_id}}/transcripts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `meeting_id` | string | **yes** | Online meeting id the transcript belongs to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].createdDateTime` | string |  |
| `value[].id` | string |  |

Also retrieved by: "what was actually said on that Microsoft Teams call", "pull up the written record of that Teams meeting", "get me the notes from that Microsoft Teams video call".

### `microsoft_teams.get_user`

Get a Microsoft Teams person's directory details by Graph user id or userPrincipalName: display name, email, and job title. Use when the user asks who someone is. If you only have an email address and not a directory id, use find_user_by_email.

Class `read` (reads only). Scopes `User.ReadBasic.All`. Calls `GET /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `user_id` | string | **yes** | Graph user id or userPrincipalName, e.g. "priya@acme.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `displayName` | string |  |
| `id` | string |  |
| `jobTitle` | string |  |
| `mail` | string |  |
| `userPrincipalName` | string |  |

Also retrieved by: "who is this person in the Microsoft Teams directory", "look up someone's title and email in Teams", "pull up a coworker's Microsoft Teams profile".

### `microsoft_teams.find_user_by_email`

Find a person in the Microsoft Teams directory by email address. Use when the user identifies someone by email, or when a member or chat tool needs a Graph user id and only an email address is known.

Class `read` (reads only). Scopes `User.ReadBasic.All`. Calls `GET /users`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | **yes** | The email address to look up, e.g. "priya@acme.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].displayName` | string |  |
| `value[].id` | string |  |
| `value[].mail` | string |  |
| `value[].userPrincipalName` | string |  |

Also retrieved by: "match this email address to a real person in Microsoft Teams", "whose Teams account is this address", "figure out who in Microsoft Teams owns this email".

### `microsoft_teams.get_user_presence`

Check whether a person is currently available, busy, or away in Microsoft Teams. Use when the user asks if someone is online, around, in a meeting, or free right now.

Class `read` (reads only). Scopes `Presence.Read.All`. Calls `GET /users/{{params.user_id}}/presence`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `user_id` | string | **yes** | Graph user id or userPrincipalName to check. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `activity` | string |  |
| `availability` | string |  |
| `id` | string |  |

Also retrieved by: "is this person online right now in Microsoft Teams", "are they free to talk on Teams at the moment", "check if someone is in a Microsoft Teams meeting currently".

### `microsoft_teams.search_messages`

Search Microsoft Teams chat and channel messages by keyword across the connected account's chats and channels. Use when the user wants to find, look up, or dig up something someone said in Teams and does not know which chat or channel it is in.

Class `read` (reads only). Scopes `ChannelMessage.Read.All`, `Chat.Read.All`. Calls `POST /search/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `from` | integer | no | Number of results to skip, for paging. Default 0. |
| `query` | string | **yes** | Search terms, e.g. "q3 budget numbers". |
| `size` | integer | no | Results per page, up to 25. Default 25. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `value` | array of object |  |
| `value[].hitsContainers` | array of object |  |
| `value[].hitsContainers[].hits` | array of object |  |
| `value[].hitsContainers[].total` | integer |  |

Also retrieved by: "dig up something someone said in Microsoft Teams a while back", "find that link somebody shared on Teams", "look for a decision buried in an old Microsoft Teams conversation".
