Обзор
Команда 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_health → machine_containers → term_exec для чтения логов → определяет проблему и предлагает решение.
Параметры конфигурации
| Option | Default | Описание |
|---|---|---|
--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.
Как это работает:
rdc repo createилиrdc repo forkгенерирует уникальную пару ключей ed25519 для каждого репозитория- Публичный ключ устанавливается на удалённом хосте с параметром
command="renet sandbox-gateway <name>" - Каждое SSH-подключение по этому ключу проходит через шлюз, который применяет:
- Landlock LSM — ограничения файловой системы на уровне ядра для пути монтирования репозитория
- OverlayFS home overlay — запись в
$HOMEперехватывается на уровне репозитория, чтение проваливается до реального домашнего каталога - Персональный TMPDIR по пути
<datastore>/.interim/sandbox/<name>/tmp/ - Доступ к Docker через изолированный Docker-сокет репозитория
- Сброс привилегий до универсального пользователя (
rediacc)
- Файл
.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-ключи - Ошибки в одной команде не влияют на другие