Icskit
FreeNot checkedWork with local .ics calendar files over MCP, no accounts or OAuth: agenda, free time, conflicts, DST-correct recurrence, and byte-preserving safe writes.
About
Work with local .ics calendar files over MCP, no accounts or OAuth: agenda, free time, conflicts, DST-correct recurrence, and byte-preserving safe writes.
README
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;
DTENDlengths are real elapsed time; free-time search keeps your wall-clock working hours on 23 and 25 hour days. Tested againstAmerica/New_York,Europe/BerlinandEurope/Istanbul(which has no DST), for IANA zones and for customVTIMEZONEblocks such as Outlook'sW. 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-dateutilas an independent oracle. - Writes are safe by construction. Editing works by line surgery: everything you did not ask to
change (other events,
VTIMEZONE,VALARM, unknownX-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
.icsper calendar. - Apple Calendar: File, Export, Export...
- Outlook: File, Save Calendar (or "Export" in the new Outlook), choose iCalendar format.
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 [email protected] 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,YEARLYwithINTERVAL,COUNT,UNTIL,BYDAY(with ordinals like2MO,-1FR),BYMONTHDAY,BYMONTH,BYSETPOS,WKST, plusEXDATE,RDATEandRECURRENCE-IDoverrides.HOURLYand finer,BYWEEKNO,BYYEARDAYandBYHOUR-style parts are rejected with a message (the event is skipped and listed under problems), never silently mis-expanded. DTSTARTis always treated as the first instance, as RFC 5545 defines it, even if the rule would not generate it.RECURRENCE-ID;RANGE=THISANDFUTUREis reported and applied to one instance only.- Only
VEVENTis read (notVTODO/VJOURNAL). Updates change the whole series; editing a single instance is not supported (delete one occurrence is). - New events reference an IANA
TZIDwithout embedding aVTIMEZONE; Google and Apple accept that, some Outlook versions may not. - A
TZIDthat is neither an IANA name nor defined by aVTIMEZONEin 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
.icsfiles 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
.icsit 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.
Installing Icskit
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/0xmortuex/icskit-mcpFAQ
Is Icskit MCP free?
Yes, Icskit MCP is free — one-click install via Unyly at no cost.
Does Icskit need an API key?
No, Icskit runs without API keys or environment variables.
Is Icskit hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Icskit in Claude Desktop, Claude Code or Cursor?
Open Icskit on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Notion
Read and write pages in your workspace
by NotionLinear
Issues, cycles, triage — from Claude
by LinearGoogle Drive
Search and read your Drive files
by Googlemindsdb/mindsdb
Connect and unify data across various platforms and databases with [MindsDB as a single MCP server](https://docs.mindsdb.com/mcp/overview).
by mindsdbfulcradynamics/fulcra-context-mcp
Access personal health and biometric data (sleep stages, heart rate, HRV, glucose, workouts), calendar and location via the Fulcra Life API.
by fulcradynamicsrinadelph/Agent-MCP
Framework for building multi-agent systems that coordinate over MCP, with task management, shared context and RAG.
by rinadelphWhenLabs-org/when
Developer toolkit: stack detection for AI context files, port conflicts, .env schema validation, docs drift, dependency license audits and task timing.
by WhenLabs-orgBeltran12138/wecom-docs-mcp-server
WeCom (Enterprise WeChat) document operations via MCP: create, read, and edit Docs and Smartsheets (9 tools). Fills the doc-CRUD gap — existing WeCom MCP server
by Beltran12138freema/mcp-gsheets
Google Sheets API integration for reading, writing, formatting and sheet management.
by freemamattijsdp/dbt-docs-mcp
dbt-core (OSS) project metadata, model and column-level lineage, and dbt documentation.
by mattijsdpCompare Icskit with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All productivity MCPs
