A comprehensive personal Outlook integration via Microsoft Graph API with 62 tools spanning mail, calendar, contacts, to-do lists, and drafts. Supports all the operations you'd expect: reading and searching messages, managing Focused Inbox classification, sending and replying to mail, creating calendar events with recurring expansion, CRUD on contacts and tasks, plus batch operations and attachment handling including large file upload sessions. Designed for personal Microsoft accounts only (Outlook.com, Hotmail, Live), not Entra ID work accounts. You bring your own Azure app registration, tokens live in your OS keyring, and there's optional read-only mode plus granular category permissions. Built for agent builders who need typed MCP tool schemas instead of parsing CLI stdout.
Public tool metadata for what this MCP can expose to an agent.
OUTLOOK_ADD_EVENT_ATTACHMENTAdds an attachment to a specific Outlook calendar event. Use when you need to attach a file or nested item to an existing event.6 paramsAdds an attachment to a specific Outlook calendar event. Use when you need to attach a file or nested item to an existing event.
itemobjectnamestringuser_idstringevent_idstringodata_typestring#microsoft.graph.fileAttachment · #microsoft.graph.itemAttachmentcontentBytesstringOUTLOOK_ADD_MAIL_ATTACHMENTTool to add an attachment to an email message. Use when you have a message ID and need to attach a small (<3 MB) file or reference.10 paramsTool to add an attachment to an email message. Use when you have a message ID and need to attach a small (<3 MB) file or reference.
itemobjectnamestringuser_idstringisInlinebooleancontentIdstringmessage_idstringodata_typestringcontentTypestringcontentBytesstringcontentLocationstringOUTLOOK_CALENDAR_CREATE_EVENTCreates a new Outlook calendar event, ensuring `start_datetime` is chronologically before `end_datetime`.13 paramsCreates a new Outlook calendar event, ensuring `start_datetime` is chronologically before `end_datetime`.
bodystringis_htmlbooleanshow_asstringsubjectstringuser_idstringlocationstringtime_zonestringcategoriesarrayend_datetimestringattendees_infoarraystart_datetimestringis_online_meetingbooleanonline_meeting_providerstringOUTLOOK_CREATE_ATTACHMENT_UPLOAD_SESSIONTool to create an upload session for large (>3 MB) message attachments. Use when you need to upload attachments in chunks.3 paramsTool to create an upload session for large (>3 MB) message attachments. Use when you need to upload attachments in chunks.
user_idstringmessage_idstringattachmentItemobjectOUTLOOK_CREATE_CALENDARTool to create a new calendar in the signed-in user's mailbox. Use when organizing events into a separate calendar.4 paramsTool to create a new calendar in the signed-in user's mailbox. Use when organizing events into a separate calendar.
namestringcolorstringauto · lightBlue · lightGreen · lightOrange · lightGray · lightYellowuser_idstringhexColorstringOUTLOOK_CREATE_CONTACTCreates a new contact in a Microsoft Outlook user's contacts folder.15 paramsCreates a new contact in a Microsoft Outlook user's contacts folder.
notesstringsurnamestringuser_idstringbirthdaystringjobTitlestringgivenNamestringhomePhonestringcategoriesarraydepartmentstringcompanyNamestringdisplayNamestringmobilePhonestringbusinessPhonesarrayemailAddressesarrayofficeLocationstringOUTLOOK_CREATE_CONTACT_FOLDERTool to create a new contact folder in the user's mailbox. Use when needing to organize contacts into custom folders.3 paramsTool to create a new contact folder in the user's mailbox. Use when needing to organize contacts into custom folders.
user_idstringdisplayNamestringparentFolderIdstringOUTLOOK_CREATE_DRAFTCreates an Outlook email draft with subject, body, recipients, and an optional attachment. Supports creating drafts as part of existing conversation threads by specifying a conversationId; attachments require a name, mimetype, and content.8 paramsCreates an Outlook email draft with subject, body, recipients, and an optional attachment. Supports creating drafts as part of existing conversation threads by specifying a conversationId; attachments require a name, mimetype, and content.
bodystringis_htmlbooleansubjectstringattachmentstringcc_recipientsarrayto_recipientsarraybcc_recipientsarrayconversation_idstringOUTLOOK_CREATE_DRAFT_REPLYCreates a draft reply in the specified user's Outlook mailbox to an existing message (identified by a valid `message_id`), optionally including a `comment` and CC/BCC recipients.5 paramsCreates a draft reply in the specified user's Outlook mailbox to an existing message (identified by a valid `message_id`), optionally including a `comment` and CC/BCC recipients.
commentstringuser_idstringcc_emailsarraybcc_emailsarraymessage_idstringOUTLOOK_CREATE_EMAIL_RULECreate email rule filter with conditions and actions5 paramsCreate email rule filter with conditions and actions
actionsobjectsequenceintegerisEnabledbooleanconditionsobjectdisplayNamestringOUTLOOK_CREATE_MAIL_FOLDERTool to create a new mail folder. Use when you need to organize email into a new folder.3 paramsTool to create a new mail folder. Use when you need to organize email into a new folder.
user_idstringisHiddenbooleandisplayNamestringOUTLOOK_CREATE_MASTER_CATEGORYTool to create a new category in the user's master category list. Use after selecting a unique display name.2 paramsTool to create a new category in the user's master category list. Use after selecting a unique display name.
colorstringpreset0 · preset1 · preset2 · preset3 · preset4 · preset5displayNamestringOUTLOOK_DELETE_CONTACTPermanently deletes an existing contact, using its `contact_id` (obtainable via 'List User Contacts' or 'Get Contact'), from the Outlook contacts of the user specified by `user_id`.2 paramsPermanently deletes an existing contact, using its `contact_id` (obtainable via 'List User Contacts' or 'Get Contact'), from the Outlook contacts of the user specified by `user_id`.
user_idstringcontact_idstringOUTLOOK_DELETE_EMAIL_RULEDelete an email rule1 paramsDelete an email rule
ruleIdstringOUTLOOK_DELETE_EVENTDeletes an existing calendar event, identified by its unique `event_id`, from a specified user's Microsoft Outlook calendar, with an option to send cancellation notifications to attendees.3 paramsDeletes an existing calendar event, identified by its unique `event_id`, from a specified user's Microsoft Outlook calendar, with an option to send cancellation notifications to attendees.
user_idstringevent_idstringsend_notificationsbooleanOUTLOOK_DELETE_MAIL_FOLDERDelete a mail folder from the user's mailbox. Use when you need to remove an existing mail folder.2 paramsDelete a mail folder from the user's mailbox. Use when you need to remove an existing mail folder.
user_idstringfolder_idstringOUTLOOK_DOWNLOAD_OUTLOOK_ATTACHMENTDownloads a specific file attachment from an email message in a Microsoft Outlook mailbox; the attachment must contain 'contentBytes' (binary data) and not be a link or embedded item.4 paramsDownloads a specific file attachment from an email message in a Microsoft Outlook mailbox; the attachment must contain 'contentBytes' (binary data) and not be a link or embedded item.
user_idstringfile_namestringmessage_idstringattachment_idstringOUTLOOK_GET_CALENDAR_VIEWGet events ACTIVE during a time window (includes multi-day events). Use for "what's on my calendar today/this week" or availability checks. Returns events overlapping the time range. For keyword search or filters by category, use OUTLOOK_LIST_EVENTS instead.7 paramsGet events ACTIVE during a time window (includes multi-day events). Use for "what's on my calendar today/this week" or availability checks. Returns events overlapping the time range. For keyword search or filters by category, use OUTLOOK_LIST_EVENTS instead.
topintegerselectarrayuser_idstringtimezonestringcalendar_idstringend_datetimestringstart_datetimestringOUTLOOK_GET_CONTACTRetrieves a specific Outlook contact by its `contact_id` from the contacts of a specified `user_id` (defaults to 'me' for the authenticated user).2 paramsRetrieves a specific Outlook contact by its `contact_id` from the contacts of a specified `user_id` (defaults to 'me' for the authenticated user).
user_idstringcontact_idstringOUTLOOK_GET_CONTACT_FOLDERSTool to retrieve a list of contact folders in the signed-in user's mailbox. Use after authentication when you need to browse or select among contact folders.7 paramsTool to retrieve a list of contact folders in the signed-in user's mailbox. Use after authentication when you need to browse or select among contact folders.
topintegerskipintegerexpandarrayfilterstringselectarrayorderbyarrayuser_idstringOUTLOOK_GET_EVENTRetrieves the full details of a specific calendar event by its ID from a user's Outlook calendar, provided the event exists.2 paramsRetrieves the full details of a specific calendar event by its ID from a user's Outlook calendar, provided the event exists.
user_idstringevent_idstringOUTLOOK_GET_MAILBOX_SETTINGSTool to retrieve mailbox settings. Use when you need to view settings such as automatic replies, time zone, and working hours for the signed-in or specified user.3 paramsTool to retrieve mailbox settings. Use when you need to view settings such as automatic replies, time zone, and working hours for the signed-in or specified user.
expandarrayselectarrayuser_idstringOUTLOOK_GET_MAIL_DELTARetrieve incremental changes (delta) of messages in a mailbox. FIRST RUN: Returns ALL messages in folder (use top=50 to limit). Response has @odata.deltaLink. SUBSEQUENT: Pass stored deltaLink to get only NEW/UPDATED/DELETED messages since last sync. Properties available: id,...7 paramsRetrieve incremental changes (delta) of messages in a mailbox. FIRST RUN: Returns ALL messages in folder (use top=50 to limit). Response has @odata.deltaLink. SUBSEQUENT: Pass stored deltaLink to get only NEW/UPDATED/DELETED messages since last sync. Properties available: id,...
topintegerexpandarrayselectarrayuser_idstringfolder_idstringskip_tokenstringdelta_tokenstringOUTLOOK_GET_MAIL_TIPSTool to retrieve mail tips such as automatic replies and mailbox full status. Use when you need to check recipient status before sending mail.3 paramsTool to retrieve mail tips such as automatic replies and mailbox full status. Use when you need to check recipient status before sending mail.
user_idstringEmailAddressesarrayMailTipsOptionsarrayOUTLOOK_GET_MASTER_CATEGORIESTool to retrieve the user's master category list. Use when you need to get all categories defined for the user.6 paramsTool to retrieve the user's master category list. Use when you need to get all categories defined for the user.
topintegerskipintegerfilterstringselectarrayorderbyarrayuser_idstringOUTLOOK_GET_MESSAGERetrieves a specific email message by its ID from the specified user's Outlook mailbox. Use the 'select' parameter to include specific fields like 'internetMessageHeaders' for filtering automated emails.3 paramsRetrieves a specific email message by its ID from the specified user's Outlook mailbox. Use the 'select' parameter to include specific fields like 'internetMessageHeaders' for filtering automated emails.
selectarrayuser_idstringmessage_idstringOUTLOOK_GET_PROFILERetrieves the Microsoft Outlook profile for a specified user.1 paramsRetrieves the Microsoft Outlook profile for a specified user.
user_idstringOUTLOOK_GET_SCHEDULERetrieves free/busy schedule information for specified email addresses within a defined time window.4 paramsRetrieves free/busy schedule information for specified email addresses within a defined time window.
EndTimeobjectSchedulesarrayStartTimeobjectavailabilityViewIntervalstringOUTLOOK_GET_SUPPORTED_LANGUAGESTool to retrieve supported languages in the user's mailbox. Use when you need to display or select from available mailbox languages.1 paramsTool to retrieve supported languages in the user's mailbox. Use when you need to display or select from available mailbox languages.
user_idstringOUTLOOK_GET_SUPPORTED_TIME_ZONESTool to retrieve supported time zones in the user's mailbox. Use when you need a list of time zones to display or choose from for event scheduling.1 paramsTool to retrieve supported time zones in the user's mailbox. Use when you need a list of time zones to display or choose from for event scheduling.
timeZoneStandardstringWindows · IanaOUTLOOK_LIST_CALENDARSTool to list calendars in the signed-in user's mailbox. Use when you need to retrieve calendars with optional OData queries.6 paramsTool to list calendars in the signed-in user's mailbox. Use when you need to retrieve calendars with optional OData queries.
topintegerskipintegerfilterstringselectarrayorderbyarrayuser_idstringOUTLOOK_LIST_CONTACTSRetrieves a user's Microsoft Outlook contacts, from the default or a specified contact folder.6 paramsRetrieves a user's Microsoft Outlook contacts, from the default or a specified contact folder.
topintegerfilterstringselectarrayorderbyarrayuser_idstringcontact_folder_idstringOUTLOOK_LIST_EMAIL_RULESList all email rules from inbox1 paramsList all email rules from inbox
topintegerOUTLOOK_LIST_EVENT_ATTACHMENTSTool to list attachments for a specific Outlook calendar event. Use when you have an event ID and need to view its attachments.7 paramsTool to list attachments for a specific Outlook calendar event. Use when you have an event ID and need to view its attachments.
topintegerskipintegerfilterstringselectarrayorderbyarrayuser_idstringevent_idstringOUTLOOK_LIST_EVENTSRetrieves events from a user's Outlook calendar via Microsoft Graph API. Supports primary/secondary/shared calendars, pagination, filtering, property selection, sorting, and timezone specification. Use calendar_id to access non-primary calendars.9 paramsRetrieves events from a user's Outlook calendar via Microsoft Graph API. Supports primary/secondary/shared calendars, pagination, filtering, property selection, sorting, and timezone specification. Use calendar_id to access non-primary calendars.
topintegerskipintegerfilterstringselectarrayorderbyarrayuser_idstringtimezonestringcalendar_idstringexpand_recurring_eventsbooleanOUTLOOK_LIST_MAIL_FOLDERSTool to list a user's top-level mail folders. Use when you need folders like Inbox, Drafts, Sent Items; set include_hidden_folders=True to include hidden folders.2 paramsTool to list a user's top-level mail folders. Use when you need folders like Inbox, Drafts, Sent Items; set include_hidden_folders=True to include hidden folders.
user_idstringinclude_hidden_foldersbooleanOUTLOOK_LIST_MESSAGESRetrieves a list of email messages from a specified mail folder in an Outlook mailbox, with options for filtering (including by conversationId to get all messages in a thread), pagination, and sorting; ensure 'user_id' and 'folder' are valid, and all date/time strings are in I...22 paramsRetrieves a list of email messages from a specified mail folder in an Outlook mailbox, with options for filtering (including by conversationId to get all messages in a thread), pagination, and sorting; ensure 'user_id' and 'folder' are valid, and all date/time strings are in I...
topintegerskipintegerfolderstringselectarrayis_readbooleanorderbyarraysubjectstringuser_idstringcategoriesarrayimportancestringfrom_addressstringconversationIdstringhas_attachmentsbooleansubject_containsstringsubject_endswithstringsent_date_time_gtstringsent_date_time_ltstringsubject_startswithstringreceived_date_time_gestringreceived_date_time_gtstringreceived_date_time_lestringreceived_date_time_ltstringOUTLOOK_LIST_OUTLOOK_ATTACHMENTSLists metadata (like name, size, and type, but not `contentBytes`) for all attachments of a specified Outlook email message.2 paramsLists metadata (like name, size, and type, but not `contentBytes`) for all attachments of a specified Outlook email message.
user_idstringmessage_idstringOUTLOOK_LIST_REMINDERSTool to retrieve reminders for events occurring within a specified time range. Use when you need to see upcoming reminders between two datetimes.3 paramsTool to retrieve reminders for events occurring within a specified time range. Use when you need to see upcoming reminders between two datetimes.
userIdstringendDateTimestringstartDateTimestringOUTLOOK_LIST_USERSTool to list users in Microsoft Entra ID. Use when you need to retrieve a paginated list of users, optionally filtering or selecting specific properties.4 paramsTool to list users in Microsoft Entra ID. Use when you need to retrieve a paginated list of users, optionally filtering or selecting specific properties.
topintegerskipintegerfilterstringselectarrayOUTLOOK_MOVE_MESSAGEMove a message to another folder within the specified user's mailbox. This creates a new copy of the message in the destination folder and removes the original message.3 paramsMove a message to another folder within the specified user's mailbox. This creates a new copy of the message in the destination folder and removes the original message.
user_idstringmessage_idstringdestination_idstringOUTLOOK_QUERY_EMAILSPrimary tool for querying Outlook emails with custom OData filters. Build precise server-side filters for dates, read status, importance, subjects, attachments, and conversations. Best for structured queries on message metadata. Returns up to 100 messages per request with pagi...7 paramsPrimary tool for querying Outlook emails with custom OData filters. Build precise server-side filters for dates, read status, importance, subjects, attachments, and conversations. Best for structured queries on message metadata. Returns up to 100 messages per request with pagi...
topintegerskipintegerfilterstringfolderstringselectarrayorderbystringuser_idstringOUTLOOK_REPLY_EMAILSends a plain text reply to an Outlook email message, identified by `message_id`, allowing optional CC and BCC recipients.5 paramsSends a plain text reply to an Outlook email message, identified by `message_id`, allowing optional CC and BCC recipients.
commentstringuser_idstringcc_emailsarraybcc_emailsarraymessage_idstringOUTLOOK_SEARCH_MESSAGESSearch Outlook messages using powerful KQL syntax. Supports sender (from:), recipient (to:, cc:), subject, date filters (received:, sent:), attachments, and boolean logic. Only works with Microsoft 365/Enterprise accounts (no @hotmail.com/@outlook.com). Examples: 'from:user@ex...7 paramsSearch Outlook messages using powerful KQL syntax. Supports sender (from:), recipient (to:, cc:), subject, date filters (received:, sent:), attachments, and boolean logic. Only works with Microsoft 365/Enterprise accounts (no @hotmail.com/@outlook.com). Examples: 'from:user@ex...
sizeintegerquerystringsubjectstringfromEmailstringfrom_indexintegerhasAttachmentsbooleanenable_top_resultsbooleanOUTLOOK_SEND_DRAFTTool to send an existing draft message. Use after creating a draft when you want to deliver it to recipients immediately. Example: Send a draft message with ID 'AAMkAG…'.2 paramsTool to send an existing draft message. Use after creating a draft when you want to deliver it to recipients immediately. Example: Send a draft message with ID 'AAMkAG…'.
user_idstringmessage_idstringOUTLOOK_SEND_EMAILSends an email with subject, body, recipients, and an optional attachment via Microsoft Graph API. Supports comma-separated email addresses in the to_email field for multiple recipients. Attachments require a non-empty file with valid name and mimetype.11 paramsSends an email with subject, body, recipients, and an optional attachment via Microsoft Graph API. Supports comma-separated email addresses in the to_email field for multiple recipients. Attachments require a non-empty file with valid name and mimetype.
bodystringfromstringis_htmlbooleansubjectstringto_namestringuser_idstringto_emailstringcc_emailsarrayattachmentstringbcc_emailsarraysave_to_sent_itemsbooleanOUTLOOK_UPDATE_CALENDAR_EVENTUpdates specified fields of an existing Outlook calendar event. Implementation note: To avoid unintentionally clearing properties, the action first fetches the existing event, merges only the provided fields, and then PATCHes the merged updates. Unspecified fields remain uncha...11 paramsUpdates specified fields of an existing Outlook calendar event. Implementation note: To avoid unintentionally clearing properties, the action first fetches the existing event, merges only the provided fields, and then PATCHes the merged updates. Unspecified fields remain uncha...
bodyobjectshow_asstringsubjectstringuser_idstringevent_idstringlocationobjectattendeesarraytime_zonestringcategoriesarrayend_datetimestringstart_datetimestringOUTLOOK_UPDATE_CONTACTUpdates an existing Outlook contact, identified by `contact_id` for the specified `user_id`, requiring at least one other field to be modified.16 paramsUpdates an existing Outlook contact, identified by `contact_id` for the specified `user_id`, requiring at least one other field to be modified.
notesstringsurnamestringuser_idstringbirthdaystringjobTitlestringgivenNamestringcategoriesarraycontact_idstringdepartmentstringhomePhonesarraycompanyNamestringdisplayNamestringmobilePhonestringbusinessPhonesarrayemailAddressesarrayofficeLocationstringOUTLOOK_UPDATE_EMAILUpdates specified properties of an existing email message; `message_id` must identify a valid message within the specified `user_id`'s mailbox.9 paramsUpdates specified properties of an existing email message; `message_id` must identify a valid message within the specified `user_id`'s mailbox.
bodyobjectis_readbooleansubjectstringuser_idstringimportancestringmessage_idstringcc_recipientsarrayto_recipientsarraybcc_recipientsarrayOUTLOOK_UPDATE_EMAIL_RULEUpdate an existing email rule6 paramsUpdate an existing email rule
ruleIdstringactionsobjectsequenceintegerisEnabledbooleanconditionsobjectdisplayNamestringOUTLOOK_UPDATE_MAILBOX_SETTINGSTool to update mailbox settings for the signed-in user. Use when you need to configure automatic replies, default time zone, language, or working hours. Example: schedule automatic replies for vacation.4 paramsTool to update mailbox settings for the signed-in user. Use when you need to configure automatic replies, default time zone, language, or working hours. Example: schedule automatic replies for vacation.
languageobjecttimeZonestringworkingHoursobjectautomaticRepliesSettingobjectMCP server for Microsoft Outlook personal accounts via Microsoft Graph API.
Personal Microsoft accounts only —
@outlook.com,@hotmail.com,@live.com. Work/school accounts (Entra ID) are not supported in v1.
Disclaimer: Independent open-source project. Not affiliated with, endorsed by, or supported by Microsoft Corporation. "Outlook" and "Microsoft Graph" are trademarks of Microsoft.
You'll like this if you're:
allow_categories, optional read_only mode, zero telemetryThis isn't for you if you need work/school M365 accounts (use Microsoft's official tooling — Entra ID auth and admin-consent flows are out of scope here), or if a basic mail-only client would suffice (this has 62 tools — way more than you need for "read my inbox").
This is the only first-class MCP server in the personal-Outlook space — most alternatives are bash scripts or skill-shaped CLI wrappers the agent shells out to. That distinction matters: the agent gets typed tool schemas with structured args/returns, not stdout it has to parse. Other things you won't find elsewhere: /$batch-optimized triage (10-20× faster on bulk ops), recursive folder ops with name resolution, granular per-category permissions, multi-account support, and full attachment write paths including >3MB upload sessions for drafts.
Give your AI agent full Outlook access. Example prompts that just work:
The server exposes 62 discrete tools so the agent can compose its own workflow — read, triage, write, schedule, track tasks — without hardcoded macros.
~/.claude/settings.json under mcpServersListed on the official MCP Registry as io.github.mpalermiti/outlook-mcp.
62 tools across 13 categories:
$batch, search (KQL), list folders, delta-sync inbox changes, composed "since last call" digest across mail/events/contactsDesign principles:
azure-identity (macOS Keychain, Windows Credential Store, Linux Secret Service).read_only: true in config to block all write operations.permanent: true.Two pure-code upgrades that make the same 57 tools cheaper and more recoverable for AI agents:
Concise mode — pass concise=True to the five high-volume read tools (outlook_list_inbox, outlook_read_message, outlook_search_mail, outlook_list_events, outlook_list_thread) to drop bulky fields: full message bodies, per-event attendee lists, quoted prior-message text in threads, body previews/categories on inbox listings. Typical payload reduction ~10×. Default concise=False preserves the existing response shape — strict backward compat.
Structured Graph errors — every tool wraps msgraph SDK exceptions into {code, message, action} responses with operator-friendly recovery hints: re-auth on 401, ROADMAP pointer on 403/ErrorAccessDenied (known unsupported-endpoint dead-ends), re-list on 404/ErrorItemNotFound, back-off on 429, retry on 503. OutlookMCPError subclasses and validation errors pass through unchanged.
You need to register a free Azure AD app to get a client ID.
Microsoft has deprecated app registration for personal accounts without an Azure AD tenant. You need to create a free Azure account first:
@outlook.com account. Requires a credit card for identity verification but won't charge you. This creates a proper Azure AD tenant.Go to App Registrations and sign in with your @outlook.com account.
Click "+ New registration" and fill in:
mp-outlook-mcp — names like "Outlook MCP" will be rejected)Click Register. Copy the Application (client) ID from the overview page.
Go to Authentication (Preview) → Settings tab → toggle "Allow public client flows" to Yes → Save.
Go to API permissions → Add a permission → Microsoft Graph → Delegated permissions → add:
Mail.ReadWrite, Mail.SendCalendars.ReadWriteContacts.ReadWrite, Tasks.ReadWriteUser.Read, offline_accessNo client secret is needed. The device code flow uses public client auth.
Option A — from PyPI (recommended):
uv tool install outlook-graph-mcp
# or: pipx install outlook-graph-mcp
# or: pip install outlook-graph-mcp
Option B — from source:
git clone https://github.com/mpalermiti/outlook-mcp.git
cd outlook-mcp
uv sync
Create ~/.outlook-mcp/config.json:
{
"client_id": "YOUR_APPLICATION_CLIENT_ID",
"tenant_id": "consumers",
"timezone": "America/Los_Angeles",
"read_only": true
}
The only required field is client_id. Everything else has sensible defaults. Start with read_only: true — flip to false when you're comfortable.
If installed from PyPI:
{
"mcpServers": {
"outlook": {
"command": "outlook-mcp"
}
}
}
If installed from source:
{
"mcpServers": {
"outlook": {
"command": "uv",
"args": ["--directory", "/path/to/outlook-mcp", "run", "outlook-mcp"]
}
}
}
For OpenClaw, use the openclaw mcp CLI — it writes to mcp.servers in ~/.openclaw/openclaw.json for you:
# If installed from PyPI:
openclaw mcp set outlook '{"command":"outlook-mcp"}'
# If installed from source:
openclaw mcp set outlook '{"command":"uv","args":["--directory","/path/to/outlook-mcp","run","outlook-mcp"]}'
# Verify:
openclaw mcp list
openclaw mcp show outlook --json
Restart the OpenClaw gateway after registering. See the OpenClaw MCP docs for SSE/HTTP transport variants.
Run this once on the machine where the MCP server will run:
uv run outlook-mcp auth
You'll get a URL and a code. Open the URL in any browser, enter the code, and sign in with your Microsoft account. Tokens are cached in the OS keyring — the MCP server picks them up automatically.
Other CLI commands:
uv run outlook-mcp status # Check auth status
uv run outlook-mcp logout # Clear credentials
uv run outlook-mcp serve # Start MCP server (default, used by OpenClaw/Claude)
| Tool | Description |
|---|---|
outlook_auth_status | Check if authenticated and whether read-only mode is active. |
Note: Authentication is handled via the CLI (
outlook-mcp auth), not through MCP tools. See Authenticate above.
| Tool | Description |
|---|---|
outlook_list_inbox | List messages in a folder. folder accepts display names, well-known names, or Graph IDs. Filter by read status, sender, date range, Focused Inbox classification. Pagination via skip. |
outlook_read_message | Get full message by ID. Format: text, html, or full (both). Pass include_deferred_send=True to also surface the draft's scheduled delivery time. |
outlook_read_messages | Bulk read up to 20 messages by ID via Graph $batch in one round-trip. Per-message shape matches outlook_read_message byte-for-byte for the same (format, concise, include_deferred_send). Partial-failure tolerant: 404s on some IDs surface in failures[] without failing the whole call. Use NOT N outlook_read_message calls. |
outlook_search_mail | Search mail using KQL query. Optionally scope to a folder by name or ID. |
outlook_list_folders | List mail folders with counts, parent_id, and child_count. Pass recursive=true to walk the full folder tree (subfolders included). |
outlook_list_inbox_delta | List only inbox changes since the last call. First call returns a full snapshot plus a delta_token; subsequent calls (token passed back) return only added/updated/deleted items. Deletes come back as {id, is_deleted: True}. Cursor is stateless — agent persists and replays. |
outlook_changes_since | One structured "since last call" digest composing mail/events/contacts deltas. Returns counts + urgent_flagged mail + top-5 by_sender + new/cancelled events. Each resource has an independent delta_token; stale-token recovery (HTTP 410) auto-resyncs that resource and surfaces _meta.resync. First-call snapshot is filtered to fallback_window_hours (default 24). Designed for recurring agent loops. |
| Tool | Description |
|---|---|
outlook_send_message | Send email. Supports TO/CC/BCC, HTML body, importance level. |
outlook_reply | Reply or reply-all to a message. |
outlook_forward | Forward a message to one or more recipients with optional comment. |
| Tool | Description |
|---|---|
outlook_move_message | Move a message to a folder by name or ID. |
outlook_delete_message | Delete a message. Soft delete (Deleted Items) by default. permanent: true for hard delete. |
outlook_flag_message | Set follow-up flag: flagged, complete, or notFlagged. |
outlook_categorize_message | Set categories on a message. |
outlook_mark_read | Mark a message as read or unread. |
outlook_reclassify_message | Move a message between Focused Inbox and Other (focused / other). |
outlook_list_inbox_overrides | List Focused Inbox per-sender override rules. |
outlook_set_inbox_override | Upsert a per-sender Focused Inbox override (focused / other). Case-insensitive sender matching; PATCH-if-exists, else POST. |
outlook_delete_inbox_override | Delete a Focused Inbox override by ID. |
| Tool | Description |
|---|---|
outlook_list_events | List events in a date range. Expands recurring events. Configurable via days, after, before. |
outlook_get_event | Get full event details: attendees, body, online meeting URL, recurrence. |
outlook_list_events_delta | List only event changes inside a window since the last call. start and end (ISO 8601) required on the first call (Graph constraint — no whole-calendar sync). Deletes come back as {id, is_deleted: True}. Cursor is stateless. |
| Tool | Description |
|---|---|
outlook_create_event | Create event with location, attendees, recurrence, online meeting support. |
outlook_update_event | Update event fields (subject, time, location, body). Only patches changed fields. |
outlook_delete_event | Delete a calendar event. |
outlook_rsvp | RSVP to an event: accept, decline, or tentative. Optionally include a message. |
| Tool | Description |
|---|---|
outlook_list_contacts | List contacts with cursor pagination. |
outlook_search_contacts | Search contacts by name or email. |
outlook_get_contact | Get full contact details by ID. |
outlook_create_contact | Create a new contact. |
outlook_update_contact | Update contact fields. |
outlook_delete_contact | Delete a contact. |
outlook_list_contacts_delta | List only contact changes since the last call. Deletes come back as {id, is_deleted: True}. Cursor is stateless. |
| Tool | Description |
|---|---|
outlook_list_task_lists | List To Do lists. |
outlook_list_tasks | List tasks with status filter and pagination. |
outlook_create_task | Create task with due date, importance, recurrence. |
outlook_update_task | Update task fields. |
outlook_complete_task | Mark task as completed. |
outlook_delete_task | Delete a task. |
| Tool | Description |
|---|---|
outlook_list_drafts | List draft messages with pagination. |
outlook_create_draft | Create a draft. Supports scheduled delivery via deferred_send_datetime (server-side, Outlook-desktop-compatible "Delay Delivery"). |
outlook_update_draft | Update draft fields. Accepts is_html=True for HTML bodies and deferred_send_datetime to set or clear the scheduled delivery time. |
outlook_send_draft | Send an existing draft. |
outlook_delete_draft | Delete a draft. |
| Tool | Description |
|---|---|
outlook_list_attachments | List attachments on a message. |
outlook_download_attachment | Download attachment and save decoded bytes to a file. |
outlook_send_with_attachments | Send message with file attachments (auto upload session for >3MB). |
outlook_attach_to_draft | Add attachments to an existing draft (auto upload session for >3MB). |
outlook_remove_draft_attachment | Remove a single attachment from a draft. |
| Tool | Description |
|---|---|
outlook_create_folder | Create mail folder (top-level or nested). |
outlook_rename_folder | Rename a mail folder. |
outlook_delete_folder | Delete a mail folder (refuses well-known folders). |
| Tool | Description |
|---|---|
outlook_list_thread | Get all messages in a conversation thread. |
outlook_copy_message | Copy a message to another folder. |
outlook_batch_triage | Batch move/flag/categorize/mark_read (max 20 per call). Single Graph /$batch round-trip — 10-20× faster than per-message calls for large triage. |
| Tool | Description |
|---|---|
outlook_whoami | Get current user profile. |
outlook_list_calendars | List available calendars. |
outlook_list_categories | List category definitions with colors. |
outlook_get_mail_tips | Pre-send check (OOF, delivery restrictions). |
outlook_list_accounts | List configured accounts. |
outlook_switch_account | Switch active account. |
Config lives at ~/.outlook-mcp/config.json (created with 0600 permissions).
| Field | Type | Default | Description |
|---|---|---|---|
client_id | string | null | Azure AD application (client) ID. Required for auth. |
tenant_id | string | "consumers" | Azure AD tenant. Use "consumers" for personal Microsoft accounts. |
timezone | string | "UTC" | IANA timezone (e.g. "America/New_York"). Used for relative date computations in calendar tools. |
read_only | bool | false | When true, all write tools (send, reply, move, delete, create, update, RSVP) return an error. |
allow_categories | list[string] | [] | Optional. Restrict write tools to specific categories (see below). Empty list = all writes allowed when read_only: false. |
By default, read_only: false unlocks all write tools. For finer control, set allow_categories to restrict write access to specific categories. Read tools (list, search, get) are always allowed — allow_categories only narrows the write surface.
Available categories:
| Category | Tools | Risk |
|---|---|---|
mail_drafts | create/update/delete draft | Safe — drafts only, no send |
mail_triage | move, delete (soft), flag, categorize, mark read, copy, batch | Moderate — reversible except hard delete |
mail_folders | create/rename/delete folder | Moderate |
mail_send | send, reply, forward, send_draft, send_with_attachments | Dangerous — sends email on your behalf |
calendar_write | create/update/delete event, RSVP | Moderate — creates calendar entries |
contacts_write | create/update/delete contact | Moderate |
todo_write | create/update/complete/delete task | Safe — your own task list |
Example policies:
Draft-only assistant (agent can compose drafts, you review and send):
{ "read_only": false, "allow_categories": ["mail_drafts", "mail_triage", "todo_write"] }
Calendar-only (agent can manage your schedule, nothing else):
{ "read_only": false, "allow_categories": ["calendar_write"] }
Full write access (agent can do everything):
{ "read_only": false }
Read-only (safest default, no writes):
{ "read_only": true }
When allow_categories is set, any tool in a non-allowed category returns a permission-denied error (PermissionDeniedError) naming the blocked category. When allow_categories is empty (or unset) and read_only is false, all write tools are permitted. read_only: true always takes precedence — if set, all writes are blocked regardless of allow_categories. Unknown category names are rejected at config load time with a validation error; only the seven names above are accepted.
graph.microsoft.com and login.microsoftonline.com.azure-identity's TokenCachePersistenceOptions. On macOS the OS Keychain is used; on Windows, DPAPI; on Linux with PyGObject/libsecret available, gnome-keyring. On Linux without libsecret (e.g. the isolated venv created by uv tool install), tokens fall back to a 0600 plaintext file at ~/.IdentityService/ and the MCP logs a one-time warning at startup. For encrypted storage on Linux, install python3-gi gnome-keyring libsecret-1-0 and re-create the venv with --system-site-packages.0700, config file is 0600. Symlinked configs are rejected.# Install dev dependencies
uv sync --extra dev
# Run tests
uv run pytest
# Lint
uv run ruff check src/ tests/
# Format
uv run ruff format src/ tests/
# Run server locally (stdio)
uv run outlook-mcp
Requirements: Python 3.10+
MIT. See LICENSE.
io.github.mindstone/mcp-server-microsoft-teams
com.mintmcp/outlook-email
helbertparanhos/resend-email-mcp
marlinjai/email-mcp
io.github.mindstone/mcp-server-email-imap
io.github.osamahassouna/email-playbook-mcp