Connects Claude directly to your Outlook mailbox through Microsoft Graph API with 22 consolidated tools covering email, calendar, contacts, and settings. You get full email operations including search with conversation threading, forensic header analysis for phishing investigation, and multi-format export (EML, MBOX, Markdown, JSON). Send controls include dry-run preview, mail tips, and rate limiting. Inbox automation works through programmable rules, categories, and Focused Inbox management. Delta sync pulls only changed messages since your last poll. Works with both personal Outlook.com and Microsoft 365 accounts, though work accounts unlock shared mailboxes and meeting room search. Reach for this when you want your AI assistant handling email triage, calendar scheduling, and inbox organization without leaving the conversation.
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.
languageobjecttimeZonestringworkingHoursobjectautomaticRepliesSettingobject
MCP server for Outlook email, calendar, and contacts — let your AI assistant manage your inbox directly from the conversation.
Outlook Assistant connects AI assistants to your Microsoft Outlook account through the Model Context Protocol. Ask your AI assistant to search your inbox, send emails, schedule meetings, manage contacts, and configure mailbox settings — without leaving the conversation. Works with Claude, Cursor, Windsurf, and any MCP-compatible client.
Works with personal Outlook.com and work/school Microsoft 365 accounts.
| Without Outlook Assistant | With Outlook Assistant |
|---|---|
| Switch between your AI tool and Outlook to manage email | Read, search, send, and export emails directly from your AI assistant |
| Manually search and export email threads | Full email tools including search, threading, and bulk export |
| Context-switch for calendar and contacts | Manage calendar events, contacts, and settings in one place |
| Copy-paste email content into conversations | Your AI assistant reads your emails natively with full context |
| No programmatic access to mailbox rules or categories | Create inbox rules, manage categories, configure auto-replies |
| Manually check each email for phishing red flags | Forensic header analysis — DKIM, SPF, DMARC, spam scores, and delivery chain in one call |
| Poll your inbox to check for new mail | Delta sync returns only changes since your last check, with tokens for continuous polling |
| Module | Tools | What You Can Do |
|---|---|---|
| 8 | search-emails (list/search/delta/conversations), read-email (content + forensic headers), send-email (with dry-run + mail tips), draft (create/update/send/delete/reply/forward), update-email (read status, flags), attachments, export, get-mail-tips | |
| Calendar | 3 | list-events, create-event, manage-event (update/decline/cancel/delete) |
| Contacts | 2 | manage-contact (list/search/get/create/update/delete), search-people |
| Categories | 3 | manage-category (CRUD), apply-category, manage-focused-inbox |
| Settings | 1 | mailbox-settings (get/set auto-replies/set working hours) |
| Folder | 1 | folders (list/create/move/stats/delete) |
| Rules | 1 | manage-rules (list/create/update/reorder/delete) |
| Advanced | 2 | access-shared-mailbox, find-meeting-rooms |
| Auth | 1 | auth (status/authenticate/about) |
22 tools total — consolidated from 55 for optimal AI performance. See the Tools Reference for complete parameter details.
Format support varies by target:
| Format | Extension | target=message (single) | target=messages (batch) | target=conversation (thread) |
|---|---|---|---|---|
mime / eml | .eml | ✅ | – | ✅ |
mbox | .mbox | – | – | ✅ |
markdown | .md | ✅ | ✅ | ✅ |
json | .json | ✅ | ✅ | ✅ |
html | .html | – | – | ✅ |
csv | .csv | ✅ | ✅ | ✅ |
Export individual emails, search results, or entire conversation threads — use target=messages with a search query (or the query shortcut) to batch-export without manually collecting IDs.
Outlook Assistant works with both personal and work/school Microsoft accounts, but some features behave differently:
| Feature | Personal (Outlook.com) | Work/School (Microsoft 365) |
|---|---|---|
| Email read, send, search | Full support | Full support |
| Calendar events | Full support | Full support |
| Contacts CRUD | Full support | Full support |
| Inbox rules | Full support | Full support |
| Folders | Full support | Full support |
Free-text query search | Limited — use subject, from, to filters instead | Full KQL support |
| Categories | Full support | Full support |
| Mailbox settings | Full support | Full support |
| Focused Inbox | API works (overrides stored) but mail routing not affected | Full support |
| Shared mailboxes | Not available | Requires Mail.Read.Shared |
| Meeting room search | Not available | Requires Place.Read.All + admin consent |
Note: On personal accounts, Microsoft's
$searchAPI has limited support for free-text queries. Outlook Assistant handles this automatically with progressive search — if your query returns no results, it falls back through OData filters, boolean filters, and recent message listing to find your emails. For the most direct results on personal accounts, use the structured filter parameters (from,subject,to,receivedAfter).
$search API is limited, Outlook Assistant automatically falls back through up to 4 search strategies to find your emails. Most Graph API wrappers fail silently; this one adapts.Outlook Assistant is designed with safety-first principles for AI-driven email access:
Destructive action safeguards — Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint) so AI clients can auto-approve safe reads and prompt for confirmation on destructive operations like sending email or deleting events.
Send-email protections — The send-email tool includes:
checkRecipients: true) — check recipients for out-of-office, mailbox full, delivery restrictions before sendingdryRun: true) — preview composed emails without sendingOUTLOOK_MAX_EMAILS_PER_SESSION (default: unlimited)OUTLOOK_ALLOWED_RECIPIENTSRecommended setup: enable both safety belts in your
.mcp.jsonfrom day one. They're off by default;auth action=aboutreports their state and prints a setup hint when unset. See.mcp.json.examplefor a copy-paste template."env": { "OUTLOOK_CLIENT_ID": "…", "OUTLOOK_CLIENT_SECRET": "…", "OUTLOOK_MAX_EMAILS_PER_SESSION": "10", "OUTLOOK_ALLOWED_RECIPIENTS": "your-domain.com,trusted@example.com" }
Draft protections — The draft tool shares send-email safety controls: dry-run preview, recipient allowlist, mail-tips validation, and rate limiting. The send action shares the send-email rate limit counter, preventing circumvention via the draft-then-send pathway.
Token-optimised architecture — Tools are consolidated using the STRAP (Single Tool, Resource, Action Pattern) approach. 22 tools instead of 55 reduces per-turn overhead by ~11,000 tokens (~64%), keeping more of the AI's context window available for your actual conversation. Fewer tools also means the AI selects the right tool more accurately — research shows tool selection degrades beyond ~40 tools.
Important: These safeguards are defence-in-depth measures that reduce risk, but they are not a guarantee against unintended actions. AI-driven access to your email is inherently sensitive — always review tool calls before approving, particularly for sends and deletes. No automated guardrail is foolproof, and you remain responsible for actions taken through your mailbox.
npm install -g @littlebearapps/outlook-assistant
Or run directly without installing:
npx @littlebearapps/outlook-assistant
You need a Microsoft Azure app registration to authenticate. See the Azure Setup Guide for a detailed walkthrough (including first-time Azure account creation), or if you've done this before:
nativeclient URIhttp://localhost:3333/auth/callback — only needed for browser auth flowAdd to your MCP client config:
claude_desktop_config.json){
"mcpServers": {
"outlook": {
"command": "npx",
"args": ["@littlebearapps/outlook-assistant"],
"env": {
"OUTLOOK_CLIENT_ID": "your-application-client-id",
"OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
}
}
}
}
claude mcp add outlook -- npx @littlebearapps/outlook-assistant
Then set environment variables in your .env or shell.
.cursor/mcp.json)Or add manually to .cursor/mcp.json:
{
"mcpServers": {
"outlook": {
"command": "npx",
"args": ["@littlebearapps/outlook-assistant"],
"env": {
"OUTLOOK_CLIENT_ID": "your-application-client-id",
"OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
}
}
}
}
~/.codeium/windsurf/mcp_config.json){
"mcpServers": {
"outlook": {
"command": "npx",
"args": ["@littlebearapps/outlook-assistant"],
"env": {
"OUTLOOK_CLIENT_ID": "your-application-client-id",
"OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
}
}
}
}
outlook-assistant-auth (or npx @littlebearapps/outlook-assistant-auth)auth tool with action=authenticate to get an OAuth URLNote: The auth server needs
OUTLOOK_CLIENT_IDandOUTLOOK_CLIENT_SECRETenvironment variables. Your MCP client's"env"config only applies to the MCP server process — when running the auth server separately, ensure these are set in a.envfile or exported in your shell.
npm install -g @littlebearapps/outlook-assistant
git clone https://github.com/littlebearapps/outlook-assistant.git
cd outlook-assistant
npm install
First time with Azure? The Azure Setup Guide covers everything from creating an account to your first authentication, including billing setup and common pitfalls.
http://localhost:3333/auth/callbackoffline_access — refresh tokens between sessionsUser.Read — basic profileMail.Read, Mail.ReadWrite, Mail.Send — email operationsCalendars.Read, Calendars.ReadWrite — calendar operationsContacts.Read, Contacts.ReadWrite — contact managementMailboxSettings.ReadWrite — settings, auto-replies, categoriesPeople.Read — people searchMail.Read.Shared — shared mailbox accessPlace.Read.All — meeting room search (requires admin consent)Create a .env file from the example:
cp .env.example .env
Edit with your Azure credentials:
OUTLOOK_CLIENT_ID=your-application-client-id
OUTLOOK_CLIENT_SECRET=your-client-secret-VALUE
USE_TEST_MODE=false
Note: The server also accepts
MS_CLIENT_IDandMS_CLIENT_SECRETfor backwards compatibility.
Optional overrides (v3.8.0+) — see .env.example for the full list with commented worked examples:
| Variable | Purpose | Default |
|---|---|---|
OUTLOOK_AUTH_AUDIENCE | OAuth audience: common, consumers (personal-only Azure apps), organizations, or single-tenant GUID. Fixes AADSTS9002331 for personal-only app registrations. | common |
OUTLOOK_DEFAULT_TIMEZONE | IANA timezone applied to calendar events when callers don't pass one (e.g. Europe/London, America/New_York). | Australia/Melbourne |
OUTLOOK_MAX_EMAILS_PER_SESSION | Cap on send-email + draft send per MCP server lifetime. | unlimited |
OUTLOOK_ALLOWED_RECIPIENTS | Comma-separated allowlist of domains/addresses for sends, drafts, and rule forwards. | unrestricted |
See Quick Start — Configure Your MCP Client above for Claude Desktop, Claude Code, Cursor, and Windsurf configs.
If installed from source, use node instead of npx:
{
"mcpServers": {
"outlook": {
"command": "node",
"args": ["/path/to/outlook-assistant/index.js"],
"env": {
"OUTLOOK_CLIENT_ID": "your-application-client-id",
"OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
}
}
}
}
No auth server needed. Works everywhere, including remote/headless environments.
auth tool with action=authenticate)microsoft.com/devicelogin) on any browser, any deviceauth with action=device-code-complete)~/.outlook-assistant-tokens.json and refresh automaticallyPrerequisite: Enable "Allow public client flows" in Azure Portal > your app > Authentication > Advanced settings.
Server restarts (v3.7.2+): Device code state is persisted to
~/.outlook-assistant-pending-auth.json, sodevice-code-completeworks even if the MCP server restarts between steps 1 and 4 (e.g., Untether/Telegram bridge, Claude Desktop session changes).
For localhost development or if you prefer the traditional OAuth flow:
npm run auth-server
This starts a local server on port 3333 to handle the OAuth callback.
auth tool with action=authenticate, method=browserNote: The auth server reads
OUTLOOK_CLIENT_IDandOUTLOOK_CLIENT_SECRETfrom environment variables. Your MCP client's"env"config only applies to the MCP server process, not a separately-started auth server.
outlook-assistant/
├── index.js # Main entry point (22 tools)
├── config.js # Configuration settings
├── outlook-auth-server.js # OAuth server (port 3333)
├── auth/ # Authentication module (1 tool)
├── email/ # Email module (7 tools)
│ ├── mail-tips.js # Pre-send recipient validation
│ ├── headers.js # Email header retrieval
│ ├── mime.js # Raw MIME/EML content
│ ├── conversations.js # Thread listing/export
│ ├── attachments.js # Attachment operations
│ └── ...
├── calendar/ # Calendar module (3 tools)
├── contacts/ # Contacts module (2 tools)
├── categories/ # Categories module (3 tools)
├── settings/ # Settings module (1 tool)
├── folder/ # Folder module (1 tool)
├── rules/ # Rules module (1 tool)
├── advanced/ # Advanced module (2 tools)
└── utils/
├── graph-api.js # Microsoft Graph API client (includes $batch)
├── safety.js # Rate limiting, recipient allowlist, dry-run
├── odata-helpers.js # OData query building
├── field-presets.js # Token-efficient field selections
├── response-formatter.js # Verbosity levels
└── mock-data.js # Test mode data
npm install
npx kill-port 3333
npm run auth-server
You're using the Secret ID instead of the Secret Value. Go to Azure Portal > Certificates & secrets and copy the Value column.
If using browser flow: start the auth server first with npm run auth-server. If using device code flow: visit microsoft.com/devicelogin instead.
Enable "Allow public client flows" in Azure Portal > App registrations > Authentication > Advanced settings.
Fixed in v3.7.2. Earlier versions sent client_secret in token refresh requests for device-code auth, which Microsoft rejects for public client flows. Update to v3.7.2+ or re-authenticate.
Check authentication status with the auth tool (action=status). Tokens may have expired — re-authenticate if needed.
npm test # Jest unit tests
npm run inspect # MCP Inspector (interactive)
Run with mock data (no real API calls):
USE_TEST_MODE=true npm start
tasks/)index.jsTOOLS array in main index.jstest/docs/quickrefs/tools-reference.md| Guide | Description |
|---|---|
| Getting Started | Install, configure, and authenticate — start here |
| Azure Setup Guide | Azure account creation, app registration, permissions, and secrets |
| How-To Guides | 29 practical guides for email, calendar, contacts, and settings |
| Roadmap | Active milestones (v3.7.5, v3.8.0, v3.9.0) and recent releases |
| Troubleshooting & FAQ | Common problems, re-authentication, and frequently asked questions |
| Tools Reference | All 22 tools with parameters |
| AI Agent Guide | Tool selection and workflow patterns for AI agents |
Full documentation: docs/
query and kqlQuery rely on Microsoft's $search API, which has limited support on personal Outlook.com accounts. Outlook Assistant mitigates this with progressive search fallback (trying OData filters automatically), but for the most direct results, use structured filters (from, subject, to, receivedAfter).Mail.Read.Shared permission and a work/school account.Place.Read.All permission with admin consent (work/school accounts only).savePath or outputDir to specify a different location.Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
For security concerns, please see our Security Policy. Do not open public issues for vulnerabilities.
See CHANGELOG.md for version history.
Built and maintained by Little Bear Apps. Outlook Assistant is open source under the MIT License.
OUTLOOK_CLIENT_ID*Azure AD application client ID
OUTLOOK_CLIENT_SECRET*secretAzure AD application client secret value
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