# Apple Calendar

Lets an agent work with the macOS calendar: search events, find free slots, create and edit entries. Writes stay off until you turn them on.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 5
- Author: mgcrea
- License: MIT · policy=link-only · description only; the file stays with the author
- Source: https://github.com/mgcrea/cupertino/tree/HEAD/packages/calendar
- Updated: 2026-10-22
- HTML: https://affpapa.org/en/nevibecode/mcp/mgcrea-apple-calendar

## What it does

The server reads the calendar store already present on your Mac and exposes accounts, calendars and events to the model. Queries run over a date range, and a separate tool answers free-time questions. Mutating tools appear only when `APPLE_CALENDAR_ALLOW_WRITES=1` is set — with the flag off the model never sees them.

Reads and writes travel different paths. Every read goes through SQLite opened read-only; writes go through Apple Events. The process that launches the server — Terminal, iTerm, VS Code — needs Full Disk Access, because there is no fallback for reads. Automation → Calendar matters only for writes, so a read-only setup triggers no Automation prompt.

A few details trip people up. The store sits at `~/Library/Group Containers/group.com.apple.calendar/Calendar.sqlitedb`, not under `~/Library/Calendars`. Recurring events live in a cache table, so a plain range query misses expanded repeats. Timestamps count seconds from 2001, not 1970. The default range is 7 days and a caller-supplied range is capped at 366.

## Requirements
- Needs: Node.js (commands run via npx)
- Environment variables: `APPLE_CALENDAR_ALLOW_WRITES`, `APPLE_CALENDAR_CALENDARS`, `APPLE_CALENDAR_ACCOUNTS` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env APPLE_CALENDAR_ALLOW_WRITES=<APPLE_CALENDAR_ALLOW_WRITES> --env APPLE_CALENDAR_CALENDARS=<APPLE_CALENDAR_CALENDARS> --env APPLE_CALENDAR_ACCOUNTS=<APPLE_CALENDAR_ACCOUNTS> --transport stdio calendar -- npx -y @mgcrea/mcp-apple-calendar
```
Replace <…> with your own values

### Codex

**Platform CLI**
```bash
codex mcp add calendar --env APPLE_CALENDAR_ALLOW_WRITES=<APPLE_CALENDAR_ALLOW_WRITES> --env APPLE_CALENDAR_CALENDARS=<APPLE_CALENDAR_CALENDARS> --env APPLE_CALENDAR_ACCOUNTS=<APPLE_CALENDAR_ACCOUNTS> -- npx -y @mgcrea/mcp-apple-calendar
```
Replace <…> with your own values

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "calendar": {
            "command": "npx",
            "args": [
                "-y",
                "@mgcrea/mcp-apple-calendar"
            ],
            "env": {
                "APPLE_CALENDAR_ALLOW_WRITES": "<APPLE_CALENDAR_ALLOW_WRITES>",
                "APPLE_CALENDAR_CALENDARS": "<APPLE_CALENDAR_CALENDARS>",
                "APPLE_CALENDAR_ACCOUNTS": "<APPLE_CALENDAR_ACCOUNTS>"
            }
        }
    }
}
```
Replace <…> with your own values

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "calendar": {
            "type": "stdio",
            "command": "npx",
            "args": [
                "-y",
                "@mgcrea/mcp-apple-calendar"
            ],
            "env": {
                "APPLE_CALENDAR_ALLOW_WRITES": "<APPLE_CALENDAR_ALLOW_WRITES>",
                "APPLE_CALENDAR_CALENDARS": "<APPLE_CALENDAR_CALENDARS>",
                "APPLE_CALENDAR_ACCOUNTS": "<APPLE_CALENDAR_ACCOUNTS>"
            }
        }
    }
}
```
Replace <…> with your own values

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e APPLE_CALENDAR_ALLOW_WRITES=<APPLE_CALENDAR_ALLOW_WRITES> -e APPLE_CALENDAR_CALENDARS=<APPLE_CALENDAR_CALENDARS> -e APPLE_CALENDAR_ACCOUNTS=<APPLE_CALENDAR_ACCOUNTS> calendar npx -y @mgcrea/mcp-apple-calendar
```
Replace <…> with your own values

## When to use it
- find a free two-hour slot this week
- pull every meeting from last month
- add an event to a specific calendar
- check what moved after a reschedule
- clear out cancelled meetings in bulk

## Example prompts
- Show my meetings for tomorrow
- Find two free hours on Thursday afternoon
- Create an event called Standup in the Work calendar at 15:00

## Similar
- [Reactive Resume](https://affpapa.org/en/nevibecode/mcp/reactive-resume.md) — MCP server · ★ 44908
- [screenpipe](https://affpapa.org/en/nevibecode/mcp/screenpipe.md) — MCP server · ★ 22082
- [Inbox Zero](https://affpapa.org/en/nevibecode/mcp/inbox-zero.md) — MCP server · ★ 12826
- [kaneo](https://affpapa.org/en/nevibecode/mcp/kaneo.md) — MCP server · ★ 9623
- [Mindwtr](https://affpapa.org/en/nevibecode/mcp/mindwtr.md) — MCP server · ★ 2330
- [Azure DevOps (ADO)](https://affpapa.org/en/nevibecode/mcp/azure-devops-ado.md) — MCP server · ★ 2071

## Other versions with the same name
- [Apple Calendar · jonathanrreed](https://affpapa.org/en/nevibecode/mcp/apple-calendar.md) — ★ 31

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
