outlook-mcp

communication MCP Server

Custom MCP server connecting Claude to Microsoft Outlook (email, calendar, contacts, tasks, OneDrive) via Cloudflare Workers + OAuth 2.0.

VerifiedFreshInstall Ready
communicationcommunication
4 views2 stars1 forksv2.8.0MIT

Why This Matters

Discovered via github-topic:model-context-protocol and last synced 1d ago.

VerifiedFreshInstall Ready
Source
github-topic:model-context-protocol
Stars
2
Last synced
1d ago
Install
Instructions detected

Install

1. Add to claude_desktop_config.json

{
  "mcpServers": {
    "outlook-mcp": {
      "command": "uvx",
      "args": [
        "mcp-server-outlook"
      ]
    }
  }
}

Config file location: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) / %APPDATA%\Claude\claude_desktop_config.json (Windows)

103
Tools
0
Resources
0
Prompts
Standard I/O
Transport

Available Tools (103)

MCP_APPROVAL_CODE

One-time code you paste at `/authorize` to mint a Claude bearer. Also used as the encryption secret for upstream Microsoft tokens at rest — rotating it invalidates stored tokens and forces clean Microsoft re-auth.

MICROSOFT_CLIENT_SECRET

Your Azure AD app's client secret.

Secret

Purpose

outlook_forward

Forward a message to one or more recipients with optional comment.

outlook_list_inbox_overrides

List Focused Inbox per-sender override rules.

outlook_update_event

Update event fields (subject, time, location, body). Only patches changed fields.

outlook_update_contact

Update contact fields.

outlook_delete_task

Delete a task.

outlook_list_folders

List mail folders with counts, `parent_id`, and `child_count`. Pass `recursive=true` to walk the full folder tree (subfolders included).

outlook_flag_message

Set follow-up flag: `flagged`, `complete`, or `notFlagged`.

outlook_list_events

List events in a date range. Expands recurring events. Configurable via `days`, `after`, `before`.

outlook_list_contacts

List contacts with cursor pagination.

outlook_list_tasks

List tasks with status filter and pagination.

outlook_update_draft

Update draft fields. Accepts `is_html=True` for HTML bodies and `deferred_send_datetime` to set or clear the scheduled delivery time.

outlook_remove_draft_attachment

Remove a single attachment from a draft.

outlook_set_inbox_override

Upsert a per-sender Focused Inbox override (`focused` / `other`). Case-insensitive sender matching; PATCH-if-exists, else POST.

outlook_auth_status

Check if authenticated and whether read-only mode is active.

outlook_reply

Reply or reply-all to a message.

outlook_reclassify_message

Move a message between Focused Inbox and Other (`focused` / `other`).

outlook_create_event

Create event with location, attendees, recurrence, online meeting support.

outlook_create_contact

Create a new contact.

outlook_complete_task

Mark task as completed.

outlook_rename_folder

Rename a mail folder.

outlook_search_mail

Search mail using KQL query. Optionally scope to a folder by name or ID.

outlook_delete_message

Delete a message. Soft delete (Deleted Items) by default. `permanent: true` for hard delete.

outlook_list_task_lists

List To Do lists.

outlook_create_draft

Create a draft. Supports scheduled delivery via `deferred_send_datetime` (server-side, Outlook-desktop-compatible "Delay Delivery").

outlook_attach_to_draft

Add attachments to an existing draft (auto upload session for >3MB).

outlook_copy_message

Copy a message to another folder.

outlook_read_message

Get full message by ID. Format: `text`, `html`, or `full` (both). Pass `include_deferred_send=True` to also surface the draft's scheduled delivery time.

outlook_send_message

Send email. Supports TO/CC/BCC, HTML body, importance level.

outlook_mark_read

Mark a message as read or unread.

outlook_get_contact

Get full contact details by ID.

outlook_update_task

Update task fields.

outlook_move_message

Move a message to a folder by name or ID.

outlook_delete_inbox_override

Delete a Focused Inbox override by ID.

outlook_rsvp

RSVP to an event: `accept`, `decline`, or `tentative`. Optionally include a message.

outlook_list_drafts

List draft messages with pagination.

outlook_send_with_attachments

Send message with file attachments (auto upload session for >3MB).

outlook_list_thread

Get all messages in a conversation thread.

outlook_categorize_message

Set categories on a message.

outlook_get_event

Get full event details: attendees, body, online meeting URL, recurrence.

outlook_search_contacts

Search contacts by name or email.

outlook_create_task

Create task with due date, importance, recurrence.

outlook_send_draft

Send an existing draft.

outlook_delete_event

Delete a calendar event.

outlook_delete_contact

Delete a contact.

outlook_download_attachment

Download attachment and save decoded bytes to a file.

outlook_delete_draft

Delete a draft.

outlook_create_folder

Create mail folder (top-level or nested).

outlook_whoami

Get current user profile.

outlook_set_timezone

Write the server-side mailbox timezone. Accepts IANA (`America/Los_Angeles`) or Windows (`Pacific Standard Time`) zone names; Graph validates.

allow_categories

`list[string]`

todo_write

create/update/complete/delete task

outlook_delete_folder

Delete a mail folder (refuses well-known folders).

outlook_list_categories

List category definitions with colors.

outlook_batch_triage

Batch move/flag/categorize/mark_read (max 20 per call). Single Graph `/$batch` round-trip — 10-20× faster than per-message calls for large triage.

outlook_list_calendars

List available calendars.

outlook_get_auto_reply

Read out-of-office / auto-reply configuration. Scheduled datetimes are normalized to UTC ISO 8601 where possible.

Category

Tools

mailbox_settings

get/set timezone, get/set auto-reply (OOO)

outlook_get_mail_tips

Pre-send check (OOF, delivery restrictions).

outlook_list_accounts

List configured accounts.

client_id

`string`

mail_folders

create/rename/delete folder

outlook_switch_account

Switch active account.

tenant_id

`string`

mail_send

send, reply, forward, send_draft, send_with_attachments

outlook_get_timezone

Read the server-side mailbox timezone (`/me/mailboxSettings/timeZone`).

read_only

`bool`

contacts_write

create/update/delete contact

outlook_set_auto_reply

Configure auto-reply. Supports `disabled` / `always` / `scheduled` status, internal + external messages, `none` / `contacts_only` / `all` external-audience scopes, and scheduled start/end datetimes.

mail_drafts

create/update/delete draft

Field

Type

mail_triage

move, delete (soft), flag, categorize, mark read, copy, batch

timezone

`string`

calendar_write

create/update/delete event, RSVP

Drafts

`ol_email_create_draft` / `ol_email_update_draft` / `ol_email_list_drafts` / `ol_email_discard_draft`, `ol_calendar_create_event_draft` / `ol_calendar_discard_event_draft`, attachment access, per-profile draft registry.

Version

Status

Tier

Backend

ol_status

shows pending drafts created by this profile

1

OS keyring

Feature

Work / school

file

encrypted-file`. ## Troubleshooting ### "No usable credentials" The cached token expired (refresh tokens last ~60–90 days) or never existed. Run: ```bash uvx mcp-server-outlook login --profile <name> ``` ### Linux: keyring fails / "Secret Service unavailable" The plain-file backend kicks in automatically — no action needed. If you'd rather have encryption at rest: ```bash export OUTLOOK_TOKEN_PASSPHRASE='<some-strong-passphrase>' uvx mcp-server-outlook login --profile <name> ``` ## Development ```bash git clone https://github.com/XMV-Solutions-GmbH/outlook-mcp.git cd outlook-mcp uv sync --extra dev # Unit + integration (no real Microsoft Graph), with coverage reporting ./tests/run_tests.sh # Harness (real Microsoft 365 sandbox; requires harness-profile login) ./tests/run_tests.sh harness ```

OUTLOOK_MCP_CLIENT_ID

yes

OUTLOOK_MCP_REDIRECT_PORT

no

Required

Default

outlook_list_inbox

List messages in a folder. `folder` accepts display names, well-known names, or Graph IDs. Filter by read status, sender, date range, Focused Inbox classification. Pagination via `skip`.

outlook_read_messages

Bulk read up to 20 messages by ID via Graph `$batch` in one round-trip. Per-message shape matches `outlook_read_message` byte-for-byte for the same `(format, concise, include_deferred_send)`. Partial-failure tolerant: 404s on some IDs surface in `failures[]` without failing the whole call. Use NOT N `outlook_read_message` calls.

outlook_list_inbox_delta

List only inbox changes since the last call. First call returns a full snapshot plus a `delta_token`; subsequent calls (token passed back) return only added/updated/deleted items. Deletes come back as `{id, is_deleted: True}`. Cursor is stateless — agent persists and replays.

outlook_changes_since

One structured "since last call" digest composing mail/events/contacts deltas. Returns counts + `urgent_flagged` mail + top-5 `by_sender` + new/cancelled events. Each resource has an independent `delta_token`; stale-token recovery (HTTP 410) auto-resyncs that resource and surfaces `_meta.resync`. First-call snapshot is filtered to `fallback_window_hours` (default 24). Designed for recurring agent loops.

outlook_list_events_delta

List only event changes inside a window since the last call. `start` and `end` (ISO 8601) required on the first call (Graph constraint — no whole-calendar sync). Deletes come back as `{id, is_deleted: True}`. Cursor is stateless.

outlook_list_contacts_delta

List only contact changes since the last call. Deletes come back as `{id, is_deleted: True}`. Cursor is stateless.

outlook_list_attachments

List attachments on a message.

SIGNATURE_HTML

Optional. Email signature block appended server-side — see [Email signature](#email-signature).

SIGNATURE_LOGO_URL

Optional. Publicly reachable HTTPS URL of the signature logo.

Tool

What it does

reason

meaning

no_content

ordinary — nobody recorded the meeting

forbidden

ordinary — organised in another tenant, so Graph won't serve its artifacts

no_join_url

worth investigating — no Teams link found on the event

unresolved_meeting

worth investigating — link found, but no matching online meeting

error

worth investigating — an unexpected failure