Skip to main content

MCP server controlling Microsoft Outlook desktop via the Win32 COM API

Project description

outlook-mcp-com

An MCP server that lets Claude (or any MCP client) control Microsoft Outlook desktop on Windows through the Win32 COM API — read and send email, manage your calendar, save attachments, and work with tasks and notes, all against the Outlook profile you are already signed in to. No Azure app registration, no Graph API tokens.

⚠️ Requirements & Limitations

This package is Windows-only and requires:

  • Windows 10 or Windows 11 (classic Outlook COM API support)
  • Python 3.10, 3.11, 3.12, or 3.13
  • Classic Outlook desktop (Microsoft 365 / Office 2016+)

    The "new Outlook" (olk.exe) does not expose a COM API and will not work with this server.

  • A configured Outlook mail profile with your account already signed in.

Not supported:

  • macOS, Linux, or other Unix-like systems
  • The new Outlook (UWP/Store app)
  • Outlook Web Access (OWA) or cloud-only accounts
  • The test suite runs on any OS (COM calls are mocked), but the actual server only works on Windows.

Installation

git clone https://github.com/adamkopelman/outlook-mcp.git
cd outlook-mcp
pip install .

This installs the outlook-mcp console command (and pywin32 on Windows).

Hooking it up to Claude

As a Claude Code plugin (recommended for Claude Code) — this repo is itself a plugin (.claude-plugin/plugin.json) that registers the outlook MCP server for you. After pip install . (above), either:

# Try it locally without installing anything into Claude Code's config:
claude --plugin-dir /path/to/outlook-mcp

# Or install it properly, from a local checkout or directly from GitHub:
claude plugin install outlook-mcp@/path/to/outlook-mcp
claude plugin install outlook-mcp@github.com/adamkopelman/outlook-mcp

The plugin launches the server as python -m outlook_mcp rather than via the outlook-mcp console script, so it works even if pip's script directory isn't on PATH — it just needs outlook_mcp importable by whichever python is first on PATH.

Claude Desktop — add to %APPDATA%\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "outlook": {
      "command": "outlook-mcp"
    }
  }
}

If outlook-mcp isn't on PATH, use the full interpreter instead:

{
  "mcpServers": {
    "outlook": {
      "command": "C:\\Path\\To\\python.exe",
      "args": ["-m", "outlook_mcp"]
    }
  }
}

Claude Code (manual, without the plugin):

claude mcp add outlook -- outlook-mcp

Tools

Tool Description
list_folders List mail folders with item/unread counts
list_emails Recent emails in a folder (newest first, unread_only option)
search_emails Search subject/sender/body, optional since_days window
get_email Full email by id (body, recipients, attachment names)
send_email Send immediately (to/cc/bcc, plain or HTML body)
create_draft Compose and save to Drafts without sending
reply_email Reply / reply-all (send, or save as draft with send=false)
move_email Move an email to another folder (returns its new id)
delete_email Move an email to Deleted Items
list_events Calendar events in a date range (recurrences expanded)
get_event Full event details including attendees
create_event Create an appointment — adding attendees sends invites
respond_to_meeting Accept / decline / tentative a meeting invite
list_attachments List an email's attachments
save_attachments Save attachments to a local directory
list_tasks List tasks (open only by default)
create_task Create a task with due date and importance
complete_task Mark a task complete
list_notes List sticky notes
get_note Read a note's full body
create_note Create a sticky note

Items are addressed by an opaque id returned from list/search tools. Ids change when an item moves foldersmove_email returns the new id, and a stale id produces a clear "item not found" error.

Security notes

  • send_email, reply_email, create_event (with attendees) and respond_to_meeting act immediately as the signed-in Outlook user, with no confirmation step inside the server. If you want a human in the loop, prefer create_draft / send=false, or deny the sending tools in your MCP client's permission settings.
  • Outlook's object model guard may show a "A program is trying to send an e-mail message on your behalf" prompt, typically when no up-to-date antivirus is registered with Windows or group policy demands it. The prompt blocks the tool call until answered. Do not disable Outlook security to avoid it.
  • save_attachments writes to any local path the MCP client asks for.

Troubleshooting

  • "Outlook is not available..." — you're not on Windows, or classic Outlook isn't installed.
  • The first tool call may take a few seconds while Outlook launches.
  • "Item not found" — the id went stale (item moved or was deleted); list/search again to get a fresh id.
  • Date filters use Outlook's JET format internally; if search_emails with since_days misbehaves on a heavily localized system, try without it and filter by eye.

Development

pip install -e .[dev]
pytest

The COM layer lives in outlook_mcp/outlook/client.py behind the OutlookClientBase interface (outlook_mcp/outlook/base.py); tests run on any OS against an in-memory fake (tests/conftest.py).

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

outlook_mcp_com-0.1.3.tar.gz (20.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl (17.8 kB view details)

Uploaded CPython 3.13Windows x86-64

outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl (17.8 kB view details)

Uploaded CPython 3.12Windows x86-64

outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl (17.8 kB view details)

Uploaded CPython 3.11Windows x86-64

outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl (17.8 kB view details)

Uploaded CPython 3.10Windows x86-64

File details

Details for the file outlook_mcp_com-0.1.3.tar.gz.

File metadata

  • Download URL: outlook_mcp_com-0.1.3.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for outlook_mcp_com-0.1.3.tar.gz
Algorithm Hash digest
SHA256 5fdec6c5e74f8f2a01b0610e864f6140f696a82c7c90ee4829ff2e7e3714ba07
MD5 b11c2b19be58979d89b8ca2e814c2909
BLAKE2b-256 4774fa26665648762daa5ce25062c47de64a193fa0f8f30eca0284226d8efe7b

See more details on using hashes here.

Provenance

The following attestation bundles were made for outlook_mcp_com-0.1.3.tar.gz:

Publisher: ci.yaml on adamkopelman/outlook-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 fce6e0d72f43391573368c1f2dfee6bcd9848fcdfe353a124a808f0c933f097b
MD5 0ef10135eeb638e6ef8d7860f174a70a
BLAKE2b-256 941a07ef72ff19d6e149efdc17d35683e5060d9907415c91125546ea559b5bb8

See more details on using hashes here.

Provenance

The following attestation bundles were made for outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl:

Publisher: ci.yaml on adamkopelman/outlook-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 15709873b08b413a0c7bda704e7d9e4b285a9388a08184a2325ad4146c087866
MD5 e27387d2aef43a9aca43dbbcb38b1f65
BLAKE2b-256 d7a06772d9019f93167830e949827be69bffcb1201c2ade49d0ba77d9fbb868a

See more details on using hashes here.

Provenance

The following attestation bundles were made for outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl:

Publisher: ci.yaml on adamkopelman/outlook-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2948430d4555bda0bfa06331b1c4152b27e892e1e28446510e28be34c3079cc1
MD5 5ef1485f8f513103f9406cae1b1dd5ac
BLAKE2b-256 e76c51da408f2947f4bfd07c59c771cac1f9ecc43d38900774ab3cd3b41ce9e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl:

Publisher: ci.yaml on adamkopelman/outlook-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0532b441571bb13332a8e2229009c48f680f5b29b2db097fc4d870ec2b415449
MD5 1b32b386e9105609de5b06e32479cad8
BLAKE2b-256 1200a41d1dcdc590fe563a2876c4bbddb08a6546b87136bab50e019c84b3c71d

See more details on using hashes here.

Provenance

The following attestation bundles were made for outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl:

Publisher: ci.yaml on adamkopelman/outlook-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page