Skip to main content
Glama
InstaCode

icloud-calendar-mcp-server

by InstaCode
README.md
# @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](https://www.npmjs.com/org/instacodeio).

## 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 |

## 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

```bash
npm install
npm run build
```

Set credentials via environment variables (or copy `.env.example` to `.env` and load via your runner):

```bash
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:

```bash
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`:

```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:

```bash
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):**

```bash
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

TDQS

A4.2/5.0

Scored across 5 tools

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
ResponsivenessNo issues