Skip to main content
Glama

Apple Reminders MCP

一个本地 stdio MCP 服务器,可为模型提供对 macOS Reminders 的受控读写访问:列表、提醒、日期、重复、提前提醒、优先级、旗标、备注和 URL。

仅支持 macOS。基于 macOS 27 使用 Swift 6.4 构建。

安装

以扩展包形式安装(推荐)

npm install && npm run package:mcpb

那样会生成 apple-reminders-mcp.mcpb。打开它,或者像 apple-calendar-mcp.mcpb 和 apple-mail-mcp.mcpb 那样,把它拖入 Claude Desktop 的扩展面板。

从源码安装

npm install && npm run build

然后向你的 MCP 客户端注册:

{
  "mcpServers": {
    "apple-reminders": {
      "command": "node",
      "args": ["/absolute/path/to/apple-reminders-mcp/dist/index.js"]
    }
  }
}

Swift 辅助程序特意不使用自己的身份进行代码签名。ad-hoc 身份会使其成为独立的 TCC 主体,从而破坏 EventKit 访问继承(已验证:签名后 requestFullAccessToReminders 会返回 false)。不签名时,它会继承 MCP 客户端的权限。

首次使用你的 MCP 客户端需要:

  • Reminders 访问权限(系统设置 → 隐私与安全性 → Reminders)——所有功能都需要。

  • 自动化 → Reminders 访问权限——仅在使用旗标时需要。

Related MCP server: Apple Reminders MCP Server

工具

每个工具都有一个采用 Reminders 自身术语的显示名称,这就是客户端显示的名称,而不是原始的函数名。

显示为

工具

执行的操作

显示列表

list_lists

每个列表及其 id、名称、颜色、可写性以及是否是默认列表

新建列表

create_list

新建列表,可选十六进制颜色

编辑列表

update_list

重命名列表和/或更改其颜色

删除列表

delete_list

删除一个列表以及其中的每条提醒——需要 confirm: true

查找提醒

list_reminders

按列表、完成状态、到期时间范围、文字筛选;limit 并带 truncated 标志

打开提醒

get_reminder

查看一条提醒的完整详情

新建提醒

create_reminder

使用任意受支持的字段进行创建

编辑提醒

update_reminder

对任意字段进行补丁修改,包括通过 completed 勾选完成

移动列表

move_reminder

将提醒移到另一个列表

删除提醒

delete_reminder

删除一条提醒

另外还暴露了 reminders://lists 和 reminders://capabilities 资源,以及一个 triage_reminders prompt。

字段映射

Reminders 应用的详情面板如何映射到此服务器:

Reminders 应用

字段

说明

标题

title

备注

notes

传入 "" 清除

URL

url

传入 "" 清除

日期 / 时间

due, allDay

YYYY-MM-DD → 全天;ISO 日期时间 → 有具体时间;传入 "" 清除

重复

recurrence

不带 RRULE: 前缀的 iCal RRULE

结束重复

recurrence

RRULE 的 UNTIL= 或 COUNT=

提前提醒

earlyReminderMinutes

截止时间前多少分钟;传入 null 清除

列表

list / move_reminder

旗标

flagged

由 AppleScript 支撑,很慢——见下文

优先级

priority

none | low | medium | high

完成复选框

completed

标签

—

不支持,见下文

紧急

—

不支持,见下文

每个提醒都会同时返回 due(UTC,或全天时返回 YYYY-MM-DD)和 dueLocal. 告知用户某个事项的截止时间时,请使用 dueLocal。

勾选一条重复提醒

勾选一条重复提醒会跳到下一次提醒,而不是标记完成——这与 Reminders 应用的做法相同。响应会返回 completed: false,且截止日期也更晚。若要结束重复序列,请先清除 recurrence,或删除该提醒。

哪些内容不受支持,以及原因

在 macOS 27 上,Reminders 界面中有两个字段背后没有对应的 API。这一结论经实测证实,并非猜测。

标签。EKReminder 和 EKCalendarItem 不暴露任何标签属性(通过 Objective-C 运行时转储验证:class_copyPropertyList 不会返回任何类标签形状的成员,respondsToSelector: 对 tags 和 hashtags 都返回 false)。Reminders 的 AppleScript 词典中也没有 tags 术语——它的 reminder 类只暴露 name、id、container、创建/修改日期、body、title、complete、completion date、due date、allday due date、priority 和 flagged。把 #tag 写进标题并不能创建标签:一条通过 EventKit 创建、标题为 zzz mcp probe #zzmcpprobe 的提醒,在 Reminders 中只会原样渲染为纯文本,并没有附带任何标签。标签位于 Reminders group 容器中,这个容器受 TCC 保护,且直接对其进行不安全的写入(它是一个已启用的 Core 数据存储)。

urgent 紧急字段。 出现在 Reminders UI 中的“紧急”开关(Mark this reminder as urgent to set an alert)并不存在于 EventKit 或 AppleScript 词典中。在界面中切换它,不会产生此服务器可读取或写入的任何属性。

如果你需要其中任意一个字段,只能手动在 Reminders 应用中完成。

旗标很慢

flagged 是唯一的不能由 EventKit 访问的字段,所以它通过 Reminders.app 的 AppleScript 桥接来访问。这个桥接很慢,而且会随着列表变大而变慢——在本机界面上测得:小列表约 1 秒,按 id 全局查找约 15 秒,包含数百条提醒的列表约 30 秒。

因此旗标状态是可选的(opt-in):

  • 读出时除非你传 includeFlagged: true,否则忽略它;否则 flagged 的返回 null(表示“未读”,而不是“未标记”)。

  • 写入仅在真正发送 flagged 时才会花费成本。

如果你的列表非常大,可以在需要时调大 APPLE_REMINDERS_MCP_TIMEOUT_MS(默认 120000)。

安全

  • 拒绝写入只读列表。

  • APPLE_REMINDERS_MCP_ALLOW_LISTS——逗号分隔的列表名称或 id。若设置,写入被限制在这些列表内。

  • delete_list 需要 confirm: true,因为它会销毁列表中的每条提醒。

  • 破坏性工具的注解。

验证

npm run verify

那样会先构建、运行辅助程序的自我测试(RRULE 往返转换、优先级映射、日期组件、id 类型转换、输入拒绝),然后运行一个端到端冒烟测试:通过 stdio 驱动真实的 MCP 服务器,对临时列表进行读写。

冒烟测试覆盖全部 10 个工具,共 27 个断言,包括确保每个工具都声明了可用的 JSON 输入 schema。如果不想跑慢的旗标检查,可以设置 SMOKE_SKIP_FLAGS=1。

目录结构

helper/EventKitReminders.swift   EventKit + AppleScript, JSON in on stdin, JSON out on stdout
src/helper.ts                    spawns the helper, one process per call
src/index.ts                     MCP tools, zod schemas, model-facing instructions
icon.png                         256x256 bundle icon
scripts/make-icon.swift          redraws icon.png; geometry and colours are
                                 measured from the Reminders app icon, drawn in
                                 CoreGraphics rather than copied as an asset
scripts/build-helper.sh          swiftc build (intentionally unsigned)
scripts/helper-self-test.mjs     pure-logic self-tests, touches no real data
scripts/smoke.mjs                end-to-end test over stdio JSON-RPC
scripts/package.mjs              builds apple-reminders-mcp.mcpb
scripts/package-check.mjs        asserts the bundle has the runtime files, an
                                 executable helper, and no dev artifacts

Related MCP Connectors

Related MCP Servers