mcpField
I
IMAP Mail

IMAP Mail

本地服务
github.com/buzzer通信协作02 天前更新

关于 IMAP Mail

IMAP Mail 是供助手读取和搜索 IMAP 邮箱、创建邮件草稿的 MCP 服务。除可选的已读标记外,邮件访问保持只读;它不发送或删除邮件。

主要功能

  1. 01列出账户、文件夹和邮件
  2. 02搜索并读取邮件
  3. 03将邮件标记为已读
  4. 04创建可附加文件的草稿
  5. 05通过 SSH、HTTP 或 Docker 连接

适用场景

  1. 01查找多个已配置邮箱中的邮件
  2. 02读取邮件内容但不发送邮件
  3. 03使用允许的附件准备草稿

MCP 相关

向 MCP 客户端提供账户、文件夹、邮件、搜索、已读状态和草稿工具。支持 stdio 连接及 HTTP 端点。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"buzzer-imap": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"IMAP_HOST",
"-e",
"MAIL_USER",
"-e",
"MAIL_PASSWORD",
"-e",
"IMAP_PORT",
"-e",
"MAIL_ADDRESS",
"-e",
"MAIL_FROM_NAME",
"-e",
"MAIL_ALIASES",
"-e",
"DRAFTS_FOLDER",
"-e",
"MARK_READ_ON_READ",
"-e",
"BCC_SELF",
"ghcr.io/buzzer/imap-mcp:0.2.0"
],
"env": {
"IMAP_HOST": "<IMAP_HOST>",
"MAIL_USER": "<MAIL_USER>",
"MAIL_PASSWORD": "<MAIL_PASSWORD>",
"IMAP_PORT": "<IMAP_PORT>",
"MAIL_ADDRESS": "<MAIL_ADDRESS>",
"MAIL_FROM_NAME": "<MAIL_FROM_NAME>",
"MAIL_ALIASES": "<MAIL_ALIASES>",
"DRAFTS_FOLDER": "<DRAFTS_FOLDER>",
"MARK_READ_ON_READ": "<MARK_READ_ON_READ>",
"BCC_SELF": "<BCC_SELF>"
}
}
}
}
启动命令docker run -i --rm -e IMAP_HOST -e MAIL_USER -e MAIL_PASSWORD -e IMAP_PORT -e MAIL_ADDRESS -e MAIL_FROM_NAME -e MAIL_ALIASES -e DRAFTS_FOLDER -e MARK_READ_ON_READ -e BCC_SELF ghcr.io/buzzer/imap-mcp:0.2.0
需要配置的环境变量
IMAP_HOSTIMAP server host name (IMAPS), e.g. imap.example.com
MAIL_USERIMAP login, usually the mail address
MAIL_PASSWORD密钥IMAP password; an app-specific password where the provider requires one
IMAP_PORTIMAPS port
MAIL_ADDRESSOwn sender address, if it differs from the login
MAIL_FROM_NAMEDisplay name used as sender of drafts
MAIL_ALIASESAdditional allowed sender addresses, comma-separated; *@example.com allows a whole domain
DRAFTS_FOLDERDrafts folder, if it is not detected automatically
MARK_READ_ON_READread_message marks every message it returns as read
BCC_SELFAdd the sender address as Bcc to every draft

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

安装包
ocighcr.io/buzzer/imap-mcp:0.2.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

imap-mcp

一个小型 MCP 服务,让 AI 助手 (例如 Claude Desktop)能够读取 IMAP 邮箱并创建草稿。它最初是为 Raspberry Pi 上的 Hetzner 邮箱和 iCloud 账户编写的,但适用于任何支持 IMAPS(端口 993)的 IMAP 服务。

**状态:**个人项目,按现状发布。它适用于可信的家庭 网络,不适用于开放互联网。请参阅安全和 SECURITY.md。

功能

工具:list_accounts、list_folders、list_messages、search_messages、 read_message、mark_read、create_draft。每个工具都有一个 account 参数;如果省略, 则使用第一个配置的账户。

  • 读取为只读操作:邮件使用 BODY.PEEK 获取,默认不会将邮件标记为 已读、移动或删除。
  • 对现有邮件的唯一写入操作是设置 \Seen 标记;可通过 mark_read 设置,也可在启用后由 read_message 自行设置。请参阅已读状态。
  • 有意不提供发送功能。create_draft 会将草稿存入 草稿文件夹;你需要在自己的邮件客户端中检查并发送。
  • 草稿可以包含附件(PDF、PNG、JPEG),这些附件取自一个已配置的文件夹 (默认关闭 ATTACHMENT_DIR)。请参阅附件。
  • 发件人仅限账户地址及已配置的别名 (允许使用 MAIL_ALIASES 和 *@example.com 这类通配符)。回复时会自动选择 原邮件的收件地址。
  • 每封邮件最多加载 2 MB;邮件被截断时,read_message 会报告 message_truncated。
  • 每个账户的一个 IMAP 连接会在多次调用之间重复使用。
  • 邮件内容会被视为不可信数据(请参阅服务说明和 安全)。

要求

  • Python 3.10+
  • 一个在需要时使用应用专用密码的 IMAP 账户(iCloud、Gmail 等)
  • 服务本身需要 mcp 和 uvicorn(请参阅 requirements.txt);邮件 逻辑仅使用标准库。

1. 安装

git clone https://github.com/<you>/imap-mcp.git
cd imap-mcp
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt

cp config.env.example config.env
chmod 600 config.env
$EDITOR config.env          # user, password, aliases

.venv/bin/python -m unittest discover -s tests   # offline tests
.venv/bin/python server.py --check                # test the real IMAP connections

--check 会为每个账户打印一行,例如 OK [hetzner] [email protected] @ mail.your-server.de, Drafts: INBOX.Drafts, Senders: …。

2a. 通过 SSH 连接(stdio,推荐)

客户端会按需通过 SSH 启动服务:无需开放端口,无需令牌,并由 SSH 加密。 请使用无需输入密码短语的密钥(必须能成功运行 ssh -o BatchMode=yes host echo ok)。claude_desktop_config.json 示例:

{
  "mcpServers": {
    "mail": {
      "command": "ssh",
      "args": [
        "-T", "-o", "BatchMode=yes", "-o", "ServerAliveInterval=30",
        "user@your-host",
        "/path/to/imap-mcp/.venv/bin/python",
        "/path/to/imap-mcp/server.py"
      ]
    }
  }
}

2b. 替代方案:局域网上的 HTTP 服务

适用于多台机器需要使用此服务的情况。

python3 -c 'import secrets; print(secrets.token_urlsafe(32))'   # generate a token
# in config.env: MCP_AUTH_TOKEN=<token>

scripts/make-cert.sh        # self-signed certificate for this host
# in config.env:
# TLS_CERT=/path/to/imap-mcp/certs/server.crt
# TLS_KEY=/path/to/imap-mcp/certs/server.key

sudo cp imap-mcp.service /etc/systemd/system/    # adjust User= and the paths first
sudo systemctl daemon-reload
sudo systemctl enable --now imap-mcp

端点为 https://<host>:8765/mcp,并要求提供 Authorization: Bearer <token>。 如果没有 --host,服务只会监听 127.0.0.1;systemd 单元会传入 --host 0.0.0.0(所有接口),因此如果你有需要,可以将其改为局域网地址。 除普通 HTTP 请求外的请求(例如 WebSocket)都会被拒绝。 如果没有 TLS_CERT/TLS_KEY,服务会继续以明文运行并记录警告。证书有效期为 730 天;之后请再次运行 make-cert.sh 并重新分发证书。

只支持 stdio 的客户端可以使用 mcp-remote 桥接程序(需要 Node.js)。Node 必须信任自签名证书,因此请将 NODE_EXTRA_CA_CERTS 指向 客户端机器上的 server.crt 副本:

{
  "mcpServers": {
    "mail": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://<host>:8765/mcp",
               "--header", "Authorization:${AUTH}"],
      "env": { "AUTH": "Bearer <token>",
               "NODE_EXTRA_CA_CERTS": "/path/on/the/client/server.crt" }
    }
  }
}

Claude 设置中的自定义连接器无法用于局域网地址,因为它们会从 Anthropic 的云端发起连接。

2c. 替代方案:Docker(本地 stdio)

amd64 和 arm64 的容器镜像发布于 ghcr.io/buzzer/imap-mcp;该服务在 MCP 注册表中的登记名称为 io.github.buzzer/imap-mcp。客户端会按需启动容器,并通过环境变量传入配置:

{
  "mcpServers": {
    "mail": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
               "-e", "IMAP_HOST", "-e", "MAIL_USER", "-e", "MAIL_PASSWORD",
               "ghcr.io/buzzer/imap-mcp:latest"],
      "env": {
        "IMAP_HOST": "imap.example.com",
        "MAIL_USER": "[email protected]",
        "MAIL_PASSWORD": "app-password"
      }
    }
  }
}

配置中的每个键都可以用同样的方式传入。对于多个账户,挂载配置文件会更方便: -v /path/to/config.env:/config.env:ro -e MAIL_MCP_CONFIG=/config.env。容器以 UID 10001 运行,因此该用户必须能读取此文件。对于附件,请以只读方式挂载文件夹,并将 ATTACHMENT_DIR 设置为容器内的路径。

配置

所有键请参阅 config.env.example(MAIL_USER、MAIL_PASSWORD、MAIL_ADDRESS、 MAIL_FROM_NAME、MAIL_ALIASES、IMAP_HOST、IMAP_PORT、IMAP_TIMEOUT、 DRAFTS_FOLDER、ATTACHMENT_DIR、ATTACHMENT_MAX_BYTES、ATTACHMENT_MAX_TOTAL_BYTES、 ATTACHMENT_MAX_COUNT、MARK_READ_ON_READ、BCC_SELF、ACCOUNTS、ACCOUNT_NAME、MCP_AUTH_TOKEN、 TLS_CERT、TLS_KEY)。对于其他账户,最多到 ATTACHMENT_MAX_COUNT 的账户键可以加上 <NAME>_ 前缀;其余键均为全局设置。每个键也可以设为环境变量;使用 MAIL_MCP_CONFIG 或 --config 选择其他配置文件。

其他账户:iCloud
ACCOUNTS=hetzner,icloud
ICLOUD_MAIL_USER=first.last                # login, usually the part before @icloud.com
[email protected]
ICLOUD_MAIL_PASSWORD=abcd-efgh-ijkl-mnop   # app-specific password

密码应为从 account.apple.com 获取的 App 专用密码(登录与安全 → App 专用密码),而不是 Apple ID 密码。 账户名称为 icloud 时,预配置的服务器为 imap.mail.me.com:993;账户名称为 hetzner 时,预配置的服务器为 mail.your-server.de:993。其他账户名称都需要设置 <NAME>_IMAP_HOST;服务不会猜测主机,因此不会把密码发送给错误的服务商。

已读状态

为了让本地邮件客户端显示助手已查看过哪些邮件,read_message 可以为其返回的每封邮件设置 \Seen 标记:

  • 在 config.env 中设置 MARK_READ_ON_READ=true,即可为所有账户启用此功能 (一个全局选项,默认关闭)。没有按调用或按账户设置的选项。
  • 只有 read_message 会执行此操作。列出和搜索操作仅显示邮件头,不会更改标记;对于以其他方式处理的邮件,仍可使用 mark_read。
  • 结果包含 unread(读取前的状态)和 marked_read。如果无法设置标记,仍会返回邮件,且 marked_read 为 false。
  • 除 \Seen 外,不会设置任何标记;已读邮件不会被更改。

密送给自己

在 config.env 中设置 BCC_SELF=true(适用于所有账户的全局选项,默认关闭)后,create_draft 会将草稿的发件人地址添加为密送收件人,这样已发送邮件的副本也会进入该邮箱。此处使用的地址就是实际发件人地址(账户地址或别名,见 from_address)。如果该地址已在 To、Cc 或 Bcc 中,则不会重复添加。结果会显示最终的 bcc,而 list_accounts 会报告 bcc_self。

附件

create_draft 接受 attachments,即一组相对于 ATTACHMENT_DIR 的文件路径。只有在 config.env 中设置了该键后,此功能才会启用 (list_accounts 会按账户显示 attachments_enabled)。以下规则均由服务强制执行:

  • 仅允许 .pdf、.png、.jpg 和 .jpeg;文件内容必须以对应的魔数开头(改名的文件会被拒绝);
  • 文件必须位于 ATTACHMENT_DIR 下:绝对路径、..、符号链接以及隐藏文件或文件夹(.env、.ssh 等)均会被拒绝;
  • 最多允许 ATTACHMENT_MAX_COUNT 个文件(默认 5 个),每个文件不超过 ATTACHMENT_MAX_BYTES(默认 10 MB),合计不超过 ATTACHMENT_MAX_TOTAL_BYTES(默认 15 MB);
  • 只有在所有附件都通过检查后,草稿才会被保存;模型永远不会看到文件内容,只会看到文件名。
建议的设置

使用专用的扁平文件夹,其中只放置你愿意附加的文件。 模型可以附加其中的所有文件。

mkdir -p ~/mail-attachments
chmod 700 ~/mail-attachments
ATTACHMENT_DIR=/home/<user>/mail-attachments
  • 通过 SSH 使用 stdio 传输时,服务会以 SSH 用户身份读取文件。
  • 工具调用中的路径相对于该文件夹,例如 invoice-2026-10.pdf 或 invoices/2026/invoice-2026-10.pdf;不接受绝对路径。
  • 服务只读取文件。请自行将文件放入其中(scp file.pdf host:mail-attachments/、 rsync、Syncthing 或 Samba 共享),然后让助手按名称附加文件。
  • 多个账户可以使用带有相应前缀的独立文件夹,例如 ICLOUD_ATTACHMENT_DIR=/home/<user>/mail-attachments-icloud。
  • 使用 systemd 单元(ProtectHome=read-only)时,服务用户需要有读取权限; 最简单的做法是将文件夹放在 /home 之外,例如 /opt/imap-mcp/attachments。
  • 删除不再需要的文件。

安全

  • config.env 包含邮箱密码:执行 chmod 600,切勿提交该文件(如果其他用户可读取该文件,服务会发出警告)。
  • 邮件内容是不可信文本。服务说明会告知模型不要遵循邮件中包含的请求。由于无法发送或删除任何内容,可能造成的损害仅限于草稿,以及向模型泄露邮件内容。
  • HTML 邮件会转换为文本供模型读取,并移除读者无法看到的内容(display:none、hidden、opacity:0、折叠的预览文本、script/style/head),从而清除最常见的隐形提示注入藏匿位置。仅仅不可读的文本(白底白字、在子元素上设置的小字体)仍会传递给模型,因此这只是缓解措施,并非万无一失。
  • 含有控制字符(CR/LF)的搜索词会被拒绝,因此无法注入额外的 IMAP 命令。含有换行符的收件人地址也会被拒绝。
  • HTTP 传输使用单个静态 bearer token,且没有速率限制。仅在可信网络中通过 TLS 使用;如果令牌泄露,请轮换令牌。
  • 失败的 HTTP 身份验证尝试会记录客户端 IP;工具调用(账户、文件夹、UID)会被记录,但不包含邮件内容。

已知限制

  • 草稿仅支持纯文本。引用回复的署名行 (“Am … schrieb …:”)和占位主题“(kein Betreff)”为德语。
  • 附件仅限来自一个文件夹的 PDF/PNG/JPEG;无法移动或删除邮件;唯一可设置的标志是 \Seen(通过 mark_read)。
  • 仅在 Hetzner(Dovecot)和 iCloud 上经过测试。

开发

python -m unittest discover -s tests    # no network and no MCP SDK needed
发布

该服务以容器映像的形式分发在 ghcr.io/buzzer/imap-mcp,并以 io.github.buzzer/imap-mcp 列入 MCP 注册表。当推送版本标签时,publish 工作流(.github/workflows/publish.yml)会更新这两处:

  1. 在 server.json 的两个位置设置新版本:version,以及 packages[0].identifier 末尾的映像标签。
  2. 提交,然后打标签并推送:git tag v0.3.0 && git push origin main v0.3.0。 如果标签与 server.json 中的版本不一致,工作流会失败。
  3. 检查结果: curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.buzzer/imap-mcp"

需要了解的事项:

  • 注册表只存储元数据,并通过 Dockerfile 中的映像标签 io.modelcontextprotocol.server.name 验证所有权;该标签必须与 server.json 中的 name 保持一致。
  • 工作流使用 GitHub OIDC 登录注册表,因此无需密钥或令牌;命名空间 io.github.buzzer 与 GitHub 账号关联。
  • 用户希望在客户端中看到的新配置键,既要添加到 server.json 的 environmentVariables 中,也要添加到 config.env.example 中。
  • 工作流中按版本和 SHA-256 固定了 mcp-publisher (MCP_PUBLISHER_VERSION、MCP_PUBLISHER_SHA256)。如需更新,请从 发布版本的 registry_<version>_checksums.txt 中获取 mcp-publisher_linux_amd64.tar.gz 的校验和。
  • 可使用 mcp-publisher validate 在本地检查 server.json。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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