Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@M365 Calendar MCP ServerWhat does my schedule look like for the rest of the day?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
M365 Calendar MCP Server
A Model Context Protocol (MCP) server for Microsoft 365 Calendar integration. Enables AI assistants like Claude to manage your Outlook/Microsoft 365 calendar through the Microsoft Graph API.
Features
List Calendars - View all your calendars with permissions and ownership info
List Events - Browse events in a date range with full details (supports recurring events)
Get Event - Retrieve complete event details including body, recurrence, and attachments info
Create Event - Create events with attendees, Teams meetings, recurrence, reminders, and more
Update Event - Modify any event property (partial updates supported)
Delete Event - Remove events with automatic cancellation notices
Respond to Events - Accept, tentatively accept, or decline meeting invitations
Find Meeting Times - Find available meeting slots across multiple attendees
Prerequisites
Node.js >= 18
A Microsoft 365 account (work, school, or personal)
An Azure AD app registration
Azure AD App Setup
Go to the Azure Portal > Azure Active Directory > App registrations
Click New registration
Name:
M365 Calendar MCPSupported account types: Choose based on your needs (single tenant or multi-tenant)
Redirect URI: Leave blank (we use device code flow)
After creation, note the Application (client) ID and Directory (tenant) ID
Go to API permissions > Add a permission > Microsoft Graph > Delegated permissions
Add the following permissions:
Calendars.ReadWriteCalendars.ReadUser.Read
Go to Authentication > Enable Allow public client flows (required for device code flow)
Installation
Configuration
Set the following environment variables:
Authentication
Before using the MCP server, authenticate with your Microsoft account:
This will display a URL and code. Open the URL in your browser, enter the code, and sign in with your Microsoft account.
Other auth commands:
Usage with Claude Desktop
Add to your Claude Desktop configuration (claude_desktop_config.json):
Usage with Claude Code
Make sure M365_CLIENT_ID is set in your environment.
Available Tools
list-calendars
Lists all calendars accessible to the authenticated user, including shared calendars. Returns each calendar's name, ID, color, default status, edit/share permissions, and owner information.
This is a good starting point to discover calendar IDs. The id returned here can be passed as the calendarId parameter to any other tool. If you omit calendarId in other tools, they default to the user's primary calendar.
Parameters: None
Returns: Array of calendars with id, name, color, isDefault, canEdit, canShare, and owner.
list-events
Lists calendar events within a date/time range. Uses Microsoft's calendarView endpoint, which automatically expands recurring event series into their individual instances within the range. Results are sorted by start time.
Use this tool to answer questions like "What's on my calendar this week?" or "Do I have any meetings tomorrow afternoon?" Follow up with get-event on any event ID to retrieve full details.
Parameters:
Param | Required | Type | Description |
| Yes | string | Start of the time range in ISO 8601 format (e.g., |
| Yes | string | End of the time range in ISO 8601 format (e.g., |
| No | string | Calendar ID from |
| No | number | Maximum number of events to return (default: 25, max: 100) |
Returns: Array of event summaries including subject, start/end times with time zones, location, organizer, attendees with response status, isAllDay, isCancelled, isOnlineMeeting, onlineMeetingUrl, webLink, showAs, importance, isRecurring, and your own myResponse.
Tip: All date/time values should include a timezone offset or use UTC (Z suffix). The response includes time zone information for each event so you can display times correctly.
get-event
Retrieves the full details of a single calendar event by its ID. This returns significantly more data than list-events, including the full HTML body, all locations, online meeting join details, recurrence patterns, categories, attachment indicators, and audit timestamps.
Use this after list-events when you need the complete body content, the Teams join URL, or the recurrence configuration.
Parameters:
Param | Required | Type | Description |
| Yes | string | The event ID (obtained from |
| No | string | Calendar ID. Defaults to the primary calendar. |
Returns: Full event object including body (HTML), locations[], onlineMeeting (join URL, conference ID, toll numbers), recurrence (pattern + range), categories[], hasAttachments, seriesMasterId, type (singleInstance/occurrence/exception/seriesMaster), createdDateTime, and lastModifiedDateTime.
create-event
Creates a new calendar event with full control over all properties. Supports plain events, all-day events, events with attendees (which automatically send invitations), Teams online meetings, recurring events, and custom reminders.
After creating an event, the full created event object is returned, including the server-assigned id and any auto-generated fields like the Teams meeting URL.
Parameters:
Param | Required | Type | Default | Description |
| Yes | string | - | Event title |
| Yes | string | - | Start in ISO 8601 (e.g., |
| Yes | string | - | End in ISO 8601 (e.g., |
| No | string | - | Event description (HTML supported) |
| No | string |
| IANA time zone (e.g., |
| No | string |
| IANA time zone for end |
| No | string | - | Location display name (e.g., "Conference Room A") |
| No | array | - | List of |
| No | boolean |
| All-day event (start/end should be date-only, e.g., |
| No | boolean |
| Set |
| No | enum |
|
|
| No | enum |
|
|
| No | enum |
|
|
| No | string[] | - | Color category labels |
| No | number |
| Reminder timing in minutes |
| No | string | - | Target calendar ID. Defaults to the primary calendar. |
| No | object | - | Recurrence pattern and range (see below) |
Recurrence object structure:
Pattern types:
daily,weekly,absoluteMonthly,relativeMonthly,absoluteYearly,relativeYearlyRange types:
endDate(withendDate),noEnd(runs forever),numbered(withnumberOfOccurrences)For
weekly: usedaysOfWeek. ForabsoluteMonthly: usedayOfMonth. ForrelativeMonthly: usedaysOfWeek+index(first,second,third,fourth,last).
Tip: When adding attendees, Microsoft automatically sends invitation emails. Set isOnlineMeeting: true to include a Teams join link in the invitation.
update-event
Updates an existing calendar event using partial update (PATCH) semantics. Only the fields you provide are modified; all other fields remain unchanged. This is safe to use when you only need to change one property (e.g., updating just the subject or moving the time).
If the event has attendees, Microsoft sends update notifications automatically when relevant fields change (time, location, etc.).
Parameters:
Param | Required | Type | Description |
| Yes | string | The ID of the event to update |
| No | string | Calendar ID. Defaults to the primary calendar. |
All other parameters are the same as create-event (subject, body, startDateTime, endDateTime, location, attendees, etc.) but all are optional. Only include the fields you want to change.
Returns: The full updated event object.
Tip: To reschedule, provide both startDateTime and endDateTime together. To update attendees, provide the complete attendee list (it replaces the existing list, not appends).
delete-event
Permanently deletes a calendar event. If the authenticated user is the organizer and the event has attendees, Microsoft automatically sends cancellation notices to all attendees.
This action cannot be undone. The event is moved to the Deleted Items folder.
Parameters:
Param | Required | Type | Description |
| Yes | string | The ID of the event to delete |
| No | string | Calendar ID. Defaults to the primary calendar. |
Returns: Confirmation message.
respond-event
Responds to a calendar event invitation that someone else organized. You can accept, tentatively accept, or decline. Optionally include a message visible to the organizer, and control whether a response email is actually sent.
Use this after finding an event via list-events where your myResponse is none or notResponded.
Parameters:
Param | Required | Type | Default | Description |
| Yes | string | - | The ID of the event to respond to |
| Yes | enum | - |
|
| No | string | - | Message to include with the response (visible to the organizer) |
| No | boolean |
| Set |
Returns: Confirmation message.
find-meeting-times
Finds available meeting times for a group of attendees using Microsoft's scheduling intelligence. This queries each attendee's calendar availability and suggests optimal time slots where everyone (or the most people) can meet.
This is particularly useful for scheduling meetings with multiple people without manually checking each person's calendar. Use the suggested time slots with create-event to book the meeting.
Parameters:
Param | Required | Type | Default | Description |
| Yes | array | - | List of |
| Yes | string | - | Start of the search window in ISO 8601 |
| Yes | string | - | End of the search window in ISO 8601 |
| No | number |
| Desired meeting length in minutes |
| No | number |
| Maximum number of time suggestions to return |
| No | boolean |
| If |
| No | string |
| Time zone for the suggestions (e.g., |
Returns: Meeting time suggestions from Microsoft's scheduling engine, including the proposed time slots, attendee availability for each slot, and a confidence score.
Tip: The search window should be at least a few days wide to get good results. The attendees must be in the same Microsoft 365 organization (or federated) for availability lookup to work.
Typical Workflow
list-calendars- Discover available calendars and their IDslist-events- Browse events in a date range on a specific calendarget-event- Drill into a specific event for full details (body, Teams link, recurrence)find-meeting-times- Find a slot that works for everyone, then...create-event- Book the meeting with attendees and a Teams linkupdate-event- Reschedule or modify the event laterrespond-event- Accept or decline meetings others have invited you todelete-event- Cancel a meeting you organized
Development
License
MIT