Microsoft Outlook MCP Server gives AI agents full control over Outlook email and calendar workflows, including reading and sending emails, managing attachments, organizing mail, scheduling and updating meetings, managing contacts, and creating tasks.
Encrypted at rest, isolated from the model
Resolved from an AES-256-GCM vault at the moment of the call and attached to the request — the model never sees the secrets.
Try asking
Gets the signed-in user's own profile, returning properties such as displayName, mail, jobTitle, userPrincipalName, and id from the default property set unless `select` narrows it. Only works with a delegated, signed-in-user token — it returns the caller's own profile, not an arbitrary user's.
Lists user objects in the directory, returning the default property set (businessPhones, displayName, givenName, id, jobTitle, mail, mobilePhone, officeLocation, preferredLanguage, surname, userPrincipalName) per user unless `select` requests others. Not supported for personal Microsoft accounts.
Creates a new user object in the directory and returns the created user's default property set, including the `id` needed by get_user, update_user, and delete_user. Not supported for personal Microsoft accounts.
Updates properties on the signed-in user's own profile, or on another user's profile when `user_id` is given (requires higher-privileged admin permissions). Supply only the properties to change — others keep their current value. NOTE: this overwrites the current field values and the prior state isn't stored by the API after the call; the response includes both the before and after state so you have a full record of what changed.
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Permanently deletes a user object by id or userPrincipalName. The user's mailbox, license assignments, and group memberships move to a temporary container recoverable for 30 days; after that they are permanently deleted and the resources freed. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which user will be deleted and that it becomes permanent after 30 days, and wait for their explicit written confirmation before proceeding.
Gets incremental changes to user objects since the last delta query, returning changed users plus either `odata_next_link` (more pages in this round) or `odata_delta_link` (round complete — save it to start the next round).
Creates a draft of a new message and saves it to the Drafts folder without sending it. Returns the created draft, including the `id` needed to send it later with send_draft_message.
Creates a draft Forward message for an existing message, which can be edited and sent later with send_draft_message. Specify recipients via either the top-level `toRecipients` or `message.toRecipients` (exactly one, not both and not neither), and a lead-in note via either `comment` or `message.body` (not both). Returns the created draft.
Creates a draft Reply All message for an existing message, addressed to the sender and all original recipients, which can be edited and sent later with send_draft_message. Specify a lead-in note via either `comment` or `message.body`, not both. Returns the created draft.
Creates a draft Reply message for an existing message, addressed to the sender, which can be edited and sent later with send_draft_message. Specify a lead-in note via either `comment` or `message.body`, not both; use `message.toRecipients` to add recipients beyond the original sender. Returns the created draft.
Forwards an existing message to the given recipients in a single call and saves the forward to Sent Items. Requires at least one recipient in `toRecipients`; use create_draft_to_forward_message instead if the forward needs editing before it's sent. Returns no content on success (202 Accepted).
Retrieves the full properties of a single message by its id, including sender, recipients, body, and read/draft/attachment flags. Use `select` to request only specific properties.
Lists messages in the signed-in user's mailbox, including the Deleted Items and Clutter folders, with optional OData filtering, sorting, searching, and paging. Returns a page of up to `top` messages; follow the response's `odata_next_link` to page through further results instead of setting `skip` manually.
Replies to the sender and all recipients of an existing message in a single call and saves the reply to Sent Items. Use create_draft_to_reply_all instead if the reply needs editing before it's sent. Returns no content on success (202 Accepted).
Replies to the sender of an existing message in a single call and saves the reply to Sent Items. Use `message` to override properties such as adding extra `toRecipients`, and use create_draft_to_reply instead if the reply needs editing before it's sent. Returns no content on success (202 Accepted).
Sends a previously created draft message by its id and saves it to Sent Items. The draft must come from create_draft_message, create_draft_to_reply, create_draft_to_reply_all, or create_draft_to_forward_message. Returns no content on success (202 Accepted).
Composes and sends a new message in a single call without creating a draft first, saving it to Sent Items unless `saveToSentItems` is set to false. `message` must be a full message resource, e.g. subject, body, toRecipients, ccRecipients, attachments. Returns no content on success (202 Accepted).
Updates fields on an existing message — most body/recipient/subject fields are updatable only while the message is still a draft. Supply only the fields to change; others keep their current value. NOTE: this overwrites the current field values and the prior state isn't stored by the API after the call; the response includes both the before and after state so you have a full record of what changed.
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Deletes a message by moving it to Deleted Items. This is a soft delete — the message is recoverable from Deleted Items, though items already in the recoverable items deletions folder may not be deletable this way. For an unrecoverable delete use permanently_delete_message; to relocate instead of deleting, use move_message. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which message will be deleted, and wait for their explicit written confirmation before proceeding.
Copies a message to a destination folder, leaving the original message untouched at its original id. Returns the new copy, which gets its own id in the destination folder.
Gets messages added, updated, or deleted in a mail folder since the last sync round, returning a page of changes plus either `odata_next_link` (more pages in this round) or `odata_delta_link` (round complete — save it to start the next round). A deleted entry appears with `@removed`/`reason: deleted`; folder-level sync can also emit entries that don't reflect an actual change to the message itself.
Moves a message to a destination folder. This creates a new copy of the message there and removes the original — the id the message had before the move stops being valid. NOTE: the original is not preserved after the call; the response includes both the before and after state so you have a full record of what changed.
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Permanently deletes a message into the mailbox's purges folder, bypassing Deleted Items entirely. This is harder than delete_message, and the message becomes unrecoverable once any retention hold expires. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which message will be permanently deleted, and wait for their explicit written confirmation before proceeding.
Lists all the signed-in user's calendars, or the calendars in a specific calendar group. Returns the full set in one response. The `id` of each calendar is used by get_calendar and by any events/ tool that targets a specific calendar.
Gets the properties of a calendar — the signed-in user's default calendar if `id` is omitted, or a specific one of their other calendars otherwise.
Lists single-instance meetings and series masters in the signed-in user's mailbox — not expanded recurring occurrences, use list_calendar_view for that. Returns a page of events; follow the response's `odata_next_link` to page through further results.
Creates a new event on the signed-in user's default calendar. Including `attendees` sends meeting invitations immediately — this can't be suppressed. Returns the created event.
Retrieves the full properties of a single event by its id. Use `select` to request only specific properties.
Updates fields on an existing event. Supply only the fields to change; others keep their current value. An update that includes only `attendees` sends a meeting update to just the attendees that changed. NOTE: this overwrites the current field values and the prior state isn't stored by the API after the call; the response includes both the before and after state so you have a full record of what changed.
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Deletes an event by moving it to Deleted Items. If the event is a meeting, this sends a generic cancellation message to attendees — to send a custom cancellation message instead, use cancel_event (organizer only). NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which event will be deleted, and wait for their explicit written confirmation before proceeding.
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Sends a cancellation message from the organizer to all attendees and cancels the meeting, moving it to Deleted Items. Organizer-only — an attendee gets a 400 error. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which meeting will be cancelled and what message will be sent, and wait for their explicit written confirmation before proceeding.
Accepts an event invitation on the signed-in user's calendar. Applies to user calendars only, not group calendars. Returns no content on success (202 Accepted).
Tentatively accepts an event invitation on the signed-in user's calendar, optionally proposing a new time. Applies to user calendars only, not group calendars. Returns no content on success (202 Accepted).
Declines an event invitation on the signed-in user's calendar, optionally proposing a new time. Applies to user calendars only, not group calendars. Returns no content on success (202 Accepted).
Finds candidate meeting times based on attendee free/busy availability, location, and time constraints, without creating an event. Once a time is picked, create the meeting with create_event. Returns a ranked list of suggestions, or an empty list with `emptySuggestionsReason` explaining why none could be found.
Gets free/busy availability for a set of users, distribution lists, or resources over a specified time period. To get ranked meeting-time suggestions instead of raw availability, use find_meeting_times, which consults the same schedules.
Gets events for a date range from the default calendar, expanding recurring series into individual occurrence instances — use this for "what's actually on the calendar" over a range, unlike list_events which returns series masters unexpanded. Omit `select` to also get `createdDateTime`/`lastModifiedDateTime` on the results, which can't be requested via select.
Outlook MCP Server is open source. Tell the MewCP maintainers.
One endpoint, the same key, whichever client you use.
~/Library/Application Support/Claude/claude_desktop_config.json (Mac) · %APPDATA%\Claude\claude_desktop_config.json (Windows)
Replace API_KEY with your own key.
Already have an "mcpServers" section in your config? Just add the server entry inside it.
Discovery, routing, credentials, tool scoping and execution logs all happen at the gateway→connections stay ACTIVE with no work from you
Outlook runs through a gateway that holds the credentials, scopes the access and records every call.
Managed auth, hosted MCP servers, and every Outlook tool your agent needs.
Free to start.