Skip to content

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/mcp
the first call
do {  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.

  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 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) id
    • client_secretEntra client secret
    • tenant_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
  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_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.0graph.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
  1. Calendar

    105

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

ActionWhat it doesEffectSame name in
m365_graph_calendar.events.listList events on the default calendarList events on the default calendar for a mailbox.readcomm.event.list61 connectors
m365_graph_calendar.events.deltaTrack event on the default calendar changesChanges to events on the default calendar since a delta token, for incremental sync.readcomm.event.list61 connectors
m365_graph_calendar.rooms.listList bookable roomsEvery bookable room published in the tenant's directory of places.readcomm.bookable_room.list2 connectors
m365_graph_calendar.events.deleteDelete an event on the default calendarDelete one event on the default calendar. Graph answers 204 with an empty body.destructivecomm.event.delete45 connectors
m365_graph_calendar.room_lists.listList room listsEvery room list published in the tenant's directory of places.readcomm.bookable_room.list2 connectors
m365_graph_calendar.scheduling.reminder_viewList reminders due in a windowEvery calendar reminder falling between two times.readcomm.notification.list19 connectors
m365_graph_calendar.calendars.listList calendarsList calendars for a mailbox.readcomm.calendar.list14 connectors
m365_graph_calendar.calendar_groups.listList calendar groupsList calendar groups for a mailbox.readcomm.calendar.list14 connectors
m365_graph_calendar.scheduling.get_scheduleGet free/busy for a set of mailboxesRead availability for up to 20 mailboxes or rooms over a window.readcomm.availability.query5 connectors
m365_graph_calendar.events.snooze_reminderSnooze an event reminderPostpone an event's reminder to a later time.writecomm.notification.update10 connectors
m365_graph_calendar.events.acceptAccept a meeting invitationAccept a meeting invitation on behalf of the mailbox owner.writecomm.event_attendee.update9 connectors
m365_graph_calendar.events.declineDecline a meeting invitationDecline a meeting invitation on behalf of the mailbox owner.writecomm.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.

  1. Readread

    What is on the Microsoft 365 Calendar calendar this week?

    callsm365_graph_calendar.events.list

  2. Planwrite

    Stand up a shared project calendar in Microsoft 365 Calendar.

    callsm365_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

  3. Plandestructive

    Empty and delete a retired calendar in Microsoft 365 Calendar. Ask me before anything is sent or changed.

    callsm365_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

  4. Writewrite

    Snooze an event reminder in Microsoft 365 Calendar. Show me exactly what you will send before you save it.

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

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

    Effect
    read
    Steps
    4 · loops
    Needs
    end date time, start date time and user id
    Install
    m365_graph_calendar-daily-agenda-digest
  2. 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.

    Effect
    read
    Steps
    4 · loops
    Needs
    end date time, room list id, schedules, start date time and user id
    Install
    m365_graph_calendar-room-booking-audit
  3. Accept the pending invites in a window

    Use it when A mailbox has a backlog of unanswered meeting invitations that should all be accepted.

    Effect
    write
    Steps
    3 · loops
    Needs
    comment, end date time, start date time and user id
    Install
    m365_graph_calendar-triage-meeting-invites
  4. 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.

    Effect
    write
    Steps
    4
    Needs
    attendees, meeting duration, schedules, subject, user id, window end and window start
    Install
    m365_graph_calendar-find-time-and-book
  5. Stand up a shared project calendar

    Use it when A new project or team needs its own calendar with someone granted access to it.

    Effect
    write
    Steps
    5
    Needs
    calendar name, group name, role, share with and user id
    Install
    m365_graph_calendar-provision-project-calendar
  6. 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 decidesMove the series 'subject' to new start, which re-issues invitations for every remaining instance.

    Effect
    write
    Steps
    6
    Needs
    event id, new end, new start, schedules, time zone, user id, window end and window start
    Install
    m365_graph_calendar-reschedule-recurring-series
  7. 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 decidesCancel 'subject' starting dateTime and email the cancellation notice to every attendee.

    Effect
    destructive
    Steps
    4
    Needs
    comment, event id and user id
    Install
    m365_graph_calendar-cancel-meeting-with-approval
  8. 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 decidesPermanently delete count events and then the calendar 'name' itself. This cannot be undone.

    Effect
    destructive
    Steps
    6 · loops
    Needs
    calendar id and user id
    Install
    m365_graph_calendar-purge-stale-calendar
install a plan
account { op: "plans.install", slug: "m365_graph_calendar-daily-agenda-digest" }
# then ask for it by name; a schedule can run it on a timetable

Governance 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 calendarm365_graph_calendar.events.delete
  • Delete an event on the default calendar, addressed explicitlym365_graph_calendar.calendar_events.delete
  • Permanently delete an eventm365_graph_calendar.events.permanent_delete
  • Delete an event on a calendar inside a calendar groupm365_graph_calendar.group_calendar_events.delete
  • Delete an event on one named calendarm365_graph_calendar.named_calendar_events.delete
  • Cancel a meetingm365_graph_calendar.events.cancel
  • Delete a calendarm365_graph_calendar.calendars.delete
  • Delete a calendar groupm365_graph_calendar.calendar_groups.delete
  • Permanently delete a calendarm365_graph_calendar.calendars.permanent_delete
  • Delete a calendar in a groupm365_graph_calendar.calendar_group_calendars.delete
  • Delete an event attachmentm365_graph_calendar.event_attachments.delete
  • Delete an event attachmentm365_graph_calendar.calendar_event_attachments.delete
  • Delete a calendar permissionm365_graph_calendar.calendar_permissions.delete
  • Delete a calendar permissionm365_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.

dom365_graph_calendar.events.deleteconfirm_policy: human

Delete an event on the default calendar?

intent: the user asked me to delete an event on the default calendar

run suspended · waiting for a named person · key m365-graph-calendar-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-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]" }  ]}
Illustrative. Scoped to Microsoft 365 Calendar only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

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

See pricing

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 eventread
  • m365_graph_calendar.calendar_event_attachments.deleteDelete an event attachmentdestructive
  • m365_graph_calendar.calendar_event_attachments.getGet an event attachmentread
  • m365_graph_calendar.calendar_event_attachments.listList attachments on an eventread
  • m365_graph_calendar.calendar_events.countCount events on the default calendar, addressed explicitlyread
  • m365_graph_calendar.calendar_events.createCreate an event on the default calendar, addressed explicitlywrite
  • m365_graph_calendar.calendar_events.deleteDelete an event on the default calendar, addressed explicitlydestructive
  • m365_graph_calendar.calendar_events.deltaTrack event on the default calendar, addressed explicitly changesread
  • m365_graph_calendar.calendar_events.getGet an event on the default calendar, addressed explicitlyread
  • m365_graph_calendar.calendar_events.listList events on the default calendar, addressed explicitlyread
  • m365_graph_calendar.calendar_events.updateUpdate an event on the default calendar, addressed explicitlywrite
  • m365_graph_calendar.calendar_group_calendars.countCount calendars in a calendar groupread
  • m365_graph_calendar.calendar_group_calendars.createCreate a calendar in a groupwrite
  • m365_graph_calendar.calendar_group_calendars.deleteDelete a calendar in a groupdestructive
  • m365_graph_calendar.calendar_group_calendars.getGet a calendar in a groupread
  • m365_graph_calendar.calendar_group_calendars.listList calendars in a calendar groupread
  • m365_graph_calendar.calendar_group_calendars.updateUpdate a calendar in a groupwrite
  • m365_graph_calendar.calendar_groups.countCount calendar groupsread
  • m365_graph_calendar.calendar_groups.createCreate a calendar groupwrite
  • m365_graph_calendar.calendar_groups.deleteDelete a calendar groupdestructive
  • m365_graph_calendar.calendar_groups.getGet a calendar groupread
  • m365_graph_calendar.calendar_groups.listList calendar groupsread
  • m365_graph_calendar.calendar_groups.updateUpdate a calendar groupwrite
  • m365_graph_calendar.calendar_permissions.countCount permissions on a calendarread
  • m365_graph_calendar.calendar_permissions.createCreate a calendar permissionwrite
  • m365_graph_calendar.calendar_permissions.deleteDelete a calendar permissiondestructive
  • m365_graph_calendar.calendar_permissions.getGet a calendar permissionread
  • m365_graph_calendar.calendar_permissions.listList permissions on a calendarread
  • m365_graph_calendar.calendar_permissions.updateUpdate a calendar permissionwrite
  • m365_graph_calendar.calendar_view.deltaTrack changes in the calendar view (calendar view)read
  • m365_graph_calendar.calendar_view.listList the calendar view over the whole mailboxread
  • m365_graph_calendar.calendars.allowed_sharing_rolesList the sharing roles a user may be givenread
  • m365_graph_calendar.calendars.countCount calendarsread
  • m365_graph_calendar.calendars.createCreate a calendarwrite
  • m365_graph_calendar.calendars.deleteDelete a calendardestructive
  • m365_graph_calendar.calendars.getGet a calendarread
  • m365_graph_calendar.calendars.get_defaultGet the default calendarread
  • m365_graph_calendar.calendars.listList calendarsread
  • m365_graph_calendar.calendars.permanent_deletePermanently delete a calendardestructive
  • m365_graph_calendar.calendars.updateUpdate a calendarwrite
  • m365_graph_calendar.calendars.update_defaultUpdate the default calendarwrite
  • m365_graph_calendar.default_calendar_view.deltaTrack changes in the calendar view (default calendar view)read
  • m365_graph_calendar.default_calendar_view.listList the calendar view over the default calendarread
  • m365_graph_calendar.event_attachments.countCount attachments on an eventread
  • m365_graph_calendar.event_attachments.createAttach a file to an eventwrite
  • m365_graph_calendar.event_attachments.create_upload_sessionStart a large event attachment uploadwrite
  • m365_graph_calendar.event_attachments.deleteDelete an event attachmentdestructive
  • m365_graph_calendar.event_attachments.getGet an event attachmentread
  • m365_graph_calendar.event_attachments.get_rawDownload an event attachment's bytesread
  • m365_graph_calendar.event_attachments.listList attachments on an eventread
  • m365_graph_calendar.event_exception_occurrences.listList modified occurrences of a recurring eventread
  • m365_graph_calendar.event_extended_properties.multi_listList multi-value extended properties on an eventread
  • m365_graph_calendar.event_extended_properties.single_listList single-value extended properties on an eventread
  • m365_graph_calendar.event_extensions.listList open extensions on an eventread
  • m365_graph_calendar.event_instances.getGet one occurrence of a recurring eventread
  • m365_graph_calendar.event_instances.listList occurrences of a recurring eventread
  • m365_graph_calendar.events.acceptAccept a meeting invitationwrite
  • m365_graph_calendar.events.cancelCancel a meetingdestructive
  • m365_graph_calendar.events.countCount events on the default calendarread
  • m365_graph_calendar.events.createCreate an event on the default calendarwrite
  • m365_graph_calendar.events.create_rawCreate an event from a raw Graph event objectwrite
  • m365_graph_calendar.events.declineDecline a meeting invitationwrite
  • m365_graph_calendar.events.deleteDelete an event on the default calendardestructive
  • m365_graph_calendar.events.deltaTrack event on the default calendar changesread
  • m365_graph_calendar.events.dismiss_reminderDismiss an event reminderwrite
  • m365_graph_calendar.events.forwardForward a meeting invitationwrite
  • m365_graph_calendar.events.getGet an event on the default calendarread
  • m365_graph_calendar.events.listList events on the default calendarread
  • m365_graph_calendar.events.permanent_deletePermanently delete an eventdestructive
  • m365_graph_calendar.events.searchSearch calendar eventsread
  • m365_graph_calendar.events.snooze_reminderSnooze an event reminderwrite
  • m365_graph_calendar.events.tentatively_acceptTentatively accept a meeting invitationwrite
  • m365_graph_calendar.events.updateUpdate an event on the default calendarwrite
  • m365_graph_calendar.events.update_rawUpdate an event from a raw Graph event objectwrite
  • m365_graph_calendar.group_calendar_events.countCount events on a calendar inside a calendar groupread
  • m365_graph_calendar.group_calendar_events.createCreate an event on a calendar inside a calendar groupwrite
  • m365_graph_calendar.group_calendar_events.deleteDelete an event on a calendar inside a calendar groupdestructive
  • m365_graph_calendar.group_calendar_events.getGet an event on a calendar inside a calendar groupread
  • m365_graph_calendar.group_calendar_events.listList events on a calendar inside a calendar groupread
  • m365_graph_calendar.group_calendar_events.updateUpdate an event on a calendar inside a calendar groupwrite
  • m365_graph_calendar.group_calendar_view.listList the calendar view over a calendar inside a groupread
  • m365_graph_calendar.named_calendar_events.countCount events on one named calendarread
  • m365_graph_calendar.named_calendar_events.createCreate an event on one named calendarwrite
  • m365_graph_calendar.named_calendar_events.deleteDelete an event on one named calendardestructive
  • m365_graph_calendar.named_calendar_events.deltaTrack event on one named calendar changesread
  • m365_graph_calendar.named_calendar_events.getGet an event on one named calendarread
  • m365_graph_calendar.named_calendar_events.listList events on one named calendarread
  • m365_graph_calendar.named_calendar_events.updateUpdate an event on one named calendarwrite
  • m365_graph_calendar.named_calendar_permissions.countCount permissions on a calendarread
  • m365_graph_calendar.named_calendar_permissions.createCreate a calendar permissionwrite
  • m365_graph_calendar.named_calendar_permissions.deleteDelete a calendar permissiondestructive
  • m365_graph_calendar.named_calendar_permissions.getGet a calendar permissionread
  • m365_graph_calendar.named_calendar_permissions.listList permissions on a calendarread
  • m365_graph_calendar.named_calendar_permissions.updateUpdate a calendar permissionwrite
  • m365_graph_calendar.named_calendar_view.listList the calendar view over one named calendarread
  • m365_graph_calendar.places.getGet a placeread
  • m365_graph_calendar.places.updateUpdate a placewrite
  • m365_graph_calendar.room_lists.listList room listsread
  • m365_graph_calendar.room_lists.roomsList the rooms in a room listread
  • m365_graph_calendar.room_lists.workspacesList the workspaces in a room listread
  • m365_graph_calendar.rooms.listList bookable roomsread
  • m365_graph_calendar.scheduling.find_meeting_timesFind a time everyone can meetread
  • m365_graph_calendar.scheduling.get_scheduleGet free/busy for a set of mailboxesread
  • m365_graph_calendar.scheduling.get_schedule_for_calendarGet free/busy for a set of mailboxesread
  • m365_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.