{
  "markdown": "# caldav-mcp\n\n<div align=\"center\">\n\n🗓️ A CalDAV Model Context Protocol (MCP) server to expose calendar operations as tools for AI assistants.\n\n[![Release](https://github.com/dominik1001/caldav-mcp/actions/workflows/release.yml/badge.svg)](https://github.com/dominik1001/caldav-mcp/actions/workflows/release.yml)\n[![npm version](https://badge.fury.io/js/caldav-mcp.svg)](https://www.npmjs.com/package/caldav-mcp)\n[![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\n[![MCP Compatible](https://img.shields.io/badge/MCP-Compatible-purple.svg)](https://modelcontextprotocol.io)\n[![semantic-release: angular](https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release)\n\n</div>\n\n## ✨ Features\n\n- Connect to CalDAV servers\n- List calendars\n- List calendar events within a specific timeframe\n- Create calendar events\n- Update calendar events\n- Delete calendar events by UID\n\n## Setup\n\n```\n{\n  \"mcpServers\": {\n    ...,\n    \"calendar\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"caldav-mcp\"\n      ],\n      \"env\": {\n        \"CALDAV_BASE_URL\": \"<CalDAV server URL>\",\n        \"CALDAV_USERNAME\": \"<CalDAV username>\",\n        \"CALDAV_PASSWORD\": \"<CalDAV password>\"\n      }\n    }\n  }\n}\n```\n\n## Development\n\n### Quick Start\n\nRun the MCP server in development mode with auto-reload:\n```bash\nnpm run dev\n```\n\nThis will run the TypeScript code directly with watch mode and automatically load environment variables from `.env`.\n\n### Manual Build\n\nAlternatively, you can compile TypeScript to JavaScript and run it:\n\n1. Compile:\n```bash\nnpx tsc\n```\n\n2. Run:\n```bash\nnode dist/index.js\n```\n\n## Available Tools\n\n<!-- TOOLS:START - generated by scripts/gen-tool-docs.ts -->\n### list-calendars\n\nList all calendars returning both name and URL\n\nParameters: none\n\nReturns:\n- List of all available calendars\n\n### list-events\n\nList all events between start and end date in the calendar specified by its URL\n\nParameters:\n- `start`: string — Start date (ISO 8601)\n- `end`: string — End date (ISO 8601)\n- `calendarUrl`: string\n\nReturns:\n- A list of events that fall within the given timeframe, each containing `uid`, `summary`, `start`, `end`, and optionally `description` and `location`\n\n### create-event\n\nCreates 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.\n\nParameters:\n- `summary`: string\n- `start`: string — Start datetime (ISO 8601)\n- `end`: string — End datetime (ISO 8601)\n- `wholeDay`: boolean (optional) — Create as a whole-day event\n- `calendarUrl`: string\n- `description`: string (optional)\n- `location`: string (optional)\n- `recurrenceRule`: object (optional)\n  - `freq`: enum (`DAILY` | `WEEKLY` | `MONTHLY` | `YEARLY`) (optional)\n  - `interval`: number (optional)\n  - `count`: number (optional)\n  - `until`: string (optional)\n  - `byday`: array of string (optional)\n  - `bymonthday`: array of number (optional)\n  - `bymonth`: array of number (optional)\n\nReturns:\n- The unique ID of the created event\n\n### update-event\n\nUpdates 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.\n\nParameters:\n- `uid`: string — Unique identifier of the event to update (obtained from list-events)\n- `calendarUrl`: string\n- `summary`: string (optional)\n- `start`: string (optional)\n- `end`: string (optional)\n- `wholeDay`: boolean (optional) — Update whether this is a whole-day event\n- `description`: string (optional)\n- `location`: string (optional)\n- `recurrenceRule`: object (optional)\n  - `freq`: enum (`DAILY` | `WEEKLY` | `MONTHLY` | `YEARLY`) (optional)\n  - `interval`: number (optional)\n  - `count`: number (optional)\n  - `until`: string (optional)\n  - `byday`: array of string (optional)\n  - `bymonthday`: array of number (optional)\n  - `bymonth`: array of number (optional)\n\nReturns:\n- The unique ID of the updated event\n\n### delete-event\n\nDeletes an event in the calendar specified by its URL\n\nParameters:\n- `uid`: string — Unique identifier of the event to delete (obtained from list-events)\n- `calendarUrl`: string\n\nReturns:\n- Confirmation message when the event is successfully deleted\n\n### list-todos\n\nList 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.\n\nParameters:\n- `calendarUrl`: string\n- `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).\n- `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.\n- `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.\n- `limit`: number (optional) — Max tasks to return (default 50, max 500)\n- `offset`: number (optional) — Tasks to skip (default 0)\n\nReturns:\n- 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`.\n\n### create-todo\n\nCreates 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.\n\nParameters:\n- `summary`: string\n- `calendarUrl`: string\n- `due`: string (optional) — Due datetime (ISO 8601)\n- `start`: string (optional) — Start datetime (ISO 8601)\n- `description`: string (optional)\n- `location`: string (optional)\n- `status`: enum (`NEEDS-ACTION` | `COMPLETED` | `IN-PROCESS` | `CANCELLED`) (optional) — Defaults to NEEDS-ACTION when omitted\n\nReturns:\n- The unique ID of the created todo\n\n### update-todo\n\nUpdates 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.\n\nParameters:\n- `uid`: string — Unique identifier of the todo to update (from list-todos)\n- `calendarUrl`: string\n- `summary`: string (optional)\n- `due`: string (optional)\n- `start`: string (optional)\n- `description`: string (optional)\n- `location`: string (optional)\n- `status`: enum (`NEEDS-ACTION` | `COMPLETED` | `IN-PROCESS` | `CANCELLED`) (optional)\n\nReturns:\n- The unique ID of the updated todo\n\n### complete-todo\n\nMarks a task (VTODO) as done. Sets its status to COMPLETED and records the completion time.\n\nParameters:\n- `uid`: string — Unique identifier of the todo to complete (from list-todos)\n- `calendarUrl`: string\n\nReturns:\n- The unique ID of the completed todo\n\n### delete-todo\n\nDeletes a task (VTODO) in the calendar specified by its URL\n\nParameters:\n- `uid`: string — Unique identifier of the todo to delete (from list-todos)\n- `calendarUrl`: string\n\nReturns:\n- Confirmation message when the todo is successfully deleted\n<!-- TOOLS:END -->\n\n## License\n\nMIT\n",
  "bytes": 7566,
  "sha": "9ad618538ce604a26fe57eef583ab08e3cdcb02c17abfdd374b98076b58c9768",
  "repo_slug": "dominik1001/caldav-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_dominik1001_caldav_mcp_b18223d2/readme"
}