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

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

Установка

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