OAuthSecurityMCPTutorial

AI 邮箱访问该用 OAuth 还是 API 密钥?该怎么选

AI 邮箱访问选 OAuth 还是 API 密钥:claude.ai、Claude Desktop、Cursor 用 OAuth;Cline、JetBrains 和脚本用受限 API 密钥。

连接 AI 智能体到邮箱时的 OAuth 与 API 密钥对比 — MCPEmails

当你通过 MCP Emails 把 AI 智能体连接到邮箱时,有两种认证方式可选:OAuth 或 API 密钥。简短的答案是:如果你的客户端支持 OAuth(claude.ai、Claude Desktop、Cursor),就用 OAuth;如果不支持(Cline、JetBrains、脚本、cURL),就用受限的 API 密钥。两者访问的是同一个端点,暴露的是同一套工具。区别在于由谁来管理这个密钥,以及你能多容易地随时断开它。

这并不是一个用安全换便利、必须牺牲其中一方的权衡。两条路径都被严格限定在 read:emailsend:email 或两者之内,而且都能在仪表盘上一键撤销。真正的问题是哪一种更适合你实际在用的客户端。想了解这一切如何连成一体的全貌,可以先看支柱指南:如何让你的 AI 智能体访问邮箱

30 秒速选建议

当你的 MCP 客户端支持时,用 OAuth。目前这涵盖了 claude.ai、Claude Desktop 和 Cursor。你粘贴一个 URL、登录、批准权限范围,就完成了。没有密钥要复制,没有密钥要保存,也没有密钥会泄露。

当你的客户端没有 OAuth 流程时,用 API 密钥。Cline、JetBrains 的 AI 助手、一个 Python 定时任务、一段把 JSON-RPC 通过 cURL 传出去的 shell 脚本——这些都需要一个 bearer 令牌。你在仪表盘里创建一个,设定它的权限范围,复制一次,然后放进 Authorization 请求头里传递。

如果同一个客户端两种方式都可选,那就选 OAuth。配置文件里的密钥越少越好,这永远是更稳妥的默认选择。

OAuth 在这里是怎么工作的

OAuth 是免密钥的那条路。不是由你生成一个凭据再把它粘贴到某处,而是客户端和服务器直接协商出一个,令牌就存在客户端内部,而不是放在一个由你管理的配置文件里。

在 claude.ai 里,流程是:Customize → Connectors → Add connector → 粘贴 URL → Connect → 登录并批准。 这个 URL 就是 MCP 端点 https://mcpemails.com/api/mcp。批准之后,智能体就获得了访问权限,而你自始至终没碰过任何密钥。

在底层,它用的是标准、当下通行的 OAuth:

  • Authorization Code + PKCE(RFC 7636),因此从不会传输任何 client secret。PKCE 正是保护移动端和单页应用登录的同一套机制。
  • Dynamic Client Registration(RFC 7591),因此客户端会自行注册,你这边无需任何手动设置。
  • 令牌会自动刷新,在受支持的客户端内部完成。你不用盯着过期时间操心。
  • 权限范围就是你在同意页上批准的那些read:emailsend:email,或两者。

实际的好处是:令牌永远不会以一个明文字符串的形式出现,也就不会被你意外提交、记录到日志,或粘贴进错误的对话里。当你想切断访问时,在仪表盘里撤销这个连接,智能体立刻就被挡在门外。至于这种撤销为什么真的重要——邮箱本身始终保持原样,因为在我们这边邮件从不被存储

API 密钥在这里是怎么工作的

有些客户端不会说 OAuth。这并不是在贬低它们。Cline、JetBrains,以及任何你自己写的东西,都只是期待一个 bearer 令牌——这是更老、但完全没问题的机器认证方式。

你在 Dashboard → API Keys 里创建一个:

  1. 给密钥起一个日后你能认出来的名字(cline-laptoptriage-cron)。
  2. 选择它的权限范围:read:emailsend:email,或两者。
  3. 复制它。它只会显示一次,之后再也不显示。如果丢了,就重新创建一个。

密钥长得像 mcpe_live_AbCdEfGhIjKlMnOpQrStUvWxYz123456,你在每次请求时都要带上它:

Authorization: Bearer mcpe_live_AbCdEfGhIjKlMnOpQrStUvWxYz123456

一个用来列出你收件箱的原始 JSON-RPC 调用长这样:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "inbox_list", "arguments": {} }
}

把它 POST 到 https://mcpemails.com/api/mcp 并带上 bearer 请求头,你就会收到已连接的收件箱及其 ID。从这里开始,智能体会调用 email_readaction 设为 list、read 或 search)和 email_composeaction 为 send、reply 或 forward)——核心工具,外加 email_organizefolderschedulecontact_search 用于标记、文件夹、定时和联系人。

API 密钥要求你做、而 OAuth 不要求的唯一一件事:把密钥当成密码来对待。它是一个明文形式的长期密钥。把它放进环境变量,而不是放进你会推送到 GitHub 的源码里。如果某个密钥泄露了,在仪表盘里撤销它,再轮换成一个新的。

权限范围:每一次都只授予最小权限

这部分对两种方式都是一样的,而且它是出力最多的那项安全控制。一个只能 read:email 的连接发不出任何东西,无论智能体决定要做什么。如果你正在搭建一个汇总与分拣的工作流,那就授予只读权限。智能体读取、排序、汇报,一个被搞糊涂或被操纵的模型没有任何途径把消息发出去。

只有当发送确实是这项工作本身时,才加上 send:email,比如一个基于 MCP 工具搭建的自动回复器。即便如此,也要按任务分别设定独立的密钥或连接,而不是一个到处复用、无所不能的凭据。最小权限不是疑神疑鬼。它是你能买到的最便宜的保险。

那到底该用哪个?

用 OAuth,如果……

你的客户端是 claude.ai、Claude Desktop 或 Cursor。你希望配置里没有任何密钥。你希望令牌刷新由它替你处理。你希望撤销这件事尽可能干净利落。这是默认选项,你应该首先伸手去拿它。

用 API 密钥,如果……

你的客户端不支持 OAuth——Cline、JetBrains、OpenAI 风格的工具运行器,或者你自己的代码。你正在用 cURL 或一个小程序对着端点写脚本。你需要一个稳定的凭据,好让一个无人值守的进程在没有人去点同意页的情况下也能用。受限的密钥在这里恰到好处,而且有一份针对 Cursor、Cline 和 VS Code 客户端的完整操作指南。

还有一件事无论你选哪个都成立:速率限制。每个 API 密钥的上限是 100 requests/minute、1,000/hour 和 10,000/day,每个工作区还按套餐有一个突发上限(Free 为 60/min,Team 最高 1,000/min)。当你触及限制时,服务器会返回一个以秒为单位的 retry_after 值。请遵守它,而且绝不要盲目重试 email_compose 发送——那样你会重复发送。

结论

OAuth 和 API 密钥并不是一个安全性的高下排名。它们是与你的客户端的匹配。OAuth 是更好的默认选项,因为它把密钥完全从你手里拿走;但对于那些确实需要密钥的客户端和脚本来说,一个权限受限、妥善保存的 API 密钥同样是真正安全的。仔细挑选权限范围,把密钥存进环境变量,撤销掉任何你不再使用的东西。

准备好接上一个了吗?连接一个收件箱和一个客户端大约两分钟就能从头到尾搞定,或者你也可以阅读完整的文档免费开始

Asgeir Albretsen
作者
Asgeir Albretsen

Asgeir builds MCPEmails — the bridge that lets AI agents read, search, and send real email over the Model Context Protocol. He writes about agents, email infrastructure, and developer experience.

@mcpemails

为你的智能体接入收件箱

几分钟内将 Gmail、Fastmail 或任意 IMAP 账户连接到你的 AI 智能体。