outlook-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| outlook_auth_statusA | Check authentication status. Run |
| outlook_list_inboxA | List messages in one folder with structured filters (read, sender, date, Focused class). Use this for folder-scoped browsing; use outlook_search_mail for KQL full-text search across all folders. For polling/recurring agents use outlook_list_inbox_delta (typically 10x cheaper after the first call). Example: outlook_list_inbox(folder="Junk Email", unread_only=True, count=5)
|
| outlook_read_messageA | Get one full message by ID. Pass include_deferred_send=True to also return the scheduled-send time (PR_DEFERRED_SEND_TIME) as deferred_send_datetime — useful when recreating a delayed draft. Pass concise=True to drop large fields (body, body_html) and return a 200-char body_preview — ~10x fewer tokens for triage scans. |
| outlook_read_messagesA | Bulk read up to 20 messages by ID via $batch — use NOT N outlook_read_message calls. Per-message shape in Example: outlook_read_messages(message_ids=[id1, id2, id3], concise=True) Hard cap of 20 (Graph $batch limit). |
| outlook_search_mailA | Full-text search mail with KQL across all folders (or one, if Use this for "find emails about X"; use outlook_list_inbox for structured filters scoped to a single folder. Example: outlook_search_mail(query="from:sarah@acme.com received>=2026-01-01", count=10)
|
| outlook_list_foldersA | List mail folders with message counts, parent_id, and child count. Default is top-level only; pass recursive=True to walk the full tree and resolve subfolder names. |
| outlook_list_inbox_deltaA | List only inbox changes since the last call. Use this for polling/recurring agents — typically 10x cheaper than outlook_list_inbox after the first call. Use outlook_list_inbox for one-shot snapshots. Example: first call: outlook_list_inbox_delta(); next: outlook_list_inbox_delta(delta_token=). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back. |
| outlook_send_messageA | Send an email immediately, no human review. For human-review workflows use outlook_create_draft + outlook_send_draft instead. For replying to an existing message use outlook_reply; for calendar invites use outlook_rsvp. Pass reply_to to route recipient replies to a different address (e.g. a shared team alias). |
| outlook_replyB | Reply (or reply-all) to an email message. Use this for email; use outlook_rsvp for calendar meeting invites. |
| outlook_forwardB | Forward an existing message to new recipients, with optional comment. |
| outlook_move_messageA | Move a message to another folder (removes from source). Use outlook_copy_message to duplicate without removing the source. For deletion use
outlook_delete_message (not move to "deleteditems"). |
| outlook_delete_messageA | Delete a message — soft delete (to Deleted Items) by default; permanent=True to hard-delete. This is the canonical way to delete a message. Do NOT use outlook_move_message(folder="deleteditems") for deletion. |
| outlook_flag_messageB | Set the follow-up flag on a message. |
| outlook_categorize_messageC | Set categories on a message (replaces the full list). Example: outlook_categorize_message(message_id=..., categories=["Follow-up", "Pricing"]) |
| outlook_mark_readB | Mark a single message as read or unread (set is_read=True or False). |
| outlook_reclassify_messageA | Reclassify ONE message's Focused/Other placement. Use this to fix a single message; use outlook_set_inbox_override for a sticky rule that affects future messages from the same sender. |
| outlook_list_inbox_overridesA | List the user's Focused Inbox per-sender override rules. Each override forces mail from a given sender into Focused or Other regardless of Graph's inference. |
| outlook_set_inbox_overrideA | Create or update a sticky Focused/Other rule for a sender (upsert, case-insensitive). Use this to permanently change classification for FUTURE messages from a sender; use outlook_reclassify_message to fix ONE existing message. Example: outlook_set_inbox_override(sender_email="marketing@acme.com", classify_as="other") Returns status: "created" or "updated". |
| outlook_delete_inbox_overrideB | Delete a Focused Inbox per-sender override rule by its ID. |
| outlook_list_eventsA | List calendar events in a date range (expands recurring instances). Use for one-shot queries; use outlook_list_events_delta for polling/recurring agents. Pass concise=True to drop large fields (body, attendees, organizer, categories) — ~10x fewer tokens for day-at-a-glance scans. |
| outlook_get_eventB | Get one full calendar event by ID, including body, attendees, organizer, and recurrence. |
| outlook_list_events_deltaA | List only calendar event changes within a window since the last call. Use this for polling/recurring agents — typically 10x cheaper than outlook_list_events after the first call. Use outlook_list_events for one-shot queries. Example: first call: outlook_list_events_delta(start="2026-05-22T00:00:00Z", end="2026-05-29T00:00:00Z"); next: outlook_list_events_delta(delta_token=). start/end (ISO 8601) required on first call only; the cursor encodes the window thereafter. is_deleted=True items are tombstones. has_more=True means drain immediately. |
| outlook_create_eventA | Create a calendar event with optional attendees, recurrence, and Teams online meeting. Example: outlook_create_event(subject="Q3 review", start="2026-08-15T14:00:00Z",
end="2026-08-15T15:00:00Z", attendees=["alice@acme.com"], is_online=True)
|
| outlook_update_eventB | Update fields on an existing event (partial patch — only provided fields change). |
| outlook_delete_eventA | Delete a calendar event by ID (cancels and notifies attendees if you're the organizer). |
| outlook_rsvpA | RSVP to a calendar meeting invite. Use this for meeting invites; use outlook_reply to reply to a regular email message. |
| outlook_list_contactsA | List contacts with cursor pagination. Use for one-shot queries; use outlook_list_contacts_delta for polling/recurring agents. |
| outlook_search_contactsB | Search contacts by name or email using KQL query syntax. |
| outlook_get_contactB | Get one full contact by ID. |
| outlook_create_contactC | Create a new contact with name and optional email, phone, company, title. |
| outlook_update_contactA | Update an existing contact (partial patch — only provided fields change). |
| outlook_delete_contactC | Delete a contact by ID. |
| outlook_list_contacts_deltaA | List only contact changes since the last call. Use this for polling/recurring agents — typically 10x cheaper than outlook_list_contacts after the first call. Use outlook_list_contacts for one-shot queries. Example: first call: outlook_list_contacts_delta(); next: outlook_list_contacts_delta(delta_token=). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back. |
| outlook_changes_sinceA | One structured "since last call" digest across mail, events, and contacts. Use this for recurring agent loops (morning brief, hourly inbox sweep) — one call returns counts, urgent_flagged mail, by-sender rollup, plus new/cancelled events and contacts counts. Use the three individual delta tools (outlook_list_inbox_delta, outlook_list_events_delta, outlook_list_contacts_delta) when you need raw item lists or per-resource control. Example: first call: outlook_changes_since(); next:
outlook_changes_since(delta_tokens=).
First call returns a snapshot filtered to the last |
| outlook_list_task_listsA | List all Microsoft To Do task lists for the current user. |
| outlook_list_tasksB | List tasks in a To Do list with optional
|
| outlook_create_taskB | Create a Microsoft To Do task with optional due date, importance, body, and recurrence. Example: outlook_create_task(title="Send invoice", due="2026-09-01", importance="high")
|
| outlook_update_taskC | Update fields on a To Do task (partial patch — only provided fields change). |
| outlook_complete_taskC | Mark a To Do task as completed. |
| outlook_delete_taskC | Delete a task from a Microsoft To Do list. |
| outlook_list_draftsA | List messages in the Drafts folder with cursor pagination. |
| outlook_create_draftA | Create a draft email for later review/send (pair with outlook_send_draft). Use this when a human should review before sending; use outlook_send_message to send immediately without review. Pass deferred_send_datetime (ISO 8601, e.g. "2026-05-06T08:00:00Z") to schedule delayed delivery — Exchange holds the message server-side after outlook_send_draft. Pass reply_to to pre-populate the Reply-To header. |
| outlook_update_draftA | Update an existing draft (partial patch). Pass is_html=True when body is HTML — required when overwriting a draft originally composed as HTML (consumer Outlook rejects Text-over-HTML PATCH). Pass reply_to=[...] to overwrite Reply-To; reply_to=[] to clear it. Pass deferred_send_datetime (ISO 8601) to set the scheduled-send time; empty string clears it. |
| outlook_send_draftB | Send an existing draft (pair with outlook_create_draft for human-review send flow). |
| outlook_delete_draftC | Delete a draft message by ID. |
| outlook_list_attachmentsA | List attachments on a message — returns IDs, names, sizes, and content types. |
| outlook_download_attachmentB | Download an attachment from a message and write decoded bytes to |
| outlook_send_with_attachmentsA | Send an email with file attachments; auto-switches to upload-session for files >3MB.
|
| outlook_attach_to_draftA | Add attachments to an existing draft; auto-switches to upload-session for files >3MB.
|
| outlook_remove_draft_attachmentC | Remove a single attachment from a draft message by attachment ID. |
| outlook_create_folderA | Create a mail folder; pass |
| outlook_rename_folderC | Rename a user-created mail folder by ID. |
| outlook_delete_folderA | Delete a user-created mail folder by ID; refuses well-known folders (inbox, sentitems). |
| outlook_list_threadA | List all messages in a conversation thread, chronological order. Needs |
| outlook_copy_messageA | Copy a message to another folder (duplicates; source is unchanged). Use outlook_move_message to remove from source. |
| outlook_batch_triageA | Triage up to 20 messages in one $batch call.
Example: outlook_batch_triage(message_ids=[id1, id2], action="move", value="Archive")
|
| outlook_whoamiA | Get the authenticated user's profile (display name, email, ID). |
| outlook_list_calendarsA | List all calendars available to the authenticated user (primary + secondary). |
| outlook_list_categoriesA | List the user's master category definitions (names + colors). Provides the valid values for outlook_categorize_message. |
| outlook_get_mail_tipsA | Pre-send check for recipients: out-of-office, delivery limits, mailbox-full warnings. |
| outlook_list_accountsA | List all configured Outlook accounts and their authentication status. |
| outlook_switch_accountA | Switch the active Outlook account by configured |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mpalermiti/outlook-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server