Skip to main content
Glama
InstaCode

icloud-calendar-mcp-server

by InstaCode

@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

icloud_list_calendars

List your iCloud calendars

icloud_list_events

Fetch events from a calendar in a date range

icloud_create_event

Create a new event

icloud_update_event

Update an existing event by UID

icloud_delete_event

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 build

Set 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 inspect

Then 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_events with text query (across calendars)

  • icloud_find_free_time helper

  • CardDAV 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

--provenance is intentionally omitted here. Provenance attestations require a supported OIDC provider (GitHub Actions, GitLab CI, etc.) and will fail locally with Automatic provenance generation not supported for provider: null. The CI workflow below adds --provenance automatically.

After the first publish:

  1. Go to https://www.npmjs.com/package/@instacodeio/icloud-calendar-mcp-server → Settings → Trusted Publishers

  2. Add a publisher with:

    • Repository owner: InstaCode (or your GitHub username)

    • Repository name: icloud-calendar-mcp-server

    • Workflow filename: publish.yml

Subsequent releases (automated):

npm version patch   # or minor / major
git push --follow-tags

The 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 tools
icloud_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesEnd time as ISO 8601 datetime
startYesStart time as ISO 8601 datetime
allDayNoWhether this is an all-day event
summaryYesEvent title
calendarYesCalendar display name or full CalDAV URL
locationNoEvent location
descriptionNoEvent description / notes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 EventA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesUID of the event to delete
calendarYesCalendar display name or full CalDAV URL

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CalendarsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 EventsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRange end as ISO 8601 datetime (e.g., '2026-05-31T23:59:59Z')
startYesRange start as ISO 8601 datetime (e.g., '2026-05-01T00:00:00Z')
calendarYesCalendar display name (e.g., 'Work', 'Home') or full CalDAV URL

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EventA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
uidYesUID of the event to update
startNo
allDayNo
summaryNo
calendarYesCalendar display name or full CalDAV URL
locationNo
descriptionNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct operation: creating, deleting, listing calendars, listing events, and updating events. No overlap in functionality.

Naming Consistency5/5

All tools follow the 'icloud_verb_noun' pattern using lowercase with underscores, ensuring clear and predictable naming.

Tool Count5/5

With 5 tools, the set covers essential CRUD operations for calendar events plus calendar listing, which is appropriate for a focused calendar server.

Completeness4/5

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

ActivityInactive
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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