
Remindersmcp
io.github.aernouddekker由 GitHub 帳號 aernouddekker 發布v0.2.0更新於 Oct 24, 2026
MCP server for macOS Reminders.app — list and reminder management via AppleScript
概覽
讓助理透過 AppleScript 在 Mac 本機讀取與管理 macOS 提醒事項 App 的清單和提醒。
- 可以做什麼
- 透過 stdio 提供 22 個針對提醒事項 App 的工具:列出帳號與清單、讀取清單屬性,以及建立、重新命名或刪除清單。可以列出、搜尋與取得提醒詳細資料,查看今天、即將到期或已逾期的提醒,並建立、更新、刪除、完成、取消完成、移動、標記或設定提醒優先順序。也能把提醒事項 App 帶到最前面以顯示某個清單或提醒。
- 適用情境
- 適合讓助理操作使用者自己在 Mac 上的提醒清單,例如整理今天或已逾期的任務、新增或完成提醒、在清單之間移動項目。它是本機單機工具,而不是共用或雲端服務。
- 執行需求
- 僅限 macOS(使用 AppleScript,無法在 Linux 或 Windows 上執行),需要 Node.js 18 或更新版本。以 npm 套件 @aernoud/remindersmcp 安裝,並透過 stdio 在本機執行。未宣告需要 API 金鑰、OAuth 或雲端帳號。需要可用的提醒事項 App;伺服器會在需要時自動啟動它。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Remindersmcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
macos-mcp
MCP servers for macOS native apps — gives Claude Code, Claude Desktop, and any MCP client native access to Mail, Numbers, Contacts, Calendar, Reminders, and FaceTime / phone calls.
No API keys, no OAuth, no cloud services. Talks directly to macOS apps via AppleScript and URL schemes (tel://, facetime://). Runs locally on your Mac.
CUPS printing (
printmcp) used to live here; it moved to office-mcp since it's a shell wrapper, not an AppleScript bridge.
Servers
Mail (mailappmcp) — 21 tools
Works with every email account configured in Mail.app — iCloud, Gmail, Outlook, Fastmail, you name it.
Numbers (numbersmcp) — 29 tools
Works with any open Numbers spreadsheet.
Contacts (@aernoud/contactsmcp) — 15 tools
Works with the system address book — all accounts synced to Contacts.app.
Calendar (calendarmcp) — 25 tools
Works with every calendar configured in Calendar.app — iCloud, Google, Exchange, local, you name it.
Reminders (@aernoud/remindersmcp) — 22 tools
Works with every reminder list configured in Reminders.app — iCloud, Exchange, local, you name it.
FaceTime (facetimemcp) — 3 tools
Initiates calls by handing URL schemes to open. Phone calls require an iPhone paired via Continuity (so macOS can route them through your phone).
Phone numbers are normalized + validated as E.164 (+15551234567); spaces, dashes, and parens are tolerated. macOS may show a confirmation prompt before dialing — there is no fully silent dial path, by design.
Requirements
- macOS (uses AppleScript — won't work on Linux/Windows)
- Node.js 18+
Install
From npm
From source
Configure
Claude Code
Add to ~/.claude/settings.json or your project's .mcp.json:
Claude Desktop / Cowork
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
How it works
Each server runs locally over stdio. The Mail, Numbers, and Contacts servers build AppleScript strings, execute them via osascript, and parse the structured output back into JSON. The Print server shells out to CUPS (lp, lpstat, lpoptions, cancel); the FaceTime server hands tel:// / facetime:// URLs to open. A shared package (@mailappmcp/shared) provides the AppleScript runner, the generic command runner (runCommand), string escaping, and delimiter-based parsing.
App lifecycle — leave as found
Mail, Calendar, Contacts, and Reminders need their respective app running to respond to AppleScript. Rather than requiring you to keep those apps open, each server auto-launches them on first use and cleans up afterwards:
- On the first tool call that touches an app, the server checks (via
pgrep) whether the app is already running. If not, it launches it in the background (open -g -a) without stealing focus, and waits up to 5 seconds for the app to accept AppleEvents before running the tool. - That state is remembered in-process for the lifetime of the MCP server. Subsequent tool calls against the same app skip the probe and reuse the running app — no repeated launch penalty.
- On server shutdown (SIGTERM / SIGINT / SIGHUP / normal exit — e.g. when Claude Desktop disconnects the server or the chat ends), the server quits only the apps it launched. Apps you had open before the server started are left alone.
- Edge case: if the server is force-killed (
SIGKILL), the exit handler can't run, so any auto-launched apps stay running. Same as if you'd never had the server.
This means you can use the tools without worrying about a pile of half-launched apps lingering after the session, and without the servers killing apps you were actively using.
Safety
compose-messageopens a visible draft — you review before sendingsend-messageis a separate, explicit actionreply-to-messageandforward-messagedefault to draft mode (sendImmediately: false)delete-messagesmoves to Trash (standard Mail.app behavior)
HTML email
compose-message and send-message accept an optional htmlBody parameter. When supplied, the message is created as a rich-text/HTML message and the recipient sees rendered formatting (headings, bold, lists, clickable links) instead of raw tags. body is still required and is used as the plain-text fallback for clients that read plain content. Omit htmlBody for the existing plain-text behavior — fully backward compatible.
Under the hood, the HTML path for compose-message / send-message uses JXA (osascript -l JavaScript) and Mail.app's runtime htmlContent setter on outgoing messages. The plain-text path still uses ordinary AppleScript.
Branded replies that thread correctly
reply-to-message also accepts htmlBody, producing a reply that is both branded and correctly threaded. Mail's scripting model can't set arbitrary RFC headers, and an outgoing reply's rich-text editor isn't writable via the AppleScript content property — so neither tool alone could do both before. The reply tool now:
- invokes Mail's native
replyverb, which constructs the reply and populates theIn-Reply-To/Referencesheaders (these are message properties, independent of the body), then - puts the branded HTML on the pasteboard as
public.htmland pastes it (Cmd-V) above the auto-quoted thread.
The result renders the branding inline, keeps the quoted thread, and carries the threading headers strict clients (Outlook, Gmail web) require to nest the reply.
Constraints:
htmlBodyandattachmentscannot be combined on a reply (Mail re-parses the HTML during MIME multipart composition and corrupts the rendered body) — the tool returns an error if both are passed. Send the branded reply first, then attach files in a separate reply.- When
htmlBodyis supplied, the plain-textbodyis ignored; Mail derives the plain-text MIME alternative from the pasted rich text. - Pasting requires Mail to hold focus briefly; the script aborts safely (and restores your clipboard) if focus is lost.
Verifying an HTML / branded reply
After producing a branded reply, confirm both halves actually work:
- Render check — open the draft Mail created. The branding should appear as formatted rich text (headings, bold, links), not raw
<tags>, sitting above the quoted original. - Threading / header check — send the reply to a recipient on a strict client (Outlook or Gmail web) and confirm it nests inside the original conversation rather than appearing as a loose message. Equivalently, run
get-message-sourceon the sent reply and verify it carriesIn-Reply-To:andReferences:headers pointing at the original Message-ID. - Clipboard check — confirm your clipboard holds its prior contents afterwards (the tool saves and restores it around the paste).
- Attachment guard — calling
reply-to-messagewith bothhtmlBodyandattachmentsshould return a clear error, not a corrupted draft.
Known limitations
General
osascripthas a 30-second timeout per call- Apps are auto-launched on first use and quit on server shutdown if they weren't running beforehand — see App lifecycle
- For Mail tools taking
messageIdormessageIds, prefer the numeric stringidfromsearch-messages. RFCmessageIdvalues remain supported, but comparing them loads message headers across the mailbox and can leave Mail busy even after the 30-second timeout. Local IDs are specific to this Mac's Mail library; search again after moving a message or rebuilding the library. content containssearches in AppleScript can be slow on large mailboxes — Mail server searches subject and sender by default
Numbers
- Numbers tools require an open document
Calendar
These are limitations of Calendar.app's AppleScript interface itself, not the MCP server:
- Calendars cannot be deleted via AppleScript.
delete calendarraises-10000(AppleEvent handler failed) on every modern macOS version. Thedelete-calendartool checks that the calendar exists and then returns a descriptive error — you must remove calendars manually from the Calendar.app sidebar (right-click → Delete). - Calendars have no usable id/uid. Calendar.app's
calendarclass does not expose a stable id via AppleScript (uid ofraises-10000). All calendar tools therefore identify calendars by name — make sure your calendar names are unique. whosefilters are O(n) over events. AppleScript scans every event in a calendar to evaluatewhose start date ≥ Xpredicates. On a busy multi-calendar store, even an empty 7-day query across all calendars can take 60+ seconds and exceed the 30 sosascripttimeout. Always pass acalendarNametolist-events,search-events,today-events, andupcoming-eventswhen possible to scope the scan.search-eventsadditionally enforces a date window (default: −30 days to +365 days).move-eventreassigns the uid. Calendar.app cannot reparent an event between calendars. The tool deletes the source event and creates a new one in the target calendar; the new event has a fresh uid (returned asnewUidalongsideoldUid).- Recurrence is exposed as raw RRULE strings (e.g.
FREQ=WEEKLY;INTERVAL=1) — read and write only, no parsing or expansion.
License
MIT
來源:README.md,提交 7d81133
工具
0版本歷史
1- v0.2.0最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分