Skip to main content

Fantastical calendar MCP server — read events from Fantastical's local database, create via URL scheme

Project description

Fantastical MCP

Publish to PyPI

An MCP server that gives AI assistants read/write access to your Fantastical calendar on macOS.

What it does

fantastical-mcp reads calendar events directly from Fantastical's local SQLite database and creates events via Fantastical's x-fantastical3:// URL scheme. No TCC permissions, no API keys, no network access -- it works entirely offline using the data Fantastical already stores on your Mac.

  • Read -- Query events by date range, calendar, or full-text search
  • Recurring events -- Series are expanded into per-occurrence results with timezone-aware rule evaluation and de-duplication of moved occurrences
  • Write -- Create events using Fantastical's natural language parser
  • Navigate -- Open Fantastical to a specific date

Installation

Prerequisites

  • macOS
  • Fantastical installed with at least one calendar
  • An MCP client, such as Claude Desktop or Claude Code
  • uv Python package manager: brew install uv

Install via uvx (Any MCP Client)

Fantastical MCP is published on PyPI and can be run directly with uvx:

uvx fantastical-mcp

Configure your MCP client to use uvx with fantastical-mcp as the argument.

Claude Desktop

Option 1: One-Click Install (Recommended)

  1. Download the latest .mcpb file from the releases page
  2. Double-click the file
  3. Done!

Option 2: Manual Config

  1. Go to Claude → Settings → Developer → Edit Config
  2. Add the Fantastical server:
{
  "mcpServers": {
    "fantastical": {
      "command": "uvx",
      "args": ["fantastical-mcp"]
    }
  }
}
  1. Save and restart Claude Desktop

Claude Code

claude mcp add-json fantastical '{"command":"uvx","args":["fantastical-mcp"]}'

To make it available globally (across all projects), add -s user:

claude mcp add-json -s user fantastical '{"command":"uvx","args":["fantastical-mcp"]}'

Verify it's working

After installation:

  • If using Claude Desktop, you should see "Fantastical MCP" in the "Search and tools" list
  • Try asking: "What's on my calendar today?"

Sample Usage

  • "What's on my calendar today?"
  • "Do I have any meetings on Thursday?"
  • "Create a lunch meeting with Sarah tomorrow at noon at The Italian Place"
  • "When am I free this Wednesday afternoon?"
  • "Show me all events from my Work calendar this week"
  • "Do I have any pending event invitations?"

Tips

  • Create a project in Claude with custom instructions that explain how you organise your calendars. Tell Claude which calendars to prioritise and how you like events formatted.
  • Pair with a task management MCP server (like things-mcp) so Claude can cross-reference your tasks and calendar, block time for deep work, or create todos from upcoming meetings.
  • Use get_availability to quickly find free slots: "When am I free for a 90-minute block this week?"

Local Development

git clone https://github.com/jaydenk/fantastical-mcp.git
cd fantastical-mcp
uv venv && uv pip install -e ".[test]"

See docs/configuration.md for environment variables, calendar exclusion, and transport options.

Available tools

Tool Description
get_today All events for today, grouped by calendar
get_upcoming Events for the next N days, grouped by date
get_calendars List all calendars with event counts
get_event Full details for a specific event by ID
search_events Full-text search across titles, locations, notes, attendees
get_events_by_calendar Events from a specific calendar
get_events_in_range Events in an arbitrary date window (past or future), optionally scoped to one calendar
get_availability Free/busy time slots for a date
get_recurring Upcoming recurring events, optionally filtered by calendar
get_invitations Pending event invitations that need a response
get_recent Most recently added or synced events
get_today_json Structured JSON variant of get_today for programmatic clients
get_upcoming_json Structured JSON variant of get_upcoming
get_event_json Structured JSON variant of get_event
create_event Create an event using natural language
show_date Open Fantastical's mini calendar to a date

See docs/tools.md for parameters, types, defaults, and example output.

Troubleshooting

If it's not working:

  1. Make sure Fantastical is installed and has been opened at least once

    • The Fantastical database needs to exist for the server to read events
  2. Claude Desktop can't find uvx

    • Install uv globally with Homebrew (brew install uv)
    • Alternative: Use the full path to uvx in your config. Find it with which uvx (typically /Users/USERNAME/.local/bin/uvx)
  3. "Database not found" errors

    • Fantastical stores its database at ~/Library/Group Containers/group.com.flexibits.fantastical2.mac/. Ensure this path exists and is accessible.
  4. System calendars cluttering results

    • Set FANTASTICAL_EXCLUDED_CALENDARS to hide calendars like Weather or Openings. See docs/configuration.md for details.

Limitations

  • No update or delete -- Fantastical's URL scheme only supports event creation. Modification and deletion require EventKit, which needs TCC permissions.
  • macOS only -- Relies on Fantastical's macOS database location and the open command.
  • Read-only database access -- The database is opened in ?mode=ro to prevent any risk of corruption.
  • Blob format dependency -- The NSKeyedArchiver serialisation format is an internal detail of Fantastical and could change between versions. An FTS fallback path mitigates this.

Documentation

Licence

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fantastical_mcp-0.1.6.tar.gz (122.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fantastical_mcp-0.1.6-py3-none-any.whl (27.6 kB view details)

Uploaded Python 3

File details

Details for the file fantastical_mcp-0.1.6.tar.gz.

File metadata

  • Download URL: fantastical_mcp-0.1.6.tar.gz
  • Upload date:
  • Size: 122.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for fantastical_mcp-0.1.6.tar.gz
Algorithm Hash digest
SHA256 80b460b97217adf3b1d3eddfdd5ce9d5dc67e11f9c6963665a9d480dfc2f2ed8
MD5 2c6a0af086ff3ff96744fefbdad577a7
BLAKE2b-256 ebf7e599cf4035c2ef53cb0a353d3b34bfe62ef1ee39562b31a9cc5fadbc48ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for fantastical_mcp-0.1.6.tar.gz:

Publisher: publish.yml on jaydenk/fantastical-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fantastical_mcp-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: fantastical_mcp-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 27.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for fantastical_mcp-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 1575a1a95cca23a8bc928492c65faeb33bc6353c841be76972a461f61bee32e8
MD5 72b0c6d55d226ab1bd1cef982c5b5188
BLAKE2b-256 69e1792de70eecfe1a1c7d919a9490669d5fbfa7dd5b5c03ed028045b07b4006

See more details on using hashes here.

Provenance

The following attestation bundles were made for fantastical_mcp-0.1.6-py3-none-any.whl:

Publisher: publish.yml on jaydenk/fantastical-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page