MCP server for iCloud (Apple) Calendar access via CalDAV
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
An MCP (Model Context Protocol) server that gives AI assistants access to iCloud Calendar via CalDAV, with security controls aligned with the OWASP MCP Top 10.
[!CAUTION] Never use your main Apple ID password. This server requires an app-specific password which can be revoked independently without affecting your Apple ID.
get_events and create_event return an opaque handle that references an event across sessions and process restarts, so editing or deleting one needs no re-listing.| Tool | Description | Read-Only | Destructive |
|---|---|---|---|
list_calendars | List all calendars from iCloud account | Yes | No |
get_events | Get events within a date range from a calendar | Yes | No |
create_event | Create a new calendar event | No | No |
update_event | Update an event (whole series or a single occurrence) | No | No |
delete_event | Delete an event (whole series or a single occurrence) | No | Yes |
| Resource | Description |
|---|---|
calendar://calendars | Browse available calendars |
User-initiated templates that guide Claude through a multi-step task:
| Prompt | Description |
|---|---|
schedule_meeting | Draft an event from a title, attendees, and duration, then create it |
reschedule | Move an existing event by looking it up, then editing it |
find_conflicts | List a day's events and report overlapping time slots |
Choose your preferred installation method:
[!IMPORTANT] Every option runs the same Java build. Java 21 or newer must be on your
PATH, including fornpxanduvx. Those wrappers download and launch the JAR; they do not replace the JVM.
Set your iCloud credentials as environment variables:
Security Note: Use an app-specific password, not your main Apple ID password.
Add to your Claude Desktop configuration:
| Platform | Config Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Linux | ~/.config/claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
Once configured, you can ask Claude:
No parameters required.
| Parameter | Type | Required | Description |
|---|---|---|---|
calendar_id | string | Yes | Calendar identifier (from list_calendars) |
start_date | string | Yes | Start date (YYYY-MM-DD) |
end_date | string | Yes | End date (YYYY-MM-DD) |
Behavior to know about:
start_date and end_date select whole UTC calendar days: start_date at 00:00 UTC through the end of end_date in UTC. Timed events return UTC startTime/endTime instants; all-day events return a plain YYYY-MM-DD. To resolve a user's day in another timezone, request one extra day on each side and keep the events whose start, converted to that zone, falls on the wanted day; all-day events are floating dates and need no conversion.end_date must not precede start_date. The response is capped at 1000 events, and a single recurring series that expands to too many occurrences is rejected. If you hit a cap, query a week or a month at a time.handle and a recurrenceId that identifies the instance.get_events for a short window. This is CDN indexing lag, not a deletion, so do not recreate it.Each result includes uid, handle, summary, isAllDay, and startTime/endTime (timed) or startDate/endDate (all-day), plus any of description, location, rrule, recurrenceId, status, url, categories, priority, organizer, attendeeCount that are set.
| Parameter | Type | Required | Description |
|---|---|---|---|
calendar_id | string | Yes | Target calendar |
title | string | Yes | Event title |
start_time | string | Cond. | ISO 8601 datetime for a timed event. A naive value (2026-01-15T09:00:00) is read as UTC unless timezone is set; a Z or offset value is an absolute instant that overrides timezone |
end_time | string | Cond. | ISO 8601 datetime for a timed event (same rules as start_time) |
start_date | string | Cond. | Start date YYYY-MM-DD for an all-day event |
end_date | string | Cond. | End date YYYY-MM-DD, inclusive, for an all-day event |
is_all_day | boolean | No | All-day event flag |
description | string | No | Event description |
location | string | No | Event location |
timezone | string | No | IANA timezone for a timed event (e.g., America/New_York) |
end_timezone | string | No | IANA timezone for the end when it differs from the start (e.g., a flight). Falls back to timezone |
rrule | string | No | Recurrence rule (e.g., FREQ=WEEKLY;BYDAY=MO) |
rdates | string[] | No | Extra occurrence dates (RFC 5545 RDATE) |
exdates | string[] | No | Excluded occurrence dates (RFC 5545 EXDATE) |
alarms | object[] | No | Reminders on the event (see Alarms) |
Only the fields you pass are changed.
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/icloud-calendar-mcp)<a href="https://allmcps.com/mcp/icloud-calendar-mcp"><img src="https://allmcps.com/api/badge/icloud-calendar-mcp?style=directory" alt="Icloud Calendar MCP on AllMCPs" /></a>