List, read, create, update, delete, and search Apple Calendar events — powered by a compiled Swift binary using EventKit for sub-second performance.
You must keep your Mac unlocked and visible, ask your agent to call a calendar tool, then click Allow on the macOS Calendar permission modal.
If you do not accept that modal, the plugin will keep returning permission denied.
AppleScript calendar queries take 30+ seconds on large calendars. This plugin uses a compiled Swift binary that calls EventKit directly:
- Date-range queries use
predicateForEvents(indexed) — < 100ms even with thousands of events - UID lookups use
store.event(withIdentifier:)— O(1) - Search uses
localizedCaseInsensitiveContains— native, fast, accent-aware - The binary auto-compiles from source on first use via
swiftc -Oand caches itself
- macOS (EventKit is a macOS framework)
- Swift toolchain (ships with Xcode or Xcode Command Line Tools)
- Calendar access permission (granted on first run)
- OpenClaw gateway running on macOS host (not in a container)
openclaw plugins install openclaw-apple-calendarFrom source:
git clone https://github.com/androidStern-personal/openclaw-apple-calendar.git
openclaw plugins install ./openclaw-apple-calendarAfter installing, grant calendar access to the helper app identity:
- Restart the gateway:
openclaw gateway restart(oroc-restart) - Keep your Mac unlocked and trigger any calendar tool (e.g., list calendars) — this compiles the helper on first use and launches
calendar-helper.app - Accept the macOS Calendar permission modal when it appears
- Open System Settings > Privacy & Security > Calendars
- Find "OpenClaw Calendar" in the list and toggle it on
If needed, force explicit launch mode:
OPENCLAW_CALENDAR_HELPER_MODE=app openclaw gateway restartModes:
OPENCLAW_CALENDAR_HELPER_MODE=auto(default): try app launch first, fallback to direct execution.OPENCLAW_CALENDAR_HELPER_MODE=app: require app launch only.OPENCLAW_CALENDAR_HELPER_MODE=direct: run the helper binary directly (useful for tests/headless environments).
Add to ~/.openclaw/openclaw.json:
{
"plugins": {
"entries": {
"openclaw-apple-calendar": {
"enabled": true
}
}
}
}Tools are registered as optional: true and must be explicitly allowed:
{
"tools": {
"sandbox": {
"tools": {
"allow": ["group:runtime", "group:fs", "openclaw-apple-calendar"]
}
}
}
}openclaw gateway restart
openclaw plugins list
# Should show: Apple Calendar | openclaw-apple-calendar | loaded| Tool | Description |
|---|---|
apple_calendar_list |
List all calendars with name and writable status |
apple_calendar_events |
List events in a date range (default: today) |
apple_calendar_read |
Read full event details by UID |
apple_calendar_create |
Create a new event in a writable calendar |
apple_calendar_update |
Update an existing event by UID |
apple_calendar_delete |
Delete an event by UID |
apple_calendar_search |
Search events by text (summary, location, description) |
List my calendars
Show me today's events
Show me the next 7 days of events with days_ahead=7
Create a meeting tomorrow at 9am on my Personal calendar called "Team Standup"
Search for "dentist" in the next 90 days
Update event UID "ABC-123" — change location to "Conference Room B"
Delete event UID "ABC-123"
| Type | Format | Example |
|---|---|---|
| Timed event | YYYY-MM-DD HH:MM |
2026-01-15 10:00 |
| All-day event | YYYY-MM-DD |
2026-02-01 |
- Runs a compiled Swift binary as a local subprocess — no network calls
- Requires macOS EventKit permission (granted via system prompt on first access)
- Tools are
optional: true— must be explicitly allowed in sandbox config - Only writable calendars accept modifications (read-only calendars are protected)
bun install
bun test # run all testsTests create real calendar events tagged with a unique timestamp and clean them up in afterAll. No mock calendar needed.
MIT