icloud-calendar-mcp-server
Provides tools for listing calendars, and creating, updating, and deleting events on iCloud Calendar via CalDAV.
Click on "Install 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-serverlist my events for tomorrow"
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.
@instacodeio/icloud-calendar-mcp-server
MCP server for iCloud Calendar via CalDAV. Lets Claude (or any MCP client) read and write events on your iCloud calendars.
Published under InstaCode.
What it does
Exposes five tools:
Tool | Purpose |
| List your iCloud calendars |
| Fetch events from a calendar in a date range |
| Create a new event |
| Update an existing event by UID |
| Delete an event by UID |
Related MCP server: icloud-calendar-mcp
Prerequisites
Node.js 18+
An Apple ID with two-factor authentication enabled
An app-specific password generated at https://appleid.apple.com (your normal Apple ID password will not work for CalDAV)
Setup
npm install
npm run buildSet credentials via environment variables (or copy .env.example to .env and load via your runner):
export ICLOUD_USERNAME="you@icloud.com"
export ICLOUD_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"Test it locally
Use the MCP Inspector to poke at the tools without wiring up a client:
npm run inspectThen in the inspector UI: list tools, call icloud_list_calendars, etc.
Use with Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"icloud-calendar": {
"command": "node",
"args": ["/absolute/path/to/icloud-calendar-mcp-server/dist/index.js"],
"env": {
"ICLOUD_USERNAME": "you@icloud.com",
"ICLOUD_APP_PASSWORD": "xxxx-xxxx-xxxx-xxxx"
}
}
}
}Restart Claude Desktop. The tools should appear under the MCP icon.
Known limitations (v0.1)
Time zones: events are written in UTC. Timezone-aware writes are TODO.
Recurring events: parsed as their master event; recurrence overrides aren't surfaced separately yet.
Reminders/alarms: not yet supported on create/update.
Attendees / invites: not yet supported.
Update/delete by UID does a calendar scan; for very large calendars this is slow. Future improvement: maintain a UID→URL index or use server-side query reports.
Roadmap
Timezone support on create/update
VALARM (reminders) on create/update
icloud_search_eventswith text query (across calendars)icloud_find_free_timehelperCardDAV companion for contacts (
https://contacts.icloud.com)Optional Streamable HTTP transport for hosted use
Publishing
Releases are published to npm via OIDC trusted publishing — no NPM_TOKEN required in CI.
First publish (one-time, manual):
The npm trusted-publisher settings page only appears for packages that already exist on npmjs.com. So v0.1.0 must be published manually from a local machine:
npm login
npm publish --access public
--provenanceis intentionally omitted here. Provenance attestations require a supported OIDC provider (GitHub Actions, GitLab CI, etc.) and will fail locally withAutomatic provenance generation not supported for provider: null. The CI workflow below adds--provenanceautomatically.
After the first publish:
Go to https://www.npmjs.com/package/@instacodeio/icloud-calendar-mcp-server → Settings → Trusted Publishers
Add a publisher with:
Repository owner:
InstaCode(or your GitHub username)Repository name:
icloud-calendar-mcp-serverWorkflow filename:
publish.yml
Subsequent releases (automated):
npm version patch # or minor / major
git push --follow-tagsThe Publish to npm workflow will run on the new v* tag, verify the tag matches package.json, build, and publish with provenance.
License
MIT
Available Tools
5 toolsicloud_create_eventCreate iCloud EventA
Create a new event on the specified calendar.
Args:
calendar: Display name or full CalDAV URL
summary: Event title (required)
start, end: ISO 8601 datetimes
description, location: optional
allDay: boolean (default false)
Returns the created event's uid and CalDAV URL.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | End time as ISO 8601 datetime | |
| start | Yes | Start time as ISO 8601 datetime | |
| allDay | No | Whether this is an all-day event | |
| summary | Yes | Event title | |
| calendar | Yes | Calendar display name or full CalDAV URL | |
| location | No | Event location | |
| description | No | Event description / notes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a mutation (readOnlyHint=false) and non-idempotency. Description does not add behavioral details such as side effects, synchronicity, or error conditions, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded with the main action. Parameter list is efficiently formatted without redundant text. Every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Describes return value (uid and CalDAV URL) despite no output schema, which is helpful. Missing context on prerequisites (e.g., calendar must exist) and error handling, but adequate for a simple creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
100% schema coverage means the schema already describes parameters. Description adds minimal extra value (e.g., noting default for allDay) but also incompletely indicates required fields (only 'summary' said required, schema lists 4 required).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create a new event on the specified calendar' with a specific verb and resource. Distinguishes from sibling tools (delete, list, update) by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides parameter details but does not explicitly guide when to use this tool versus alternatives like icloud_update_event. Usage context is implied but not clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icloud_delete_eventDelete iCloud EventADestructiveIdempotent
Delete an event by UID.
Args:
calendar: Display name or full CalDAV URL
uid: Event UID
This is destructive. Confirm with the user before invoking.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | UID of the event to delete | |
| calendar | Yes | Calendar display name or full CalDAV URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide destructiveHint=true, but the description adds important behavioral context by warning that the action is destructive and requiring user confirmation. This goes beyond what annotations alone convey, ensuring the agent acts cautiously.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with only three sentences: a one-line purpose, a parameter list, and a behavioral note. Every sentence serves a distinct purpose with no redundancy, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool with only 2 parameters and no output schema, the description covers the essential purpose, parameters, and behavioral warning. No additional context is necessary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters, so the description need not repeat everything. However, it adds value by clarifying that the 'calendar' parameter accepts a 'Display name or full CalDAV URL', which provides practical usage detail beyond the schema's generic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Delete an event by UID', clearly indicating the verb (delete) and resource (event). This distinguishes it from sibling tools like icloud_create_event, icloud_update_event, and icloud_list_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes 'This is destructive. Confirm with the user before invoking.', providing clear context on when to use the tool (after user confirmation). It does not explicitly mention when not to use it or alternatives, but for a delete operation, the guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icloud_list_calendarsList iCloud CalendarsARead-onlyIdempotent
List all calendars in the authenticated iCloud account.
Returns each calendar's display name, URL (used as a stable identifier), color, and timezone if available.
Use this when:
The user asks "what calendars do I have"
You need a calendar identifier to pass to other tools
Disambiguating between calendars with similar names
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint='false', etc. Description adds return fields (name, URL, color, timezone) but no behavioral traits beyond what annotations imply. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences covering purpose, return fields, and when to use. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, good annotations, and no output schema, the description fully explains the return values and appropriate usage. Complete for a simple listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so description does not need to add param info. Baseline 4 per guidelines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all calendars' which is a specific verb and resource. It distinguishes from sibling tools that handle events (create, delete, list, update).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases: when user asks 'what calendars do I have', when a calendar identifier is needed, and for disambiguation. No when-not cases needed as it's the only list-calendars tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icloud_list_eventsList iCloud EventsARead-onlyIdempotent
List events from a specific calendar within a time range.
Args:
calendar: Display name (e.g. "Work") or full CalDAV URL
start: ISO 8601 datetime for range start
end: ISO 8601 datetime for range end
Returns an array of events with uid, summary, start, end, location, description, allDay flag. The 'uid' is the stable identifier — use it for update/delete operations.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Range end as ISO 8601 datetime (e.g., '2026-05-31T23:59:59Z') | |
| start | Yes | Range start as ISO 8601 datetime (e.g., '2026-05-01T00:00:00Z') | |
| calendar | Yes | Calendar display name (e.g., 'Work', 'Home') or full CalDAV URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds value by specifying return fields (uid, summary, start, etc.) and noting that uid is stable for mutations. It does not mention pagination or limits, but openWorldHint covers partial results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one sentence for purpose, a bullet-like list for arguments, and a clear statement about return structure and uid significance. Every sentence is informative with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 params, no output schema), the description covers purpose, parameter semantics, and return shape adequately. It lacks mention of potential pagination or the implication of openWorldHint, but the uid instruction adds useful chaining context. Overall complete enough for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema already documents parameters well. The description provides example values ('Work') and clarifies that calendar accepts both display names and CalDAV URLs, but this largely mirrors the schema description, adding minimal new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'list' and resource 'events' with constraints 'from a specific calendar within a time range', clearly distinguishing its purpose from sibling tools like create, delete, update, and list_calendars.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use (list events in a range), and mentions that 'uid' is for update/delete, which guides chaining. However, it does not explicitly state when not to use or suggest alternatives like icloud_list_calendars for obtaining calendar IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icloud_update_eventUpdate iCloud EventAIdempotent
Update fields on an existing event by UID.
Args:
calendar: Display name or full CalDAV URL where the event lives
uid: Event UID (from icloud_list_events)
Any of: summary, description, location, start, end, allDay (only provided fields are updated)
Returns confirmation with the updated UID.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| uid | Yes | UID of the event to update | |
| start | No | ||
| allDay | No | ||
| summary | No | ||
| calendar | Yes | Calendar display name or full CalDAV URL | |
| location | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true and destructiveHint=false, which are consistent with the description stating 'Update fields' and 'only provided fields are updated'. The description adds value by clarifying partial updates and the confirmation response, going beyond the annotation signals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (few sentences) and front-loaded with the main purpose. Each sentence provides necessary information: action, parameters, and returns. No redundant information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose, parameters, and return value. However, it lacks details on error handling (e.g., event not found), date format expectations (though implied by schema), and behavior when allDay is used with start/end. For a tool with no output schema, more completeness could be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (25%), but the description compensates by listing all optional updatable parameters (summary, description, location, start, end, allDay) and explaining that calendar can be a display name or full URL. It also clarifies that uid comes from icloud_list_events, adding context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and the resource 'an existing event by UID'. It distinguishes from sibling tools like icloud_create_event and icloud_delete_event by specifying the update action on an existing event, avoiding confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys when to use the tool (to update an event) and hints at workflow (UID from icloud_list_events), but it does not explicitly state when not to use it or compare to alternatives like icloud_create_event for creating events. No exclusion criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct operation: creating, deleting, listing calendars, listing events, and updating events. No overlap in functionality.
All tools follow the 'icloud_verb_noun' pattern using lowercase with underscores, ensuring clear and predictable naming.
With 5 tools, the set covers essential CRUD operations for calendar events plus calendar listing, which is appropriate for a focused calendar server.
Core operations (create, read, update, delete) are present, but a direct 'get event by UID' tool is missing, requiring agents to list events and filter. This is a minor gap.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Cronofy — read calendars, events and free/busy, and create, update or delete events.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Connects ChatGPT to your Apple Calendar via a local Mac agent + Vercel relay
MCP server for Nylas — read email, calendars, events and contacts, and send email or create events.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with iCloud Calendars via the CalDAV protocol using an app-specific password. It allows users to list, create, update, and delete calendar events through MCP-aware clients like ChatGPT.2MIT
- FlicenseNot gradedqualityAmaintenanceMCP server for iCloud (Apple) Calendar access via CalDAV14
- AlicenseNot gradedqualityDmaintenanceAn HTTP Model Context Protocol (MCP) server exposing iCloud Calendar (CalDAV) tools so MCP-aware clients can list calendars, read events, and create/update/delete events using an iCloud app-specific password.3MIT
- AlicenseNot gradedqualityBmaintenanceEnables calendar management with iCloud through CalDAV, allowing users to list, create, update, and delete events via a standardized API.40MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/InstaCode/icloud-calendar-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server