Caldav Mcp

io.github.dominik1001Published by GitHub account dominik1001v0.9.0Updated Oct 24, 2026

CalDAV calendar operations (list, create, update, delete events) as MCP tools.

Overview

AI-generated overview

Lets an assistant read and manage CalDAV calendars, events and tasks through tools for listing, creating, updating and deleting.

What you can do
Connects to a CalDAV server and exposes calendar operations as MCP tools. It can list calendars, list events within a timeframe, and create, update or delete events by UID, including all-day and recurring events. It also handles tasks (VTODOs): listing with status, due-date and pagination filters, creating, updating, completing and deleting them.
When to use it
Useful when an assistant should work with an existing CalDAV calendar, for example to check availability, schedule or reschedule meetings, or track and complete tasks. It fits self-hosted or standards-based calendar setups rather than proprietary calendar services.
Requirements
Runs locally as an npm package (caldav-mcp) over stdio, so Node.js and npx are needed. Requires the environment variables CALDAV_BASE_URL, CALDAV_USERNAME and CALDAV_PASSWORD, plus network access to the CalDAV server. Desktop only.
Before you install
The server holds calendar credentials, including the secret CALDAV_PASSWORD, and can create, modify and delete events and tasks on the connected calendar, so changes may be hard to undo. Point it at a calendar you are willing to let an assistant edit, and consider a dedicated account or app password.

Installation

In SourceWeft

  1. Open Caldav Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

caldav-mcp

🗓️ A CalDAV Model Context Protocol (MCP) server to expose calendar operations as tools for AI assistants.

[Release] [npm version] [MIT License] [code style: prettier] [MCP Compatible] [semantic-release: angular]

✨ 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:

bash
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:

  1. Compile:
bash
npx tsc
  1. Run:
bash
node dist/index.js

Available Tools

list-calendars

List all calendars returning both name and absolute URL. Pass a calendar's url unchanged as calendarUrl to the other tools.

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:

  • calendarUrl: string
  • end: string — End date (ISO 8601)
  • start: string — Start date (ISO 8601)

Returns:

  • A list of events that fall within the given timeframe, each containing uid, summary, start, end, and optionally description and location

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:

  • calendarUrl: string
  • description: string (optional)
  • end: string — End datetime (ISO 8601)
  • location: string (optional)
  • recurrenceRule: object (optional)
    • byday: array of string (optional)
    • bymonth: array of number (optional)
    • bymonthday: array of number (optional)
    • count: number (optional)
    • freq: enum (DAILY | WEEKLY | MONTHLY | YEARLY) (optional)
    • interval: number (optional)
    • until: string (optional)
  • start: string — Start datetime (ISO 8601)
  • summary: string
  • wholeDay: boolean (optional) — Create as a whole-day event

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:

  • calendarUrl: string
  • description: string (optional)
  • end: string (optional)
  • location: string (optional)
  • recurrenceRule: object (optional)
    • byday: array of string (optional)
    • bymonth: array of number (optional)
    • bymonthday: array of number (optional)
    • count: number (optional)
    • freq: enum (DAILY | WEEKLY | MONTHLY | YEARLY) (optional)
    • interval: number (optional)
    • until: string (optional)
  • start: string (optional)
  • summary: string (optional)
  • uid: string — Unique identifier of the event to update (obtained from list-events)
  • wholeDay: boolean (optional) — Update whether this is a whole-day event

Returns:

  • The unique ID of the updated event

delete-event

Deletes an event in the calendar specified by its URL

Parameters:

  • calendarUrl: string
  • uid: string — Unique identifier of the event to delete (obtained from list-events)

Returns:

  • Confirmation message when the event is successfully deleted

list-todos

List tasks (VTODOs) in the calendar specified by its URL. By default returns only open tasks (NEEDS-ACTION and IN-PROCESS), sorted by manual order then due date. Use status to include completed (COMPLETED) or all (ALL) tasks, and limit/offset to page through long lists.

Parameters:

  • calendarUrl: string
  • due_after: string (optional) — Only tasks with a due date at or after this (ISO 8601). Undated tasks are excluded when a due window is set.
  • due_before: string (optional) — Only tasks with a due date at or before this (ISO 8601). Undated tasks are excluded when a due window is set.
  • limit: number (optional) — Max tasks to return (default 50, max 500)
  • offset: number (optional) — Tasks to skip (default 0)
  • status: enum (OPEN | ALL | NEEDS-ACTION | COMPLETED | IN-PROCESS | CANCELLED) (optional) — Filter by status. OPEN (default) = NEEDS-ACTION + IN-PROCESS; ALL = everything; or an exact status (NEEDS-ACTION, COMPLETED, IN-PROCESS, CANCELLED).

Returns:

  • An object { todos, total, limit, offset } where total is the count before pagination. Each todo has uid, summary, status, and optionally due, start, completed, description, location.

create-todo

Creates a task (VTODO) in the calendar specified by its URL. Only summary is required; a task may have no dates. Use due for a deadline and start for when work should begin.

Parameters:

  • calendarUrl: string
  • description: string (optional)
  • due: string (optional) — Due datetime (ISO 8601)
  • location: string (optional)
  • start: string (optional) — Start datetime (ISO 8601)
  • status: enum (NEEDS-ACTION | COMPLETED | IN-PROCESS | CANCELLED) (optional) — Defaults to NEEDS-ACTION when omitted
  • summary: string

Returns:

  • The unique ID of the created todo

update-todo

Updates an existing task (VTODO) in the calendar specified by its URL. Only provided fields are changed. To mark a task done, prefer the complete-todo tool.

Parameters:

  • calendarUrl: string
  • description: string (optional)
  • due: string (optional)
  • location: string (optional)
  • start: string (optional)
  • status: enum (NEEDS-ACTION | COMPLETED | IN-PROCESS | CANCELLED) (optional)
  • summary: string (optional)
  • uid: string — Unique identifier of the todo to update (from list-todos)

Returns:

  • The unique ID of the updated todo

complete-todo

Marks a task (VTODO) as done. Sets its status to COMPLETED and records the completion time.

Parameters:

  • calendarUrl: string
  • uid: string — Unique identifier of the todo to complete (from list-todos)

Returns:

  • The unique ID of the completed todo

delete-todo

Deletes a task (VTODO) in the calendar specified by its URL

Parameters:

  • calendarUrl: string
  • uid: string — Unique identifier of the todo to delete (from list-todos)

Returns:

  • Confirmation message when the todo is successfully deleted

License

MIT

Source: README.md at commit 6bbb652

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.9.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts