Apple Calendar

io.github.mgcreaPublished by GitHub account mgcreav1.37.0Updated Nov 7, 2026

Search, read and act on Apple Calendar — ranges, free-time lookup, writes off by default

Overview

AI-generated overview

Local macOS MCP server that lets an assistant search and read Apple Calendar events, with event creation, updates and deletion off by default.

What you can do
  • List accounts and calendars, and run diagnostics on the local Calendar store
  • List and search events over a date range, and fetch a single event's details
  • Create, update and delete events, only when writes are explicitly enabled
  • Limit reads and writes to chosen accounts and calendars, and set default calendar, range and time zone
When to use it
Useful when an assistant should answer scheduling questions from the user's own Apple Calendar on a Mac, such as finding free time or summarizing upcoming events, and optionally manage events if write access is deliberately turned on.
Requirements
Runs locally on macOS via npx (Node.js) and reads the Calendar app's SQLite store, so Full Disk Access must be granted to whatever launches the server (Terminal, IDE, assistant app), then restarted. Writes additionally need Automation permission for Calendar. Configuration is through environment variables such as APPLE_CALENDAR_ALLOW_WRITES, APPLE_CALENDAR_ACCOUNTS and APPLE_CALENDAR_CALENDARS.
Before you install
Writes are off by default; enabling them with APPLE_CALENDAR_ALLOW_WRITES exposes tools that create, update and delete events through Apple Events, so changes reach the real calendar and sync to accounts. Full Disk Access is broad access to the user's data. Account and calendar allowlists bound both reads and writes, so set them to limit exposure. The project is unofficial and not affiliated with Apple.

Installation

In SourceWeft

  1. Open Apple Calendar in the dashboard and add it to a workspace.
  2. 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

@mgcrea/mcp-apple-calendar

Model Context Protocol server for the macOS Apple Calendar app.

Unofficial. Not affiliated with Apple. It reads the Calendar store already on your Mac.

One lane for reads, one for writes

  • Index lane — read-only SQLite over Calendar.sqlitedb. Every read goes through it.
  • Apple Events lane — writes only. There is no jxa/read.ts in this package, and a test asserts there never will be.

This is the inverse of Notes. Notes shipped on Apple Events because search took 97 ms. Calendar cannot: a ±90-day range query over 1,349 events takes 3,355 ms over Apple Events, whose is worse and unstable, and every per-property bulk fetch costs ~1.8 s whichever property it is — so the cost cannot be amortised the way Notes amortises a bulk fetch. The store opens read-only in 1 ms. Calendar needs the file lane for speed, not capability.

It does not need EventKit, which is why the companion app stays a pure broker rather than linking a framework that would drag its own TCC prompt in.

PermissionNeeded forWithout it
Full Disk Accessall readsnothing works — there is no read fallback
Automation → Calendarwrites onlyreads are unaffected

Neither is granted to Calendar.app — it is the reader that needs permission. Grant Full Disk Access to whatever launches the server (Terminal, iTerm, VS Code, Claude), then restart it.

With writes off — the default — no Automation prompt appears at all. A read-only Calendar server needs exactly one permission.

Tools

Read: diagnostics, list_accounts, list_calendars, list_events, search_events, get_event.

Write, registered only when APPLE_CALENDAR_ALLOW_WRITES=1 — with the flag off they are invisible to the model, not merely refused: create_event, update_event, delete_events.

Configuration

VariableDefault
APPLE_CALENDAR_ALLOW_WRITESoffRegister the mutating tools.
APPLE_CALENDAR_ACCOUNTSallRead-side allowlist, comma-separated.
APPLE_CALENDAR_CALENDARSallRead-side allowlist, comma-separated.
APPLE_CALENDAR_DEFAULT_CALENDARCalendar'sCalendar a new event goes to when none named.
APPLE_CALENDAR_DEFAULT_RANGE_DAYS7An unbounded default would scan a decade.
APPLE_CALENDAR_MAX_RANGE_DAYS366Ceiling on a caller-supplied range.
APPLE_CALENDAR_DEFAULT_EVENT_DURATION_MINUTES60Used when a write names no end.
APPLE_CALENDAR_INCLUDE_DECLINEDoffInclude declined events in reads.
APPLE_CALENDAR_INCLUDE_CANCELLEDoffInclude cancelled events in reads.
APPLE_CALENDAR_TIMEZONEsystemOverride the zone ranges are resolved in.
APPLE_CALENDAR_INDEX_MODEautoauto | ro | immutable | off.
APPLE_CALENDAR_STOREautoExplicit Calendar.sqlitedb path.
APPLE_CALENDAR_OSASCRIPT_TIMEOUT_MS30000Sized for the first-run permission prompt.

Notes that will bite you

  • ~/Library/Calendars does not exist. The store is ~/Library/Group Containers/group.com.apple.calendar/Calendar.sqlitedb.
  • Recurrence lives in a cache table. A naive SELECT ... FROM CalendarItem over a date range misses expanded repeats; the range query unions items carrying no recurrence rule with everything in the cache. 456 of 489 cached parents carry no rule of their own.
  • Dates are seconds since 2001, not 1970 — CalendarItem.last_modified and orig_date both.
  • A floating time zone is not the system one. Anything matching GMT±HHMM is a real zone; treating the rest as floating is what stops a two-hour silent shift.
  • Writes always go through Apple Events, never the store, which the app holds open and syncs.

Licence

MIT.

Source: packages/calendar/README.md at commit 2398a54

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

17
  1. v1.37.0LatestNov 7, 2026
  2. v1.36.2Nov 4, 2026
  3. v1.36.1Nov 3, 2026
  4. v1.35.0Oct 30, 2026
  5. v1.34.0Oct 29, 2026
  6. v1.31.0Oct 26, 2026
  7. v1.30.0Oct 22, 2026
  8. v1.29.1Oct 21, 2026
  9. v1.28.0Oct 13, 2026
  10. v1.27.0Oct 13, 2026
  11. v1.26.0Oct 6, 2026
  12. v1.25.0Oct 3, 2026
  13. v1.24.1Sep 29, 2026
  14. v1.24.0Sep 27, 2026
  15. v1.23.0Sep 19, 2026
  16. v1.22.1Sep 16, 2026
  17. v1.21.1Sep 16, 2026

Score

50% 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