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.

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"]
}
A
license - permissive license
-
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

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/jake-bcn/remote-demo-mcp'

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