by FradSer
MCP server providing native macOS integration with Apple Reminders and Calendar via EventKit
# Add to your Claude Code skills
git clone https://github.com/FradSer/mcp-server-apple-eventsGuides for using mcp servers skills like mcp-server-apple-events.
Last scanned: 5/30/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-30T16:24:39.491Z",
"npmAuditRan": true,
"pipAuditRan": true
}mcp-server-apple-events is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by FradSer. MCP server providing native macOS integration with Apple Reminders and Calendar via EventKit. It has 165 GitHub stars.
Yes. mcp-server-apple-events passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/FradSer/mcp-server-apple-events" and add it to your Claude Code skills directory (see the Installation section above).
mcp-server-apple-events is primarily written in TypeScript. It is open-source under FradSer on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh mcp-server-apple-events against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
English | 简体中文
A Model Context Protocol (MCP) server providing native integration with Apple Reminders and Calendar on macOS via the EventKit framework. Exposes reminders, lists, subtasks, and calendar events through a standardized interface with full CRUD operations.
The EventKit backend is the standalone event Swift CLI, vendored as a git submodule and built into bin/event during pnpm install — no separate brew install required. See docs/migration-to-event-cli.md for the v1.5.0 backend swap and the list of write fields not yet exposed by event.
YYYY-MM-DD, YYYY-MM-DD HH:mm:ss, ISO 8601) with timezone awarenessThe published npm package ships a pre-built, universal, code-signed bin/event binary, so npx users need neither Xcode nor a Swift toolchain. Building from a git clone requires the items above.
npx mcp-server-apple-events
Add the server to your MCP client. The npx form works for every client below; for a local build, replace command/args with node pointing at dist/index.js.
Settings → MCP → Add new global MCP server:
{
"mcpServers": {
"apple-reminders": {
"command": "npx",
"args": ["-y", "mcp-server-apple-events"]
}
}
}
Settings → Tools → "+", then:
stdioapple-remindersmcp-server-apple-eventsEdit claude_desktop_config.json (open it via Settings → Developer Option → Edit Config, or directly at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS / %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"apple-reminders": {
"command": "npx",
"args": ["-y", "mcp-server-apple-events"]
}
}
}
For a local build:
{
"mcpServers": {
"apple-reminders": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-apple-events/dist/index.js"]
}
}
}
See the official MCP docs for connecting local servers. Restart Claude Desktop completely (quit, not just close) for changes to take effect.
The vendored event CLI embeds its own Info.plist (bundle id me.frad.event) declaring all Reminders and Calendar privacy strings, and is spawned through the bundled bin/event-disclaim shim, which disclaims TCC responsibility at spawn time. macOS therefore attributes the permission request to event itself, not the app that launched the MCP server — so the first EventKit call prompts for "event", the grant appears under System Settings > Privacy & Security > Reminders / Calendars as event, and one grant covers every MCP client on the machine (Claude Desktop, Codex Desktop, Cursor, terminal clients, …). See issue #93 for background.
When event detects a notDetermined status it calls requestFullAccessToReminders / requestFullAccessToEvents, which surfaces the system prompt. If the OS ever loses track of permissions, rerun ./check-permissions.sh to re-open the dialogs.
If you see Failed to read calendar events, set Calendar to Full Calendar Access under System Settings > Privacy & Security > Calendars, or rerun ./check-permissions.sh (it checks both Reminders and Calendars).
If the permission dialog never appears and event is missing from System Settings → Privacy & Security → Reminders / Calendars, your machine is in a stale/misattributed TCC state. The server-side disclaim fix prevents this on a clean machine but cannot clear already-corrupted entries. Recovery:
Reset Calendar and Reminders TCC entries globally (per-app reset frequently does not work — the bare form clears all entries, which is what clears the bad state):
tccutil reset Calendar
tccutil reset Reminders
This clears Calendar/Reminders access for every app; other apps re-prompt next time.
Re-trigger the permission from inside a Claude conversation (Claude Desktop or Claude Code) by asking, e.g., "Use AppleScript to check my Calendar and Reminders." Grant access and the server should work normally. See issue #83.
could not build module 'Foundation'If pnpm build fails with could not build module 'Foundation' (or SDK is not supported by the compiler), your Swift toolchain is older than the macOS 26 SDK requires — it needs Swift 6.3 or newer, but the Command Line Tools shipped with early macOS 26 point releases include Swift 6.2.x. pnpm build:event detects this and prints the same remediation; see issue #85. Fix by installing Xcode 26.x from the App Store, or updating Command Line Tools to a Swift 6.3+ version:
softwareupdate --list
sudo softwareupdate -i "Command Line Tools for Xcode-<latest>"
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer # if full Xcode is installed
xcrun swiftc --version # should report Apple Swift version 6.3 or newer
Once configured, ask Claude to interact with your Apple Reminders and Calendar. Example prompts:
Create a reminder to "Buy groceries" for tomorrow at 5 PM with tags shopping and errands.
Add a high-priority reminder to "Finish quarterly report" due Friday in my "Work" list.
Create "Grocery shopping" with subtasks: milk, eggs, bread, butter.
Show me all high-priority reminders due today tagged "urgent".
Show subtasks for my "Grocery shopping" reminder and mark "milk" as complete.
Update "Buy groceries" — change the title to "Buy organic groceries" and set priority to high.
Show reminders from my "Work" list, and list all my reminder lists.
Create a calendar event "Team standup" tomorrow from 9:00 to 9:30 in "Work".
Show my calendar events for the next week.
The server processes natural-language requests, interacts with Apple's native Reminders and Calendar apps, and returns formatted results.
Alarms, recurrence rules, and location triggers are read-only via this server — configure them in Reminders.app / Calendar.app. They still appear in read results with visual indicators.
Service-scoped tools mirror Apple Reminders and Calendar domains. All take an action field plus action-specific parameters (the MCP client introspects the full Zod schema; only actions are listed here). Date fields accept YYYY-MM-DD, YYYY-MM-DD HH:mm:ss (local time), or ISO 8601 with timezone.
| Tool | Actions | Notes |
|---|---|---|
reminders_tasks |
read, create, update, delete |
Priority, tags, subtasks. startDate is set via update, not create. Cross-list moves unsupported. |
reminders_subtasks |
read, create, update, delete, toggle, reorder |
Stored in the notes field (human-readable in Reminders.app). |
reminders_lists |
read, create, update, delete |
Rename via name → newName. |
calendar_events |
read, create, update, delete |
All-day inferred from date format. Cross-calendar moves unsupported. span scopes recurring deletes. |
calendar_calendars |
read |
Calendars holding ≥1 event in the (optional) startDate/endDate window. |
Example calls:
{
"action": "create",
"title": "Buy groceries",
"dueDate": "2024-03-25 18:00:00",
"targetList": "Shopping",
"note": "Don't forget milk and eggs",
"priority": 1,
"tags": ["shopping", "errands"],
"subtasks": ["Milk", "Eggs", "Bread"]
}
{ "action": "read", "filterList": "Work", "dueWithin": "today", "filterPriority": "high", "filterTags": ["urgent"] }
{ "action": "update", "id": "reminder-123", "completed": false, "addTags": ["followup"] }
{ "action": "toggle", "reminderId": "reminder-123", "subtaskId": "a1b2c3d4" }
{ "action": "create", "name": "Project Alpha" }
{ "action": "create", "title": "Team standup", "startDate": "2026-05-04 09:00:00", "endDate": "2026-05-04 09:30:00", "targetCalendar": "Work" }
Read responses carry visual indicators: 🔄 recurring, 📍 location-based, 🏷️ has tags, 📋 has subtasks. Example:
- [ ] Buy groceries 🏷️📋
- List: