Skip to main content
Glama
Isaac-To
by Isaac-To

CalDAV MCP Forwarder

Un servidor del Protocolo de Contexto de Modelo completamente sin estado que reenvía operaciones de calendario a un servidor CalDAV desde Cloudflare Workers.

El código fuente y las guías de despliegue están disponibles en el repositorio de GitHub.

Estado: Primera versión funcional. El Worker admite descubrimiento de calendarios, listado/búsqueda de eventos, recuperación, creación, actualización, eliminación y consultas de disponibilidad.

Conéctate en tres pasos

  1. Abre https://caldavmcp.anpc.work en un navegador.

  2. Introduce tu servidor CalDAV, nombre de usuario y contraseña de aplicación, luego haz clic en Probar conexión. Deja URL del calendario en blanco para descubrir calendarios automáticamente.

  3. Elige un calendario predeterminado si lo deseas, crea el token seguro y luego copia la URL MCP generada o la configuración en tu asistente de IA.

La página pública crea tokens cifrados sin caducidad por defecto para una conexión de configurar y olvidar. Opcionalmente, puedes elegir una duración más corta. Las credenciales se envían a través de HTTPS al Worker para su cifrado y nunca se descifran en el navegador. Rota CONNECTION_TOKEN_KEY si es necesario revocar tokens.

El asistente puede listar, buscar, leer, crear, actualizar y eliminar eventos, y consultar información de disponibilidad. Cada solicitud es independiente; no se almacenan calendarios, credenciales ni sesiones.

Related MCP server: mcp-labrat

Modelo de seguridad

No coloques contraseñas reales, contraseñas de aplicación ni tokens de acceso directamente en una URL. Las URLs pueden ser retenidas por el historial del navegador, proxies inversos, sistemas de análisis y registros de acceso.

Los tokens de conexión son valores cifrados con AES-GCM:

POST https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>

El token representa detalles de conexión como:

{
  "serverUrl": "https://caldav.example.com",
  "calendarUrl": "https://caldav.example.com/calendars/user/work/",
  "username": "user@example.com",
  "password": "app-password",
  "expiresAt": 1797700000
}

El Worker descifra cada token para una solicitud y descarta los detalles de conexión después. Los tokens no caducan a menos que se seleccione una caducidad al crearlos; rota CONNECTION_TOKEN_KEY para revocar todos los tokens creados con la clave anterior. Las URLs de eventos y disponibilidad deben pertenecer al servidor CalDAV configurado. Configúralo como un secreto del Worker. La clave debe ser base64 segura para URL que contenga una clave AES de 128, 192 o 256 bits.

Prefiere contraseñas de aplicación específicas del proveedor o tokens de acceso OAuth en lugar de una contraseña de cuenta principal. Nunca confirmes tokens o credenciales en este repositorio.

Conectar un cliente MCP

Después de desplegar el Worker, configura tu cliente MCP con la URL del Worker. La configuración exacta varía según el cliente, pero el endpoint es:

https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>

Para una configuración de cliente MCP que acepte un servidor HTTP remoto, usa el endpoint como la URL del servidor. Por ejemplo:

{
  "mcpServers": {
    "caldav": {
      "type": "http",
      "url": "https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>"
    }
  }
}

No pegues el token de ejemplo anterior en un cliente real. Reemplázalo con un token generado para la cuenta y el calendario CalDAV previstos.

El asistente podrá llamar a herramientas como:

  • list_calendars

  • list_events

  • search_events

  • get_event

  • create_event

  • update_event

  • delete_event

Ejemplos de solicitudes que un asistente podría manejar:

  • "¿Qué hay en mi calendario de trabajo mañana?"

  • "Crea una cita con el dentista el próximo martes a las 10:00."

  • "Mueve mi reunión de las 3 PM al viernes."

  • "Cancela el evento titulado 'Revisión de proyecto'."

  • "Encuentra todos los eventos que mencionen la reunión de planificación trimestral."

El asistente debe confirmar acciones destructivas importantes, especialmente la eliminación de eventos, antes de llamar a la herramienta correspondiente.

Formato de salida de las herramientas

Las respuestas de las herramientas usan JSON compacto con solo la información necesaria para la siguiente acción:

  • Las listas de calendarios contienen url, más displayName, description, timezone y color disponibles.

  • Las listas de eventos y get_event contienen url, etag opcional y los data actuales de iCalendar.

  • create_event devuelve la url del evento creado.

  • update_event devuelve la url del evento actualizado.

  • delete_event devuelve la url del evento eliminado y deleted: true.

  • get_free_busy devuelve solo los data de iCalendar de disponibilidad.

Las respuestas no incluyen códigos de estado HTTP, metadatos CalDAV sin procesar ni formato de presentación.

Despliegue

Instala las dependencias:

npm install

Ejecuta el Worker localmente:

npm run dev

Verifica los tipos del proyecto:

npm run typecheck

Ejecutar pruebas unitarias

npm test

Ejecutar pruebas con cobertura

npm run coverage

Los umbrales de cobertura se aplican al 90% para sentencias, líneas y funciones, y al 85% para ramas. Los módulos fuente actuales comprobables con pruebas unitarias reportan un 100% en las cuatro categorías. El punto de entrada del Worker de Cloudflare está excluido porque requiere el tiempo de ejecución de Workers y servicios CalDAV externos; valídalo con una prueba de humo desplegada o con wrangler dev.

Despliega en Cloudflare Workers:

npx wrangler login
npm run deploy

El Worker está configurado como un Dominio Personalizado de Cloudflare en caldavmcp.anpc.work. Wrangler crea el dominio y el certificado cuando la zona está activa en la misma cuenta de Cloudflare. Establece el secreto requerido antes de desplegar:

npx wrangler secret put CONNECTION_TOKEN_KEY
npm run deploy

El dominio debe estar activo en DNS de Cloudflare. No agregues un registro CNAME conflictivo para caldavmcp.anpc.work; los Dominios Personalizados gestionan el registro DNS.

Establece la clave de cifrado como un secreto del Worker de Cloudflare:

npx wrangler secret put CONNECTION_TOKEN_KEY

Para desarrollo local, crea .dev.vars a partir de .dev.vars.example y reemplaza el marcador de posición con una clave generada. Wrangler carga .dev.vars automáticamente al ejecutar npm run dev; no confirmes ese archivo.

cp .dev.vars.example .dev.vars
openssl rand -base64 32 | tr '+/' '-_' | tr -d '='

Nunca pongas la clave de cifrado en wrangler.jsonc, código fuente o configuración del cliente.

Herramientas disponibles

Todas las herramientas operan en el calendario seleccionado por calendarUrl en el token, o aceptan un calendarUrl explícito cuando corresponda.

Herramienta

Propósito

list_calendars

Descubre calendarios en la cuenta.

list_events

Lista eventos para un rango start/end requerido. Sin calendarUrl, busca en todos los calendarios.

search_events

Busca datos de eventos por texto. Sin calendarUrl, busca en todos los calendarios.

get_event

Obtiene un evento por su URL de objeto.

create_event

Crea un evento con resumen, inicio y fin.

update_event

Actualiza un evento usando sus datos iCalendar actuales y URL de objeto.

delete_event

Elimina un evento, opcionalmente proporcionando su ETag.

get_free_busy

Consulta datos de disponibilidad para un rango de tiempo.

Las fechas deben ser cadenas ISO 8601, por ejemplo 2026-08-20T10:00:00Z. Las actualizaciones de eventos requieren los data iCalendar actuales para que se conserven propiedades desconocidas específicas del proveedor.

Comportamiento de las herramientas para agentes

  • Llama a list_calendars primero cuando las URLs de calendario disponibles sean desconocidas.

  • list_events y search_events requieren start y end. Un calendarUrl explícito selecciona un calendario. Sin él, se usa el calendario configurado en el token; si no hay ninguno configurado, se buscan todos los calendarios.

  • search_events realiza una búsqueda de texto sin distinción de mayúsculas y minúsculas sobre los datos iCalendar de cada evento, no solo el título del evento.

  • get_event requiere la URL HTTPS actual del objeto del evento.

  • create_event requiere summary, start y end; la selección del calendario es URL explícita, calendario del token, luego el primer calendario disponible.

  • update_event requiere los data actuales del evento; envía solo los campos que deben cambiar porque los campos omitidos se conservan.

  • delete_event elimina permanentemente un evento. Confirma la eliminación con el usuario primero y pasa el ETag actual cuando esté disponible.

  • get_free_busy devuelve datos de disponibilidad iCalendar para el rango solicitado y no lista detalles del evento.

Flujo de solicitud sin estado

MCP client
   |
   | POST /mcp/<encrypted-token>
   v
Cloudflare Worker
   | decrypt token in memory
   | create request-scoped CalDAV client
   | perform one operation
   | discard credentials and response data
   v
CalDAV server

Este Worker no retiene ningún dato de calendario ni estado de sesión MCP. El cuerpo de la solicitud, las credenciales y la respuesta CalDAV existen solo durante la solicitud.

Notas del proveedor

Las implementaciones de CalDAV difieren. Puede que necesites una contraseña de aplicación o un endpoint específico del proveedor:

  • Nextcloud: generalmente admite contraseñas de aplicación y URLs de colección de calendarios.

  • Fastmail: usa una contraseña específica de la aplicación y el endpoint CalDAV proporcionado por Fastmail.

  • iCloud: generalmente requiere una contraseña específica de la aplicación y el endpoint CalDAV de la cuenta.

  • Google Calendar: el soporte nativo de CalDAV es limitado; usa la API de Google en su lugar si la compatibilidad con CalDAV es insuficiente.

Siempre prueba el descubrimiento de calendarios, eventos recurrentes, zonas horarias, asistentes, ETags y el comportamiento de eliminación con el proveedor objetivo.

Tecnología

  • Cloudflare Workers

  • TypeScript

  • @modelcontextprotocol/sdk

  • tsdav

  • ical.js

  • zod

Limitaciones

El servicio reenvía solicitudes y no se convierte en un servicio de sincronización de calendarios. No mantiene un índice local de eventos, no desduplica eventos entre calendarios ni pone en cola trabajo para ejecución posterior. Si un proveedor CalDAV no está disponible, la solicitud falla sin reintentarse desde almacenamiento persistente.

A
license - permissive license
-
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
    -
    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
    -
    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
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.
    8
    6
    MIT

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.

  • MCP server connecting AI agents to non-custodial staking data across 130+ networks.

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/Isaac-To/caldav_mcp'

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