Skip to main content
Glama

icskit-mcp

Let your AI work with the .ics calendar files on your own disk: agenda, search, free time, conflicts and safe edits. No account, no OAuth, no network.

icskit-mcp is an MCP server for local iCalendar files: the .ics export from Google Calendar, Apple Calendar or Outlook, or a folder of them.

What is different about it. Other .ics MCP servers lean on a calendar library or only read published feeds. This one ships its own RFC 5545 parser and recurrence engine, and the part that is usually wrong in calendar tools is the part that is tested hardest:

  • Daylight saving is exact. A 09:00 Berlin meeting stays at 09:00 Berlin across the clock change; a time that falls in the spring-forward gap or the fall-back overlap is resolved the way RFC 5545 says; DTEND lengths are real elapsed time; free-time search keeps your wall-clock working hours on 23 and 25 hour days. Tested against America/New_York, Europe/Berlin and Europe/Istanbul (which has no DST), for IANA zones and for custom VTIMEZONE blocks such as Outlook's W. Europe Standard Time.

  • Recurrence is checked against the spec. 30 worked examples from RFC 5545 section 3.8.5.3 (the ones that use supported parts) are test cases, and about a thousand randomized rules are compared against python-dateutil as an independent oracle.

  • Writes are safe by construction. Editing works by line surgery: everything you did not ask to change (other events, VTIMEZONE, VALARM, unknown X- properties, folding, line endings, a BOM) stays byte for byte. By default the original is never touched; you get an edited copy or a patch.

  • Local only. Nothing is sent anywhere. Attendee email addresses are just text in the file.

  • Several calendars at once: free time and conflicts work across all of them.

It is free and MIT licensed, with no paid tier.

Install

You need uv. Pick the folder that holds your .ics files; the server can see only that folder (searched recursively).

Claude Code

claude mcp add icskit -- uvx icskit-mcp --dir "/path/to/calendars"

Claude Desktop - add this to claude_desktop_config.json (Settings, Developer, Edit config):

{
  "mcpServers": {
    "icskit": {
      "command": "uvx",
      "args": ["icskit-mcp", "--dir", "C:\\Users\\you\\Calendars"]
    }
  }
}

(--dir can also be given as the ICSKIT_MCP_DIR environment variable.)

Getting your calendars out

  • Google: Settings, Import & export, Export. You get a zip of one .ics per calendar.

  • Apple Calendar: File, Export, Export...

  • Outlook: File, Save Calendar (or "Export" in the new Outlook), choose iCalendar format.

Related MCP server: MCP Calendar Tools

Try asking

  • "What does my week of 2026-03-02 look like? Use Europe/Istanbul."

  • "When am I free for 90 minutes next Tuesday and Wednesday, between 10:00 and 16:00, with 15 minutes of buffer around meetings?"

  • "Do any of my calendars have meetings that overlap this month?"

  • "What are the next 6 times my 'Board sync' happens?"

  • "Find every event with anna@example.com that is not cancelled."

  • "Add a dentist appointment on 2026-03-10 at 15:00 for 45 minutes (Europe/Istanbul). Show me the patch first."

  • "Cancel just the 2026-03-11 occurrence of the Monday/Wednesday/Friday standup."

  • "Write my week as Markdown notes."

Tools

Tool

What it does

calendar_overview

Files, calendar names, event and recurring-series counts, date span, time zones used, and every problem found (files that failed to load, events skipped and why). Call first.

agenda

Every occurrence in a window, sorted and grouped by day, recurring events expanded (RRULE, EXDATE, RDATE, modified instances), recurrence marked.

search_events

Text, attendee, location or regex search; lists events/series, or expanded occurrences when you give a window.

find_free_time

Free blocks of at least N minutes inside working hours and working days, across one or several calendars, with buffers.

find_conflicts

Overlapping events, including across calendars. All-day and "free" (TRANSPARENT) events are ignored unless you ask.

next_occurrences

The next N occurrences of one event by UID.

export_agenda_markdown

A seven day agenda as Markdown, optionally saved to a new .md file.

create_event / update_event / delete_event

Safe writes (below). delete_event can remove a single occurrence of a recurring event (adds an EXDATE).

Time zones. Every tool takes tz (an IANA name such as Europe/Istanbul; default UTC) and every time in every answer is printed with its zone, never silently local. Floating times (no zone in the file) are read in the tz you pass. All-day events are dates and are not shifted by tz. A date-only end such as 2026-03-08 includes that whole day.

Safe writing

create_event, update_event and delete_event never modify your calendar unless you say so:

You pass

What happens

nothing

The edited calendar is written next to the original as <file>.new. The original is untouched. An existing .new file is never overwritten.

dry_run=true

Nothing is written; you get the patch (a unified diff).

output_file="x.ics"

The edited copy goes to that new file (it must not exist).

in_place=true

The original is replaced atomically (and refused if the file changed on disk since it was read).

Every result shows the patch. Edited files are parsed again before they are written, and a create-then-delete round trip is tested to reproduce the original file byte for byte. update_event bumps SEQUENCE and refreshes DTSTAMP; new events get a generated UID.

Limits (read these)

  • Recurrence supports DAILY, WEEKLY, MONTHLY, YEARLY with INTERVAL, COUNT, UNTIL, BYDAY (with ordinals like 2MO, -1FR), BYMONTHDAY, BYMONTH, BYSETPOS, WKST, plus EXDATE, RDATE and RECURRENCE-ID overrides. HOURLY and finer, BYWEEKNO, BYYEARDAY and BYHOUR-style parts are rejected with a message (the event is skipped and listed under problems), never silently mis-expanded.

  • DTSTART is always treated as the first instance, as RFC 5545 defines it, even if the rule would not generate it.

  • RECURRENCE-ID;RANGE=THISANDFUTURE is reported and applied to one instance only.

  • Only VEVENT is read (not VTODO/VJOURNAL). Updates change the whole series; editing a single instance is not supported (delete one occurrence is).

  • New events reference an IANA TZID without embedding a VTIMEZONE; Google and Apple accept that, some Outlook versions may not.

  • A TZID that is neither an IANA name nor defined by a VTIMEZONE in the same file (for example a bare Windows name without its definition) skips that event with an explanation.

  • Files must be UTF-8. Attendee changes are recorded in the file only; no invitation is sent.

Security

  • The server reads and writes only .ics files under --dir. Paths that escape it (.., absolute paths elsewhere, symlinks pointing outside) are refused.

  • It makes no network connections and needs no credentials.

  • Text you pass to write tools is escaped; newlines cannot inject extra properties, and control characters are refused.

  • The only file other than .ics it can create is the Markdown export, and only as a new file.

  • Calendar contents (titles, descriptions) come from your files and may contain text written by other people. Treat them as data, not instructions.

Development

uv sync --extra test
uv run pytest
uv run ruff check src tests && uv run mypy --strict src

A companion tutorial that builds a minimal version from scratch is in icskit-mcp-the-hard-way.

MIT licensed.

Available Tools

10 tools
agendaA

Show every event occurrence between start and end, sorted, grouped by day, with recurring events already expanded (RRULE, EXDATE, RDATE and modified instances applied).

start/end: '2026-03-02' or '2026-03-02T09:30' (optionally with Z or an offset). A date-only end includes that whole day. tz: IANA zone name used to read start/end and to show every time; the zone is printed in the header and next to each time. Floating times (no zone in the file) are read in tz. All-day events show as 'all day' and are not shifted by tz. calendars: file names from calendar_overview (default: all). Cancelled events are hidden unless include_cancelled=true.

NameRequiredDescriptionDefault
tzNoUTC
endYes
limitNo
startYes
calendarsNo
include_cancelledNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: recurrence expansion rules, sorting/grouping by day, all-day events not shifted by tz, floating times interpreted in tz, and cancelled events hidden unless include_cancelled=true. The notable omission is the `limit` parameter (default 300) and what happens when the result set exceeds it, which is exactly the kind of silent truncation an agent needs to know about.

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?

Front-loaded with the operation and its most distinctive behavior before any parameter detail, then a compact per-parameter block. Dense but every clause carries real information; the only cost is that the tz sentence packs reading semantics, display semantics, and header output together.

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?

An output schema exists, so return formatting need not be explained, and the description adds exactly the right behavioral context for a recurrence-aware agenda tool. The remaining gap is result-set capping via the undocumented `limit` of 300, which matters for an agent querying wide date ranges.

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, and it does for five of six parameters: accepted start/end formats with optional Z or offset, date-only `end` being day-inclusive, tz as IANA zone used both for reading input and rendering output, calendars drawn from calendar_overview with an all-calendars default, and the cancelled flag. Only `limit` is left entirely undefined in both schema and description.

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?

States a specific verb and resource with scope: 'Show every event occurrence between start and end, sorted, grouped by day,' plus the key promise that recurring events are 'already expanded (RRULE, EXDATE, RDATE and modified instances applied).' That expansion promise is what separates it from a plain event search, though it never explicitly names siblings like search_events or next_occurrences.

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?

Usage is implied rather than stated: the tool is for retrieving a full agenda over a range, and it references calendar_overview as the source of valid calendar names, which is a useful prerequisite hint. However, there is no explicit when-to-use versus search_events, next_occurrences, or export_agenda_markdown, and no exclusions are given.

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

calendar_overviewA

List the calendar files the server can see: for each file its name, how many events and recurring series it holds, the date span of its events (as written in the file) and the time zones its events use. Also lists files that failed to load and any events that were skipped, with the reason. Call this first; the file names it prints are what the calendars and calendar parameters of the other tools accept.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. It states that failed files and skipped events are reported with reasons, which is useful transparency beyond a simple listing. It does not discuss permissions or rate limits, but for a zero-parameter read-only overview tool the disclosed behavior is strong.

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 two sentences and front-loads the core purpose before giving the critical 'call this first' instruction. It is dense but every clause adds useful information about return content or usage, with no wasted wording.

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, no annotations, and an output schema, the description provides everything needed to call it correctly. It explains scope, return contents, error reporting behavior, and ordering relative to other tools, so the agent is not missing required context.

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 tool has zero parameters, so parameter semantics are not a major concern and the baseline is 4. The mention of `calendars` and `calendar` parameters in other tools adds useful context about how the output is consumed, even though this tool itself has an empty 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 uses a specific verb and resource: it lists calendar files visible to the server. It also names the exact fields returned for each file, including event counts, recurring series, date span, and time zones, which clearly distinguishes it from sibling tools like agenda and 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 Guidelines5/5

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

It explicitly says 'Call this first,' giving a clear ordering instruction. It also explains why: the file names it prints are accepted by the `calendars` and `calendar` parameters of other tools, which directly ties usage to downstream actions.

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

create_eventA

Add an event to a calendar file. A UID and DTSTAMP are generated.

calendar: file name from calendar_overview (a name that does not exist yet creates a new file; it must end in .ics). start: '2026-03-02' makes an ALL-DAY event (end, if given, is the LAST day, inclusive); '2026-03-02T09:30' makes a timed event, which needs end or duration_minutes. The times are read in tz and stored with that zone (a TZID reference; no VTIMEZONE block is added). rrule: e.g. 'FREQ=WEEKLY;BYDAY=MO,WE'. attendees: email addresses (recorded only; nothing is ever sent). status: TENTATIVE/CONFIRMED/CANCELLED. transp: OPAQUE (busy) or TRANSPARENT (free).

SAFETY: the original file is never modified unless in_place=true. By default the edited copy is written next to it as '.new' (or output_file, which must not exist yet). dry_run=true writes nothing and just shows the patch. Everything else in the file - other events, VTIMEZONE blocks, unknown properties - is kept byte for byte.

NameRequiredDescriptionDefault
tzNoUTC
endNo
rruleNo
startYes
statusNo
transpNo
dry_runNo
summaryYes
calendarYes
in_placeNo
locationNo
attendeesNo
descriptionNo
output_fileNo
duration_minutesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly: it discloses the default non-destructive write to '<file>.new', the in_place override, dry_run behavior, output_file constraints, and byte-for-byte preservation of unrelated content. It also flags that attendees are recorded but never sent and that no VTIMEZONE block is added.

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?

Dense but well organized, with a labeled SAFETY block and front-loaded core behavior. Every sentence carries information, though the parameter walkthrough is packed tightly enough that it reads as a reference dump rather than prose.

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?

For a 15-parameter mutation tool with no annotations, the description covers the write semantics, safety model, and format rules an agent needs. An output schema exists, so return values need not be explained, and nothing critical is missing.

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 coverage is 0%, so the description must compensate, and it explains the non-obvious parameters: calendar naming rules, start format semantics, end inclusivity, tz storage behavior, rrule syntax, status and transp value sets, and the in_place/output_file/dry_run trio. Only summary, location, and description are left to obvious inference.

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?

States a specific verb and resource ('Add an event to a calendar file') plus a concrete side effect (UID and DTSTAMP generated). It also points to calendar_overview for the file name, which separates it from the read-only siblings like agenda and 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 Guidelines4/5

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

Gives clear conditional guidance: date-only start makes an all-day event, datetime start requires end or duration_minutes, and calendar names come from calendar_overview. It does not explicitly say to use update_event for existing events, but the create-vs-modify split is strongly implied by the sibling set.

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

delete_eventA

Delete an event by UID (a recurring event with all its modified instances), or just one occurrence of a recurring event: pass occurrence='2026-03-09T09:00' (its start, read in tz; or a date for all-day) and an EXDATE is added instead.

SAFETY: the original file is never modified unless in_place=true. By default the edited copy is written next to it as '.new' (or output_file, which must not exist yet). dry_run=true writes nothing and just shows the patch. Everything else in the file - other events, VTIMEZONE blocks, unknown properties - is kept byte for byte.

NameRequiredDescriptionDefault
tzNoUTC
dry_runNo
calendarNo
in_placeNo
event_uidYes
occurrenceNo
output_fileNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

No annotations were supplied, so the description carries the full burden and does so well: it states the original file is never modified unless in_place=true, the default output is '<file>.new', output_file must not already exist, dry_run writes nothing and only shows the patch, and all unrelated content (other events, VTIMEZONE, unknown properties) is preserved byte for byte. That is precisely the mutation-safety and side-effect profile an agent cannot infer from the schema.

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?

Front-loaded with the primary action, then a clearly labeled SAFETY block, which is good structure for a destructive tool. A few clauses run long, notably the parenthetical about modified instances and the EXDATE sentence, but no sentence is filler.

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?

For a destructive mutation with no annotations and seven parameters, the description supplies the safety model, default output path, overwrite constraint and preservation guarantee; with an output schema present it need not describe the return value. Only the undocumented 'calendar' parameter keeps it from being flawless.

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, and it does for six of the seven parameters: event_uid, occurrence (with format and all-day variant), tz as the zone used to read the occurrence, dry_run, in_place and output_file. The 'calendar' parameter is never mentioned at all, and tz's role beyond occurrence parsing is not spelled out, leaving a real gap.

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?

States a specific verb and resource (delete an event, addressed by UID) and immediately disambiguates the two deletion modes: whole recurring series with its modified instances vs. a single occurrence converted to an EXDATE. That distinction is exactly what an agent needs to pick the right behavior, and it separates the tool cleanly from update_event/create_event in the sibling list.

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?

Gives concrete when-to guidance for the ambiguous case: pass occurrence='2026-03-09T09:00' with a start value read in tz, or a bare date for an all-day event, and an EXDATE is added instead of removing the series. It also explains when to set in_place, output_file and dry_run. It stops short of naming a sibling alternative (e.g. update_event for property edits), so routing guidance 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.

export_agenda_markdownA

Render seven days starting at week_start (a date such as 2026-03-02) as Markdown: one heading per day with a bullet per event, times labelled with the zone. Returns the Markdown. With output_file (a new .md file name under the server directory) it is also saved; an existing file is never overwritten.

NameRequiredDescriptionDefault
tzNoUTC
calendarsNo
week_startYes
output_fileNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the return value, that output_file writes a new .md file under the server directory, and critically that an existing file is never overwritten. It omits what happens when calendars is left unset, any permission or size limits, and whether behaviour varies with tz beyond labelling.

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?

Three tight sentences, front-loaded with what is rendered and in what shape, then the return, then the optional side effect. No restatement of the name and no filler.

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 simple four-parameter export tool with an output schema covering the return shape, the description is nearly sufficient. The one real gap is the undocumented calendars parameter, which an agent cannot reason about from schema alone at 0% coverage.

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, and it does for three of four parameters: week_start gets a concrete date example and a scope (seven days from it), output_file gets a location constraint and a non-destructive guarantee, and tz is linked to how times are labelled. The calendars parameter receives no explanation at all, which keeps this from a 5.

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 states a specific verb (render) and a precise resource (seven days starting at week_start) plus the output format (Markdown with one heading per day and a bullet per event). This makes it distinguishable from siblings like agenda or calendar_overview by output format, though it never explicitly names or contrasts those 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?

Usage is implied rather than stated: the Markdown framing suggests use when a formatted export is wanted instead of a conversational listing, but there is no explicit when-to-use vs. when-not guidance or reference to the sibling tools that overlap with this capability.

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

find_conflictsA

List pairs of events whose times overlap in the range, including across different calendars. Back-to-back events (one ends exactly when the next starts) are not conflicts. Cancelled events are ignored. All-day events and events marked TRANSP:TRANSPARENT ('free') are ignored unless include_all_day / include_transparent is true. start/end/tz as in agenda.

NameRequiredDescriptionDefault
tzNoUTC
endYes
limitNo
startYes
calendarsNo
include_all_dayNo
include_transparentNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden and does well by disclosing non-obvious semantics: back-to-back events are not conflicts, cancelled events are ignored, and all-day/free events are excluded unless flags are set. It does not cover read-only safety, limit/pagination behavior, or ordering, leaving some behavioral gaps.

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 tightly written and front-loads the core purpose before giving edge-case rules. Every sentence adds useful conflict-detection context, with no redundant wording or unnecessary preamble.

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?

The output schema exists, so return values need not be described, and the description covers key conflict-detection behavior well. However, for a 7-parameter tool with 0% schema description coverage and no annotations, important parameter semantics such as calendars and limit remain unaddressed, leaving the definition only minimally complete.

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?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It explains include_all_day and include_transparent behavior and implies start/end range filtering, but it only says 'start/end/tz as in agenda,' which is not self-contained, and it leaves limit and calendars semantics unexplained.

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 states a specific verb and resource: list pairs of events whose times overlap in a range, including across calendars. This is clearly distinct from sibling tools such as agenda, search_events, and find_free_time, so an agent can identify the tool's role without opening the schema.

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 the tool is useful by defining conflict pairs and edge cases, but it does not explicitly say when to use this tool versus alternatives like find_free_time or agenda. The inclusion and exclusion rules provide context, but there is no direct when-to-use or when-not-to-use guidance.

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

find_free_timeA

Find free slots of at least duration_minutes inside working hours, across one or several calendars at once. Returns every maximal free block (not chopped into duration-sized pieces), so a 3h gap is reported as one 3h block.

start/end/tz: as in agenda (date-only end includes the whole day). working_hours: local wall-clock ranges in tz, e.g. '09:00-17:00' or '09:00-12:00,13:00-17:00' (so DST days keep their wall hours). days: working weekdays, e.g. 'Mon-Fri' or 'Mon,Wed,Fri'. buffer_minutes: padding kept clear before AND after every busy event. Busy means an uncancelled event; all-day events and events marked TRANSP:TRANSPARENT ('free') do not block unless include_all_day / include_transparent is true.

NameRequiredDescriptionDefault
tzNoUTC
endYes
daysNoMon-Fri
limitNo
startYes
calendarsNo
working_hoursNo09:00-17:00
buffer_minutesNo
include_all_dayNo
duration_minutesYes
include_transparentNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does well: it explains maximal free blocks, buffer padding, busy-event semantics, all-day and transparent event handling, and DST-safe working hours. It does not cover authentication, rate limits, or pagination behavior, which keeps it from a 5.

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 dense and front-loaded, with the core behavior stated first and parameter semantics following. Every sentence adds useful information, though the long paragraph could be structured more scannably.

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 an 11-parameter tool with no annotations and an output schema, the description covers the essential scheduling semantics and return-block behavior. It still omits details for calendars and limit, and does not mention operational constraints such as auth or rate limits.

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, and it explains most parameters: start/end/tz, working_hours format, days, buffer_minutes, duration_minutes, include_all_day, and include_transparent. It leaves calendars and limit under-explained, so it is strong but not complete.

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 states a specific verb and resource: find free slots across calendars, with a clear scope of working hours and duration. It does not explicitly differentiate itself from sibling tools such as find_conflicts or agenda, so it falls short of a 5.

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?

Usage is implied by the tool name and description: use it to locate free time blocks. However, there is no explicit when-to-use guidance, no when-not-to-use guidance, and no named alternatives among the sibling tools.

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

next_occurrencesA

The next n occurrences of one event (by UID) at or after after (default: now), with modified instances and removed dates applied. Use it to check what a recurrence rule really produces, e.g. 'last Friday of the month'. UIDs come from agenda and search_events. calendar: file name, only needed if the UID exists in several files.

NameRequiredDescriptionDefault
nNo
tzNoUTC
afterNo
calendarNo
event_uidYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose meaningful behavior: modified instances and removed dates are applied, and `after` defaults to now. It does not state error behavior for unknown UIDs or how timezone conversion interacts with the results, which keeps it short of a 5.

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?

Three tight sentences, front-loaded with the core behavior, then the use case, then the disambiguation note. No filler and nothing repeated from the schema.

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?

An output schema exists, so return values need not be explained, and the description covers the recurrence-expansion semantics and UID sourcing well. The only real gap is the unexplained `tz` parameter, which matters for a date-producing 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?

Schema description coverage is 0%, so the description must compensate, and it does for most parameters: n (the count), after (default now), calendar (file name, only needed when the UID exists in several files), and event_uid (sourced from agenda/search_events). The `tz` parameter is never mentioned, leaving one of five undocumented.

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?

States a specific verb and resource: the next n occurrences of one event identified by UID, at or after a given point. It also distinguishes itself from the sibling list tools (agenda, search_events) by being the recurrence-expansion tool rather than a listing tool.

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?

Gives a clear use case ('check what a recurrence rule really produces, e.g. last Friday of the month') and tells the agent where UIDs come from (agenda and search_events). It lacks an explicit when-not or a named alternative for the case where the agent just wants a plain listing, but the context is otherwise unambiguous.

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

search_eventsA

Find events by text. All the filters you give must match (AND).

query: case-insensitive text found in the title, description, location, categories or attendees. attendee: part of an attendee/organizer email or name. location: part of the location. regex: a Python regular expression (case-insensitive; ^ and $ match at the start and end of each field) searched in the same fields. Without start/end this lists each matching event or recurring series once (first start, recurrence rule, UID). With start AND end it lists the matching OCCURRENCES in that range, expanded, like agenda. tz sets the zone used to show times.

NameRequiredDescriptionDefault
tzNoUTC
endNo
limitNo
queryNo
regexNo
startNo
attendeeNo
locationNo
calendarsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses the AND-across-filters rule, case-insensitivity, which fields query/regex scan, and that ^/$ anchor to each field rather than the whole string. It also discloses a real output-shape difference between the two date modes. Undocumented: pagination/limit behavior, the calendars filter, and confirmation that this is a read-only operation.

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?

Front-loaded with the AND rule, then a compact per-parameter glossary, then the mode distinction — no filler sentences. The parameter prose runs together in dense fragments without separators, which costs a little scannability but wastes no 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?

For a 9-param search tool with an output schema (so return values need not be described), the definition covers the query language, filter fields, timezone handling, and result-shape switching adequately. The gap is the unexplained `limit` and `calendars` parameters, which an agent cannot safely set from this text alone.

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 coverage is 0%, so the description must compensate, and it does for 7 of 9 params — query, attendee ("part of an attendee/organizer email or name"), location, regex, start, end, and tz all get real semantics beyond their bare names. `limit` and `calendars` receive no explanation anywhere, keeping it below a 5.

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?

Opening sentence gives a specific verb+resource ("Find events by text") and the AND-filter semantics. It implicitly contrasts with the agenda sibling ("expanded, like agenda"), but never explicitly names which sibling to choose for which lookup, so it stops short of a 5.

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 clearly splits two operating modes — bare listing of events/series without start/end vs expanded occurrences when both are supplied — which is genuine conditional guidance. However it never says when to prefer this over next_occurrences or calendar_overview, and offers no exclusions or prerequisites.

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

update_eventA

Change fields of one event (the whole series if it recurs). Only the fields you pass change; an empty string removes summary-like fields (location, description, status, transp, rrule). attendees=[...] makes the attendee list exactly that (existing entries keep their details). start without end keeps the event's length. start/end are read in tz (default: the event's own zone); all-day rules as in create_event. DTSTAMP is refreshed and SEQUENCE incremented. Modifying single instances of a series is not supported. calendar: only needed if the UID is in several files.

SAFETY: the original file is never modified unless in_place=true. By default the edited copy is written next to it as '.new' (or output_file, which must not exist yet). dry_run=true writes nothing and just shows the patch. Everything else in the file - other events, VTIMEZONE blocks, unknown properties - is kept byte for byte.

NameRequiredDescriptionDefault
tzNo
endNo
rruleNo
startNo
statusNo
transpNo
dry_runNo
summaryNo
calendarNo
in_placeNo
locationNo
attendeesNo
event_uidYes
descriptionNo
output_fileNo
duration_minutesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it states the original file is never modified unless in_place=true, that output_file must not exist yet, that dry_run writes nothing, and that unrelated content is preserved byte for byte. It also discloses side effects beyond the requested change (DTSTAMP refresh, SEQUENCE increment) — exactly the kind of hidden mutation an agent needs to know before calling.

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?

Two dense paragraphs split cleanly between semantics and safety, with the mutation-scope rule front-loaded. Every sentence carries distinct information — field update rules, side effects, file-write guarantees — and there is no restatement of the tool name or filler.

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?

An output schema exists, so return-value explanation is not required, and the description covers the risky parts (file writes, dry run, series scope) thoroughly. The remaining gaps are the undocumented duration_minutes parameter and the accepted values for status/transp/rrule, which an agent must guess.

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 coverage is 0%, so the description must compensate and largely does: it defines the empty-string removal convention, the replace-not-merge semantics of attendees, the start-without-end behavior, the tz default, and the roles of in_place, output_file, dry_run, and calendar. It leaves duration_minutes entirely unmentioned and gives no value hints for status, transp, or rrule format, so some of the 16 parameters remain opaque.

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?

Opens with a specific verb and resource ('Change fields of one event') and immediately scopes it ('the whole series if it recurs'), which distinguishes it from create_event and delete_event. The sibling set contains no other mutator of an existing event, so no further differentiation is needed.

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?

Gives explicit usage rules: only passed fields change, empty strings remove fields, attendees replaces the list, and single-instance modification 'is not supported', which routes the agent away from an unsupported case. It also defers to create_event for all-day conventions. It stops short of naming alternatives for the unsupported case or stating prerequisites such as needing the file to be writable.

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.

  1. 10 tool updatesv0.1.0
    • First observedagenda
    • First observedcalendar_overview
    • First observedcreate_event
    • First observeddelete_event
    • First observedexport_agenda_markdown
    • First observedfind_conflicts
    • First observedfind_free_time
    • First observednext_occurrences
    • First observedsearch_events
    • First observedupdate_event

TDQS

A4.1/5.0

Scored across 10 tools

Disambiguation4/5

The three read tools (agenda, next_occurrences, search_events) overlap somewhat since all can expand recurring events over a range, but the descriptions draw clear boundaries: agenda is a range dump, next_occurrences targets one UID, search_events filters by text/attendee/location. The remaining tools (find_free_time, find_conflicts, export_agenda_markdown, create/update/delete_event, calendar_overview) each have an unmistakable purpose.

Naming Consistency4/5

All names are snake_case and readable, with mutations consistently using verb_noun (create_event, update_event, delete_event) and searches using verb_noun (search_events, find_free_time, find_conflicts). The read tools agenda, calendar_overview and next_occurrences break the pattern by being noun- or prefix-style, but the convention still reads predictably.

Tool Count5/5

Ten tools is a well-scoped surface for an iCalendar server: six query/analysis tools, one export, and exactly the three mutation tools needed. Nothing feels redundant or padded.

Completeness4/5

Full lifecycle is covered: discovery (calendar_overview), range/text lookup, free-busy and conflict analysis, export, plus create/update/delete with series-level EXDATE handling. Gaps remain: no way to read a single event's full record by UID, no per-instance modification of a series, and no tool to move/copy events between calendar files.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to load, query, and manage iCalendar files with full CRUD operations and support for multiple calendars.
    8
    9 npm
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    Enables reading and managing calendar events from local .ics files offline, without OAuth.
    2
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A local-first MCP server for macOS that enables AI assistants to read and manage Apple Calendar events via EventKit, with configurable permissions, audit logging, and a native setup app.
    MIT