关于 Microsoft 365 Mail
Microsoft 365 Mail 是通过 Microsoft Graph 管理 Outlook 邮件的 MCP 服务,支持邮件、草稿、附件、会话和自动回复设置;主机负责 OAuth,此服务提供该系列的身份验证交接工具。
主要功能
- 01列出、搜索和读取邮件
- 02发送、回复、转发并管理草稿
- 03下载附件并查看邮件会话
- 04移动、删除、标记和设旗邮件
- 05读取和设置自动回复
适用场景
- 01查找近期未读邮件并回复
- 02保存回复草稿以供稍后审阅
- 03将附件下载到工作区
MCP 相关
向 MCP 客户端提供 Microsoft Graph 邮件操作,包括邮件、文件夹、草稿、附件、会话和自动回复。其 `authenticate_microsoft_account` 工具将身份验证交由主机处理;主机为此服务及相关 Microsoft 365 服务写入凭据。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @mindstone/mcp-server-microsoft-mailMS_CLIENT_IDMicrosoft Entra (Azure AD) application client IDMS_CONFIG_DIRPath to the per-user Microsoft config directory (credentials/, accounts.json)MS_ACCOUNT_EMAILAccount email when running in multi-account per-instance mode (falls back to the first account in accounts.json)MS_MCP_PACKAGE_IDLogical package ID surfaced in error responsesMICROSOFT_REQUEST_TIMEOUT_MSOverride the upstream Microsoft Graph request timeout in milliseconds (max 300000 = 5 min)MCP_WORKSPACE_PATHWorkspace root where download_attachment saves files (falls back to the OS temp directory when unset)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
22收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
@mindstone/mcp-server-microsoft-mail
Microsoft 365 Outlook 邮件 MCP 服务——通过 Microsoft Graph API 列出、搜索、读取、发送、回复、转发、草拟、移动和删除邮件,下载附件、读取邮件对话串、整理邮件(标记已读/加旗标),以及管理外出自动回复。
面向群组协作的 Microsoft 365 邮件 MCP。由宿主负责 OAuth 流程,本服务从磁盘读取各账户的令牌;每个工具都会通过结构化的 auth_required 封装在认证失败时拒绝操作,以便宿主引导用户重新认证。
状态
- 版本: 0.3.0 · npm
- 认证: OAuth(由宿主协调)(
MS_CLIENT_ID) - 工具: 22(邮件、文件夹、草稿、附件、邮件对话串、设置)
- 接口类型: cloud-api
- 机器可读:
STATUS.json - 共享库:
@mindstone/mcp-server-microsoft-shared
为什么开发此项目
我们在 2026 年 5 月移植此项目时,Microsoft 自家的 Graph MCP 系列尚未推出独立的 Outlook 邮件服务,当时的社区方案在 OAuth 期间都会自行运行浏览器回调服务;而我们的宿主应用已经会为整个群组协作组完成此流程,并已协商好所需凭据。我们将 MindstoneRebel 中捆绑的连接器单独提取出来,并按原样移植,使同一组 Microsoft 365 五个连接器(邮件、日历、文件、Teams、SharePoint)共用一个 OAuth 接口,以及一个用于令牌持久化、请求超时和结构化 auth_required 封装的共享库包,宿主已能处理该封装并恢复操作。此连接器负责群组协作组的认证工具(authenticate_microsoft_account);其他四个连接器则复用它所协商的凭据。
交互示例
“列出 Alice 发来的最近 5 封未读邮件,并回复最新的一封:‘谢谢,今晚会读。’”
宿主调用的工具:
search_emails—from:[email protected] isRead:false,最多返回 5 封。reply_to_email— 使用结果列表中第一封邮件的 ID 发送回复,并附上提供的正文。
响应(删节):
{
"matches": [
{
"id": "AAMkAD...",
"subject": "Q3 planning",
"from": "[email protected]",
"receivedDateTime": "2026-05-19T09:14:11Z"
}
],
"reply": {
"id": "AAMkAD...",
"isDraft": false
}
}
要求
- Node.js 20+
- npm
- 一个负责执行 Microsoft OAuth 流程,并将各账户令牌文件写入
${MS_CONFIG_DIR}/credentials/${sanitised-email}.token.json、同时维护${MS_CONFIG_DIR}/accounts.json索引的宿主应用。本服务读取这些文件;不会自行发起 OAuth。
一键安装
点击按钮后,宿主将提示你填写:MS_CLIENT_ID、MS_CONFIG_DIR、MS_MCP_PACKAGE_ID、MICROSOFT_REQUEST_TIMEOUT_MS。
Claude Desktop / Claude Code / Goose / Continue.dev 手动配置(Microsoft 365 Mail)
{
"mcpServers": {
"Microsoft 365 Mail": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-microsoft-mail"
],
"env": {
"MS_CLIENT_ID": "",
"MS_CONFIG_DIR": "",
"MS_MCP_PACKAGE_ID": "Microsoft365Mail",
"MICROSOFT_REQUEST_TIMEOUT_MS": "60000"
}
}
}
}
快速入门
安装与构建
cd <path-to-repo>/connectors/microsoft-mail
npm install
npm run build
npx(发布后使用)
npx -y @mindstone/mcp-server-microsoft-mail
本地
node dist/index.js
配置
此服务与负责 Microsoft 365 OAuth 流程的宿主应用一起运行。宿主会将凭据写入磁盘;此服务会读取这些凭据。
必需的环境变量
| 名称 | 描述 |
|---|---|
MS_CLIENT_ID | Microsoft Entra(Azure AD)应用客户端 ID。 |
MS_CONFIG_DIR | 每用户 Microsoft 配置目录的路径(credentials/、accounts.json)。 |
可选环境变量
| 名称 | 描述 | 默认值 |
|---|---|---|
MS_ACCOUNT_EMAIL | 在多账户、每实例模式下运行时的账户邮箱。 | accounts.json 中的第一个账户。 |
MS_MCP_PACKAGE_ID | 错误响应中显示的逻辑包 ID。 | Microsoft365Mail |
MICROSOFT_REQUEST_TIMEOUT_MS | 覆盖 Microsoft Graph 上游请求超时时间(最大 300000 毫秒)。 | 60000 |
MICROSOFT_DISABLE_REFRESH | 设为 1 可在此接口上禁用令牌刷新。工具将以结构化的 auth_required 响应安全失败,以便宿主处理重新认证。云端接口会将此项设为 1。 | 未设置 |
MCP_WORKSPACE_PATH | 工作区根目录,download_attachment 会在此保存文件。 | OS 临时目录 |
宿主配置示例
Claude Desktop / Cursor
{
"mcpServers": {
"Microsoft365Mail": {
"command": "npx",
"args": ["-y", "@mindstone/mcp-server-microsoft-mail"],
"env": {
"MS_CLIENT_ID": "your-entra-application-client-id",
"MS_CONFIG_DIR": "/absolute/path/to/microsoft-config"
}
}
}
}
在宿主写入 ${MS_CONFIG_DIR}/credentials/<account>.token.json 和 ${MS_CONFIG_DIR}/accounts.json 之前,每次工具调用都会返回结构化的 auth_required 响应(宿主的 MCP 服务会识别此格式,并分发给已注册的 Microsoft 365 OAuth 协调器)。
本地开发(无需发布到 npm)
{
"mcpServers": {
"Microsoft365Mail": {
"command": "node",
"args": ["<path-to-repo>/connectors/microsoft-mail/dist/index.js"],
"env": {
"MS_CLIENT_ID": "your-entra-application-client-id",
"MS_CONFIG_DIR": "/absolute/path/to/microsoft-config"
}
}
}
}
工具(22)
| 工具 | 描述 |
|---|---|
authenticate_microsoft_account | 发出结构化的 auth_required 交接信息,以便宿主运行 Microsoft 365 OAuth 流程。 |
list_emails | 列出文件夹中的邮件,按最新时间排序(参见下方的排序说明)。 |
get_email | 按邮件 ID 读取单封邮件。 |
list_attachments | 列出邮件的附件元数据(ID、名称、类型、大小)。 |
download_attachment | 将文件附件保存到工作区(或操作系统临时目录)。 |
send_email | 发送新邮件(支持抄送和密送)。 |
compose_email | 在交互式撰写视图中打开可编辑草稿;用户点击“发送”前不会发送任何内容,点击“保存草稿”则会将其保存到“草稿”文件夹。 |
search_emails | 使用 Microsoft Search 语法搜索邮件。 |
get_conversation | 列出会话串中的邮件,按时间从早到晚排序(参见下方的排序说明)。 |
reply_to_email | 回复现有邮件(或回复所有人)。 |
forward_email | 将邮件转发给其他收件人。 |
delete_email | 将邮件移至“已删除邮件”,或将其彻底删除。 |
list_folders | 列出邮件文件夹。 |
move_email | 将邮件移至其他文件夹。 |
create_reply_draft | 保存对现有邮件的回复草稿。 |
create_draft | 保存一封独立的新邮件草稿(支持抄送和密送)。 |
send_draft | 发送现有草稿。 |
update_draft | 更新草稿的主题、正文、收件人或重要性。 |
mark_email_read | 将邮件标记为已读或未读。 |
set_email_flag | 为邮件添加跟进标记、将其标记为已完成,或清除标记。 |
get_automatic_replies | 读取外出自动回复配置(需要 MailboxSettings.Read)。 |
set_automatic_replies | 开启/关闭外出自动回复,或为其设置计划(需要 MailboxSettings.ReadWrite)。 |
Graph 权限
邮件工具通过委托授权 Mail.ReadWrite + Mail.Send 运行。自动回复工具还需要 MailboxSettings.Read / MailboxSettings.ReadWrite;在许多组织中,这项权限必须由管理员批准。如果连接的账户缺少该权限,工具会返回指导信息封装,而不是原始的 Graph 403 错误。
排序和验证说明
- 筛选列表仅在当前页面内排序。 Microsoft Graph 不允许
$filter与$orderby一起使用,因此当调用list_emails时指定了filter(以及每次调用get_conversation时),连接器只会在客户端对返回的页面排序:Graph 会先应用$top,因此结果是 Graph 返回页面的排序视图,而不是对整个邮箱进行全局排序扫描。未筛选的list_emails仍在服务器端排序。 - 收件人会经过验证。
to/cc/bcc条目必须是电子邮件地址(会去除首尾空格,最多 254 个字符,每个字段最多 500 位收件人);无效条目会在调用 Graph 前被拒绝。 - 计划的外出自动回复时间段必须使用 ISO 8601 日期时间;显式时区偏移量会转换为 UTC(不带时区的值按 UTC 处理),且开始时间必须早于结束时间。
安全说明
- 主机会以
0600模式写入令牌文件;此服务通过 cohort-shared library 读取这些文件,该库遇到格式错误的文件时会默认拒绝操作。 - 云端环境默认设置
MICROSOFT_DISABLE_REFRESH=1,让桌面会话继续作为刷新令牌的唯一授权方,避免争用只能使用一次的刷新令牌。 - 成功的工具响应会移除仅 OSS 使用的
ok:true包装,以匹配捆绑的successResult形状;手动验证或业务错误会返回isError:true,并附带{ ok:false, error, action_required, next_step }负载,以便主机的恢复层采取相应操作。 - 每个工具的 Graph 调用都会通过
.options({signal})和Promise.race包装器,在调用方与 cohort 组合的超时信号下运行,以增强防护。 download_attachment只会在MCP_WORKSPACE_PATH内(未设置时则在 OS 临时目录中)写入文件,会拒绝除普通文件名以外的任何名称,并将下载大小限制为 25 MB。附件字节流通过$value端点传输,并设有硬性字节上限(绝不会在超过上限后将内容完整载入内存);元数据也以流方式传输,并设有硬性 1 MB 上限,原因相同;写入任何内容前,工作区根目录都会被规范化(解析符号链接)。每次下载都会保存到一个直接位于规范化工作区根目录下、以原子方式创建的全新私有暂存目录中(fs.mkdtemp,模式为0700),并且只保留附件文件名;报告的savedTo指向该暂存目录内。由于目录名由连接器生成,因此不存在经验证的、用户可见的路径名可在验证与写入系统调用之间被预先植入、重命名或替换为符号链接;由此从根本上消除了父目录检查后使用的竞态条件,适用于所有平台,无需使用基于文件描述符的相对路径 API。文件本身通过独占打开方式创建(O_CREAT|O_EXCL,模式为0600),因此不可能覆盖现有文件,也不会触碰同名的现有文件或符号链接;写入失败时会删除整个暂存目录,不留任何残留。攻击者控制的附件字段(名称、类型、内容类型)在任何以文本形式出现的位置都会用不可信内容封装,包括错误路径。savedTo必须报告真实文件路径(主机需要该路径才能打开文件),但面向用户的message只会显示连接器生成的暂存目录名称,因此攻击者提供的文件名绝不会作为可信文本回显。- 对于非身份验证失败,错误指引绝不会建议重新进行身份验证:遇到 Graph 403 权限拒绝时,连接器会提供本地指引,说明重新验证同一账户无济于事;上游 Graph 错误文本在传递给模型前会被封装为不可信内容。
许可证
FSL-1.1-MIT — Functional Source License 1.1 版,未来许可证为 MIT。允许用于非竞争性用途;在 LICENSE 中的转换日期后重新许可为 MIT。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。