mcp-dockhand
MCP Dockhand
MCP-сервер, предстac)` (мodel Context Protocol), который предствляет API Dockhand в качестве MCP-instruments. Управлейте всей своей DOCKER-STP by medium айассистентов.
Покрытие API: for 88.7% актуальных API-endpoints Dockhand (282/318) предусмотрен MCP-инструмент — см. docs/coverage.md с полным, автоматически обновляющимся разбивке by area.
Dockhand — это серверный у right:... ](https://github.com/fnsys/dockhand) — это сервер управления Docker, which connects to multiple Docker-hosts via Haгents. Данный MCP-сервер предоставляет весь программный доступ to all Dockhand functions.
Возможноности
280+ MCP-инструментов, охватьвающих API Dockhand — см.
docs/coverage.mdwith exact, auto settingStreamable HTTP Transort (MCP Spec 2025-03-26) for hosting Docker-conтейнers
Aутентификация на основе сессиях (Session-based Auth) with auto-relogin when 401
SSE Support for deploy operations (start, stop, down, restart)
Environment Filter with mandatory applied to all endpoints ops containers/stacks/images/network/тomов
Docker Ready: multi-stage build, non-rootuser and health checks
Related MCP server: dockhand-mcp
Быстрый старт
Docker (рекомендуется)
docker run -d \
--name mcp-dockhand \
-p 8080:8080 \
-e DOCKHAND_URL=https://your-dockhand-server.com \
-e DOCKHAND_USERNAME=your-username \
-e DOCKHAND_PASSWORD=your-password \
ghcr.io/strausmann/mcp-dockhand:latestDockerCompose
services:
mcp-dockhand:
image: ghcr.io/strausmann/mcp-dockhand:latest
container_name: mcp-dockhand
restart: unless-stopped
ports:
- "8080:8080"
environment:
- DOCKHAND_URL=https://your-dockhand-server.com
- DOCKHAND_USERNAME=your-username
- DOCKHAND_PASSWORD=your-passwordИз исходного кода
git clone https://github.com/strausmann/mcp-dockhand.git
cd mcp-dockhand
npm install
npm run build
DOCKHAND_URL=https://your-server.com DOCKHAND_USERNAME=admin DOCKHAND_PASSWORD=secret npm startКонфигурация
Переменная | Обязателено | Umолчанию | Опсание |
`DOCKHAND_URL | Yes | - | URL-адрес Dockhand server |
`DOCKHAND_USERNAME | Yes | - | Dockhand пользователя |
| Yes | - | Dockhand пароль |
`MCP_PORT | No |
| Порт для MCP-сервера |
`MCP_SESSION_TTL_SECONDS | No |
| Время неактивности, after which a saved MCP session expires |
`MCP_SESSION_CLEANUP_INTERVAL_SECONDS | No |
| Center for removing expired sessions (limited by session CCL) |
| No |
| Maxiумal number of stored sessions: |
| No |
| Lisен адрес. Home: the wildcard address remains unprobably to publishEditor. Server. – See Securing the transport if you need to protect endpoint: it is recommended. Without any of checked Host/token. Configured settings are in place. When no Host/Authorization are configured, the listener is bound to all adjust. It is by default so the published Docker port keeps working. This is a safe option only if /endpoint has authorization |
`MCP_ALLOWED_HOSда | No | (not set — Host check disabled) | Comma-separated Host header allowlist for |
| No | (not set — Origin check disabled) | Comma-separated list of allowed |
| No | (unset — endpoint unauthenticated) | Shared secret required as |
| No |
|
|
| No | (empty) | Comma-separated addresses or CDS, e.g. |
Защита транспорта
/mc по умолчанию addresses 0.0.0.0:8080, and automatically out one of MCP_ALLOWED_HOSTS, MCP_ALLOWED_ORIGINS и MCP_AUTH_TOKEN default - accept акie request with no host/no Орigin check and no аутентификацию. This is the same behavior as mCP-dockand has always had: by default these checks are not enabled, so that not clients from everyone who sees server (via LAN/IP, via proxy, via Docker network name "alias") are not blocked by a normal update.
Please enable it after /mcp became available outside your machine's internal interface. The server contains one Dockhand credentials, every call to any tool is made under this identity, so anyone who can start an MCP session gets Docker access (container exec, host bind connectors, file read/write, saved git credentials). If no protection, the service logs in the initial [worn] with a hint. There are three independent, opt-in enabled protection layers:
These are the available options. Wait maybe need final "доступно:" but original "available:".
Let's finalize precise.
Need maybe translate the last colon phrase: "Три независимых, активируемых явным выбором уровня защити:" as not plural "available:".
Also, the text "the server logs a [security] WARNING at startup as a reminder." Translate exact. Need code [security] inside backticks? Original has [security] WARNING backticked. Keep.
Let's correct.
Now final translation with all valid.
Let's ensure no leftover English grammatical.
Need perhaps table has pipes; write success.
Let's formulate final in clean Russian, preserving all formatting.# MCP Dockhand
[![CI]... (unchanged) Let's output after verifying.
Wait, the output must include from first "MCP". Let's include unchanged badges to ensure not omitted. Good.
Let's now# MCP Dockhand
[![CI]... (badges can be represented unchanged)
Список разрешённых хостов (
MCP_ALLOWED_HOSTS). Если задано непустое значение, каждый запрос к/mcp—POST,GETиDELETE— отклоняется с кодом403, если его заголовокHostне соответствует списку разрешённых. Это основная защита от DNS-ребinding: вредоносная веб-страница не сможет заставить браузер оператора обратиться к серверу с тем значениемHost, которое принимает список разрешённых. Установите то значение, с которым ваш клиент реально обращается к серверу:localhost:8080/127.0.0.1:8080для документированной локальной настройки, или, если вы подключаетесь напрямую по адресу, а не черезlocalhost(включая настройку удалённого сервера mcp-proxy ниже), укажите точныйhost:port, который отправляет ваш клиент, например100.100.50.40:8222. Если указать неправильно, каждый запрос будет отклоняться с ошибкой403 Invalid Host header— проверьте сообщение, в нём будет указано то значение Host, которое было получено.Список разрешённых источников (
MCP_ALLOWED_ORIGINS). Если задано, любой запрос, который всё же отправляет заголовокOrigin, отсутствующий в списке, отклоняется с кодом403. Отсутствие заголовкаOriginвсегда пропускается (собственный MCP-клиент SDK и большинство не-браузерных инструментов его не отправляют), поэтому это полезно только в том случае, если браузерный клиент обращается к/mcpнапрямую; список разрешённых хостов выше — это то, что на самом деле останавливает DNS-ребinding.Bearer-токен (
MCP_AUTH_TOKEN). Если задан, каждый запрос к/mcpдолжен содержатьAuthorization: Bearer <token>, иначе он отклоняется с кодом401; сравнение выполняется за константное время. Рекомендуется использовать вместе со списком разрешённых хостов для любого развёртывания, доступного не только с машины оператора.
# .env — recommended configuration once /mcp is reachable beyond loopback
MCP_ALLOWED_HOSTS=dock-mcp.internal.example.com
# or, connecting directly by address instead of a hostname:
#MCP_ALLOWED_HOSTS=100.100.50.40:8222
MCP_AUTH_TOKEN=<a long random secret, e.g. `openssl rand -hex 32`>Защита сервера с помощью CrowdSec
Сервер записывает строку доступа в формате nginx в stdout для каждого запроса, включая отклонённые, в то время как структурированный журнал приложения идёт в stderr. CrowdSec обрабатывает строки доступа с помощью стандартных коллекций — дополнительный парсер не требуется.
Добавьте файл конфигурации на хост, где работает ваш агент CrowdSec:
source: docker
container_name:
- mcp-dockhand
labels:
type: docker
program: nginx-mcpОбе метки обязательны, и ни одна из них не выдаст ошибку, если вы её забудете.
type: docker включает crowdsecurity/docker-logs, который распаковывает JSON-конверт Docker. program: nginx-mcp включает crowdsecurity/nginx-logs, который сопоставляет program, начинающийся с nginx — суффикс -mcp позволяет отличать этот источник от других ваших источников nginx. Если одной метки не хватает, цепочка просто ничего не выдаёт, и никто об этом не сообщает.
После настройки применяются стандартные сценарии:
Сценарий | Что это здесь означает |
| Повторяющиеся |
| Флуд запросами со сменой user-agent |
За 403 тоже стоит последить: это означает, что запрос не прошёл проверку MCP_ALLOWED_HOSTS или MCP_ALLOWED_ORIGINS, а это выглядит как попытка DNS-ребinding.
Стандартный сценарий 401 учитывает только
POST. Его фильтр:evt.Parsed.verb == 'POST'— одно литеральное значение, а не список. Этот сервер обслуживаетPOST,GETиDELETEна/mcp, и проверка bearer-токена выполняется для всех трёх, поэтому неверный токен наGET /mcpилиDELETE /mcpвернёт401точно так же, как иPOST— ноLePresidente/http-generic-401-bfих не учитывает. Тот, кто подбираетMCP_AUTH_TOKENчерезGET /mcp, для этого сценария невидим.Это свойство вышестоящего сценария, общее для всех развёртываний nginx, которые его используют, — и это не то, что может исправить формат журнала этого сервера. Чтобы это исправить, добавьте локальный сценарий, который убирает фильтр
verbили сопоставляет три метода, на которые отвечает этот сервер. А пока считайте строку выше как «повторяющиеся401наPOST/mcp».
Установите
TRUSTED_PROXIESперед включением этой функции. За обратным прокси каждый запрос приходит с адреса прокси. БезTRUSTED_PROXIESэтот адрес и будет записан в журнал — так что первый же бан, выданный CrowdSec, затронет прокси, а вместе с ним и всех пользователей за ним. Укажите адрес или подсеть, с которой общается ваш прокси.Эта настройка одинаково осознанна и в обратную сторону: заголовки пересылки учитываются только от однорангового узла из этого списка. Если доверять им безоговорочно, любой прямой вызывающий может назвать произвольную третью сторону и добиться её бана.
Один ожидаемый побочный эффект: структурированные JSON-строки используют общий поток журнала контейнера и несут ту же метку program, поэтому они не проходят проверку шаблона nginx и считаются unparsed в cscli metrics. Это шум, а не ошибка — ни предупреждений, ни решений.
Конфигурация MCP-клиента
Claude Desktop / Claude Code
Добавьте в настройки MCP:
{
"mcpServers": {
"dockhand": {
"url": "http://localhost:8080/mcp"
}
}
}Если сервер принудительно использует bearer-токен (
MCP_AUTH_TOKENустановлен — см. Защита транспорта), клиент должен отправлять его в заголовкеAuthorization, иначе каждый запрос будет отклоняться с кодом401. В файле.mcp.jsonClaude Code добавьте блокheaders— укажите переменную окружения, чтобы токен никогда не хранился в (часто версионируемом) конфигурационном файле:{ "mcpServers": { "dockhand": { "type": "http", "url": "http://your-server:8080/mcp", "headers": { "Authorization": "Bearer ${DOCKHAND_MCP_TOKEN}" } } } }Отправляйте токен только по зашифрованному каналу. Bearer-токен по незашифрованному
http://в общей сети может быть перехвачен — используйте TLS-терминацию на обратном прокси или подключайтесь к серверу через WireGuard/Tailscale/VPN (тогда прикладной HTTP-трафик будет зашифрован туннелем).Экспортируйте
DOCKHAND_MCP_TOKENв окружении, из которого запускается Claude Code (например, из gitignored-файла.env, который вы подключаете перед запуском).Host/host:port, к которому вы подключаетесь, также должен быть вMCP_ALLOWED_HOSTSсервера, если этот список задан. Для Claude Desktop (в родной конфигурации нет поляheaders) передайте токен через обходной путь mcp-proxy ниже — mcp-proxy пересылает заголовокAuthorizationчерез свои собственные переменные окружения/аргументы.
Claude Desktop с удалённым сервером (mcp-proxy)
Claude Desktop может не подключиться к удалённому серверу mcp-dockhand (не localhost) с помощью встроенной конфигурации "url" выше, даже если сама конечная точка доступна. Симптом — общая ошибка "not a valid MCP server" в Claude Desktop, в то время как обычный запрос из браузера/curl к тому же URL корректно возвращает {"error":"Invalid or missing session ID"}. Это известное ограничение Claude Desktop при работе с удалёнными HTTP-серверами Streamable, а не ошибка mcp-dockhand.
Обходной путь: оберните соединение с помощью mcp-proxy, который преобразует Streamable HTTP в stdio — транспорт, с которым Claude Desktop надёжно работает:
{
"mcpServers": {
"dockhand": {
"command": "/path/to/mcp-proxy",
"args": ["--transport", "streamablehttp", "http://your-server:8080/mcp"]
}
}
}Все инструменты загружаются и работают через прокси корректно. Спасибо @deadrubberboy за сообщение об ошибке и предложенное решение (#90).
Справочник по инструментам
Контейнеры (27 инструментов)
Tool | Description |
| Список всех контейнеров в окружении |
| Получить сведения о контейнере |
| Docker inspect (полные сведения) |
| Получить журналы контейнера |
| Получить статистику использования ресурсов |
| Получить запущенные процессы |
| Запустить контейнер |
| Остановить контейнер |
| Перезапустить контейнер |
| Приостановить контейнер |
| Возобновить контейнер |
| Переименовать контейнер |
| Обновить настройки контейнера |
| Создать новый контейнер |
| Список доступных оболочек |
| Создать терминальную exec-сессию (execId + WS connectionInfo); НЕ выполняет разовую команду и не возвращает вывод — такой конечной точки в Dockhand API нет |
| Просмотр файлов внутри контейнера |
| Прочитать файл из контейнера |
| Создать пустой файл или каталог в контейнере (без содержимого — для этого используйте |
| Удалить файл в контейнере |
| Переименовать файл в контейнере |
| Изменить права доступа к файлу |
| Проверить наличие обновлений образов |
| Получить ожидающие обновления |
| Пакетное обновление контейнеров |
| Выполнить массовую операцию жизненного цикла (запуск/остановка/перезапуск/удаление и т. д.) для контейнеров, образов, томов, сетей или стеков |
| Получить размеры дисков контейнеров |
| Получить агрегированную статистику |
Стеки (21 инструмент)
Tool | Description |
| Список всех стеков |
| Получить сведения о стеке |
| Создать и при необходимости развернуть стек |
| Запустить стек (compose up) |
| Остановить стек (compose stop) |
| Перезапустить стек |
| Остановить стек (compose down) |
| Удалить стек |
| Прочитать compose-файл |
| Обновить compose-файл |
| Прочитать переменные окружения |
| Обновить переменные окружения (merge по умолчанию — безопасно для частичных обновлений; используйте |
| Прочитать исходный файл .env |
| Проверить переменные окружения |
| Сканировать файловую систему на наличие стеков |
| Принять неотслеживаемый стек |
| Переместить стек по новому пути |
| Получить источники стека |
| Получить базовый путь |
| Получить предложения по путям |
| Проверить путь стека |
Образы (9 инструментов)
Tool | Description |
| Список всех образов |
| Получить сведения об образе |
| Получить историю слоёв образа |
| Присвоить тег образу |
| Удалить образ |
| Загрузить образ (pull) |
| Отправить образ (push) |
| Сканирование на уязвимости (Trivy/Grype) |
| Экспортировать образ в виде tarball |
Окружения (18 инструментов)
Tool | Description |
| Список всех окружений |
| Получить сведения об окружении |
| Создать окружение |
| Обновить окружение |
| Удалить окружение |
| Проверить подключение |
| Проверить без сохранения |
| Автоматически определить сокет |
| Получить часовой пояс |
| Установить часовой пояс |
| Получить настройки проверки обновлений |
| Установить настройки проверки обновлений |
| Получить настройки очистки образов |
| Установить настройки очистки образов |
| Список уведомлений |
| Создать уведомление |
| Получить уведомление |
| Удалить уведомление |
Сети (7 инструментов)
Tool | Description |
| Список всех сетей |
| Получить сведения о сети |
| Проверить сеть |
| Создать сеть |
| Удалить сеть |
| Подключить контейнер |
| Отключить контейнер |
Тома (9 инструментов)
Инструмент | Описание |
| Список всех томов |
| Получить сведения о томе |
| Проверить том |
| Просмотр файлов в томе |
| Чтение файла из тома |
| Завершить сеанс просмотра |
| Клонировать том |
| Экспортировать том |
| Удалить том (необратимо) |
Git-стеки (15 инструментов)
Инструмент | Описание |
| Список Git-стеков |
| Сведения о Git-стеке |
| Развернуть Git-стек (SSE) |
| Синхронизация с удалённым репозиторием |
| Проверка Git-подключения |
| Получить env-файлы |
| Вызвать вебхук |
| Сведения о вебхуке |
| Список учётных данных Git |
| Создать учётные данные Git |
| Сведения об учётных данных |
| Обновить учётные данные |
| Удалить учётные данные |
| Список Git-репозиториев |
| Создать конфигурацию репозитория |
Панель управления и активность (8 инструментов)
Инструмент | Описание |
| Статистика панели управления |
| Настройки отображения |
| Задать настройки отображения |
| Лента активности |
| Активность контейнеров |
| События активности |
| Статистика активности |
| Объединённые журналы контейнеров |
Аутентификация и Hawser (12 инструментов)
Инструмент | Описание |
| Проверить статус сеанса |
| Список провайдеров аутентификации |
| Настройки аутентификации |
| Создать OIDC-провайдера |
| Получить OIDC-провайдера |
| Проверить OIDC-провайдера |
| Создать LDAP-провайдера |
| Получить LDAP-провайдера |
| Проверить LDAP-провайдера |
| Список токенов Hawser |
| Создать токен Hawser |
| Отозвать токен Hawser |
Аудит (4 инструмента)
Инструмент | Описание |
| Получить журнал аудита |
| Типы событий аудита |
| Данные аудита по пользователям |
| Экспортировать журнал аудита |
Уведомления (8 инструментов)
Инструмент | Описание |
| Список уведомлений |
| Создать уведомление |
| Получить уведомление |
| Обновить уведомление |
| Удалить уведомление |
| Проверить уведомление |
| Проверить без сохранения |
| Запустить реальное тестовое событие для заданного типа события и полезной нагрузки |
Реестры (10 инструментов)
Инструмент | Описание |
| Список реестров |
| Добавить реестр |
| Сведения о реестре |
| Обновить реестр |
| Удалить реестр |
| Установить по умолчанию |
| Поиск в реестре |
| Получить каталог |
| Получить образ из реестра |
| Получить теги образа |
Система и настройки (19 инструментов)
Инструмент | Описание |
| Состояние сервера |
| Состояние базы данных |
| Сведения о хосте |
| Сведения о системе |
| Использование диска |
| Список системных файлов |
| Чтение системного файла |
| Журнал изменений |
| Зависимости |
| Общие настройки |
| Обновить настройки |
| Настройки темы |
| Обновить тему |
| Настройки сканера |
| Обновить сканер |
| Сведения о лицензии |
| Активировать лицензию по имени и ключу |
| Метрики Prometheus |
| Очистить все ресурсы |
Пользователи, роли и настройки (20 инструментов)
Инструмент | Описание |
| Список пользователей |
| Создать пользователя |
| Сведения о пользователе |
| Обновить пользователя |
| Удалить пользователя |
| Статус MFA |
| Включить MFA |
| Отключить MFA |
| Роли пользователя |
| Назначить одну роль пользователю (без массовой замены) |
| Снять одну роль с пользователя |
| Список ролей |
| Создать роль с именем и объектом прав |
| Получить роль |
| Обновить роль |
| Удалить роль |
| Получить собственный профиль |
| Обновить собственный профиль |
| Получить избранное |
| Задать избранное |
| Список наборов конфигураций |
Расписания (9 инструментов)
Инструмент | Описание |
| Список расписаний |
| Получить настройки |
| Обновить настройки |
| История выполнения |
| Сведения о выполнении |
| Получить расписание |
| Запустить немедленно |
| Включить/отключить |
| Переключить системное расписание |
Автообновление (3 инструмента)
Инструмент | Описание |
| Получить все настройки автообновления |
| Получить автообновление контейнера |
| Задать политику автообновления |
Самопомощь / мета-инструменты (6 инструментов)
Диагностика самого этого MCP-сервера, в отличие от инструментов API Dockhand выше —
полезно для клиента или оператора, который спрашивает «здоров ли этот сервер и правильно ли он настроен?»
а не «здоров ли Dockhand?». Ни один из этих шести не принимает входных аргументов, и ни один из
них не оборачивает отдельную конечную точку Dockhand так, как это делают таблицы выше (get_tool_manifest и
get_runtime_stats вообще не вызывают конечную точку Dockhand) — см. src/tools/meta.ts.
Инструмент | Описание |
| Собственная версия этого сервера, git SHA, дата сборки, время работы, версия протокола MCP, а также URL-адрес Dockhand и версия сервера, к которому он подключён |
| Сравнивает работающую версию этого сервера с последним релизом GitHub (с TTL-кэшированием) |
| Перечисляет каждый зарегистрированный инструмент с его Dockhand |
| Сквозная диагностика: доступность Dockhand, действительность учётных данных и живая проверка доступности для каждого окружения ( |
| Проверяет, что обязательные переменные окружения |
| Внутрипроцессные счётчики для этого сервера: общее количество вызовов и ошибок по каждому инструменту, время работы и последняя ошибка (инструмент/сообщение/временная метка) |
Примечания:| Инструмент | Описание |
| ------------------------- | --------------------------- |
| list_volumes | Список всех томов |
| get_volume | Получить сведения о томе |
| inspect_volume | Проверить том |
| browse_volume | Просмотр файлов в томе |
| get_volume_file_content | Чтение файла из тома |
| release_volume_browse | Завершить сеанс просмотра |
| clone_volume | Клонировать том |
| export_volume | Экспортировать том |
| remove_volume | Удалить том (необратимо) |
Git-стеки (15 инструментов)
Инструмент | Описание |
| Список Git-стеков |
| Получить сведения о Git-стеке |
| Развернуть Git-стек (SSE) |
| Синхронизация с удалённым репозиторием |
| Проверить Git-подключение |
| Получить env-файлы |
| Вызвать вебхук |
| Получить сведения о вебхуке |
| Список учётных данных Git |
| Создать учётные данные Git |
| Получить сведения об учётных данных |
| Обновить учётные данные |
| Удалить учётные данные |
| Список Git-репозиториев |
| Создать конфигурацию репозитория |
Панель управления и активность (8 инструментов)
Инструмент | Описание |
| Получить статистику панели управления |
| Получить настройки отображения |
| Задать настройки отображения |
| Получить ленту активности |
| Активность контейнеров |
| События активности |
| Статистика активности |
| Объединённые журналы контейнеров |
Аутентификация и Hawser (12 инструментов)
Инструмент | Описание |
| Проверить статус сеанса |
| Список провайдеров аутентификации |
| Получить настройки аутентификации |
| Создать OIDC-провайдера |
| Получить OIDC-провайдера |
| Проверить OIDC-провайдера |
| Создать LDAP-провайдера |
| Получить LDAP-провайдера |
| Проверить LDAP-провайдера |
| Список токенов Hawser |
| Создать токен Hawser |
| Отозвать токен Hawser |
Аудит (4 инструмента)
Инструмент | Описание |
| Получить журнал аудита |
| Получить типы событий аудита |
| Данные аудита по пользователям |
| Экспортировать журнал аудита |
Уведомления (8 инструментов)
Инструмент | Описание |
| Список уведомлений |
| Создать уведомление |
| Получить уведомление |
| Обновить уведомление |
| Удалить уведомление |
| Проверить уведомление |
| Проверить без сохранения |
| Запустить реальное тестовое событие для заданного типа события и полезной нагрузки |
Реестры (10 инструментов)
Инструмент | Описание |
| Список реестров |
| Добавить реестр |
| Получить сведения о реестре |
| Обновить реестр |
| Удалить реестр |
| Установить по умолчанию |
| Поиск в реестре |
| Получить каталог |
| Получить образ из реестра |
| Получить теги образа |
Система и настройки (19 инструментов)
Инструмент | Описание |
| Состояние сервера |
| Состояние базы данных |
| Сведения о хосте |
| Сведения о системе |
| Использование диска |
| Список системных файлов |
| Чтение системного файла |
| Журнал изменений |
| Зависимости |
| Общие настройки |
| Обновить настройки |
| Настройки темы |
| Обновить тему |
| Настройки сканера |
| Обновить сканер |
| Сведения о лицензии |
| Активировать лицензию по имени и ключу |
| Метрики Prometheus |
| Очистить все ресурсы |
Пользователи, роли и настройки (20 инструментов)
Инструмент | Описание |
| Список пользователей |
| Создать пользователя |
| Получить сведения о пользователе |
| Обновить пользователя |
| Удалить пользователя |
| Статус MFA |
| Включить MFA |
| Отключить MFA |
| Получить роли пользователя |
| Назначить одну роль пользователю (без массовой замены) |
| Снять одну роль с пользователя |
| Список ролей |
| Создать роль с именем и объектом прав |
| Получить роль |
| Обновить роль |
| Удалить роль |
| Получить собственный профиль |
| Обновить собственный профиль |
| Получить избранное |
| Задать избранное |
| Список наборов конфигураций |
Расписания (9 инструментов)
Инструмент | Описание |
| Список расписаний |
| Получить настройки |
| Обновить настройки |
| История выполнения |
| Сведения о выполнении |
| Получить расписание |
| Запустить немедленно |
| Включить/отключить |
| Переключить системное расписание |
Автообновление (3 инструмента)
Инструмент | Описание |
| Получить все настройки автообновления |
| Получить автообновление контейнера |
| Задать политику автообновления |
Самопомощь / мета-инструменты (6 инструментов)
Диагностика для самого этого MCP-сервера, в отличие от инструментов API Dockhand выше —
полезно для клиента или оператора, задающего вопрос «здоров ли этот сервер и правильно ли он настроен?»
вместо «здоров ли Dockhand?». Ни один из этих шести не принимает входных аргументов, и ни один из
них не оборачивает одну конечную точку Dockhand так, как это делают таблицы выше (get_tool_manifest и
get_runtime_stats вообще не вызывают конечную точку Dockhand) — см. src/tools/meta.ts.
Инструмент | Описание |
| Собственная версия этого сервера, git SHA, дата сборки, время работы, версия протокола MCP и URL-адрес Dockhand/версия сервера, к которому он подключён |
| Сравнивает работающую версию этого сервера с последним релизом GitHub (с TTL-кэшированием) |
| Перечисляет каждый зарегистрированный инструмент с его Dockhand |
| Сквозная диагностика: доступность Dockhand, действительность учётных данных и живая проверка доступности для каждого окружения ( |
| Проверяет, что обязательные переменные окружения |
| Внутрипроцессные счётчики для этого сервера: общее количество вызовов и ошибок по каждому инструменту, время работы и последняя ошибка (инструмент/сообщение/временная метка) |
Примечания:
check_for_updateтребует исходящего сетевого доступа кapi.github.com(API релизов GitHub) — при недоступности он деградирует доupdateAvailable: null, а не завершается ошибкой.Ни один мета-инструмент не раскрывает секретные значения.
validate_configсообщает только о том, присутствуют ли требуемые переменные окружения (булевы значения) и аутентифицируются ли они (булево значение + сырой HTTP-код статуса, например200/401) — но никогда сами значения учётных данных.self_checkсообщает о валидности аутентификации тем же способом. ПолеlastErrorуget_runtime_statsсодержит только имя инструмента, сообщение об ошибке и временную метку — никогда аргументы вызова или тела ответов. Однако это сообщение об ошибке не полностью непрозрачно: при неудачном вызове Dockhand API в него может быть встроен фрагмент вышестоящего HTTP-статуса и тела ответа (через собственное сообщениеDockhandClient:Dockhand API error: ... returned <status>: <body>), и оно передаётся тому MCP-клиенту, который следующим вызоветget_runtime_stats— не обязательно тому, который столкнулся с исходной ошибкой. Оно никогда не включает тела запросов или значения учётных данных и усекается до 500 символов (с маркером многоточия) перед сохранением, так что чрезмерно большой вышестоящий ответ никогда не передаётся целиком.
Важные замечания
update_stack_env — семантика слияния vs замены
REST-эндпоинт Dockhand PUT /api/stacks/{name}/env имеет семантику замены: отправка частичного списка переменных молча удаляет все остальные переменные из стека. Обновление одной переменной стёрло бы всё остальное.
Чтобы предотвратить случайную потерю данных, этот MCP-инструмент по умолчанию использует режим слияния:
Он получает текущий список переменных через
GET /api/stacks/{name}/env.Он объединяет входящие переменные по ключу (при коллизии ключей новые значения перезаписывают существующие).
Он записывает полный объединённый список обратно через
PUT.
# Safe partial update — only MY_VAR changes, all others preserved
update_stack_env(environmentId=1, name="my-stack", variables=[{key: "MY_VAR", value: "new"}])
# Explicit full replacement — all other variables are deleted
update_stack_env(environmentId=1, name="my-stack", variables=[...], mode="replace")Используйте mode="replace" только тогда, когда вы намеренно хотите заменить весь набор переменных.
Идентификатор окружения обязателен
Большинство эндпоинтов ресурсов Docker (контейнеры, стеки, образы, сети, тома) требуют параметр environmentId. Он соответствует параметру запроса ?env=<id> в API Dockhand. Без него эндпоинты возвращают пустые массивы.
SSE-ответы
Операции развёртывания (start, stop, down, restart, compose update with restart) возвращают Server-Sent Events. MCP-сервер автоматически разбирает их и возвращает конечный результат.
Аутентификация
Сервер использует сессионную аутентификацию на основе cookie. Он автоматически:
Выполняет вход при первом запросе
Хранит cookie сессии в памяти
Повторно аутентифицируется при ответах 401
Обрабатывает тайм-аут сессии (24 часа)
Диагностика
Начните с LOG_LEVEL=debug. Тогда каждый запрос к Dockhand отображается со своим эндпоинтом,
кодом статуса и длительностью, и каждая строка одного вызова имеет общий идентификатор
call — используйте grep по нему, чтобы получить всю последовательность. Идентификатор req
связывает эти строки с строкой доступа, которая их запустила, а sid покрывает
всё, что один клиент сделал за всю свою сессию. Для запросов через клиент ms — это полная длительность запроса — она охватывает чтение тела ответа, а не только время до получения заголовков ответа, поэтому она отражает реальную стоимость медленного или зависшего потокового
ответа (например, SSE-вывода при деплое) — а bytes — это размер тела, которое было фактически прочитано. (Зонды входа и самопроверки инициализируют клиент и не могут проходить через него, поэтому их строки логируют время до заголовков без поля bytes.) Неудачный запрос Dockhand дополнительно логирует строку warn с полем errType — именем исключения (например, TimeoutError, TypeError), ограниченным словарём, а не свободным текстом, — так что вы можете фильтровать сбои по типу ошибки. Эта warn-строка срабатывает как когда сам запрос завершился ошибкой до получения какого-либо ответа, так и когда чтение тела ответа прервалось на полпути (например, SSE-поток, прерванный посередине) — в обоих случаях ms отражает, сколько времени занял сбой.
Разработка
# Install dependencies
npm install
# Type check
npm run typecheck
# Build
npm run build
# Run in development mode
DOCKHAND_URL=https://your-server.com \
DOCKHAND_USERNAME=admin \
DOCKHAND_PASSWORD=secret \
npm run devЛинтинг
npm run lint проверяет src/ и tests/ с двумя правилами: no-unused-vars и
no-explicit-any. Поскольку typescript-eslint не поддерживает зафиксированный компилятор
typescript@^7.0.2 — он жёстко падает на TS 7.0, а не просто выдаёт предупреждение о peer-зависимости: см.
typescript-eslint#10940
— линтинг выполняется внутри одноразового контейнера node:22 с зафиксированным TypeScript 5 (язык идентичен во всех версиях TS 5/6/7). В него монтируются src/,
tests/ и eslint.config.js в режиме только для чтения, поэтому для запуска требуется Docker. Тот же скрипт выполняется как жёсткий шлюз в CI. Неиспользуемые импорты и локальные переменные дополнительно перехватываются нативно на TS 7 (noUnusedLocals/noUnusedParameters в tsconfig.tests.json, через
npm run typecheck:tests).
Лицензия
This 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 gradedqualityAmaintenanceExposes over 130 Dockhand API endpoints as tools to manage Docker infrastructure through AI assistants. It enables comprehensive control over containers, stacks, networks, and volumes across multiple environments and hosts.29MIT
- AlicenseNot gradedqualityFmaintenanceExposes the Dockhand Docker management API as tools for LLMs, enabling container, stack, image, volume, and network management via natural language.3MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that gives any LLM client the ability to list, inspect, start, stop, and monitor Docker containers on the host machine.1
- FlicenseBqualityBmaintenanceAn MCP server that gives LLMs direct control over a local Docker daemon, enabling container, image, volume, network, and Compose stack management through natural language.234
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
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/d7eeem/mcp-dockhand'
If you have feedback or need assistance with the MCP directory API, please join our Discord server