Zovo Calendar MCP Server

Gestiona eventos, recordatorios y programación desde tus archivos locales. Servidor MCP offline-first, plan gratuito, sin registro.

Documentación

mcp-calendar

Tu aplicación de calendario puede mostrarte el próximo martes. No puede decirte a dónde se fue realmente tu semana, a qué dos cosas dijiste que sí al mismo tiempo, o cuántas horas facturables valieron las reuniones del mes pasado. Este servidor lee el archivo .ics que tu calendario ya exporta y responde esas preguntas: eventos en cualquier ventana con series recurrentes expandidas correctamente, bloques ocupados combinados y los espacios libres reales dentro de tu horario laboral, cada doble reserva entre calendarios de trabajo y personales a la vez, una lista limpia .ics de solo los eventos que elegiste, y la entrada de tiempo exacta para una reunión que deberías haber facturado. No se conecta ninguna cuenta, no se sincroniza nada, y el archivo de calendario permanece en tu máquina como texto plano.

Creado por theluckystrike.

En el Registro oficial de MCP (io.github.theluckystrike/calendar-ics-reader-events-freebusy-conflicts).

Listado en el Índice de Productos de IA — endpoint remoto en vivo en mcp.zovo.one/s/calendar, plan gratuito, sin registro.

calendar demo

Importa el .ics que tu calendario exporta, luego pregunta qué hay, cuándo estás libre y qué conflictos hay, cero configuración, todo local.

Instalación en 60 segundos

La publicación en npm para @theluckystrike/mcp-calendar está pendiente. Hasta entonces, el paquete de un clic .mcpb o una clonación y compilación es la vía funcional, ambas verificadas abajo.

Un clic (.mcpb): descarga calendar.mcpb de la última versión y haz doble clic en Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

{
  "mcpServers": {
    "calendar": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-calendar"]
    }
  }
}

Claude Code:

claude mcp add calendar -- npx -y @theluckystrike/mcp-calendar

(.cursor/mcp.json):

{
  "mcpServers": {
    "calendar": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-calendar"]
    }
  }
}

El formulario npx de arriba comienza a funcionar en el momento en que se publique el paquete. Hasta entonces, usa el paquete .mcpb de arriba, o compila desde el código fuente con exactamente estos cuatro comandos:

git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/timezone -w servers/calendar

Luego apunta el command de tu cliente a node con un argumento: la ruta absoluta a servers/calendar/dist/index.js.

Para ejecutar en modo Pro, establece MCP_LICENSE_KEY en el mismo bloque de configuración, o llama a license_activate una vez con tu clave.

Cómo obtener el .ics de tu calendario

AplicaciónDónde
Google CalendarConfiguración -> Importar y exportar -> Exportar. Obtienes un zip; importa el .ics que contiene.
Apple CalendarArchivo -> Exportar -> Exportar...
Outlook (escritorio)Archivo -> Guardar calendario, formato iCalendar (.ics)
Outlook / Microsoft 365 (web)Configuración -> Calendario -> Calendarios compartidos -> Publicar, luego usa el enlace ICS (Pro)
Cualquier otra cosaCualquier URL de feed publicado que termine en .ics, o webcal:// (Pro)

Luego: ics_import {path: "~/Downloads/mike@example.com.ics", name: "work"}

Herramientas

HerramientaQué hace
ics_importLee un archivo .ics (path), contenido pegado (text) o un feed público (url, Pro) y lo guarda localmente bajo un nombre. Importar el mismo nombre nuevamente lo reemplaza.
calendars_listCada calendario importado: nombre, fuente, número de eventos, tamaño, cuándo se importó.
events_listCada evento entre dos fechas con series recurrentes expandidas a ocurrencias reales, ordenado, en tu propia zona horaria. Cada fila lleva un id.
events_searchEventos cuyo título, descripción, ubicación, organizador o asistentes contienen una frase.
free_busyBloques ocupados combinados y los espacios libres dentro de tu horario laboral, día por día. Los eventos marcados como libres/transparentes no cuentan como ocupados.
conflictsCada par de eventos que se superponen, con la superposición en minutos — en todos los calendarios, para que una llamada de cliente que choca con una recogida escolar sea detectada. Una ventana más larga se acorta a los 31 días libres y se responde, nunca se rechaza.
next_eventLo siguiente que no ha comenzado, y cuánto falta para que comience.
event_exportEscribe los eventos elegidos (por id, o una ventana completa) en un nuevo .ics que puedes enviar. Horas en UTC, para que llegue correctamente a cualquier cliente.
event_to_time_entryConvierte una reunión en los argumentos exactos para el entry_add del rastreador de tiempo, para que una llamada se convierta en tiempo facturable sin volver a escribirla.
ics_forgetElimina un calendario y su copia local.
license_status / license_activateMuestra el nivel; activa una clave Pro sin conexión.

El recurso calendar://today da el horario de hoy en una sola lectura. El prompt plan_my_day recorre todo el ciclo: qué hay, qué conflictos hay, dónde están los espacios libres, y qué reuniones terminadas facturar.

Qué maneja el analizador

Escrito contra exportaciones reales, no solo contra la especificación: plegado de líneas (CRLF, LF simple y CR simple, y pliegues que Exchange coloca dentro de un carácter multibyte, que se vuelven a unir en los bytes antes de decodificar), escape \n \, \; \\, eventos de día completo con un DTEND exclusivo, DURATION en lugar de DTEND, TZID y horas UTC, horas flotantes, RRULE para HOURLY, DAILY, WEEKLY, MONTHLY y YEARLY con COUNT, UNTIL (inclusivo), INTERVAL, BYDAY incluyendo ordinales (2MO, -1FR), BYMONTHDAY, BYMONTH y BYSETPOS, EXDATE, RDATE, anulaciones RECURRENCE-ID (la instancia movida reemplaza a la original en lugar de aparecer dos veces), STATUS:CANCELLED, TRANSP:TRANSPARENT y bloques VALARM dentro de un evento. Un evento que no puede leer se omite y se cuenta en lugar de costarte el resto del archivo.

FREQ=MINUTELY y FREQ=SECONDLY deliberadamente no se expanden: una de esas reglas llena cualquier ventana con miles de ocurrencias y entierra el resto de la semana. Esos eventos se listan en su primera ocurrencia y la razón se dice en voz alta. Una regla sin COUNT y sin UNTIL se expande solo hasta la ventana que pediste.

Las exportaciones escritas por este servidor mantienen los eventos de día completo como valores DATE, para que un feriado salga el mismo día que llegó en lugar de un bloque con hora el día anterior en la zona de tu máquina.

VTIMEZONE se ignora deliberadamente. Las reglas DST en línea de un archivo solo son tan recientes como la aplicación que lo escribió; el TZID se conserva y cada desplazamiento se calcula desde los datos ICU dentro de tu compilación de Node, que es lo que mantiene una reunión semanal de Varsovia a las 10:00 en hora local a las 10:00 a través del cambio de reloj de marzo.

Gratis vs Pro

GratisPro ($19 único)
Calendarios guardados2ilimitados
Ventana por preguntahasta 31 díascualquier ventana
conflicts sobre una ventana más largarespondido para los primeros 31 días, límite nombradocualquier ventana
Eventos por exportación50ilimitados
Importar desde una URL o feed webcal--
Todo lo demáscompletocompleto

Obtener Pro, o $39 por cada servidor del conjunto, de por vida.

Privacidad

Todo es local. El archivo de calendario que importas se copia a ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/calendar/ y se lee desde allí; eliminar ese directorio restablece el servidor. Hay exactamente una llamada de red en todo el servidor, y solo cuando pasas un url tú mismo: obtiene esa dirección una vez, con un tiempo de espera de 12 segundos, un límite de 5 MB y un rechazo en direcciones de bucle local, privadas y de metadatos de nube. No se sube nada, no se vincula ninguna cuenta, y las claves de licencia se verifican sin conexión.

Se combina con

  • mcp-timezone, este servidor lee su zona horaria y el motor .ics de él: convierte una hora de reunión, encuentra espacios entre países, escribe una invitación.
  • mcp-time-tracker, event_to_time_entry le entrega una reunión terminada; rastrea y reporta las horas.
  • mcp-invoice, convierte esas horas rastreadas en una factura numerada.
  • office-suite, varios servidores detrás de una instalación, una entrada de configuración.

Preguntas frecuentes

No. No hay OAuth, ni token, ni sincronización. Exportas un archivo (o pegas una URL de feed público en Pro) y se lee localmente. Eso también significa que una importación es una instantánea: vuelve a importar cuando el calendario haya avanzado.

Sí, y eso es la mayor parte del código. Una serie semanal se expande en el reloj de pared, para que una reunión de Varsovia a las 10:00 permanezca a las 10:00 a través del cambio de DST en lugar de derivar a las 11:00. Mensual el día 31 omite febrero en lugar de pasar a marzo, UNTIL incluye la ocurrencia que cae exactamente en él, y una instancia movida reemplaza a la original.

No lo es: RFC 5545 hace que DTEND sea exclusivo para un evento de día completo, así que 1--3 de junio significa el 1 y el 2. Este servidor sigue la especificación, que es lo que tu aplicación de calendario también hace.

Escribe archivos .ics con event_export, que puedes importar en cualquier lugar. Nunca modifica el calendario que leyó.

5 MB, que son unos pocos miles de eventos. Exporta un rango de fechas más estrecho si un historial completo es más grande que eso.