Skip to main content
Glama

mcp-ical-swift

Bun Swift MCP License: MIT macOS

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 osascript requiere kTCCServiceAppleEvents (permiso de Automatización), que se atribuye al binario que realiza la llamada (normalmente node o bun). 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) para swiftc

  • Datos 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 build

El 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.ts

OpenClaw

{
  "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

ical__list_calendars

Listar todos los calendarios de Apple Calendar

ical__list_events

Listar eventos dentro de un rango de fechas (YYYY-MM-DD)

ical__search_events

Buscar eventos por palabra clave (predeterminado: 30 días hacia adelante)

ical__create_event

Crear un nuevo evento (título, inicio, fin, calendario, ubicación, notas, día completo)

ical__update_event

Actualizar un evento existente por UID

ical__get_event

Obtener detalles completos de un evento por UID

ical__delete_event

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 data

El 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 calendar en list_events y search_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-calendars

La compilación falla

Asegúrate de que las herramientas de línea de comandos de Xcode estén instaladas:

xcode-select --install

Licencia

MIT

A
license - permissive license
-
quality - not tested
C
maintenance

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