Skip to main content
Glama
icloud-calendar-mcp

icloud-calendar-mcp

by reinthal

Remote iCloud calendar MCP Server

uv Python 3.13+ FastMCP CalDAV Remote MCP server so Claude Code (or any MCP-compatible client) can manage calendar events directly you can deploy at https://horizon.prefect.io/.

Works with

  • Claude Code / Claude Desktop / Claude.ai

  • ChatGpt

  • Anything that supports Oauth MCP servers

Environment Variables

Variable

Required

Default

Description

ICLOUD_USERNAME

Yes

—

iCloud account email address

ICLOUD_PASSWORD

Yes

—

iCloud app-specific password

ICLOUD_CALENDAR

No

Alex Plugg

Name of the target iCloud calendar

Credentials are stored encrypted in secrets.env via SOPS + Age and loaded automatically by direnv.

Related MCP server: iCloud CalDAV MCP Connector

ICS Import (CLI)

Import an ICS file directly into iCloud:

uv run python main.py SchemaICAL.ics
# or, if inside the devenv shell:
import SchemaICAL.ics

Options:

usage: main.py [-h] [--username USERNAME] [--password PASSWORD] [--calendar CALENDAR] ics_file

positional arguments:
  ics_file                    Path to the ICS file to import

options:
  -u, --username USERNAME     iCloud username (falls back to ICLOUD_USERNAME)
  -p, --password PASSWORD     iCloud app-specific password (falls back to ICLOUD_PASSWORD)
  -c, --calendar CALENDAR     Target calendar name (default: Alex Plugg)

MCP Server

server.py is a FastMCP server that exposes CRUD operations on iCloud calendar events.

Tools

Tool

Description

list_events

List events in a date range (defaults to current month)

get_event

Fetch a single event by UID

create_event

Create a new event with title, time, description, and location

update_event

Update any fields of an existing event by UID

delete_event

Delete an event by UID

Installation — Claude Code (user-level)

Register the server globally so it is available in every project:

claude mcp add --scope user icloud-calendar \
  uv -- run fastmcp run /home/kog/repos/ics-icloud-import/server.py

The server reads ICLOUD_USERNAME, ICLOUD_PASSWORD, and ICLOUD_CALENDAR from the environment. These are already available in any shell that loads this repo's direnv config.

Installation — Claude Desktop (macOS / Windows)

Add the following to your Claude Desktop config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "icloud-calendar": {
      "command": "uv",
      "args": [
        "run",
        "--project", "/path/to/ics-icloud-import",
        "fastmcp", "run", "/path/to/ics-icloud-import/server.py"
      ],
      "env": {
        "ICLOUD_USERNAME": "your@icloud.com",
        "ICLOUD_PASSWORD": "xxxx-xxxx-xxxx-xxxx",
        "ICLOUD_CALENDAR": "My Calendar"
      }
    }
  }
}

Replace /path/to/ics-icloud-import with the actual path to this repository.

Running the server manually

uv run fastmcp run server.py

Available Tools

7 tools
create_eventA

Create a new calendar event in an iCloud calendar.

Args: summary: Title of the event. start: ISO 8601 start datetime. end: ISO 8601 end datetime. calendar_name: Full calendar name with provider prefix (e.g. '[iCloud] Work'). Defaults to DEFAULT_CALENDAR for backward compatibility. description: Optional event description. location: Optional event location. rrule: Optional iCalendar RRULE string for recurring events.

Returns: The created event as a dict with its assigned UID.

Inputs: end (required), start (required), summary (required), rrule, +3 more. Returns: object

delete_eventA

Delete a calendar event by its UID.

Args: uid: The unique identifier of the event to delete. calendar_name: Full calendar name with provider prefix.

Returns: Confirmation dict with the deleted event's UID and summary.

Raises: ValueError: If event not found

Inputs: uid (required), calendar_name. Returns: object

get_eventA

Get a single calendar event by its UID.

Args: uid: The unique identifier of the event. calendar_name: Optional full calendar name with provider prefix. Defaults to searching all iCloud calendars.

Returns: Event dict with 'calendar' and 'provider' fields.

Raises: ValueError: If event not found

Inputs: uid (required), calendar_name. Returns: object

list_calendarsA

List all available iCloud calendars with comprehensive metadata.

Returns: A list of dicts containing: - name: Display name with provider prefix - provider: Provider identifier (icloud) - url: CalDAV URL for the calendar - description: Calendar description (if set) - timezone: Calendar timezone information (extracted from VTIMEZONE data) - supported_components: List of supported component types (VEVENT, VTODO, etc.)

Inputs: no named parameters. Returns: result

list_eventsA

List calendar events from specified calendar or all calendars.

Args: calendar_name: Full calendar name with provider prefix (e.g. '[iCloud] Work'). Defaults to all iCloud calendars. start: ISO 8601 start datetime. Defaults to start of current month. end: ISO 8601 end datetime. Defaults to 30 days after start.

Returns: List of event dicts with 'calendar' and 'provider' fields added.

Inputs: end, start, calendar_name. Returns: result

update_calendar_metadataA

Update metadata for a calendar.

Args: calendar_name: Full calendar name with provider prefix (e.g. '[iCloud] Work') description: New description for the calendar (optional)

Returns: Dict with the updated calendar metadata including provider information

Inputs: calendar_name (required), description. Returns: object

update_eventA

Update an existing calendar event by UID. Only provided fields are changed.

Args: uid: The unique identifier of the event to update. summary: New title (optional). start: New ISO 8601 start datetime (optional). end: New ISO 8601 end datetime (optional). description: New description (optional). location: New location (optional). calendar_name: Full calendar name with provider prefix.

Returns: The updated event as a dict.

Raises: ValueError: If event not found

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.2/5.0

    Scored across 7 tools

    Disambiguation5/5

    Each tool targets a distinct resource-action pair: calendars vs. events, and list/get/create/update/delete are clearly separated. No two tools overlap in purpose, and the parameter descriptions reinforce their differences.

    Naming Consistency5/5

    All tools follow a consistent verb_noun snake_case pattern (list_calendars, create_event, delete_event, etc.). The naming convention is uniform and predictable across the entire set.

    Tool Count5/5

    Seven tools is well-scoped for an iCloud calendar server, covering calendar listing/metadata and event CRUD without unnecessary bloat. Each tool has a clear role and the count feels intentional.

    Completeness4/5

    Event lifecycle is fully covered (list, get, create, update, delete), and calendar metadata can be updated. The main gap is lack of create/delete calendar operations, but that may not be supported by iCloud CalDAV and is a minor omission.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      MCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.
      6
      MIT
    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      An MCP server for iCloud Calendar, Contacts, and Mail, usable from any MCP-capable AI client.
      -