Apple Reminders

by fradser

155 stars
558 downloads
Not rated
GitHub

About

A server for native integration with Apple Reminders on macOS.

Details

Author
fradser
GitHub stars
155
Downloads
558
Categories
Productivity, Project Management, Other
Tags
#macos

- Full CRUD for reminders and calendar events
- Priority, tags, subtasks, and completion tracking
- Multi-criteria search and smart organization
- Native macOS EventKit integration with permission management
- Flexible date formats and Unicode support
- Clean architecture with TypeScript and Zod validation

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Apple Reminders
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Run the server directly using npx mcp-server-apple-events. It requires macOS and Node.js 20 or later. Configure it as an MCP server in compatible clients (e.g., Cursor, Claude Desktop) by adding the command to your MCP configuration.

reminders_tasks

Manages reminder tasks. Supports reading, creating, updating, and deleting reminders. Alarms, recurrence rules, and location-based triggers are read-only via this tool; configure them in Reminders.app.

reminders_lists

Manages reminder lists. Supports reading, creating, updating, and deleting reminder lists.

calendar_events

Manages calendar events (time blocks). Supports reading, creating, updating, and deleting events. URL, structured-location, all-day toggle, availability, alarms, and recurrence rules are read-only via this tool; configure them in Calendar.app. All-day events are inferred from the date format ("YYYY-MM-DD" without a time component).

calendar_calendars

Reads calendar collections. Use to inspect available calendars before creating or updating events. Optional date range filters return only calendars with events in that range.

reminders_subtasks

Manages subtasks/checklists within reminders. Subtasks are stored in the notes field and visible in the native Reminders app. Use this to create checklist items for a reminder.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "apple reminders": {
            "mcp-server-apple-reminders": {
                "command": "npx",
                "args": [
                    "mcp-server-apple-events"
                ]
            }
        }
    }
}

McpServers

{
    "mcp-server-apple-reminders": {
        "command": "npx",
        "args": [
            "mcp-server-apple-events"
        ]
    }
}

A server for native integration with Apple Reminders on macOS.

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 standaloneeventSwift CLI, vendored as a git submodule and built intobin/eventduringpnpm install— no separatebrew installrequired. Seedocs/migration-to-event-cli.mdfor the v1.5.0 backend swap and the list of write fields not yet exposed byevent.

- Features
-
Prerequisites
-
Quick Start
-
Configuration
-
macOS Permissions
-
Usage Examples
-
Available MCP Tools
-
Structured Prompt Library
-
Development
-
License
-
Contributing

- Full CRUD for reminders, subtasks, reminder lists, and calendar events
- Priority (high/medium/low/none), tags, and checklist subtasks with progress tracking
- Multi-criteria filtering: completion, due-date range, priority, tags, full-text search, recurring, location-based
- Flexible date formats (YYYY-MM-DD,YYYY-MM-DD HH:mm:ss, ISO 8601) with timezone awareness
- Native macOS integration via EventKit — values configured in Reminders.app / Calendar.app round-trip through read responses
- Automatic macOS permission discovery and prompting
- Full Unicode support with comprehensive input validation

- Node.js 20 or later
- macOS(required for EventKit)
- Xcode Command Line Tools(only when building from source)
- pnpm(recommended)

The published npm package ships a pre-built, universal, code-signedbin/eventbinary, sonpxusers need neither Xcode nor a Swift toolchain. Building from a git clone requires the items above.

Add the server to your MCP client. Thenpxform works for every client below; for a local build, replacecommand/argswithnodepointing atdist/index.js.

Settings → MCP → Add new global MCP server:

{ "mcpServers": { "apple-reminders": { "command": "npx", "args": ["-y", "mcp-server-apple-events"] } } }

- Type:stdio
- ID:apple-reminders
- Command:mcp-server-apple-events
- Args: (empty)

Editclaude_desktop_config.json(open it via Settings → Developer Option → Edit Config, or directly at~/Library/Application Support/Claude/claude_desktop_config.jsonon macOS /%APPDATA%\Claude\claude_desktop_config.jsonon Windows):

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

See theofficial MCP docsfor connecting local servers. Restart Claude Desktop completely (quit, not just close) for changes to take effect.

The vendoredeventCLI embeds its own Info.plist (bundle idme.frad.event) declaring all Reminders and Calendar privacy strings, and is spawned through the bundledbin/event-disclaimshim, which disclaims TCC responsibility at spawn time. macOS therefore attributes the permission request toeventitself, not the app that launched the MCP server — so the first EventKit call prompts for "event", the grant appears underSystem Settings > Privacy & Security > Reminders / Calendarsasevent, and one grant covers every MCP client on the machine (Claude Desktop, Codex Desktop, Cursor, terminal clients, …). Seeissue #93for background.

Wheneventdetects anotDeterminedstatus it callsrequestFullAccessToReminders/requestFullAccessToEvents, which surfaces the system prompt. If the OS ever loses track of permissions, rerun./check-permissions.shto re-open the dialogs.

If you seeFailed to read calendar events, set Calendar toFull Calendar AccessunderSystem Settings > Privacy & Security > Calendars, or rerun./check-permissions.sh(it checks both Reminders and Calendars).

Recovering a stuck TCC state (no prompt ever appears)

If the permission dialog never appears andeventis missing fromSystem 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 doesnotwork — the bare form clears all entries, which is what clears the bad state):

tccutil reset Calendar tccutil reset Reminders

This clears Calendar/Reminders access foreveryapp; 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. Seeissue #83.

Headless / launchd runs hang instead of failing

When the server runs from a context with no GUI session (SSH, launchd agent/daemon), the first EventKit call can block forever waiting on a permission prompt that can never be rendered — the MCP request never settles and a child process leaks per call. The server now kills anyeventcall that exceeds 30 s (SIGKILL) and returns a readable error instead. Tune it with theEVENTKIT_CLI_TIMEOUT_MSenvironment variable (milliseconds; invalid/zero values fall back to the default — the timeout cannot be disabled, though huge values up to2^31-1ms are accepted). The vendoredeventCLI (pinned viaFradSer/event#15) additionally fails fast when no GUI session exists and gives up on an unanswerable prompt after 15 s (EVENT_PERMISSION_TIMEOUT_MS), reportingPermission denied: Timed out waiting for ...so the host can show a permission-specific message before the server's kill fires (15 s < 30 s). Seeissue #113.

macOS 26 (Tahoe)could not build module 'Foundation'

Ifpnpm buildfails withcould not build module 'Foundation'(orSDK is not supported by the compiler), your Swift toolchain is older than the macOS 26 SDK requires — it needsSwift 6.3 or newer, but the Command Line Tools shipped with early macOS 26 point releases include Swift 6.2.x.pnpm build:eventdetects this and prints the same remediation; seeissue #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 anactionfield plus action-specific parameters (the MCP client introspects the full Zod schema; only actions are listed here). Date fields acceptYYYY-MM-DD,YYYY-MM-DD HH:mm:ss(local time), or ISO 8601 with timezone.

{ "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": "read", "startDate": "2026-08-01", "endDate": "2026-08-31" }
{ "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: Shopping - ID: reminder-123 - Priority: high - Tags: #shopping #errands - Subtasks (1/3): - [x] Milk - [ ] Eggs - [ ] Bread - Due: 2024-03-25 18:00:00

Theurlfield is stored in the nativeurlproperty (visible via the "i" icon in Reminders.app) and also appended to the notes in a structuredURLs:block for parsing and multi-URL support. URLs accept any valid URI scheme (http,https,mailto,tel,obsidian,shortcuts, …);file,javascript,data, and similar dangerous schemes are rejected, and http(s) hostnames are checked against an SSRF blocklist.

Read-only fields: alarms, recurrence rules, location triggers, structured locations, calendarurl/availability/isAllDay, and cross-calendar moves are not writable via this server — they round-trip from values configured in Reminders.app / Calendar.app. Seedocs/migration-to-event-cli.mdfor the full dropped-field table and workarounds.

The server ships a prompt registry exposed via the MCPListPrompts/GetPromptendpoints. Each template shares a mission, context inputs, numbered process, constraints, output format, and quality bar so downstream assistants get predictable scaffolding.

- daily-task-organizer— optionaltoday_focus; produces a same-day execution blueprint, balances priority work with recovery, auto-creates calendar time blocks for due-today reminders.
- smart-reminder-creator— optionaltask_idea; generates an optimally scheduled reminder structure.
- reminder-review-assistant— optionalreview_focus(e.g.overdueor a list name); audits and optimizes existing reminders.
- weekly-planning-workflow— optionaluser_ideas; guides a Monday-through-Sunday reset with time blocks tied to existing lists.

Prompts are constrained to native Apple Reminders capabilities and ask for missing context before irreversible actions. Runpnpm test -- src/server/prompts.test.tsafter amending prompt copy.

pnpm install # postinstall builds bin/event from vendor/event on macOS pnpm build # TypeScript + vendored event CLI pnpm test # Jest suite: repositories, schemas, build script, prompt templates pnpm exec biome check # lint + format

The CLI entry point walks up to ten directories to findpackage.json, so the server can start from nested paths (e.g.dist/or editor task runners) without losingbin/event. Keep the manifest reachable within that depth if you customize the folder layout.

- pnpm build— TypeScript + vendoredeventCLI (required before running from source)
- pnpm build:ts— TypeScript only
- pnpm build:event— vendoredeventCLI only (swift build -c releasebin/event)
- pnpm build:release— build plus notarization (release packaging)
- pnpm test/pnpm test:ci— Jest suite / with coverage
- pnpm lint— Biome format/fix + TypeScript type check
- pnpm check— lint + tests with coverage

Contributions welcome! Please read the contributing guidelines first.

Native macOS Calendar & Reminders MCP server with 24 tools using Swift EventKit - supports recurring events, location triggers, search, batch operations

Apple Reminders CLI and MCP server with section support and iCloud sync - the only tool that can create, manage, and sync sections across devices

Manage your tasks and projects in Things 3 on macOS.

Manage tasks and projects in Things3 on macOS.

Integrate with the Things 3 to-do app on macOS.

Enables LLM clients to interact with macOS applications through AppleScript. Built using the @beyondbetter/bb-mcp-server library, this server provides safe, controlled execution of predefined scripts with optional support for arbitrary script execution.

Interact with task, doc, and project data in Dart, an AI-native project management tool

Remote MCP server for MeisterTask. Create and manage projects, tasks, and notes from your AI assistant. Hosted (streamable-HTTP) — connect at https://mcp.meistertask.com/mcp

Remote MCP server for MindMeister. Create, edit, and organize mind maps from your AI assistant. Hosted (streamable-HTTP) — connect at https://mcp.mindmeister.com/mcp

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.