Skip to main content
Glama

caldav-mcp

Geben Sie Ihrem KI-Assistenten einen Kalender. Ein MCP-Server, der Lese-/Schreibzugriff auf jeden CalDAV-kompatiblen Kalender bietet – Nextcloud, Radicale, Baikal, ownCloud, iCloud, Fastmail und mehr – über 14 zweckgerichtete Tools.

Warum caldav-mcp?

Dockerisiert

Mehrstufiges Alpine-basiertes Image, Ausführung als Nicht-Root, integrierter Healthcheck. Überall einsetzbar, wo Docker läuft.

Python 3.13

Sauberer, typisierter Code mit Pydantic-Validierung. Leicht zu lesen, leicht zu erweitern.

Einzelner Container

Ein docker compose up – keine Datenbanken, keine Hintergrund-Worker, keine Sidecars.

Zustandslos

Kein Sitzungszustand zwischen Anfragen. Anmeldedaten werden pro Anfrage in HTTP-Headern übertragen, was Multi-Tenant-Nutzung ohne Serverneustarts ermöglicht.

Standardmäßig sicher

Konstantzeit-Token-Vergleich, IP-basiertes Rate Limiting mit exponentiellem Backoff, Eingabebereinigung, strukturierte Audit-Logs, keine Geheimnisse in Fehlerantworten.

Zweischichtige Authentifizierung

Optionaler API-Schlüssel schützt den MCP-Endpunkt; CalDAV-Anmeldedaten werden pro Anfrage injiziert. Unabhängig, kombinierbar, keine Überraschungen.

Related MCP server: mcp-labrat

Wo es glänzt

  • KI-gestützte Kalenderverwaltung – Lassen Sie Claude, Codex oder einen beliebigen MCP-Client Ereignisse über natürliche Sprache erstellen, aktualisieren, suchen und löschen.

  • Multi-Tenant-Zugriff – Senden Sie pro Anfrage unterschiedliche X-Caldav-*-Header, um von einer einzelnen Serverinstanz aus auf verschiedene CalDAV-Konten zuzugreifen.

  • Self-hosted Kalenderautomatisierung – Kombinierbar mit Ihrem bestehenden Nextcloud-, Radicale- oder Baikal-Server. Keine Cloud-Abhängigkeit.

  • Enterprise-/Team-Bereitstellungen – Zentralisiert, zustandslos, containerisiert. Hinter einem Reverse-Proxy bereitstellen, horizontal skalieren, Anmeldedaten ohne Ausfallzeiten rotieren.

Schnellstart

# 1. Clone the repo
git clone https://git.gelse.net/werner/caldav-mcp.git && cd caldav-mcp

# 2. Create your .env file
cp .env.example .env
# Edit .env — at minimum set CALDAV_MCP_API_KEY, CALDAV_URL, CALDAV_USERNAME, CALDAV_PASSWORD

# 3. Launch
docker compose up -d

# 4. Verify
curl -s http://localhost:8600/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "X-Caldav-Url: https://cloud.example.com/remote.php/dav/calendars/user/" \
  -H "X-Caldav-Username: user" \
  -H "X-Caldav-Password: app-password" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}'

Der Server ist nun unter http://localhost:8600/mcp erreichbar (Streamable HTTP).

Tools

Der Server stellt 14 MCP-Tools in drei Kategorien bereit.

Abfragen (nur lesen)

Tool

Beschreibung

caldav_list_calendars

Alle verfügbaren Kalender auflisten

caldav_get_events

Ereignisse in einem Datumsbereich abrufen

caldav_get_today_events

Ereignisse für heute abrufen

caldav_get_week_events

Ereignisse für die nächsten 7 Tage abrufen

caldav_get_event_by_uid

Ein bestimmtes Ereignis per UID abrufen (einschließlich Teilnehmer)

caldav_search_events

Ereignisse nach Text in Zusammenfassung, Beschreibung, Ort und Kategorien durchsuchen

caldav_get_freebusy

Frei/Gebucht-Informationen für einen Zeitraum abrufen

Mutationen (schreiben)

Tool

Beschreibung

caldav_create_event

Ein neues Ereignis erstellen – unterstützt RRULE, Priorität, Kategorien, Teilnehmer

caldav_update_event

Ein vorhandenes Ereignis per UID teilweise aktualisieren

caldav_delete_event

Ein Ereignis per UID löschen

caldav_move_event

Ein Ereignis zwischen Kalendern verschieben

Teilnehmer

Tool

Beschreibung

caldav_add_attendee

Einen Teilnehmer zu einem Ereignis hinzufügen

caldav_remove_attendee

Einen Teilnehmer aus einem Ereignis entfernen

caldav_list_attendees

Teilnehmer eines Ereignisses auflisten

Bereitstellung

Docker

Das Projekt enthält ein mehrstufiges Dockerfile:

  1. Builder-Stufe – installiert Python-Abhängigkeiten aus requirements.txt in ein sauberes Präfix.

  2. Runtime-Stufe – kopiert vorgebaute Pakete in ein minimales Alpine-Image, läuft als Nicht-Root-Benutzer app, exponiert Port 8080.

docker build -t caldav-mcp:latest .
docker run -p 8600:8080 \
  -e CALDAV_MCP_API_KEY=YOUR_KEY \
  -e CALDAV_URL=https://cloud.example.com/remote.php/dav/calendars/user/ \
  -e CALDAV_USERNAME=user \
  -e CALDAV_PASSWORD=app-password \
  caldav-mcp:latest

Docker Compose

docker-compose.yaml bildet Host-Port 8600 auf Container-Port 8080 ab und liest Umgebungsvariablen aus einer lokalen .env-Datei:

services:
  caldav-mcp:
    build: .
    image: caldav-mcp:latest
    restart: unless-stopped
    ports:
      - "8600:8080"
    environment:
      CALDAV_MCP_API_KEY: "${CALDAV_MCP_API_KEY:-}"
      TZ: Europe/Vienna
docker compose up -d

Eine docker-compose.test.yaml ist ebenfalls für Integrationstests verfügbar – sie enthält einen Radicale-CalDAV-Server.

TLS / HTTPS

Der Server unterstützt integriertes TLS ohne Reverse-Proxy. Setzen Sie diese Umgebungsvariablen, um HTTPS direkt zu aktivieren:

CALDAV_MCP_TLS_CERT=/path/to/cert.pem
CALDAV_MCP_TLS_KEY=/path/to/key.pem
CALDAV_MCP_TLS_CA_BUNDLE=/path/to/ca.pem   # optional

Wenn TLS aktiviert ist, lauscht der Server auf HTTPS. Wenn nicht gesetzt, betreiben Sie ihn hinter einem Reverse-Proxy (Traefik, Caddy, nginx), der TLS terminiert.

Authentifizierung

Zwei unabhängige Ebenen – beide optional, aber empfohlen.

Ebene 1: MCP-Endpunkt-Authentifizierung

Wenn CALDAV_MCP_API_KEY gesetzt ist, muss jede Anfrage an den /mcp-Endpunkt eines der folgenden enthalten:

  • Authorization: Bearer <token>

  • X-Api-Key: <token>

Der Token wird mit Konstantzeit-Vergleich geprüft, um Timing-Seitenkanalangriffe zu verhindern. Fehlgeschlagene Versuche werden pro Client-IP mit einem Sliding-Window-Rate-Limiter mit exponentiellem Backoff verfolgt.

Wenn CALDAV_MCP_API_KEY nicht gesetzt ist, ist der Endpunkt offen – setzen Sie ihn ohne Authentifizierung nicht dem öffentlichen Internet aus.

Ebene 2: CalDAV-Anmeldedaten

CalDAV-Anmeldedaten werden pro Anfrage aufgelöst:

  1. HTTP-Header (bevorzugt): X-Caldav-Url, X-Caldav-Username, X-Caldav-Password

  2. Umgebungsvariablen (Fallback): CALDAV_URL, CALDAV_USERNAME, CALDAV_PASSWORD

HTTP-Header haben Vorrang. Dies ermöglicht Multi-Tenant-Nutzung – verschiedene Clients können ohne Serverneustart auf verschiedene CalDAV-Konten zugreifen.

Konfiguration

Die gesamte Konfiguration erfolgt über Umgebungsvariablen, die beim Start mit Pydantic validiert werden.

Server

Variable

Standard

Beschreibung

CALDAV_MCP_PORT

8080

Lauschport (innerhalb des Containers)

CALDAV_MCP_PATH

/mcp

Streamable-HTTP-Endpunktpfad

CALDAV_MCP_API_KEY

"" (deaktiviert)

Gemeinsames Geheimnis für die MCP-Endpunkt-Authentifizierung

TZ

"" (UTC)

IANA-Zeitzone (z. B. Europe/Vienna) für heute/Woche-Grenzen

CalDAV

Variable

Standard

Beschreibung

CALDAV_URL

""

CalDAV-Server-URL (Fallback für X-Caldav-Url-Header)

CALDAV_USERNAME

""

CalDAV-Benutzername (Fallback für X-Caldav-Username-Header)

CALDAV_PASSWORD

""

CalDAV-Passwort (Fallback für X-Caldav-Password-Header)

CALDAV_MCP_CALDAV_VERIFY_SSL

true

TLS-Zertifikate bei CalDAV-Verbindungen verifizieren. Setzen Sie false nur für Tests mit selbstsignierten Zertifikaten.

Rate Limiting

Variable

Standard

Beschreibung

CALDAV_MCP_RATE_LIMIT_MAX_FAILURES

10

Maximale fehlgeschlagene Authentifizierungsversuche pro IP innerhalb des Sliding Windows

CALDAV_MCP_RATE_LIMIT_WINDOW_SECONDS

60

Dauer des Sliding Windows in Sekunden

TLS

Variable

Standard

Beschreibung

CALDAV_MCP_TLS_CERT

""

Pfad zur TLS-Zertifikats-PEM-Datei

CALDAV_MCP_TLS_KEY

""

Pfad zur TLS-Private-Key-PEM-Datei

CALDAV_MCP_TLS_CA_BUNDLE

""

Optionales CA-Bundle für benutzerdefinierte Zertifizierungsstellen

Protokollierung

Variable

Standard

Beschreibung

CALDAV_MCP_LOG_FORMAT

text

Audit-Log-Format: text oder json

Sicherheit

  • Setzen Sie den Server hinter einen Reverse-Proxy, der TLS terminiert, oder aktivieren Sie integriertes TLS.

  • Setzen Sie einen starken CALDAV_MCP_API_KEY.

  • Beschränken Sie den Zugriff auf Netzwerk-/Firewall-Ebene auf vertrauenswürdige Hosts oder ein VPN.

  • Bevorzugen Sie die Bindung an 127.0.0.1, es sei denn, Sie benötigen explizit Remote-Zugriff.

  • Platzieren Sie CalDAV-App-Passwörter niemals in öffentlichen Konfigurationen oder Logs.

Entwicklung

Befehle

make test           # Run unit tests
make test-integration  # Run integration tests (requires docker-compose.test.yaml)
make test-performance  # Run performance benchmarks
make lint           # Lint with ruff (check + format)
make typecheck      # Type check with mypy
make check          # All checks: lint + typecheck + deps-check + test
make deps-check     # Verify pyproject.toml and requirements.txt are in sync
make build          # Build Docker image

Projektstruktur

caldav-mcp/
├── server.py                 # Thin entrypoint, launches FastMCP HTTP server
├── caldav_mcp/               # Core package
│   ├── tools/                # MCP tool handlers
│   │   ├── queries.py        #   Read-only tools (7)
│   │   ├── mutations.py      #   Write tools (4)
│   │   └── attendees.py      #   Attendee management (3)
│   ├── auth.py               # Two-layer auth (API key + CalDAV creds)
│   ├── calendar.py           # CalDAV calendar selection & serialization
│   ├── client_cache.py       # Thread-safe LRU cache for DAVClient
│   ├── config.py             # Env var parsing, header constants
│   ├── config_schema.py      # Pydantic startup validation
│   ├── datetime_utils.py     # Date/time parsing, timezone helpers
│   ├── errors.py             # Typed exceptions, ToolResult dataclass
│   ├── event_builder.py      # Pure iCalendar VEVENT construction
│   ├── sanitizers.py         # Input sanitization, field length limits
│   ├── rate_limit.py         # Sliding-window rate limiter
│   ├── audit.py              # Structured JSON audit logging
│   ├── constants.py          # Shared string constants
│   └── types.py              # CalDAVClient Protocol definition
├── tests/                    # Unit, integration, performance
├── docs/                     # Architecture, API, contributing docs
├── Dockerfile                # Multi-stage Docker build
├── docker-compose.yaml       # Production compose
├── docker-compose.test.yaml  # Test compose with Radicale
├── requirements.txt          # Runtime dependencies (pinned)
├── pyproject.toml            # Dev config and dependencies
└── Makefile                  # Build/test shortcuts

Abhängigkeiten

Paket

Version

Zweck

fastmcp

3.4.7

MCP-Server-Framework, Streamable-HTTP-Transport

caldav

3.2.1

CalDAV-Client-Bibliothek

icalendar

7.2.2

iCalendar-RFC-5545-Parsing/Generierung

requests

>=2.28.0

HTTP-Transportschicht

Fehlerbehebung

Symptom

Ursache

Behebung

Connection refused

CalDAV-Server nicht erreichbar

Überprüfen Sie, ob CALDAV_URL korrekt ist und der Server läuft

SSL: CERTIFICATE_VERIFY_FAILED

Selbstsigniertes oder ungültiges TLS-Zertifikat

Importieren Sie die CA des Servers in den System-Truststore oder verwenden Sie ein gültiges Zertifikat

ERROR:[auth] unauthorized

Fehlendes oder ungültiges API-Token

Setzen Sie CALDAV_MCP_API_KEY und fügen Sie Authorization: Bearer <token> in Ihre Anfrage ein

Missing CalDAV credentials

Keine CalDAV-Header oder Umgebungsvariablen

Geben Sie X-Caldav-*-Header an oder setzen Sie CALDAV_URL/CALDAV_USERNAME/CALDAV_PASSWORD

Calendar 'X' not found

Tippfehler oder falscher Kalendername

Führen Sie caldav_list_calendars aus, um die verfügbaren Namen zu sehen — diese unterscheiden zwischen Groß- und Kleinschreibung

Ereignisse zeigen eine falsche Uhrzeit an

Serverzeitzone nicht festgelegt

Setzen Sie die Umgebungsvariable TZ auf Ihre IANA-Zeitzone (z. B. Europe/Vienna)

FAQ

F: Kann ich dies mit mehreren CalDAV-Konten verwenden? A: Ja — senden Sie pro Anfrage unterschiedliche X-Caldav-Url- / X-Caldav-Username- / X-Caldav-Password-Header. Der Client-Cache verwendet (url, username) als Schlüssel.

F: Welche CalDAV-Server werden unterstützt? A: Jeder Server, der den CalDAV-Standard implementiert: Nextcloud, ownCloud, iCloud, Fastmail, Baikal, Radicale und andere.

F: Wird das API-Token sicher übertragen? A: Nur bei Verwendung von HTTPS. Aktivieren Sie integriertes TLS oder platzieren Sie den Server hinter einem TLS-terminierenden Reverse-Proxy.

F: Wie generiere ich ein CalDAV-App-Passwort? A: Hängt von Ihrem Anbieter ab. Nextcloud: Einstellungen → Sicherheit → App-Passwörter. iCloud: Verwenden Sie ein app-spezifisches Passwort von appleid.apple.com.

F: Kann ich dies über stdio anstelle von HTTP verwenden? A: Der aktuelle Server verwendet ausschließlich den Streamable-HTTP-Transport. Um stdio zu verwenden, ändern Sie server.py so, dass mcp.run() anstelle von mcp.run_http_async() aufgerufen wird.

Lizenz

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables interaction with CalDAV calendars to manage events and check availability through natural language or voice commands. It provides specific tools for listing, searching, and creating calendar entries using an OpenAI-compatible interface.
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provider-agnostic CalDAV calendar MCP server that connects any CalDAV calendar to AI assistants, enabling calendar operations like listing, creating, updating, and deleting events.
    AGPL 3.0

View all related MCP servers

Related MCP Connectors

  • Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.

  • Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gelse/caldav-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server