mcpField
O
Outlook Assistant

Outlook Assistant

本地服务
littlebearapps.com通信协作393 周前更新

关于 Outlook Assistant

Outlook Assistant 是一个面向 Microsoft Outlook 的 MCP 服务,支持 Outlook.com 个人账户及 Microsoft 365 工作或学校账户。它让 AI 助手在对话中搜索、阅读、起草和发送邮件,管理日历与联系人。该项目内置发送前预览、收件人白名单和只读模式等安全控制。

主要功能

  1. 01邮件搜索、阅读与批量整理
  2. 02发送前预览与收件人白名单
  3. 03草稿创建、回复与转发
  4. 04日历事件查看、创建与管理
  5. 05邮件导出为 EML、Markdown、MBOX 等格式
  6. 06邮件头分析(DKIM、SPF、DMARC)

适用场景

  1. 01在对话中搜索收件箱并起草回复
  2. 02按日期或主题导出邮件线程存档
  3. 03排查钓鱼邮件的邮件头信息
  4. 04通过 AI 助手安排会议并管理日历

MCP 相关

该项目是一个 MCP 服务,向 MCP 客户端暴露 22 个工具,覆盖邮件、日历、联系人、文件夹、规则和设置等操作。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"littlebearapps-outlook-assistant": {
"command": "npx",
"args": [
"-y",
"@littlebearapps/outlook-assistant"
],
"env": {
"OUTLOOK_CLIENT_ID": "<OUTLOOK_CLIENT_ID>",
"OUTLOOK_CLIENT_SECRET": "<OUTLOOK_CLIENT_SECRET>"
}
}
}
}
启动命令npx -y @littlebearapps/outlook-assistant
需要配置的环境变量
OUTLOOK_CLIENT_IDAzure AD application (client) ID. Optional: if it is not set here, supply it at sign-in with the auth tool (action=authenticate clientId=<id>)
OUTLOOK_CLIENT_SECRET密钥Azure AD application client secret value. Only needed for the browser sign-in flow; the default device-code flow doesn't use it

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@littlebearapps/outlook-assistant3.14.1

工具

22

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

参数类型必填说明
forceboolean否即使已完成身份验证,也强制重新进行身份验证(仅适用于 action=authenticate)
actionenum否要执行的操作(默认:status)status | authenticate | device-code-complete | about
methodenum否action=authenticate 的身份验证方式。device-code(默认值):无需身份验证服务器,可远程使用。browser:通过端口 3333 进行传统 OAuth 重定向。device-code | browser
clientIdstring否可选,仅用于 action=authenticate。用户的 Azure Application (client) ID(来自应用注册的 Overview 页面中的 GUID)。保存到 `~/.outlook-assistant-config.json`,此后将一直使用;它不是机密信息。设置后,OUTLOOK_CLIENT_ID 环境变量优先。

详细介绍

Outlook 助手

Outlook 助手

用于 Outlook 邮件、日历和联系人的 MCP 服务 — 让 AI 助手直接在对话中管理你的收件箱。

npm 版本 npm 下载量 CI CodeQL 许可证:MIT Glama 评分

Outlook Assistant 通过 Model Context Protocol 将 AI 助手连接到你的 Microsoft Outlook 帐户。让 AI 助手搜索收件箱、发送邮件、安排会议、管理联系人和配置邮箱设置 — 无需离开对话。兼容 Claude、GitHub Copilot、Cursor、Windsurf 及任何兼容 MCP 的客户端。

适用于个人 Outlook.com 帐户和工作/学校 Microsoft 365 帐户。


Outlook Assistant 演示 — 搜索邮件、阅读邮件并起草回复
搜索收件箱 → 阅读并总结 → 起草回复 — 全程在对话中完成

### 你可以做什么
  • 📨 搜索和阅读邮件 — 按发件人、主题、日期或关键词查找邮件;按对话分组阅读完整邮件串;一次性批量标记、移动、导出或分类多封邮件
  • 🛡️ 在安全控制下发送邮件 — 发送前预览(试运行)、发送前邮件提示(外出自动回复、邮箱已满、投递限制)、会话速率限制,以及收件人许可名单,防止出错
  • ✏️ 起草邮件以供审核 — 创建、更新并发送草稿;以草稿形式回复和转发;保存前使用试运行模式预览
  • 📅 管理日历 — 查看即将举行的活动、回顾过去的活动,或按日期范围和主题查找活动;安排包含与会者的会议,更新、谢绝或取消活动
  • 📦 导出邮件 — 将单封邮件保存为 Markdown、EML、JSON 或 CSV;将完整邮件串导出为 MBOX 或 HTML;一次调用即可批量导出搜索结果
  • 🔍 调查邮件标头 — 完整访问原始标头(DKIM、SPF、DMARC、投递链、X-Mailer、X-Originating-IP),用于钓鱼调查和合规审查
  • 🗂️ 整理收件箱 — 创建嵌套文件夹(可通过路径访问)、设置收件箱规则、使用类别进行颜色标记、管理重点收件箱 — 所有功能协同运作,实现完整的收件箱自动化
  • 🔄 跟踪收件箱变化 — 增量同步可检测自上次检查以来新增、修改和删除的邮件,并提供用于增量轮询的令牌
  • 👥 管理联系人 — 搜索联系人簿和组织目录,创建和更新联系人记录
  • ⚙️ 配置设置 — 设置外出自动回复、工作时间和时区
  • 📬 访问共享邮箱 — 读取和整理团队收件箱及服务账户,包括自定义子文件夹和嵌套文件夹路径;枚举、读取和搜索文件夹树(尽力而为 — 列表会标记因深度限制或单个文件夹错误而跳过的分支),移动、标记或分类邮件,并管理文件夹(工作/学校 Microsoft 365 账户;通过 OUTLOOK_SHARED_MAILBOX 选择启用)。不支持从共享邮箱发送邮件、创建草稿、回复和转发 — 这些操作始终使用已登录用户自己的邮箱
  • 🏢 查找会议室 — 按建筑、楼层、容量、视听设备和轮椅无障碍条件搜索(Microsoft 365)
为什么选择 Outlook Assistant?
不使用 Outlook Assistant使用 Outlook Assistant
在 AI 工具和 Outlook 之间切换以管理邮件直接通过 AI 助手阅读、搜索、发送和导出邮件
手动搜索和导出邮件串使用完整的邮件工具,包括搜索、邮件串整理和批量导出
为管理日历和联系人而频繁切换上下文在同一处管理日历活动、联系人和设置
将邮件内容复制粘贴到对话中AI 助手可原生读取邮件并获得完整上下文
无法通过编程方式访问邮箱规则或类别创建收件箱规则、管理类别、配置自动回复
手动检查每封邮件是否存在钓鱼风险信号一次调用即可进行取证式标头分析 — DKIM、SPF、DMARC、垃圾邮件评分和投递链
通过轮询收件箱检查新邮件增量同步仅返回自上次检查以来的变化,并提供用于持续轮询的令牌

功能

模块工具数可执行的操作
电子邮件8search-emails(列出/搜索/增量查询/对话),read-email(内容 + 取证标头),send-email(支持试运行 + 邮件提示),draft(创建/更新/发送/删除/回复/回复所有人/转发),update-email(已读状态、标记),attachments,export,get-mail-tips
日历3list-events(默认列出即将发生的事件;支持 startAfter/startBefore/subject 筛选),create-event,manage-event(更新/拒绝/取消/删除)
联系人2manage-contact(列出/搜索/获取/创建/更新/删除),search-people
类别3manage-category(增删改查),apply-category,manage-focused-inbox
设置1mailbox-settings(获取/设置自动回复/设置工作时间)
文件夹1folders(列出/创建/移动/统计/删除)——可通过路径(Parent/Child)或 ID 指定嵌套文件夹
规则1manage-rules(列出/创建/更新/重新排序/删除)
高级2access-shared-mailbox(邮件或文件夹树),find-meeting-rooms
身份验证1auth(状态/身份验证/完成设备代码验证/关于)

总计 22 个工具——整合自 55 个工具,以实现最佳 AI 性能。完整参数详情请参阅工具参考。

导出格式

格式支持因 target 而异:

格式扩展名target=message(单个)target=messages(批量)target=conversation(对话串)
mime / eml.eml✅–✅
mbox.mbox––✅
markdown.md✅✅✅
json.json✅✅✅
html.html––✅
csv.csv✅✅✅

可导出单封电子邮件、搜索结果或整个对话串——使用 target=messages 搭配搜索查询(或 query 快捷参数),即可批量导出,无需手动收集 ID。

账户兼容性

Outlook Assistant 适用于个人和工作/学校 Microsoft 账户,但部分功能的行为有所不同:

功能个人账户(Outlook.com)工作/学校账户(Microsoft 365)
读取、发送和搜索电子邮件完全支持完全支持
日历事件完全支持完全支持
联系人增删改查完全支持完全支持
收件箱规则完全支持完全支持
文件夹完全支持完全支持
自由文本 query 搜索有限支持——渐进式回退;subject、from、to 筛选更直接完全支持 $search
类别完全支持完全支持
邮箱设置完全支持完全支持
重点收件箱API 可用(存储的设置会被覆盖),但不影响邮件路由完全支持
共享邮箱不可用需选择启用(OUTLOOK_SHARED_MAILBOX)。仅支持读取和整理。读取:Mail.Read.Shared;整理(移动/分类/标记/创建文件夹):Mail.ReadWrite.Shared。不支持发送/草稿/回复/转发
会议室搜索不可用需要 Place.Read.All 和管理员同意

注意:在个人账户上,Microsoft 的 $search API 对自由文本查询的支持有限。Outlook Assistant 会自动使用渐进式搜索——如果查询没有返回结果,它会依次回退到 OData 筛选器、布尔筛选器和近期邮件列表,以查找邮件。要在个人账户上获得最直接的结果,请使用结构化筛选参数(from、subject、to、receivedAfter)。

有何不同
  • 渐进式搜索 — 对于 Microsoft $search API 受限的帐户,Outlook Assistant 会自动依次尝试最多 4 种搜索策略来查找邮件,并通过 _meta.searchMetadata 报告哪种策略找到了结果,同时列出无法遵循的筛选条件(droppedFilters)。大多数 Graph API 封装程序会静默失败;而这个工具会灵活调整并告知你。
  • 邮件取证 — 可访问 DKIM、SPF、DMARC、投递链、X-Mailer、X-Originating-IP 和垃圾邮件评分等原始标头。返回完整数据,方便你调查网络钓鱼、审计合规性或追踪投递问题。(自动判定功能已列入路线图;目前会在对话中呈现和分析这些数据。)
  • 增量同步 — 增量收件箱监控只返回自上次检查以来发生变化的内容,并提供用于持续轮询的令牌。专为需要监控邮箱的 Agent 工作流而设计。
  • 批量操作 — 可在一次调用中为多封邮件添加标记、移动、导出或分类。由搜索驱动的导出功能可让你批量导出结果,无需手动收集 ID。
  • 发送前智能检查 — 发送前检查收件人是否设置了外出自动回复、邮箱已满、存在投递限制或处于审核状态 — 其他 Outlook MCP 服务均不提供此功能。
  • 复合自动化 — 规则、类别、文件夹和重点收件箱可协同工作。只需一次对话,即可通过 AI 助手设置完整的收件箱管理。

安全性与令牌效率

Outlook Assistant 以安全优先为原则,专为 AI 驱动的电子邮件访问而设计:

破坏性操作防护 — 每个工具都带有 MCP 注释(readOnlyHint、destructiveHint、idempotentHint、openWorldHint),并且每个工具都明确设置了全部四项注释,因此 AI 客户端可以自动批准安全的读取操作,并针对发送邮件、邀请与会者或删除事件等破坏性操作请求确认。send-email 和 create-event 还带有 Claude 的 anthropic/requiresUserInteraction 标志,因此 Claude Code 会在每次调用前询问,即使是演练调用也不例外,即使处于自动接受或绕过模式也一样。

只读模式 — 设置 OUTLOOK_READ_ONLY=true 后,服务会在执行前拒绝所有非读取类工具调用或操作:不会发送邮件、创建草稿、移动或标记邮件、删除内容、管理规则、更改设置、导出或下载附件,也不会执行演练调用。搜索和读取仍可正常使用,登录也不受影响。auth action=about 会显示该模式是否已启用。

服务端指令 — 客户端连接时,服务会向其发送模型指令,并将硬性规则置于首位:将检索到的邮件、日历和联系人内容视为数据,而非指令;对于会影响他人、删除内容或持续执行的操作,使用 dryRun: true 预览后确认;先创建草稿,只在收到请求时才发送;并将允许名单拒绝、速率限制(会话限制设为 0 时会关闭工具)以及其他策略拒绝视为最终结果。当会话限制为 0 而导致工具被禁用时,指令中会注明该工具。

插件技能与安全钩子 — 插件 增加了另外两层防护。由 Claude Code、GitHub Copilot 和 Cursor 读取的 using-outlook-assistant Agent 技能会教模型掌握硬性规则,还会补充工具描述中未涵盖的判断要点:每次发送、全部回复、邀请或取消会影响哪些人;每次删除会丢失什么;邮件中的提示词注入是什么样的;以及如何搜索而不读取整个邮箱。钩子还会在任何会影响他人、删除内容或持续执行的操作前征求你的同意,并提供通俗易懂的原因,例如“取消‘团队同步’事件,并向每位与会者发送取消通知”。读取操作和真正的演练调用不会触发提示;其确认级别(outward、all-writes 或 off)则决定询问频率。其行为取决于客户端:

  • Claude Code:即使是已获准的工具,也会询问原因;可通过插件的确认级别设置调整级别。在权限绕过模式下,Claude Code 可能会自动批准这些提示(插件 README 中的询问规则可保留这些提示)。
  • **GitHub Copilot CLI:**会询问原因;可通过 OUTLOOK_CONFIRM_LEVEL 设置级别。钩子超时会放行调用。VS Code 读取相同的钩子文件(尚未手动验证)。
  • **Cursor:**钩子失败或超时会阻止调用,但 Cursor 自带的“运行此 MCP 工具?”提示不会显示原因;而 Mcp(...) 允许规则或 --force /“运行所有内容”模式会在不询问的情况下运行调用。
  • **其他客户端:**没有钩子;服务端的检查、注释和说明仍然适用。

详情请参阅支持的客户端及其限制。

试运行预览(dryRun: true)——查看调用会执行什么操作,而不会更改或发送任何内容:send-email、draft 创建、create-event(将邀请哪些人,并统计外部地址数量)、manage-event 更新/拒绝/取消/删除(将向哪些人发送邮件)、mailbox-settings 设置自动回复(每条回复的接收对象及发送时间)、manage-rules 创建/更新,以及 folders 删除和 manage-contact 删除(将丢失哪些内容)。其他任何调用若设置 dryRun: true,都会在运行前被拒绝,因此预览绝不会实际发送、删除或更改任何内容。

发送邮件保护——send-email 工具包含:

  • 发送前邮件提示(checkRecipients: true)——检查收件人是否设置了外出自动回复、邮箱已满或存在投递限制。如果提示显示上述任一情况、收件人是外部联系人,或群组中包含外部成员,则发送会被拒绝,并列出警告;查看警告后,可通过 acknowledgeWarnings: true 重试。检查失败也会阻止发送。邮件提示仅适用于 Microsoft 365:个人帐户不会返回提示
  • 试运行模式(dryRun: true)——预览已撰写的邮件,但不发送
  • 会话速率限制——可通过 OUTLOOK_MAX_EMAILS_PER_SESSION 配置(默认:无限制;0 会阻止发送邮件和其他受速率限制的工具)
  • 收件人允许列表——通过 OUTLOOK_ALLOWED_RECIPIENTS 将收件人限制为获准的地址/域。适用于 send-email、draft(创建、更新、转发、回复、回复所有人和发送)、规则转发/重定向(若规则会转发或重定向到被阻止的地址,则整个规则都会被拒绝)、create-event 参与者和 manage-event 更新参与者;不适用于 manage-event 取消/拒绝消息、组织者删除事件时发送的取消通知,或 mailbox-settings 自动回复。启用后,任何不是单个纯电子邮件地址的内容都会被拒绝

推荐设置:从一开始就在 .mcp.json 中启用这两道安全防线。默认情况下它们处于关闭状态;auth action=about 会报告其状态,并在未设置时显示设置提示。可参阅 .mcp.json.example 中可直接复制粘贴的模板。

"env": {
  "OUTLOOK_CLIENT_ID": "…",
  "OUTLOOK_MAX_EMAILS_PER_SESSION": "10",
  "OUTLOOK_ALLOWED_RECIPIENTS": "your-domain.com,[email protected]"
}

输入和文件加固——包含 . 或 .. 路径段的 ID 会在发出任何请求前被拒绝;续页链接(deltaToken)必须指向 graph.microsoft.com;附件下载和导出只能写入系统临时目录、~/Downloads、~/Documents 或 OUTLOOK_EXPORT_DIR(绝不会写入点号开头的名称),并使用经过净化的文件名,不会覆盖现有文件或跟随符号链接。路径必须是绝对路径(或以 ~/ 开头)。只有传入 overwrite: true 时,才会替换显式指定的 export 文件路径;如果该路径是符号链接,则绝不会替换。创建的文件仅对你可读(0600;新文件夹为 0700)。 草稿防护 — draft 工具与 send-email 共享安全控制:试运行预览(create)、邮件提示验证、速率限制和收件人允许列表。允许列表会在创建、更新和转发时进行检查;如果回复或回复所有人草稿的收件人不在允许列表中,该草稿会被删除;send 还会重新检查草稿当前的收件人、抄送和密送,因此在 Outlook 中编辑过的草稿也无法绕过检查。send 操作与 send-email 共用速率限制计数器,防止通过先创建草稿再发送的途径规避限制,因此 OUTLOOK_MAX_SEND_EMAIL_PER_SESSION=0 会同时阻止这两种操作。被允许列表拒绝或无法创建的回复或回复所有人草稿,不会占用 draft 的会话限制名额。update、send 和 delete 会拒绝任何并非未发送草稿的 ID,因此收到或已发送的邮件绝不会被编辑、删除或再次发送。

令牌优化架构 — 工具采用 STRAP(单一工具、资源、操作模式)方法进行整合。工具数量从 55 个减至 22 个,每轮可减少约 11,000 个令牌(约 64%)的开销,从而为实际对话保留更多 AI 上下文窗口。工具数量减少还有助于 AI 更准确地选择合适的工具——研究表明,工具数量超过约 40 个后,选择准确度会下降。

重要:这些防护措施采用纵深防御策略,可降低风险,但不能保证不会发生意外操作。AI 访问你的邮件本身就很敏感——批准前务必检查工具调用,尤其是发送和删除操作。没有任何自动防护措施能做到万无一失,你仍需对通过邮箱执行的操作负责。

快速开始

1. 安装
npm install -g @littlebearapps/outlook-assistant

或者无需安装,直接运行:

npx @littlebearapps/outlook-assistant

若要检查当前版本或查看可用选项:

outlook-assistant --version     # prints e.g. 3.14.1
outlook-assistant --help        # usage, options and key environment variables

不带任何参数时,服务会通过 stdio 使用 Model Context Protocol。通常由 MCP 客户端启动,而不是手动运行——如果从终端启动,它只会等待标准输入。

2. 注册 Azure 应用

你需要注册 Microsoft Azure 应用以进行身份验证。详细步骤(包括首次创建 Azure 帐户)请参阅 Azure 设置指南;如果你之前已经完成过设置:

  1. 在 portal.azure.com 创建新的应用注册
  2. 添加 Microsoft Graph 委派权限(邮件、日历、联系人)
  3. (仅限浏览器流程) 创建客户端密码并复制 Value(而非 Secret ID)。默认的设备代码登录不需要客户端密码
  4. 在“Authentication”> “Add a platform” > “Mobile and desktop applications” 下,勾选 nativeclient URI
  5. 在“Authentication”>“Advanced settings”中启用 “Allow public client flows”
  6. (可选) 将重定向 URI 设为 http://localhost:3333/auth/callback——仅浏览器身份验证流程需要
3. 配置 MCP 客户端

客户端支持。 每个 MCP 客户端都会受到服务自身检查的保护。该插件为 Claude Code、GitHub Copilot 和 Cursor 添加了 using-outlook-assistant 技能和安全钩子,但各自的限制不同。请参阅支持的客户端及其限制。

安装插件。 该插件(plugins/outlook-assistant)捆绑了固定到确切版本的服务、技能和安全钩子。它同时遵循 Claude Code 插件格式和 GitHub Copilot 使用的 Agent Plugins 格式,并提供 Cursor 清单(.cursor-plugin/)。

  • Claude Code。 启用插件时,系统会提示你设置以下选项(客户端 ID、登录受众、每个会话的发送限额、允许的收件人、只读模式和确认级别):

    claude plugin marketplace add littlebearapps/outlook-assistant
    claude plugin install outlook-assistant@littlebearapps
    
  • GitHub Copilot CLI。 Copilot 没有插件设置,因此首次登录时请提供客户端 ID,并使用 OUTLOOK_CONFIRM_LEVEL 环境变量设置钩子的确认级别:

    copilot plugin marketplace add littlebearapps/outlook-assistant
    copilot plugin install outlook-assistant@littlebearapps
    

    VS Code 的 Copilot Agent 会读取相同的插件和钩子文件;目前尚未手动验证。

  • Cursor(v3.14.0 或更高版本)。Cursor 会将该文件夹作为 Cursor 插件(.cursor-plugin/plugin.json)加载。在 Cursor CLI 中,可从本仓库的克隆目录运行 cursor-agent --plugin-dir outlook-assistant/plugins/outlook-assistant 来加载插件。首次登录时请提供客户端 ID。v3.13.0 插件无法从 Cursor 登录(AADSTS900023);请改用下方的手动配置。

手动配置。 可用于 Claude Desktop、Codex CLI、Gemini CLI、Windsurf 和其他 MCP 客户端,也可替代插件使用(此时不会获得钩子)。将配置添加到 MCP 客户端配置中。默认使用设备代码登录时,只需要 OUTLOOK_CLIENT_ID;仅在使用浏览器流程时才添加 OUTLOOK_CLIENT_SECRET。你也可以不设置客户端 ID,而是在首次连接时提供给助手(auth action=authenticate clientId=…),系统会将其保存到 ~/.outlook-assistant-config.json。环境中的 OUTLOOK_CLIENT_ID 始终具有优先权。

Claude Desktop(claude_desktop_config.json)
{
  "mcpServers": {
    "outlook": {
      "command": "npx",
      "args": ["@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id"
      }
    }
  }
}
Claude Code(CLI)
claude mcp add outlook \
  -e OUTLOOK_CLIENT_ID=your-application-client-id \
  -- npx -y @littlebearapps/outlook-assistant

MCP 服务会从客户端传递给它的环境中读取设置;它不会加载 .env 文件。

VS Code / GitHub Copilot(.vscode/mcp.json)

服务首次启动时,VS Code 会提示输入客户端 ID,并将其安全保存:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "outlook-client-id",
      "description": "Azure application (client) ID"
    }
  ],
  "servers": {
    "outlook": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "${input:outlook-client-id}"
      }
    }
  }
}

在 Copilot Chat 中使用 Agent 模式即可使用。若要在所有工作区中使用,请将相同条目添加到用户级 mcp.json 中(命令面板 → MCP: Open User Configuration)。

Cursor(.cursor/mcp.json)

在 Cursor 中安装

或者手动添加到 .cursor/mcp.json:

{
  "mcpServers": {
    "outlook": {
      "command": "npx",
      "args": ["@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id"
      }
    }
  }
}
Windsurf(~/.codeium/windsurf/mcp_config.json)
{
  "mcpServers": {
    "outlook": {
      "command": "npx",
      "args": ["@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id"
      }
    }
  }
}
### 4. 身份验证
  1. 请 AI 助手连接到 Outlook——它会调用 auth 工具并设置 action=authenticate,然后返回一段短代码和 URL microsoft.com/devicelogin
  2. 在任意设备上打开该 URL(使用隐私浏览窗口可避免使用缓存的会话),输入代码、登录并授予权限
  3. 告诉助手你已完成——它会调用 auth 并设置 action=device-code-complete
  4. 令牌会保存在本地并自动刷新

此默认设备代码流程无需身份验证服务。如果你更想使用浏览器重定向流程,请参阅下文的身份验证流程。

安装

前置条件
  • Node.js 18.18.0 或更高版本(贡献者:开发工具需要 22.22.1 或更高版本)
  • npm(随 Node.js 一同提供)
  • Azure 账户,用于注册应用(免费层级即可使用)
从 npm 安装(推荐)
npm install -g @littlebearapps/outlook-assistant
从源代码安装
git clone https://github.com/littlebearapps/outlook-assistant.git
cd outlook-assistant
npm install
CLI 选项
选项作用
-v、--version将版本输出到 stdout 并以状态码 0 退出
-h、--help输出用法、选项和关键环境变量,并以状态码 0 退出
(none)通过 stdio 启动 MCP 服务——常规模式,由 MCP 客户端调用

遇到无法识别的参数时,会将错误输出到 stderr 并以状态码 1 退出,而不是启动一个会忽略该参数的服务。

Azure 应用注册

第一次使用 Azure? Azure 设置指南涵盖了从创建账户到首次身份验证的全部内容,包括账单设置和常见问题。

创建应用
  1. 打开 Azure 门户
  2. 使用 Microsoft 工作或个人账户登录
  3. 搜索 应用注册,然后点击 新注册
  4. 输入名称(例如 “Outlook Assistant Server”)
  5. 选择 任何组织目录中的账户和个人 Microsoft 账户
  6. 设置重定向 URI:平台选择 Web,URI 为 http://localhost:3333/auth/callback
  7. 点击 注册
  8. 复制 应用程序(客户端)ID
添加权限
  1. 前往 API 权限 > 添加权限 > Microsoft Graph > 委托的权限
  2. 添加以下必需权限:
    • offline_access — 在不同会话之间刷新令牌
    • User.Read — 基本个人资料
    • Mail.Read、Mail.ReadWrite、Mail.Send — 电子邮件操作
    • Calendars.Read、Calendars.ReadWrite — 日历操作
    • Contacts.Read、Contacts.ReadWrite — 联系人管理
    • MailboxSettings.ReadWrite — 设置、自动回复、类别
    • People.Read — 人员搜索
  3. 可选添加仅限组织的权限(仅适用于工作或学校账户):
    • Mail.Read.Shared — 读取共享邮箱(仅当 OUTLOOK_SHARED_MAILBOX=read 或 =true 时请求)
    • Mail.ReadWrite.Shared — 写入共享邮箱(移动、分类、标记、标记为已读;仅当 OUTLOOK_SHARED_MAILBOX=true 时请求)
    • Place.Read.All — 搜索会议室(需要管理员同意)
  4. 点击 添加权限
创建客户端密码

仅浏览器重定向流程需要此项。使用默认设备代码登录时可跳过。

  1. 前往 证书和密码 > 新建客户端密码
  2. 输入说明并选择有效期
  3. 点击 添加
  4. 立即复制密码值——之后将无法再次查看。请使用值,而非密码 ID。

配置

环境变量

在 MCP 客户端的 "env" 块中设置这些变量(参见快速入门)。MCP 服务不会加载 .env 文件;浏览器流程的身份验证服务(npm run auth-server)会加载,因此从源代码运行时,也可以为其保留一个 .env 文件:

cp .env.example .env

使用 Azure 凭据进行编辑:

OUTLOOK_CLIENT_ID=your-application-client-id
OUTLOOK_CLIENT_SECRET=your-client-secret-VALUE
USE_TEST_MODE=false

注意: 为向后兼容,服务也接受 MS_CLIENT_ID 和 MS_CLIENT_SECRET。 可选覆盖项(v3.8.0+)— 完整列表和带注释的示例请参阅 .env.example:

变量用途默认值
OUTLOOK_AUTH_AUDIENCEOAuth 受众:common、consumers(仅限个人账户的 Azure 应用)、organizations 或单租户 GUID。可解决仅限个人账户的应用注册所遇到的 AADSTS9002331。common
OUTLOOK_DEFAULT_TIMEZONE调用方未指定时,应用于日历事件的 IANA 时区(例如 Europe/London、America/New_York)。Australia/Melbourne
OUTLOOK_MAX_EMAILS_PER_SESSION每个受速率限制工具的默认单次会话上限;各工具分别计数,直到服务重启:send-email(包括 draft action=send)、draft 创建/更新/回复/全部回复/转发、manage-rules 和 create-event。可用 OUTLOOK_MAX_<TOOL>_PER_SESSION 覆盖单个工具,例如 OUTLOOK_MAX_SEND_EMAIL_PER_SESSION。未设置或为空表示不设上限;0 会禁用该工具(v3.14.1 之前,0 表示不设上限),非整数值也会禁用该工具。不设上限
OUTLOOK_ALLOWED_RECIPIENTS以逗号分隔的允许名单,列出可用于发送邮件、草稿、规则转发和日历邀请(create-event 和 manage-event 更新参会者)的域名/地址。不适用于取消/拒绝消息或自动回复。不限
OUTLOOK_SHARED_MAILBOX可选启用共享邮箱支持(仅限工作/学校账户)。read 会请求 Mail.Read.Shared;true(或 readwrite/1)还会请求 Mail.ReadWrite.Shared。未设置时,登录方式不变。启用后,重启并运行 auth action=authenticate force=true。未设置(关闭)
OUTLOOK_SEARCH_SCAN_LIMIT客户端搜索回退机制扫描的近期邮件数量。个人账户会在此范围内本地匹配 to,因此默认值限制了 to 搜索可回溯的范围。最大值为 5000。500
OUTLOOK_REQUEST_TIMEOUT_MS每次 Graph 请求尝试的不活动超时时间,单位为毫秒:如果在此时间内未收到数据,该次尝试将以超时错误中止。这不是总时限,因此持续收到数据的慢速响应不会被中止。遇到限流(429)和繁忙(503/504)响应时会自动重试,并遵循 Retry-After。60000
OUTLOOK_READ_ONLY只读模式:true(或 1/yes/on)会在运行前拒绝所有非读取类工具调用或操作,包括试运行、导出和附件下载。仍可登录。无法识别的值也会启用此模式,并发出警告。更改后需重启服务。关闭
OUTLOOK_DEBUG详细的 stderr 日志:true(或 1/yes/on)会记录搜索策略、主题、文件夹名称和 Graph 错误正文,并对电子邮件地址和较长的 ID 脱敏。关闭时,每次工具调用记录一行日志(工具、操作、结果、耗时),且不会记录参数。绝不会记录令牌、设备代码和密钥。请参阅 服务日志和调试日志。关闭
OUTLOOK_EXPORT_DIRexport 和 attachments 下载可写入的额外文件夹。未设置时,文件只能写入系统临时目录、~/Downloads 或 ~/Documents;其他路径会被拒绝。需使用绝对路径(开头的 ~ 会展开)。未设置

OUTLOOK_CONFIRM_LEVEL(outward、all-writes 或 off;默认值为 outward)不是服务设置:在没有插件设置的客户端(GitHub Copilot、VS Code、Cursor)中,插件的安全钩子会读取此变量。请在启动客户端时所用的环境中设置,而不是在服务的 env 块中设置。在 Claude Code 中,请使用插件的确认级别设置。请参阅支持的客户端及其限制。

MCP 客户端配置

有关插件安装以及 Claude Desktop、Claude Code、VS Code / GitHub Copilot、Cursor 和 Windsurf 的配置,请参阅上文的快速入门 — 配置 MCP 客户端。

如果从源代码安装,请使用 node 而不是 npx:

{
  "mcpServers": {
    "outlook": {
      "command": "node",
      "args": ["/path/to/outlook-assistant/index.js"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id"
      }
    }
  }
}

身份验证流程

设备代码流程(默认 — 推荐)

无需身份验证服务器。在任何环境中都可使用,包括远程/无头环境。

  1. 请 AI 助手进行身份验证(调用 auth 工具,并设置 action=authenticate)
  2. 使用任意浏览器和任意设备访问显示的网址(microsoft.com/devicelogin)
  3. 输入代码,使用 Microsoft 帐户登录并授予权限
  4. 告诉 AI 助手完成身份验证(调用 auth,并设置 action=device-code-complete)
  5. 令牌会保存到 ~/.outlook-assistant-tokens.json,并且会自动刷新

前提条件:在 Azure Portal > 你的应用 > Authentication > Advanced settings 中启用“Allow public client flows”。

服务器重启(v3.7.2+):设备代码状态会持久化到 ~/.outlook-assistant-pending-auth.json,因此即使 MCP 服务在步骤 1 和 4 之间重启,device-code-complete 仍可正常工作(例如,Untether/Telegram bridge 或 Claude Desktop 会话发生变化时)。

浏览器重定向流程(替代方案)

适用于本地开发,或偏好传统 OAuth 流程的情况。启动身份验证服务器。从源代码检出目录运行:

npm run auth-server

从全局 npm 安装运行:

node "$(npm root -g)/@littlebearapps/outlook-assistant/outlook-auth-server.js"

这会在端口 3333 上启动本地服务器,用于处理 OAuth 回调。(outlook-assistant 命令本身只接受 --version 和 --help;使用任何其他参数都会报错退出。)

  1. 在 AI 助手中,使用 auth 工具并设置 action=authenticate, method=browser
  2. 在浏览器中打开提供的网址
  3. 登录并授予权限 — 令牌会自动保存

注意:身份验证服务器会从环境变量,或从启动该服务器的目录中的 .env 文件读取 OUTLOOK_CLIENT_ID 和 OUTLOOK_CLIENT_SECRET。MCP 客户端的 "env" 配置仅适用于 MCP 服务进程,不适用于单独启动的身份验证服务器。

共享邮箱:浏览器流程会直接请求已配置的作用域,不会尝试回退。如果启用了 OUTLOOK_SHARED_MAILBOX,请使用设备代码流程登录。

目录结构

outlook-assistant/
├── index.js                 # Entry point: CLI flags, stdio transport
├── server.js                # MCP server factory (capabilities, request handler)
├── tools.js                 # Tool registry (22 tools)
├── request-handler.js       # Routes MCP requests; JSON-RPC errors for unknown methods/tools
├── config.js                # Configuration settings
├── outlook-auth-server.js   # OAuth server (port 3333)
├── auth/                    # Authentication module (1 tool)
├── email/                   # Email module (8 tools)
│   ├── mail-tips.js         # Pre-send recipient validation
│   ├── headers.js           # Email header retrieval
│   ├── mime.js              # Raw MIME/EML content
│   ├── conversations.js     # Thread listing/export
│   ├── attachments.js       # Attachment operations
│   └── ...
├── calendar/                # Calendar module (3 tools)
│   ├── attendees.js         # Attendee builder (email or {email, type})
│   └── list.js              # list-events filters
├── contacts/                # Contacts module (2 tools)
├── categories/              # Categories module (3 tools)
├── settings/                # Settings module (1 tool)
├── folder/                  # Folder module (1 tool; resolve.js resolves paths/IDs)
├── rules/                   # Rules module (1 tool)
├── advanced/                # Advanced module (2 tools)
└── utils/
    ├── graph-api.js         # Microsoft Graph API client (includes $batch, path guards)
    ├── mailbox.js           # me vs users/{sharedMailbox} prefix, shared-mailbox opt-in
    ├── risk-classes.js      # Risk class per tool/action; derives annotations and titles
    ├── tool-error.js        # isError tool results with a next step
    ├── safety.js            # Rate limiting, recipient allowlist, dry-run
    ├── safe-write.js        # Exclusive, folder-confined file writes
    ├── datetime.js          # ISO 8601 parsing and timezone conversion
    ├── odata-helpers.js     # OData query building
    ├── field-presets.js     # Token-efficient field selections
    ├── response-formatter.js # Verbosity levels
    └── mock-data.js         # Test mode data

故障排除

“Cannot find module '@modelcontextprotocol/sdk/server/index.js'”
npm install
“EADDRINUSE: address already in use :::3333”
npx kill-port 3333
npm run auth-server
“Invalid client secret” (AADSTS7000215)

你使用的是机密ID,而不是机密值。前往 Azure Portal > Certificates & secrets,并将 Value 列中的值复制到 OUTLOOK_CLIENT_SECRET。

机密值只会在创建时显示一次 — 如果你已离开该页面,就无法再次查看,因此请创建新的机密。已过期的机密也会产生相同错误,因此也请检查 Expires 列。

从 v3.11.0 起,服务器会检测此错误,并在 Microsoft 返回的原始消息后附加说明,因此你会同时看到原始错误代码和解决方法。

身份验证网址无法使用

如果使用浏览器流程:请先使用 npm run auth-server 启动身份验证服务器。如果使用设备代码流程:请改为访问 microsoft.com/devicelogin。

设备代码“invalid_client”

在 Azure Portal > App registrations > Authentication > Advanced settings 中启用“Allow public client flows”。

设备代码身份验证约 60 分钟后令牌刷新失败

已在 v3.7.2 中修复。较早版本会在设备代码身份验证的令牌刷新请求中发送 client_secret,而 Microsoft 会拒绝公有客户端流程中的此类请求。请升级到 v3.7.2+,或重新进行身份验证。

“需要身份验证。”

你已退出登录,或已保存的令牌已过期且无法刷新。错误信息会说明下一步该怎么做:使用 auth 工具并设置 action=authenticate 登录(添加 force=true 可替换现有会话),然后重试调用。auth action=status 可显示当前状态。

开发

运行测试
npm test                     # Jest unit tests
npm run inspect              # MCP Inspector (interactive)
测试模式

使用模拟数据运行(不调用真实 API):

USE_TEST_MODE=true npm start
扩展服务
  1. 创建新的模块目录(例如 tasks/)
  2. 在单独的文件中实现工具处理程序
  3. 从模块的 index.js 导出工具定义
  4. 将模块的工具添加到 tools.js 中的 TOOLS 数组
  5. 在 utils/risk-classes.js 中为每个工具和操作分类(任何未分类项都会导致测试失败);注释和标题均取自此处
  6. 在 test/ 中添加测试
  7. 更新 docs/quickrefs/tools-reference.md

文档

指南描述
入门指南安装、配置和身份验证——从这里开始
支持的客户端各客户端的安装方式、技能和安全钩子的作用,以及已知限制
Azure 设置指南创建 Azure 帐户、注册应用、设置权限和机密
操作指南30 篇有关电子邮件、日历、联系人和设置的实用指南
路线图当前里程碑(v3.14.1、v3.15.0、v4.0.0、v3.8.x、v3.16.0+)和近期发布
故障排除已知错误及其修复方法,包括身份验证、搜索、导出和共享邮箱问题
常见问题安装、帐户、权限、令牌、更新、卸载
工具参考全部 22 个工具及其参数
AI Agent 指南AI Agent 的工具选择和工作流模式

完整文档:docs/

已知限制

  • 个人账户搜索:自由文本 query 和原始 searchExpression(以前称为 kqlQuery)依赖 Microsoft 的 $search API,该 API 对个人 Outlook.com 账户的支持有限。query 通过渐进式回退(OData 筛选器、布尔筛选器,然后是客户端扫描)缓解了这一问题。在这类账户上,带字段范围的 $search(例如 subject:"…")会被直接拒绝;从 v3.10.0 起,from:/to:/subject: 表达式会被转换为最接近的 OData 筛选器并重试,但布尔运算符、分组、通配符和其他字段前缀不会转换——这些仍会明确返回无结果,而不会静默扩大搜索范围。结构化筛选器(from、subject、to、receivedAfter)仍是最直接的方式。跨文件夹搜索(searchAllFolders: true)返回的结果范围大于仅搜索收件箱。请注意,在这类账户上,query 和 searchExpression 不能互换使用:searchExpression 会传递给 $search,匹配包括正文在内的整封邮件,并按相关性而非日期排序;而 query 会回退为主题子串匹配,且不会读取正文。
  • 个人账户中 to 搜索的深度:服务端收件人筛选器会被拒绝,因此会在最近的 500 封邮件中进行本地匹配(OUTLOOK_SEARCH_SCAN_LIMIT,最多 5000 封)。对于大型邮件存档,这会排除较早的邮件——请将 to 与 receivedAfter/receivedBefore 配合使用。从 v3.11.1 起,只要扫描结果被截断,响应就会说明这一点,无论是否匹配到邮件。
  • 重点收件箱:仅适用于工作/学校 Microsoft 365 账户。
  • 共享邮箱:需要工作/学校账户,并且必须主动启用:设置 OUTLOOK_SHARED_MAILBOX=read(读取)或 =true(读取和整理),重启服务,然后使用 auth action=authenticate force=true 重新进行身份验证。在此之前,sharedMailbox 调用会被拒绝,并提供设置指引(access-shared-mailbox 仍保持原有的已知文件夹行为)。auth action=about 会显示是否实际授予了共享邮箱相关的权限。支持范围仅限读取和整理。读取需要 Mail.Read.Shared;整理(通过 sharedMailbox 移动/分类/标记/标记为已读/创建文件夹)需要 Mail.ReadWrite.Shared——请在 Azure 中添加此权限并重新进行身份验证(在此之前,针对共享邮箱的写入操作会失败并返回 403;绝不会回退到你自己的邮箱)。支持自定义子文件夹——将 folder 设置为显示名称或嵌套路径(例如 Inbox/Vendors/Acme)、原始 folderId,或使用 listFolders: true(或 folders action=list, sharedMailbox: …)查找文件夹。不支持通过共享邮箱发送邮件、创建草稿、回复和转发——send-email 和 draft(包括回复/回复所有人/转发)始终操作已登录用户自己的邮箱,且不会请求 Mail.Send.Shared。
  • 会议室搜索:需要 Place.Read.All 权限及管理员同意(仅限工作/学校账户)。
  • 导出默认路径:导出内容和附件下载默认保存到系统临时目录(批量 export 且 target=messages 时需要提供 outputDir)。请将 outputDir(或 savePath)设为绝对路径(或以 ~/ 开头的路径),且路径必须位于系统临时目录、~/Downloads、~/Documents 或 OUTLOOK_EXPORT_DIR 中;相对路径和其他文件夹会被拒绝。只有设置 overwrite: true 时,才会替换已有的 savePath 文件。
  • list-events 日期筛选器:startAfter/startBefore 必须包含 Z 或 ±hh:mm 偏移;不带时区的值和仅包含日期的值会被拒绝,而不会被擅自推断。

参与贡献

欢迎贡献!请参阅 CONTRIBUTING.md 了解指南。

安全

有关安全问题,请参阅我们的 Security Policy。请勿针对漏洞公开创建问题。

更新日志

请参阅 CHANGELOG.md 查看版本历史。

关于

由 Little Bear Apps 构建并维护。Outlook Assistant 基于 MIT License 开源。

评论

支持 Markdown

第一次接触 MCP?

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

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