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 folders — move_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) andrespond_to_meetingact immediately as the signed-in Outlook user, with no confirmation step inside the server. If you want a human in the loop, prefercreate_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_attachmentswrites 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_emailswithsince_daysmisbehaves 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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fdec6c5e74f8f2a01b0610e864f6140f696a82c7c90ee4829ff2e7e3714ba07
|
|
| MD5 |
b11c2b19be58979d89b8ca2e814c2909
|
|
| BLAKE2b-256 |
4774fa26665648762daa5ce25062c47de64a193fa0f8f30eca0284226d8efe7b
|
Provenance
The following attestation bundles were made for outlook_mcp_com-0.1.3.tar.gz:
Publisher:
ci.yaml on adamkopelman/outlook-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outlook_mcp_com-0.1.3.tar.gz -
Subject digest:
5fdec6c5e74f8f2a01b0610e864f6140f696a82c7c90ee4829ff2e7e3714ba07 - Sigstore transparency entry: 2083012707
- Sigstore integration time:
-
Permalink:
adamkopelman/outlook-mcp@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/adamkopelman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Trigger Event:
push
-
Statement type:
File details
Details for the file outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 17.8 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fce6e0d72f43391573368c1f2dfee6bcd9848fcdfe353a124a808f0c933f097b
|
|
| MD5 |
0ef10135eeb638e6ef8d7860f174a70a
|
|
| BLAKE2b-256 |
941a07ef72ff19d6e149efdc17d35683e5060d9907415c91125546ea559b5bb8
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl -
Subject digest:
fce6e0d72f43391573368c1f2dfee6bcd9848fcdfe353a124a808f0c933f097b - Sigstore transparency entry: 2083012723
- Sigstore integration time:
-
Permalink:
adamkopelman/outlook-mcp@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/adamkopelman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Trigger Event:
push
-
Statement type:
File details
Details for the file outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 17.8 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15709873b08b413a0c7bda704e7d9e4b285a9388a08184a2325ad4146c087866
|
|
| MD5 |
e27387d2aef43a9aca43dbbcb38b1f65
|
|
| BLAKE2b-256 |
d7a06772d9019f93167830e949827be69bffcb1201c2ade49d0ba77d9fbb868a
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl -
Subject digest:
15709873b08b413a0c7bda704e7d9e4b285a9388a08184a2325ad4146c087866 - Sigstore transparency entry: 2083012794
- Sigstore integration time:
-
Permalink:
adamkopelman/outlook-mcp@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/adamkopelman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Trigger Event:
push
-
Statement type:
File details
Details for the file outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 17.8 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2948430d4555bda0bfa06331b1c4152b27e892e1e28446510e28be34c3079cc1
|
|
| MD5 |
5ef1485f8f513103f9406cae1b1dd5ac
|
|
| BLAKE2b-256 |
e76c51da408f2947f4bfd07c59c771cac1f9ecc43d38900774ab3cd3b41ce9e1
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl -
Subject digest:
2948430d4555bda0bfa06331b1c4152b27e892e1e28446510e28be34c3079cc1 - Sigstore transparency entry: 2083012771
- Sigstore integration time:
-
Permalink:
adamkopelman/outlook-mcp@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/adamkopelman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Trigger Event:
push
-
Statement type:
File details
Details for the file outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 17.8 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0532b441571bb13332a8e2229009c48f680f5b29b2db097fc4d870ec2b415449
|
|
| MD5 |
1b32b386e9105609de5b06e32479cad8
|
|
| BLAKE2b-256 |
1200a41d1dcdc590fe563a2876c4bbddb08a6546b87136bab50e019c84b3c71d
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl -
Subject digest:
0532b441571bb13332a8e2229009c48f680f5b29b2db097fc4d870ec2b415449 - Sigstore transparency entry: 2083012741
- Sigstore integration time:
-
Permalink:
adamkopelman/outlook-mcp@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/adamkopelman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@dc7a6c318c5c0e0a44c3944968c0bf703f4c556c -
Trigger Event:
push
-
Statement type: