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
Metadata
Release files for mrlesmithjr-mcp-apple-eventkit-tools 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mrlesmithjr_mcp_apple_eventkit_tools-0.2.4.tar.gz | 39.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mrlesmithjr_mcp_apple_eventkit_tools-0.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 70.1 kB
Release files / mrlesmithjr_mcp_apple_eventkit_tools-0.2.4.tar.gz
| Download URL | mrlesmithjr_mcp_apple_eventkit_tools-0.2.4.tar.gz |
|---|---|
| Size | 39.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a5d07b8a0fdad17f6bef27c11e894b8c4d4f713474c7b8d0fb1ad2aedacb2b73
|
|
BLAKE2b-256 checksum How to use checksums |
39a8a33a66703c7ad40da21310ee93ea0891ec8d1756838a99c04c89b7fa4ec1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","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}
|
Release files / mrlesmithjr_mcp_apple_eventkit_tools-0.2.4-py3-none-any.whl
| Download URL | mrlesmithjr_mcp_apple_eventkit_tools-0.2.4-py3-none-any.whl |
|---|---|
| Size | 30.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e7b967c3a306bc0a005ad4720b50042ae1b94647684f311dfdefb3798a073e4d
|
|
BLAKE2b-256 checksum How to use checksums |
5904709bdc9522f422943cfca9329df3f54f42b040f6b5f4d9e19ae673edd120
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","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}
|