
Icloud Calendar Mcp
org.onekashPublished by onekash.orgv3.2.0Updated Oct 24, 2026
MCP server for iCloud (Apple) Calendar access via CalDAV
Overview
A local MCP server that connects an AI assistant to iCloud Calendar over CalDAV so it can list calendars and read, create, update and delete events.
- What you can do
- List calendars and browse them as a resource to find the right calendar ID and see what is available. Read events in a date range, with recurring series expanded into one result per occurrence and bounded by date-span and event-count caps. Create events, including all-day events, timezones, recurrence rules and reminders. Update or delete events, choosing whether a recurring change affects one occurrence, this and future ones, or the whole series. Use built-in prompts to draft a meeting, reschedule an event, or find overlapping time slots in a day.
- When to use it
- Useful when you keep your schedule in iCloud Calendar and want an assistant to answer questions about it or make changes by conversation, such as creating a meeting, moving an appointment or clearing a cancelled one. It suits users who want CalDAV access without depending on macOS or Calendar.app.
- Requirements
- Runs as a local process over stdio; Java 21 or newer must be on the PATH even when launched through npx or uvx. An iCloud account with an app-specific password, supplied through the ICLOUD_USERNAME and ICLOUD_PASSWORD environment variables. Network access to iCloud's CalDAV service.
Installation
In SourceWeft
- Open Icloud Calendar Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
iCloud Calendar MCP Server
[Tests] [npm] [PyPI] [License] [MCP Registry] [Security]
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.
Why this server
- Portable CalDAV. Runs anywhere a JVM runs. It does not depend on macOS, AppleScript, or Calendar.app.
- Durable event handles.
get_eventsandcreate_eventreturn an opaquehandlethat references an event across sessions and process restarts, so editing or deleting one needs no re-listing. - Correct recurrence. A series expands into one result per occurrence in the range, and you can edit or delete a single occurrence, this-and-future, or the whole series.
- Bounded responses. Date-span and event-count caps return a clear, structured error instead of a silently truncated response.
- Security aligned with the OWASP MCP Top 10, backed by a dedicated test suite.
- Published on the MCP Registry, npm, and PyPI.
Features
MCP Tools
MCP Resources
MCP Prompts
User-initiated templates that guide Claude through a multi-step task:
Security Features
- Credential Protection - Environment variables only, never in code or config
- Input Validation - All parameters validated with SSRF protection
- Rate Limiting - 60 reads/min, 20 writes/min per MCP specification
- Secure Error Handling - No sensitive data leakage in error messages
- OWASP MCP Top 10 Compliance - 282 security tests covering all major risks
- ReDoS Protection - All regex patterns tested against catastrophic backtracking
- Unicode Security - Protection against homoglyph and encoding attacks
Quick Start
Prerequisites
- Java 21+ (for all installation methods)
- iCloud account with app-specific password
Installation
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.
Option 1: npm (Recommended)
Option 2: Python (uvx)
Option 3: Direct JAR
Option 4: Build from Source
Configuration
Set your iCloud credentials as environment variables:
Security Note: Use an app-specific password, not your main Apple ID password.
Claude Desktop Integration
Add to your Claude Desktop configuration:
Using npm (Recommended)
Using uvx (Python)
Using JAR directly
Usage Examples
Once configured, you can ask Claude:
- "What's on my calendar this week?"
- "Create a meeting with John tomorrow at 2pm"
- "Show me all my calendars"
- "Delete the dentist appointment on Friday"
- "Move my 3pm meeting to 4pm"
Tool Parameters
list_calendars
No parameters required.
get_events
Behavior to know about:
- UTC day boundaries.
start_dateandend_dateselect whole UTC calendar days:start_dateat 00:00 UTC through the end ofend_datein UTC. Timed events return UTCstartTime/endTimeinstants; all-day events return a plainYYYY-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. - Limits. The range is capped at 366 days, and
end_datemust not precedestart_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. - Recurring series. Each occurrence in the range is returned as its own result, carrying its own
handleand arecurrenceIdthat identifies the instance. - Read-after-write. iCloud does not guarantee immediate visibility, so an event created moments ago can be missing from the next
get_eventsfor 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.
create_event
update_event
Only the fields you pass are changed.
delete_event
Referencing an event
get_events and create_event return two identifiers for each event: a uid and an opaque handle. Pass the handle to update_event and delete_event. It is self-contained and works from a fresh process, so the normal flow is get_events (or create_event) to obtain the handle, then update_event/delete_event with it. No extra lookup step is needed across sessions.
A bare uid is also accepted, but only for an event fetched earlier in the same session, where it resolves through a short-lived in-memory cache. There is no stateless server-side lookup by UID: iCloud rejects a CalDAV calendar-query UID prop-filter (HTTP 412), and an unfiltered query would return the whole calendar. Prefer the handle.
A handle carries the event's ETag. If the event changed elsewhere since the handle was issued, the edit reports a conflict rather than overwriting the newer version; re-run get_events for a fresh handle and retry. On success, update_event returns a refreshed handle carrying the new ETag, so use that one for the next edit in a chain.
Editing recurring events
get_events returns one result per occurrence of a recurring series, each with its own handle. When you edit or delete an occurrence handle, set scope:
this_occurrence: change or cancel only that instance.this_and_future: that instance and every later one.all_events: the whole series.
scope is required when the handle points at one occurrence of a series. The operation is rejected without it, so a single-occurrence edit never changes the whole series by accident. Omit scope for standalone events. rrule, rdates, and exdates cannot be combined with this_occurrence or this_and_future.
Alarms
create_event and update_event take an alarms array. Each entry is an object:
On update_event, omit alarms to keep the existing ones, pass an empty array to clear them, or pass a list to replace them.
Troubleshooting
A new event does not appear right away. iCloud does not guarantee immediate visibility, so a just-created event can be missing from the next get_events for a short window (CDN indexing lag). The create_event success response is authoritative. Do not recreate the event.
get_events returns a size or count error. The range is too wide. Query a week or a month at a time; the response is capped at 1000 events.
Authentication fails. Use an app-specific password, not your Apple ID password, and set ICLOUD_USERNAME to your full iCloud email address.
Not sure which calendar_id to use. Call list_calendars and use the id of the calendar you want.
A recurring edit was rejected or changed every instance. Set scope (see Editing recurring events): an occurrence handle needs this_occurrence, this_and_future, or all_events.
Times look shifted by your timezone. get_events uses UTC day boundaries (see get_events). Pass timezone when creating timed events, and use the extra-day approach to resolve a local day.
Security
This server is designed with security as a primary concern, following the OWASP MCP Top 10 guidelines.
Privacy
The server talks only to your machine (over STDIO) and to iCloud (caldav.icloud.com). It has no telemetry and sends your calendar data nowhere else. Credentials come from environment variables and are never logged.
Security Controls
OWASP MCP Top 10 Coverage
See SECURITY.md for full security documentation and vulnerability disclosure process.
Testing
Tests live in two places: the MCP server module and the vendored icaldav-core
iCalendar library. Both run with:
Test Coverage (MCP server)
Security Test Categories
Running Specific Tests
Architecture
Development
Build
Project Structure
Testing with MCP Inspector
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
Security Issues
For security vulnerabilities, please see SECURITY.md for our responsible disclosure process. Do not open public issues for security vulnerabilities.
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Acknowledgments
- Model Context Protocol by Anthropic
- MCP Kotlin SDK by Anthropic & JetBrains
- ical4j for low-level ICS parsing (via the bundled icaldav-core library)
- OkHttp for HTTP client
- OWASP MCP Top 10 for security guidance
Source: README.md at commit a706028
Tools
0Version history
1- v3.2.0LatestSep 16, 2026
Score
40% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
Declare a license in the repository or the registry entry.