Contraseñas seguras en Claude Code: popup nativo sin exponer nada en el chat

Índice
Contraseñas seguras en Claude Code: popup nativo sin exponer nada en el chat

Cuando empecé a usar Claude Code para tareas de administración real — conectarse a servidores, autenticarse en APIs, gestionar servicios — llegó el momento inevitable: Claude necesita una contraseña.

La respuesta obvia es escribirla en el chat. Y es un error.


El problema: el chat no es un canal seguro para contraseñas

Claude Code guarda historial. El terminal guarda historial. Los mensajes del chat pueden comprimirse, sincronizarse y almacenarse. Si escribes una contraseña en el chat de Claude, esa contraseña existe en varios sitios que no controlas completamente:

  • Historial de la conversación — persistente entre sesiones
  • .bash_history y logs del terminal — si copias del chat a la terminal
  • Context windows comprimidos — Claude comprime contexto largo; el resumen puede incluir fragmentos sensibles
  • Logs del sistema — dependiendo de cómo esté configurado tu entorno

El principio es simple: una contraseña que aparece en texto plano en cualquier log ha dejado de ser segura.


La solución: un MCP que muestra un popup nativo

En lugar de escribir la contraseña en el chat, le dices a Claude que la pida. Claude llama a una herramienta MCP que muestra el diálogo de contraseña nativo del sistema — el mismo que usa sudo, ssh-askpass o cualquier aplicación que necesite autenticación.

El flujo es:

Claude: "Necesito la contraseña para conectarme al servidor"
     → llama a ask_password("servidor de base de datos")
     → popup nativo aparece en tu pantalla
     → tú escribes la contraseña
     → Claude la recibe en memoria y la usa
     → la contraseña nunca aparece en el chat

Ni en el chat. Ni en los logs. Ni en ningún lado.


Ventajas de seguridad concretas

Sin rastro en el historial de conversación. Claude recibe la contraseña como valor de retorno de una herramienta, no como texto del usuario. No aparece en el chat, no se almacena en el historial de la sesión.

Sin rastro en el terminal. No hay un echo "micontraseña" que se quede en .bash_history. El popup captura la entrada de forma opaca, igual que hace sudo.

Destrucción automática tras el primer uso. La contraseña se borra de memoria y de disco en cuanto se lee. No se reutiliza ni se almacena.

Misma UX que las herramientas del sistema. El popup es el diálogo nativo de KDE o GNOME. El usuario sabe exactamente lo que está pasando.

Fallback seguro para automatización. Para flujos donde el popup no es posible (scripts desatendidos, sesiones SSH remotas), se puede pre-cargar la contraseña en /tmp/.mcp-askpass con permisos 600. El MCP la lee, la borra y continúa.


Cómo funciona

El servidor MCP (mcp_askpass_server.py) expone una sola herramienta: ask_password(label).

Cuando Claude la invoca, la lógica es:

  1. Comprobar si existe /tmp/.mcp-askpass
    • Si existe: leer contenido, borrar el fichero, devolver contraseña
  2. Detectar entorno gráfico via $XDG_CURRENT_DESKTOP
    • KDE → kdialog --password "label"
    • GNOME → zenity --password --title "label"
  3. Si no hay entorno gráfico detectado: error descriptivo indicando cómo usar el fallback

La contraseña viaja de popup → MCP → Claude. En ningún momento toca el chat, los logs del terminal ni el historial de la conversación.


Instalación

No requiere pip, ni entornos virtuales, ni dependencias externas. Solo Python del sistema y las herramientas nativas de tu escritorio (kdialog en KDE, zenity en GNOME).

git clone https://github.com/jaimealberto/mcp-askpass

Añadir en ~/.claude.json (configuración global de Claude Code):

{
  "mcpServers": {
    "mcp-askpass": {
      "type": "stdio",
      "command": "python3",
      "args": ["/ruta/a/mcp-askpass/mcp_askpass_server.py"]
    }
  }
}

Reiniciar Claude Code. La herramienta ask_password estará disponible en todas las sesiones.


Uso avanzado: pre-cargar la contraseña

En algunos casos necesitas que la contraseña esté disponible antes de que Claude la solicite — por ejemplo, cuando un MCP de terceros la necesita al arrancar, o cuando trabajas en un flujo automatizado.

El fallback de /tmp/.mcp-askpass cubre este caso:

# Escribir la contraseña antes de iniciar Claude Code
printf 'mi_contraseña' > /tmp/.mcp-askpass
chmod 600 /tmp/.mcp-askpass

La próxima llamada a ask_password() leerá el fichero y lo borrará automáticamente. Sin popup, sin interacción manual. El fichero tiene permisos 600 y vida útil de una sola lectura.


Repositorio

El código está en GitHub con licencia MIT:

👉 github.com/jaimealberto/mcp-askpass

Un solo fichero Python, sin dependencias. Funciona en cualquier Linux con KDE o GNOME. El README incluye instrucciones de instalación y los casos de uso documentados.