关于 EWS Meeting MCP
EWS Meeting MCP 是面向使用本地部署 Exchange EWS 的团队的 MCP 服务,为编码 Agent 和桌面 Agent 提供受控的邮件与日历操作。会议变更须先预览并经明确确认,并支持本地凭据管理和审计记录。
主要功能
- 01只读收件箱邮件
- 02查询日历空闲时间并发现会议室
- 03按工作时段和会议室政策推荐时段
- 04预览并确认会议变更
- 05仅向配置的邮箱发送报告
- 06凭据保留本地并记录写入审计
适用场景
- 01结合会议室空闲情况安排会议
- 02查看指定的 Outlook 收件箱邮件
- 03经确认创建、更新或取消会议
- 04向账户邮箱发送带幂等保护的报告
MCP 相关
向 MCP 客户端提供 EWS 邮件、日历、会议室和会议生命周期工具。会议写入须先预览并提供匹配的确认 ID;凭据保留在本地。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y ews-meeting-mcpEWS_ENDPOINTExchange EWS endpoint, for example https://mail.company.com/EWS/Exchange.asmxEWS_EMAILMailbox email address used as the meeting organizer.EWS_USERNAMEExchange login username, often DOMAIN\username for NTLM.EWS_PASSWORD密钥Exchange password. Prefer macOS Keychain variables when possible.EWS_PASSWORD_KEYCHAIN_SERVICE密钥Optional macOS Keychain service name for reading the password locally.EWS_PASSWORD_KEYCHAIN_ACCOUNT密钥Optional macOS Keychain account. Defaults to EWS_USERNAME when omitted.EWS_AUTH_TYPE密钥Exchange auth type. Usually NTLM for on-prem Exchange.EWS_TIMEZONEIANA timezone for calendar operations.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
EWS Meeting MCP
用于安全读取 Outlook 收件箱邮件、仅向自己发送报告,以及在本地部署的 Exchange EWS 上安排会议的 MCP 服务。
EWS Meeting MCP 为编码助手和桌面 Agent 提供安全、结构化的方式,用于读取 Outlook 收件箱邮件和可用时间、仅向配置的邮箱发送报告、查找会议室、推荐会议时段,以及在明确的人工确认步骤后创建、更新或取消会议。
它面向将日历访问视为敏感基础设施的企业:受监管团队、内部网络、安全审核严格的组织、使用旧版 Exchange 的部署,以及无法直接授予云端 Agent 广泛 Microsoft 365 权限的组织。凭据保留在本地;写入会议前会先预览;仅向自己发送报告时必须启用幂等保护;每项写入操作都可通过本地审计记录追踪。
npx ews-meeting-mcp
为什么要构建它
许多团队仍通过本地部署的 Exchange/EWS 运行日历基础设施。通用 Agent 可以推理日程安排,但不应获取原始密码、猜测与会者地址,也不应在没有可审核检查点的情况下发送日历邀请。
这不是通用的 Outlook 封装,也不是以 Microsoft Graph 为优先的日历连接器。它专为要求更严格的企业场景设计:本地 EWS 访问、会议室资源、明确的人工审批、防止重复发送,以及便于审计的会议生命周期工具。
此项目通过精简的 MCP 接口封装 Exchange 日历操作,提供:
- 考虑会议室的日程安排:查找与会者可用时间的重叠时段,并通过 Exchange 发现机制或本地策略筛选会议室。
- 人在回路中的写入操作:创建、更新和取消操作都需要预览,以及匹配的
confirmation_id。 - Outlook 显示为:通过
show_as: "out_of_office"(EWSOOF)创建或更新个人约会。与会者和会议室列表为空时,不会发送邀请;此操作不会配置电子邮件自动回复。 - 本地优先的凭据处理:从
.env、Shell 环境变量或 macOS Keychain 读取凭据,不会将密码传递给模型。 - 结构化恢复:设置失败时会返回机器可读的错误代码和面向用户的设置命令。
- 可审计性:生命周期预览、已确认的操作、重复确认、进行中状态和结构化错误都会写入本地 JSONL 审计日志。
- 适用于 Agent 的说明:MCP 服务会提供工具说明和初始化指南;代码库还为支持技能的 Agent 提供了配套技能。
Agent 可执行的操作
| 能力 | 工具 | 安全措施 |
|---|---|---|
| 检查设置和凭据 | ews_setup_check、ews_keychain_status | 绝不返回 EWS 密码 |
| 设置会议签名 | ews_signature_setup_guide | 返回可复制的 HTML 示例和本地环境配置指南 |
| 读取 Outlook 收件箱 | ews_search_emails、ews_read_email | 只读;不会将邮件标记为已读,也不会更改邮箱状态 |
| 向自己发送周报 | ews_send_email_to_self | 仅发送至 EWS_EMAIL;收件人不是输入项;需要稳定的幂等键,以及实际的 EWS CreateItem + SendItem |
| 查看日历空闲情况 | ews_list_calendar、ews_get_free_busy、ews_find_calendar_events | 只读 |
| 查找人员和会议室 | ews_resolve_attendees、ews_list_rooms | 如有可用的 Exchange 目录,则使用该目录 |
| 推荐时段 | ews_suggest_slots | 根据本地工作日、避开时段和会议室容量进行筛选 |
| 创建会议 | ews_create_meeting_preview、ews_create_meeting_confirmed | 支持可选的每周重复;需要先预览、获得明确批准,并提供匹配的确认 ID |
| 更新会议 | ews_update_meeting_preview、ews_update_meeting_confirmed | 需要准确的 EWS 项目元数据和匹配的确认 ID |
| 取消会议 | ews_cancel_meeting_preview、ews_cancel_meeting_confirmed | 需要准确的 EWS 项目元数据和匹配的确认 ID |
| 验证和审计 | ews_verify_meeting、ews_get_audit_log | 确认服务端状态,但不暴露凭据 |
文档
- 使用指南:本地设置、Keychain、日程安排策略、冒烟测试、CLI 示例、MCP 配置和 npm 包装器详情。
- Agent 指南:工具约定、设置检查、参会者解析、会议室选择、预览-确认流程、审计日志和验证规则。
- 发布:npm 包和 GitHub Actions 发布检查清单。
快速开始
1. 配置 EWS
在工作目录中创建 .env 文件,或提供等效的环境变量:
EWS_ENDPOINT=https://mail.company.com/EWS/Exchange.asmx
[email protected]
EWS_USERNAME='DOMAIN\your_user'
EWS_AUTH_TYPE=NTLM
EWS_TIMEZONE=Asia/Taipei
只有在 IT 确认已启用 Basic 身份验证且端点受 HTTPS 保护时,才使用 EWS_AUTH_TYPE=BASIC。
2. 存储密码
对于本地开发,可以使用通用的 ACCOUNT_PASSWORD 覆盖项,但不要将其放入 MCP 配置中:
ACCOUNT_PASSWORD='your-password'
在 macOS 上,使用 Keychain 比将密码存储在 .env 或 MCP 客户端配置中更安全:
read -rsp "Account password: " ACCOUNT_PASSWORD
echo
security add-generic-password -U -s ews-meeting-mcp-account-password -a 'DOMAIN\your_user' -w "$ACCOUNT_PASSWORD"
unset ACCOUNT_PASSWORD
任何需要此帐户密码的本地工具,都可以使用相同的 Keychain 服务/帐户组合:
ACCOUNT_PASSWORD_KEYCHAIN_SERVICE=ews-meeting-mcp-account-password
ACCOUNT_PASSWORD_KEYCHAIN_ACCOUNT='DOMAIN\your_user'
如果省略 ACCOUNT_PASSWORD_KEYCHAIN_ACCOUNT,则使用 EWS_USERNAME。ACCOUNT_PASSWORD 只是通用的本地覆盖项;建议优先使用 Keychain。
3. 添加 MCP 服务
对于通过 npm 安装的 MCP 客户端:
{
"mcpServers": {
"ews-meeting-mcp": {
"command": "npx",
"args": ["-y", "[email protected]"],
"env": {
"EWS_ENDPOINT": "https://mail.company.com/EWS/Exchange.asmx",
"EWS_EMAIL": "[email protected]",
"EWS_USERNAME": "DOMAIN\\your_user",
"ACCOUNT_PASSWORD_KEYCHAIN_SERVICE": "ews-meeting-mcp-account-password",
"ACCOUNT_PASSWORD_KEYCHAIN_ACCOUNT": "DOMAIN\\your_user",
"EWS_AUTH_TYPE": "NTLM",
"EWS_TIMEZONE": "Asia/Taipei"
}
}
}
}
对于本地检出版本:
{
"mcpServers": {
"ews-meeting-mcp": {
"command": "/path/to/ews-meeting-mcp/.venv/bin/python",
"args": ["-m", "ews_meeting_mcp.mcp_server"],
"cwd": "/path/to/ews-meeting-mcp",
"env": {
"PYTHONPATH": "src"
}
}
}
}
可选:添加 Outlook 风格的签名
默认情况下,会议邀请会附加已配置的 HTML 签名。让 MCP 工具提供可复制的初始模板:
ews_signature_setup_guide
将返回的 sample_html 保存为 MCP 工作目录中的 ews-meeting-signature.html,然后编辑姓名、电子邮件、职位、徽标 URL 和免责声明。你也可以指定其他文件:
EWS_MEETING_SIGNATURE_HTML_PATH=/path/to/ews-meeting-signature.html
EWS_MEETING_SIGNATURE_ENABLED=true
使用收件人可访问的 HTTPS 徽标 URL,或将 <img> 的源替换为 base64 数据 URI。设置 EWS_MEETING_SIGNATURE_ENABLED=false 可暂时停止附加签名。
4. 验证设置
npx ews-meeting-mcp --cli env
npx ews-meeting-mcp --cli probe
第一条命令会显示配置的端点和帐户,但不会显示密码。第二条命令会验证该帐户能否连接到 EWS。
Agent 工作流
对于收到的 Outlook 邮件,请先搜索已配置的收件箱,再阅读选中的邮件:
user asks about company email
-> ews_setup_check
-> ews_search_emails with the narrowest known filters
-> user selects or identifies one message
-> ews_read_email with the exact id and optional changekey
这些邮箱工具仅支持只读操作。它们不会将邮件标记为已读、发送邮件、移动邮件或更改标签。
对于每周四的 Jira 周报自动化,请根据 Jira 查询结果撰写报告,然后通过此 EWS MCP 调用专用的仅发送给自己的邮件工具:
weekly report is ready
-> ews_setup_check
-> ews_send_email_to_self with subject, body, and a stable idempotency_key
-> stop after sent=true; do not use Gmail, to: me, or another mail provider
ews_send_email_to_self 不接受收件人、to、cc 或 bcc 参数。它会从 EWS_EMAIL 获取唯一收件人,通过 Exchange EWS 发送邮件,并默认附加已配置的 HTML 签名。它不会将邮件正文或收件人地址写入审计日志。自动化重试时请复用同一个幂等键;对于已完成或正在进行的键,不会再次调用 Exchange。
日程安排应遵循以下形式:
user request
-> ews_setup_check
-> ews_signature_setup_guide, if the user needs help creating the optional HTML signature
-> ews_resolve_attendees, if names or aliases are provided
-> ews_list_rooms, if a room may be needed
-> ews_suggest_slots
-> user chooses a slot and room
-> ews_create_meeting_preview
-> show exact invite details, recurrence if present, and confirmation_id
-> user explicitly confirms
-> ews_create_meeting_confirmed with confirm=true and the same confirmation_id
-> ews_verify_meeting, when item id and changekey are available
创建重复会议时,预览和确认创建调用都必须传入结构化的 recurrence 对象。例如,“每周一和周三”使用每周重复:
{
"type": "weekly",
"interval": 1,
"weekdays": ["MO", "WE"],
"range": {
"type": "numbered",
"count": 10
}
}
“每个工作日,直到 7/26”指周一至周五,不处理节假日或补班日:
{
"type": "weekly",
"interval": 1,
"weekdays": ["MO", "TU", "WE", "TH", "FR"],
"range": {
"type": "end_date",
"end_date": "2026-07-26"
}
}
如果用户只提出工作日重复安排(例如“每周一和周三”),但未提供结束日期、发生次数或明确选择无限期重复,请在预览前询问其中一项。
更改现有会议时,应使用准确的日历元数据:
user asks to update or cancel a meeting
-> ews_find_calendar_events with the narrowest known time window
-> user chooses one exact event, if more than one candidate exists
-> ews_update_meeting_preview or ews_cancel_meeting_preview
-> show current/proposed details, warnings, and confirmation_id
-> user explicitly confirms
-> matching confirmed tool with confirm=true and the same confirmation_id
如果可能存在多个候选项,Agent 绝不能根据主题文本推断具体事件。
安全模型
EWS Meeting MCP 遵循一条简单规则:读取操作可以自动执行,每项写入操作都必须经过严格的安全校验。收件箱读取仅限明确的只读搜索和读取工具;会议写入必须先预览并获得明确确认,而仅发送给自己的周报邮件则必须强制使用已配置的本人地址并启用幂等保护。
- 身份验证失败时会立即终止:EWS 客户端使用
FailFast,遇到一次无效凭据或账户锁定响应后,MCP 会阻止该进程后续的所有 EWS 调用。请修复共享 Keychain 项并重启 MCP,然后再重试。 - 如果未传入
confirm=true,确认创建、更新和取消工具会拒绝执行。 - 确认工具要求使用对应预览返回的准确
confirmation_id。 - 确认更新和取消工具还要求提供来自
ews_find_calendar_events或先前已验证结果的准确 EWSid和changekey。 - 重复的确认请求会返回
error_code: "duplicate_confirmation"及先前结果的元数据,而不会再次调用 EWS。 - 正在处理的确认请求会返回
error_code: "confirmation_in_progress",不应盲目重试。 - 预览工具绝不会保存、移动或删除 Exchange 数据,也不会发送 Exchange 通知。
ews_send_email_to_self是唯一具有邮件写入能力的工具。它仅支持发送给本人,要求配置EWS_EMAIL,并通过 EWSCreateItem创建已保存的草稿,再通过SendItem发送;它不接受任意收件人。- 仅发送给本人的邮件必须使用稳定且非机密的
idempotency_key。重复或正在处理的键会在再次发送 EWS 邮件前被拒绝。如果无法确定邮件是否送达,请在重试前检查“已发送邮件”。 - 仅发送给本人的邮件审计条目只包含操作状态和非敏感的投递/幂等元数据;不会包含已配置的电子邮件地址、主题、正文、密码或令牌。
- 本地确认记录和审计日志存储的是操作元数据,不存储 EWS 密码。
如果 ews_setup_check 返回 ready: false,Agent 应原样显示返回的 user_message 或 setup_command,然后停止。不得询问与会者的电子邮件地址,也不得将继续安排日程作为变通方案。
日程安排策略
默认情况下,日程安排工具会在当前工作目录中查找 ews-meeting-policy.json。设置 EWS_MEETING_POLICY_FILE 可指定其他文件。
如果不存在策略文件,则使用内置默认值:
- 工作日:
10:00至18:00 - 避开时段:
12:00-14:00 - 备用会议室:
2-11、2-13、2-14、3-1、3-2、3-4
如果可用,实时会议室选择会使用 Exchange 会议室列表发现功能,然后回退到已配置的会议室。
策略示例:
{
"workday_start": "10:00",
"workday_end": "18:00",
"avoid": ["12:00-14:00"],
"rooms": [
{
"alias": "3-1",
"name": "3-1 Meeting Room(12P)",
"email": "[email protected]",
"capacity": 12
}
]
}
策略中的会议室会按 alias 与默认备用会议室合并。匹配的别名会覆盖默认会议室,新的别名则会追加。
CLI 用法
默认情况下,npm 封装程序会启动 MCP 服务:
npx ews-meeting-mcp
传入 --cli,即可通过同一个程序包运行 Python CLI:
npx ews-meeting-mcp --cli env
npx ews-meeting-mcp --cli calendar --days 7
建议一个 30 分钟的会议时段:
npx ews-meeting-mcp --cli suggest \
--attendee [email protected] \
--attendee [email protected] \
--start 2026-06-15T09:00:00+08:00 \
--end 2026-06-19T18:00:00+08:00 \
--duration-minutes 30 \
--limit 5
预览会议邀请,但不发送任何内容:
npx ews-meeting-mcp --cli create-meeting \
--attendee [email protected] \
--attendee [email protected] \
--start 2026-06-15T11:00:00+08:00 \
--end 2026-06-15T11:30:00+08:00 \
--subject "Project sync" \
--body "Discuss next steps" \
--location "Webex"
实际创建会议并发送邀请:
npx ews-meeting-mcp --cli create-meeting \
--attendee [email protected] \
--attendee [email protected] \
--start 2026-06-15T11:00:00+08:00 \
--end 2026-06-15T11:30:00+08:00 \
--subject "Project sync" \
--body "Discuss next steps" \
--location "Webex" \
--confirm
--confirm 标志是有意设为必需项的。若不使用该标志,命令会打印试运行预览,且不会调用 EWS 创建事件。
日历显示为 / 不在办公室
创建和更新预览/确认 MCP 工具接受可选参数 show_as:
show_as | EWS LegacyFreeBusyStatus |
|---|---|
free | Free |
tentative | Tentative |
busy | Busy |
out_of_office | OOF |
创建时省略此参数会保留现有的 Busy 默认值;更新时省略此参数会保留已存储的状态。个人约会使用 attendees: [] 和 rooms: [],并以 SendToNone 保存。现有的、包含与会者或资源的会议会保留其邀请行为。创建每周重复会议时也可指定 show_as;重复会议编辑功能保持不变。
例如,调用 ews_create_meeting_preview:
{
"subject": "不在辦公室",
"attendees": [],
"rooms": [],
"start": "2026-09-21T09:00:00+08:00",
"end": "2026-09-21T18:00:00+08:00",
"show_as": "out_of_office",
"include_signature": false
}
向用户展示开始/结束时间、时区偏移、show_as 和邀请行为。获得明确确认后,使用相同参数以及 confirm: true 和返回的 confirmation_id 调用 ews_create_meeting_confirmed。预览后更改状态会使该确认失效。查询/验证工具会返回已存储的 show_as 和原始 legacy_free_busy_status;保存后使用 ews_verify_meeting 读取服务端数据。
请参阅日历状态用法、MCP 更新步骤和实时验证,了解更新示例和手动验证检查清单。此功能仅影响日历状态,不影响邮件自动回复。
本地开发
有关详细设置、冒烟测试、CLI 示例和 MCP 客户端配置,请参阅用法指南。
简短的开发循环如下:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
npm test
从代码检出目录运行 MCP 服务:
env PYTHONPATH=src python -m ews_meeting_mcp.mcp_server
配套 Skill
仓库包含一个配套 Skill,供支持 Skill 的 Agent 使用:
skills/ews-meeting-mcp/SKILL.md
如需查看以纯 Markdown 编写的相同工作流,请参阅 Agent 指南。
故障排除
运维故障排除内容请参阅用法指南。有关 Agent 行为、设置检查处理和生命周期安全,请参阅 Agent 指南。
发布
请参阅发布说明。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。