
gcalc-mcp: un servidor MCP seguro que le da a tu asistente de IA acceso a Google Calendar
- Publicado el
- • 6 min de lectura•--- vistas

Cada vez que quería que mi asistente de IA realmente hiciera algo con mi calendario — no solo hablar de él — chocaba con el mismo muro. Bailes de OAuth, librerías cliente de la API, renovación de tokens, malabares con los scopes. Mucha plomería antes de leer un solo evento. Así que construí gcalc-mcp: un pequeño servidor Model Context Protocol, escrito en Go, que envuelve el probado CLI gcalcli y expone Google Calendar como un conjunto ordenado de herramientas MCP sobre stdio.
El objetivo era simple. Dejar que una IA toque tu calendario suele ser un desastre. gcalc-mcp existe para hacerlo aburrido y seguro.
Por qué envolver un CLI en lugar de llamar a la API
La tentación con un servidor MCP es ir directo a la API de Google Calendar. Deliberadamente no lo hice. gcalcli ya resolvió las partes difíciles — OAuth2, almacenamiento de tokens, manejo de zonas horarias — hace años, y millones de cron jobs confían en él. Reutilizarlo significa que el servidor no llama a ninguna API de Google por sí mismo y no almacena credenciales. Ejecutas gcalcli init una vez, y el servidor hereda esa sesión.
Todo el diseño se reduce a unos pocos problemas y las barreras que elegí para resolver cada uno:
| El problema | Cómo lo resuelve gcalc-mcp |
|---|---|
| Conectar un LLM a Google Calendar es una pesadilla de plomería. | Reutiliza el OAuth ya existente de gcalcli. Ejecuta gcalcli init una vez; el servidor hereda la sesión. No se almacenan credenciales. |
| No quieres que un modelo ejecute comandos de shell arbitrarios. | El ejecutor acepta una lista blanca fija de subcomandos. La entrada del modelo solo se pasa como valores de flags — nunca como tokens de comando. Los subcomandos desconocidos se rechazan antes de ejecutarse. |
| La salida del CLI está pensada para humanos, no para máquinas. | Fuerza --json donde sea compatible, e inyecta --nocolor --lineart ascii en todo lo demás para obtener texto limpio y determinista. |
| Una llamada equivocada podría destruir tu calendario. | El borrado está protegido por un confirm: true explícito. Sin él, la herramienta se niega a ejecutarse y explica por qué — sin borrados accidentales. |
| Los prompts interactivos cuelgan un servidor stdio. | Los flujos guiados por TTY (init, edit, remind) están deliberadamente no expuestos. Cada herramienta es no interactiva. |
| Las fechas son molestas. | El lenguaje natural pasa directo: today, tomorrow 3pm, next monday, 2026-06-21. |
La caja de herramientas
El servidor incluye 12 herramientas, divididas entre lectura y escritura. Todo lo destructivo es opt-in.
| Herramienta | Qué hace |
|---|---|
gcal_auth_status | Confirma la configuración antes de cualquier otra cosa. |
gcal_list_calendars | Lista los calendarios de la cuenta. |
gcal_agenda | Vista de agenda sobre un rango de fechas. |
gcal_search | Busca eventos por texto. |
gcal_calw | Cuadrícula de calendario semanal. |
gcal_calm | Cuadrícula de calendario mensual. |
gcal_updates | Eventos modificados recientemente. |
gcal_conflicts | Encuentra eventos que se solapan. |
gcal_quick_add | Añade rápidamente un evento a partir de una frase en lenguaje natural. |
gcal_add_event | Añade un evento detallado (título / cuándo / dónde / duración / asistentes). |
gcal_import | Importa ICS/vCal desde una ruta de archivo o contenido en bruto. |
gcal_delete | Destructiva — elimina todos los eventos que coincidan. Requiere confirm: true. |
Consejo: llama primero a
gcal_auth_statuspara confirmar que la sesión sigue activa antes de cualquier otra cosa.
Configuración
Requisitos previos
Necesitas gcalcli autenticado una vez. El servidor se apoya en esa sesión.
pipx install gcalcli # or: brew install gcalcli
gcalcli init # one-time OAuth2 browser flow
Compilar e instalar
El servidor es un único binario de Go (Go 1.23+).
make build # -> bin/gcalc-mcp
make install # -> /usr/local/bin/gcalc-mcp (sudo)
Conéctalo a tu cliente MCP
Añade una entrada de servidor stdio en la configuración MCP de tu cliente — Claude Desktop, Claude Code, o cualquier otro que hable MCP:
{
"mcpServers": {
"gcalc": {
"type": "stdio",
"command": "/usr/local/bin/gcalc-mcp"
}
}
}
Para apuntar a un directorio de configuración de gcalcli distinto del predeterminado, configura GCALCLI_CONFIG en el entorno del servidor. Eso es todo — reinicia el cliente y tu asistente podrá leer y reservar eventos.
Seguridad por diseño
Esta es la parte que más me importaba. Darle a un modelo de lenguaje un shell es un clásico vector de inyección, así que el ejecutor nunca deja que la salida del modelo se convierta en un comando. Los subcomandos vienen de una lista blanca fija; la entrada del usuario y del modelo solo se vincula a valores de flags o argumentos posicionales, y los subcomandos desconocidos se rechazan antes de que se ejecute nada.
El borrado merece una mención especial. gcal_delete elimina todos los eventos que coincidan, así que se niega a ejecutarse sin confirm: true y explica por qué. El modelo tiene que pedir la destrucción deliberadamente — no puede tropezar con ella. Combinado con no exponer comandos interactivos en absoluto, los modos de fallo son estrechos y predecibles.
Por qué creo que este patrón importa
La mayoría de los servidores MCP que veo, o bien reimplementan toda una superficie de API, o le entregan al modelo un shell en bruto. El camino intermedio — envolver un CLI maduro, forzar salida legible por máquina y poner una lista blanca delgada entre el modelo y el sistema — te da una integración útil en unos pocos cientos de líneas sin heredar una nueva superficie de ataque. gcalcli hace el trabajo pesado; gcalc-mcp simplemente lo hace hablar MCP, de forma segura.
El proyecto tiene licencia MIT y está abierto en GitHub: github.com/artschekoff/gcalc-mcp. Issues, ideas y pull requests son bienvenidos — y si construyes tus propios servidores MCP alrededor de CLIs existentes, me encantaría comparar notas.
Disponible para colaboración por contrato
Estoy disponible para colaborar por contrato. Si tiene una idea de proyecto interesante, reserve una llamada por Calendly.
Agenda una llamada de 30 min