Skip to main content
Glama
calendar-mcp
by atfinke

calendar-mcp

Local MCP server that exposes Apple Calendar data through an EventKit helper app.

Built entirely by OpenAI GPT-5.4 via Codex.

Install

git clone https://github.com/<your-account>/calendar-mcp.git
cd calendar-mcp
./bootstrap.sh

Related MCP server: mcp-eventkit

Run

npm run start

Permissions

Run calendar_permissions once with prompt: true and access: "full".

The helper app is intended to be built with the project’s normal code signing so macOS can attribute Calendar access to a stable app identity.

If the prompt does not appear from inside Codex, launch the helper app directly once:

open CalendarMCPHelperApp/build/Build/Products/Release/CalendarMCPHelperApp.app

When opened directly, the app will request Calendar access and show a status alert. After that initial grant, the MCP tools can read and write events normally.

Delete safety is intentionally narrow: each calendar_delete_event call can remove only one resolved target. Recurring deletes support one occurrence or one entire series, but not futureEvents or any bulk-delete shape.

calendar_update_event updates an event in place instead of forcing a delete-and-recreate flow. Omitted fields stay unchanged. To clear nullable fields, pass one of clearLocation, clearNotes, clearUrl, or clearTimeZone.

Date Inputs

All tool date inputs accept these wire formats:

  • 2026-04-02 for a local calendar day

  • 2026-04-02T09:30 or 2026-04-02T09:30:00 for a local wall-clock time

  • 2026-04-02T09:30:00-05:00 or 2026-04-02T14:30:00Z for an exact instant

Local date-only and local date-time inputs are interpreted in the helper app's current macOS time zone. Returned event payloads always use ISO-8601 timestamps with timezone offsets.

calendar_list_events treats start and end as the exact time window after parsing those inputs.

occurrenceDate for recurring-event lookups also accepts YYYY-MM-DD. In that case the helper matches the occurrence by local calendar day. When you already have an occurrenceDate timestamp from a previous tool response, prefer passing that exact timestamp back.

MCP config

{
  "mcpServers": {
    "calendar": {
      "command": "node",
      "args": ["/absolute/path/to/calendar-mcp/dist/index.js"],
      "env": {
        "CALENDAR_MCP_HELPER_APP_PATH": "/absolute/path/to/calendar-mcp/CalendarMCPHelperApp/build/Build/Products/Release/CalendarMCPHelperApp.app"
      }
    }
  }
}

Verify

npm run verify

Available Tools

7 tools
calendar_create_eventCreate EventA

Create a calendar event in the default calendar or a specified calendar. start and end accept local dates, local times, or timezone-bearing ISO-8601 timestamps.

Inputs: end (required), start (required), title (required), url, +5 more.

calendar_delete_eventDelete EventA

Delete exactly one calendar target by identifier. For recurring events, choose whether to remove one occurrence or the entire series.

Inputs: scope, occurrenceDate, eventIdentifier, calendarItemIdentifier.

calendar_get_eventGet EventA
Read-only

Fetch a single event by identifier. Pass occurrenceDate when targeting one instance of a recurring series.

Inputs: occurrenceDate, eventIdentifier, externalIdentifier, calendarItemIdentifier.

calendar_list_calendarsList CalendarsA
Read-only

List event calendars available to the helper app.

Inputs: no named parameters.

calendar_list_eventsList EventsA
Read-only

List calendar events in a time window. start and end accept local dates, local times, or timezone-bearing ISO-8601 timestamps.

Inputs: end (required), start (required), calendarIds.

calendar_permissionsCalendar PermissionsB

Check and optionally prompt for Apple Calendar access used by the helper app.

Inputs: access, prompt.

calendar_update_eventUpdate EventA

Update an existing calendar event in place. Omitted fields are left unchanged. Use clear flags to remove location, notes, url, or timeZone.

Inputs: end, url, notes, scope, +14 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 7 tools

    Disambiguation5/5

    Each tool targets a distinct action and resource: permissions for access, list_calendars for available calendars, list_events and get_event for reading events, and create/update/delete for writing events. No two tools perform the same function.

    Naming Consistency4/5

    All tools share the calendar_ prefix and use snake_case, with most following a verb_noun pattern (list_events, create_event). The exception is calendar_permissions, which is noun-only, causing a slight deviation from the otherwise consistent pattern.

    Tool Count5/5

    Seven tools is well within the ideal range for a focused domain. Each tool (permissions, list calendars, list events, get event, create, update, delete) serves a distinct purpose without redundancy or bloat.

    Completeness5/5

    The tool set covers the full lifecycle of calendar event management: permission check, listing calendars, listing/fetching events, and create/update/delete. It also handles recurrence edge cases in get/update/delete, leaving no obvious gaps for typical calendar tasks.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers