---
title: "Microsoft Teams MCP server for AI agents - actionlake"
description: "Give Claude 266 Microsoft Teams actions through one MCP server: messages, channels, teams. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/microsoft-teams
updated: 2026-09-21
---

Connectors · Email & messaging

# Microsoft Teams MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Microsoft Teams and the rest of your systems. It gives your agent 266 Microsoft Teams actions (123 reads, 110 writes and 33 that wait for a confirmation) and holds the Microsoft Teams credential itself, so the agent never does. It paces Microsoft Teams's limits and records every call.

[Connect Microsoft Teams free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "m365_graph_teams.teams.list",
  intent: "check which Microsoft Teams account is connected"
}
# List teams · read · 1 upstream call
```

- 266 actions in one signed file
- 123 read look, never change
- 110 write create and update
- 33 wait for a yes destructive, confirmed first

Set up

## Connect Microsoft Teams in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Microsoft Teams.
   OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `client_id` Entra application (client) id
   - `client_secret` Entra client secret
   - `tenant_id` Your Microsoft Teams tenant id
   ```
   account { op: "connections.requirements", service: "m365_graph_teams" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "m365_graph_teams.teams.list" }
   # list teams · read · 1 upstream call
   check { action: "m365_graph_teams.messages.send", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Microsoft Teams at a glance

**Sign-in**

OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in.

**You provide**

`client_id` `client_secret`

**Setup fields**

`tenant_id`

**Limits we pace to**

10,000 calls per 10 minutes, per connection

**API covered**

Microsoft Teams API v1.0`graph.microsoft.com/v1.0`

**Built from**

Microsoft Teams's documentation, read 17 September 2026[OpenAPI spec (GitHub)](https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml) [learn.microsoft.com](https://learn.microsoft.com/en-us/graph/api/resources/teams-api-overview?view=graph-rest-1.0)

**Service file**

Version 2.0.0, signed (Ed25519)

**Cached reads**

123 of 123 reads, for up to an hour; a write clears what it affects

**Ready-made plans**

9 in the store

**Shared entities**

4, so ask can line Microsoft Teams up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Microsoft Teams.

266 actions in 1 area. Every one carries its effect, so a key can allow the reads and hold the rest.

- **123** read look, never change
- **110** write create and update
- **33** destructive wait for a confirmation

1. ### Chat
   266
   123 read · 110 write · 33 destructive
   List channel messages · List channels · List teams · List team members

Top actions

## The Microsoft Teams API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 125 of Microsoft Teams's 145 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `m365_graph_teams.messages.list` List channel messages | Retrieve the list of messages (without the replies) in a channel of a team. | read | `comm.message.list` 42 connectors |
| `m365_graph_teams.channels.list` List channels | Retrieve the list of channels in this team. | read | `comm.channel.list` 27 connectors |
| `m365_graph_teams.teams.list` List teams | List all teams in an organization. | read | `identity.group.list` 262 connectors |
| `m365_graph_teams.team_members.list` List team members | Get the conversationMembers of a team. | read | `identity.group_member.list` 103 connectors |
| `m365_graph_teams.messages.send` Send a Teams channel message | Create new chatMessage in the specified channel. | write | `comm.message.send` 25 connectors |
| `m365_graph_teams.channels.create` Create a channel | Create new channel in a team, as specified in the request body. | write | `comm.channel.create` 16 connectors |
| `m365_graph_teams.teams.create` Create a team | Create a new team. | write | `identity.group.create` 205 connectors |
| `m365_graph_teams.messages.soft_delete` Soft delete a channel message | Delete a single message or message reply in a channel or a chat. | destructive | `comm.message.delete` 27 connectors |
| `m365_graph_teams.call_records.list` List call records | Get a list of callRecord objects and their properties. | read | `comm.call.list` 44 connectors |
| `m365_graph_teams.call_records.get` Get a call record | Retrieve the properties and relationships of callrecord object. | read | `comm.call.get` 40 connectors |
| `m365_graph_teams.channel_members.list` List channel members | Get a list of members in a channel, including direct members of standard, private, and shared channels. | read | `comm.channel_member.list` 12 connectors |
| `m365_graph_teams.online_meetings.send_virtual_appointment_sms` Send virtual appointment sms an online meeting | Send a virtual appointment SMS notification. | write | `comm.sms.send` 26 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Microsoft Teams actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   List the Microsoft Teams groups and how many members each one has.
   calls `m365_graph_teams.teams.list`
2. Plan write
   Add a new member to a team and welcome them in Microsoft Teams.
   calls `m365_graph_teams.teams.get` `m365_graph_teams.team_members.list` `m365_graph_teams.team_members.create` `m365_graph_teams.channels.get_primary` `m365_graph_teams.messages.send` +1 more
3. Plan read
   Audit installed apps and tabs across a team in Microsoft Teams.
   calls `m365_graph_teams.team_apps.list` `m365_graph_teams.team_permission_grants.list` `m365_graph_teams.channels.list_all` `m365_graph_teams.channel_apps.list` `m365_graph_teams.channel_tabs.list`
4. Write write
   Send a Teams channel message in Microsoft Teams. Show me exactly what you will send before you save it.
   calls `m365_graph_teams.messages.send`

The plan store

## Ready-made plans for Microsoft Teams.

9 plans in the store. Install one and your agent runs it by name; the reply says which connections are still missing. A schedule can run a plan on a timetable. There are no triggers or webhooks, by design.

1. ### Audit installed apps and tabs across a team
   Use it when An administrator wants to know which apps and tabs are present across a team's channels.
   **Effect**
   read
   **Steps**
   4 · loops
   **Needs**
   team id
   **Install**
   `m365_graph_teams-audit-channel-apps-and-tabs`
2. ### Pull call records and sessions for a date range
   Use it when Someone reports poor call quality and the underlying call records need pulling.
   **Effect**
   read
   **Steps**
   5 · loops
   **Needs**
   call record id, from date time and to date time
   **Install**
   `m365_graph_teams-call-quality-review`
3. ### Collect attendance and transcripts for a meeting
   Use it when Someone wants to know who actually attended a Teams meeting and what artefacts it produced.
   **Effect**
   read
   **Steps**
   5 · loops
   **Needs**
   meeting id and user id
   **Install**
   `m365_graph_teams-meeting-attendance-report`
4. ### Review pending time off requests for a team
   Use it when A manager wants pending Shifts time off requests surfaced and one of them actioned.
   A person decides Decline time off request _time off request id_ with message: _message_
   **Effect**
   write
   **Steps**
   5
   **Needs**
   message, team id and time off request id
   **Install**
   `m365_graph_teams-approve-time-off-requests`
5. ### Archive a stale team after approval
   Use it when A team looks abandoned and someone wants it frozen rather than deleted.
   A person decides Archive team _display name_ (_number of value_ members, _number of value_ channels). All posting stops.
   **Effect**
   write
   **Steps**
   5
   **Needs**
   team id
   **Install**
   `m365_graph_teams-archive-stale-team`
6. ### Post an announcement to every channel in a team
   Use it when An announcement must reach every channel of a team rather than just the general one.
   A person decides Post this announcement to all _number of value_ channels of _display name_: _content_
   **Effect**
   write
   **Steps**
   5 · loops
   **Needs**
   content, team id and topic
   **Install**
   `m365_graph_teams-broadcast-to-team-channels`
7. ### Clone an existing team and wait for it to finish
   Use it when A new project needs a team set up as a copy of an existing one rather than from scratch.
   A person decides Clone _display name_ into a new team called _display name_.
   **Effect**
   write
   **Steps**
   6
   **Needs**
   display name, parts to clone and team id
   **Install**
   `m365_graph_teams-clone-team-from-template`
8. ### Add a new member to a team and welcome them
   Use it when Someone joins a project and needs to be put into its team with a visible welcome.
   **Effect**
   write
   **Steps**
   6
   **Needs**
   member user id, roles, team id and welcome
   **Install**
   `m365_graph_teams-onboard-member-to-team`
9. ### Remove a leaver from a team and its shared chats
   Use it when A person has left and their Teams access must be revoked with a sign-off on record.
   A person decides Remove _display name_ from this team and revoke access to _number of value_ chats. Not reversible.
   **Effect**
   destructive
   **Steps**
   6 · loops
   **Needs**
   membership id, team id and user id
   **Install**
   `m365_graph_teams-offboard-member-everywhere`

install a plan

```
account { op: "plans.install", slug: "m365_graph_teams-audit-channel-apps-and-tabs" }
# then ask for it by name; a schedule can run it on a timetable
```

Governance for Microsoft Teams

## Destructive actions wait for a yes.

33 Microsoft Teams actions are destructive. The first 10:

- Soft delete a channel message `m365_graph_teams.messages.soft_delete`
- Delete a channel `m365_graph_teams.channels.delete`
- Delete a team by deleting its group `m365_graph_teams.teams.delete`
- Soft-delete a chat message `m365_graph_teams.chat_messages.soft_delete`
- Delete a team member `m365_graph_teams.team_members.delete`
- Remove an incoming shared channel from a team `m365_graph_teams.channels.remove_incoming`
- Delete a channel member `m365_graph_teams.channel_members.delete`
- Delete a tag member `m365_graph_teams.tag_members.delete`
- Remove team members `m365_graph_teams.team_members.remove`
- Delete a chat `m365_graph_teams.chats.delete`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do m365_graph_teams.channels.delete confirm_policy: **human**

Delete a channel?

**intent:** the user asked me to delete a channel

run suspended · waiting for a named person · key _m365-graph-teams-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "m365-graph-teams-agent",
  allowed_actions: ["m365_graph_teams.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "m365_graph_teams.messages.soft_delete", approver: "lead@example.com" },
    { match: "m365_graph_teams.channels.delete", approver: "lead@example.com" },
    { match: "m365_graph_teams.teams.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Microsoft Teams only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Microsoft Teams costs on actionlake.

Every Microsoft Teams action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Microsoft Teams refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 266 Microsoft Teams actions
- 266 actions page each page of a long list is one call
- 123 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Microsoft Teams action.

266 actions by area: the id your agent calls, what it does, and its effect.

**Chat 266**

- `m365_graph_teams.activity_notifications.send_to_chat` Send an activity feed notification in the scope of a chat write
- `m365_graph_teams.activity_notifications.send_to_recipients` Send an activity feed notification to many recipients write
- `m365_graph_teams.activity_notifications.send_to_team` Send an activity feed notification in the scope of a team write
- `m365_graph_teams.activity_notifications.send_to_user` Send an activity feed notification to a user write
- `m365_graph_teams.call_record_participants.list` List participants of a call record read
- `m365_graph_teams.call_record_segments.list` List segments of a call record session read
- `m365_graph_teams.call_record_sessions.get` Get a call record session read
- `m365_graph_teams.call_record_sessions.list` List sessions of a call record read
- `m365_graph_teams.call_records.get` Get a call record read
- `m365_graph_teams.call_records.get_direct_routing_calls` Get direct routing call log records read
- `m365_graph_teams.call_records.get_organizer` Get the organizer of a call record read
- `m365_graph_teams.call_records.get_pstn_calls` Get PSTN call log records read
- `m365_graph_teams.call_records.list` List call records read
- `m365_graph_teams.channel_apps.add` Enable an app in a channel write
- `m365_graph_teams.channel_apps.list` List apps enabled in a channel read
- `m365_graph_teams.channel_apps.remove` Disable an app in a channel destructive
- `m365_graph_teams.channel_members.create` Create a channel member write
- `m365_graph_teams.channel_members.delete` Delete a channel member destructive
- `m365_graph_teams.channel_members.get` Get a channel member read
- `m365_graph_teams.channel_members.list` List channel members read
- `m365_graph_teams.channel_members.list_all` List all members of a channel, including shared-channel members read
- `m365_graph_teams.channel_members.update` Update a channel member write
- `m365_graph_teams.channel_shared_teams.delete` Delete a team a channel is shared with destructive
- `m365_graph_teams.channel_shared_teams.get` Get a team a channel is shared with read
- `m365_graph_teams.channel_shared_teams.list` List teams a channel is shared with read
- `m365_graph_teams.channel_shared_teams.list_allowed_members` List members of a shared-with team who can access the channel read
- `m365_graph_teams.channel_tabs.create` Create a channel tab write
- `m365_graph_teams.channel_tabs.delete` Delete a channel tab destructive
- `m365_graph_teams.channel_tabs.get` Get a channel tab read
- `m365_graph_teams.channel_tabs.list` List channel tabs read
- `m365_graph_teams.channel_tabs.update` Update a channel tab write
- `m365_graph_teams.channels.archive` Archive a channel write
- `m365_graph_teams.channels.complete_migration` Complete migration a channel write
- `m365_graph_teams.channels.create` Create a channel write
- `m365_graph_teams.channels.delete` Delete a channel destructive
- `m365_graph_teams.channels.does_user_have_access` Does user have access a channel read
- `m365_graph_teams.channels.get` Get a channel read
- `m365_graph_teams.channels.get_files_folder` Get the files folder of a channel read
- `m365_graph_teams.channels.get_primary` Get the General channel of a team read
- `m365_graph_teams.channels.list` List channels read
- `m365_graph_teams.channels.list_all` List all channels of a team, including shared-in channels read
- `m365_graph_teams.channels.list_incoming` List channels shared into a team read
- `m365_graph_teams.channels.provision_email` Provision email a channel write
- `m365_graph_teams.channels.remove_email` Remove email a channel write
- `m365_graph_teams.channels.remove_incoming` Remove an incoming shared channel from a team destructive
- `m365_graph_teams.channels.start_migration` Start migration a channel write
- `m365_graph_teams.channels.unarchive` Unarchive a channel write
- `m365_graph_teams.channels.update` Update a channel write
- `m365_graph_teams.chat_apps.create` Create an app installed in a chat write
- `m365_graph_teams.chat_apps.delete` Delete an app installed in a chat destructive
- `m365_graph_teams.chat_apps.get` Get an app installed in a chat read
- `m365_graph_teams.chat_apps.list` List apps installed in a chat read
- `m365_graph_teams.chat_apps.upgrade` Upgrade an app installed in a chat write
- `m365_graph_teams.chat_hosted_contents.get` Get a chat message hosted content read
- `m365_graph_teams.chat_hosted_contents.list` List hosted contents of a chat message read
- `m365_graph_teams.chat_members.create` Create a chat member write
- `m365_graph_teams.chat_members.delete` Delete a chat member destructive
- `m365_graph_teams.chat_members.get` Get a chat member read
- `m365_graph_teams.chat_members.list` List chat members read
- `m365_graph_teams.chat_messages.create` Create a chat message write
- `m365_graph_teams.chat_messages.get` Get a chat message read
- `m365_graph_teams.chat_messages.get_all_for_user` Get all messages from all chats of a user read
- `m365_graph_teams.chat_messages.get_all_retained_for_user` Get all retained messages from all chats of a user read
- `m365_graph_teams.chat_messages.list` List chat messages read
- `m365_graph_teams.chat_messages.reply_with_quote` Reply with quote chat messages write
- `m365_graph_teams.chat_messages.set_reaction` Set reaction a chat message write
- `m365_graph_teams.chat_messages.soft_delete` Soft-delete a chat message destructive
- `m365_graph_teams.chat_messages.undo_soft_delete` Restore a soft-deleted chat message write
- `m365_graph_teams.chat_messages.unset_reaction` Unset reaction a chat message write
- `m365_graph_teams.chat_messages.update` Update a chat message write
- `m365_graph_teams.chat_permission_grants.list` List resource-specific permission grants of a chat read
- `m365_graph_teams.chat_pinned_messages.create` Create a pinned chat message write
- `m365_graph_teams.chat_pinned_messages.delete` Delete a pinned chat message destructive
- `m365_graph_teams.chat_pinned_messages.list` List pinned chat messages read
- `m365_graph_teams.chat_tabs.create` Create a chat tab write
- `m365_graph_teams.chat_tabs.delete` Delete a chat tab destructive
- `m365_graph_teams.chat_tabs.get` Get a chat tab read
- `m365_graph_teams.chat_tabs.list` List chat tabs read
- `m365_graph_teams.chat_tabs.update` Update a chat tab write
- `m365_graph_teams.chats.complete_migration` Complete migration a chat write
- `m365_graph_teams.chats.create` Create a chat write
- `m365_graph_teams.chats.delete` Delete a chat destructive
- `m365_graph_teams.chats.get` Get a chat read
- `m365_graph_teams.chats.hide_for_user` Hide for user a chat write
- `m365_graph_teams.chats.list` List chats read
- `m365_graph_teams.chats.list_for_user` List the chats of a user read
- `m365_graph_teams.chats.mark_chat_read_for_user` Mark chat read for user a chat write
- `m365_graph_teams.chats.mark_chat_unread_for_user` Mark chat unread for user a chat write
- `m365_graph_teams.chats.remove_all_access_for_user` Remove all access for user a chat destructive
- `m365_graph_teams.chats.start_migration` Start migration a chat write
- `m365_graph_teams.chats.unhide_for_user` Unhide for user a chat write
- `m365_graph_teams.chats.update` Update a chat write
- `m365_graph_teams.day_notes.create` Create a schedule day note write
- `m365_graph_teams.day_notes.delete` Delete a schedule day note destructive
- `m365_graph_teams.day_notes.get` Get a schedule day note read
- `m365_graph_teams.day_notes.list` List schedule day notes read
- `m365_graph_teams.day_notes.update` Replace a schedule day note write
- `m365_graph_teams.deleted_chats.get` Get a deleted chat read
- `m365_graph_teams.deleted_chats.undo_delete` Undo delete a deleted chat write
- `m365_graph_teams.deleted_teams.get_all_messages` Get all channel messages of a deleted team read
- `m365_graph_teams.deleted_teams.list` List deleted teams read
- `m365_graph_teams.meeting_attendance_records.list` List meeting attendance records read
- `m365_graph_teams.meeting_attendance_reports.get` Get a meeting attendance report read
- `m365_graph_teams.meeting_attendance_reports.list` List meeting attendance reports read
- `m365_graph_teams.meeting_recordings.get` Get a meeting recording read
- `m365_graph_teams.meeting_recordings.get_all` Get all recordings of meetings a user organised read
- `m365_graph_teams.meeting_recordings.list` List meeting recordings read
- `m365_graph_teams.meeting_transcripts.get` Get a meeting transcript read
- `m365_graph_teams.meeting_transcripts.get_all` Get all transcripts of meetings a user organised read
- `m365_graph_teams.meeting_transcripts.list` List meeting transcripts read
- `m365_graph_teams.message_hosted_contents.get` Get a channel message hosted content read
- `m365_graph_teams.message_hosted_contents.list` List hosted contents of a channel message read
- `m365_graph_teams.message_replies.create` Create a channel message reply write
- `m365_graph_teams.message_replies.get` Get a channel message reply read
- `m365_graph_teams.message_replies.list` List replies to a channel message read
- `m365_graph_teams.message_replies.set_reaction` Set reaction a channel message reply write
- `m365_graph_teams.message_replies.soft_delete` Soft delete a channel message reply destructive
- `m365_graph_teams.message_replies.undo_soft_delete` Undo soft delete a channel message reply write
- `m365_graph_teams.message_replies.unset_reaction` Unset reaction a channel message reply write
- `m365_graph_teams.message_replies.update` Update a channel message reply write
- `m365_graph_teams.messages.delta` Delta channel messages read
- `m365_graph_teams.messages.get` Get a channel message read
- `m365_graph_teams.messages.get_all` Get all messages across the channels of a team read
- `m365_graph_teams.messages.get_all_retained` Get all retained messages across the channels of a team read
- `m365_graph_teams.messages.list` List channel messages read
- `m365_graph_teams.messages.send` Send a Teams channel message write
- `m365_graph_teams.messages.set_reaction` Set reaction a channel message write
- `m365_graph_teams.messages.soft_delete` Soft delete a channel message destructive
- `m365_graph_teams.messages.undo_soft_delete` Undo soft delete a channel message write
- `m365_graph_teams.messages.unset_reaction` Unset reaction a channel message write
- `m365_graph_teams.messages.update` Update a channel message write
- `m365_graph_teams.offer_shift_requests.approve` Approve an offer shift request write
- `m365_graph_teams.offer_shift_requests.create` Create an offer shift request write
- `m365_graph_teams.offer_shift_requests.decline` Decline an offer shift request write
- `m365_graph_teams.offer_shift_requests.get` Get an offer shift request read
- `m365_graph_teams.offer_shift_requests.list` List offer shift requests read
- `m365_graph_teams.online_meetings.create` Create an online meeting write
- `m365_graph_teams.online_meetings.create_or_get` Create or get online meetings write
- `m365_graph_teams.online_meetings.delete` Delete an online meeting destructive
- `m365_graph_teams.online_meetings.get` Get an online meeting read
- `m365_graph_teams.online_meetings.get_all_messages` Get all Q&A messages across online meetings read
- `m365_graph_teams.online_meetings.get_virtual_appointment_join_web_url` Get virtual appointment join web url an online meeting read
- `m365_graph_teams.online_meetings.list` Find the online meetings of a user by join URL or meeting id read
- `m365_graph_teams.online_meetings.list_by_vtc_id` Find an online meeting by video teleconference id read
- `m365_graph_teams.online_meetings.send_virtual_appointment_reminder_sms` Send virtual appointment reminder sms an online meeting write
- `m365_graph_teams.online_meetings.send_virtual_appointment_sms` Send virtual appointment sms an online meeting write
- `m365_graph_teams.online_meetings.update` Update an online meeting write
- `m365_graph_teams.open_shift_change_requests.approve` Approve an open shift change request write
- `m365_graph_teams.open_shift_change_requests.create` Create an open shift change request write
- `m365_graph_teams.open_shift_change_requests.decline` Decline an open shift change request write
- `m365_graph_teams.open_shift_change_requests.get` Get an open shift change request read
- `m365_graph_teams.open_shift_change_requests.list` List open shift change requests read
- `m365_graph_teams.open_shifts.create` Create an open shift write
- `m365_graph_teams.open_shifts.delete` Delete an open shift destructive
- `m365_graph_teams.open_shifts.get` Get an open shift read
- `m365_graph_teams.open_shifts.list` List open shifts read
- `m365_graph_teams.open_shifts.update` Replace an open shift write
- `m365_graph_teams.presence.clear_presence` Clear the presence session of a user write
- `m365_graph_teams.presence.clear_user_preferred_presence` Clear the preferred presence of a user write
- `m365_graph_teams.presence.get` Get the presence of a user read
- `m365_graph_teams.presence.get_by_user_ids` Get the presence of several users read
- `m365_graph_teams.presence.set_presence` Set the presence session of a user write
- `m365_graph_teams.presence.set_status_message` Set the presence status message of a user write
- `m365_graph_teams.presence.set_user_preferred_presence` Set the preferred presence of a user write
- `m365_graph_teams.reply_hosted_contents.get` Get a reply hosted content read
- `m365_graph_teams.reply_hosted_contents.list` List hosted contents of a channel message reply read
- `m365_graph_teams.schedule.get` Get the schedule of a team read
- `m365_graph_teams.schedule.share` Share a schedule time range with team members write
- `m365_graph_teams.schedule.upsert` Create or replace the schedule of a team write
- `m365_graph_teams.scheduling_groups.create` Create a scheduling group write
- `m365_graph_teams.scheduling_groups.delete` Delete a scheduling group destructive
- `m365_graph_teams.scheduling_groups.get` Get a scheduling group read
- `m365_graph_teams.scheduling_groups.list` List scheduling groups read
- `m365_graph_teams.scheduling_groups.update` Replace a scheduling group write
- `m365_graph_teams.shifts.create` Create a shift write
- `m365_graph_teams.shifts.delete` Delete a shift destructive
- `m365_graph_teams.shifts.get` Get a shift read
- `m365_graph_teams.shifts.list` List shifts read
- `m365_graph_teams.shifts.update` Replace a shift write
- `m365_graph_teams.swap_shifts_change_requests.approve` Approve a swap shifts change request write
- `m365_graph_teams.swap_shifts_change_requests.create` Create a swap shifts change request write
- `m365_graph_teams.swap_shifts_change_requests.decline` Decline a swap shifts change request write
- `m365_graph_teams.swap_shifts_change_requests.get` Get a swap shifts change request read
- `m365_graph_teams.swap_shifts_change_requests.list` List swap shifts change requests read
- `m365_graph_teams.tag_members.create` Create a tag member write
- `m365_graph_teams.tag_members.delete` Delete a tag member destructive
- `m365_graph_teams.tag_members.get` Get a tag member read
- `m365_graph_teams.tag_members.list` List tag members read
- `m365_graph_teams.tags.create` Create a team tag write
- `m365_graph_teams.tags.delete` Delete a team tag destructive
- `m365_graph_teams.tags.get` Get a team tag read
- `m365_graph_teams.tags.list` List team tags read
- `m365_graph_teams.tags.update` Update a team tag write
- `m365_graph_teams.team_apps.create` Create an app installed in a team write
- `m365_graph_teams.team_apps.delete` Delete an app installed in a team destructive
- `m365_graph_teams.team_apps.get` Get an app installed in a team read
- `m365_graph_teams.team_apps.list` List apps installed in a team read
- `m365_graph_teams.team_apps.upgrade` Upgrade an app installed in a team write
- `m365_graph_teams.team_members.add` Add team members write
- `m365_graph_teams.team_members.create` Create a team member write
- `m365_graph_teams.team_members.delete` Delete a team member destructive
- `m365_graph_teams.team_members.get` Get a team member read
- `m365_graph_teams.team_members.list` List team members read
- `m365_graph_teams.team_members.remove` Remove team members destructive
- `m365_graph_teams.team_members.update` Update a team member write
- `m365_graph_teams.team_operations.get` Get a team async operation read
- `m365_graph_teams.team_operations.list` List team async operations read
- `m365_graph_teams.team_permission_grants.list` List resource-specific permission grants of a team read
- `m365_graph_teams.teams.archive` Archive a team write
- `m365_graph_teams.teams.clone` Clone a team write
- `m365_graph_teams.teams.complete_migration` Complete migration a team write
- `m365_graph_teams.teams.create` Create a team write
- `m365_graph_teams.teams.create_from_group` Create a team from a group write
- `m365_graph_teams.teams.delete` Delete a team by deleting its group destructive
- `m365_graph_teams.teams.get` Get a team read
- `m365_graph_teams.teams.get_photo` Get the metadata of a team photo read
- `m365_graph_teams.teams.list` List teams read
- `m365_graph_teams.teams.list_associated` List the teams a user is associated with read
- `m365_graph_teams.teams.list_joined` List the teams a user has joined read
- `m365_graph_teams.teams.unarchive` Unarchive a team write
- `m365_graph_teams.teams.update` Update a team write
- `m365_graph_teams.teams_app_settings.get` Get the tenant Teams app settings read
- `m365_graph_teams.teams_app_settings.update` Update the tenant Teams app settings write
- `m365_graph_teams.teams_apps.delete` Delete a Teams app destructive
- `m365_graph_teams.teams_apps.get_bot` Get the bot of a Teams app definition read
- `m365_graph_teams.teams_apps.list` List Teams apps in the app catalog read
- `m365_graph_teams.teams_templates.get` Get a team template read
- `m365_graph_teams.teams_templates.list` List team templates read
- `m365_graph_teams.teamwork.get` Get the tenant teamwork settings object read
- `m365_graph_teams.time_cards.clock_in` Clock in time cards write
- `m365_graph_teams.time_cards.clock_out` Clock out a time card write
- `m365_graph_teams.time_cards.confirm` Confirm a time card write
- `m365_graph_teams.time_cards.create` Create a time card write
- `m365_graph_teams.time_cards.delete` Delete a time card destructive
- `m365_graph_teams.time_cards.end_break` End break a time card write
- `m365_graph_teams.time_cards.get` Get a time card read
- `m365_graph_teams.time_cards.list` List time cards read
- `m365_graph_teams.time_cards.start_break` Start break a time card write
- `m365_graph_teams.time_cards.update` Replace a time card write
- `m365_graph_teams.time_off_reasons.create` Create a time-off reason write
- `m365_graph_teams.time_off_reasons.delete` Delete a time-off reason destructive
- `m365_graph_teams.time_off_reasons.get` Get a time-off reason read
- `m365_graph_teams.time_off_reasons.list` List time-off reasons read
- `m365_graph_teams.time_off_reasons.update` Replace a time-off reason write
- `m365_graph_teams.time_off_requests.approve` Approve a time-off request write
- `m365_graph_teams.time_off_requests.create` Create a time-off request write
- `m365_graph_teams.time_off_requests.decline` Decline a time-off request write
- `m365_graph_teams.time_off_requests.delete` Delete a time-off request destructive
- `m365_graph_teams.time_off_requests.get` Get a time-off request read
- `m365_graph_teams.time_off_requests.list` List time-off requests read
- `m365_graph_teams.times_off.create` Create a time off write
- `m365_graph_teams.times_off.delete` Delete a time off destructive
- `m365_graph_teams.times_off.get` Get a time off read
- `m365_graph_teams.times_off.list` List times off read
- `m365_graph_teams.times_off.update` Replace a time off write
- `m365_graph_teams.user_apps.create` Create an app installed for a user write
- `m365_graph_teams.user_apps.delete` Delete an app installed for a user destructive
- `m365_graph_teams.user_apps.get` Get an app installed for a user read
- `m365_graph_teams.user_apps.get_chat` Get the chat between a user and an installed app read
- `m365_graph_teams.user_apps.list` List apps installed for a user read
- `m365_graph_teams.user_teamwork.get` Get the teamwork settings of a user read
- `m365_graph_teams.workforce_integrations.create` Create a workforce integration write
- `m365_graph_teams.workforce_integrations.delete` Delete a workforce integration destructive
- `m365_graph_teams.workforce_integrations.get` Get a workforce integration read
- `m365_graph_teams.workforce_integrations.list` List workforce integrations read
- `m365_graph_teams.workforce_integrations.update` Update a workforce integration write

Questions

## The Microsoft Teams MCP server, answered.

**Is there a Microsoft Teams MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 266 Microsoft Teams actions, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Microsoft Teams.

**What do I need to connect Microsoft Teams?**

Entra application (client) id and Entra client secret. Plus your tenant id. The free call account { op: "connections.requirements", service: "m365_graph_teams" } lists exactly what to paste.

**Can an AI agent delete or change things in Microsoft Teams?**

Only if its key allows it, and only with an explicit confirmation. 33 Microsoft Teams actions are destructive, including soft delete a channel message, delete a channel and delete a team by deleting its group. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Microsoft Teams API limit?**

actionlake paces every call to the limits in the Microsoft Teams service file: 10,000 calls per 10 minutes per connection. Repeated reads are answered from cache (123 Microsoft Teams actions can be), which never reaches Microsoft Teams.

**What does a Microsoft Teams action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (266 Microsoft Teams actions page). Cache hits, searches, dry runs and calls Microsoft Teams refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Microsoft Teams API does it cover?**

The Microsoft Teams API v1.0 at graph.microsoft.com/v1.0. It is built from Microsoft Teams's documentation as read on 17 September 2026. 266 actions in 1 area, each one in the signed service file (version 2.0.0).

**Does actionlake keep my Microsoft Teams data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Microsoft Teams credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Microsoft Teams

Shares the most action names with

- [RingCentral 45](https://actionlake.com/connectors/ringcentral)
- [Slack 42](https://actionlake.com/connectors/slack)
- [Twilio 39](https://actionlake.com/connectors/twilio)
- [Cisco Webex 21](https://actionlake.com/connectors/cisco-webex)
- [Dialpad 17](https://actionlake.com/connectors/dialpad)
- [Zulip 16](https://actionlake.com/connectors/zulip)

Joins with, on shared entities

- [Delinea Secret Server 2](https://actionlake.com/connectors/delinea-secret-server)
- [Canvas LMS 2](https://actionlake.com/connectors/canvas-lms)
- [D2L Brightspace 2](https://actionlake.com/connectors/d2l-brightspace)
- [Tableau 2](https://actionlake.com/connectors/tableau)
- [Lark Suite 2](https://actionlake.com/connectors/lark-suite)
- [Files.com 2](https://actionlake.com/connectors/files-com)

Browse

- [All Email & messaging connectors](https://actionlake.com/connectors/category/email-and-messaging)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Microsoft Teams; the name is the vendor's own. Counts are from the Microsoft Teams service file, version 2.0.0.

## Give your agent Microsoft Teams today.

[Connect Microsoft Teams free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/microsoft-teams
More: https://actionlake.com/llms.txt
