Outlook MCP
PYPI · OUTLOOK-GRAPH-MCP · SCANNED SEP 20
Microsoft Outlook personal accounts: mail, calendar, contacts, to-do, drafts (62 tools).
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 64 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency35
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: the license (MIT License) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 7 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability80
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 5585 tokens (~90/item across 62 items; 62 tools + 0 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management53
- Stability observed for 16 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 11 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 63 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the Outlook MCP server?
Outlook MCP runs locally as a PyPI package, launched with uvx outlook-graph-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · outlook-graph-mcp
claude mcp add mpalermiti-outlook-mcp -- uvx outlook-graph-mcp
{
"mcpServers": {
"mpalermiti-outlook-mcp": {
"command": "uvx",
"args": [
"outlook-graph-mcp"
]
}
}
} {
"servers": {
"mpalermiti-outlook-mcp": {
"command": "uvx",
"args": [
"outlook-graph-mcp"
]
}
}
} codex mcp add mpalermiti-outlook-mcp -- uvx outlook-graph-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mpalermiti-outlook-mcp": {
"type": "local",
"command": [
"uvx",
"outlook-graph-mcp"
],
"enabled": true
}
}
} openclaw mcp add mpalermiti-outlook-mcp --command uvx --arg outlook-graph-mcp
mcp_servers:
mpalermiti-outlook-mcp:
command: "uvx"
args: ["outlook-graph-mcp"] {
"McpServers": {
"mpalermiti-outlook-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"outlook-graph-mcp"
]
}
}
} assistant mcp add mpalermiti-outlook-mcp -t stdio -c uvx -a outlook-graph-mcp
{
"mcpServers": {
"mpalermiti-outlook-mcp": {
"command": "uvx",
"args": [
"outlook-graph-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- 13 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 12 Sept 26 +1
- Package version: 1.20.0 → 1.22.0 functional
- Package version: 1.20.0 → 1.21.0 functional
- 10 Sept 26 +3
- Schema quality: unverified → 100 ▲ functional
- Package version: 1.19.0 → 1.20.0 functional
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/outlook-graph-mcp@1.22.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 64 packages
| Packages resolved | 64 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
outlook_attach_to_draft ~103
Add attachments to an existing draft; auto-switches to upload-session for files >3MB. `attachment_paths` resolve inside the configured attachments directory (`attachments_dir`, default ~/.outlook-mcp/attachments) — a bare filename is looked up there, and a path outside it is refused. Returns new attachment IDs for later removal via outlook_remove_draft_attachment.
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_paths | array | yes | – |
| draft_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_auth_status ~27
Check authentication status. Run `outlook-mcp auth` on the host if needed.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
outlook_batch_triage ~119
Triage up to 20 messages in one $batch call. `action` is "move", "flag", "categorize", or "mark_read". Example: outlook_batch_triage(message_ids=[id1, id2], action="move", value="Archive") `value` is the action target (folder name for move, status for flag/mark_read, category name for categorize). Hard cap of 20.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| message_ids | array | yes | – |
| value | string | yes | – |
No output schema declared.
No examples provided.
outlook_categorize_message ~57
Set categories on a message (replaces the full list). Example: outlook_categorize_message(message_id=..., categories=["Follow-up", "Pricing"])
| Name | Type | Req | Description |
|---|---|---|---|
| categories | array | yes | – |
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_changes_since ~317
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=<delta_tokens from prior response>). First call returns a snapshot filtered to the last `fallback_window_hours` (default 24) so the digest doesn't surface thousands of historical items; subsequent calls (tokens passed back) return only what changed. Each resource's token is independent — drop one stale token without re-syncing the others. If Graph 410s on a token (`syncStateNotFound`), that resource auto-resyncs and `_meta.resync` lists which one. `urgent_flagged` = high-importance OR flagged mail. `by_sender` = top 5 senders. Calendar `modified[]` is reserved for future use — modified events surface in `new[]` today (Graph delta doesn't distinguish them). Calendar `organizer_email` is also currently empty (the v1.9.0 delta formatter surfaces the organizer name only).
| Name | Type | Req | Description |
|---|---|---|---|
| delta_tokens | – | – | – |
| fallback_window_hours | integer | – | – |
No output schema declared.
No examples provided.
outlook_complete_task ~31
Mark a To Do task as completed.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | – | – | – |
| task_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_copy_message ~65
Copy a message to another folder (duplicates; source is unchanged). Use outlook_move_message to remove from source. `folder` accepts display names, well-known names, or Graph IDs — prefer names.
| Name | Type | Req | Description |
|---|---|---|---|
| folder | string | yes | – |
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_create_contact ~59
Create a new contact with name and optional email, phone, company, title.
| Name | Type | Req | Description |
|---|---|---|---|
| company | – | – | – |
| – | – | – | |
| first_name | string | yes | – |
| last_name | – | – | – |
| phone | – | – | – |
| title | – | – | – |
No output schema declared.
No examples provided.
outlook_create_draft ~166
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.
| Name | Type | Req | Description |
|---|---|---|---|
| bcc | – | – | – |
| body | string | yes | – |
| cc | – | – | – |
| deferred_send_datetime | – | – | – |
| importance | string | – | – |
| is_html | boolean | – | – |
| reply_to | – | – | – |
| subject | string | yes | – |
| to | array | yes | – |
No output schema declared.
No examples provided.
outlook_create_event ~363
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` is accepted but has no effect on personal accounts — Graph silently ignores isOnlineMeeting for consumer mailboxes (it returns isOnlineMeeting: False, onlineMeetingProvider: "unknown"). Teams meetings require a work/school account. `start`/`end` are ISO 8601. Passing `recurrence` creates a series, not a single event. It takes either a shorthand — "daily", "weekdays", "weekly", "monthly", "yearly", all anchored on `start` and open-ended — or a full Microsoft Graph recurrence object for anything else, e.g. every other Mon+Fri for 10 occurrences: {"pattern": {"type": "weekly", "interval": 2, "daysOfWeek": ["monday", "friday"]}, "range": {"type": "numbered", "numberOfOccurrences": 10}} `range.startDate` defaults to the event's start date. Prefer a bounded range ("endDate"/"numbered") when the event has attendees — a "noEnd" series invites them to every future occurrence.
| Name | Type | Req | Description |
|---|---|---|---|
| attendees | – | – | – |
| body | – | – | – |
| end | string | yes | – |
| is_all_day | boolean | – | – |
| is_online | boolean | – | – |
| location | – | – | – |
| recurrence | – | – | – |
| start | string | yes | – |
| subject | string | yes | – |
No output schema declared.
No examples provided.
outlook_create_folder ~44
Create a mail folder; pass `parent_folder` (name or ID) to nest under an existing folder.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| parent_folder | – | – | – |
No output schema declared.
No examples provided.
outlook_create_task ~186
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") `reminder=True` requires `due` and sets the reminder to the due time — Graph silently drops a reminder that has no time. `due` takes ISO 8601 or a relative offset — note `+7d` is seven days from now, while a bare `7d` means seven days *ago*. `importance` is "low", "normal", or "high". Defaults to the user's default list when `list_id` is omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | – | – |
| due | – | – | – |
| importance | – | – | – |
| list_id | – | – | – |
| recurrence | – | – | – |
| reminder | – | – | – |
| title | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_contact ~23
Delete a contact by ID.
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_draft ~25
Delete a draft message by ID.
| Name | Type | Req | Description |
|---|---|---|---|
| draft_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_event ~36
Delete a calendar event by ID (cancels and notifies attendees if you're the organizer).
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_folder ~37
Delete a user-created mail folder by ID; refuses well-known folders (inbox, sentitems).
| Name | Type | Req | Description |
|---|---|---|---|
| folder_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_inbox_override ~33
Delete a Focused Inbox per-sender override rule by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| override_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_message ~70
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.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | – |
| permanent | boolean | – | – |
No output schema declared.
No examples provided.
outlook_delete_task ~33
Delete a task from a Microsoft To Do list.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | – | – | – |
| task_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_download_attachment ~97
Download an attachment and write the decoded bytes to `save_path` on the host. `save_path` is resolved inside the configured attachments directory (`attachments_dir`, default ~/.outlook-mcp/attachments) — a bare filename lands there; a path outside it is refused. Same directory for reads and writes.
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_id | string | yes | – |
| message_id | string | yes | – |
| save_path | string | yes | – |
No output schema declared.
No examples provided.
outlook_flag_message ~50
Set the follow-up flag on a message. `status` is "flagged", "complete", or "notFlagged".
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | – |
| status | string | yes | – |
No output schema declared.
No examples provided.
outlook_forward ~40
Forward an existing message to new recipients, with optional comment.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | – | – | – |
| message_id | string | yes | – |
| to | array | yes | – |
No output schema declared.
No examples provided.
outlook_get_contact ~24
Get one full contact by ID.
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_get_event ~71
Get one full calendar event by ID: body, attendees, organizer, recurrence, type. `recurrence` comes back in the same shape outlook_create_event accepts; `type` is "singleInstance", "seriesMaster", "occurrence" or "exception".
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_get_mail_tips ~35
Pre-send check for recipients: out-of-office, delivery limits, mailbox-full warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| emails | array | yes | – |
No output schema declared.
No examples provided.
outlook_list_accounts ~19
List all configured Outlook accounts and their authentication status.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
outlook_list_attachments ~35
List attachments on a message — returns IDs, names, sizes, and content types.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_list_calendars ~24
List all calendars available to the authenticated user (primary + secondary).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
outlook_list_categories ~31
List the user's master category definitions (names + colors). Provides the valid values for outlook_categorize_message.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
outlook_list_contacts ~45
List contacts with cursor pagination. Use for one-shot queries; use outlook_list_contacts_delta for polling/recurring agents.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| cursor | – | – | – |
No output schema declared.
No examples provided.
outlook_list_contacts_delta ~120
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=<token from prior response>). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back.
| Name | Type | Req | Description |
|---|---|---|---|
| delta_token | – | – | – |
| page_size | integer | – | – |
No output schema declared.
No examples provided.
outlook_list_drafts ~33
List messages in the Drafts folder with cursor pagination.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| cursor | – | – | – |
No output schema declared.
No examples provided.
outlook_list_events ~107
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.
| Name | Type | Req | Description |
|---|---|---|---|
| after | – | – | – |
| before | – | – | – |
| concise | boolean | – | – |
| count | integer | – | – |
| cursor | – | – | – |
| days | integer | – | – |
No output schema declared.
No examples provided.
outlook_list_events_delta ~170
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=<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.
| Name | Type | Req | Description |
|---|---|---|---|
| delta_token | – | – | – |
| end | – | – | – |
| page_size | integer | – | – |
| start | – | – | – |
No output schema declared.
No examples provided.
outlook_list_folders ~57
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | – | – | – |
| recursive | boolean | – | – |
No output schema declared.
No examples provided.
outlook_list_inbox ~267
List messages in one folder with structured filters (read, sender, date, category, Focused). 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) `folder` accepts display names, well-known names ("inbox", "junkemail"), or Graph IDs — prefer names. Pass concise=True to drop large fields (preview, categories) — ~10x fewer tokens. Pass uncategorized_only=True to return only messages with no categories assigned. `after`/`before` take ISO 8601 or a relative offset — `7d` is seven days ago, `+7d` is seven days from now.
| Name | Type | Req | Description |
|---|---|---|---|
| after | – | – | – |
| before | – | – | – |
| classification | – | – | – |
| concise | boolean | – | – |
| count | integer | – | – |
| cursor | – | – | – |
| folder | string | – | – |
| from_address | – | – | – |
| skip | integer | – | – |
| uncategorized_only | boolean | – | – |
| unread_only | boolean | – | – |
No output schema declared.
No examples provided.
outlook_list_inbox_delta ~132
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=<token from prior response>). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back.
| Name | Type | Req | Description |
|---|---|---|---|
| delta_token | – | – | – |
| folder | string | – | – |
| page_size | integer | – | – |
No output schema declared.
No examples provided.
outlook_list_inbox_overrides ~45
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
outlook_list_task_lists ~22
List all Microsoft To Do task lists for the current user.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
outlook_list_tasks ~61
List tasks in a To Do list with optional `status` filter. `status`: "notStarted", "inProgress", or "completed".
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| cursor | – | – | – |
| list_id | – | – | – |
| status | – | – | – |
No output schema declared.
No examples provided.
outlook_list_thread ~81
List all messages in a conversation thread, chronological order. Needs `conversation_id` from a message's metadata. Pass concise=True to drop large fields (quoted prior-message text in each preview) — ~10x fewer tokens on long reply chains.
| Name | Type | Req | Description |
|---|---|---|---|
| concise | boolean | – | – |
| conversation_id | string | yes | – |
| count | integer | – | – |
No output schema declared.
No examples provided.
outlook_mark_read ~41
Mark a single message as read or unread (set is_read=True or False).
| Name | Type | Req | Description |
|---|---|---|---|
| is_read | boolean | yes | – |
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_move_message ~91
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"). `folder` accepts display names, well-known names ("inbox", "archive", "deleteditems"), or Graph IDs — prefer names.
| Name | Type | Req | Description |
|---|---|---|---|
| folder | string | yes | – |
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_read_message ~131
Get one full message by ID. `format` is "text", "html", or "full" (both). 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.
| Name | Type | Req | Description |
|---|---|---|---|
| concise | boolean | – | – |
| format | string | – | – |
| include_deferred_send | boolean | – | – |
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_read_messages ~167
Bulk read up to 20 messages by ID via $batch — use NOT N outlook_read_message calls. Per-message shape in `messages` matches outlook_read_message byte-for-byte for the same (format, concise, include_deferred_send). Ordering follows input `message_ids`. Returns `{messages, failures, requested, succeeded, failed}` — 404s on some IDs are surfaced in `failures` without failing the whole call (partial-failure tolerant). Example: outlook_read_messages(message_ids=[id1, id2, id3], concise=True) Hard cap of 20 (Graph $batch limit).
| Name | Type | Req | Description |
|---|---|---|---|
| concise | boolean | – | – |
| format | string | – | – |
| include_deferred_send | boolean | – | – |
| message_ids | array | yes | – |
No output schema declared.
No examples provided.
outlook_reclassify_message ~77
Reclassify ONE message's Focused/Other placement. `classification` is "focused" or "other". Use this to fix a single message; use outlook_set_inbox_override for a sticky rule that affects future messages from the same sender.
| Name | Type | Req | Description |
|---|---|---|---|
| classification | string | yes | – |
| message_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_remove_draft_attachment ~39
Remove a single attachment from a draft message by attachment ID.
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_id | string | yes | – |
| draft_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_rename_folder ~34
Rename a user-created mail folder by ID.
| Name | Type | Req | Description |
|---|---|---|---|
| folder_id | string | yes | – |
| name | string | yes | – |
No output schema declared.
No examples provided.
outlook_reply ~64
Reply (or reply-all) to an email message. Use this for email; use outlook_rsvp for calendar meeting invites.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | – |
| is_html | boolean | – | – |
| message_id | string | yes | – |
| reply_all | boolean | – | – |
No output schema declared.
No examples provided.
outlook_rsvp ~69
RSVP to a calendar meeting invite. `response` is "accept", "decline", or "tentative". Use this for meeting invites; use outlook_reply to reply to a regular email message.
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | – |
| message | – | – | – |
| response | string | yes | – |
No output schema declared.
No examples provided.
What is the Outlook MCP server?
Outlook MCP is listed in the public MCP registry as io.github.mpalermiti/outlook-mcp. Microsoft Outlook personal accounts: mail, calendar, contacts, to-do, drafts (62 tools). This page covers its PyPI package (outlook-graph-mcp).
Is the Outlook MCP server safe to use?
Outlook MCP scores 59 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Outlook MCP server expose?
Outlook MCP exposes 62 tools: outlook_auth_status, outlook_list_inbox, outlook_read_message, outlook_read_messages, outlook_search_mail, and 57 more. Their descriptions and schemas cost roughly 5,268 tokens of context every time the server is loaded.
Is the Outlook MCP server still maintained?
Outlook MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.