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.
Metadata
Release files for outlook-mcp-com 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| outlook_mcp_com-0.1.3.tar.gz | 20.0 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl | CPython 3.10 | CPython 3.10 | Windows x86-64 | Details |
Total release size: 91.4 kB
Release files / outlook_mcp_com-0.1.3.tar.gz
| Download URL | outlook_mcp_com-0.1.3.tar.gz |
|---|---|
| Size | 20.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5fdec6c5e74f8f2a01b0610e864f6140f696a82c7c90ee4829ff2e7e3714ba07
|
|
BLAKE2b-256 checksum How to use checksums |
4774fa26665648762daa5ce25062c47de64a193fa0f8f30eca0284226d8efe7b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency logRelease files / outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl
| Download URL | outlook_mcp_com-0.1.3-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 17.8 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fce6e0d72f43391573368c1f2dfee6bcd9848fcdfe353a124a808f0c933f097b
|
|
BLAKE2b-256 checksum How to use checksums |
941a07ef72ff19d6e149efdc17d35683e5060d9907415c91125546ea559b5bb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency logRelease files / outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl
| Download URL | outlook_mcp_com-0.1.3-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 17.8 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
15709873b08b413a0c7bda704e7d9e4b285a9388a08184a2325ad4146c087866
|
|
BLAKE2b-256 checksum How to use checksums |
d7a06772d9019f93167830e949827be69bffcb1201c2ade49d0ba77d9fbb868a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency logRelease files / outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl
| Download URL | outlook_mcp_com-0.1.3-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 17.8 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2948430d4555bda0bfa06331b1c4152b27e892e1e28446510e28be34c3079cc1
|
|
BLAKE2b-256 checksum How to use checksums |
e76c51da408f2947f4bfd07c59c771cac1f9ecc43d38900774ab3cd3b41ce9e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency logRelease files / outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl
| Download URL | outlook_mcp_com-0.1.3-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 17.8 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0532b441571bb13332a8e2229009c48f680f5b29b2db097fc4d870ec2b415449
|
|
BLAKE2b-256 checksum How to use checksums |
1200a41d1dcdc590fe563a2876c4bbddb08a6546b87136bab50e019c84b3c71d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency log