list_calendars
List every calendar across all configured accounts (Nextcloud, iCloud, Google, …), with ids usable in other tools.
Takes no parameters.

io.github.da-the-devPublished by GitHub account da-the-devv0.2.0Updated Nov 6, 2026
Local MCP server for your calendars across Nextcloud, iCloud, Google and any CalDAV server.
Local MCP server that merges Nextcloud, iCloud, Google and other CalDAV calendars so an assistant can read, search, create, edit and delete events.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
One thin, local MCP server for all your calendars.
Nextcloud · iCloud · Google · any CalDAV, merged into a single view your agent can read and manage.
[npm] [CI] [MCP Registry] [Node] [Platforms] [License: MIT]
Quick start · Accounts · Connect · Tools · Guardrails · Providers · Contributing
Requires Node.js 22+.
pim-mcp check lists what it found:
The config lives at ~/.config/pim-mcp/config.toml on every OS (C:\Users\<you>\.config\pim-mcp\config.toml on Windows). Set PIM_MCP_CONFIG to use another path.
Passwords and tokens never go in the config. It holds a reference instead:
Stored as generic passwords in your login Keychain. You can also manage them in Keychain Access, or with security add-generic-password -s pim-mcp -a icloud -w.
Needs secret-tool:
On a headless machine there's usually no keyring running. Use env: refs (set them in your MCP client's env block) or pass:
Secrets are encrypted with DPAPI, the per-user encryption Credential Manager also uses. They're stored under %APPDATA%\pim-mcp\secrets\, and only your Windows user on this machine can decrypt them. Nothing to install. cmd: refs run in cmd.exe.
pim-mcp secret set pim-mcp/nextcloudpim-mcp secret set pim-mcp/icloudGoogle only allows OAuth for CalDAV:
pim-mcp secret set pim-mcp/google-client-secretpim-mcp auth google --account google opens your browser and stores the refresh token in your OS secret store.Claude Code (any OS)
Claude Desktop, Cursor and other GUI clients. Add this to the client's MCP config:
~/Library/Application Support/Claude/claude_desktop_config.jsonGUI apps don't always see your shell's PATH. If the server fails to start, replace npx with the full path from which npx, e.g. /opt/homebrew/bin/npx.
%APPDATA%\Claude\claude_desktop_config.jsonnpx is a batch script on Windows, so it runs through cmd /c.
Claude Desktop isn't available for Linux; use Claude Code or another MCP client with the same command / args as macOS. env: refs go in the client's env block:
What agents see:
timezone.YYYY-MM-DD, and their end date is inclusive.🟡 untested means standard CalDAV that should just work but hasn't been confirmed with pim-mcp yet. Tried one? A PR updating this table is very welcome.
New providers, bug fixes and "it works with X" confirmations are all welcome. See CONTRIBUTING.md for dev setup, a throwaway local CalDAV server for testing, and how to add a provider.
Source: README.md at commit 006f369
List every calendar across all configured accounts (Nextcloud, iCloud, Google, …), with ids usable in other tools.
Takes no parameters.
Events in a time range, merged across all calendars and sorted by start. Recurring events are expanded into occurrences. Defaults to today through the next 7 days.
endstartaccountscalendarsFind events whose title, location or description contains the query (case-insensitive). Defaults to 90 days back through 365 days ahead.
endqueryrequiredstartcalendarsFull details of one event (description, attendees, organizer, recurrence rule, reminders).
idrequiredFree time windows of at least `duration_minutes` across all (or selected) calendars. Events marked free/transparent and cancelled events do not block time.
endrequiredstartrequiredaccountscalendarsworking_hoursduration_minutesrequiredCreate an event. `start` as a date makes an all-day event. Without `end`, timed events last 1 hour and all-day events 1 day.
endbusyrrulestartrequiredtitlerequiredcalendarrequiredlocationattendeesdescriptionalarm_minutesChange an event. Only the fields you pass change; moving `start` alone keeps the duration. For recurring events pass `scope`.
idrequiredendbusyrrulescopestarttitlelocationattendeesdescriptionalarm_minutesDelete an event. The user reviews this call by its `title`, and a title that does not match the event is refused. For recurring events pass `scope` ("instance" removes one occurrence, "series" removes all).
idrequiredscopetitlerequired90% 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.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
you › Find me an hour on Thursday afternoon and put the dentist there.
agent › find_free_time start=Thu 12:00 end=Thu 18:00 duration_minutes=60 ↳ 13:00–15:30 · 16:15–18:00 › create_event calendar="icloud/personal" title="Dentist" start=Thu 13:00 ↳ ✓ created Thu 13:00–14:00 · icloud/personal
Done. Thursday 13:00 is booked; you're free again from 14:00.flowchart LR A["🤖 Agent<br><sub>Claude Code · Claude Desktop · Cursor</sub>"] -- "MCP · stdio" --> P["<b>pim-mcp</b><br><sub>on your machine</sub>"] S[("🔐 OS secret store<br><sub>Keychain · Secret Service · DPAPI</sub>")] -. "app passwords / tokens" .-> P P -- CalDAV --> N["☁️ Nextcloud"] P -- CalDAV --> I["🍎 iCloud"] P -- "CalDAV + OAuth" --> G["📅 Google"] P -- CalDAV --> O["🌐 any CalDAV"]npm install -g pim-mcp # 1 · install (or prefix commands with `npx -y`)pim-mcp init # 2 · write ~/.config/pim-mcp/config.tomlpim-mcp secret set pim-mcp/icloud # 3 · store an app password (prompted, not echoed)pim-mcp check # 4 · verify every accountclaude mcp add pim -s user -- npx -y pim-mcp # 5 · connect your agent✓ nextcloud (nextcloud) — 3 calendar(s) nextcloud/personal Personal nextcloud/work Work✓ icloud (icloud) — 2 calendar(s) icloud/family Family icloud/travel Travelsudo apt install libsecret-tools # Debian / Ubuntusudo dnf install libsecret # Fedorasudo pacman -S libsecret # Archpassword = "cmd:pass show pim-mcp/icloud"[[accounts]]id = "nextcloud"provider = "nextcloud"url = "https://your.next.cloud/remote.php/dav"username = "your-login"password = "keychain:pim-mcp/nextcloud"[[accounts]]id = "icloud"provider = "icloud"username = "[email protected]" # the email you sign into your Apple Account withpassword = "keychain:pim-mcp/icloud"[[accounts]]id = "google"provider = "google"username = "[email protected]"client_id = "xxxx.apps.googleusercontent.com"client_secret = "keychain:pim-mcp/google-client-secret"refresh_token = "keychain:pim-mcp/google"[[accounts]]id = "fastmail"provider = "caldav"url = "https://caldav.fastmail.com/"username = "[email protected]"password = "keychain:pim-mcp/fastmail"claude mcp add pim -s user -- npx -y pim-mcp{ "mcpServers": { "pim": { "command": "npx", "args": ["-y", "pim-mcp"] } }}{ "mcpServers": { "pim": { "command": "cmd", "args": ["/c", "npx", "-y", "pim-mcp"] } }}"pim": { "command": "npx", "args": ["-y", "pim-mcp"], "env": { "ICLOUD_PASSWORD": "…" }}timezone = "Europe/Amsterdam" # default: the system timezone
[guardrails]allow_delete = false # delete_event is refusedallow_invites = false # no adding attendees, no editing/deleting events that have them
[[accounts]]# …read_only = true # no writes to this account at allread_only_calendars = ["Family"] # protect specific calendarshide_calendars = ["Birthdays"] # don't show these at all