outlook-mcp
Secure MCP server for on-prem Microsoft Exchange (EWS) with tools for email, calendar, contacts, folders, attachments, and free/busy availability.
README
outlook-mcp
outlook-mcp is an MCP server for on-prem Microsoft Exchange via EWS (exchangelib).
It gives MCP-compatible clients access to email, calendar, contacts, folders, attachments, and availability data through a single, testable Python service.
Short description
Secure MCP server for on-prem Microsoft Exchange (EWS) with tools for email, calendar, contacts, folders, attachments, and free/busy availability.
Suggested repository topics / tags
mcp, model-context-protocol, exchange, microsoft-exchange, ews, outlook, email, calendar, contacts, python, automation, exchangelib
Highlights
- email operations: list, search, read, send, reply, forward, move, copy, delete, mark
- calendar operations: list, create, update, delete, respond to invites, find free slots
- contacts operations: search, read, create, update, delete
- folder operations and attachment download
- Exchange auth via
NTLMandBasic - MCP transport via
stdioandSSE - centralized error mapping and a single
ExchangeClientabstraction - privacy-safer smoke check output by default
- Docker support and GitLab CI/CD pipeline included
Tool catalog
System
ping_exchangeget_mailbox_info
list_emailsget_emailsearch_emailssend_emailreply_emailforward_emailmove_emailcopy_emaildelete_emailmark_emaillist_folderscreate_foldercreate_draftsend_draftget_attachment
Calendar
list_eventsget_eventcreate_eventupdate_eventdelete_eventrespond_to_invitefind_free_slotsget_my_availabilitylist_calendars
Contacts
search_contactsget_contactcreate_contactupdate_contactdelete_contact
Typical use cases
- connect Claude Desktop or another MCP client to on-prem Exchange
- search inbox messages and fetch full email content
- send or draft emails from AI workflows
- inspect calendars and create meetings
- check free/busy windows for scheduling
- search personal contacts or the GAL
- expose Exchange operations through a controlled MCP boundary instead of direct mailbox scripting
Security notes
What the current code does:
- connects only to the Exchange/EWS endpoint configured in
EXCHANGE_SERVER - does not contain telemetry, analytics, or third-party data export logic
- keeps secrets in environment variables /
.env - ignores local secret files via
.gitignore(.env,.env.*, while keeping.env.example) - logs only tool name, status, duration, and error code; it does not log message bodies, attachment contents, or passwords
- excludes
.env, tests, caches, and VCS metadata from Docker build context via.dockerignore
What you should still be careful with:
EXCHANGE_VERIFY_SSL=falsedisables TLS certificate verification and should be used only for trusted internal/self-signed environmentsget_attachmentwrites files to disk, so choose a safe destination directoryoutlook-mcp-smokeis privacy-safe by default and prints only masked mailbox info plus counts; setOUTLOOK_MCP_SMOKE_INCLUDE_DATA=trueonly if you explicitly want real inbox/event data in stdout- if you enable file logging with
LOG_FILE, protect that file with OS permissions - if you publish Docker images from CI, protect GitLab/GitHub project access and registry permissions
Quick start
uv venv
source .venv/bin/activate
uv pip install -e .[dev]
cp .env.example .env
outlook-mcp
By default the server runs in stdio mode. Set MCP_TRANSPORT=sse to start an HTTP server.
Configuration
Example .env:
EXCHANGE_SERVER=https://mail.company.com/EWS/Exchange.asmx
EXCHANGE_USERNAME=DOMAIN\\username
EXCHANGE_PASSWORD=secret
EXCHANGE_EMAIL_ADDRESS=user@company.com
EXCHANGE_VERIFY_SSL=true
EXCHANGE_AUTH_TYPE=NTLM
EXCHANGE_VERSION=EXCHANGE_2016
EXCHANGE_TIMEOUT=30
EXCHANGE_MAX_RETRIES=3
EXCHANGE_TIMEZONE=Europe/Moscow
EXCHANGE_IMPERSONATE_AS=
ATTACHMENT_MAX_SIZE_MB=10
MCP_TRANSPORT=stdio
MCP_SSE_HOST=127.0.0.1
MCP_SSE_PORT=8080
LOG_LEVEL=INFO
LOG_FILE=
Notes:
- set
EXCHANGE_EMAIL_ADDRESSwhenEXCHANGE_USERNAMEis not an SMTP address OAuth2is reserved in config, but this build currently supports live auth withNTLMorBasicEXCHANGE_IMPERSONATE_ASenables mailbox impersonation when Exchange permissions are configured accordinglyATTACHMENT_MAX_SIZE_MBis enforced before sending/replying/forwarding/drafting with local attachments
Claude Desktop example
{
"mcpServers": {
"outlook": {
"command": "outlook-mcp",
"env": {
"EXCHANGE_SERVER": "https://mail.company.com/EWS/Exchange.asmx",
"EXCHANGE_USERNAME": "DOMAIN\\username",
"EXCHANGE_PASSWORD": "secret",
"EXCHANGE_EMAIL_ADDRESS": "user@company.com",
"EXCHANGE_AUTH_TYPE": "NTLM"
}
}
}
}
Smoke check
After filling .env, run:
outlook-mcp-smoke
Default output is sanitized for safer verification. If you intentionally want sample mailbox/event data in the output:
OUTLOOK_MCP_SMOKE_INCLUDE_DATA=true outlook-mcp-smoke
Docker
docker build -t outlook-mcp .
docker run --rm --env-file .env outlook-mcp
GitLab CI/CD
The repository includes .gitlab-ci.yml with these stages:
lint— runsrufftest— runspytestbuild— builds Python package artifacts intodist/release— builds and pushes a Docker image to the GitLab Container Registry on the default branch and on tags
Default image tagging behavior:
- default branch: pushes
:$CI_COMMIT_SHORT_SHAand:latest - git tag: pushes
:$CI_COMMIT_TAG
GitLab built-in registry variables are used:
CI_REGISTRYCI_REGISTRY_USERCI_REGISTRY_PASSWORDCI_REGISTRY_IMAGE
Development
uv run --python 3.12 --with '.[dev]' ruff check .
uv run --python 3.12 --with '.[dev]' pytest -q
Project notes
- The implementation is centered around a single
ExchangeClientabstraction so auth, transport, retries, and error mapping stay centralized. - Errors are returned in a structured JSON form suitable for MCP
isError=truehandling. RTK.mdis not present in this repository, so the implementation followsPLAN.md.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。