Tokens de Safari MCP fallan por epoch sin actualizar
Un bug en el manejo del epoch de sesión de Safari MCP hace que los tokens creados tras un reinicio de daemon sean rechazados, dejando pestañas inoperables.

Un usuario de Safari MCP, al ejecutar un trabajo programado, encontró que las pestañas abiertas tras el reinicio del daemon se bloqueaban inmediatamente al intentar cualquier comando. El servidor, que emite un token de capacidad para cada pestaña, rechazaba el token con el mensaje: Tab safety: receipt is forged, stale, ambiguous, or not valid for this origin.
El problema se debe a que el token lleva un browser‑session epoch, un identificador aleatorio que vincula el token a una única ejecución continua del navegador. Cuando el navegador se reinicia, el epoch gira y los tokens antiguos deben rechazarse.
En Safari MCP, la función _ensureBrowserSessionEpoch() lee el epoch desde sessionStorage una sola vez y lo guarda en memoria. Si el daemon se reinicia y el extension re‑handshake ocurre mientras el worker sigue en memoria, el worker sigue usando el epoch antiguo para firmar nuevos tokens. Al volver a arrancar el worker, se vuelve a leer sessionStorage, se detecta que el epoch ha cambiado y se descartan todos los tokens guardados, provocando que las pestañas abiertas en ese intervalo se vuelvan inactivas.
El código intenta protegerse con un contador _browserEpochGeneration que nunca se incrementa; las comparaciones con este valor están en seis lugares, pero sólo tres de ellas están realmente activas. Así, la mayoría de las guardas nunca se disparan, lo que permite que el bug pase desapercibido hasta la rehidratación.
El error se reportó en GitHub: safari‑mcp y la incidencia #105.
Para los administradores que utilizan Safari MCP, la recomendación es revisar la versión actual del extension y aplicar cualquier parche que actualice la lógica del epoch. Si la extensión no se actualiza, las pestañas abiertas justo después de un reinicio de daemon permanecerán bloqueadas hasta que el worker se reinicie y los tokens se descarten.
Esta falla destaca la importancia de un manejo correcto del estado de sesión en extensiones que dependen de tokens de capacidad. Cuando el estado cambia de forma asíncrona, las guardas de integridad deben actualizarse en tiempo real para evitar que las operaciones legítimas sean rechazadas.
Para más detalles técnicos, consulta el código fuente y la incidencia en GitHub.


