MCP server for Exchange / OWA - email, calendar, directory, availability
Project description
OWA Exchange MCP Server
MCP (Model Context Protocol) server for any Microsoft Exchange / OWA (Outlook Web Access) deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.
Works with any on-premise or hosted Exchange server that exposes OWA.
Quick Start
# Copy and edit the MCP config with your OWA URL
cp .mcp.json.example .mcp.json
# One-time: set up encrypted credentials
python3 login.py --setup
# Login (opens headless browser, 2FA approval required)
python3 login.py
# Install the MCP server
pip install -e .
Configuration
| Variable | Required | Description |
|---|---|---|
EXCHANGE_OWA_URL |
Yes | Base URL of your OWA instance |
EXCHANGE_COOKIE_FILE |
No | Path to session cookies file (default: session-cookies.txt) |
Login
Option A: Via MCP tool (recommended)
The login tool handles credential setup and authentication within the MCP session — no separate terminal needed.
First time (setup + login):
login(master_password="...", username="user@example.com", password="...")
Subsequent logins (decrypts stored credentials):
login(master_password="...")
Option B: Via CLI
python3 login.py --setup # First time: save encrypted credentials
python3 login.py # Login with 2FA
Both methods:
- Open a headless browser to your OWA URL
- Submit credentials
- Wait for 2FA approval (up to 90 seconds)
- Save encrypted session cookies to
session-cookies.txt
Credentials and session cookies are encrypted at rest with AES-256 (PBKDF2 key derivation, 480k iterations).
Tools (30)
Email (10)
| Tool | Description |
|---|---|
get_emails |
List emails from a folder with filtering |
get_email |
Get full email content by ID |
send_email |
Send a new email |
reply_email |
Reply to an email |
forward_email |
Forward an email |
delete_email |
Delete an email |
move_email |
Move email to another folder |
mark_email_read |
Mark email as read/unread |
download_attachments |
Download file attachments from an email |
get_email_links |
Extract hyperlinks from an email body |
Calendar (7)
| Tool | Description |
|---|---|
get_calendar_events |
Get events in a date range (supports recurring expansion) |
create_meeting |
Create a meeting with attendees |
update_meeting |
Update an existing meeting |
cancel_meeting |
Cancel a meeting and notify attendees |
respond_to_meeting |
Accept, decline, or tentatively accept |
download_event_attachments |
Download file attachments from a calendar event |
get_event_links |
Extract hyperlinks from an event description |
Directory (1)
| Tool | Description |
|---|---|
find_person |
Search people in Active Directory |
Folders (7)
| Tool | Description |
|---|---|
get_folders |
List mail folders with unread counts |
create_folder |
Create a new mail folder |
rename_folder |
Rename an existing folder |
empty_folder |
Empty all items from a folder |
delete_folder |
Delete a mail folder |
move_folder |
Move a folder to a different parent |
check_session |
Check if the OWA session is authenticated |
Availability (2)
| Tool | Description |
|---|---|
find_free_time |
Find free slots in your calendar |
find_meeting_time |
Find common free slots for multiple people |
Analytics (2)
| Tool | Description |
|---|---|
get_meeting_stats |
Meeting count statistics for multiple people |
get_meeting_contacts |
Connection matrix — who you meet with most |
Auth (1)
| Tool | Description |
|---|---|
login |
Authenticate to OWA (credential setup + 2FA login) |
Files
login.py # Browser-based 2FA login (standalone CLI)
exchange_mcp/
server.py # FastMCP server entry point
owa_client.py # OWA HTTP client
auth.py # Async login logic (shared by MCP tool)
tools/
email.py # Email tools
calendar.py # Calendar tools
people.py # Directory search
folders.py # Folder management & session check
availability.py # Free time / meeting time
analytics.py # Meeting stats & contacts
auth.py # Login tool
pyproject.toml # Package config
Security
- Credentials and session cookies encrypted with AES-256-Fernet
- Master password never stored
- PBKDF2 with 480,000 iterations for key derivation
- Credential and cookie files have
0600permissions - Cookies decrypted into memory only — never written to disk as plaintext (via MCP tool)
- Session cookies never transmitted except to your OWA server
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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 exchange_mcp_server-1.0.0.tar.gz.
File metadata
- Download URL: exchange_mcp_server-1.0.0.tar.gz
- Upload date:
- Size: 40.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b962b9b633d1fbe595d5e0463a01ed7d0f6beb5a98f8acf7b523049320436fa2
|
|
| MD5 |
9729fab8f5dd2ce5d06e4c584ddb33d6
|
|
| BLAKE2b-256 |
f081db5539d05f1b05e93552d052aebe96e617f6b8f8cd870904651cd59cd90a
|
File details
Details for the file exchange_mcp_server-1.0.0-py3-none-any.whl.
File metadata
- Download URL: exchange_mcp_server-1.0.0-py3-none-any.whl
- Upload date:
- Size: 46.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8dda981266658a0f7037528c63577b3a7de8578cec765a4c437a2a7f57858399
|
|
| MD5 |
0cf58880721807e54b6f90836c1038c7
|
|
| BLAKE2b-256 |
89038b852bb6a1c73667db10a6a52d300b3dcdb1454331544289ebe669791e3e
|