Seguridad
Qué guarda la CLI de Google Calendar, dónde vive el inicio de sesión y qué puede compartir un agente.
Lo que comparten las CLI de WireCat —el llavero, los permisos, MCP y lo que nunca llega a un registro— está en la
página de seguridad común. Esta página recoge solo lo propio de gcal.
gcal guarda sus ajustes en config.json y su estado en las carpetas que muestra gcal doctor. Solo se comunica con
Google, y pide acceso de lectura a Calendar y a tu dirección de correo. session start --grant write añade los
eventos, y --grant sharing añade quién puede ver un calendario: nada más.
Un agente conectado con gcal <profile> mcp serve puede cambiar quién ve tu calendario sin preguntarte. Tras
--grant sharing puede compartir un calendario con cualquier dirección, hacerlo público o quitarle el acceso a alguien.
También puede llamar al método que cede un calendario a otra cuenta; ese solo funciona para un administrador de Google
Workspace, y solo si la sesión tiene un permiso que gcal no pide. Por MCP no hay nadie que responda a una pregunta,
así que ask deja que todo esto se ejecute. Un agente no puede hacer que Google envíe un correo a la persona con quien
comparte: eso necesita sharing.notify, que está en deny. Aun así puede compartir sin avisar, con
--send-notifications false. Para reservarte la compartición, ejecuta
gcal personal config set permissions.api.calendar.acl deny, o inicia sesión sin --grant sharing. Vaciar un
calendario nunca se ofrece a un agente.
La sesión de Google se guarda en el llavero del sistema, con el servicio gcal-cli, una entrada por perfil. Esa entrada
también guarda el ID y el secreto de tu cliente de OAuth, así que renovar la sesión no vuelve a necesitar el archivo del
cliente. Google dice que el secreto de cliente de una aplicación de escritorio no es confidencial, pero gcal nunca lo
muestra. Ningún comando, error, registro ni registro de ejecución muestra un token ni el secreto del cliente; la
dirección de la página de inicio de sesión no contiene ninguno de los dos. session end borra la entrada.
Con session start --credential-storage file, esa misma entrada va a credentials.json en la carpeta de estado de
gcal, con modo 600: cualquiera que pueda leer tus archivos como tú puede leer la sesión. Úsalo solo donde no funcione
ningún llavero.
gcal rechaza un archivo de cliente de OAuth que puedan leer otros usuarios del ordenador. La dirección de correo de
la cuenta se guarda en la carpeta de estado de gcal, legible solo por ti, para que session status pueda responder
sin red.
Un registro de ejecución guarda la línea de comandos tal como la escribiste, así gcal runs show te dice qué se
ejecutó. Aun así, un secreto se guarda como [redacted]: una opción con nombre de token o contraseña, una contraseña
dentro de un enlace, una cadena larga y opaca. Un número de teléfono se sustituye por [redacted] dentro de la palabra
que escribiste, también en el texto de un mensaje: uno escrito con su "+" y el código de país, o de 11 a 15 dígitos
seguidos, así que también se oculta un id largo de esa longitud. Para no guardar ninguna de las palabras que escribes,
ejecuta gcal personal config set record_input false.
Un secreto también se detecta por su aspecto, en un registro de ejecución y en un mensaje de error guardado: un token
con un formato conocido (GitHub, OpenAI, Slack, AWS, Stripe, npm y similares), una credencial Bearer, una cadena de
aspecto aleatorio de 20 caracteres o más, y una secuencia de aspecto aleatorio de 20 o más caracteres hexadecimales en
minúscula, como una clave hexadecimal o el hash completo de un commit. También se oculta el valor que sigue al nombre de
un secreto, tanto si va tras =, : o un espacio: password=, API_TOKEN=, password hunter2, pin 1234. Algunos
secretos parecen palabras normales y se quedan: un valor solo de letras tras el nombre de un secreto y un espacio
(pin this message se queda), una clave hexadecimal en mayúsculas, un hash de commit corto o un UUID, una contraseña
corta escrita sin nombre de secreto delante, y un secreto dentro de un enlace o de una ruta de archivo, salvo que tenga
un formato conocido o vaya tras el nombre de un secreto.
config.json se guarda legible solo por ti (0600), y su carpeta se crea solo para ti (0700). Un archivo o una
carpeta creados por una versión anterior pueden estar abiertos a otros usuarios del ordenador: gcal doctor muestra
cada uno en files.problems e imprime el chmod que lo corrige. En Windows no se comprueba. Informa de una
vulnerabilidad como indica SECURITY.md.