Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу

Настройка MCP-сервера

Подключение AI-агентов к инфраструктуре Rediacc с помощью сервера Model Context Protocol (MCP).

Обзор

Команда rdc mcp serve запускает локальный MCP-сервер (Model Context Protocol), который AI-агенты могут использовать для управления вашей инфраструктурой. Сервер использует транспорт stdio; агент запускает его как подпроцесс и обменивается данными через JSON-RPC.

Требования: установленный и настроенный rdc с хотя бы одной машиной.

Claude Code

Добавьте в файл .mcp.json вашего проекта:

{
  "mcpServers": {
    "rdc": {
      "command": "rdc",
      "args": ["mcp", "serve"]
    }
  }
}

Или с именованной конфигурацией:

{
  "mcpServers": {
    "rdc": {
      "command": "rdc",
      "args": ["mcp", "serve", "--config", "production"]
    }
  }
}

Cursor

Откройте Settings → MCP Servers → Add Server:

  • Name: rdc
  • Command: rdc mcp serve
  • Transport: stdio

Доступные инструменты

Инструменты чтения (безопасные, без побочных эффектов)

ToolОписание
machine_queryПолучить системную информацию, список контейнеров, сервисов и использование ресурсов для машины
machine_containersСписок Docker-контейнеров со статусом, здоровьем, использованием ресурсов, метками и доменом авто-маршрутизации
machine_servicesСписок systemd-сервисов под управлением Rediacc (имя, состояние, подсостояние, счётчик перезапусков, память, принадлежность репозиторию)
machine_reposСписок развёрнутых репозиториев (имя, GUID, размер, статус монтирования, состояние Docker, количество контейнеров, использование диска, дата изменения, наличие Rediaccfile)
machine_healthВыполнить проверку состояния машины (система, контейнеры, сервисы, хранилище)
machine_listСписок всех настроенных машин
config_repositoriesСписок настроенных репозиториев с маппингом имён к GUID
config_show_infraПоказать конфигурацию инфраструктуры для машины (базовый домен, публичные IP, TLS, зона Cloudflare)
config_providersСписок настроенных облачных провайдеров для подготовки машин
agent_capabilitiesСписок всех доступных команд rdc CLI с их аргументами и параметрами
repo_secret_listСписок имён секретов и способов доставки для репозитория (без значений, без хешей). Безопасно для чтения.
repo_secret_getПолучить SHA-256 хеш секрета и способ доставки. Значение в открытом виде никогда не возвращается по замыслу. Используется для проверки существования секрета или факта его ротации.

Инструменты записи (деструктивные)

ToolОписание
repo_createСоздать новый зашифрованный репозиторий на машине
repo_upРазвернуть/обновить репозиторий (запускает Rediaccfile up, запускает контейнеры). Используйте mount для первого развёртывания или после pull
repo_downОстановить контейнеры репозитория. По умолчанию НЕ отмонтирует. Используйте unmount для закрытия LUKS-контейнера
repo_deleteУдалить репозиторий (уничтожает контейнеры, тома, зашифрованный образ). Учётные данные архивируются для восстановления
repo_forkСоздать CoW-форк с новым GUID и networkId (полностью независимая копия, поддерживается онлайн-форкинг)
backup_pushОтправить резервную копию репозитория в хранилище или на другую машину (тот же GUID — резервное копирование/миграция, не форк)
backup_pullПолучить резервную копию репозитория из хранилища или с машины. После получения развёртывайте через repo_up (mount=true)
machine_provisionПодготовить новую машину у облачного провайдера с помощью OpenTofu
machine_deprovisionУничтожить машину, развёрнутую в облаке, и удалить из конфигурации
config_add_providerДобавить конфигурацию облачного провайдера для подготовки машин
config_remove_providerУдалить конфигурацию облачного провайдера
term_execВыполнить команду на удалённой машине через SSH

Примеры рабочих процессов

Проверка состояния машины:

«Какой статус моей production-машины?»

Агент вызывает machine_query → возвращает системную информацию, запущенные контейнеры, сервисы и использование ресурсов.

Развёртывание приложения:

«Разверни gitlab на моей staging-машине»

Агент вызывает repo_up с параметрами name: "gitlab" и machine: "staging" → развёртывает репозиторий, возвращает результат успеха/ошибки.

Отладка неисправного сервиса:

«Мой nextcloud работает медленно, разберись, в чём проблема»

Агент вызывает machine_healthmachine_containersterm_exec для чтения логов → определяет проблему и предлагает решение.

Параметры конфигурации

OptionDefaultОписание
--config <name>(конфигурация по умолчанию)Именованная конфигурация для всех команд
--timeout <ms>120000Таймаут команды по умолчанию в миллисекундах

Безопасность

MCP-сервер обеспечивает два уровня защиты:

Режим только для форков (по умолчанию)

По умолчанию сервер работает в режиме только для форков: инструменты записи (repo_up, repo_down, repo_delete, backup_push, backup_pull, term_exec) могут работать только с форк-репозиториями. Агенты не могут затрагивать grand-репозитории (оригиналы). По замыслу.

Секреты репозитория доступны только через CLI по замыслу. Инструменты repo_secret_set и repo_secret_unset намеренно не предоставляются как MCP-инструменты. Запись требует предусловия --current <previous-value> (или --rotate-secret для подтверждения непроверенной ротации), и эта процедура требует участия человека. Агентам, которым нужно предложить ротацию секрета, следует вызвать repo_secret_get для подтверждения хеша, а затем передать оператору CLI-команду через поле next.options[].run в JSON-конверте ошибки. Подробнее: Безопасность AI-агентов и Репозитории § Секреты.

Чтобы разрешить агенту изменять grand-репозитории, экспортируйте REDIACC_ALLOW_GRAND_REPO в своём терминале перед запуском агента, который хозяйствует MCP-сервер:

export REDIACC_ALLOW_GRAND_REPO='gitlab'   # один репозиторий
# или 'repo1,repo2,repo3' (пробелы вокруг записей игнорируются), или '*' для всех репозиториев
claude   # или cursor, gemini и т. д.

Переопределение проверяется относительно цепочки предков процесса: оно учитывается только тогда, когда оно уже присутствовало в окружении самого процесса агента, что означает, что вы экспортировали его перед запуском агента (и MCP-сервера, который он породил). Агент не может выдать себе доступ, установив переменную в середине сессии. Намеренно отсутствует флаг сервера для этого: флаг в аргументах MCP-сервера не несёт доказательства, кто его туда поместил, в то время как проверка цепочки предков это несёт. Доступ на уровне машины (например, term connect -m <machine> без репозитория) по-прежнему требует *; список имён репозиториев его не открывает.

Персональные SSH-ключи репозитория и серверная песочница

У каждого репозитория есть собственная пара SSH-ключей. Публичный ключ добавляется в authorized_keys с префиксом command=, который направляет все SSH-сессии через renet sandbox-gateway <repo-name> — серверный ForceCommand, который не может быть обойдён ни одним клиентом, включая VS Code.

Как это работает:

  1. rdc repo create или rdc repo fork генерирует уникальную пару ключей ed25519 для каждого репозитория
  2. Публичный ключ устанавливается на удалённом хосте с параметром command="renet sandbox-gateway <name>"
  3. Каждое SSH-подключение по этому ключу проходит через шлюз, который применяет:
    • Landlock LSM — ограничения файловой системы на уровне ядра для пути монтирования репозитория
    • OverlayFS home overlay — запись в $HOME перехватывается на уровне репозитория, чтение проваливается до реального домашнего каталога
    • Персональный TMPDIR по пути <datastore>/.interim/sandbox/<name>/tmp/
    • Доступ к Docker через изолированный Docker-сокет репозитория
    • Сброс привилегий до универсального пользователя (rediacc)
  4. Файл .envrc репозитория загружается автоматически для настройки Docker и окружения

Разрешено RW: путь монтирования репозитория, рабочее пространство песочницы репозитория, домашний каталог (через overlay), Docker-сокет Разрешено RO: системные пути (/usr, /bin, /etc, /proc, /sys) Заблокировано: пути монтирования других репозиториев, системные файлы за пределами списка разрешений

Интеграция с VS Code: каждый репозиторий получает собственную установку VS Code Server по пути <datastore>/.interim/sandbox/<name>/.vscode-server/. Несколько репозиториев могут быть открыты одновременно в независимых изолированных окружениях без общего сервера.

Это предотвращает горизонтальное перемещение: даже если агент получит доступ к оболочке форка, он не сможет прочитать или изменить другие репозитории на той же машине. SSH-подключение на уровне машины (без репозитория) использует командный ключ и не изолируется в песочнице.

Архитектура

MCP-сервер не хранит состояние. Каждый вызов инструмента запускает rdc как изолированный дочерний процесс с флагами --output json --yes --quiet. Это означает:

  • Нет утечки состояния между вызовами инструментов
  • Используются ваши существующие настройки rdc и SSH-ключи
  • Ошибки в одной команде не влияют на другие