Outlook MCP
PYPI · OUTLOOK-GRAPH-MCP
Microsoft Outlook personal accounts: mail, rules, calendar, contacts, to-do, drafts (77 tools).
Available components
Last scanned (6 hours ago)
Scores higher than 85% of PyPI servers
Category Communication
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 Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 62 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency48
- 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
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability77
- 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
- Context-footprint check failed: tool/resource definitions use about 8034 tokens (~113/item across 71 items; 71 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
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 14 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 72 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
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.
- 5 Nov 26 +16
- Malware scan: unverified → pass ▲ security
- Stability: fail → pass ▲ security
- 4 Nov 26 0
- Package version: 1.31.3 → 1.31.4 functional
- 2 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.31.1 → 1.31.3 functional
- Package version: 1.31.1 → 1.31.2 functional
- 1 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 31 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.30.2 → 1.31.1 functional
- Package version: 1.30.2 → 1.31.0 functional
- 30 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 29 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.30.1 → 1.30.2 functional
- 28 Oct 26 −1
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 1.28.0 → 1.30.1 functional
- Package version: 1.28.0 → 1.29.0 functional
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 5 Nov 2026 · Analysed pypi/outlook-graph-mcp@1.31.4
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
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 62 packages
| Packages resolved | 62 |
|---|---|
| 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_add_checklist_item ~49
Add a checklist item (sub-step) to a To Do task.
| Name | Type | Req | Description |
|---|---|---|---|
| display_name | string | yes | – |
| list_id | string | – | – |
| task_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_attach_to_draft ~139
Add attachments to an existing draft; auto-switches to upload-session for files >3MB. `attachment_paths` resolve inside the configured attachments directory (`attachments_dir`, an `attachments` folder in the settings directory by default) — a bare filename is looked up there, and a path outside it is refused. `attachments`: inline files [{name, content_base64, content_type?}], up to 3MB each. Returns new attachment IDs for later removal via outlook_remove_draft_attachment.
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_paths | array | – | – |
| attachments | array | – | – |
| draft_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_attach_to_event ~79
Attach files to an event; auto-switches to upload-session for files >3MB. `attachment_paths` resolve inside `attachments_dir`, as for outlook_attach_to_draft. Attendees get the files with the event's next update. Returns new attachment IDs.
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_paths | array | yes | – |
| event_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 ~335
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 covers the last `fallback_window_hours` (default 24); later calls (tokens passed back) return only what changed. Replace stored delta_tokens with the returned dict; never merge them. `has_more` true: a resource stopped early; pass the returned dict back. 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 | object | – | – |
| fallback_window_hours | integer | – | – |
No output schema declared.
No examples provided.
outlook_complete_task ~33
Mark a To Do task as completed.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | – | – |
| 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 ~157
Create a new contact with name and optional email, phone, company, job_title, birthday (YYYY-MM-DD). title is the name prefix ("Dr.", "Ms."), shown in the display name — not the job. phone_type: "mobile", "business" or "home".
| Name | Type | Req | Description |
|---|---|---|---|
| birthday | string | – | – |
| categories | array | – | – |
| company | string | – | – |
| string | – | – | |
| first_name | string | yes | – |
| job_title | string | – | – |
| last_name | string | – | – |
| middle_name | string | – | – |
| personal_notes | string | – | – |
| phone | string | – | – |
| phone_type | string | – | – |
| title | string | – | – |
No output schema declared.
No examples provided.
outlook_create_draft ~267
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. reply_to_message_id (reply_all=True for all) or forward_message_id drafts in that thread, quoting the original; on a reply, Graph fills to/cc/subject, so pass [] for a recipient you want cleared and omit the argument to keep Graph's choice. 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 | array | – | – |
| body | string | yes | – |
| cc | array | – | – |
| deferred_send_datetime | string | – | – |
| forward_message_id | string | – | – |
| importance | string | – | – |
| is_html | boolean | – | – |
| is_markdown | boolean | – | – |
| reply_all | boolean | – | – |
| reply_to | array | – | – |
| reply_to_message_id | string | – | – |
| subject | string | – | – |
| to | array | – | – |
No output schema declared.
No examples provided.
outlook_create_event ~525
Create a calendar event with optional attendees, recurrence, busy status, 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. `timezone` is the IANA zone the event is anchored in, which is what a recurring series is expanded against (default: the configured zone). A zone name like America/Los_Angeles, never an abbreviation like PDT. `show_as` is Outlook's "Show as": "free", "tentative", "busy", "oof" (out of office), "workingElsewhere", or "unknown". Omitted, Graph defaults the event to busy. `calendar`: name or ID; omit for the default. `key`: your own reference for the event, e.g. a booking number.
| Name | Type | Req | Description |
|---|---|---|---|
| attendees | array | – | – |
| body | string | – | – |
| calendar | string | – | – |
| end | string | yes | – |
| is_all_day | boolean | – | – |
| is_online | boolean | – | – |
| key | string | – | – |
| location | string | – | – |
| recurrence | – | – | – |
| show_as | string | – | – |
| start | string | yes | – |
| subject | string | yes | – |
| timezone | string | – | – |
No output schema declared.
No examples provided.
outlook_create_folder ~48
Create a mail folder; pass `parent_folder` (name, path or ID) to nest it under that one.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| parent_folder | string | – | – |
No output schema declared.
No examples provided.
outlook_create_task ~198
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 | string | – | – |
| due | string | – | – |
| importance | string | – | – |
| list_id | string | – | – |
| recurrence | object | – | – |
| reminder | boolean | – | – |
| title | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_checklist_item ~46
Delete a checklist item from a To Do task.
| Name | Type | Req | Description |
|---|---|---|---|
| checklist_item_id | string | yes | – |
| list_id | string | – | – |
| task_id | 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 ~35
Delete a task from a Microsoft To Do list.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | – | – |
| task_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_delete_task_attachment ~43
Remove an attachment from a To Do task.
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_id | string | yes | – |
| list_id | string | – | – |
| task_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_download_attachment ~126
Download an attachment to `save_path` on the host, or return it with `as_content=True`. `save_path` is resolved inside the configured attachments directory (`attachments_dir`, an `attachments` folder in the settings directory by default) — a bare filename lands there; a path outside it is refused. Same directory for reads and writes. `as_content` writes nothing; 10 MB at most.
| Name | Type | Req | Description |
|---|---|---|---|
| as_content | boolean | – | – |
| attachment_id | string | yes | – |
| message_id | string | yes | – |
| save_path | string | – | – |
No output schema declared.
No examples provided.
outlook_download_task_attachment ~103
Download a To Do task attachment to a local file, or return it with `as_content=True`. `save_path` resolves inside the configured attachments directory; it never replaces an existing file. `as_content` writes nothing; 10 MB at most.
| Name | Type | Req | Description |
|---|---|---|---|
| as_content | boolean | – | – |
| attachment_id | string | yes | – |
| list_id | string | – | – |
| save_path | string | – | – |
| task_id | string | yes | – |
No output schema declared.
No examples provided.
outlook_find_event_by_key ~64
Find events by the `key` given to outlook_create_event or outlook_update_event. Any date. Searches the default calendar, or `calendar`. Returns events and series masters, not occurrences.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | string | – | – |
| key | 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 ~51
Forward an existing message to new recipients, with optional comment.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | – | – |
| is_markdown | boolean | – | – |
| 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 ~108
Read an event by event_id, or an invitation by message_id (exactly one). Returns your current event: body, attendees with proposed_new_time, organizer, is_organizer, allow_new_time_proposals, is_cancelled, recurrence, type, show_as, key and attachment metadata. start/end are UTC; original_start_time_zone is the anchor zone. recurrence uses the create tool's shape.
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | – | – |
| message_id | string | – | – |
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_get_task ~100
Get full To Do task details: notes (`body`), checklist items, due, recurrence flag. Use this for one task's sub-steps and notes; use outlook_list_tasks for overviews. `checklist_items` are ordered unchecked-first, matching the To Do client. `list_id` is only needed when the task lives in a non-default list.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | – | – |
| task_id | string | yes | – |
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 ~47
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 | string | – | – |
No output schema declared.
No examples provided.
outlook_list_contacts_delta ~122
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 | string | – | – |
| page_size | integer | – | – |
No output schema declared.
No examples provided.
outlook_list_drafts ~35
List messages in the Drafts folder with cursor pagination.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| cursor | string | – | – |
No output schema declared.
No examples provided.
outlook_list_events ~161
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 for day-at-a-glance scans: drops organizer, response_status, type and show_as; adds is_organizer and attendees_count; spells is_online as is_online_meeting. `calendar`: a display name or an ID from outlook_list_calendars; omit for the default calendar. A cursor continues the listing it came from.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | – |
| before | string | – | – |
| calendar | string | – | – |
| concise | boolean | – | – |
| count | integer | – | – |
| cursor | string | – | – |
| days | integer | – | – |
No output schema declared.
No examples provided.
outlook_list_events_delta ~176
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 | string | – | – |
| end | string | – | – |
| page_size | integer | – | – |
| start | string | – | – |
No output schema declared.
No examples provided.
outlook_list_folders ~66
List mail folders with message counts, parent_id, and child count. Default is top-level only; pass recursive=True to walk the full tree, each folder with the `path` that folder arguments accept.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| recursive | boolean | – | – |
No output schema declared.
No examples provided.
outlook_list_inbox ~277
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 | string | – | – |
| before | string | – | – |
| classification | string | – | – |
| concise | boolean | – | – |
| count | integer | – | – |
| cursor | string | – | – |
| folder | string | – | – |
| from_address | string | – | – |
| skip | integer | – | – |
| uncategorized_only | boolean | – | – |
| unread_only | boolean | – | – |
No output schema declared.
No examples provided.
outlook_list_inbox_delta ~134
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 | string | – | – |
| 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_attachments ~92
List attachments on a To Do task (id, name, size, content_type) with pagination. Use `outlook_download_task_attachment` with an id from here to save the content. has_more=True means pass next_cursor back for the next page.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| cursor | string | – | – |
| list_id | string | – | – |
| task_id | string | yes | – |
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 ~67
List tasks in a To Do list with optional `status` filter. `status`: "notStarted", "inProgress", or "completed".
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| cursor | string | – | – |
| list_id | string | – | – |
| status | string | – | – |
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.
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
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, rules, calendar, contacts, to-do, drafts (77 tools). This page covers its PyPI package (outlook-graph-mcp).
Is the Outlook MCP server safe to use?
Outlook MCP scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 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 71 tools: outlook_auth_status, outlook_list_inbox, outlook_read_message, outlook_read_messages, outlook_search_mail, and 66 more. Their descriptions and schemas cost roughly 7,269 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 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Outlook MCP server under?
Outlook MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.