Apple Reminders MCP

Apple Reminders MCP

Enables model-controlled read/write access to macOS Reminders, including lists, reminders, dates, repeats, early reminders, priority, flags, notes, and URLs.

Category
访问服务器

README

Apple Reminders MCP

A local stdio MCP server that gives a model controlled read/write access to macOS Reminders: lists, reminders, dates, repeats, early reminders, priority, flags, notes, and URLs.

macOS only. Built against macOS 27 with Swift 6.4.

Install

As an extension bundle (recommended)

npm install && npm run package:mcpb

That produces apple-reminders-mcp.mcpb. Open it, or drag it into Claude Desktop's Extensions pane, the same way as apple-calendar-mcp.mcpb and apple-mail-mcp.mcpb.

From source

npm install && npm run build

Then register it with your MCP client:

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

The Swift helper is deliberately not code-signed with its own identity. An ad-hoc identity makes it a separate TCC subject, which breaks EventKit access inheritance (verified: signing makes requestFullAccessToReminders return false). Unsigned, it inherits the MCP client's permissions.

On first use your MCP client will need:

  • Reminders access (System Settings → Privacy & Security → Reminders) — for everything.
  • Automation → Reminders access — only if you use flags.

Tools

Each tool carries a display name in Reminders' own vocabulary, which is what clients show instead of the raw function name.

Shown as Tool What it does
Show Lists list_lists Every list with id, account, color, writability, and which is default
New List create_list New list, optional hex color
Edit List update_list Rename a list and/or change its color
Delete List delete_list Delete a list and every reminder in it — requires confirm: true
Find Reminders list_reminders Filter by list, completion, due window, text; limit with a truncated flag
Open Reminder get_reminder Full detail for one reminder
New Reminder create_reminder Create with any supported field
Edit Reminder update_reminder Patch any field, including checking off via completed
Move to List move_reminder Move a reminder to another list
Delete Reminder delete_reminder Delete one reminder

Also exposed: reminders://lists and reminders://capabilities resources, and a triage_reminders prompt.

Field mapping

How the Reminders app's detail panel maps onto this server:

Reminders app Field Notes
Title title
Notes notes "" clears
URL url "" clears
Date / Time due, allDay YYYY-MM-DD → all-day; ISO datetime → timed; "" clears
Repeat recurrence iCal RRULE without the RRULE: prefix
End Repeat recurrence the RRULE's UNTIL= or COUNT=
Early Reminder earlyReminderMinutes minutes before due; null clears
List list / move_reminder
Flag flagged AppleScript-backed, slow — see below
Priority priority none | low | medium | high
checkbox completed
Tags — not supported, see below
Urgent — not supported, see below

Every reminder comes back with both due (UTC, or YYYY-MM-DD when all-day) and dueLocal. Use dueLocal when telling a person when something is due.

Checking off a repeating reminder

Checking off a repeating reminder advances it to its next occurrence instead of completing it — the same thing the Reminders app does. The response returns completed: false with a later due date. To end a series, clear recurrence first or delete the reminder.

What is not supported, and why

Two fields in the Reminders UI have no API behind them on macOS 27. This was established by direct testing, not assumption:

Tags. EKReminder and EKCalendarItem expose no tag property (dumped via the Objective-C runtime: class_copyPropertyList returns no tag-shaped member, and respondsToSelector: is false for tags and hashtags). The Reminders AppleScript dictionary has no tags term either — its reminder class exposes only name, id, container, creation/modification date, body, completed, completion date, due date, allday due date, remind me date, priority, and flagged. Writing #tag into a title does not create a tag: a reminder created via EventKit titled zzz mcp probe #zzmcpprobe rendered in Reminders as literal text with no tag attached. Tags live in the Reminders group container, which is TCC-protected and unsafe to write directly (it is a synced CoreData store).

Urgent. The "Urgent" toggle (Mark this reminder as urgent to set an alarm) appears in neither EventKit nor the AppleScript dictionary. Toggling it in the UI produced no property this server can read or write.

If you need either field, it has to be set by hand in the Reminders app.

Flags are slow

flagged is the one field EventKit cannot reach, so it goes through Reminders.app's AppleScript bridge. That bridge is slow and degrades with list size — measured on this machine: ~1s on a small list, ~15s for a global lookup by id, ~30s for a list holding hundreds of reminders.

So flag state is opt-in:

  • Reads omit it unless you pass includeFlagged: true; otherwise flagged comes back null (meaning "not read", not "not flagged").
  • Writes only pay the cost when you actually send flagged.

Raise APPLE_REMINDERS_MCP_TIMEOUT_MS (default 120000) if you have very large lists.

Safety

  • Writes to read-only lists are refused.
  • APPLE_REMINDERS_MCP_ALLOW_LISTS — comma-separated list names or ids. When set, writes are confined to those lists.
  • delete_list requires confirm: true because it destroys every reminder in the list.
  • Destructive tools carry destructiveHint annotations so clients can gate them.

Verifying

npm run verify

That builds, runs the helper's self-tests (RRULE round trip, priority mapping, date components, id bridging, AppleScript escaping, input rejection), then runs an end-to-end smoke test that drives the real MCP server over stdio against throwaway lists and deletes them afterwards.

The smoke test covers all 10 tools in 27 assertions, including a guard that every tool advertises a usable JSON input schema. Set SMOKE_SKIP_FLAGS=1 to skip the slow flag checks.

Layout

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

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选