Skip to main content
Glama

Remote Demo MCP

Локальный MCP-сервер, который развертывает предварительно собранный статический каталог на удаленном хосте с помощью rsync.

Что он делает

  • Использует фиксированный deployUser из конфигурации MCP

  • Определяет project на основе базового имени localDir

  • Загружает содержимое localDir в:

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

  • Использует локальную команду rsync

  • Поддерживает OTP/интерактивные SSH-потоки путем подключения сессии rsync к /dev/tty

  • В случае сбоя запрашивает повторную попытку до тех пор, пока пользователь не отменит операцию

Related MCP server: nomad

Установка

npm install
npm run build

Конфигурация

Путь к конфигурации по умолчанию:

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

Переопределить путь можно с помощью:

  • REMOTE_DEMO_MCP_CONFIG=/abs/path/config.json

Пример:

{
  "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"]
}

Сервер автоматически включает возобновляемую загрузку, добавляя:

  • --partial

  • --checksum

  • --progress (если rsyncOptions уже не содержит --progress или --info=...)

Примечание о совместимости:

  • Режим интерактивной сессии использует node-pty. Если вы видите ошибку posix_spawnp failed в macOS/Linux, это часто вызвано неисполняемым вспомогательным файлом node-pty (.../node-pty/prebuilds/*/spawn-helper). Теперь сервер проверяет и автоматически исправляет права на выполнение вспомогательного файла при запуске сессии.

Базовый путь к удаленной цели жестко закодирован и не может быть изменен:

  • /var/www/html/demo-remote

Инструмент

deploy_static

Ключевые слова:

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

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

Правила для user:

  • deployUser — это идентификатор пользователя приложения для удаленного пути, а не SSH username

  • Допустимые символы: A-Z a-z 0-9 _ -

  • Недопустимые: ., .., пробелы, /, \ и другие специальные символы

Входные данные:

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

Разрешение пути localDir:

  • Абсолютный путь: используется напрямую

  • Относительный путь: разрешается относительно clientCwd, если он предоставлен

  • Резервный вариант для относительного пути: CODEX_START_DIR, если задан, в противном случае process.cwd() (каталог запуска сервера)

Разрешение имени проекта:

  • Если предоставлен clientCwd, имя проекта использует последний сегмент пути clientCwd

  • В противном случае имя проекта использует последний сегмент пути разрешенного localDir

Примечание о поведении:

  • Если ssh.interactiveAuth=true и dryRun=false, deploy_static по замыслу завершится с ошибкой.

  • Для интерактивного развертывания с OTP/паролем используйте:

    1. start_deploy_session

    2. poll_deploy_session

    3. submit_deploy_input, когда nextAction=submit_input

  • Подтверждение ключа хоста (yes/no) и запросы пароля обрабатываются автоматически в режиме сессии.

  • OTP по-прежнему требует ручного ввода: вызовите submit_deploy_input, когда nextAction=submit_input.

Выходные данные (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

Входные данные:

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

Инструменты интерактивной OTP-сессии

Используйте их, когда OTP/пароль необходимо ввести во время развертывания на хостах без TTY:

  1. start_deploy_session

  2. poll_deploy_session (чтение вывода и прогресса; если state=waiting_input, отправьте код)

  3. submit_deploy_input (отправка OTP/пароля)

  4. повторите шаг 2, пока state не станет succeeded или failed

  5. опционально cancel_deploy_session

poll_deploy_session поддерживает инкрементальный вывод по cursor и возвращает nextCursor.

Инструменты сессии возвращают nextAction, чтобы сделать оркестрацию детерминированной:

  • submit_input: вызовите submit_deploy_input

  • poll: вызовите poll_deploy_session

  • done: рабочий процесс завершен (succeeded / failed / cancelled)

Логирование сессии:

  • Настраивается в файле конфигурации MCP в разделе sessionLog.

  • sessionLog.enabled по умолчанию false.

  • sessionLog.path по умолчанию /tmp/remote-demo-mcp-session.log.

  • sessionLog.logInputValue по умолчанию false (логируется только длина ввода).

  • Инструменты интерактивной сессии запускают rsync в PTY, поэтому запросы пароля/OTP могут быть обнаружены через poll_deploy_session.

Политика SSH-ключей хоста:

  • accept-new (по умолчанию): ключ хоста при первом подключении принимается автоматически; измененный ключ отклоняется.

  • strict: никогда не принимать автоматически неизвестный ключ хоста.

  • insecure: отключить проверку ключа хоста (высокий риск; только для временного использования/отладки).

Интерактивный поток Codex CLI:

  1. Вызовите start_deploy_session

  2. Циклически вызывайте poll_deploy_session

  3. Если needsInput=true или nextAction=submit_input, вызовите submit_deploy_input с OTP/паролем. Подсказка для пользователя: "Please Enter MFA Code." или "Please Enter Password."

  4. Продолжайте опрос, пока nextAction=done

Контракт протокола агента (для MCP-клиентов, таких как Codex):

  1. Вызовите start_deploy_session один раз.

  2. Прочитайте nextAction из ответа.

  3. Если nextAction=submit_input, вызовите submit_deploy_input.

  4. Если nextAction=poll, вызовите poll_deploy_session.

  5. Повторяйте шаги 2-4, пока nextAction=done.

  6. Никогда не вызывайте deploy_static для OTP-потоков; используйте только инструменты сессии.

  7. Во время опроса постоянно передавайте прогресс передачи из output конечному пользователю.

Выходные данные (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"
}

Запуск

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

Инициализация файла конфигурации:

remote-demo-mcp init

Он создает:

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

  • Интерактивный режим показывает каждое текущее значение поля для редактирования.

  • Нажмите Enter без ввода, чтобы оставить текущее значение без изменений.

  • Если конфигурация уже существует, init спросит, нужно ли ее изменить, а затем запросит окончательное подтверждение перед перезаписью.

Использование codex

Установка npm-пакета

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

Добавление mcp в codex

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