Connectors · Workspace
Microsoft 365 Calendar MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Microsoft 365 Calendar and the rest of your systems. It gives your agent 105 Microsoft 365 Calendar actions (61 reads, 30 writes and 14 that wait for a confirmation) and holds the Microsoft 365 Calendar credential itself, so the agent never does. It paces Microsoft 365 Calendar's limits and records every call.
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/mcpdo { action: "m365_graph_calendar.rooms.list", intent: "check which Microsoft 365 Calendar account is connected"}# List bookable rooms · read · 1 upstream call- 105actionsin one signed file
- 61readlook, never change
- 30writecreate and update
- 14wait for a yesdestructive, confirmed first
Set up
Connect Microsoft 365 Calendar in three steps.
- 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 - 02
Connect Microsoft 365 Calendar.
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_idEntra application (client) idclient_secretEntra client secrettenant_idYour Microsoft 365 Calendar tenant id
account { op: "connections.requirements", service: "m365_graph_calendar" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "m365_graph_calendar.rooms.list" }# list bookable rooms · read · 1 upstream callcheck { action: "m365_graph_calendar.events.delete", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
Microsoft 365 Calendar 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_idclient_secret- Setup fields
tenant_id- Limits we pace to
- 10,000 calls per 10 minutes, per connection
- API covered
- Microsoft 365 Calendar API v1.0
graph.microsoft.com/v1.0 - Built from
- Microsoft 365 Calendar's documentation, read 8 September 2026learn.microsoft.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 61 of 61 reads, for up to an hour; a write clears what it affects
- Ready-made plans
- 8 in the store
- Shared entities
- 1, so ask can line Microsoft 365 Calendar 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 365 Calendar.
105 actions in 1 area. Every one carries its effect, so a key can allow the reads and hold the rest.
- 61readlook, never change
- 30writecreate and update
- 14destructivewait for a confirmation
Calendar
10561 read · 30 write · 14 destructive
List events on the default calendar · Track event on the default calendar, addressed explicitly changes · List events on the default calendar, addressed explicitly · Track changes in the calendar view (calendar view)
Top actions
The Microsoft 365 Calendar API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 33 of Microsoft 365 Calendar's 37 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_calendar.events.listList events on the default calendar | List events on the default calendar for a mailbox. | read | comm.event.list61 connectors |
m365_graph_calendar.events.deltaTrack event on the default calendar changes | Changes to events on the default calendar since a delta token, for incremental sync. | read | comm.event.list61 connectors |
m365_graph_calendar.rooms.listList bookable rooms | Every bookable room published in the tenant's directory of places. | read | comm.bookable_room.list2 connectors |
m365_graph_calendar.events.deleteDelete an event on the default calendar | Delete one event on the default calendar. Graph answers 204 with an empty body. | destructive | comm.event.delete45 connectors |
m365_graph_calendar.room_lists.listList room lists | Every room list published in the tenant's directory of places. | read | comm.bookable_room.list2 connectors |
m365_graph_calendar.scheduling.reminder_viewList reminders due in a window | Every calendar reminder falling between two times. | read | comm.notification.list19 connectors |
m365_graph_calendar.calendars.listList calendars | List calendars for a mailbox. | read | comm.calendar.list14 connectors |
m365_graph_calendar.calendar_groups.listList calendar groups | List calendar groups for a mailbox. | read | comm.calendar.list14 connectors |
m365_graph_calendar.scheduling.get_scheduleGet free/busy for a set of mailboxes | Read availability for up to 20 mailboxes or rooms over a window. | read | comm.availability.query5 connectors |
m365_graph_calendar.events.snooze_reminderSnooze an event reminder | Postpone an event's reminder to a later time. | write | comm.notification.update10 connectors |
m365_graph_calendar.events.acceptAccept a meeting invitation | Accept a meeting invitation on behalf of the mailbox owner. | write | comm.event_attendee.update9 connectors |
m365_graph_calendar.events.declineDecline a meeting invitation | Decline a meeting invitation on behalf of the mailbox owner. | write | comm.event_attendee.update9 connectors |
Try it
Prompts to paste into Claude.
Each one names the Microsoft 365 Calendar actions it will call, so you know what it reads and what it changes before you send it.
- Readread
What is on the Microsoft 365 Calendar calendar this week?
calls
m365_graph_calendar.events.list - Planwrite
Stand up a shared project calendar in Microsoft 365 Calendar.
calls
m365_graph_calendar.calendar_groups.createm365_graph_calendar.calendar_group_calendars.createm365_graph_calendar.named_calendar_permissions.createm365_graph_calendar.named_calendar_permissions.listm365_graph_calendar.calendar_group_calendars.list - Plandestructive
Empty and delete a retired calendar in Microsoft 365 Calendar. Ask me before anything is sent or changed.
calls
m365_graph_calendar.calendars.getm365_graph_calendar.named_calendar_events.countm365_graph_calendar.named_calendar_events.listm365_graph_calendar.named_calendar_events.deletem365_graph_calendar.calendars.delete - Writewrite
Snooze an event reminder in Microsoft 365 Calendar. Show me exactly what you will send before you save it.
calls
m365_graph_calendar.events.snooze_reminder
The plan store
Ready-made plans for Microsoft 365 Calendar.
8 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.
Build a daily agenda digest for one person
Use it when Someone wants a complete picture of what is on a person's calendar for a day or a short window.
Audit how hard the meeting rooms are working
Use it when Someone wants to know which meeting rooms are being used and which are sitting idle.
Accept the pending invites in a window
Use it when A mailbox has a backlog of unanswered meeting invitations that should all be accepted.
Find a free slot and book the meeting
Use it when A meeting needs to be scheduled with several people and no time has been agreed yet.
Stand up a shared project calendar
Use it when A new project or team needs its own calendar with someone granted access to it.
Move a recurring series after checking the instances
Use it when A recurring meeting needs to move to a new time and the impact on existing instances must be checked first.
A person decides
Move the series 'subject' to new start, which re-issues invitations for every remaining instance.
Cancel a meeting after a human signs off
Use it when A meeting must be cancelled and attendees notified, and a person should sign off before the notice goes out.
A person decides
Cancel 'subject' starting dateTime and email the cancellation notice to every attendee.
Empty and delete a retired calendar
Use it when A calendar is being decommissioned and its events plus the calendar itself must be removed.
A person decides
Permanently delete count events and then the calendar 'name' itself. This cannot be undone.
account { op: "plans.install", slug: "m365_graph_calendar-daily-agenda-digest" }
# then ask for it by name; a schedule can run it on a timetableGovernance for Microsoft 365 Calendar
Destructive actions wait for a yes.
14 Microsoft 365 Calendar actions are destructive. These are all of them:
- Delete an event on the default calendar
m365_graph_calendar.events.delete - Delete an event on the default calendar, addressed explicitly
m365_graph_calendar.calendar_events.delete - Permanently delete an event
m365_graph_calendar.events.permanent_delete - Delete an event on a calendar inside a calendar group
m365_graph_calendar.group_calendar_events.delete - Delete an event on one named calendar
m365_graph_calendar.named_calendar_events.delete - Cancel a meeting
m365_graph_calendar.events.cancel - Delete a calendar
m365_graph_calendar.calendars.delete - Delete a calendar group
m365_graph_calendar.calendar_groups.delete - Permanently delete a calendar
m365_graph_calendar.calendars.permanent_delete - Delete a calendar in a group
m365_graph_calendar.calendar_group_calendars.delete - Delete an event attachment
m365_graph_calendar.event_attachments.delete - Delete an event attachment
m365_graph_calendar.calendar_event_attachments.delete - Delete a calendar permission
m365_graph_calendar.calendar_permissions.delete - Delete a calendar permission
m365_graph_calendar.named_calendar_permissions.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.
Delete an event on the default calendar?
intent: the user asked me to delete an event on the default calendar
account { op: "keys.create", name: "m365-graph-calendar-agent", allowed_actions: ["m365_graph_calendar.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "m365_graph_calendar.events.delete", approver: "[email protected]" }, { match: "m365_graph_calendar.calendar_events.delete", approver: "[email protected]" }, { match: "m365_graph_calendar.events.permanent_delete", approver: "[email protected]" } ]}Cost
What Microsoft 365 Calendar costs on actionlake.
Every Microsoft 365 Calendar action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call Microsoft 365 Calendar 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.
- 1upstream call per actionall 105 Microsoft 365 Calendar actions
- 105actions pageeach page of a long list is one call
- 61reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every Microsoft 365 Calendar action.
105 actions by area: the id your agent calls, what it does, and its effect.
Calendar105
m365_graph_calendar.calendar_event_attachments.countCount attachments on an eventreadm365_graph_calendar.calendar_event_attachments.deleteDelete an event attachmentdestructivem365_graph_calendar.calendar_event_attachments.getGet an event attachmentreadm365_graph_calendar.calendar_event_attachments.listList attachments on an eventreadm365_graph_calendar.calendar_events.countCount events on the default calendar, addressed explicitlyreadm365_graph_calendar.calendar_events.createCreate an event on the default calendar, addressed explicitlywritem365_graph_calendar.calendar_events.deleteDelete an event on the default calendar, addressed explicitlydestructivem365_graph_calendar.calendar_events.deltaTrack event on the default calendar, addressed explicitly changesreadm365_graph_calendar.calendar_events.getGet an event on the default calendar, addressed explicitlyreadm365_graph_calendar.calendar_events.listList events on the default calendar, addressed explicitlyreadm365_graph_calendar.calendar_events.updateUpdate an event on the default calendar, addressed explicitlywritem365_graph_calendar.calendar_group_calendars.countCount calendars in a calendar groupreadm365_graph_calendar.calendar_group_calendars.createCreate a calendar in a groupwritem365_graph_calendar.calendar_group_calendars.deleteDelete a calendar in a groupdestructivem365_graph_calendar.calendar_group_calendars.getGet a calendar in a groupreadm365_graph_calendar.calendar_group_calendars.listList calendars in a calendar groupreadm365_graph_calendar.calendar_group_calendars.updateUpdate a calendar in a groupwritem365_graph_calendar.calendar_groups.countCount calendar groupsreadm365_graph_calendar.calendar_groups.createCreate a calendar groupwritem365_graph_calendar.calendar_groups.deleteDelete a calendar groupdestructivem365_graph_calendar.calendar_groups.getGet a calendar groupreadm365_graph_calendar.calendar_groups.listList calendar groupsreadm365_graph_calendar.calendar_groups.updateUpdate a calendar groupwritem365_graph_calendar.calendar_permissions.countCount permissions on a calendarreadm365_graph_calendar.calendar_permissions.createCreate a calendar permissionwritem365_graph_calendar.calendar_permissions.deleteDelete a calendar permissiondestructivem365_graph_calendar.calendar_permissions.getGet a calendar permissionreadm365_graph_calendar.calendar_permissions.listList permissions on a calendarreadm365_graph_calendar.calendar_permissions.updateUpdate a calendar permissionwritem365_graph_calendar.calendar_view.deltaTrack changes in the calendar view (calendar view)readm365_graph_calendar.calendar_view.listList the calendar view over the whole mailboxreadm365_graph_calendar.calendars.allowed_sharing_rolesList the sharing roles a user may be givenreadm365_graph_calendar.calendars.countCount calendarsreadm365_graph_calendar.calendars.createCreate a calendarwritem365_graph_calendar.calendars.deleteDelete a calendardestructivem365_graph_calendar.calendars.getGet a calendarreadm365_graph_calendar.calendars.get_defaultGet the default calendarreadm365_graph_calendar.calendars.listList calendarsreadm365_graph_calendar.calendars.permanent_deletePermanently delete a calendardestructivem365_graph_calendar.calendars.updateUpdate a calendarwritem365_graph_calendar.calendars.update_defaultUpdate the default calendarwritem365_graph_calendar.default_calendar_view.deltaTrack changes in the calendar view (default calendar view)readm365_graph_calendar.default_calendar_view.listList the calendar view over the default calendarreadm365_graph_calendar.event_attachments.countCount attachments on an eventreadm365_graph_calendar.event_attachments.createAttach a file to an eventwritem365_graph_calendar.event_attachments.create_upload_sessionStart a large event attachment uploadwritem365_graph_calendar.event_attachments.deleteDelete an event attachmentdestructivem365_graph_calendar.event_attachments.getGet an event attachmentreadm365_graph_calendar.event_attachments.get_rawDownload an event attachment's bytesreadm365_graph_calendar.event_attachments.listList attachments on an eventreadm365_graph_calendar.event_exception_occurrences.listList modified occurrences of a recurring eventreadm365_graph_calendar.event_extended_properties.multi_listList multi-value extended properties on an eventreadm365_graph_calendar.event_extended_properties.single_listList single-value extended properties on an eventreadm365_graph_calendar.event_extensions.listList open extensions on an eventreadm365_graph_calendar.event_instances.getGet one occurrence of a recurring eventreadm365_graph_calendar.event_instances.listList occurrences of a recurring eventreadm365_graph_calendar.events.acceptAccept a meeting invitationwritem365_graph_calendar.events.cancelCancel a meetingdestructivem365_graph_calendar.events.countCount events on the default calendarreadm365_graph_calendar.events.createCreate an event on the default calendarwritem365_graph_calendar.events.create_rawCreate an event from a raw Graph event objectwritem365_graph_calendar.events.declineDecline a meeting invitationwritem365_graph_calendar.events.deleteDelete an event on the default calendardestructivem365_graph_calendar.events.deltaTrack event on the default calendar changesreadm365_graph_calendar.events.dismiss_reminderDismiss an event reminderwritem365_graph_calendar.events.forwardForward a meeting invitationwritem365_graph_calendar.events.getGet an event on the default calendarreadm365_graph_calendar.events.listList events on the default calendarreadm365_graph_calendar.events.permanent_deletePermanently delete an eventdestructivem365_graph_calendar.events.searchSearch calendar eventsreadm365_graph_calendar.events.snooze_reminderSnooze an event reminderwritem365_graph_calendar.events.tentatively_acceptTentatively accept a meeting invitationwritem365_graph_calendar.events.updateUpdate an event on the default calendarwritem365_graph_calendar.events.update_rawUpdate an event from a raw Graph event objectwritem365_graph_calendar.group_calendar_events.countCount events on a calendar inside a calendar groupreadm365_graph_calendar.group_calendar_events.createCreate an event on a calendar inside a calendar groupwritem365_graph_calendar.group_calendar_events.deleteDelete an event on a calendar inside a calendar groupdestructivem365_graph_calendar.group_calendar_events.getGet an event on a calendar inside a calendar groupreadm365_graph_calendar.group_calendar_events.listList events on a calendar inside a calendar groupreadm365_graph_calendar.group_calendar_events.updateUpdate an event on a calendar inside a calendar groupwritem365_graph_calendar.group_calendar_view.listList the calendar view over a calendar inside a groupreadm365_graph_calendar.named_calendar_events.countCount events on one named calendarreadm365_graph_calendar.named_calendar_events.createCreate an event on one named calendarwritem365_graph_calendar.named_calendar_events.deleteDelete an event on one named calendardestructivem365_graph_calendar.named_calendar_events.deltaTrack event on one named calendar changesreadm365_graph_calendar.named_calendar_events.getGet an event on one named calendarreadm365_graph_calendar.named_calendar_events.listList events on one named calendarreadm365_graph_calendar.named_calendar_events.updateUpdate an event on one named calendarwritem365_graph_calendar.named_calendar_permissions.countCount permissions on a calendarreadm365_graph_calendar.named_calendar_permissions.createCreate a calendar permissionwritem365_graph_calendar.named_calendar_permissions.deleteDelete a calendar permissiondestructivem365_graph_calendar.named_calendar_permissions.getGet a calendar permissionreadm365_graph_calendar.named_calendar_permissions.listList permissions on a calendarreadm365_graph_calendar.named_calendar_permissions.updateUpdate a calendar permissionwritem365_graph_calendar.named_calendar_view.listList the calendar view over one named calendarreadm365_graph_calendar.places.getGet a placereadm365_graph_calendar.places.updateUpdate a placewritem365_graph_calendar.room_lists.listList room listsreadm365_graph_calendar.room_lists.roomsList the rooms in a room listreadm365_graph_calendar.room_lists.workspacesList the workspaces in a room listreadm365_graph_calendar.rooms.listList bookable roomsreadm365_graph_calendar.scheduling.find_meeting_timesFind a time everyone can meetreadm365_graph_calendar.scheduling.get_scheduleGet free/busy for a set of mailboxesreadm365_graph_calendar.scheduling.get_schedule_for_calendarGet free/busy for a set of mailboxesreadm365_graph_calendar.scheduling.reminder_viewList reminders due in a windowread
Questions
The Microsoft 365 Calendar MCP server, answered.
Is there a Microsoft 365 Calendar MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 105 Microsoft 365 Calendar actions, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Microsoft 365 Calendar.
What do I need to connect Microsoft 365 Calendar?
Entra application (client) id and Entra client secret. Plus your tenant id. The free call account { op: "connections.requirements", service: "m365_graph_calendar" } lists exactly what to paste.
Can an AI agent delete or change things in Microsoft 365 Calendar?
Only if its key allows it, and only with an explicit confirmation. 14 Microsoft 365 Calendar actions are destructive, including delete an event on the default calendar, delete an event on the default calendar, addressed explicitly and permanently delete an event. 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 365 Calendar API limit?
actionlake paces every call to the limits in the Microsoft 365 Calendar service file: 10,000 calls per 10 minutes per connection. Repeated reads are answered from cache (61 Microsoft 365 Calendar actions can be), which never reaches Microsoft 365 Calendar.
What does a Microsoft 365 Calendar action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (105 Microsoft 365 Calendar actions page). Cache hits, searches, dry runs and calls Microsoft 365 Calendar 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 365 Calendar API does it cover?
The Microsoft 365 Calendar API v1.0 at graph.microsoft.com/v1.0. It is built from Microsoft 365 Calendar's documentation as read on 8 September 2026. 105 actions in 1 area, each one in the signed service file (version 1.0.0).
Does actionlake keep my Microsoft 365 Calendar 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 365 Calendar 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.
Give your agent Microsoft 365 Calendar today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.