macOS Calendar & Reminders MCP server (24 tools). Native Swift EventKit, iCloud/Google/Exchange.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Give Claude native control of macOS Calendar and Reminders. A Swift MCP server built directly on EventKit β 29 tools for events, reminders, tags, batch operations, conflict detection, and undo/redo. Not just calendar events: it drives Reminders and tasks too.
Claude Code β register this repo as a marketplace, then install the plugin. The plugin bundles the /today, /week, /quick-event, /remind slash commands and a PreToolUse hook that verifies day-of-week on every event write:
Claude Desktop β download the latest .mcpb from Releases and double-click to install.
Standalone MCP β the 29-tool server on its own, no plugin extras:
On first use, macOS prompts for Calendar and Reminders access β click Allow. Building from source, upgrading in place, or running under SSH / launchd / VS Code? See Installation for the full guide.
| Feature | Other Calendar MCPs | che-ical-mcp |
|---|---|---|
| Calendar Events | Yes | Yes |
| Reminders/Tasks | No | Yes |
| Reminder #Tags | No | Yes (MCP-level) |
| Multi-keyword Search | No | Yes |
| Duplicate Detection | No | Yes |
| Conflict Detection | No | Yes |
| Batch Operations | No | Yes |
| Local Timezone | No | Yes |
| Source Disambiguation | No | Yes |
| Create Calendar | Some | Yes |
| Delete Calendar | Some | Yes |
| Event Reminders | Some | Yes |
| Location & URL | Some | Yes |
| Language | Python | Swift (Native) |
| Tool | Description |
|---|---|
list_calendars | List all calendars and reminder lists (includes source_type) |
create_calendar | Create a new calendar |
delete_calendar | Delete a calendar |
update_calendar | Rename a calendar or change its color (v0.9.0) |
| Tool | Description |
|---|---|
list_events | List events with filter/sort/limit (v1.0.0) |
create_event | Create an event (with reminders, location, URL, per-event timezone, recurrence with excluded dates) |
update_event | Update an event (including timezone, recurrence, span for recurring) |
delete_event | Delete an event (with occurrence support for recurring) |
Recurrence exclusions (#182):
create_event(and eachcreate_events_batchitem) acceptsrecurrence.excluded_occurrence_datesto skip specific dates in a recurring series at creation time β applied with best-effort all-or-nothing semantics (any failure removes the entire new series via compensating delete; rollback failure is reported, never silent; the first occurrence cannot be excluded), and oneundoremoves the whole series including exclusions. Known limitation: on idempotent retry, a duplicate recurring series with every requested date already absent isskipped, but extra exclusions already present on the existing series (beyond those requested) are not detected.
| Tool | Description |
|---|---|
list_reminders | List reminders with filter/sort/limit, tags extraction (v1.0.0) |
create_reminder | Create a reminder with due date, tags (v1.3.0) |
update_reminder | Update a reminder (including tags, clear_due_date) (v1.3.0) |
complete_reminder | Mark as completed/incomplete |
delete_reminder | Delete a reminder |
search_reminders | Search reminders by keyword(s) or tag (v1.3.0) |
list_reminder_tags | List all unique tags with usage counts (v1.3.0) |
cleanup_completed_reminders | Delete all completed reminders in one call, dry_run preview by default (v1.7.2) |
Recurring reminders (#194): list/search include has_recurrence, complete public recurrence_rules, and precision-aware due. Completion adds operation (write outcome) and next_occurrence (confirmed/unknown/not_applicable). Use operation.status rather than legacy is_completed: a successful completion may leave the next occurrence incomplete. Unknown successor information must not trigger a second write. A different-ID or unconfirmable successor is reported as unknown, never as the series having ended. Undo of a recurring completion is identity-guarded (#204): once the identifier no longer resolves to the recorded occurrence it refuses explicitly and drops its history entry instead of jamming the stack. Breaking (#205): completed must be a JSON boolean on complete_reminder / list_reminders / search_reminders β strings and numbers are rejected; omit or null keeps the old meaning. See response contract and limitations.
| Tool | Description |
|---|---|
search_events | Search events by keyword(s) with AND/OR matching |
list_events_quick | Quick shortcuts: today, tomorrow, this_week, next_7_days, etc. |
create_events_batch | Create multiple events at once (with per-event timezone) |
check_conflicts | Check for overlapping events in a time range |
copy_event | Copy an event to another calendar (with optional move) |
move_events_batch | Move multiple events to another calendar |
delete_events_batch | Delete events by IDs or date range, with dry-run preview (v1.0.0) |
find_duplicate_events | Find duplicate events across calendars (v0.5.0) |
create_reminders_batch | Create multiple reminders at once (v0.9.0) |
delete_reminders_batch | Delete multiple reminders at once (v0.9.0) |
| Tool | Description |
|---|---|
undo | Undo the most recent calendar/reminder operation |
redo | Redo the last undone operation |
undo_history | List undoable operations with timestamps |
The quick paths live at the top of this README. This is the full reference β manual config, source builds, permission edge cases, in-place upgrades, and CLI mode.
One-click (recommended): download the latest che-ical-mcp-<version>.mcpb from Releases, double-click, and restart Claude Desktop.
Manual config: download the binary, then point claude_desktop_config.json at it.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json, then restart Claude Desktop:
/plugin marketplace add PsychQuant/che-ical-mcp and /plugin install che-ical-mcp@che-ical-mcp work the same way.owner/repo), not a raw marketplace.json URL β the plugin source is a same-repo relative path (./plugin) that only resolves when added via Git.psychquant-claude-plugins aggregator (claude plugin install che-ical-mcp@psychquant-claude-plugins); both serve the same versioned binary.~/bin/CheICalMCP on first use if it isn't already there.π‘ Tip: Keep the binary in a local directory like
~/bin/. Cloud-synced folders (Dropbox, iCloud, OneDrive) can trigger MCP connection timeouts when sync touches the file.
β οΈ Swift 6 / Xcode 18 users: Don't run
swift builddirectly β the upstream MCP SDK has a concurrency error (swift-sdk#214). The Makefile auto-detects this and falls back to Swift 5 language mode.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/macos-calendar-reminders)<a href="https://allmcps.com/mcp/macos-calendar-reminders"><img src="https://allmcps.com/api/badge/macos-calendar-reminders?style=directory" alt="MacOS Calendar & Reminders on AllMCPs" /></a>