Skip to main content
Glama
icloud-calendar-mcp
by hrsather

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_event

  • Transports: 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.

  1. Sign in at account.apple.com.

  2. Open Sign-In and Security → App-Specific Passwords.

  3. Create one named e.g. calendar-mcp and 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:latest

Images 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-mcp

or

git clone https://github.com/hrsather/icloud-calendar-mcp
cd icloud-calendar-mcp
uv sync
uv run icloud-calendar-mcp

Configuration

Variable

Required

Description

ICLOUD_APPLE_ID

yes

Apple ID email

ICLOUD_APP_PASSWORD

yes

App-specific password

MCP_BEARER_TOKEN

sse only

Token clients must send as Authorization: Bearer <token>

ICLOUD_MCP_READ_ONLY

no

true hides create_event, update_event and delete_event

ICLOUD_MCP_TIMEZONE / TZ

no

IANA timezone applied to times without an offset (default UTC), e.g. Europe/London

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-mcp

Any 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.0

Point 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

list_calendars

Calendars that can hold events, with id and name

list_events(start, end, calendar?)

Events in a range. start/end are ISO 8601 (a date-only end is inclusive); omit calendar (name or id) to search all. Recurring events are expanded into occurrences

get_event(uid, calendar?)

One event by UID. For a recurring event, the series and its rrule

create_event(calendar, summary, start, end?, location?, description?, rrule?)

Create an event. A date-only start creates an all-day event; end defaults to +1 hour (or +1 day); rrule is e.g. FREQ=WEEKLY;COUNT=4

update_event(uid, calendar?, summary?, start?, end?, location?, description?)

Change fields; omitted fields are untouched, "" clears location or description. Changing only start keeps the duration

delete_event(uid, calendar?)

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_TOKEN and does not terminate TLS.

  • Use ICLOUD_MCP_READ_ONLY=true if 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 tools
create_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

    A4/5.0

    Scored across 6 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A 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
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables 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 npm
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables 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 npm
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Gives 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 npm
      MIT