Read-only Mac Calendar MCP server with indexed archive search.
Project description
Mac Calendar MCP
Read-only Mac Calendar MCP server with indexed archive search. It exposes Apple Calendar data to MCP clients through a small read surface for listing calendars, browsing event ranges, reading event details, searching archived events, and building agendas.
This package is developed in the
apple-app-mcp workspace alongside
Mac Mail MCP.
Quick Start
pipx install mac-calendar-mcp
Add to your MCP client:
{
"mcpServers": {
"calendar": {
"command": "mac-calendar-mcp",
"args": ["--watch", "serve"]
}
}
}
Build the Search Index (Recommended)
# Requires Calendar automation permission for Terminal or your MCP client
# System Settings -> Privacy & Security -> Automation
mac-calendar-mcp index
The index enables fast archive search and date-range reads from a local SQLite and FTS5 database.
Run the MCP server with watch mode to periodically refresh the index while events change in Calendar.app:
mac-calendar-mcp --watch serve
Watch mode defaults to a 300-second refresh interval. Override it with
--watch-interval SECONDS when you need faster updates.
Configure (Optional)
mac-calendar-mcp init # writes ~/.mac-calendar-mcp/config.toml
Mac Calendar MCP reads settings from environment variables and an optional
TOML config file at $HOME/.mac-calendar-mcp/config.toml. The init
command writes a commented template with every available key and refuses to
overwrite an existing config unless --force is passed.
Common environment variables:
| Variable | Purpose |
|---|---|
APPLE_CALENDAR_INDEX_PATH |
Override the SQLite index location. |
APPLE_CALENDAR_INDEX_STALENESS_HOURS |
Hours before an index is considered stale. |
APPLE_CALENDAR_INDEX_PAST_YEARS |
Limit historical indexing window. |
APPLE_CALENDAR_INDEX_FUTURE_YEARS |
Limit future indexing window. |
APPLE_CALENDAR_DEFAULT_CALENDARS |
Comma-separated default calendar names or IDs. |
Tools
| Tool | Purpose |
|---|---|
list_calendars() |
List accessible calendars |
get_events(start, end, calendar_ids?, limit?, offset?) |
List event occurrences in a date range |
get_event(event_id, occurrence_start?) |
Get full event or occurrence detail |
search_events(query, start?, end?, calendar_ids?, fields?, limit?, offset?) |
Search indexed event archives |
get_agenda(start?, days?, calendar_ids?) |
Chronological agenda helper |
calendar_index_status() |
Index health and coverage summary |
All tools are read-only. The server does not create, update, delete, RSVP, subscribe to calendars, or open Calendar.app UI in v1.
Search and Indexing
Calendar search is backed by SQLite and FTS5. Indexed fields include event title, location, notes, URL, attendee names/emails, and calendar name.
Recurring events are expanded into occurrence rows for listing and search. The
current recurrence layer supports common daily, weekly, monthly, and yearly
patterns, including intervals, counts, until dates, weekly BYDAY, and Calendar
exception dates. Unsupported recurrence rules are counted in index status
instead of being silently treated as complete.
Configuration
Per-client env overrides via the MCP client's launch config work:
{
"mcpServers": {
"calendar": {
"command": "mac-calendar-mcp",
"env": {
"APPLE_CALENDAR_DEFAULT_CALENDARS": "Work,Personal",
"APPLE_CALENDAR_INDEX_FUTURE_YEARS": "2"
}
}
}
}
The default index path is $HOME/.mac-calendar-mcp/index.db.
CLI Usage
All read tools are also available as standalone CLI commands:
mac-calendar-mcp calendars
mac-calendar-mcp init
mac-calendar-mcp index
mac-calendar-mcp status
mac-calendar-mcp search "quarterly planning" --limit 10
mac-calendar-mcp events 2026-05-01 2026-06-01 --limit 50
mac-calendar-mcp agenda --days 7
mac-calendar-mcp rebuild
All data commands output JSON where practical.
Development
git clone https://github.com/wagamama/apple-app-mcp
cd apple-app-mcp
uv sync
uv run ruff check packages/mac-calendar-mcp/src
uv run --package mac-calendar-mcp pytest packages/mac-calendar-mcp/tests
uv build --package mac-calendar-mcp
See CALENDAR.md for domain architecture, tool design,
testing guidance, and implementation notes.
License
GPL-3.0-or-later
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mac_calendar_mcp-0.5.1.tar.gz.
File metadata
- Download URL: mac_calendar_mcp-0.5.1.tar.gz
- Upload date:
- Size: 21.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69e23f374c8c3cfdc691d1e5b5a4ddb0cd58bd93db948fc4c486de412e9914ac
|
|
| MD5 |
c34b027598ee098eebfc0bfe2a5a9746
|
|
| BLAKE2b-256 |
6fce9eae5c87c62a7b2ae74663bfe2b9a391b0b08289b0f159cb42ca7d0cce22
|
Provenance
The following attestation bundles were made for mac_calendar_mcp-0.5.1.tar.gz:
Publisher:
release.yml on wagamama/apple-app-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mac_calendar_mcp-0.5.1.tar.gz -
Subject digest:
69e23f374c8c3cfdc691d1e5b5a4ddb0cd58bd93db948fc4c486de412e9914ac - Sigstore transparency entry: 1678548455
- Sigstore integration time:
-
Permalink:
wagamama/apple-app-mcp@05ce41ae5fac49deaae1750712fe4a0fb5af56ed -
Branch / Tag:
refs/tags/v0.5.1 - Owner: https://github.com/wagamama
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@05ce41ae5fac49deaae1750712fe4a0fb5af56ed -
Trigger Event:
push
-
Statement type:
File details
Details for the file mac_calendar_mcp-0.5.1-py3-none-any.whl.
File metadata
- Download URL: mac_calendar_mcp-0.5.1-py3-none-any.whl
- Upload date:
- Size: 22.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e685e3b387a077a9ec0446f838b4166ebdf2ac6571fde0192391ab09084422c6
|
|
| MD5 |
f852469b748d931161ff3ffa14f6ea03
|
|
| BLAKE2b-256 |
a4db67d7d7e5e474c52421a09476b958dffd575d634270c268152bba2c1f61c2
|
Provenance
The following attestation bundles were made for mac_calendar_mcp-0.5.1-py3-none-any.whl:
Publisher:
release.yml on wagamama/apple-app-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mac_calendar_mcp-0.5.1-py3-none-any.whl -
Subject digest:
e685e3b387a077a9ec0446f838b4166ebdf2ac6571fde0192391ab09084422c6 - Sigstore transparency entry: 1678548699
- Sigstore integration time:
-
Permalink:
wagamama/apple-app-mcp@05ce41ae5fac49deaae1750712fe4a0fb5af56ed -
Branch / Tag:
refs/tags/v0.5.1 - Owner: https://github.com/wagamama
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@05ce41ae5fac49deaae1750712fe4a0fb5af56ed -
Trigger Event:
push
-
Statement type: