Purpose
dav-mcp is designed to turn AI agents into assistants capable of orchestrating calendars, contacts, and tasks. Through the MCP (Model Context Protocol) protocol, it enables AI assistants to precisely operate events, vCard contacts, and VTODO tasks on CalDAV/CardDAV servers.
Main Capabilities
dav-mcp provides 27 tools, divided into three categories:
CalDAV tools (12):
- list_calendars: List all available calendars
- list_events: List all events (use calendar_query for filtered searches)
- create_event: Create a new calendar event
- update_event: Update any event field (SUMMARY, LOCATION, STATUS, custom X-* properties), and can move or convert events via start_date/end_date/all_day
- update_event_raw: Update an event using raw iCal data (advanced)
- delete_event: Permanently delete an event
- calendar_query: Efficiently search and filter events by text, date range, or location
- make_calendar: Create a new calendar collection, with optional time zone (IANA name, such as Europe/Berlin, sent as VTIMEZONE)
- update_calendar: Update calendar properties (display name, description, color, time zone)
- delete_calendar: Delete a calendar and all its events
- calendar_multi_get: Batch-fetch multiple specified events by URL
- freebusy_query: Find free and busy times within a time period ("When am I free?"), calculated client-side
CardDAV tools (8):
- list_addressbooks: List all available address books
- list_contacts: List all contacts (use addressbook_query for filtered searches)
- create_contact: Create a new contact (vCard)
- update_contact: Update any contact field (FN, EMAIL, TEL, ORG, ADR, custom X-* properties)
- update_contact_raw: Update a contact using raw vCard data (advanced)
- delete_contact: Permanently delete a contact
- addressbook_query: Efficiently search and filter contacts by name, email, or organization
- addressbook_multi_get: Batch-fetch multiple specified contacts by URL
VTODO tools (7):
- list_todos: List all to-dos/tasks (use todo_query for filtered searches)
- create_todo: Create a new to-do/task, with optional due date, priority, and status
- update_todo: Update any to-do field (SUMMARY, STATUS, PRIORITY, DUE, PERCENT-COMPLETE, custom X-* properties)
- update_todo_raw: Update a to-do using raw VTODO iCal data (advanced)
- delete_todo: Permanently delete a to-do/task
- todo_query: Efficiently search and filter to-dos by status/due date
- todo_multi_get: Batch-fetch multiple specified to-dos by URL
Usage
One-click install (Claude Desktop): Download dav-mcp-<version>.mcpb from the latest release (available since 4.1.2), open it with Claude Desktop, enter the server URL, username, and password (the password is stored as a secret), and keep the authentication method as Basic unless the server requires Digest. .mcpb is an MCP Bundle, containing the server and its dependencies, with no need to install Node.js or npx.
Claude Desktop / Cursor (local): Add the configuration to the MCP configuration file. Configuration file locations: macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json After adding, restart Claude Desktop.
n8n (remote HTTP): Start the HTTP server, add an AI Agent node, add an MCP Client Tool node and connect it to the AI Agent, and configure the MCP Endpoint as http://localhost:3000/mcp,认证为 Bearer Token.
You can also pull the published image (distroless, runs as non-root, no shell), with tags latest, exact version (5.0.0), and minor version line (5.0). Set PORT to change the port, and the health check will follow. Or build from source.
Use Cases
- n8n automation workflows: meeting management, contact search, task reports, scheduled cleanup
- Claude Desktop integration: quickly create events, contact lookup, calendar overview, calendar management
- Compatible with all major providers: Nextcloud, Baikal, Radicale, iCloud (requires an app-specific password), and any RFC-compliant server
Limitations
- Requires Node.js 22 or later
- Configuration errors (unknown AUTH_METHOD value or missing credentials for the selected method) will stop the server at startup instead of falling back to Basic
- HTTP mode has rate limits: 100 requests per client address per 15 minutes (counted before checking the bearer token); 10,000 for clients on loopback or private networks (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16). Limitation: dav-mcp sees the address that connects to it. Behind Docker port mapping or a reverse proxy, that is the bridge gateway or proxy, so all external clients share that address, its counters, and the increased limit. If you expose the HTTP transport, rate limit per client at the proxy
- Tool call logging is off by default; enable it with LOG_TOOL_CALLS=true, logging to ~/.local/state/dav-mcp/tool-calls.jsonl (or $XDG_STATE_HOME, %LOCALAPPDATA% on Windows, or TOOL_CALL_LOG_FILE), readable only by yourself. TOOL_CALL_LOG_MODE=console sends to stderr
- No telemetry, no data shared with the maintainer or third parties. Tool results are sent to the AI assistant that called the tool. Credentials and calendar data are not stored by dav-mcp; optional tool call logging is off by default
- Time zone handling: events or to-dos without a specified time zone (floating times or all-day dates) are read in their calendar's time zone (RFC 4791 §9.9), that is, the time zone set by make_calendar/update_calendar, which list_calendars will show. Calendars without a time zone are read in the time zone where dav-mcp is running: the TZ environment variable (such as TZ=Europe/Berlin in Docker or HTTP deployments), otherwise the system time zone. Times created and updated by tools without a given time zone are read the same way, and moving an event that has no stored time zone keeps it time zone-free. freebusy_query prints its time periods according to the calendar's time zone and names that time zone
Security
- Input validation: all inputs are validated with Zod schemas before execution
- Bearer authentication: token authentication for the HTTP transport
- No credential storage: pass-through only, never logged or cached
- Structured logging: audit trail with request IDs, no PII exposure
- CORS protection: allowlisted origins, blocks cross-site attacks
Tech Stack
Built on tsdav (TypeScript CalDAV/CardDAV library), tsdav-utils (a field-agnostic RFC-compliant field update utility layer), MCP SDK (Anthropic's Model Context Protocol), ical.js (an RFC-compliant iCalendar parser).
License
MIT License.