icloud-calendar-mcp
Allows interaction with iCloud Calendar over CalDAV, providing tools to list calendars and events, retrieve event details, create events, update events, and delete events. It supports recurring events, all-day events, timezone handling, and an optional read-only mode.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@icloud-calendar-mcp Add lunch with Sam this Friday at noon to my Work calendar"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
icloud-calendar-mcp
An MCP server that lets an AI assistant read, add, change and delete events in your iCloud (Apple) Calendar. It talks to iCloud over CalDAV, so it runs anywhere (Linux, containers, macOS) without EventKit or AppleScript.
Tools:
list_calendars,list_events,get_event,create_event,update_event,delete_eventTransports: stdio (default) and SSE with a required bearer token
Optional read-only mode
Configuration through environment variables only; secrets are never logged
Create an app-specific password
The server signs in with your Apple ID and an app-specific password, never your Apple ID password.
Sign in at account.apple.com.
Open Sign-In and Security → App-Specific Passwords.
Create one named e.g.
calendar-mcpand copy it.
Revoke it from the same page at any time.
Related MCP server: Apple Calendar MCP
Install
Docker
docker run --rm -i \
-e ICLOUD_APPLE_ID=user@example.com \
-e ICLOUD_APP_PASSWORD=abcd-efgh-ijkl-mnop \
ghcr.io/hrsather/icloud-calendar-mcp:latestImages are published for linux/amd64 and linux/arm64, tagged X.Y.Z, X.Y and latest. Pin
an exact version in production.
From source
uvx --from git+https://github.com/hrsather/icloud-calendar-mcp icloud-calendar-mcpor
git clone https://github.com/hrsather/icloud-calendar-mcp
cd icloud-calendar-mcp
uv sync
uv run icloud-calendar-mcpConfiguration
Variable | Required | Description |
| yes | Apple ID email |
| yes | App-specific password |
| sse only | Token clients must send as |
| no |
|
| no | IANA timezone applied to times without an offset (default |
Each of ICLOUD_APPLE_ID, ICLOUD_APP_PASSWORD and MCP_BEARER_TOKEN also accepts a _FILE
variant (for example ICLOUD_APP_PASSWORD_FILE=/run/secrets/app_password) for container secrets.
Command line: --transport stdio|sse (default stdio), --host (default 127.0.0.1), --port
(default 8080), --version.
Client configuration
Claude Desktop
{
"mcpServers": {
"icloud-calendar": {
"command": "uvx",
"args": ["--from", "git+https://github.com/hrsather/icloud-calendar-mcp", "icloud-calendar-mcp"],
"env": {
"ICLOUD_APPLE_ID": "user@example.com",
"ICLOUD_APP_PASSWORD": "abcd-efgh-ijkl-mnop"
}
}
}
}Claude Code
claude mcp add icloud-calendar \
-e ICLOUD_APPLE_ID=user@example.com \
-e ICLOUD_APP_PASSWORD=abcd-efgh-ijkl-mnop \
-- uvx --from git+https://github.com/hrsather/icloud-calendar-mcp icloud-calendar-mcpAny MCP client over SSE
Run the server where the client can reach it:
docker run -p 8080:8080 \
-e ICLOUD_APPLE_ID=user@example.com \
-e ICLOUD_APP_PASSWORD=abcd-efgh-ijkl-mnop \
-e MCP_BEARER_TOKEN="$(openssl rand -hex 32)" \
ghcr.io/hrsather/icloud-calendar-mcp:latest --transport sse --host 0.0.0.0Point the client at http://<host>:8080/sse with the header Authorization: Bearer <token>.
The server speaks plain HTTP; put it behind TLS or keep it on a private network.
Tools
Tool | Description |
| Calendars that can hold events, with |
| Events in a range. |
| One event by UID. For a recurring event, the series and its |
| Create an event. A date-only |
| Change fields; omitted fields are untouched, |
| Delete an event |
Events are identified by UID. Updating or deleting a recurring event acts on the whole series.
Times without an offset use the configured timezone, and times are returned in that timezone.
Errors are returned as plain strings (for example event not found: 'abc').
Security notes
The app-specific password grants access to your calendars (and, to Apple, other iCloud services that accept app passwords). Keep it in an environment variable or a secret store.
The SSE transport refuses to start without
MCP_BEARER_TOKENand does not terminate TLS.Use
ICLOUD_MCP_READ_ONLY=trueif the assistant should only read.Secrets are never logged. The container runs as a non-root user.
Known limits
Only calendars that support events are exposed; Reminders and other collections are ignored.
Shared and subscribed calendars may be read-only or behave differently on iCloud's side; CalDAV errors are passed through as short messages.
iCloud may rate-limit heavy use.
Other CalDAV providers may work but are untested and unsupported.
License
MIT, see LICENSE.
Available Tools
6 toolscreate_eventA
Create an event in calendar (name or id). A date-only start makes an all-day
event. end defaults to one hour (or one day) after start. rrule is an optional
iCalendar recurrence rule such as FREQ=WEEKLY;COUNT=4. Naive times use the server's
default timezone.
Inputs: start (required), summary (required), calendar (required), end, +3 more. Returns: object
delete_eventA
Delete an event by UID. For a recurring event this deletes the whole series.
Inputs: uid (required), calendar. Returns: object
get_eventA
Get one event by UID. For a recurring event this returns the series, including its RRULE.
Inputs: uid (required), calendar. Returns: object
list_calendarsA
List the calendars that can hold events, with their id and name.
Inputs: no named parameters. Returns: result
list_eventsA
List events between start and end (ISO 8601 date or datetime; naive times use the
server's default timezone). A date-only end is inclusive. Omit calendar (name or id)
to search all calendars. Recurring events are expanded into individual occurrences, each
with the series UID.
Inputs: end (required), start (required), calendar. Returns: result
update_eventA
Update fields of an event by UID; omitted fields are unchanged and an empty string
clears location or description. Changing only start keeps the event's duration.
For a recurring event this changes the whole series.
Inputs: uid (required), end, start, summary, +3 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool targets a distinct calendar/event operation: listing calendars, listing events in a range, getting a single event, creating, updating, or deleting. The boundaries between list_events and get_event are clear from their descriptions, and the mutation tools are unambiguous.
All tool names follow a consistent snake_case verb_noun pattern: list_calendars, list_events, get_event, create_event, update_event, delete_event. There are no mixed conventions or vague names.
Six tools are well scoped for a calendar server, covering calendar discovery and full event CRUD without unnecessary bloat. Each tool has a clear role and earns its place.
The surface covers the core event lifecycle (create, read/list, update, delete) and calendar discovery. Minor gaps exist around calendar management, attendee/reminder handling, and per-occurrence recurring-event edits, but the main workflows are covered.
Maintenance
Related MCP Connectors
Connects ChatGPT to your Apple Calendar via a local Mac agent + Vercel relay
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
Create and update subscription calendars from ChatGPT, Claude, or Codex.
Connect Apple iCloud and Microsoft 365 mail, calendars, contacts and tasks to AI.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server for macOS that enables AI assistants to read and manage Apple Calendar events via EventKit, with configurable permissions, audit logging, and a native setup app.MIT
- AlicenseNot gradedqualityNot gradedmaintenanceEnables compatible AI assistants to remotely read and write iCloud calendars, including searching events, checking availability, creating or editing events, responding to invitations, and handling recurring schedules and time zones. It runs headlessly in a Cloudflare account with configurable per-client permissions.24 npmMIT
- AlicenseNot gradedqualityNot gradedmaintenanceEnables compatible AI assistants to remotely read and write iCloud calendars through a self-hosted Cloudflare deployment, with configurable permissions, availability search, and event management including recurring events and invitations.24 npmMIT
- AlicenseNot gradedqualityNot gradedmaintenanceGives compatible AI assistants remote HTTPS access to a single Apple Account's iCloud calendars, running headlessly in the user's own Cloudflare deployment. Supports read-only or read-write permissions for searching events, checking availability, and creating, editing, deleting, or responding to invitations, including recurring events, time zones, and locations.24 npmMIT