Skip to main content
Glama
ckuzmick

cluster-tools MCP Server

by ckuzmick

clt — trabajos de COMSOL con un solo comando en el clúster Harvard FASRC

Ejecuta un trabajo por lotes de COMSOL en el clúster desde tu Mac en una línea:

cluster file3.mph

que (aviso de Touch ID →) obtiene file3.mph de la máquina Windows, inicia sesión en FASRC con tu contraseña + código 2FA generado automáticamente, sube el archivo, envía un trabajo asíncrono de Slurm, y te devuelve un id de trabajo. Después:

cluster status          # queue overview
cluster logs            # tail the COMSOL batch log of the latest job
cluster fetch           # download out.mph + batch.log when it's done
cluster shell           # drop into an interactive shell (no re-login)
cluster code            # print the current 2FA code, e.g. for a manual login

Todo es un único script de Node sin dependencias (cluster.js) más las herramientas integradas de macOS: ssh, scp, expect, security (Keychain). Sin paquetes npm.

Cómo funciona

Mac (cluster.js)
 ├─ Touch ID gate            (optional tiny Swift helper, compiled once)
 ├─ Keychain                 → FASRC password + TOTP seed
 ├─ TOTP in Node crypto      → the same 6-digit codes as the OpenAuth Java app
 ├─ ssh ControlMaster        → authenticate ONCE, reuse the session ~8h,
 │                             so scp/ssh/sbatch below run with zero prompts
 ├─ scp  winbox → Mac        (over an AnyDesk TCP tunnel or LAN, key auth)
 ├─ scp  Mac → cluster       (over the shared session)
 └─ ssh  sbatch              → COMSOL batch job runs asynchronously on Slurm

La idea clave es que la "aplicación Java 2FA" de FASRC (OpenAuth/JAuth) es TOTP simple — el mismo algoritmo que Google Authenticator. Una vez que tienes su semilla base32, ~15 líneas de Node crypto generan códigos válidos, y expect escribe la contraseña y el código en los mensajes de ssh para el primer inicio de sesión del día. ControlMaster mantiene esa sesión activa para que nada más solicite autenticación.

Configuración única

0. Requisitos

  • macOS con Node ≥ 18 (brew install node o nodejs.org)

  • Una cuenta de FASRC con OpenAuth 2FA

  • Opcional puerta de Touch ID: Xcode Command Line Tools (xcode-select --install)

1. Instalar el comando

cd clt
npm link          # or: alias cluster="node /path/to/clt/cluster.js" in ~/.zshrc

Puerta de Touch ID opcional (omítela y el script simplemente no solicitará):

swiftc -O touchid.swift -o touchid

2. Configuración de ssh (requerido)

Añade a ~/.ssh/config (créealo si es necesario), y mkdir -p ~/.ssh/sockets:

Host fasrc
  HostName login.rc.fas.harvard.edu
  User YOUR_FASRC_USERNAME
  ControlMaster auto
  ControlPath ~/.ssh/sockets/%r@%h-%p
  ControlPersist 8h
  ServerAliveInterval 60

Host winbox
  HostName 127.0.0.1        # via the AnyDesk TCP tunnel; or the LAN IP of the PC
  Port 2222                 # the tunnel's local port (drop this line if using LAN IP)
  User YOUR_WINDOWS_USERNAME

El bloque ControlMaster es lo que hace todo rápido — sin él, cada scp/ssh exigiría una nueva contraseña + OTP y la herramienta se niega a ejecutarse.

3. Obtén tu semilla TOTP de OpenAuth

La aplicación Java de OpenAuth está sembrada con un secreto base32. Dos formas de obtenerlo:

  • Inicia sesión en la página de autoservicio de OpenAuth de FASRC y (re)aprovisiona tu token. Junto con la descarga de la aplicación Java, ofrece un código QR / secreto para usar con aplicaciones de autenticación de teléfono — copia esa cadena base32.

  • O mira dentro del paquete OpenAuth que ya descargaste: la semilla se almacena en el archivo de configuración de la aplicación junto al jar.

Nota: si reaprovisionas, los códigos de la aplicación Java antigua dejan de funcionar — la nueva semilla es entonces la única semilla verdadera (usa cluster code como tu generador, o cárgala también en una aplicación de teléfono).

4. Máquina Windows: servidor OpenSSH incorporado

AnyDesk en sí mismo no tiene transferencia de archivos scripteable, por lo que obtenemos archivos con scp desde el servidor OpenSSH incorporado de Windows (característica opcional de Windows 10/11 — sin software de terceros). En una PowerShell administrador en la máquina Windows:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

Luego instala la clave pública de tu Mac para que scp no necesite contraseña (cat ~/.ssh/id_ed25519.pub en el Mac; ssh-keygen -t ed25519 primero si no tienes una). Trampa: si tu cuenta de Windows es Administrador, las claves van en un archivo especial:

Add-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value "ssh-ed25519 AAAA...your key..."
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

(Para cuentas no administrador es el habitual C:\Users\you\.ssh\authorized_keys.)

5. Alcanza Windows desde el Mac

Elige una opción:

  • Túnel TCP de AnyDesk (coincide con tu flujo de trabajo actual): en AnyDesk en el Mac, abre la configuración de sesión para el PC Windows → TCP tunneling → puerto local 2222 → remoto 127.0.0.1:22. El túnel solo existe mientras la sesión de AnyDesk está conectada — está bien si estás usando AnyDesk de todas formas. Verifica que tu licencia de AnyDesk incluya tunelización TCP.

  • Misma red / VPN: establece HostName a la IP del PC en el bloque winbox y elimina la línea Port 2222. Lo más simple si las máquinas del laboratorio comparten red.

  • Omite Windows por completo: coloca la carpeta de COMSOL en OneDrive (Harvard lo proporciona) y deja que se sincronice con el Mac — luego cluster ~/OneDrive/.../file3.mph usa la copia local y nunca toca el PC.

Prueba: ssh winbox debería iniciar sesión en el PC sin solicitar contraseña.

6. Almacenar secretos y configurar

cluster setup

Solicita alias de host, valores predeterminados de Slurm, tu contraseña de FASRC y la semilla TOTP. Los secretos van al Llavero de macOS (nunca en disco, nunca en este repositorio). La configuración termina imprimiendo un código 2FA generado — verifica que coincida con lo que muestra la aplicación Java antes de confiar en él.

Luego confirma en el clúster (una vez, mediante cluster shell):

  • module avail comsol — establece el nombre exacto del módulo en ~/.config/clt/config.json

  • tu grupo tiene licencias de COMSOL, y elige la partición correcta para tu laboratorio

Uso

cluster file3.mph                    # fetch from Windows, upload, submit
cluster ./local/file3.mph            # a file that exists locally skips the Windows fetch
cluster file3.mph -study std2        # extra args are passed to `comsol batch`
cluster status                       # your whole queue
cluster status 12345678              # one job, incl. finished (sacct)
cluster logs file3                   # tail batch.log
cluster fetch file3                  # → ./file3-out.mph + ./file3-batch.log

Los archivos de trabajo llegan al clúster en ~/comsol_jobs/<name>-<timestamp>/ (in.mph, out.mph, batch.log, slurm-<id>.log). Establece un correo electrónico en cluster setup para recibir un mensaje cuando los trabajos terminen. El registro de trabajos enviados se encuentra en ~/.config/clt/jobs.json.

Servidor MCP (COMSOL impulsado por IA)

mcp/server.mjs expone todo el flujo como herramientas MCP, por lo que Claude (o cualquier cliente MCP) puede ejecutar COMSOL de principio a fin: run_code (Java generado = API completa de COMSOL), run_model, job_status, job_log, wait_for_job, fetch_artifacts, cancel_job, lab_fairshare. Registrado a nivel de proyecto mediante .mcp.json — abre una sesión de Claude Code en este repositorio y las herramientas estarán disponibles.

Las protecciones se aplican en el servidor (máximo 4 trabajos concurrentes, ≤16 CPUs, ≤64 GB, ≤48 h, particiones permitidas), y lab_fairshare devuelve una bandera healthy que la IA debe respetar. Verifica todo con node mcp/smoke.mjs — ejecuta un modelo hello-world a través de las herramientas y comprueba la física contra la respuesta analítica. Los modismos de construcción de modelos y las trampas conocidas de la API de COMSOL se encuentran en references/.

Hacer fork para miembros del laboratorio

El repositorio contiene cero datos personales: la configuración está en ~/.config/clt/, los secretos en el Llavero de cada persona. Un compañero de laboratorio solo clona, ejecuta npm link, añade los dos bloques de configuración ssh, y ejecuta cluster setup con sus propias credenciales. Nunca compartas tu semilla TOTP ni la subas a ningún lado.

Inicio rápido para un clon nuevo:

git clone <this repo> && cd clt
npm install          # MCP server deps (the CLI itself needs none)
npm link             # provides the `cluster` command
swiftc -O touchid.swift -o touchid    # optional Touch ID gate
cluster setup        # host aliases, Slurm defaults, secrets -> Keychain
cluster login        # verify; then `cluster help`

Mantén los datos de investigación fuera del repositorio

references/lab/ está ignorado por git y es donde pertenecen las exportaciones de modelos de COMSOL. Las exportaciones incrustan geometría y física no publicadas, además de rutas absolutas que contienen nombres reales, por lo que no deben publicarse. Los archivos rastreados en references/ son ejemplos genéricos y publicables (HelloBox, SweepBox, Inspect) más CONVENTIONS.md, el conocimiento acumulado de la API de COMSOL que hace que los modelos generados funcionen. Antes de hacer push, verifica git status para exportaciones perdidas de .mph, .java o CSV de resultados.

Notas de seguridad, honestamente

  • Almacenar la semilla TOTP junto a la contraseña en el mismo Mac reduce la 2FA a "posesión de tu Mac desbloqueado". Eso protege contra el robo remoto de credenciales, pero no contra alguien en tu teclado. Mantén FileVault activado.

  • La puerta de Touch ID es un bloqueo de conveniencia en este script, no encriptación — los secretos están protegidos por el Llavero. Para forzar un diálogo de confirmación de macOS en cada lectura de secreto, recrea los elementos sin una aplicación de confianza: security add-generic-password -U -T "" -a $USER -s clt-cluster-password -w

  • Verifica que automatizar tu propio OTP está dentro de la política de uso aceptable de FASRC; esto es automatización de conveniencia por persona, y la semilla debe mantenerse personal.

Solución de problemas

  • login failed — ejecuta ssh fasrc manualmente para ver los mensajes reales, y compara cluster code con la aplicación Java. Si el reloj de tu Mac está desajustado, los códigos TOTP son incorrectos (Configuración del Sistema → General → Fecha y Hora → ajustar automáticamente).

  • no ControlMaster socket — faltan las líneas ControlMaster en el bloque Host fasrc, o ~/.ssh/sockets no existe.

  • Falló la obtención de Windows — ¿está activa la sesión de AnyDesk (y el túnel)? ¿Funciona ssh winbox? No se admiten espacios en los nombres de archivo .mph — renómbralos.

  • El trabajo muere inmediatamentecluster logs generalmente muestra un error de licencia o módulo; verifica el nombre del módulo y la licencia de COMSOL de tu grupo.

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • AI-callable calculators and engineering models with real formulas. No hallucinated math.

  • LLM chat, text summarization and AI image generation

  • Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.

View all MCP Connectors

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/ckuzmick/cluster-tools'

If you have feedback or need assistance with the MCP directory API, please join our Discord server