iCloud Calendar MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ICLOUD_PASSWORD | No | App-specific password for the Apple ID. | |
| ICLOUD_USERNAME | No | Apple ID address used for iCloud Calendar CalDAV authentication. | |
| MCP_ICAL_CONFIG | No | Path to a JSON configuration file shaped like config.json.example. | |
| CALDAV_SERVER_URL | No | URL of the CalDAV server. | https://caldav.icloud.com/ |
| MCP_ICAL_LOG_LEVEL | No | Log level: TRACE, DEBUG, INFO, WARNING or ERROR. | INFO |
| MCP_ICAL_READ_ONLY | No | Set to true to leave out create_event, update_event and delete_event. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_calendarsA | List all available calendars. |
| list_eventsA | List calendar events in a date range. The start_date should always use the time such that it represents the beginning of that day (00:00:00). The end_date should always use the time such that it represents the end of that day (23:59:59). This way, range based searches are always inclusive and can locate all events in that date range. Args: start_date: Start date in ISO8601 format (YYYY-MM-DDT00:00:00). end_date: Optional end date in ISO8601 format (YYYY-MM-DDT23:59:59). calendar_name: Optional calendar name to filter by |
| debug_calendar_connectionA | Debug calendar connection and provide detailed diagnostic information. This tool helps diagnose why events might not be showing up. It will test:
|
| create_eventB | Create a new calendar event. Before using this tool, make sure to:
Args:
title: Event title
start_time: Start time in ISO format (YYYY-MM-DDTHH:MM:SS)
end_time: End time in ISO format (YYYY-MM-DDTHH:MM:SS)
notes: Optional event notes/description. Ask user if they want to add notes.
location: Optional event location. Ask user if they want to specify a location.
calendar_name: Optional calendar name. Ask user which calendar to use, referencing calendars://list.
all_day: Whether this is an all-day event
reminder_offsets: List of minutes before the event to trigger reminders e.g. [60, 1440] means two reminders, the first 24 hours before the event and the second one hour before.
recurrence_rule: Optional recurrence rule for the event. This should be an instance of Note: Both |
| update_eventA | Update an existing calendar event. Before using this tool, make sure to:
Args:
event_id: Unique identifier of the event to update
title: Optional new title
start_time: Optional new start time in ISO format
end_time: Optional new end time in ISO format
notes: Optional new notes/description. Ask user if they want to update notes.
location: Optional new location. Ask user if they want to specify/update location.
calendar_name: Optional new calendar. Ask user which calendar to use, referencing calendars://list.
all_day: Optional all-day flag
reminder_offsets: List of minutes before the event to trigger reminders e.g. [60, 1440] means two reminders, the first 24 hours before the event and the second one hour before.
recurrence_rule: Optional recurrence rule for the event. This should be an instance of Note: Both |
| delete_eventA | Delete a calendar event by its identifier. Before using this tool, make sure to:
Args: event_id: Unique identifier of the event to delete |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| get_calendars | List all available calendars that can be used with calendar operations. |
TDQS
Scored across 6 tools
Each tool targets a clearly distinct resource and action: calendar listing, event listing, and event CRUD operations are unambiguous. The diagnostic tool is easily distinguished from list_events despite both relating to events.
All tools follow a consistent snake_case verb_noun pattern (list_calendars, list_events, create_event, update_event, delete_event, debug_calendar_connection). No mixing of conventions or vague verbs.
Six tools is well-scoped for a calendar server, covering the essential lifecycle plus a diagnostic helper. Each tool earns its place without redundancy.
Full event CRUD plus calendar listing and diagnostics covers the core domain well. Minor gaps exist, such as no get_event-by-id or calendar creation/deletion, but agents can work around these via list_events.