caldav-mcp
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 |
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 |
Alle verfügbaren Kalender auflisten | |
Ereignisse in einem Datumsbereich abrufen | |
Ereignisse für heute abrufen | |
Ereignisse für die nächsten 7 Tage abrufen | |
Ein bestimmtes Ereignis per UID abrufen (einschließlich Teilnehmer) | |
Ereignisse nach Text in Zusammenfassung, Beschreibung, Ort und Kategorien durchsuchen | |
Frei/Gebucht-Informationen für einen Zeitraum abrufen |
Mutationen (schreiben)
Tool | Beschreibung |
Ein neues Ereignis erstellen – unterstützt RRULE, Priorität, Kategorien, Teilnehmer | |
Ein vorhandenes Ereignis per UID teilweise aktualisieren | |
Ein Ereignis per UID löschen | |
Ein Ereignis zwischen Kalendern verschieben |
Teilnehmer
Tool | Beschreibung |
Einen Teilnehmer zu einem Ereignis hinzufügen | |
Einen Teilnehmer aus einem Ereignis entfernen | |
Teilnehmer eines Ereignisses auflisten |
Bereitstellung
Docker
Das Projekt enthält ein mehrstufiges Dockerfile:
Builder-Stufe – installiert Python-Abhängigkeiten aus
requirements.txtin ein sauberes Präfix.Runtime-Stufe – kopiert vorgebaute Pakete in ein minimales Alpine-Image, läuft als Nicht-Root-Benutzer
app, exponiert Port8080.
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:latestDocker 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/Viennadocker compose up -dEine 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 # optionalWenn 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:
HTTP-Header (bevorzugt):
X-Caldav-Url,X-Caldav-Username,X-Caldav-PasswordUmgebungsvariablen (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 |
|
| Lauschport (innerhalb des Containers) |
|
| Streamable-HTTP-Endpunktpfad |
|
| Gemeinsames Geheimnis für die MCP-Endpunkt-Authentifizierung |
|
| IANA-Zeitzone (z. B. |
CalDAV
Variable | Standard | Beschreibung |
|
| CalDAV-Server-URL (Fallback für |
|
| CalDAV-Benutzername (Fallback für |
|
| CalDAV-Passwort (Fallback für |
|
| TLS-Zertifikate bei CalDAV-Verbindungen verifizieren. Setzen Sie |
Rate Limiting
Variable | Standard | Beschreibung |
|
| Maximale fehlgeschlagene Authentifizierungsversuche pro IP innerhalb des Sliding Windows |
|
| Dauer des Sliding Windows in Sekunden |
TLS
Variable | Standard | Beschreibung |
|
| Pfad zur TLS-Zertifikats-PEM-Datei |
|
| Pfad zur TLS-Private-Key-PEM-Datei |
|
| Optionales CA-Bundle für benutzerdefinierte Zertifizierungsstellen |
Protokollierung
Variable | Standard | Beschreibung |
|
| Audit-Log-Format: |
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 imageProjektstruktur
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 shortcutsAbhängigkeiten
Paket | Version | Zweck |
3.4.7 | MCP-Server-Framework, Streamable-HTTP-Transport | |
3.2.1 | CalDAV-Client-Bibliothek | |
7.2.2 | iCalendar-RFC-5545-Parsing/Generierung | |
>=2.28.0 | HTTP-Transportschicht |
Fehlerbehebung
Symptom | Ursache | Behebung |
| CalDAV-Server nicht erreichbar | Überprüfen Sie, ob |
| Selbstsigniertes oder ungültiges TLS-Zertifikat | Importieren Sie die CA des Servers in den System-Truststore oder verwenden Sie ein gültiges Zertifikat |
| Fehlendes oder ungültiges API-Token | Setzen Sie |
| Keine CalDAV-Header oder Umgebungsvariablen | Geben Sie |
| Tippfehler oder falscher Kalendername | Führen Sie |
Ereignisse zeigen eine falsche Uhrzeit an | Serverzeitzone nicht festgelegt | Setzen Sie die Umgebungsvariable |
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
This server cannot be installed
Maintenance
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
- AlicenseNot gradedqualityAmaintenanceAn MCP server that exposes CalDAV calendar operations as tools for AI assistants. It enables users to connect to CalDAV servers to create and list calendar events within specific timeframes.43297MIT
- FlicenseNot gradedqualityDmaintenanceAn 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.
- AlicenseNot gradedqualityFmaintenanceProvider-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
- AlicenseNot gradedqualityFmaintenanceA comprehensive MCP server that provides AI assistants with natural language access to Apple Calendar, enabling reading, searching, creating, and managing calendar events.3MIT
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…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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