iCloud邮件服务器

一个通过IMAP和SMTP协议为AI助手提供完整iCloud邮件访问功能的MCP服务器,支持搜索、阅读、发送、回复、组织和管理邮件。

  • by roygabriel
  • Go
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 roygabriel/mcp-icloud-email

使用说明

Icloud电子邮件MCP服务器

A. 模型上下文协议 该服务器允许AI助手通过IMAP和SMTP完全访问Apple iCloud Mail。搜索、阅读、发送、回复、组织和管理您的iCloud邮箱——所有这些都可以从Claude或任何兼容MCP的客户端完成。

用Go和the mcp-go SDK。作为Linux、macOS和Windows的单个静态二进制文件发布。


目录


特性

电子邮件操作

  • 使用日期范围、阅读状态和文本查询过滤器搜索和列出电子邮件
  • 检索完整的电子邮件内容,包括正文、标题和附件元数据
  • 发送支持CC、BCC和HTML的新电子邮件
  • 回复电子邮件,回复所有支持
  • 发送前保存草稿以供审阅
  • 按文件名下载附件(到磁盘或以base64格式)

邮箱管理

  • 列出、创建和删除邮箱文件夹(包括嵌套文件夹)
  • 在文件夹之间移动电子邮件
  • 将电子邮件标记为已读或未读
  • 用可定制的颜色标记电子邮件以进行跟进
  • 删除电子邮件(移至垃圾箱或永久)
  • 在不获取内容的情况下计数匹配过滤器的电子邮件

可操作的

  • 具有互斥保护的线程安全IMAP访问
  • 具有UUID请求相关性的结构化JSON日志记录
  • 每次工具调用时60秒超时中间件
  • 输入验证:防止路径遍历、大小限制、文件夹/ID清理
  • 用于客户端安全的MCP工具注释(只读、破坏性、幂等)
  • 具有测试、linting和漏洞扫描的CI管道

快速开始

# Install
go install github.com/rgabriel/mcp-icloud-email@latest

# Set credentials (app-specific password, not your main iCloud password)
export ICLOUD_EMAIL="you@icloud.com"
export ICLOUD_PASSWORD="xxxx-xxxx-xxxx-xxxx"

# Run
mcp-icloud-email

或者从以下网址下载预构建的二进制文件 发布 页面。


先决条件

  • 转到1.21+ -- 安装 (仅在从源构建时需要)
  • Icloud帐户 启用了双因素身份验证
  • 应用程序特定密码 --IMAP/SMTP访问所需

生成特定于应用程序的密码

  1. 首选 appleid.apple.com 并登录
  2. 导航到 登录和安全 > 应用程序特定密码
  3. 点击 生成特定于应用程序的密码
  4. 输入标签(例如“MCP电子邮件服务器”)并单击 创建
  5. 复制生成的密码(xxxx-xxxx-xxxx-xxxx)并安全地存放

笔记:

  • 您的Apple ID必须启用双因素身份验证
  • 您最多可以创建25个活动应用程序特定密码
  • 更改您的主Apple ID密码会撤销所有特定于应用程序的密码
  • 切勿使用iCloud主密码访问IMAP/SMTP

安装

来源

git clone https://github.com/rgabriel/mcp-icloud-email.git
cd mcp-icloud-email
make build

使用 go install

go install github.com/rgabriel/mcp-icloud-email@latest

码头工人

docker build -t mcp-icloud-email .

docker run \
  -e ICLOUD_EMAIL="you@icloud.com" \
  -e ICLOUD_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
  mcp-icloud-email

Docker镜像使用多阶段构建 无发行版 基本映像,并以非root用户身份运行。

预构建二进制文件

从以下网址下载适用于您平台的二进制文件 发布 页面。二进制文件可用于:

平台 架构 二进制
Linux x86_64 mcp-icloud-email-linux-amd64
Linux ARM64 mcp-icloud-email-linux-arm64
macOS 英特尔 mcp-icloud-email-macos-amd64
macOS 苹果硅 mcp-icloud-email-macos-arm64
Windows x86_64 mcp-icloud-email-windows-amd64.exe

SHA256校验和与每个二进制一起提供。


配置

服务器需要两个环境变量:

变量 必填 描述
ICLOUD_EMAIL 是 您的iCloud电子邮件地址(Apple ID)
ICLOUD_PASSWORD 是 来自appleid.apple.com的特定于应用程序的密码
LOG_LEVEL 否 记录详细程度: DEBUG, INFO (默认), WARN, ERROR

您可以将这些设置为环境变量,也可以将它们放置在 .env 文件:

cp .env.example .env
# Edit .env with your credentials

使用Claude Desktop

将服务器添加到Claude Desktop配置文件中。

macOS -- ~/Library/Application Support/Claude/claude_desktop_config.json

Linux -- ~/.config/claude/claude_desktop_config.json

视窗 -- %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "icloud-email": {
      "command": "/path/to/mcp-icloud-email",
      "env": {
        "ICLOUD_EMAIL": "you@icloud.com",
        "ICLOUD_PASSWORD": "xxxx-xxxx-xxxx-xxxx"
      }
    }
  }
}

保存后重新启动Claude Desktop。


可用工具

服务器公开了14个MCP工具。每个工具都包含模式约束和注释,指示它是只读的、破坏性的还是幂等的。

搜索邮件

使用可选过滤器搜索和列出电子邮件。为了提高效率,返回电子邮件标题(不是全文)。

参数 类型 默认值 说明
query string 主题/正文的搜索词
folder 字符串 INBOX 要搜索的邮箱文件夹
last_days 整数 30 仅显示最近N天的电子邮件
limit 整数 50 最多可返回的电子邮件数(最多200封)
offset 整数 0 跳过前N个结果(用于分页)
unread_only 布尔值 false 仅返回未读电子邮件
since string 开始日期(ISO 8601)
before string 结束日期(ISO 8601)

响应包括 count (返回), total (在偏移/限制之前匹配)和一系列电子邮件摘要。

get_email

检索完整的电子邮件内容,包括正文、HTML、标题和附件列表。

参数 类型 默认值 说明
email_id 字符串 (必填) 电子邮件UID
folder 字符串 INBOX 邮箱文件夹

send_邮件

撰写并发送一封新电子邮件。

参数 类型 默认值 说明
to 字符串/数组 (必填) 收件人地址
subject 字符串 (必填) 主题行
body 字符串 (必填) 电子邮件正文
cc 字符串/数组 CC地址
bcc 字符串/数组 BCC地址
html 布尔值 false 正文是否为HTML

回复_电子邮件

回复现有电子邮件。自动设置“答复”和“引用”标题。

参数 类型 默认值 说明
email_id 字符串 (必填) 要回复的电子邮件UID
body 字符串 (必填) 回复正文
folder 字符串 INBOX 包含原始电子邮件的文件夹
reply_all 布尔值 false 回复所有收件人
html 布尔值 false 正文是否为HTML

草稿_邮件

将电子邮件另存为草稿。支持带有自动标头线程的回复草稿。

参数 类型 默认值 说明
to 字符串/数组 (必填) 收件人地址
subject 字符串 (必填) 主题行
body 字符串 (必填) 电子邮件正文
cc 字符串/数组 CC地址
bcc 字符串/数组 BCC地址
html 布尔值 false 正文是否为HTML
reply_to_id string 回复草稿的原始电子邮件ID
folder 字符串 INBOX 原始电子邮件文件夹(用于回复)

删除电子邮件

通过将电子邮件移至垃圾箱删除,或永久删除。

参数 类型 默认值 说明
email_id 字符串 (必填) 电子邮件UID
folder 字符串 INBOX 邮箱文件夹
permanent 布尔值 false 永久删除而不是丢弃

move_mail

将电子邮件从一个文件夹移动到另一个文件夹。

参数 类型 默认值 说明
email_id 字符串 (必填) 电子邮件UID
from_folder 字符串 INBOX 源文件夹
to_folder 字符串 (必填) 目标文件夹

mark_read

更改电子邮件的已读/未读状态。

参数 类型 默认值 说明
email_id 字符串 (必填) 电子邮件UID
folder 字符串 INBOX 邮箱文件夹
read 布尔值 true true 为了标记已读, false 未读

flag_mail

用可选颜色标记电子邮件以进行跟进。

参数 类型 默认值 说明
email_id 字符串 (必填) 电子邮件UID
flag 字符串 (必填) follow-up, important, deadline,或 none
folder 字符串 INBOX 邮箱文件夹
color string red, orange, yellow, green, blue, purple

集 flag 到 none 删除所有标志。

计数_邮件

在不下载邮件内容的情况下,统计与过滤器匹配的电子邮件。

参数 类型 默认值 说明
folder 字符串 INBOX 邮箱文件夹
last_days integer 仅从最近N天开始计数
unread_only 布尔值 false 只计算未读

list_folders

列出所有可用的邮箱文件夹。不接受任何参数。

创建文件夹

创建新的邮箱文件夹。

参数 类型 默认值 说明
name 字符串 (必填) 文件夹名称
parent string 嵌套的父文件夹(例如。 Work/Projects)

删除文件夹

删除邮箱文件夹。非空文件夹需要明确确认。

参数 类型 默认值 说明
name 字符串 (必填) 文件夹名称
force 布尔值 false 即使文件夹中包含电子邮件,也要删除

无法删除系统文件夹(收件箱、已发送、回收站)。

获取附件

按文件名下载电子邮件附件。

参数 类型 默认值 说明
email_id 字符串 (必填) 电子邮件UID
filename 字符串 (必填) 附件文件名
folder 字符串 INBOX 邮箱文件夹
save_path string 要保存到的文件路径(如果省略,则返回base64)

使用大型收件箱

服务器使用服务器端的IMAP SEARCH命令,因此在下载任何数据之前,邮件服务器上会进行过滤。默认设置已针对大型邮箱进行了调整:

  • search_emails 默认为过去30天,限制为50天
  • count_emails 返回计数而不获取消息内容
  • get_email 按需加载单个消息的全文内容

推荐工作流程:

  1. 使用 count_emails 检查有多少电子邮件符合您的条件
  2. 调整 last_days, since/before,或 unread_only 缩小结果
  3. 使用 search_emails 随着 offset 和 limit 用于分页
  4. 使用 get_email 仅适用于您需要完整阅读的特定消息

发展

建筑

make build          # Build binary
make test           # Run tests with race detector
make lint           # Run golangci-lint
make vet            # Run go vet
make vuln           # Run govulncheck
make all            # vet + lint + test + build
make docker         # Build Docker image
make tools          # Install dev tools (golangci-lint, govulncheck)

本地运行

export ICLOUD_EMAIL="you@icloud.com"
export ICLOUD_PASSWORD="xxxx-xxxx-xxxx-xxxx"
make run

测试

该项目包括78多个表驱动测试,涵盖所有工具处理程序、输入验证和错误路径。测试使用模拟实现 EmailService 和 EmailSender 接口——不需要实时IMAP/SMTP连接。

make test

MCP检验员测试

使用 MCP检查员 以交互方式测试服务器:

npx @modelcontextprotocol/inspector mcp-icloud-email

CI管道

每一次推动 main 或 dev 每个pull请求都会运行:

  • go vet 和 go test -race --正确性和数据竞争检测
  • golangci-lint --静态分析(errcheck、govet、staticcheck、gosec、gocritic等)
  • govulncheck --已知漏洞扫描

标签发布(v*.*.*)使用SHA256校验和触发自动跨平台构建。


建筑

mcp-icloud-email/
  main.go              Server setup, tool registration, middleware chain
  config/config.go     Environment variable loading and validation
  imap/client.go       IMAP client (imap.mail.me.com:993, TLS)
  smtp/client.go       SMTP client (smtp.mail.me.com:587, STARTTLS)
  tools/
    interfaces.go      EmailReader, EmailWriter, EmailService, EmailSender
    helpers.go         Address parsing, shared utilities
    validate.go        Input validation (paths, folders, IDs, sizes)
    handlers_test.go   78+ table-driven tests with mocks
    <tool>.go          One file per tool handler (14 files)

中间件链: 每个工具调用都经过 logging -> timeout -> handler日志中间件分配UUID请求ID,并记录工具名称、持续时间和结果。超时中间件强制执行60秒的最后期限。

螺纹安全: IMAP客户端使用 sync.Mutex 以序列化访问。内部方法(小写)假设调用者持有锁,防止嵌套调用造成死锁,如 DeleteEmail -> moveEmail.

依赖项

包装 用途
mcp走 MCP SDK——工具注册、stdio传输
转到imap/v2 IMAP协议客户端
go消息 MIME解析和电子邮件格式
godotenv .env 文件加载
通用唯一标识符 消息ID和请求ID生成

安全

  • 仅限应用程序特定密码 --从不接受或存储您的主iCloud密码
  • TLS无处不在 --端口993上的IMAP(隐式TLS),端口587上的SMTP(STARTTLS)
  • 输入验证 --路径遍历防止、空字节拒绝、IMAP通配符过滤、控制字符拒绝、数字UID验证
  • 大小限制 --10 MB正文,998个字符的主题(根据RFC 2822)
  • 分散Docker镜像 --最小攻击面,以非根模式运行
  • 无第三方数据共享 --服务器在本地运行,仅与iCloud服务器通信
  • 可撤销访问 --可以随时从appleid.apple.com撤销特定于应用程序的密码

永远不要承诺你的 .env 文件到版本控制。这 .gitignore 已经将其排除在外。


故障排除

认证失败

  • 验证您使用的是特定于应用程序的密码,而不是iCloud主密码
  • 检查您的Apple ID是否启用了双因素身份验证
  • 在appleid.apple.com重新生成新的应用程序特定密码
  • 确认您的电子邮件地址与您的Apple ID匹配

未找到文件夹

  • 跑 list_folders 查看您帐户的确切文件夹名称
  • iCloud使用“已删除邮件”而不是“垃圾箱”之类的名称
  • 文件夹名称区分大小写

日期格式无效

  • 使用ISO 8601: 2024-01-15T14:30:00Z
  • 如果不是UTC,请包括时区偏移: 2024-01-15T14:30:00-05:00

超时或响应缓慢

  • 检查您的互联网连接
  • 减少 limit 大型结果集的参数
  • 使用 count_emails 在搜索之前首先衡量结果大小
  • 使用较窄的日期范围 since/before 或 last_days

未找到电子邮件

  • 每个文件夹的电子邮件ID(UID)都是唯一的——请确保您在正确的文件夹中查找
  • 自检索ID以来,电子邮件可能已被移动或删除
  • 使用 search_emails 查找当前电子邮件ID

贡献

欢迎捐款。请在提交pull请求之前打开一个问题来讨论更大的更改。


许可证

MIT许可证——见 许可证 了解详情。