Apple Calendar and Reminders MCP server: Personal calendar via Google Calendar API, Family Calendar and Reminders via native EventKit
Project description
apple-eventkit-tools
Apple Calendar and Reminders MCP server for Claude Code. Reads and writes calendar events and reminders natively through macOS EventKit via PyObjC - no API keys, no credentials, no CalDAV setup.
Talks directly to the CalendarAgent daemon. Calendar.app and Reminders.app do not need to be running. Works with all providers configured in macOS: iCloud, Exchange, Google, subscriptions, and local calendars.
macOS only - requires EventKit framework.
This package merges the former ical-tools and reminders-tools into a single package backed by a shared EventKit base class.
Setup
From Source
git clone https://github.com/mrlesmithjr/mcp.git
cd mcp/packages/apple-eventkit-tools
uv tool install --editable .
On first use, macOS will prompt your terminal app for Calendar and Reminders access. Grant both in System Settings > Privacy & Security.
MCP Server
Register as a Claude Code MCP server:
claude mcp add -s user apple-eventkit-tools -- apple-eventkit-mcp
MCP Tools: Calendar (10)
Read
| Tool | Description |
|---|---|
list_calendars |
All calendars with type, color, and modification status |
list_events |
Events in a date range, optional calendar filter |
today_agenda |
Quick view of today's events |
upcoming_events |
Events in the next N days (default: 7) |
event_search |
Search events by title across a date range |
Write
| Tool | Description |
|---|---|
create_event |
Create event with location, notes, alarms, URL |
update_event |
Update any field, supports recurring event span |
delete_event |
Delete single or future recurring occurrences |
Analysis
| Tool | Description |
|---|---|
find_free_time |
Find available time slots in a date range |
event_conflicts |
Find overlapping/conflicting events with overlap duration |
MCP Tools: Reminders (9)
Lists
| Tool | Description |
|---|---|
reminder_lists |
List all reminder lists with IDs, colors, and modification status |
reminder_list |
List reminders (all or by list), with optional completed filter |
Create and Modify
| Tool | Description |
|---|---|
reminder_create |
Create a reminder with due date, time, notes, priority, and recurrence |
reminder_update |
Update title, due date, time, notes, or priority |
reminder_complete |
Mark a reminder as completed |
reminder_uncomplete |
Mark a completed reminder as incomplete |
reminder_delete |
Delete a reminder |
Search and Analysis
| Tool | Description |
|---|---|
reminder_search |
Search reminders by title or notes text (case-insensitive) |
reminder_overdue |
Find past-due incomplete reminders, sorted by most overdue first |
Entry Points
Three command names are available - all run the same server:
| Command | Purpose |
|---|---|
apple-eventkit-mcp |
Canonical entry point for new installations |
ical-mcp |
Backward-compatible alias for existing ical-tools registrations |
reminders-mcp |
Backward-compatible alias for existing reminders-tools registrations |
How It Works
EventKit is Apple's native framework for calendar and reminder access. The same framework powers Calendar.app and Reminders.app. PyObjC bridges it to Python, giving full read/write access to all calendars and reminder lists configured in macOS.
No network requests are made. All data comes from the local CalendarAgent daemon, which syncs with iCloud (or other providers) in the background.
Requirements
- macOS 12+ (Monterey or later)
- Python 3.11+
- Terminal app granted Calendar and Reminders access (TCC permissions)
Project Structure
apple_eventkit_tools/
├── __init__.py # Package init
├── __main__.py # python -m entry
├── base.py # EventKitBase: shared store init and _request_access
├── utils.py # Shared date/color conversion utilities
├── calendar.py # CalendarManager (10 calendar operations)
├── reminders.py # RemindersManager (9 reminders operations)
└── mcp_server.py # FastMCP server (19 tools, JSON output)
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mrlesmithjr_mcp_apple_eventkit_tools-0.2.3.tar.gz.
File metadata
- Download URL: mrlesmithjr_mcp_apple_eventkit_tools-0.2.3.tar.gz
- Upload date:
- Size: 38.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e2a152d0c542e88f00771cda60a024d9b97463925dcf552f38b1033a5bce7c5
|
|
| MD5 |
13cc005d383976425fffecdeb5b83d62
|
|
| BLAKE2b-256 |
27773ecb52c5c0f1388e869a2a56c717b27762ef4bb2a4b0b5b27dc4b502335e
|
File details
Details for the file mrlesmithjr_mcp_apple_eventkit_tools-0.2.3-py3-none-any.whl.
File metadata
- Download URL: mrlesmithjr_mcp_apple_eventkit_tools-0.2.3-py3-none-any.whl
- Upload date:
- Size: 30.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6e3dfe2076f488e40971f692feb98571ce54e4ffc44018735df0c3bda5fbf1c
|
|
| MD5 |
fbc44bd99a8e50b67208cc66241498a8
|
|
| BLAKE2b-256 |
5a0d2d88b179110b1e738be71fc9e52ee253ac33b875395b9745fc8b96bd7f40
|