Skip to main content
Glama

caldav-mcp

Dale un calendario a tu asistente de IA. Un servidor MCP que proporciona acceso de lectura/escritura a cualquier calendario compatible con CalDAV — Nextcloud, Radicale, Baikal, ownCloud, iCloud, Fastmail y más — mediante 14 herramientas específicas.

¿Por qué caldav-mcp?

Dockerizado

Imagen multi-etapa basada en Alpine, ejecución sin root, healthcheck integrado. Despliega en cualquier lugar donde Docker funcione.

Python 3.13

Código limpio y tipado con validación Pydantic. Fácil de leer, fácil de ampliar.

Contenedor único

Un solo docker compose up — sin bases de datos, sin trabajadores en segundo plano, sin sidecars.

Sin estado

Sin estado de sesión entre peticiones. Las credenciales viajan por petición en cabeceras HTTP, lo que permite uso multi-tenant sin reiniciar el servidor.

Seguro por defecto

Comparación de tokens en tiempo constante, limitación de velocidad por IP con retroceso exponencial, saneamiento de entradas, registro de auditoría estructurado, sin secretos en respuestas de error.

Autenticación en dos capas

Clave API opcional protege el endpoint MCP; las credenciales CalDAV se inyectan por petición. Independientes, componibles, sin sorpresas.

Related MCP server: mcp-labrat

Dónde destaca

  • Gestión de calendario impulsada por IA — Permite a Claude, Codex o cualquier cliente MCP crear, actualizar, buscar y eliminar eventos mediante lenguaje natural.

  • Acceso multi-tenant — Envía diferentes cabeceras X-Caldav-* por petición para acceder a diferentes cuentas CalDAV desde una única instancia del servidor.

  • Automatización de calendario autoalojado — Se combina con tu servidor Nextcloud, Radicale o Baikal existente. Sin dependencia de la nube.

  • Despliegues empresariales / de equipo — Centralizado, sin estado, contenedorizado. Despliega detrás de un proxy inverso, escala horizontalmente, rota credenciales sin tiempo de inactividad.

Inicio rápido

# 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"}}}'

El servidor ahora es accesible en http://localhost:8600/mcp (HTTP Streamable).

Herramientas

El servidor expone 14 herramientas MCP en tres categorías.

Consultas (solo lectura)

Herramienta

Descripción

caldav_list_calendars

Lista todos los calendarios disponibles

caldav_get_events

Obtiene eventos en un rango de fechas

caldav_get_today_events

Obtiene eventos para hoy

caldav_get_week_events

Obtiene eventos para los próximos 7 días

caldav_get_event_by_uid

Obtiene un evento específico por UID (incluyendo asistentes)

caldav_search_events

Busca eventos por texto en resumen, descripción, ubicación y categorías

caldav_get_freebusy

Obtiene información de libre/ocupado para un rango de tiempo

Mutaciones (escritura)

Herramienta

Descripción

caldav_create_event

Crea un nuevo evento — admite RRULE, prioridad, categorías, asistentes

caldav_update_event

Actualiza parcialmente un evento existente por UID

caldav_delete_event

Elimina un evento por UID

caldav_move_event

Mueve un evento entre calendarios

Asistentes

Herramienta

Descripción

caldav_add_attendee

Añade un asistente a un evento

caldav_remove_attendee

Elimina un asistente de un evento

caldav_list_attendees

Lista los asistentes de un evento

Despliegue

Docker

El proyecto incluye un Dockerfile multi-etapa:

  1. Etapa de construcción — instala las dependencias de Python desde requirements.txt en un prefijo limpio.

  2. Etapa de ejecución — copia los paquetes precompilados en una imagen Alpine mínima, se ejecuta como usuario no root app, expone el puerto 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 mapea el puerto del host 8600 al puerto del contenedor 8080 y lee las variables de entorno de un archivo .env local:

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

También está disponible un docker-compose.test.yaml para pruebas de integración — incluye un servidor CalDAV Radicale.

TLS / HTTPS

El servidor admite TLS integrado sin proxy inverso. Establece estas variables de entorno para habilitar HTTPS directamente:

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

Cuando TLS está habilitado, el servidor escucha en HTTPS. Cuando no está configurado, ejecútalo detrás de un proxy inverso (Traefik, Caddy, nginx) que termine TLS.

Autenticación

Dos capas independientes — ambas opcionales pero recomendadas.

Capa 1: Autenticación del endpoint MCP

Cuando CALDAV_MCP_API_KEY está configurada, cada petición al endpoint /mcp debe incluir una de:

  • Authorization: Bearer <token>

  • X-Api-Key: <token>

El token se compara usando comparación en tiempo constante para prevenir ataques de canal lateral por tiempo. Los intentos fallidos se rastrean por IP de cliente usando un limitador de velocidad de ventana deslizante con retroceso exponencial.

Cuando CALDAV_MCP_API_KEY no está configurada, el endpoint está abierto — no lo expongas a Internet público sin autenticación.

Capa 2: Credenciales CalDAV

Las credenciales CalDAV se resuelven por petición:

  1. Cabeceras HTTP (preferidas): X-Caldav-Url, X-Caldav-Username, X-Caldav-Password

  2. Variables de entorno (respaldo): CALDAV_URL, CALDAV_USERNAME, CALDAV_PASSWORD

Las cabeceras HTTP tienen prioridad. Esto permite uso multi-tenant — diferentes clientes pueden apuntar a diferentes cuentas CalDAV sin reiniciar el servidor.

Configuración

Toda la configuración se realiza mediante variables de entorno, validadas al inicio con Pydantic.

Servidor

Variable

Valor por defecto

Descripción

CALDAV_MCP_PORT

8080

Puerto de escucha (dentro del contenedor)

CALDAV_MCP_PATH

/mcp

Ruta del endpoint HTTP Streamable

CALDAV_MCP_API_KEY

"" (deshabilitada)

Secreto compartido para autenticación del endpoint MCP

TZ

"" (UTC)

Zona horaria IANA (p. ej. Europe/Vienna) para límites de hoy/semana

CalDAV

Variable

Valor por defecto

Descripción

CALDAV_URL

""

URL del servidor CalDAV (respaldo para la cabecera X-Caldav-Url)

CALDAV_USERNAME

""

Nombre de usuario CalDAV (respaldo para la cabecera X-Caldav-Username)

CALDAV_PASSWORD

""

Contraseña CalDAV (respaldo para la cabecera X-Caldav-Password)

CALDAV_MCP_CALDAV_VERIFY_SSL

true

Verificar certificados TLS en conexiones CalDAV. Establecer false solo para pruebas con certificados autofirmados.

Limitación de velocidad

Variable

Valor por defecto

Descripción

CALDAV_MCP_RATE_LIMIT_MAX_FAILURES

10

Máximo de intentos de autenticación fallidos por IP dentro de la ventana deslizante

CALDAV_MCP_RATE_LIMIT_WINDOW_SECONDS

60

Duración de la ventana deslizante en segundos

TLS

Variable

Valor por defecto

Descripción

CALDAV_MCP_TLS_CERT

""

Ruta al archivo PEM del certificado TLS

CALDAV_MCP_TLS_KEY

""

Ruta al archivo PEM de la clave privada TLS

CALDAV_MCP_TLS_CA_BUNDLE

""

Paquete de CA opcional para autoridades de certificación personalizadas

Registro

Variable

Valor por defecto

Descripción

CALDAV_MCP_LOG_FORMAT

text

Formato del registro de auditoría: text o json

Seguridad

  • Coloca el servidor detrás de un proxy inverso que termine TLS, o habilita TLS integrado.

  • Establece una CALDAV_MCP_API_KEY fuerte.

  • Restringe el acceso a nivel de red/firewall a hosts de confianza o una VPN.

  • Prefiere enlazar a 127.0.0.1 a menos que necesites explícitamente acceso remoto.

  • Nunca coloques contraseñas de aplicación CalDAV en configuración pública o registros.

Desarrollo

Comandos

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

Estructura del proyecto

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

Dependencias

Paquete

Versión

Propósito

fastmcp

3.4.7

Marco de servidor MCP, transporte HTTP Streamable

caldav

3.2.1

Biblioteca cliente CalDAV

icalendar

7.2.2

Análisis/generación de iCalendar RFC 5545

requests

>=2.28.0

Capa de transporte HTTP

Solución de problemas

Síntoma

Causa

Solución

Connection refused

Servidor CalDAV inaccesible

Verifica que CALDAV_URL sea correcto y que el servidor esté en ejecución

SSL: CERTIFICATE_VERIFY_FAILED

Certificado TLS autofirmado o no válido

Importa la CA del servidor en el almacén de confianza del sistema, o usa un certificado válido

ERROR:[auth] unauthorized

Falta el token de API o no es válido

Configura CALDAV_MCP_API_KEY e incluye Authorization: Bearer <token> en tu solicitud

Missing CalDAV credentials

No hay cabeceras CalDAV ni variables de entorno

Proporciona cabeceras X-Caldav-* o configura CALDAV_URL/CALDAV_USERNAME/CALDAV_PASSWORD

Calendar 'X' not found

Error tipográfico o nombre de calendario incorrecto

Ejecuta caldav_list_calendars para ver los nombres disponibles: distinguen entre mayúsculas y minúsculas

Los eventos muestran una hora incorrecta

La zona horaria del servidor no está configurada

Configura la variable de entorno TZ a tu zona horaria IANA (por ejemplo, Europe/Vienna)

Preguntas frecuentes

P: ¿Puedo usar esto con varias cuentas CalDAV? R: Sí: envía diferentes cabeceras X-Caldav-Url / X-Caldav-Username / X-Caldav-Password por solicitud. La caché del cliente se basa en (url, username).

P: ¿Qué servidores CalDAV son compatibles? R: Cualquier servidor que implemente el estándar CalDAV: Nextcloud, ownCloud, iCloud, Fastmail, Baikal, Radicale y otros.

P: ¿El token de API se transmite de forma segura? R: Solo cuando se usa HTTPS. Habilita TLS integrado o coloca el servidor detrás de un proxy inverso que termine TLS.

P: ¿Cómo genero una contraseña de aplicación CalDAV? R: Depende de tu proveedor. Nextcloud: Configuración → Seguridad → Contraseñas de aplicación. iCloud: Usa una contraseña específica de la aplicación desde appleid.apple.com.

P: ¿Puedo usar esto a través de stdio en lugar de HTTP? R: El servidor actual solo usa transporte HTTP Streamable. Para usar stdio, modifica server.py para llamar a mcp.run() en lugar de mcp.run_http_async().

Licencia

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