
Gives Claude full CRUD access to any CalDAV, CardDAV, or VTODO server through 26 specialized tools. You can query calendars with server-side filters, update individual contact fields without touching the rest of the vCard, manage tasks with priority and due dates, and even create new calendar collections on the fly. Works with Nextcloud, Baikal, Radicale, and iCloud out of the box, plus Google Calendar via OAuth2. The field-agnostic updates are the real win here since you can modify any RFC property or custom X-* field without reconstructing entire iCal objects. Reach for this when you need AI-driven calendar orchestration beyond simple event creation, or when you want contacts and tasks in the same integration.
Give your AI agents the power of organization — Transform them into orchestrating assistants managing calendars, contacts, and tasks.
Built on 27 production-ready tools spanning CalDAV, CardDAV, and VTODO protocols.
dav-mcp-<version>.mcpb from the latest release. Releases from 4.1.2 on carry this file.Basic unless your server needs Digest.The .mcpb file is an MCP Bundle: the server with its dependencies, so neither Node.js nor npx needs to be installed.
Add to your MCP config file:
{
"mcpServers": {
"dav-mcp": {
"command": "npx",
"args": ["-y", "dav-mcp"],
"env": {
"CALDAV_SERVER_URL": "https://dav.example.com",
"CALDAV_USERNAME": "your_username",
"CALDAV_PASSWORD": "your_password"
}
}
}
}
Config file locations:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/Claude/claude_desktop_config.jsonRestart Claude Desktop after adding the configuration.
Start the HTTP server:
CALDAV_SERVER_URL=https://dav.example.com \
CALDAV_USERNAME=your_username \
CALDAV_PASSWORD=your_password \
BEARER_TOKEN=your-secret-token \
npx dav-mcp --http
Then in n8n:
http://localhost:3000/mcpCustom port:
npx dav-mcp --http --port=8080
Pull the published image (distroless, runs as non-root, no shell):
docker run -d --name dav-mcp -p 3000:3000 --env-file .env \
ghcr.io/philflowio/dav-mcp:latest
Tags: latest, the exact release (4.1.2) and the minor line (4.1).
Set PORT to serve on a different port; the healthcheck follows it.
Or build from source:
git clone https://github.com/PhilflowIO/dav-mcp.git
cd dav-mcp
cp .env.example .env
# Edit .env with your credentials
docker-compose up
When partial tools force your AI to improvise, complete tools let it execute precise operations across all components.
| Capability | dav-mcp | Most MCPs |
|---|---|---|
| Calendar Management | Full CRUD (12 tools) | Create + list only (2-3 tools) |
| Contact Management | Complete CardDAV (8 tools) | Often missing entirely |
| Task Management | Full VTODO support (7 tools) | Rarely included |
| Field-Based Updates | All RFC properties + custom fields | Rarely available |
| Free/Busy | Works on every server (client-side) | Native REPORT, unsupported by most |
| Server-Side Filtering | Efficient queries | Dumps all data |
| Multi-Provider | Any CalDAV/CardDAV server | Limited provider support |
| Total Tools | 27 tools | 2-6 tools |
Works with any CalDAV/CardDAV server that follows RFC 4791 and RFC 6352:
AUTH_METHOD selects how dav-mcp logs in (case-insensitive):
AUTH_METHOD | Credentials | Use for |
|---|---|---|
Basic (default) | CALDAV_USERNAME, CALDAV_PASSWORD | Almost every server. If the server only offers Digest (for example Baikal set to Digest), dav-mcp switches to Digest by itself — no setting needed. |
Digest | CALDAV_USERNAME, CALDAV_PASSWORD | Servers that only accept Digest (RFC 7616). Unlike the automatic switch under Basic, which first sends the password once Basic-encoded and is then rejected, Digest never sends the password — use it when the connection is not HTTPS. |
OAuth (or OAuth2) | GOOGLE_*, see below | Google Calendar |
Digest needs WebCrypto as a global, which Node.js 20 and newer have and
Node.js 18 does not. On Node.js 18 it depends on the transport: over stdio the
server stops at startup against a Digest-only server, with an error that says
so and names the Node.js version; the HTTP server provides the global itself,
so Digest works there. Basic and OAuth work on Node.js 18 over both. Node.js 18
is end-of-life and support for it ends with the next major version
(#85). A wrong configuration — an unknown
AUTH_METHOD value, or missing credentials for the chosen method — stops the
server at startup instead of falling back to Basic.
For Google Calendar, use OAuth2 authentication:
{
"mcpServers": {
"dav-mcp": {
"command": "npx",
"args": ["-y", "dav-mcp"],
"env": {
"AUTH_METHOD": "OAuth",
"GOOGLE_USER": "your@gmail.com",
"GOOGLE_CLIENT_ID": "your-client-id",
"GOOGLE_CLIENT_SECRET": "your-client-secret",
"GOOGLE_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}
Pull requests are welcome! Please read CONTRIBUTING.md for guidelines.
MIT License - see LICENSE for details
Built with:
Questions? Issues? Create a GitHub issue
Built for AI agents managing calendars, contacts, and tasks
DAV_BASE_URL*Base URL of your CalDAV/CardDAV server
DAV_USERNAME*Username for DAV server authentication
DAV_PASSWORD*secretPassword for DAV server authentication