cal-scheduler
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cal-schedulerCreate a meeting tomorrow at 10am for 1 hour"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
If you are an agent installing this MCP, read AGENTS.md first.
cal-scheduler
A thin, timezone-correct MCP server for scheduling against any CalDAV calendar. It gives an LLM agent a small, strict set of calendar tools and does the deterministic, fiddly parts of iCalendar correctly so the model doesn't have to.
It is not an NLP layer: the agent phrases the request, the server validates
it, rejects bad input loudly, and persists clean zoned .ics.
Why it exists
Most calendar tooling an LLM reaches for gets three things subtly wrong. cal-scheduler fixes them by construction:
Stores zoned, not bare UTC. Events are written with
TZID/VTIMEZONE, so a weekly 9am stays 9am across a daylight-saving boundary instead of drifting an hour. Storing bare UTC is the classic cause of that drift.Validates recurrence. It rejects an
RRULEwhose anchor contradicts it (e.g. a series starting on the 30th but set to repeat on the 1st), and normalisesUNTILto UTC under a zonedDTSTARTas RFC 5545 requires.Does real single-occurrence edits. Exclude one instance (
EXDATE) or move one instance (RECURRENCE-ID) without disturbing the rest of the series — the operations naive wrappers tend to lack.
Related MCP server: Chronos MCP
How it works
A small uv Python package that composes mature libraries rather than
implementing a calendar engine:
Module | Role |
| environment config ( |
| parse datetimes; naive → assume default-zone wall time, offset → normalise into the zone; report what was assumed |
| build/parse VEVENTs ( |
| CalDAV transport ( |
| the FastMCP stdio server and the tool surface |
It runs as a stdio MCP server that an MCP host (Claude, an agent harness, etc.) spawns as a subprocess.
Install
Requires Python ≥ 3.11. The package is on PyPI as
cal-scheduler-mcp:
uv tool install cal-scheduler-mcp(or pip install cal-scheduler-mcp, uvx --from cal-scheduler-mcp cal-scheduler,
etc.)
For editable dev work, install from a clone:
# run straight from the repo with uv (no global install)
uv run --directory /path/to/cal-scheduler-mcp cal-scheduler
# or install the console script into a tool environment
gh repo clone limey/cal-scheduler-mcp
uv tool install --editable /path/to/cal-scheduler-mcp
# or, with SSH GitHub access, in one step:
uv tool install git+ssh://git@github.com/limey/cal-scheduler-mcpDon't
uv add cal-scheduler-mcpfor the MCP —uv addwrites into whatever project you're sitting in, not into the tool environment. For an MCP server (spawned as a subprocess),uv tool installis the right shape.
Configure
All configuration is via environment variables:
Variable | Required | Default | Meaning |
| ✅ | — | CalDAV server URL, e.g. |
| — | CalDAV account user | |
| — | CalDAV account password | |
|
| IANA zone every event is stored in |
Many MCP hosts strip inherited environment from stdio servers, so set these in the
host's per-server env block rather than relying on the ambient shell.
Example MCP host config
The MCP runs as a stdio subprocess that the host spawns. Many hosts strip
inherited PATH from that subprocess, so wire the uv run --directory
form rather than relying on the cal-scheduler shim being on the spawn
host's PATH:
{
"mcpServers": {
"cal-scheduler": {
"command": "uv",
"args": ["run", "--directory", "/abs/path/to/cal-scheduler-mcp", "cal-scheduler"],
"env": {
"CALDAV_BASE_URL": "http://127.0.0.1:5232",
"CALDAV_USERNAME": "me",
"CALDAV_PASSWORD": "secret",
"CAL_DEFAULT_TZ": "Pacific/Auckland"
}
}
}
}/abs/path/to/cal-scheduler-mcp is the absolute path to a local clone of
this repo (see Install above).
If you installed from PyPI with uv tool install cal-scheduler-mcp, use the
installed shim directly:
{
"mcpServers": {
"cal-scheduler": {
"command": "/path/to/cal-scheduler",
"env": {
"CALDAV_BASE_URL": "http://127.0.0.1:5232",
"CALDAV_USERNAME": "me",
"CALDAV_PASSWORD": "secret",
"CAL_DEFAULT_TZ": "Pacific/Auckland"
}
}
}
}Find the shim path with which cal-scheduler or uv tool list --show-paths.
Pair it with any CalDAV server. A simple self-hosted option is
Radicale (plain http://, no TLS needed for local use).
Tool surface
Events — list_events(start, end, [calendar]), create_event(summary, start, [end, calendar, description, location, rrule]), update_event(uid, …),
delete_event(uid, [calendar]), exclude_occurrence(uid, occurrence, [calendar]),
move_occurrence(uid, occurrence, new_start, [new_end, calendar]),
mark_done(uid, [calendar]) — tag an event done and record the timestamp.
Calendars — list_calendars, create_calendar(name), delete_calendar(name).
Helper — resolve_datetime(value) — preview how a datetime will be interpreted,
without writing anything.
The timezone rule (the whole point)
Every event is stored zoned to CAL_DEFAULT_TZ.
A naive datetime (
2026-06-30T21:00) is assumed to be wall time in that zone, and the tool response says so ("assumed Pacific/Auckland wall time").An offset-qualified datetime (
…+12:00) is honoured as an instant and re-expressed in the zone — same wall clock when the offset matches, a correct conversion otherwise.A date-only value (
2026-06-30) is an all-day event.
Develop
uv sync # install deps + dev tools
uv run ruff check # lint
uv run pytest # unit tests (no server required)The unit tests cover the pure layers (timezone resolution, recurrence validation,
EXDATE/RECURRENCE-ID construction) and need no running CalDAV server. To exercise
the full stack end to end, point CALDAV_BASE_URL at a throwaway CalDAV account.
License
MIT © 2026 Robert Clark
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityAmaintenanceAn MCP server that exposes CalDAV calendar operations as tools for AI assistants. It enables users to connect to CalDAV servers to create and list calendar events within specific timeframes.Last updated39096MIT
- AlicenseBqualityCmaintenanceA comprehensive MCP server for CalDAV calendar management, supporting multi-account CRUD operations, recurring events, tasks, journals, and advanced search.Last updated2724MIT
- Alicense-qualityDmaintenanceProvider-agnostic CalDAV calendar MCP server that connects any CalDAV calendar to AI assistants, enabling calendar operations like listing, creating, updating, and deleting events.Last updatedAGPL 3.0
- AlicenseAqualityBmaintenanceMCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.Last updated3026MIT
Related MCP Connectors
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
MCP server for Zooza — class scheduling, attendance, and booking for activity businesses.
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/limey/cal-scheduler-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server