Skip to main content
Glama

Remote Demo MCP

Servidor MCP local que despliega un directorio estático precompilado en un host remoto con rsync.

Qué hace

  • Utiliza el deployUser fijo de la configuración de MCP.

  • Deriva el project del nombre base de localDir.

  • Sube el contenido de localDir a:

    • /var/www/html/demo-remote/{user}/{project}/

  • Utiliza el comando local rsync.

  • Soporta flujos SSH interactivos/OTP al adjuntar la sesión de rsync a /dev/tty.

  • En caso de error, pregunta si desea reintentar hasta que el usuario cancele.

Related MCP server: nomad

Instalación

npm install
npm run build

Configuración

Ruta de configuración predeterminada:

  • ~/.config/remote-demo-mcp/config.json

Sobrescribir la ruta con:

  • REMOTE_DEMO_MCP_CONFIG=/abs/path/config.json

Ejemplo:

{
  "deployUser": "demo_user-01",
  "publicBaseUrl": "https://example.com",
  "sessionLog": {
    "enabled": false,
    "path": "/tmp/remote-demo-mcp-session.log",
    "logInputValue": false
  },
  "ssh": {
    "host": "xxx.xxx.xxx.xxx",
    "port": 2222,
    "username": "alice123#ec2-user#52.76.147.44",
    "interactiveAuth": true,
    "password": "",
    "hostKeyPolicy": "accept-new",
    "autoFillPassword": true
  },
  "rsyncOptions": ["-az", "--delete"]
}

El servidor habilita automáticamente las subidas reanudables añadiendo:

  • --partial

  • --checksum

  • --progress (a menos que rsyncOptions ya incluya --progress o --info=...)

Nota de compatibilidad:

  • El modo de sesión interactiva utiliza node-pty. Si ves posix_spawnp failed en macOS/Linux, a menudo es causado por un helper de node-pty no ejecutable (.../node-pty/prebuilds/*/spawn-helper). Este servidor ahora verifica y corrige automáticamente el permiso de ejecución del helper al iniciar la sesión.

La ruta base del destino remoto está codificada y no se puede sobrescribir:

  • /var/www/html/demo-remote

Herramienta

deploy_static

Palabras clave:

  • EN: deploy to remote, deploy demo, publish demo, upload static site

  • 中文: 部署到远程, 部署demo, 部署 demo, 发布demo, 上传静态网页

Reglas de user:

  • deployUser es el ID de usuario de la aplicación para la ruta remota, no el username de SSH.

  • Caracteres permitidos: A-Z a-z 0-9 _ -

  • No permitidos: ., .., espacios, /, \ y otros caracteres especiales.

Entrada:

{
  "localDir": "/abs/path/to/dist",
  "clientCwd": "/abs/path/on-mcp-client",
  "dryRun": false
}

Resolución de ruta localDir:

  • Ruta absoluta: se utiliza directamente.

  • Ruta relativa: se resuelve con respecto a clientCwd si se proporciona.

  • Alternativa para ruta relativa: CODEX_START_DIR si está configurado, de lo contrario process.cwd() (directorio de inicio del servidor).

Resolución del nombre del proyecto:

  • Si se proporciona clientCwd, el nombre del proyecto utiliza el último segmento de la ruta de clientCwd.

  • De lo contrario, el nombre del proyecto utiliza el último segmento de la ruta de localDir resuelta.

Nota de comportamiento:

  • Si ssh.interactiveAuth=true y dryRun=false, deploy_static fallará rápidamente por diseño.

  • Para despliegues interactivos con OTP/contraseña, utiliza:

    1. start_deploy_session

    2. poll_deploy_session

    3. submit_deploy_input cuando nextAction=submit_input

  • La confirmación de la clave de host (yes/no) y las solicitudes de contraseña se manejan automáticamente en modo sesión.

  • El OTP sigue siendo manual: llama a submit_deploy_input cuando nextAction=submit_input.

Salida (structuredContent):

{
  "ok": true,
  "attempts": 1,
  "user": "alice",
  "project": "my-site",
  "remotePath": "/var/www/html/demo-remote/alice/my-site/",
  "publicUrl": "https://example.com/alice/my-site/index.html",
  "message": "Deploy succeeded after 1 attempt(s)."
}

verify_deploy

Entrada:

{
  "url": "https://example.com/alice/my-site/index.html",
  "timeoutMs": 8000
}

Herramientas de sesión OTP interactiva

Utilízalas cuando se deba ingresar OTP/contraseña durante el despliegue en hosts no TTY:

  1. start_deploy_session

  2. poll_deploy_session (leer salida y progreso; si state=waiting_input, enviar código)

  3. submit_deploy_input (enviar OTP/contraseña)

  4. repetir el paso 2 hasta que state sea succeeded o failed

  5. opcional cancel_deploy_session

poll_deploy_session admite salida incremental mediante cursor y devuelve nextCursor.

Las herramientas de sesión devuelven nextAction para hacer que la orquestación sea determinista:

  • submit_input: llamar a submit_deploy_input

  • poll: llamar a poll_deploy_session

  • done: flujo de trabajo finalizado (succeeded / failed / cancelled)

Registro de sesión:

  • Configurar en el archivo de configuración de MCP bajo sessionLog.

  • sessionLog.enabled el valor predeterminado es false.

  • sessionLog.path el valor predeterminado es /tmp/remote-demo-mcp-session.log.

  • sessionLog.logInputValue el valor predeterminado es false (solo se registra la longitud de la entrada).

  • Las herramientas de sesión interactiva ejecutan rsync en un PTY, por lo que las solicitudes de contraseña/OTP se pueden detectar mediante poll_deploy_session.

Política de clave de host SSH:

  • accept-new (predeterminado): la clave de host de primera vez se acepta automáticamente; la clave cambiada se rechaza.

  • strict: nunca aceptar automáticamente una clave de host desconocida.

  • insecure: deshabilitar la validación de la clave de host (alto riesgo; solo para uso temporal/depuración).

Flujo interactivo de Codex CLI:

  1. Llamar a start_deploy_session

  2. Bucle poll_deploy_session

  3. Si needsInput=true o nextAction=submit_input, llamar a submit_deploy_input con OTP/contraseña. El mensaje que se muestra al usuario es "Please Enter MFA Code." o "Please Enter Password."

  4. Continuar sondeando hasta nextAction=done

Contrato de protocolo de agente (para clientes MCP como Codex):

  1. Llamar a start_deploy_session una vez.

  2. Leer nextAction de la respuesta.

  3. Si nextAction=submit_input, llamar a submit_deploy_input.

  4. Si nextAction=poll, llamar a poll_deploy_session.

  5. Repetir los pasos 2-4 hasta nextAction=done.

  6. Nunca llamar a deploy_static para flujos OTP; usar solo herramientas de sesión.

  7. Mientras se sondea, transmitir el progreso de la transferencia desde output al usuario final continuamente.

Salida (structuredContent):

{
  "ok": true,
  "url": "https://example.com/alice/my-site/index.html",
  "status": 200,
  "statusText": "OK",
  "responseTimeMs": 123,
  "message": "URL is reachable: HTTP 200 in 123ms"
}

Ejecución

npm run dev
# or
npm run build && npm start

Inicializar archivo de configuración:

remote-demo-mcp init

Crea:

  • ~/.config/remote-demo-mcp/config.json

  • El modo interactivo muestra cada valor de campo actual para editar.

  • Presiona Enter sin ingresar nada para mantener el valor actual sin cambios.

  • Si la configuración ya existe, init pregunta si desea modificarla, luego solicita confirmación final antes de sobrescribir.

codex 使用

安裝 npm 包

npm install -g    @jake.e-com365/remote-demo-mcp

codex 添加 mcp

codex mcp add remote-demo-mcp remote-demo-mcp  

remote-demo-mcp 的配置

remote-demo-mcp init
vi ~/.config/remote-demo-mcp/config.json
{
  "deployUser": "jake",
  "publicBaseUrl": "https://demo-remote.e-com365.com/",
  "ssh": {
    "host": "xxx.xxx.xxx.xxx",
    "username": "alice123#ec2-user#18.140.183.126",
    "interactiveAuth": true,
    "port": 2222,
    "password": "xxx",
    "hostKeyPolicy": "accept-new",
    "autoFillPassword": true
  },
  "rsyncOptions": ["-az", "--delete"]
}

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    A local MCP server for agentic remote development that enables code sync via rsync, SSH command execution, and long-running task management in remote tmux sessions.
    15
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    SSH-based MCP server that enables remote execution of SSH commands, file transfers, and secure server management via the MCP protocol.
    ISC