mcp-ical-swift
mcp-ical-swift
Un servidor MCP local para Apple Calendar que utiliza un binario Swift compilado para evitar las restricciones TCC de macOS Sequoia.
Por qué existe esto
En macOS Sequoia (26.x), los procesos sin interfaz gráfica no pueden obtener acceso al Calendario a través del mecanismo estándar TCC (Transparencia, Consentimiento y Control):
EventKit desde Python (p. ej., PyObjC) requiere
kTCCServiceCalendar, que solo puede concederse a través de un diálogo del sistema que los procesos sin interfaz no pueden activar. No hay ningún botón+en Ajustes del Sistema > Privacidad y seguridad > Calendarios en Sequoia.AppleScript a través de
osascriptrequierekTCCServiceAppleEvents(permiso de Automatización), que se atribuye al binario que realiza la llamada (normalmentenodeobun). Las ediciones directas en la base de datos TCC son ignoradas silenciosamente por las comprobaciones de integridad del demonio TCC.icalBuddy y otras herramientas de Homebrew utilizan EventKit internamente y se topan con el mismo muro.
El binario Swift compilado (swiftc) funciona porque produce un ejecutable Mach-O firmado por Apple que hereda el TCC de Calendario de la cadena de herramientas Swift del sistema. Cuando Node/Bun ejecuta este binario mediante execFileSync, EventKit informa authorizationStatus = .fullAccess y devuelve los datos del calendario.
Características
Listar todos los calendarios
Listar eventos dentro de un rango de fechas
Buscar eventos por palabra clave
Crear nuevos eventos (con soporte para calendario, ubicación, notas y eventos de día completo)
Actualizar eventos existentes
Obtener detalles completos del evento por UID
Eliminar eventos
Se ejecuta completamente de forma local a través de stdio: sin red, sin claves API, sin nube
Requisitos previos
macOS Sequoia (26.x) o posterior
Bun 1.1+
Xcode Command Line Tools (
xcode-select --install) paraswiftcDatos de calendario en Apple Calendar (iCloud, Exchange o calendarios locales)
Instalación
git clone https://github.com/Sealjay/mcp-ical-swift.git
cd mcp-ical-swift
bun install
bun run buildEl script build compila src/calendar-reader.swift en bin/calendar-reader.
Configuración del cliente MCP
Claude Code
claude mcp add --transport stdio ical --scope user -- bun run /absolute/path/to/mcp-ical-swift/src/index.tsOpenClaw
{
"mcp": {
"servers": {
"ical": {
"command": "bun",
"args": ["run", "/absolute/path/to/mcp-ical-swift/src/index.ts"]
}
}
}
}Claude Desktop
Añadir a claude_desktop_config.json:
{
"mcpServers": {
"ical": {
"command": "bun",
"args": ["run", "/absolute/path/to/mcp-ical-swift/src/index.ts"]
}
}
}Herramientas
Herramienta | Descripción |
| Listar todos los calendarios de Apple Calendar |
| Listar eventos dentro de un rango de fechas (YYYY-MM-DD) |
| Buscar eventos por palabra clave (predeterminado: 30 días hacia adelante) |
| Crear un nuevo evento (título, inicio, fin, calendario, ubicación, notas, día completo) |
| Actualizar un evento existente por UID |
| Obtener detalles completos de un evento por UID |
| Eliminar un evento por UID |
Cómo funciona
MCP Client (Claude, OpenClaw, etc.)
--> stdio --> Bun MCP server (src/index.ts)
--> execFileSync --> compiled Swift binary (bin/calendar-reader)
--> EventKit framework --> Apple Calendar dataEl binario Swift se compila una vez (bun run build) y se llama de forma síncrona para cada invocación de herramienta. Genera JSON en stdout, que el servidor MCP de Bun envuelve en los resultados de la herramienta MCP. El servidor utiliza execFileSync (no ejecución de shell) para evitar riesgos de inyección.
La idea clave: los binarios compilados con swiftc están firmados por Apple y heredan el TCC de Calendario de la cadena de herramientas del sistema. Esto evita las restricciones TCC que impiden que Node, Bun, Python y AppleScript accedan a los calendarios en contextos sin interfaz gráfica.
Privacidad y seguridad
Este servidor accede a todos los calendarios del sistema de forma predeterminada (iCloud, Exchange, locales, compartidos, suscritos). Puedes filtrar por nombre de calendario en cada solicitud utilizando el parámetro opcional
calendarenlist_eventsysearch_events.Las notas de los eventos se devuelven en las respuestas y pueden contener datos confidenciales (PINs de reuniones, contraseñas, detalles personales). Ten esto en cuenta al conceder acceso al cliente MCP.
Las operaciones de escritura (
create_event,update_event,delete_event) están disponibles sin paso de confirmación. Un cliente MCP (o una inyección de prompt dentro de uno) podría modificar los datos de tu calendario.Toda la comunicación es local a través de stdio: no se envían datos a servicios externos.
Para informar de una vulnerabilidad, consulta SECURITY.md.
Limitaciones
Solo macOS (requiere EventKit y la cadena de herramientas Swift)
Requiere el entorno de ejecución Bun
El binario Swift se compila una vez y se llama de forma síncrona por cada invocación de herramienta; no es adecuado para un uso de muy alto rendimiento
Las modificaciones de eventos recurrentes se aplican solo a la instancia única (intervalo
.thisEvent)El acceso al calendario depende de que el TCC de macOS conceda permiso al binario compilado
Solución de problemas
"Calendar access is not granted"
El binario compilado debe ejecutarse al menos una vez desde un contexto que tenga TCC de Calendario. Ejecuta la compilación y la prueba:
bun run build
bin/calendar-reader list-events $(date +%Y-%m-%d)Si esto devuelve eventos, el binario tiene acceso al Calendario. Si no, intenta ejecutarlo desde Terminal.app (que normalmente tiene concedido el TCC de Calendario).
Los eventos están vacíos
Comprueba que tienes calendarios configurados en Apple Calendar. Ejecuta:
bin/calendar-reader list-calendarsLa compilación falla
Asegúrate de que las herramientas de línea de comandos de Xcode estén instaladas:
xcode-select --installLicencia
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/Sealjay/mcp-ical-swift'
If you have feedback or need assistance with the MCP directory API, please join our Discord server