Skip to main content
Glama

Outlook MCP Server

一个模型上下文协议服务器,将 Claude 连接到 Microsoft Outlook + Teams(电子邮件、日历、联系人、任务、文件、Teams 会议录制 + 转录),部署在 Cloudflare Workers 上。

Fork 此仓库,部署到您自己的 Cloudflare 账户,注册一个 Microsoft Azure AD 应用,将 Claude.ai 指向您的 worker,Claude 即可通过自然语言读写您的 Microsoft 365 数据。

基于 @bashco/mcp-toolkit 构建 — OAuth、每客户端 bearer 令牌、速率限制、结构化日志、类型化工具分发均由共享库处理。

Claude 获得的能力 — 7 个领域的 39 个工具

  • 邮件:列出邮件、阅读邮件、搜索、回复、转发、删除、发送、在文件夹之间移动、创建草稿、更新草稿、发送草稿、计划发送

  • 日历:列出事件、列出事件发生次数、创建、更新、删除、取消事件、响应事件

  • 联系人:列出联系人、创建联系人、更新联系人

  • 任务:列出任务列表、列出任务、创建任务

  • 文件:列出文件、共享文件

  • Teams 会议:列出最近的录制(发现起点 — 查找过去 N 天内有内容的会议,无需输入)、查找在线会议、列出会议录制、列出会议转录、获取转录内容。每个按会议划分的工具都接受 meeting_idcalendar_event_idjoin_url 中的任意一个 — 因此计划会议(通过事件解析)、临时 / 立即开会呼叫(通过从 Teams 聊天粘贴的 join URL 解析)以及直接 ID 查找均可工作。

  • 对话:获取对话(完整线程)

  • 设置:获取邮箱设置、设置外出状态

部署后,完整实时目录位于 tools/list MCP 端点。

Related MCP server: MCP Outlook Server

认证方式

两层:

  1. Claude.ai ↔ 您的 worker — 标准 MCP OAuth 2.0 + PKCE 流程。每个 Claude 客户端获得唯一的 bearer 令牌;您的 MCP_APPROVAL_CODE 是您在 /authorize 粘贴一次以铸造该 bearer 的代码。

  2. 您的 worker ↔ Microsoft Graph — 代理 OAuth。您通过访问已部署 worker 上的 /oauth/start 一次性授权 Microsoft;刷新令牌以加密形式存储在 Cloudflare KV 中。刷新自动进行。

设置 — 部署您自己的副本

先决条件

1. Fork 并克隆

git clone https://github.com/<your-username>/outlook-mcp
cd outlook-mcp
npm install

2. 创建 KV 命名空间

wrangler kv:namespace create OAUTH_KV

Wrangler 会打印类似这样的内容:

🌀 Creating namespace with title "outlook-mcp-OAUTH_KV"
✨ Success! Add the following to your configuration file:
[[kv_namespaces]]
binding = "OAUTH_KV"
id = "abc123def456..."

编辑 wrangler.jsonc,将 kv_namespaces 下现有的 id 替换为 wrangler 刚打印的内容。

wrangler.jsonc 是有意提交的 — Wrangler 和 CI 部署都需要它,而且它不包含任何机密(只有您的 KV 命名空间 id、公共 Azure 客户端 id 和 worker URL)。wrangler.jsonc.example 带有相同的结构,但使用占位符,如果您希望从干净副本开始。真正的机密通过 wrangler secret put 传递,永远不会出现在此文件中。

3. 注册 Microsoft Azure AD 应用

  1. 转到 entra.microsoft.com → Identity → Applications → App registrations → New registration

  2. 名称:任意(例如 "Claude Outlook MCP")

  3. 支持的账户类型

    • 如果您想限制为单个租户,选择 "仅此组织目录中的账户"

    • 选择 "任何组织目录中的账户和个人 Microsoft 账户" 以获得最广泛的支持

  4. 重定向 URI:暂时留空 — 您将在第 6 步之后回来

  5. 点击注册

  6. 从应用的概览页面记录:

    • 应用程序(客户端)ID → 这是您的 MICROSOFT_CLIENT_ID

    • 目录(租户)ID → 这是您的 MICROSOFT_TENANT_ID(或使用字符串 common 以支持多租户 + 个人账户)

  7. API 权限 → 添加以下 Microsoft Graph 委派权限:

    • Mail.ReadWriteMail.Send

    • Calendars.ReadWrite

    • Contacts.ReadWrite

    • Tasks.ReadWrite

    • Files.Read.All(如果您想要可写文件工具,则使用 Files.ReadWrite.All

    • User.Read

    • offline_access(刷新令牌必需)

    • MailboxSettings.ReadWrite

    • Sites.Read.All

    • OnlineMeetings.Read

    • OnlineMeetingRecording.Read.All需要管理员同意

    • OnlineMeetingTranscript.Read.All需要管理员同意

    添加两个 .Read.All 权限后,在 API 权限页面上点击 "为 [租户名称] 授予管理员同意"。没有管理员同意,会议录制 / 转录工具将返回 403。

  8. 证书和机密 → 新建客户端机密 → 记录值(保存在 1Password 中)。这是您的 MICROSOFT_CLIENT_SECRET。您只能看到一次 — 立即复制。

4. 更新 wrangler.jsonc

编辑 wrangler.jsonc 并替换以下两项:

  • vars.MICROSOFT_CLIENT_ID — 使用第 3.6 步的应用程序 ID

  • vars.MICROSOFT_TENANT_ID — 使用第 3.6 步的目录 ID(或 common

5. 设置机密

生成一个新的批准代码:

openssl rand -base64 32

将其存储在密码管理器中,然后推送到 Cloudflare:

wrangler secret put MCP_APPROVAL_CODE          # paste the value from above
wrangler secret put MICROSOFT_CLIENT_SECRET    # from Step 3.8

机密

用途

MCP_APPROVAL_CODE

您在 /authorize 粘贴的一次性代码,用于铸造 Claude bearer。也用作上游 Microsoft 令牌的静态加密密钥 — 轮换它会使存储的令牌失效,并强制重新进行干净的 Microsoft 认证。

MICROSOFT_CLIENT_SECRET

您的 Azure AD 应用的客户端机密。

SIGNATURE_HTML

可选。服务器端附加的电子邮件签名块 — 请参阅 电子邮件签名

SIGNATURE_LOGO_URL

可选。签名徽标的公开可访问 HTTPS URL。

6. 首次部署(以了解 worker URL)

npm run deploy

Wrangler 会打印您的 worker URL — 类似 https://outlook-mcp.<your-account>.workers.dev。保存它。

7. 更新 WORKER_URL 和 Microsoft 重定向 URI

需要两项更新:

a) 编辑 wrangler.jsonc — 在 vars 下,将 WORKER_URL 替换为第 6 步的 URL。

b) 在 Azure AD 应用中(entra.microsoft.com → 您的应用 → 身份验证 → 添加平台 → Web),将重定向 URI 设置为 <your-worker-url>/oauth/callback。没有此设置,Microsoft 将拒绝 OAuth 流程。

然后重新部署:

npm run deploy

8. 连接 Microsoft(一次性)

在浏览器中访问 <your-worker-url>/oauth/start。粘贴您的 MCP_APPROVAL_CODE。您将被重定向到 Microsoft 登录并授予第 3.7 步的范围。同意后,您的加密上游令牌将存入 OAUTH_KV。此后自动刷新。

您可以通过访问 <your-worker-url>/oauth/status 确认连接 — 应显示 connected: true

9. 连接 Claude.ai

  1. 在 Claude.ai 中,转到 设置 → 集成 → 添加 MCP 服务器

  2. 服务器 URL:<your-worker-url>/mcp

  3. Claude.ai 将您重定向到您 worker 的 /authorize 页面

  4. 粘贴您的 MCP_APPROVAL_CODE 并确认

  5. 您已连接 — Claude 现在拥有 38 个 Outlook + Teams 工具可用

电子邮件签名

可选。配置后,Worker 在发送时附加您的签名,因此调用代理永远不必重现它 — 它不能被改写、截断或遗忘。

include_signature: true 传递给 send_emailschedule_sendreply_to_emailforward_emailcreate_draftupdate_draftcreate_reply_draftcreate_reply_all_draftcreate_forward_draft 中的任意一个。它默认为 false,因此现有调用者不受影响。

对于草稿,签名在草稿创建时注入,而不是在发送时 — send_draft 只接受一个 id,从不接触正文。这意味着您发送前审查的是带签名的正文。在 update_draft 上,该标志仅在您同时传递新的 body 时适用(否则没有要签名的内容,并且它会用仅签名的正文替换草稿);这种情况在响应的 notes 中报告,而不是静默清除草稿。

日历邀请

create_calendar_eventupdate_calendar_event 接受相同的 include_signature 标志,将签名附加到事件的描述中。它重用与电子邮件相同的 SIGNATURE_HTML 块 — 包括其营销行动号召按钮 — 因此它更适合面向客户的邀请,而不是内部会议;这就是为什么它是每个事件选择加入的。update_calendar_event 遵循与 update_draft 相同的保护:该标志仅在您同时传递新的 description 时适用。

设置

cp signature-block.example.html signature-block.html   # then edit it
wrangler secret put SIGNATURE_HTML < signature-block.html
wrangler secret put SIGNATURE_LOGO_URL                 # paste your HTTPS logo URL

signature-block.html 有意被 gitignore。签名是部署配置,而不是源代码:继承了已提交签名的 fork 会发送带有他人姓名、电话号码和预订链接的邮件。只有占位符 signature-block.example.html 被提交。

SIGNATURE_HTML 中的 __LOGO_URL__ 令牌在运行时替换为 SIGNATURE_LOGO_URL

徽标必须可通过 HTTPS 公开访问。 邮件客户端从收件人的机器获取它 — 它无法访问您的网络、您的 Worker 的绑定或您持有的任何凭据。私有、经过身份验证或 localhost URL 对所有人都会呈现为损坏的图像。如果 SIGNATURE_LOGO_URL 未设置,则完全删除 <img>,而不是发出损坏的 src

如果 SIGNATURE_HTML 未设置,该标志是静默无操作 — 邮件以无签名方式发送。未配置的部署永远不会出错。

行为

  • 强制 HTML。 纯文本正文中的签名会呈现为可见的原始标记,因此只要设置了该标志,body_type 就会被覆盖为 html。当您显式传递 body_type: "text" 时,覆盖会在工具响应的 notes 中报告,绝不会静默应用。

  • 纯文本正文被转义,然后换行符变为 <br>,因此您的换行在强制 HTML 切换后仍然存在,杂散的 < 字符不会变成标记。

  • 幂等。 如果正文已经带有签名 — 通过 Worker 自己的标记或签名的独特文本识别 — 则不会附加两次。

  • 回复和转发将签名放在引用的原始内容之上,而不是整个线程的底部。

  • 空正文仅发送签名,没有前导空行。

安全说明

签名在调用者的正文被清理之后连接。这是有意且关键的:sanitizeOutboundHtml 会剥离每个 style= 属性(仅属性 XSS 接收器),而签名完全由内联样式构建,因此通过清理器会剥离徽标大小、分隔线和 CTA 按钮。

这两个字符串具有不同的信任级别。正文是代理提供的且不受信任,因此仍然完全清理。签名是通过 wrangler secret put 设置的操作员提供的部署配置 — 任何能设置该机密的人已经可以直接更改 Worker。请参阅 src/signature.ts

本地开发

cp .dev.vars.example .dev.vars   # fill in MCP_APPROVAL_CODE + MICROSOFT_CLIENT_SECRET; .dev.vars is gitignored
npm test                          # 171 tests via vitest with workers pool
npm run typecheck                 # tsc --noEmit
npm run dev                       # wrangler dev — local at http://localhost:8787

端点

  • GET /.well-known/oauth-authorization-server — OAuth 元数据(公开)

  • GET /.well-known/oauth-protected-resource — 资源元数据(公开)

  • GET /authorize — 审批码粘贴页面(公开)

  • POST /approve — 审批码提交(限流)

  • POST /token — OAuth 令牌交换(限流)

  • POST /register — 按 RFC 7591 进行动态客户端注册(限流)

  • GET /oauth/start — 开始 Microsoft OAuth 流程(由 MCP_APPROVAL_CODE 控制)

  • GET /oauth/callback — Microsoft OAuth 重定向目标

  • GET /oauth/status — 检查连接状态(由 MCP_APPROVAL_CODE 控制)

  • POST /mcp — JSON-RPC 工具分发(Bearer 保护,限流)

技术栈

  • Cloudflare Workers (compatibility_date 2025-04-28, nodejs_compat)

  • TypeScript(严格模式)

  • Hono v4

  • Zod v4

  • Vitest 搭配 @cloudflare/vitest-pool-workers(171 个测试)

  • @bashco/mcp-toolkit — 共享的 OAuth/加密/限流/分发基础组件

安全架构要点

  • 两遍 HTML 清理器,对出站邮件预览进行实体规范化

  • SSRF 防护,对出站 HTTP 进行 32 位 IP 规范化

  • Microsoft Graph odata 错误信封解析,用于结构化错误返回

  • 按域划分的工具文件位于 src/tools/ 下(mail、calendar、contacts、tasks、files、meetings、settings),便于审计

持续部署

.github/workflows/deploy.yml 在每次推送到 main 时运行 vitest run,然后部署到 Cloudflare。要在你的 fork 上启用,请设置两个仓库密钥:

贡献

欢迎在 github.com/doublebash/outlook-mcp 提交 Issue 和 PR。

如需修改底层 OAuth/加密/限流代码,工具包位于 github.com/doublebash/mcp-toolkit — 请在那里提交 Issue。

安全

发现漏洞?请不要公开提交 Issue。请在 GitHub 上打开私有安全公告

许可证

MIT — Copyright (c) 2026 Bashar Basheer。

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.

  • Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.

  • Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.

View all MCP Connectors

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/Sidd-doshi/outlook-mcp'

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