addressbook_multi_get
Batch fetch multiple specific contacts by their URLs. Use when you have exact contact URLs and want to retrieve their details
Read and write calendars, contacts and tasks on any CalDAV/CardDAV server — Nextcloud, Baikal, Radicale, iCloud.
LABSCO SUMMARY
Updates go through named fields rather than raw iCal or vCard, so changing a title, a location or a task's status is one call instead of re-serialising the whole entry, with the raw variants kept for properties the field list does not reach. The query tools filter on the server, which is what makes this usable on an account where listing a calendar in full would return thousands of entries.
One server covering the CalDAV and CardDAV protocols: calendars and their events, address books and their contacts, and VTODO tasks — each with list, filtered search, create, update and delete.
A CalDAV/CardDAV account, passed as CALDAV_SERVER_URL, CALDAV_USERNAME and CALDAV_PASSWORD. iCloud works with an app-specific password; Google Calendar goes through OAuth2 instead — AUTH_METHOD set to OAuth, plus GOOGLE_USER, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET and GOOGLE_REFRESH_TOKEN. Runs over stdio through npx, or as an HTTP server with --http, serving http://localhost:3000/mcp behind a BEARER_TOKEN and rate-limited to 100 requests/minute per session. Any server following RFC 4791 and RFC 6352 works.
One command plus credentials — npx -y dav-mcp, then supply credentials
USE CASES
Query by date range across every calendar at once rather than listing one calendar in full.
List the calendars to get the one you want, then create the event with its time, location and description.
Change only the fields that changed — title, location, start and end — instead of rewriting the entry.
Filter the address book by organization or email rather than pulling every contact into the conversation.
Create the todo with a due date and priority, then update its status and percent-complete as it moves.
Find todos by status, then delete the ones that are done.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
addressbook_multi_getBatch fetch multiple specific contacts by their URLs. Use when you have exact contact URLs and want to retrieve their details
addressbook_query⭐ PREFERRED: Search and filter contacts efficiently (name, email, organization). Use for "find contacts with...", "search for email...", "contacts at company..." queries. Use instead of list_contacts when ANY filter is specified. Omit addressbook_url to search across ALL addressbooks automatically.
calendar_multi_getBatch fetch multiple specific calendar events by their URLs. Use when you have exact event URLs and want to retrieve their details
calendar_query⭐ PREFERRED: Search and filter calendar events efficiently. Use instead of list_events to avoid loading thousands of entries. Omit calendar_url to search across ALL calendars automatically.
create_contactCreate a new contact (vCard) with name, email, phone, organization, and other details
create_eventCreate a new calendar event with title, date, time, optional description and location
create_todoCreate a new todo/task in a calendar. Use this when user wants to add a task, todo item, or reminder with optional due date, priority, and status.
delete_calendarPermanently delete a calendar and all its events. WARNING: This action cannot be undone! Use this when user explicitly asks to "delete calendar" or "remove calendar"
delete_contactPermanently delete a contact (vCard) from the address book. WARNING: This action cannot be undone — the contact is removed from the server immediately. Use only when the user explicitly requests deletion. Obtain the vCard URL and etag from list_contacts or addressbook_query first. The etag ensures no conflicting changes occurred since the contact was last retrieved.
delete_eventPermanently delete a calendar event. WARNING: This action cannot be undone — the event is removed from the server immediately. Use only when the user explicitly requests deletion. Obtain the event URL and etag from list_events or calendar_query first. The etag ensures no conflicting changes occurred since the event was last retrieved.
delete_todoPermanently delete a todo/task from the calendar. WARNING: This action cannot be undone — the todo is removed from the server immediately. Use only when the user explicitly requests deletion. Obtain the todo URL and etag from list_todos or todo_query first. The etag ensures no conflicting changes occurred since the todo was last retrieved.
list_addressbooksList all available address books from the CardDAV server. Use this to get address book URLs needed for other contact operations
list_calendarsList all available calendars from the CalDAV server. Use this to get calendar URLs needed for other operations
list_contactsList ALL contacts from an address book without filtering. WARNING: Returns all contacts which can be thousands - use addressbook_query instead when searching for specific contacts by name, email, or organization to save tokens
list_eventsList ALL events from a single calendar without filtering. WARNING: Returns all events which can be many thousands - use calendar_query instead for searching with filters (supports multi-calendar search).
list_todosList ALL todos/tasks from a calendar. WARNING: Returns all todos without filtering - use todo_query for searches with filters by status, summary, or due date.
make_calendarCreate a new calendar collection on the CalDAV server with optional color, description, timezone, and component types
todo_multi_getBatch fetch multiple specific todos by their URLs. More efficient than fetching one by one when you have exact todo URLs.
todo_query⭐ PREFERRED: Search and filter todos efficiently. Use instead of list_todos to conserve tokens. Omit calendar_url to search across ALL calendars automatically.
update_calendarUpdate an existing calendar's properties (display name, description, color, timezone). Use this when user asks to "rename calendar", "change calendar color", or "update calendar properties"
update_contactPREFERRED: Update contact fields without vCard formatting. Supports: FN (full name), N (structured name), EMAIL, TEL (phone), ORG (organization), TITLE (job title), NOTE, URL, ADR (address), BDAY (birthday), and any RFC 6350 vCard property including custom X-* properties.
update_contact_rawADVANCED: Update contact with raw vCard data. Requires manual vCard formatting - use update_contact instead for simple field updates (name, email, phone). Only use this if you have complete pre-formatted vCard data or need to update advanced vCard properties.
update_eventPREFERRED: Update event fields without iCal formatting. Supports: SUMMARY (title), DESCRIPTION (details), LOCATION (place), DTSTART (start time), DTEND (end time), STATUS (TENTATIVE/CONFIRMED/CANCELLED), and any RFC 5545 property including custom X-* properties (e.g., X-ZOOM-LINK, X-MEETING-ROOM).
update_event_rawADVANCED: Update event with raw iCal data. Requires manual iCal formatting - use update_event instead for simple field updates (summary, description). Only use this if you have complete pre-formatted iCal data or need to update advanced iCal properties.
update_todoPREFERRED: Update todo fields without iCal formatting. Supports: SUMMARY (title), DESCRIPTION (details), STATUS (NEEDS-ACTION/IN-PROCESS/COMPLETED/CANCELLED), PRIORITY (0-9), DUE (due date), PERCENT-COMPLETE (0-100), and any RFC 5545 VTODO property including custom X-* properties.
update_todo_rawADVANCED: Update todo with raw VTODO iCal data. Requires manual iCal formatting - use update_todo instead for simple field updates (summary, description, status). Only use this if you have complete pre-formatted VTODO data or need to update advanced iCal properties.
BEFORE YOU INSTALL
26 tools when we connected; the project documents 27. The missing tool is freebusy_query, which arrived in version 4.0.0; a build older than that does not have it.
INSTALLATION
npx -y dav-mcp{
"mcpServers": {
"dav-mcp": {
"command": "npx",
"args": [
"-y",
"dav-mcp"
],
"env": {
"CALDAV_SERVER_URL": "<YOUR_CALDAV_SERVER_URL>",
"CALDAV_USERNAME": "<YOUR_CALDAV_USERNAME>",
"CALDAV_PASSWORD": "<YOUR_CALDAV_PASSWORD>"
}
}
}
}Start the server over HTTP with a bearer token: BEARER_TOKEN=<YOUR_BEARER_TOKEN> npx dav-mcp --http (it serves http://localhost:3000/mcp).
In n8n's MCP Client Tool node, set MCP Endpoint to http://localhost:3000/mcp, Authentication to Bearer, and Token to the same value you gave BEARER_TOKEN.
git clone https://github.com/PhilflowIO/dav-mcp.git
cd dav-mcp
cp .env.example .env
# Edit .env with your credentials
docker-compose up