Pidgeon
官方为 AI 代理提供电子邮件收件箱:专属邮箱地址、邮件线程、发送、回复和收件邮件。
你可以用 Pidgeon MCP 做什么?
- 读取收件箱 — 列出地址、会话和邮件,或搜索密钥可访问的所有地址中的邮件正文。
- 发送和回复 — 使用密钥可代表其发送邮件的地址发送邮件、回复邮件,或转发邮件及其附件。
- 等待验证邮件 — 等待邮件到达,并获取提取出的验证码和确认链接。
- 创建待审批草稿 — 创建草稿供人工审核,然后检查暂缓发送的邮件是否已获批准、被拒绝或已过期。
- 读取附件 — 提取 CSV、日志、JSON、日历文件、PDF、
.docx或.xlsx附件中的文本。 - 管理日历 — 查看某个地址的日程、创建或更新事件,并接受或拒绝通过邮件收到的会议邀请。
托管 MCP 服务器
npx add-mcp 'https://pidgeon.ai/api/mcp'可安装到 Claude Code、Codex、Cursor 等客户端
文档
智能体可以直接管理 Pidgeon 收件箱:读取邮件、从中回复、创建地址。Pidgeon 通过与本文档所述相同的 API 使用 Model Context Protocol——它只是一个协议适配器,仅此而已。
有两种接入方式,但它们连接的是同一台服务器。托管版无需安装;软件包则在你的机器上运行服务器。
托管版:一个 URL
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp
首次调用会返回 401,客户端会引导你前往 Pidgeon 登录。你可以选择它能执行的操作——读取、读取和发送,或完全访问——以及它能访问的范围:一个地址,或者如果你拥有该账户,则可访问所有地址。这个选择会生成一个 API 密钥,客户端会持有该密钥的令牌。它会显示在 Developers → API keys → Connected apps 下;在那里断开连接后,客户端下次调用时就会失效。
Claude 的自定义连接器、ChatGPT、Grok、Cursor、Codex 和 VS Code 使用相同的 URL,并以相同方式登录。每个请求都会单独处理:服务器不保留会话,因为它没有需要保留的自身状态。
如果智能体没有人可以代为登录,请改用密钥:
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp \
--header "Authorization: Bearer $PIDGEON_API_KEY"
x-api-key 也可以使用。Cursor、Codex(读取 TOML,而非 JSON)和 VS Code 的分步说明;Windsurf 和 Gemini CLI 使用相同的 URL 和标头。
在 Grok 中
在 Grok 中,打开 Connectors → Custom,粘贴 https://pidgeon.ai/api/mcp,然后在授权页面登录;无需密钥(分步说明)。Meta 的 Muse 正在接受 Meta 审核。
在 Cursor 中
通过 cursor.directory 上的条目 将 Pidgeon 添加到 Cursor,其中包含托管服务器和 skill。
或者手动将服务器添加到 ~/.cursor/mcp.json(单个项目则使用 .cursor/mcp.json)。它只需要 URL;Cursor 会在首次调用时引导你登录:
{
"mcpServers": {
"pidgeon": {
"url": "https://pidgeon.ai/api/mcp"
}
}
}
如果智能体没有人可以代为登录,请在 URL 旁添加 "headers": { "Authorization": "Bearer ${env:PIDGEON_API_KEY}" },Cursor 会从你的环境中读取它。
Codex、VS Code 和 Gemini CLI
对于 Codex、VS Code 和 Gemini CLI,只需运行一条命令,就能将服务器写入客户端自己的文件:
npx -y @pidgeon-ai/mcp init --client codex # ~/.codex/config.toml
npx -y @pidgeon-ai/mcp init --client vscode # .vscode/mcp.json
npx -y @pidgeon-ai/mcp init --client gemini # .gemini/settings.json
如果未设置密钥,命令只会写入 URL,客户端会引导你登录。如果设置了 PIDGEON_API_KEY,命令会先验证密钥,然后让客户端从该变量读取密钥(Codex、Gemini CLI),或提示你输入一次(VS Code),因此密钥不会写入文件。它会保留现有内容,包括注释;修改文件前会将其复制到 <file>.bak;第二次运行时不会执行任何操作;只有使用 --force 时,才会替换不同的 pidgeon 条目。使用 --scope user 或 --scope project 可选择另一个文件;--print 则不会写入任何内容。
或者安装版:一个软件包
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp init
它会在写入任何内容之前,先用 API 验证密钥,并告知该密钥能访问哪些地址——这是 JSON 配置块无法回答的唯一问题;否则,这个问题只会以模型悄悄收到错误、而你却看不到的方式显现出来。然后,它会在当前目录写入 .mcp.json,并打印写入的内容。它绝不会替换已有条目:使用 --force 才会替换;--print 则只显示配置而不写入任何内容。如果客户端将配置保存在其他位置,这正是你需要的选项。
密钥通过环境变量引用,而不是写入文件,因此配置可以提交,凭据却不会泄露:
{
"mcpServers": {
"pidgeon": {
"command": "npx",
"args": ["-y", "@pidgeon-ai/mcp"],
"env": { "PIDGEON_API_KEY": "${PIDGEON_API_KEY}" }
}
}
}
Claude Desktop 或任何其他 MCP 客户端都可以使用相同的配置块。直接运行服务器主要适用于观察它的启动过程:
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp
PIDGEON_BASE_URL 可将服务器指向非生产环境;只有在你自行运行 Pidgeon 时才有用。
访问控制完全由密钥决定
这会将一个 API 密钥交给模型——这个密钥可以是你创建的,也可以是你通过登录授权的。软件包不会决定可以访问什么:密钥自身的权限上限和获准访问的地址决定了全部权限,这些控制都在服务器端执行,与其他任何调用方完全相同。这里没有第二套规则,因此也就不会有弄错它们的风险。
因此,请为智能体提供权限范围最小的密钥。在 read 创建的密钥无论获准访问哪个收件箱,都绝不能发送邮件——有关密钥访问范围的含义以及如何缩小范围,请参阅身份验证。只负责分类处理的智能体应持有只能读取的密钥,这样它是否可能发送令人尴尬的内容,就不再取决于提示词。
密钥的访问范围是创建时获准访问的地址快照,因此,密钥创建后新增的地址不在其范围内。
它提供的功能
共 42 项,直接从服务器自身的列表读取,因此本页面不会落后于服务器:
| 工具 | 功能 | 端点 |
|---|---|---|
list_addresses | 此凭据可以访问的地址。 | GET /identities |
create_address | 为智能体创建一个可用地址。 | POST /identities |
get_address | 按 ID 获取一个地址。 | GET /identities/{id} |
list_threads | 获取一个地址中的会话,按最新优先排列。 | GET /threads |
get_thread | 按 ID 获取一个会话。 | GET /threads/{id} |
list_messages | 获取一个会话中的邮件,按最早优先排列——这是回复前需要阅读的内容。 | GET /messages |
search_messages | 对此凭据可访问的所有地址进行全文搜索,并按相关性排序。 | GET /messages/search |
send_message | 从此凭据获准用于发送的地址发送邮件。 | POST /messages |
get_message | 按 ID 获取一封邮件,包括正文、我们保留的标头,以及发件域名的记录所证明的内容——authentication.spf\、.dkim\、.dmarc\;其中 null 表示未报告,而非验证失败。 | GET /messages/{id} |
await_message | 等待邮件到达某个地址——例如提交注册表单后——并返回邮件及其 extracted.codes\ 和 extracted.links\:最可能是验证码和确认链接的内容会排在前面。 | GET /messages/await |
reply_to_message | 收件人、主题和会话线程会从正在回复的邮件中读取,因此你只需提供正文内容。 | POST /messages/{id}/reply |
forward_message | 将一封邮件及其附件从接收该邮件的地址转发给原本未列为收件人的对象。 | POST /messages/{id}/forward |
create_draft | 创建一封不发送的邮件,供人工阅读和发送——如果有人要求你准备回复以供审核,请使用此功能。 | POST /drafts |
get_draft_approval | 按其 draft\_id\ 查询待审核发送的状态:在有人于控制面板中批准或拒绝之前为 pending\;之后为 approved\(表示已发送,且 message\_id\ 是该邮件)、rejected\,或在 24 小时内无人决定时为 expired\。 | GET /drafts/{id}/approval |
list_drafts | 获取某个地址的所有草稿,按最新优先排列,并包含收件人和正文,以便之后继续编辑并完成草稿。 | GET /drafts |
get_draft | 按 ID 获取一封草稿:包括发件人、收件人、主题、正文和附件。 | GET /drafts/{id} |
update_draft | 仅更改传入的字段,其余字段保持不变;null\ 可清除主题或正文。 | PATCH /drafts/{id} |
delete_draft | 删除一封草稿;如果已安排发送,也会取消发送。 | DELETE /drafts/{id} |
read_attachment | 获取一个附件的文本内容——例如 CSV、日志、JSON、日历文件、PDF、Word .docx\ 或 Excel .xlsx\。 | GET /attachments/{id}/text |
update_thread | 查询会话由谁负责,以及当前进展如何。 | PATCH /threads/{id} |
update_message | 为邮件加星标,或将其移至 archive\、spam\ 或 trash\。 | PATCH /messages/{id} |
list_send_rules | 获取某个地址的允许列表和阻止列表,以及与之关联的发送策略。 | GET /identities/{id}/send-rules |
list_receive_rules | 获取决定哪些邮件可以到达某个地址的规则——按发件人或域名执行拒收、标记为垃圾邮件、移至废纸篓、归档或放入收件箱——以及其 receive\_policy\。 | GET /identities/{id}/receive-rules |
list_folders | 获取某个地址的所有文件夹及其计数。 | GET /mailboxes |
list_folder | 获取某个地址的一个文件夹,按最新优先排列,每行一个会话——list\_threads\ 会告诉你有哪些会话;此功能则会告诉你它们归档在哪个文件夹,以及它们在列表中的显示内容。 | GET /mailboxes/{folder} |
list_changes | 获取自某个 sync\_cursor\ 以来某个收件箱中的所有变动,包括新邮件,这样长期运行的智能体就不必重新读取整个文件夹来查找一封新邮件。 | GET /mailboxes/changes |
list_events | 获取此凭据可访问的所有地址中的所有事件——收到、发送、送达、退信和归档的邮件。 | GET /events |
list_labels | 标签属于某个地址,而非工作区,因此三个地址上同名的标签实际上是三个拥有不同 ID 的标签。 | GET /labels |
create_label | 获取某个地址上的一个标签。 | POST /labels |
apply_label | 标签必须属于会话所在的同一个地址——使用该地址的 list\_labels\ 即可获取正确的 ID。 | POST /threads/{id}/labels |
remove_label | 从一个会话中移除一个标签。 | DELETE /threads/{id}/labels |
list_pods | pod 是用于容纳你自己的某个客户的容器:其中包含地址和域名,且**从中发送的邮件会使用其自身的发送信誉**,因此一个客户不会损害另一个客户的送达率。 | GET /pods |
create_pod | 用于容纳某个客户的容器,拥有独立的发送信誉。 | POST /pods |
get_metrics | 在 days\ 时间范围内统计已发送、已送达、退信、拒收、投诉、已接收和垃圾邮件数量——数据来自事件日志,因此也包括服务提供商事后报告的结果。 | GET /metrics |
get_calendar | 获取某个地址的日历,按该地址的 id\ 查询:包括默认时区和事件数量。 | GET /identities/{id}/calendar |
update_calendar | 获取未指定时区的事件所使用的时区,格式为 IANA 名称,例如 Europe/Lisbon\。 | PATCH /identities/{id}/calendar |
get_agenda | 获取某个地址日历中 after\ 至 before\(ISO 8601 日期时间)之间的事件,按开始时间排序;重复事件的每个日期都会单独列出。 | GET /identities/{id}/calendar/agenda |
get_calendar_event | 按 eventId\ 获取地址 id\ 日历中的一个事件:包括时间、描述、地点、重复规则,以及参与者及其回复。 | GET /identities/{id}/calendar/events/{eventId} |
create_calendar_event | 在地址 id\ 的日历中添加一个事件。 | POST /identities/{id}/calendar/events |
update_calendar_event | 更改一个日历事件:仅修改传入的字段,其余字段保持不变。 | PATCH /identities/{id}/calendar/events/{eventId} |
delete_calendar_event | 从地址 id\ 的日历中移除一个事件。 | DELETE /identities/{id}/calendar/events/{eventId} |
respond_to_invitation | 根据邮件的 id\ 回复通过邮件收到的会议邀请:可选择 accepted\、declined\ 或 tentative\,并可选填 comment\。 | POST /messages/{id}/invitation/respond |
每项功能都是其旁边列出的参考文档中的对应端点,并遵循相同的拒绝规则。密钥无权使用的工具会像 API 一样失败,并返回 API 原本会使用的提示语。
除非指定某个地址,否则搜索会覆盖密钥可访问的所有地址;每条结果都会注明它来自哪个地址。
它不是什么
它不是智能体运行时,也不会替你做任何决定。Pidgeon 不会对你运行哪个模型或模型可以得出什么结论发表意见——这与产品其他部分在线程与交接中的立场相同。如果智能体遇到困难,将会话交给人工处理属于线程状态,而不是此软件包的功能。