Connect to CalDAV for Calendar Management
An MCP server for CalDAV calendars - list, create, update, and delete events, including whole-day and recurring events.
Why it matters
Integrate your AI assistant with CalDAV servers to manage calendar events. This connector allows for the creation and retrieval of events, streamlining scheduling and time management.
Outcomes
What it gets done
Connect to a CalDAV server using provided credentials.
Create new calendar events with specified details.
List existing calendar events within a given time range.
Expose calendar operations as tools for AI assistants.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/vb-caldav-mcp | bash Capabilities
Tools your agent gets
Creates a new calendar event with parameters for name, start time, and end time
Returns a list of events in the specified time range, using start and end date parameters
Overview
CalDAV MCP Server
This MCP server exposes CalDAV calendar operations - listing calendars and events, and creating, updating, or deleting events including whole-day and recurring ones via RRULE-style parameters - as tools for an AI assistant. Use it when an AI assistant needs to read or manage events on a CalDAV-compatible calendar server. Not for calendar systems without a CalDAV interface.
What it does
An MCP server exposing CalDAV calendar operations as tools for an AI assistant: list-calendars returns the name and URL of every available calendar; list-events returns events between a start and end ISO 8601 date for a given calendar URL, each with uid, summary, start, end, and optionally description and location; create-event adds an event with a summary, start/end datetimes, an optional wholeDay flag, optional description and location, and an optional recurrenceRule (freq of DAILY, WEEKLY, MONTHLY, or YEARLY, plus interval, count, until, byday, bymonthday, and bymonth); update-event changes only the fields supplied for an existing event identified by uid; and delete-event removes an event by uid and calendar URL.
When to use - and when NOT to
Use it when an AI assistant needs to read or manage calendar events on any standard CalDAV server - listing calendars, checking a timeframe for events, or creating, editing, or deleting events including recurring ones. For a single-day whole-day event, set wholeDay to true and use start and end on the same calendar date - they don't need to be identical timestamps. It is not for calendar systems that don't speak CalDAV without a compatible bridge in front of them.
Capabilities
Full event lifecycle support: list calendars and events within a timeframe, create events (including whole-day and recurring events via RRULE-style parameters), update events partially - only supplied fields change - and delete events by their unique ID, which is obtained from a prior list-events call. The recurrenceRule options accepted on both create and update mirror standard iCalendar recurrence semantics: a frequency of DAILY, WEEKLY, MONTHLY, or YEARLY, an optional interval between occurrences, an optional count or until date to bound the series, and optional byday/bymonthday/bymonth constraints for more specific patterns.
How to install
{
"mcpServers": {
"calendar": {
"command": "npx",
"args": ["caldav-mcp"],
"env": {
"CALDAV_BASE_URL": "<CalDAV server URL>",
"CALDAV_USERNAME": "<CalDAV username>",
"CALDAV_PASSWORD": "<CalDAV password>"
}
}
}
}
For development, run npm run dev for TypeScript with watch mode and automatic .env loading, or manually compile with npx tsc and run the result with node dist/index.js. The project is MIT licensed.
Who it's for
Users and developers who want an AI assistant to manage their calendar directly - checking schedules, creating single or recurring meetings, rescheduling, or cleaning up old events - against any CalDAV-compatible calendar server, without needing a vendor-specific calendar API integration. The project ships with generated tool documentation and semantic-release-based versioning, is written in TypeScript with Prettier code style, and is distributed as an npm package (caldav-mcp) with an automated release workflow.
Source README
caldav-mcp
🗓️ A CalDAV Model Context Protocol (MCP) server to expose calendar operations as tools for AI assistants.
✨ Features
- Connect to CalDAV servers
- List calendars
- List calendar events within a specific timeframe
- Create calendar events
- Update calendar events
- Delete calendar events by UID
Setup
{
"mcpServers": {
...,
"calendar": {
"command": "npx",
"args": [
"caldav-mcp"
],
"env": {
"CALDAV_BASE_URL": "<CalDAV server URL>",
"CALDAV_USERNAME": "<CalDAV username>",
"CALDAV_PASSWORD": "<CalDAV password>"
}
}
}
}
Development
Quick Start
Run the MCP server in development mode with auto-reload:
npm run dev
This will run the TypeScript code directly with watch mode and automatically load environment variables from .env.
Manual Build
Alternatively, you can compile TypeScript to JavaScript and run it:
- Compile:
npx tsc
- Run:
node dist/index.js
Available Tools
list-calendars
List all calendars returning both name and URL
Parameters: none
Returns:
- List of all available calendars
list-events
List all events between start and end date in the calendar specified by its URL
Parameters:
start: string - Start date (ISO 8601)end: string - End date (ISO 8601)calendarUrl: string
Returns:
- A list of events that fall within the given timeframe, each containing
uid,summary,start,end, and optionallydescriptionandlocation
create-event
Creates an event in the calendar specified by its URL. For all-day events, set wholeDay to true. For a single-day all-day event, use start and end datetimes on the same calendar date; they do not need to be identical timestamps.
Parameters:
summary: stringstart: string - Start datetime (ISO 8601)end: string - End datetime (ISO 8601)wholeDay: boolean (optional) - Create as a whole-day eventcalendarUrl: stringdescription: string (optional)location: string (optional)recurrenceRule: object (optional)freq: enum (DAILY|WEEKLY|MONTHLY|YEARLY) (optional)interval: number (optional)count: number (optional)until: string (optional)byday: array of string (optional)bymonthday: array of number (optional)bymonth: array of number (optional)
Returns:
- The unique ID of the created event
update-event
Updates an existing event in the calendar specified by its URL. Only provided fields are changed. For a one-day full-day event, set wholeDay to true and set start and end to the same calendar day.
Parameters:
uid: string - Unique identifier of the event to update (obtained from list-events)calendarUrl: stringsummary: string (optional)start: string (optional)end: string (optional)wholeDay: boolean (optional) - Update whether this is a whole-day eventdescription: string (optional)location: string (optional)recurrenceRule: object (optional)freq: enum (DAILY|WEEKLY|MONTHLY|YEARLY) (optional)interval: number (optional)count: number (optional)until: string (optional)byday: array of string (optional)bymonthday: array of number (optional)bymonth: array of number (optional)
Returns:
- The unique ID of the updated event
delete-event
Deletes an event in the calendar specified by its URL
Parameters:
uid: string - Unique identifier of the event to delete (obtained from list-events)calendarUrl: string
Returns:
- Confirmation message when the event is successfully deleted
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.