docker-vm-mcp
docker-vm-mcp
Создано sundar.
MCP-сервер, который даёт ИИ-агенту полный контроль над жизненным циклом виртуальных машин — создание, вход по SSH, выполнение команд, остановка/запуск/перезапуск, удаление, логи и статистика ресурсов — на «ВМ», работающих поверх Docker-контейнеров. Каждая ВМ — это настоящая система Ubuntu с реально запущенным sshd, sudo и постоянным диском, поэтому она ведёт себя как обычная машина, в которую можно залогиниться, — без облачного аккаунта и без вложенной виртуализации. Сам сервер контейнеризирован и публикуется как Docker-образ, а управляется целиком через Model Context Protocol.
После настройки вы можете просто попросить Claude, например:
«Создай ВМ с именем dev-box с 2 CPU и 2 ГБ RAM»
«Подключи меня по SSH к dev-box» / «Какой SSH-логин у dev-box?»
«Установи nginx на dev-box и запусти его»
«Останови dev-box» / «Удали dev-box»
«Покажи список моих ВМ»
и Claude выполнит весь жизненный цикл через инструменты ниже.
Как это работает
Каждая «ВМ» — это Docker-контейнер, собранный из небольшого образа Ubuntu 22.04 (vm-image/Dockerfile), в котором работает настоящий sshd, есть sudo, а в качестве домашнего каталога подмонтирован именованный том (поэтому данные переживают остановку/перезапуск — аналогично EBS-тому, подключённому к EC2). Сам MCP-сервер общается с вашим локальным Docker-демоном через /var/run/docker.sock — он не запускает ВМ сам, он управляет уже установленным у вас Docker Desktop.
Claude <--MCP/stdio--> docker-vm-mcp container <--docker.sock--> Docker Desktop
|
vm-dev-box (Ubuntu + sshd)
vm-staging (Ubuntu + sshd)
...Related MCP server: Docker MCP Server
Предварительные требования
Установленный и запущенный Docker Desktop на вашем Mac
Node.js 20+ — только если вы хотите запускать сервер вне Docker (не обязательно)
1. Сборка
Из этой папки:
docker build -t docker-vm-mcp:latest .Собирается только образ MCP-сервера. Базовый образ ВМ (docker-vm-mcp/vm-base:latest) собирается автоматически при первом вызове vm_create. Также вы можете собрать его заранее самостоятельно:
docker build -t docker-vm-mcp/vm-base:latest ./vm-image{
"mcpServers": {
"docker-vm-mcp": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/var/run/docker.sock:/var/run/docker.sock",
"-v", "docker-vm-mcp-state:/data",
"docker-vm-mcp:latest"
]
}
}
}docker run -i --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v docker-vm-mcp-state:/data \
docker-vm-mcp:latest
# should print nothing and just wait on stdin (that's correct — it's
# speaking MCP, not a REPL). Ctrl+C to exit.2. Запуск
MCP-серверы через stdio запускаются клиентом, а не как отдельный процесс. Добавьте это в конфигурацию Claude Desktop (путь ~/Library/Application Support/Claude/claude_desktop_config.json):
ssh vmuser@localhost -p <port> # port and password from vm_create / vm_ssh_infoОба монтирования обязательны:
/var/run/docker.sock— доступ к демону Docker.docker-vm-mcp-state— именованный том, где сервер хранит сгенерированные SSH-пароли, чтобы они переживали перезапуски. Без него пароли теряются при каждом перезапуске контейнера MCP-сервера (сами ВМ продолжают работать).
Проверить, что образ работает и видит Docker, до подключения к Claude Desktop можно так:
docker tag docker-vm-mcp:latest <your-dockerhub-username>/docker-vm-mcp:latest
docker push <your-dockerhub-username>/docker-vm-mcp:latestИнструменты, которые предоставляет сервер
Инструмент | Что делает |
| Создаёт и запускает новую ВМ. Параметры: |
| Список всех управляемых ВМ со статусом и SSH-портом. |
| Запускает остановленную ВМ. |
| Останавливает работающую ВМ (диск сохраняется). |
| Перезагружает ВМ. |
| Удаляет ВМ навсегда (и её диск, если не указано |
| Выполняет команду в shell внутри ВМ напрямую через Docker (без SSH). |
| Возвращает SSH-команду, хост, порт, пользователя и пароль для ВМ. |
| Генерирует или меняет SSH-пароль ВМ (также синхронизирует |
| Показывает последние записи из консоли/системного лога ВМ. |
| Живая статистика CPU и памяти для запущенной ВМ. |
Вход вручную
Каждая ВМ публикует свой SSH-порт на ваш Mac, поэтому после того как Claude создал ВМ, вы можете подключиться к ней по SSH напрямую:
docker-vm-mcp/
├── Dockerfile # MCP server image
├── package.json
├── tsconfig.json
├── vm-image/
│ └── Dockerfile # base "VM" image (Ubuntu + sshd), built on first vm_create
└── src/
├── index.ts # MCP server entrypoint (stdio transport)
├── docker.ts # Docker client, image-build, container lookup helpers
├── state.ts # local credential store (/data/credentials.json)
├── util.ts # exec/log demuxing helpers
└── tools/
├── createVm.ts
├── listVms.ts
├── startVm.ts
├── stopVm.ts
├── restartVm.ts
├── deleteVm.ts
├── execVm.ts
├── sshInfo.ts
├── setPassword.ts
├── logsVm.ts
└── statsVm.tsПередайте sshPublicKey (содержимое вашего ~/.ssh/id_ed25519.pub или ~/.ssh/id_rsa.pub) при вызове vm_create, чтобы входить без пароля — по ключу.
Публикация этого образа
Чтобы поделиться им (например, чтобы коллега или другая машина могли просто сделать docker pull вместо сборки из исходников):
npm install
npm run buildВ образе нет ничего секретного — пароли генерируются отдельно для каждой ВМ в момент запуска и хранятся только в локальном томе docker-vm-mcp-state на той машине, где запущен контейнер. Публиковать безопасно.
Безопасность (прочитайте, прежде чем открывать доступ за пределами своей машины)
Монтирование Docker-сокета равносильно root-доступу. Любой, у кого есть доступ к
/var/run/docker.sock, может управлять всеми контейнерами на вашей машине, а не только ВМ этого инструмента. Запускайте этот образ с таким монтированием только на доверенной машине и никогда не открывайте сам MCP-сервер (или его порт) для недоверенных вызывающих.SSH-пароли хранятся в открытом виде в томе
docker-vm-mcp-state(/data/credentials.json), чтобыvm_ssh_infoмог их вернуть. Для личного локального инструмента это нормально; не используйте его в продакшене или мультитенантных сценариях без доработки (например, перехода на авторизацию по ключам и отказа от хранения паролей).
По умолчанию SSH-порт ВМ публикуется на 0.0.0.0, то есть на всех сетевых интерфейсах вашего Mac. Если это нежелательно, измените привязку в src/index.ts (поле, задающее адрес публикации) и пересоберите образ.
Как залогиниться самому
Каждая ВМ публикует свой SSH-порт на вашем Mac, так что после создания ВМ вы можете зайти в неё прямо из терминала:
docker-vm-mcp/
├── Dockerfile # MCP server image
├── package.json
├── tsconfig.json
├── vm-image/
│ └── Dockerfile # base "VM" image (Ubuntu + sshd), built on first vm_create
└── src/
├── index.ts # MCP server entrypoint (stdio transport)
├── docker.ts # Docker client, image-build, container lookup helpers
├── state.ts # local credential store (/data/credentials.json)
├── util.ts # exec/log demuxing helpers
└── tools/
├── createVm.ts
├── listVms.ts
├── startVm.ts
├── stopVm.ts
├── restartVm.ts
├── deleteVm.ts
├── execVm.ts
├── sshInfo.ts
├── setPassword.ts
├── logsVm.ts
└── statsVm.tsПередайте содержимое вашего ~/.ssh/id_ed25519.pub в параметре sshPublicKey при вызове vm_create, чтобы пропустить пароль и использовать свой ключ.
Публикация образа
Чтобы опубликовать образ (например, чтобы коллега или другая машина могли просто docker pull, не собирая из исходников):
npm install
npm run buildВ образ не зашито никаких секретов — учётные данные генерируются для каждой ВМ отдельно и хранятся только в локальном томе docker-vm-mcp-state на той машине, где запущен контейнер. Публиковать безопасно.
Замечания по безопасности (прочитайте, прежде чем открывать доступ за пределами вашей машины)
Монтирование Docker-сокета равносильно root-доступу. Любой, у кого есть доступ к
/var/run/docker.sock, может управлять всеми контейнерами на вашей машине, а не только ВМ, созданными этим инструментом. Запускайте этот образ только на доверенной машине и никогда не открывайте сам MCP-сервер (или порт к нему) для недоверенных клиентов.SSH-пароли хранятся в открытом виде в томе
docker-vm-mcp-state(/data/passwords.json), чтобыvm_ssh_infoмог их возвращать. Для личного/локального использования это приемлемо, но не используйте этот проект для production или мультитенантных сценариев.ВМ публикуют свой SSH-порт на
0.0.0.0(все интерфейсы Mac), поэтому другие устройства в вашей локальной сети могут попытаться подключиться, если брандмауэр это разрешает. Если это важно, укажитеbindIpили настройте сеть под свои нужды.
Проверка на реальном примере: ServiceNow Discovery
Этот проект проверялся на реальном экземпляре ServiceNow через Dockerized MID Server — подтверждение, что это настоящая SSH-достижимая Linux-система, а не игрушка:
Standard Discovery: MID Server → ВМ через LAN-IP Mac и опубликованный SSH-порт ВМ (например,
192.168.x.x:<port>) — успешно создавалась записьcmdb_ci_linux_serverс hostname, ОС, RAM и CPU, собранными по SSH.Horizon Discovery тоже работает.
Поскольку MID Server и ВМ находятся в одной bridge-сети Docker, они могут общаться напрямую по внутренним IP без опубликованного порта.
Один нюанс: в обнаруженных данных CPU будет указан как «Apple» — это не баг. Docker Desktop на Mac запускает контейнеры внутри
linuxkitVM на чипе Apple Silicon, поэтому SSH-пробы видят реальное железо хоста.
Структура проекта
docker-vm-mcp/
├── Dockerfile # MCP server image
├── package.json
├── tsconfig.json
├── vm-image/
│ └── Dockerfile # base "VM" image (Ubuntu + sshd), built on first vm_create
└── src/
├── index.ts # MCP server entrypoint (stdio transport)
├── docker.ts # Docker client, image-build, container lookup helpers
├── state.ts # local credential store (/data/credentials.json)
├── util.ts # exec/log demuxing helpers
└── tools/
├── createVm.ts
├── listVms.ts
├── startVm.ts
├── stopVm.ts
├── restartVm.ts
├── deleteVm.ts
├── execVm.ts
├── sshInfo.ts
├── setPassword.ts
├── logsVm.ts
└── statsVm.tsКак проводилась проверка
Проект собирался и проверялся в среде с доступом к сети и Docker. npm install, сборка и запуск MCP-сервера выполнялись локально; инструменты проверялись вызовами через MCP. Полная автоматизация тестов не входит в проект.
Лицензия
npm install
npm run buildThis server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server that allows managing Docker containers through natural language, enabling users to compose, introspect, and debug containers without running commands themselves.736GPL 3.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables managing Docker containers through natural language commands, allowing users to create, list, and delete containers. It facilitates automated container orchestration and integrates with VS Code via the Cline extension.163MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for VMware vSphere/vCenter operations, enabling natural language control of VMs, hosts, and infrastructure.Apache 2.0
- AlicenseBqualityDmaintenanceAn AI-powered MCP server for managing Docker infrastructure, enabling creation, deployment, and lifecycle management of containerized services with automated DNS and SSL.10MIT
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for AI dialogue using various LLM models via AceDataCloud
MCP server for generating rough-draft project plans from natural-language prompts.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/suvenkat79/docker-vm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server