Install
openclaw skills install @mpalermiti/outlook-mcpProduction-grade MCP server for personal Outlook (Outlook.com / Hotmail / Live). 68 typed Graph tools across mail, calendar, contacts, to-do, drafts, attachments, folders, threading, batch ops, delta-sync. Granular permissions, OS-keyring auth, /$batch-optimized triage and bulk read. Built for agents that need real Outlook coverage, not a CLI wrapper. BYO Azure app; zero telemetry.
openclaw skills install @mpalermiti/outlook-mcpMCP server for Microsoft Outlook personal accounts (Outlook.com, Hotmail, Live). Provides AI agents with full access to mail, calendar, contacts, and tasks via Microsoft Graph API.
Independent open-source project. Not affiliated with Microsoft.
Pass concise=True to read tools (outlook_list_inbox, outlook_read_message, outlook_search_mail, outlook_list_events, outlook_list_thread) to drop large body fields — ~10× fewer tokens for triage scans. Graph errors are wrapped into structured {code, message, action} responses with recovery hints (re-auth on 401, ROADMAP link on 403/ErrorAccessDenied, re-list on 404, back-off on 429, retry on 503). v1.9.1 docstring audit: every @mcp.tool() docstring rewritten to a consistent shape with contrastive pointers for ambiguous pairs and concrete syntax examples, designed to reduce wrong-tool selection by LLMs.
@outlook.com, @hotmail.com, @live.com). Work/school accounts (Entra ID) are not supported in v1.outlook-mcp auth on the host before the agent can use it. No interactive auth through MCP tools.@outlook.com address)~/.outlook-mcp/config.json:
{
"client_id": "YOUR-APP-CLIENT-ID",
"tenant_id": "consumers",
"timezone": "America/Los_Angeles",
"read_only": true,
"attachments_dir": "~/.outlook-mcp/attachments"
}
uv tool install outlook-graph-mcp
outlook-mcp on your PATH. Upgrade later
with uv tool upgrade outlook-graph-mcp.mcp.servers in ~/.openclaw/openclaw.json):
openclaw mcp set outlook '{"command":"outlook-mcp"}'
openclaw mcp list # verify
outlook-mcp auth
openclaw gateway restartWorking on outlook-mcp itself? Clone the repo and use
uv run --directory /path/to/outlook-mcp outlook-mcpas the command instead — see the README. The PyPI install above is the right one for using it.
morning_brief(folder="inbox") — today's events, unread mail and tasks due, in the cheapest ordertriage_folder(folder="inbox", count=50) — one scan, sorted, applied in a single batch callcatch_up(since="24h") — what changed, via the delta pathoutlook_auth_status — Check authentication status and read-only modeoutlook_list_inbox — List messages with filters (folder, unread, sender, date, category, Focused class)outlook_read_message — Get full message by IDoutlook_read_messages — Bulk read up to 20 messages by ID in one $batch round-trip (use NOT N read_message calls)outlook_search_mail — Search mail using KQL queryoutlook_list_folders — List all mail foldersoutlook_list_inbox_delta — List only inbox changes since last call (massive token savings for recurring agent jobs)outlook_send_message — Send email with recipients, CC, BCC, HTML, importanceoutlook_reply — Reply or reply-all to a messageoutlook_forward — Forward a messageoutlook_move_message — Move to a folderoutlook_delete_message — Delete (soft by default, permanent optional)outlook_flag_message — Set follow-up flagoutlook_categorize_message — Set categoriesoutlook_mark_read — Mark read or unreadoutlook_reclassify_message — Move between Focused Inbox and Otheroutlook_list_inbox_overrides — List Focused Inbox per-sender override rulesoutlook_set_inbox_override — Upsert a per-sender override (focused/other)outlook_delete_inbox_override — Delete an override by IDoutlook_list_events — List events in date range (expands recurring); each carries type (occurrence/exception for a series instance vs singleInstance; a seriesMaster never appears on a listing — use outlook_get_event) and show_as (the free/busy status); calendar reads a secondary calendar by name or ID (default calendar when omitted); a cursor continues the same calendar. concise=True drops type and show_asoutlook_get_event — Get event details, incl. recurrence, type (seriesMaster etc.), show_as, and original_start_time_zone (the zone the event is anchored in; start/end are UTC)outlook_list_events_delta — List only event changes since last call within a window (massive token savings for recurring agent jobs); each changed event carries every field the default outlook_list_events listing returns (not concise=True's narrower shape), type and show_as included, plus is_deleted (True on a tombstone, which carries only id); unlike the listing this one does return seriesMaster itemsoutlook_create_event — Create event with attendees, online meeting; recurrence (shorthand or Graph object) creates a series; timezone (IANA name) anchors it, defaulting to the config timezone; show_as sets Outlook's "Show as" (free/tentative/busy/oof/workingElsewhere/unknown, Graph defaults to busy)outlook_update_event — Update event fields incl. attendees (replaces the list, sends invites), all-day and show_as; recurrence converts a single event into a series, remove_recurrence=True converts it back; patching a time keeps the zone the event is anchored in, and timezone (with start and end) re-anchors it elsewhere; a start, end or recurrence patch to a series with edited or deleted occurrences is refused, because Graph would discard themoutlook_delete_event — Delete eventoutlook_rsvp — Accept, decline, or tentatively acceptoutlook_list_contacts — List with cursor pagination; summaries carry categoriesoutlook_search_contacts — Search by name or email; results omit categories (Graph's contact $search does not return them — read the contact back if you need them)outlook_get_contact — Get full details incl. home/business/other addresses, categories, personal notesoutlook_create_contact — Create (no address: add one with outlook_update_contact afterwards)outlook_update_contact — Update fields; home_address/business_address/other_address take {street, city, state, postal_code, country_or_region} (the shape outlook_get_contact returns) and replace that whole address, so pass back every part you want to keepoutlook_delete_contact — Deleteoutlook_list_contacts_delta — List only contact changes since last call (massive token savings for recurring agent jobs)outlook_changes_since — One structured "since last call" digest across mail, events, and contacts. Composes the three delta tools into counts + urgent-flagged mail + top-5 senders + new/cancelled events; auto-recovers from stale tokens. Designed for recurring agent loops (morning brief, hourly inbox sweep).outlook_list_task_lists — List To Do listsoutlook_list_tasks — List tasks with status filter and paginationoutlook_get_task — Get one task's details: notes (body), checklist items (unchecked first), recurrence flagoutlook_create_task — Create with due date, importance, recurrenceoutlook_update_task — Updateoutlook_complete_task — Mark completedoutlook_delete_task — Deleteoutlook_add_checklist_item — Add a sub-step (checklist item) to a taskoutlook_update_checklist_item — Check off or rename a sub-step (partial patch)outlook_delete_checklist_item — Delete a sub-stepoutlook_list_task_attachments — List a task's attachments (id, name, size, content_type)outlook_download_task_attachment — Download task attachment content to attachments_diroutlook_upload_task_attachment — Attach a local file to a task via inline base64 POST (1 byte – 20 MiB)outlook_delete_task_attachment — Remove a task attachmentoutlook_list_drafts — List with paginationoutlook_create_draft — Create for later reviewoutlook_update_draft — Updateoutlook_send_draft — Sendoutlook_delete_draft — Deleteoutlook_list_attachments — List on a messageoutlook_download_attachment — Download and save decoded bytes into attachments_diroutlook_send_with_attachments — Send with files read from attachments_dir (auto upload session for >3MB)outlook_attach_to_draft — Add attachments to an existing draft (auto upload session for >3MB)outlook_remove_draft_attachment — Remove a single attachment from a draftoutlook_create_folder — Create (top-level or nested)outlook_rename_folder — Renameoutlook_delete_folder — Delete (refuses well-known folders)outlook_list_thread — Get all messages in a conversationoutlook_copy_message — Copy to another folderoutlook_batch_triage — Batch move/flag/categorize/mark_read (max 20)outlook_whoami — Current user profileoutlook_list_calendars — Available calendarsoutlook_list_categories — Category definitions with colorsoutlook_get_mail_tips — Pre-send check (OOF, delivery restrictions)login.microsoftonline.com and graph.microsoft.comallow_unencrypted_token_cache is set.7d ago, +7d from now, now); responses are UTC. A zone-less date is read in the config timezone — except on outlook_update_event, where it is read in the zone the event itself is anchored in, so patching a colleague's New York meeting to 09:00 means 09:00 theretimezone (or set the config one) when creating a series that crosses a daylight-saving change — anchored in UTC, a 09:00 weekly meeting becomes 08:00 when the clocks go back. Use a zone name (America/Los_Angeles), never an abbreviation (PDT)attachments_dir — put a file there before asking for it to be sentmorning_brief, triage_folder, catch_upread_only: true, flip when comfortableallow_categories in config (e.g., ["calendar_write"] to allow only calendar writes). See README for the 7 categories and example policies.OUTLOOK_MCP_TOOLSETS (e.g. mail,calendar,digest,delta) to load only the tool groups you use and cut per-turn context; unset loads all 68. Tools carry read-only / destructive annotations so clients can auto-approve reads.OUTLOOK_MCP_CONFIG_DIR (e.g. ~/.outlook-mcp-work) and run outlook-mcp auth once with that variable set. Move only the config directory, never HOME — see README "Two accounts, two instances".