mcpField
M
Microsoft 365 Mail

Microsoft 365 Mail

本地服务
github.com/mindstone通信协作13今天更新

关于 Microsoft 365 Mail

Microsoft 365 Mail 是通过 Microsoft Graph 管理 Outlook 邮件的 MCP 服务,支持邮件、草稿、附件、会话和自动回复设置;主机负责 OAuth,此服务提供该系列的身份验证交接工具。

主要功能

  1. 01列出、搜索和读取邮件
  2. 02发送、回复、转发并管理草稿
  3. 03下载附件并查看邮件会话
  4. 04移动、删除、标记和设旗邮件
  5. 05读取和设置自动回复

适用场景

  1. 01查找近期未读邮件并回复
  2. 02保存回复草稿以供稍后审阅
  3. 03将附件下载到工作区

MCP 相关

向 MCP 客户端提供 Microsoft Graph 邮件操作,包括邮件、文件夹、草稿、附件、会话和自动回复。其 `authenticate_microsoft_account` 工具将身份验证交由主机处理;主机为此服务及相关 Microsoft 365 服务写入凭据。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mindstone-mcp-server-microsoft-mail": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-microsoft-mail"
],
"env": {
"MS_CLIENT_ID": "<MS_CLIENT_ID>",
"MS_CONFIG_DIR": "<MS_CONFIG_DIR>",
"MS_ACCOUNT_EMAIL": "<MS_ACCOUNT_EMAIL>",
"MS_MCP_PACKAGE_ID": "<MS_MCP_PACKAGE_ID>",
"MICROSOFT_REQUEST_TIMEOUT_MS": "<MICROSOFT_REQUEST_TIMEOUT_MS>",
"MCP_WORKSPACE_PATH": "<MCP_WORKSPACE_PATH>"
}
}
}
}
启动命令npx -y @mindstone/mcp-server-microsoft-mail
需要配置的环境变量
MS_CLIENT_IDMicrosoft Entra (Azure AD) application client ID
MS_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 responses
MICROSOFT_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@mindstone/mcp-server-microsoft-mail0.3.0

工具

22

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

@mindstone/mcp-server-microsoft-mail

npm version License: FSL-1.1-MIT

Microsoft 365 Outlook 邮件 MCP 服务——通过 Microsoft Graph API 列出、搜索、读取、发送、回复、转发、草拟、移动和删除邮件,下载附件、读取邮件对话串、整理邮件(标记已读/加旗标),以及管理外出自动回复。

面向群组协作的 Microsoft 365 邮件 MCP。由宿主负责 OAuth 流程,本服务从磁盘读取各账户的令牌;每个工具都会通过结构化的 auth_required 封装在认证失败时拒绝操作,以便宿主引导用户重新认证。

状态

为什么开发此项目

我们在 2026 年 5 月移植此项目时,Microsoft 自家的 Graph MCP 系列尚未推出独立的 Outlook 邮件服务,当时的社区方案在 OAuth 期间都会自行运行浏览器回调服务;而我们的宿主应用已经会为整个群组协作组完成此流程,并已协商好所需凭据。我们将 MindstoneRebel 中捆绑的连接器单独提取出来,并按原样移植,使同一组 Microsoft 365 五个连接器(邮件、日历、文件、Teams、SharePoint)共用一个 OAuth 接口,以及一个用于令牌持久化、请求超时和结构化 auth_required 封装的共享库包,宿主已能处理该封装并恢复操作。此连接器负责群组协作组的认证工具(authenticate_microsoft_account);其他四个连接器则复用它所协商的凭据。

交互示例

“列出 Alice 发来的最近 5 封未读邮件,并回复最新的一封:‘谢谢,今晚会读。’”

宿主调用的工具:

  1. search_emails — from:[email protected] isRead:false,最多返回 5 封。
  2. 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。

一键安装

添加到 Cursor 添加到 VS Code 添加到 VS Code Insiders

点击按钮后,宿主将提示你填写: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_IDMicrosoft 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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。