PluginBench
MCP Server
Active
MIT

io.github.dominik1001/caldav-mcp MCP Server

io.github.dominik1001/caldav-mcp

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

What is the io.github.dominik1001/caldav-mcp MCP server?

The caldav-mcp server is a Model Context Protocol server that exposes CalDAV calendar operations as tools for AI assistants. It connects to CalDAV servers and provides tools to manage calendars, events, and tasks (todos) including listing, creating, updating, and deleting operations.

caldav-mcp enables AI assistants to interact with CalDAV-compatible calendar servers. It allows you to list calendars and events within date ranges, create and update events with recurrence rules, manage tasks/todos with due dates and status tracking, and delete calendar items. This is useful for AI agents that need to help with calendar management, scheduling, and task organization.

How to install io.github.dominik1001/caldav-mcp

Copy-paste configuration for popular MCP clients.

transport: stdio
Config generated by PluginBench — verify against the source before use.
Environment / auth
  • CALDAV_BASE_URL
    required

    Base URL of the CalDAV server (e.g. https://caldav.example.com)

  • CALDAV_USERNAME
    required

    Username for CalDAV authentication

  • CALDAV_PASSWORD
    required
    secret

    Password for CalDAV authentication

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "caldav-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "caldav-mcp"
      ],
      "env": {
        "CALDAV_BASE_URL": "<YOUR_CALDAV_BASE_URL>",
        "CALDAV_USERNAME": "<YOUR_CALDAV_USERNAME>",
        "CALDAV_PASSWORD": "<YOUR_CALDAV_PASSWORD>"
      }
    }
  }
}

Tools & capabilities

Tools this server exposes to the agent.

  • list-calendars — List all calendars returning both name and URL
  • list-events — List all events between start and end date in a calendar specified by its URL
  • create-event — Creates an event in a calendar with optional recurrence rules, description, and location
  • update-event — Updates an existing event in a calendar; only provided fields are changed
  • delete-event — Deletes an event in a calendar by its unique identifier
  • list-todos — List tasks (VTODOs) in a calendar with filtering by status and due date, with pagination support
  • create-todo — Creates a task (VTODO) in a calendar with optional due date, start date, and status
  • update-todo — Updates an existing task in a calendar; only provided fields are changed
  • complete-todo — Marks a task as done by setting its status to COMPLETED and recording completion time
  • delete-todo — Deletes a task (VTODO) in a calendar by its unique identifier

Use cases

  • Retrieve upcoming events from a CalDAV server and display them to users
  • Create calendar events programmatically with recurrence rules (daily, weekly, monthly, yearly)
  • Manage task lists by creating, updating, and marking todos as complete
  • Filter and list tasks by status (open, completed, cancelled) and due date ranges
  • Delete calendar events and tasks that are no longer needed

io.github.dominik1001/caldav-mcp MCP server FAQ

What is caldav-mcp?

caldav-mcp is an MCP server that connects to CalDAV-compatible calendar servers and exposes calendar and task management operations as tools for AI assistants. It supports listing, creating, updating, and deleting events and todos.

Is caldav-mcp free?

Yes, caldav-mcp is open source under the MIT License.

How do I install caldav-mcp in Cursor or Claude?

Install via npm by adding it to your MCP configuration with the command `npx caldav-mcp`. You must provide CalDAV server credentials via environment variables: CALDAV_BASE_URL, CALDAV_USERNAME, and CALDAV_PASSWORD.

What CalDAV servers does it support?

caldav-mcp works with any CalDAV-compatible server. You need to provide the server URL and valid credentials to connect.

Can I create recurring events?

Yes, you can create and update events with recurrence rules by specifying frequency (DAILY, WEEKLY, MONTHLY, YEARLY), interval, count, until date, and specific days/dates.

Does it support task management?

Yes, caldav-mcp includes full task (VTODO) support: list tasks with status filtering, create tasks with due dates, mark tasks complete, update task details, and delete tasks.

README (reference)

Source of truth, from the repository.

caldav-mcp

<div align="center">

🗓️ 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

</div>

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

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

Available Tools

<!-- TOOLS:START - generated by scripts/gen-tool-docs.ts -->

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

  • summary: string
  • start: string — Start datetime (ISO 8601)
  • end: string — End datetime (ISO 8601)
  • wholeDay: boolean (optional) — Create as a whole-day event
  • calendarUrl: string
  • description: 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: string
  • summary: string (optional)
  • start: string (optional)
  • end: string (optional)
  • wholeDay: boolean (optional) — Update whether this is a whole-day event
  • description: 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

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
  • 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).
  • 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.
  • 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.
  • limit: number (optional) — Max tasks to return (default 50, max 500)
  • offset: number (optional) — Tasks to skip (default 0)

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:

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

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:

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

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:

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

Returns:

  • The unique ID of the completed todo

delete-todo

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

Parameters:

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

Returns:

  • Confirmation message when the todo is successfully deleted
<!-- TOOLS:END -->

License

MIT

Related MCP servers

MCP server that drives the user's real macOS Chrome via AppleScript. 32 tools.

0
TypeScript
MIT
View repository →

Strips layout noise via DOM AST; with a query, BM25 filters to relevant sections. No model or API.

2
TypeScript
MIT
View repository →
MIMindwtr logo

Mindwtr

Active

Free, open-source GTD app with local-first data and AI automation via MCP server.

1.2k
TypeScript
AGPL-3.0
View repository →

Associative key-graph memory for LLM agents — recall by association, not vector similarity.

1
TypeScript
MIT
View repository →

Look up, search, cite, discuss, and track AI phenomenology terms

1
Python
MIT
View repository →

Live cross-DEX pool prices, liquidity and spreads on 6 EVM chains, read from on-chain pool state.

1
JavaScript
MIT
View repository →