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
}No comments yet. Be the first to share your thoughts!
30 days in the Featured rail · terms & refunds
English | 简体中文
A Model Context Protocol (MCP) server that provides native integration with Apple Reminders and Calendar on macOS. This server allows you to interact with Apple Reminders and Calendar Events through a standardized interface with comprehensive management capabilities.
[!NOTE] Looking ahead: event — a pure Swift CLI for Apple Reminders and Calendar on macOS.
For scripting, automation, and direct terminal usage, we now recommend the standalone
eventCLI. It exposes the same EventKit-backed reminder/calendar/list/subtask/tag operations this server uses today, with first-class Markdown and JSON output. Future versions ofmcp-server-apple-eventsare planned to depend on theeventCLI in place of the bundledEventKitCLIbinary, so both projects can share a single, well-tested Swift implementation.
Apple now separates Reminders and Calendar permissions into write-only and full-access scopes. The Swift bridge declares the following privacy keys so Claude can both read and write data when you approve access:
NSRemindersUsageDescriptionNSRemindersFullAccessUsageDescriptionNSRemindersWriteOnlyAccessUsageDescriptionNSCalendarsUsageDescriptionNSCalendarsFullAccessUsageDescriptionNSCalendarsWriteOnlyAccessUsageDescriptionWhen the CLI detects a notDetermined authorization status it calls requestFullAccessToReminders / requestFullAccessToEvents, which in turn triggers macOS to show the correct prompt. If the OS ever loses track of permissions, rerun ./check-permissions.sh to re-open the dialogs.
If a Claude tool call still encounters a permission failure, see Desktop MCP clients below for the responsible-process attribution problem and the recommended workarounds.
If you see Failed to read calendar events, verify Calendar is set to Full Calendar Access:
System Settings > Privacy & Security > CalendarsYou can also re-run ./check-permissions.sh (it now validates both Reminders and Calendars access).
macOS attributes Reminders and Calendar access to the responsible process — the desktop app that launched the MCP server, not the EventKitCLI subprocess. For the EventKit prompt to appear, the responsible app's bundle must ship the NSRemindersUsageDescription / NSCalendarsUsageDescription keys (and on Sonoma+ the matching write-only or full-access variants). If those keys are missing, TCC refuses the request before EventKit is even reached, and the Swift CLI returns:
Reminder permission denied. Unknown error
— even though running the same binary from Terminal works. See issue #93 for the full TCC log; Codex Desktop today ships only NSAppleEventsUsageDescription, which is why it hits this wall.
This is a macOS-level constraint that an MCP server alone cannot resolve — the desktop client itself needs to declare those usage strings in its Info.plist. The workarounds below are about making the server usable while you wait for the upstream fix:
Reliable workaround — run the server from a terminal-based MCP client. Codex CLI, Claude Code, and similar terminal-launched clients inherit Terminal's (or iTerm2's) own kTCCServiceReminders / kTCCServiceCalendar grant, so EventKit calls succeed without changes to this server:
# from inside Terminal / iTerm2, where the responsible app holds the EventKit grants
codex
# or
claude
Partial workaround — AppleScript routing (only if the desktop app already declares NSAppleEventsUsageDescription). Running:
osascript -e 'tell application "Reminders" to get name of lists'
osascript -e 'tell application "Calendar" to get name of calendars'
triggers an Automation prompt (kTCCServiceAppleEvents) so the responsible app can control com.apple.reminders and com.apple.iCal. This does not create a kTCCServiceReminders / kTCCServiceCalendar grant on its own, so a Swift CLI that calls EventKit directly will still be refused if the host bundle is missing the usage strings. It only helps if your client can fall back to AppleScript end-to-end (this server does not today).
Verification command
pnpm test -- src/swift/Info.plist.test.ts
The test suite ensures all required usage-description strings are present before shipping the binary.
could not build module 'Foundation' on macOS 26 (Tahoe)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. The macOS 26+ SDK ships a Foundation.swiftinterface that needs Swift 6.3 or newer; the Command Line Tools that shipped with the first macOS 26 point releases include Swift 6.2.x, which cannot parse it. See issue #85.
pnpm build:swift now detects this mismatch and prints the same remediation, but if you hit it manually:
softwareupdate --list
sudo softwareupdate -i "Command Line Tools for Xcode-<latest>"
xcode-select at the full Xcode:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
Verify with:
xcrun swiftc --version # should report Apple Swift version 6.3 or newer
xcrun --show-sdk-version # should match your macOS major version
You can run the server directly using npx:
npx mcp-server-apple-events
Open Cursor
Open Cursor settings
Click on "MCP" in the sidebar
Click "Add new global MCP server"
Configure the server with the following settings:
{
"mcpServers": {
"apple-reminders": {
"command": "npx",
"args": ["-y", "mcp-server-apple-events"]
}
}
}
stdioapple-remindersmcp-server-apple-eventsYou need to configure Claude Desktop to recognize the Apple Events MCP server. There are two ways to access the configuration:
claude_desktop_config.jsonFor macOS:
code ~/Library/Application\ Support/Claude/claude_desktop