Skip to main content
Glama
ItayElizur

mcp-outlook

by ItayElizur

mcp-outlook

一个可自托管的基于 EWS(Exchange Web Services)的本地 Microsoft Exchange MCP 服务器。专为隔离/无云环境打造——它直接与你的内部 Exchange 服务器通信,绝不接触 Microsoft Graph、Azure AD 或桌面版 Outlook 客户端。

  • 后端: exchangelib(EWS 客户端)

  • 框架: FastMCP

  • 传输: streamable-http(一个独立 HTTP 服务器,供其他内部主机连接)

  • Exchange 认证: basic 或 NTLM(可通过配置选择)

两种模式

模式

服务对象

认证方式

static(默认)

单个邮箱

以该账户(你自己的凭据)连接——非常适合本地 Beta 测试

jwt

多个用户

校验每个调用方的用户 JWT,然后通过**服务账户 + EWS 模拟(Impersonation)**对该用户的邮箱执行操作

jwt 模式如何桥接身份。 Exchange 无法消费你们公司的 JWT(Outlook 基于 PKINIT/Kerberos)。因此 MCP 执行两次独立的认证,绝不会混用:

User --(JWT)--> MCP validates the token, reads the user's email
                MCP --(service account, NTLM)--> Exchange
                MCP --(impersonation header = user's email)--> acts on the user's mailbox

用户的 JWT 绝不会发送到 Exchange,也不会有任何用户密码/智能卡接触到 MCP——只有单个服务凭据会。管理员在 jwt 模式下需要配置什么,请参阅 TODO.md

Related MCP server: OWA Exchange MCP Server

工具

工具

用途

list_emails(folder="inbox", limit=20)

最近的消息,最新的在前

search_emails(query, folder, start_date, end_date, sender, recipient, limit)

文本 + 日期范围 + 发件人/收件人搜索

get_email(message_id, folder="inbox")

完整消息:正文、收件人、附件名称

draft_email(to, subject, body)

打开交互式撰写组件(MCP Apps);用户编辑并发送

reply_email(message_id, folder, reply_all, body)

打开预填为回复的撰写组件

forward_email(message_id, folder, to, body)

打开预填为转发的撰写组件

send_email(to, subject, body, cc, bcc, html, attachments)

发送——只能从组件中调用(仅应用可见)

search_contacts(query, limit)

搜索联系人——只能从组件中调用(仅应用)

mark_email_read(message_id, folder) / mark_email_unread(...)

切换已读状态

delete_email(message_id, folder, permanent=False)

移动到已删除邮件,或永久删除

flag_email_important(message_id, folder, important=True)

设置 Outlook 的高/普通重要性

move_email(message_id, destination, folder)

将消息移动到另一个文件夹

list_folders()

可用的邮件文件夹名称,包括子文件夹

list_events(start_date, end_date, limit)

日期范围内的日历事件

get_event(event_id)

完整事件:正文、与会者、位置

find_meeting_slots(attendees, duration_minutes, ...)

日程安排助手——按与会者可用性对时间段排序

draft_event(subject, start, end, location, body, required_attendees, optional_attendees)

打开交互式事件草稿组件

create_event(subject, start, end, required_attendees, ...)

创建事件——只能从组件中调用(仅应用)

accept_meeting(event_id) / decline_meeting(event_id)

响应会议邀请

list_emailssearch_emails 还接受 unread_only=true,只返回未读消息。

安装

需要 Python 3.11+ 和 uv

uv sync                 # create venv + install deps
cp .env.example .env    # then edit .env with your Exchange details
uv run python -m mcp_outlook

服务器绑定到 MCP_HOST:MCP_PORT(默认 127.0.0.1:8000),并在 /mcp 上提供 streamable-http MCP 端点。

本地 Beta 测试(无需管理员配置)

使用你自己的用户名/密码针对你自己的邮箱运行——无需 JWT、无需模拟、无需服务账户、无需智能卡:

# in .env:
OUTLOOK_AUTH_MODE=static          # the default
OUTLOOK_EWS_ENDPOINT=https://mail.corp.local/EWS/Exchange.asmx
OUTLOOK_USERNAME=CORP\you
OUTLOOK_PASSWORD=...
uv run python -m mcp_outlook

配置

所有设置均来自环境变量(或 .env 文件)。完整列表请参阅 .env.example。要点如下:

变量

说明

OUTLOOK_AUTH_MODE

static(默认,单个邮箱)或 jwt(多用户隧道)

OUTLOOK_EWS_ENDPOINT

完整的 asmx URL,例如 https://mail.corp.local/EWS/Exchange.asmx首选。

OUTLOOK_SERVER

仅主机名的替代方案(端点假定为 /EWS/Exchange.asmx

OUTLOOK_USERNAME

连接账户——你自己的(static)或服务账户(jwt)。NTLM 使用 DOMAIN\user,basic 使用邮箱。sspi 时不使用

OUTLOOK_EMAIL

要打开的邮箱(static 模式)。可选——当 OUTLOOK_USERNAME 是邮箱地址时默认为该值;在 jwt 模式下忽略;使用 sspi必需(没有可用于默认的用户名)

OUTLOOK_PASSWORD

账户密码。sspi 时不使用

OUTLOOK_AUTH_TYPE

ntlm(默认)、basicsspi(Windows 集成认证——以当前进程自身的 AD 身份认证,无需用户名/密码;仅 Windows,需要 uv sync --extra sspi

OUTLOOK_JWT_ISSUER / _AUDIENCE

jwt 模式必需——要求校验的令牌签发方(issuer)和受众(audience)

OUTLOOK_JWT_JWKS_URI / _PUBLIC_KEY

jwt 模式——签名密钥(JWKS URI,或用于隔离环境的静态 PEM)

OUTLOOK_JWT_EMAIL_CLAIM

jwt 模式——保存用户 SMTP 地址的 claim(默认 email

OUTLOOK_CA_BUNDLE

内部 CA .pem 的路径(用于自签名 / 内部 CA)

OUTLOOK_VERIFY_SSL

true(默认);false 禁用 TLS 校验(仅开发环境)

MCP_HOST / MCP_PORT

HTTP 绑定地址(默认 127.0.0.1:8000

查找你的 EWS 端点

EWS URL 不是 OWA(网页邮箱)URL。在 Exchange 服务器上:

Get-WebServicesVirtualDirectory | fl Name,InternalUrl,ExternalUrl

在隔离环境中,你几乎总是需要 InternalUrl

测试

单元测试不需要 Exchange 服务器(仅配置解析 + 序列化):

uv run pytest

真实环境冒烟测试(使用真实的 .env):启动服务器,连接 MCP 客户端或 MCP Inspector,然后依次调用 list_folderslist_emailssend_email(发给自己)并确认收到。在 ntlmbasic 之间切换 OUTLOOK_AUTH_TYPE,以确认你的 Exchange 管理员启用了哪一种。

撰写 UI(MCP Apps)

draft_email 会打开一个交互式 MCP Apps 组件——这是一个内置于单个自包含 HTML 文件(src/mcp_outlook/widgets/compose.html)的 React 撰写器。任何支持 MCP Apps 的主机都会在聊天线程中内联渲染它。

组件功能:

  • 收件人字段带内联联系人搜索 — 在最后一个逗号后输入以搜索联系人;选择结果后,查询内容会被替换为标签块;有效地址会显示为带标签的标签块。

  • 发送 / 放弃 — 发送会直接从组件中触发 send_email(仅应用级——模型无法调用);放弃会折叠卡片。

  • 取代 — 打开新草稿会使任何较旧的已打开草稿组件变灰。

  • 签名 — 每封草稿都会预填“Written with Airchat”(可编辑)。

隔离环境保证: 构建后的 HTML(内联 React + bridge JS)随 Python 包一起发布。运行时不会发起任何外部资源请求;Node.js 仅用于重新构建该组件。

重新构建组件(仅开发)

cd frontend
npm ci
npm run build     # tsc + vite build + artifact copy → src/mcp_outlook/widgets/compose.html

构建脚本会在复制前验证 HTML 中不包含外部 URL。

可视化试用(独立开发预览)

cd frontend && npm run dev
# Opens http://localhost:5173 with a mock host — no Exchange needed.
# Type in To, see chips form, contact results appear, Send/Discard collapse the card.

注意事项

  • 现代 Exchange 上通常禁用 Basic 认证 — NTLM 是更安全的默认选择。

  • 内部/自签名证书需要 OUTLOOK_CA_BUNDLE,否则连接会在 TLS 校验时失败。

  • 多用户(jwt)模式需要一个 Exchange 授权 — 服务账户必须拥有 ApplicationImpersonation RBAC 角色。参见 TODO.mdstatic 模式不需要此类授权。

  • .env 中包含明文密码。 它已被 git 忽略;同时请在主机上锁定文件权限(chmod 600 .env)。

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for any Microsoft Exchange / OWA deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.
    30
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables reading, sending, and managing Microsoft 365/Outlook emails through MCP tools with OAuth 2.1 authentication.
    114
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ItayElizur/mcp-outlook'

If you have feedback or need assistance with the MCP directory API, please join our Discord server