Skip to main content
Glama
jaydenk

Fantastical MCP

by jaydenk

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

Related MCP server: calendar-app-mcp

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

  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

Available Tools

16 tools
create_eventA

Create a new event in Fantastical using natural language.

Fantastical's parser handles dates, times, locations, and recurrence naturally. Examples: "Lunch with Sara tomorrow at noon at The Crafers Hotel", "Weekly team standup every Monday at 9am".

Args: sentence: Natural language event description. calendar: Optional calendar name to create the event in. add_immediately: If True, add without showing confirmation UI (default False).

ParametersJSON Schema
NameRequiredDescriptionDefault
sentenceYes
calendarNo
add_immediatelyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It explains the natural language parser and the add_immediately parameter's effect on UI. However, it omits details on permissions, error handling, or side effects like overriding existing events.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly concise with a few sentences and bullet-style param list. It includes examples. Could be slightly more structured but effectively conveys key info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be detailed in description. However, the description lacks mentions of error handling, permission requirements, or what happens if the natural language parsing fails. Given the tool's complexity, it could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the 'sentence' parameter as natural language description, 'calendar' as optional calendar name, and 'add_immediately' as skipping confirmation. This adds significant meaning beyond the schema's type/default info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new event in Fantastical using natural language.' It specifies the verb (create) and resource (event in Fantastical), and distinguishes from sibling tools that are all get/search operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when to use (creating events with natural language) and includes examples. However, it does not explicitly state when not to use this tool or mention alternative tools for other scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_availabilityA

Show free/busy time slots for a specific date.

Args: date: Date in YYYY-MM-DD format. calendars: Optional list of calendar names to check. If omitted, checks all calendars.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
calendarsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It states that the tool shows free/busy slots, but does not explain the nature of the output (e.g., blocked vs. free intervals), whether it considers only existing events or other availability factors, or if there are limitations like time range or permissions. This lack of detail limits transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a single introductory line followed by a brief 'Args' section. Every sentence serves a purpose, and the structure is front-loaded with the core function. No unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters) and the existence of an output schema, the description is partially adequate. However, it misses context about how free/busy slots are determined (e.g., based on events from specified calendars) and what the output represents (time intervals with status?). With many sibling event tools, more context would help an agent decide when to use this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description's parameter explanations are essential. It adds value by specifying the date format ('YYYY-MM-DD') and clarifying that the calendars parameter defaults to checking all calendars. This goes beyond the schema's type annotations. However, it could further explain acceptable values for calendar names (e.g., from get_calendars).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Show free/busy time slots for a specific date.' This is a specific verb-resource combination that distinguishes it from sibling tools like get_events_in_range (which returns detailed events) or show_date (which may show a full schedule). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There is no mention of use cases, prerequisites, or when not to use it. Given the many sibling tools for fetching events, the lack of context makes it harder for an AI agent to choose appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_calendarsA

List all calendars with their event counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but adequately discloses that the tool is a read-only listing operation returning calendar names with counts. No side effects or additional behavioral details are needed for this simple tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is perfectly front-loaded and contains no extraneous words. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists, the description is complete. It succinctly captures the essential function: listing all calendars with event counts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the baseline is 4. The description does not need to add parameter semantics, and it correctly omits any irrelevant information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all calendars with their event counts, specifying both the resource (calendars) and the additional data (event counts). This distinguishes it from sibling tools focused on individual events or different operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool over alternatives. It does not mention any prerequisites, limitations, or exclusions, leaving the agent to infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventA

Get full details for a specific event by its ID.

Args: event_id: The event ID (shown in parentheses in event listings).

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It only states it 'gets' details, implying a read operation, but does not mention any side effects, authentication requirements, rate limits, or constraints. This lacks transparency for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one sentence for the tool purpose and one line for the parameter. Every word is useful and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and an output schema (so return values are documented elsewhere), the description is nearly complete. It explains the purpose and the parameter source. Minor gaps: no mention of error handling or required permissions, but acceptable given the simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter (event_id) with 0% description coverage. The description adds context: 'The event ID (shown in parentheses in event listings).' This tells the agent where to find the ID, which is helpful beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get full details for a specific event by its ID.' This is a specific verb-resource pair, and it distinguishes from sibling tools like get_events_by_calendar or search_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (when you have a specific event ID) via the parameter hint, but does not explicitly state when not to use it or compare with alternatives like get_events_in_range or search_events.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_event_jsonA

Machine-readable variant of get_event. Returns None-valued fields when a value is absent rather than omitting them, so clients can treat the shape as stable.

Args: event_id: The event rowid (as returned by get_today_json etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses a key behavioral trait: returning None-valued fields instead of omitting them. It also implies read-only behavior via 'variant of get_event'. However, it does not mention authorization or rate limits, but these are not critical for a simple get tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loading the purpose and behavior, followed by a clear parameter explanation. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description appropriately focuses on the key behavioral difference and parameter source. It does not need to detail return values. However, it could mention any prerequisites or error scenarios for full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains that event_id is the event rowid as returned by other tools, adding context beyond the schema's integer type. Since schema coverage is 0%, this compensation is valuable, though there is only one parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a machine-readable variant of get_event, specifying that it returns None-valued fields when absent for a stable shape. This distinguishes it from get_event and other siblings, providing a clear purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for machine readability and stable shape, but does not explicitly state when to prefer this over siblings like get_event or get_today_json. The mention of event_id being returned by get_today_json etc. hints at a workflow, but lacks clear guidelines.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_events_by_calendarA

Get events from a specific calendar.

Args: calendar: Calendar name (e.g. "Work", "Personal"). Use get_calendars to see available names. days: Number of days to look ahead (default 30).

ParametersJSON Schema
NameRequiredDescriptionDefault
calendarYes
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It discloses the lookahead behavior (days parameter with default 30) but does not mention sorting, timezone handling, or whether events are future-only from now. Partial transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is short and front-loaded with the main purpose. The Args section is helpful but slightly verbose with code block formatting. Each sentence adds value, though the formatting could be streamlined.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema is present, so return structure is covered. However, missing details like pagination, maximum days allowed, error handling, or event ordering. Adequate for a simple list tool but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description compensates by explaining calendar as a name string and days as number of days ahead with a default value. Adds meaning beyond the raw schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get events from a specific calendar', identifying the verb (get) and resource (events from calendar). It distinguishes from sibling tools like get_calendars (which lists calendars) and get_events_in_range (which may not be calendar-specific).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a hint to use get_calendars to find available calendar names, but does not explicitly state when to use this tool versus alternatives like get_events_in_range or get_upcoming. Usage context is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_events_in_rangeA

Get events in an arbitrary date window (past or future), grouped by date.

Specify the window in exactly ONE of two ways (not both):

  • Absolute: pass both start and end as "YYYY-MM-DD". end is inclusive of the whole day (e.g. start="2026-05-28", end="2026-06-10" covers all of the 10th).

  • Relative: pass days_back (a positive integer) for events from that many days ago through the end of today.

Args: calendar: Optional calendar name to scope to (use get_calendars for names). Omit to query all calendars — note that an event mirrored across several calendars then appears once per calendar; scope to a single calendar to get a clean, duplicate-free list. start: Absolute-mode start date, "YYYY-MM-DD". end: Absolute-mode end date, "YYYY-MM-DD" (inclusive). days_back: Relative-mode window size in days.

ParametersJSON Schema
NameRequiredDescriptionDefault
calendarNo
startNo
endNo
days_backNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that events are grouped by date, end is inclusive, and duplicate behavior across calendars. It could mention it is read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear intro, two usage modes, and an Args section. It is slightly verbose but efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity and lack of annotations, the description is comprehensive, covering all parameters, edge cases, and grouping behavior. Output schema exists, so return values are not needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining each parameter thoroughly: calendar, start, end, days_back, including format, constraints, and the mutually exclusive modes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get events in an arbitrary date window (past or future), grouped by date.' This is specific and distinguishes it from sibling tools like get_today or get_upcoming.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the two modes (absolute and relative) and advises on calendar scoping to avoid duplicates, providing context on when to use this tool. However, it does not explicitly state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invitationsB

List pending event invitations that need a response.

Args: limit: Maximum number of results (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It mentions listing pending invitations but does not disclose read-only nature, permission requirements, or pagination behavior beyond the limit parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short and to the point, with purpose stated first. Efficient use of words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple list tool with one parameter and output schema, but misses usage guidance and behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The parameter 'limit' has a default in schema, and description repeats the default value and adds 'maximum number of results.' Schema coverage is 0%, so description adds minimal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' and the resource 'pending event invitations that need a response,' which uniquely identifies its purpose among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus sibling tools like get_upcoming or get_events_by_calendar. The description does not include exclusion criteria or alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recentA

Show the most recently added or synced calendar events.

Useful for seeing what's new on the calendar without knowing specific dates.

Args: limit: Maximum number of results (default 10).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only mentions showing recent events and the limit parameter, but fails to disclose any behavior beyond that, such as what constitutes 'recent', ordering, or any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: two sentences plus an args line. Every sentence adds value, and the key info is front-loaded. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a simple tool with one parameter and an output schema present, the description covers the purpose and parameter well. However, it lacks details about the output schema content and sorting order of results, leaving some ambiguity about what 'recent' means.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It fully explains the single parameter 'limit' with its default value and meaning ('Maximum number of results'), which is clear and sufficient for agent use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool shows 'most recently added or synced calendar events', a specific verb and resource. This distinguishes it from sibling tools like get_upcoming or get_today, which focus on upcoming events or today's events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says it's 'useful for seeing what's new on the calendar without knowing specific dates', which gives clear guidance on when to use it. However, it does not explicitly mention alternatives or when not to use, but the context is strong given the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recurringA

List upcoming recurring events, optionally filtered by calendar.

Useful for understanding the regular schedule (standups, focus blocks, etc.).

Args: calendar: Optional calendar name to filter by. Use get_calendars to see available names. limit: Maximum number of results (default 50).

ParametersJSON Schema
NameRequiredDescriptionDefault
calendarNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the tool is read-only (list), mentions optional filtering and limit, and defines 'upcoming' implicitly. However, it doesn't clarify if it returns only the next occurrence or all future occurrences, nor does it mention any behavioral traits like time range constraints. The presence of an output schema slightly mitigates this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences and a short args list. The purpose is front-loaded, and every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 optional params, output schema present), the description adequately covers purpose and parameter usage. It lacks an explicit definition of 'recurring' but is otherwise complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully explains both parameters: calendar is an optional filter with a hint to use get_calendars, and limit is the maximum results with default. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists 'upcoming recurring events', using a specific verb and resource. It distinguishes itself from sibling tools by specifying 'recurring', which is unique among the listed siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides some context ('Useful for understanding the regular schedule') and suggests using get_calendars for calendar names, but does not explicitly state when to use this tool over alternatives like get_upcoming or get_events_by_calendar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_todayA

Get all calendar events for today, grouped by calendar.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses grouping by calendar, but lacks details on timezone handling, inclusion of all-day events, or whether it returns events from all calendars. Minimal but acceptable for a simple tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that is front-loaded and contains only essential information. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of parameters, presence of an output schema, and the description's explicit grouping behavior, this is nearly complete. However, it does not clarify whether 'today' includes events spanning multiple days or only events strictly within today's date.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has 0 parameters and schema coverage is 100%. Description does not need to explain parameters, and it correctly omits them. Baseline for 0 parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Get' and resource 'all calendar events for today', with an additional detail 'grouped by calendar' that distinguishes it from siblings like get_events_in_range or get_upcoming.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as get_today_json or get_events_by_calendar. Does not mention preconditions or context for using it over other event-retrieval tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_today_jsonA

Machine-readable variant of get_today.

Returns today's events as a structured dict so programmatic clients (dashboards, automations) don't have to parse the pretty-printed text output. Event times are ISO-8601 strings in the event's original timezone.

Response shape::

{
  "now": ISO-8601 string (current local time),
  "timezone": IANA name (e.g. "Australia/Adelaide"),
  "events": [{id, title, calendar, start, end, all_day,
              location, recurring, attendees_count}, ...]
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description takes full burden. It details the response shape, time format (ISO-8601), timezone, and fields. It doesn't mention read-only nature explicitly but it's implied. Overall, good transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three short paragraphs, front-loaded with purpose, and uses a code block for the response shape. Every sentence serves a purpose without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an output schema, the description is complete: it explains the relationship to get_today, the machine-readable nature, the response format with details on time representation. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the input schema is empty. The description adds no parameter information, but baseline for 0 params is 4. It does describe the output which is not required due to output schema presence, but still adds value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a machine-readable variant of get_today, returning a structured dict of today's events for programmatic clients. It distinguishes from sibling 'get_today' which is presumably text output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states it's for 'programmatic clients (dashboards, automations)', implying when to use. However, it does not explicitly state when not to use or list alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upcomingB

Get calendar events for the next N days, grouped by date.

Args: days: Number of days to look ahead (default 7).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits, but it only states the basic function. It does not mention read-only nature, permissions, rate limits, or any side effects, leaving significant gaps for a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with a clear front-loaded statement of purpose and a brief parameter explanation. Every sentence is essential and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the existence of an output schema, and only one optional parameter, the description covers the main functionality. It lacks behavioral context but is mostly complete for a straightforward get operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'days' has schema coverage 0%, and the description adds the phrase 'look ahead' and repeats the default, providing minimal extra meaning. But it does not specify valid range or behavior for edge cases.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get'), resource ('calendar events'), scope ('next N days'), and output format ('grouped by date'), distinguishing it from siblings like 'get_upcoming_json' and 'get_recent'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., get_upcoming_json, get_today). The description does not include any conditional or contextual recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upcoming_jsonA

Machine-readable variant of get_upcoming.

Args: days: Number of days to look ahead (default 7).

Response shape mirrors get_today_json but covers the next days days.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description should disclose behavioral traits. It does not mention side effects, authentication, rate limits, or what happens with edge cases (e.g., days=0, negative days, or no events). Only the basic mapping is described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with an Args section. Every sentence adds value: it identifies the tool's purpose, parameter, and relationship to siblings. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values need not be explained. The description references sibling tools and the response shape. However, it lacks coverage of error conditions, default behavior for missing days (though specified), and any limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the 'days' parameter: 'Number of days to look ahead (default 7).' This adds meaning beyond the schema, which only provides type and default. However, it does not specify valid range or behavior for edge values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'machine-readable variant of get_upcoming' and explains it covers the next *days* days, mirroring get_today_json. This distinguishes it from siblings like get_upcoming (human-readable) and get_today_json (today only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use: when machine-readable output is needed. It references get_upcoming and get_today_json as alternatives, providing context. However, it does not explicitly state when not to use this tool or mention specific conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_eventsB

Search events by title, location, notes, or attendees.

Args: query: Search term (supports FTS5 syntax: AND, OR, NOT, quotes for phrases). limit: Maximum number of results (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It mentions FTS5 syntax support but does not disclose read-only behavior, pagination, performance implications, or authentication needs. The description is insufficient for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a single sentence and an Args list. It is well-structured and front-loaded with the main purpose, though it could be slightly more efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, return values are not needed. However, the description does not address sorting, date range limitations, or when to use sibling tools. It is somewhat incomplete for a search tool with many siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description adds value by explaining query supports FTS5 syntax and limit has a default of 20. This compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Search' and the resource 'events', specifying the fields searched (title, location, notes, attendees). This differentiates it from siblings like get_event (single) or get_events_in_range (date range).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives, such as filtering by dates or calendars. No when-to-use or when-not-to-use context is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_dateA

Open Fantastical's mini calendar to a specific date.

Args: date: Date in YYYY-MM-DD format.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears full responsibility for behavioral disclosure. It only states an action ('Open') without explaining side effects, permissions needed, error handling for invalid dates, or what the tool returns (despite having an output schema). This is insufficient for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one sentence for the action and one line for the parameter. It front-loads the core purpose with no filler. Every word earns its place, making it efficient for agent parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool, the description is adequate but not fully complete. It fails to describe the output (an output schema exists but is not mentioned) and does not clarify what 'open' entails (e.g., is it a UI focus, a popup?). This leaves minor but notable gaps in understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate. It specifies the date format as 'YYYY-MM-DD', which adds essential information beyond the schema's plain 'string' type. While it does not provide ranges or validation rules, the format hint is valuable and meets most of the need for a single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Open' and the resource 'Fantastical's mini calendar' with a specific scope: 'to a specific date'. This is distinct from sibling tools which are primarily data retrieval or event creation, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like get_today or search_events. There is no mention of prerequisites, context, or scenarios where show_date is preferred, leaving the agent without comparative information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 16 tool updatesv0.1.6
    • First observedcreate_event
    • First observedget_availability
    • First observedget_calendars
    • First observedget_event
    • First observedget_event_json
    • First observedget_events_by_calendar
    • First observedget_events_in_range
    • First observedget_invitations
    • First observedget_recent
    • First observedget_recurring
    • First observedget_today
    • First observedget_today_json
    • First observedget_upcoming
    • First observedget_upcoming_json
    • First observedsearch_events
    • First observedshow_date

TDQS

A3.7/5.0
Disambiguation4/5

Tools are largely distinct, but some overlap exists between get_today, get_upcoming, get_events_in_range, and get_recent, which all retrieve events over different time windows. Descriptions help distinguish them, but an agent might occasionally select the wrong one.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., create_event, get_calendars, search_events). The pattern is predictable and easy to understand.

Tool Count4/5

16 tools is slightly on the high side for a calendar server, but each tool addresses a specific query need (today, upcoming, range, recurring, etc.). The JSON variants could be merged, but overall the count is still reasonable.

Completeness2/5

The tool surface is heavily read-oriented. While create_event is present, there are no tools for updating or deleting events, nor for responding to invitations. This leaves significant gaps in event lifecycle management.

Maintenance

ActivityStale
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to read, create, update, and delete data in macOS apps (Reminders, Calendar, Notes, Mail, Messages, Contacts) via natural language, using EventKit, JXA, and SQLite backends.
    51
    5
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Enables querying and managing Fantastical calendars and events via the MCP protocol, allowing AI assistants to list calendars, create events using natural language, and search or retrieve event details.
    6
    4
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jaydenk/fantastical-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server