Skip to main content
Glama
d7eeem

mcp-dockhand

by d7eeem

MCP Dockhand

CI License: MIT Docker

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.md with exact, auto setting

  • Streamable 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:latest

DockerCompose

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 пользователя

DOCKHAND_PASSWORD

Yes

-

Dockhand пароль

`MCP_PORT

No

8080

Порт для MCP-сервера

`MCP_SESSION_TTL_SECONDS

No

1800

Время неактивности, after which a saved MCP session expires

`MCP_SESSION_CLEANUP_INTERVAL_SECONDS

No

300

Center for removing expired sessions (limited by session CCL)

MCP_MAX_SESSIONS

No

0

Maxiумal number of stored sessions: 0 retains the existing behavior without limitations

MCP_HOST

No

0.0.0.0

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 /mcp (DNS-rebind protection). Op-in: unset means no check except is performed (old behavior toroken keep existing deployments from breaking).** Recommended after setting — see Securing...

MCP_ALLOWED_ORIGIN

No

(not set — Origin check disabled)

Comma-separated list of allowed Origin headers for /mcp. Same optional as above. Only checked if the caller actually sends Origin (non-browsers typically not).

MCP_AUTH_TOKEN

No

(unset — endpoint unauthenticated)

Shared secret required as Authorization: Bearer <toke on every /mcp request. Op-in. In case. As soon as a /endpoint is cost access beyond own loopback. "with token protected from access. Use "Recommended"**

LOG_LEVEL; Default no need

No

info

error, warn, info or debug. debug adds one per one to request line, to/from method, endpoint, status, duration). For requests through the second list, duration includes the entire response, but then the bytes "body-size" field is added. The login and self-check cues (which initialize the center and therefore cannot go through it) indicate the time-to-head without bytes field. It is not a file link. An unknown value logs a warning and goes back to info. Maybe no route through a paramet. This adds a line, no issue.

TRUSTED_PROXIES

No

(empty)

Comma-separated addresses or CDS, e.g. 10.0.0.0/8, 100.64.0.0/10`. Empty means ignore them.

Защита транспорта

/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)

  1. Список разрешённых хостов (MCP_ALLOWED_HOSTS). Если задано непустое значение, каждый запрос к /mcpPOST, 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, которое было получено.

  2. Список разрешённых источников (MCP_ALLOWED_ORIGINS). Если задано, любой запрос, который всё же отправляет заголовок Origin, отсутствующий в списке, отклоняется с кодом 403. Отсутствие заголовка Origin всегда пропускается (собственный MCP-клиент SDK и большинство не-браузерных инструментов его не отправляют), поэтому это полезно только в том случае, если браузерный клиент обращается к /mcp напрямую; список разрешённых хостов выше — это то, что на самом деле останавливает DNS-ребinding.

  3. 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. Если одной метки не хватает, цепочка просто ничего не выдаёт, и никто об этом не сообщает.

После настройки применяются стандартные сценарии:

Сценарий

Что это здесь означает

LePresidente/http-generic-401-bf

Повторяющиеся 401 на /mcp — кто-то подбирает MCP_AUTH_TOKEN

crowdsecurity/http-dos-swithcing-ua

Флуд запросами со сменой 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.json Claude 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

list_containers

Список всех контейнеров в окружении

get_container

Получить сведения о контейнере

inspect_container

Docker inspect (полные сведения)

get_container_logs

Получить журналы контейнера

get_container_stats

Получить статистику использования ресурсов

get_container_top

Получить запущенные процессы

start_container

Запустить контейнер

stop_container

Остановить контейнер

restart_container

Перезапустить контейнер

pause_container

Приостановить контейнер

unpause_container

Возобновить контейнер

rename_container

Переименовать контейнер

update_container

Обновить настройки контейнера

create_container

Создать новый контейнер

get_container_shells

Список доступных оболочек

exec_container

Создать терминальную exec-сессию (execId + WS connectionInfo); НЕ выполняет разовую команду и не возвращает вывод — такой конечной точки в Dockhand API нет

list_container_files

Просмотр файлов внутри контейнера

get_container_file_content

Прочитать файл из контейнера

create_container_file

Создать пустой файл или каталог в контейнере (без содержимого — для этого используйте write_container_file_content)

delete_container_file

Удалить файл в контейнере

rename_container_file

Переименовать файл в контейнере

chmod_container_file

Изменить права доступа к файлу

check_container_updates

Проверить наличие обновлений образов

get_pending_updates

Получить ожидающие обновления

batch_update_containers

Пакетное обновление контейнеров

execute_batch

Выполнить массовую операцию жизненного цикла (запуск/остановка/перезапуск/удаление и т. д.) для контейнеров, образов, томов, сетей или стеков

get_container_sizes

Получить размеры дисков контейнеров

get_containers_stats

Получить агрегированную статистику

Стеки (21 инструмент)

Tool

Description

list_stacks

Список всех стеков

get_stack

Получить сведения о стеке

create_stack

Создать и при необходимости развернуть стек

start_stack

Запустить стек (compose up)

stop_stack

Остановить стек (compose stop)

restart_stack

Перезапустить стек

down_stack

Остановить стек (compose down)

delete_stack

Удалить стек

get_stack_compose

Прочитать compose-файл

update_stack_compose

Обновить compose-файл

get_stack_env

Прочитать переменные окружения

update_stack_env

Обновить переменные окружения (merge по умолчанию — безопасно для частичных обновлений; используйте mode="replace" для полной замены)

get_stack_env_raw

Прочитать исходный файл .env

validate_stack_env

Проверить переменные окружения

scan_stacks

Сканировать файловую систему на наличие стеков

adopt_stack

Принять неотслеживаемый стек

relocate_stack

Переместить стек по новому пути

get_stack_sources

Получить источники стека

get_stack_base_path

Получить базовый путь

get_stack_path_hints

Получить предложения по путям

validate_stack_path

Проверить путь стека

Образы (9 инструментов)

Tool

Description

list_images

Список всех образов

get_image

Получить сведения об образе

get_image_history

Получить историю слоёв образа

tag_image

Присвоить тег образу

remove_image

Удалить образ

pull_image

Загрузить образ (pull)

push_image

Отправить образ (push)

scan_image

Сканирование на уязвимости (Trivy/Grype)

export_image

Экспортировать образ в виде tarball

Окружения (18 инструментов)

Tool

Description

list_environments

Список всех окружений

get_environment

Получить сведения об окружении

create_environment

Создать окружение

update_environment

Обновить окружение

delete_environment

Удалить окружение

test_environment

Проверить подключение

test_environment_connection

Проверить без сохранения

detect_docker_socket

Автоматически определить сокет

get_environment_timezone

Получить часовой пояс

set_environment_timezone

Установить часовой пояс

get_environment_update_check

Получить настройки проверки обновлений

set_environment_update_check

Установить настройки проверки обновлений

get_environment_image_prune

Получить настройки очистки образов

set_environment_image_prune

Установить настройки очистки образов

list_environment_notifications

Список уведомлений

create_environment_notification

Создать уведомление

get_environment_notification

Получить уведомление

delete_environment_notification

Удалить уведомление

Сети (7 инструментов)

Tool

Description

list_networks

Список всех сетей

get_network

Получить сведения о сети

inspect_network

Проверить сеть

create_network

Создать сеть

remove_network

Удалить сеть

connect_container_to_network

Подключить контейнер

disconnect_container_from_network

Отключить контейнер

Тома (9 инструментов)

Инструмент

Описание

list_volumes

Список всех томов

get_volume

Получить сведения о томе

inspect_volume

Проверить том

browse_volume

Просмотр файлов в томе

get_volume_file_content

Чтение файла из тома

release_volume_browse

Завершить сеанс просмотра

clone_volume

Клонировать том

export_volume

Экспортировать том

remove_volume

Удалить том (необратимо)

Git-стеки (15 инструментов)

Инструмент

Описание

list_git_stacks

Список Git-стеков

get_git_stack

Сведения о Git-стеке

deploy_git_stack

Развернуть Git-стек (SSE)

sync_git_stack

Синхронизация с удалённым репозиторием

test_git_stack

Проверка Git-подключения

get_git_stack_env_files

Получить env-файлы

trigger_git_webhook

Вызвать вебхук

get_git_webhook

Сведения о вебхуке

list_git_credentials

Список учётных данных Git

create_git_credential

Создать учётные данные Git

get_git_credential

Сведения об учётных данных

update_git_credential

Обновить учётные данные

delete_git_credential

Удалить учётные данные

list_git_repositories

Список Git-репозиториев

create_git_repository

Создать конфигурацию репозитория

Панель управления и активность (8 инструментов)

Инструмент

Описание

get_dashboard_stats

Статистика панели управления

get_dashboard_preferences

Настройки отображения

set_dashboard_preferences

Задать настройки отображения

get_activity_feed

Лента активности

get_container_activity

Активность контейнеров

get_activity_events

События активности

get_activity_stats

Статистика активности

get_merged_logs

Объединённые журналы контейнеров

Аутентификация и Hawser (12 инструментов)

Инструмент

Описание

get_auth_session

Проверить статус сеанса

get_auth_providers

Список провайдеров аутентификации

get_auth_settings

Настройки аутентификации

create_oidc_provider

Создать OIDC-провайдера

get_oidc_provider

Получить OIDC-провайдера

test_oidc_provider

Проверить OIDC-провайдера

create_ldap_provider

Создать LDAP-провайдера

get_ldap_provider

Получить LDAP-провайдера

test_ldap_provider

Проверить LDAP-провайдера

list_hawser_tokens

Список токенов Hawser

create_hawser_token

Создать токен Hawser

revoke_hawser_token

Отозвать токен Hawser

Аудит (4 инструмента)

Инструмент

Описание

get_audit_log

Получить журнал аудита

get_audit_events

Типы событий аудита

get_audit_users

Данные аудита по пользователям

export_audit_log

Экспортировать журнал аудита

Уведомления (8 инструментов)

Инструмент

Описание

list_notifications

Список уведомлений

create_notification

Создать уведомление

get_notification

Получить уведомление

update_notification

Обновить уведомление

delete_notification

Удалить уведомление

test_notification

Проверить уведомление

test_notification_config

Проверить без сохранения

trigger_test_notification

Запустить реальное тестовое событие для заданного типа события и полезной нагрузки

Реестры (10 инструментов)

Инструмент

Описание

list_registries

Список реестров

create_registry

Добавить реестр

get_registry

Сведения о реестре

update_registry

Обновить реестр

delete_registry

Удалить реестр

set_default_registry

Установить по умолчанию

search_registry

Поиск в реестре

get_registry_catalog

Получить каталог

get_registry_image

Получить образ из реестра

get_registry_tags

Получить теги образа

Система и настройки (19 инструментов)

Инструмент

Описание

health_check

Состояние сервера

health_check_database

Состояние базы данных

get_host_info

Сведения о хосте

get_system_info

Сведения о системе

get_system_disk

Использование диска

list_system_files

Список системных файлов

get_system_file_content

Чтение системного файла

get_changelog

Журнал изменений

get_dependencies

Зависимости

get_general_settings

Общие настройки

update_general_settings

Обновить настройки

get_theme_settings

Настройки темы

update_theme_settings

Обновить тему

get_scanner_settings

Настройки сканера

update_scanner_settings

Обновить сканер

get_license

Сведения о лицензии

activate_license

Активировать лицензию по имени и ключу

get_prometheus_metrics

Метрики Prometheus

prune_all

Очистить все ресурсы

Пользователи, роли и настройки (20 инструментов)

Инструмент

Описание

list_users

Список пользователей

create_user

Создать пользователя

get_user

Сведения о пользователе

update_user

Обновить пользователя

delete_user

Удалить пользователя

get_user_mfa_status

Статус MFA

enable_user_mfa

Включить MFA

disable_user_mfa

Отключить MFA

get_user_roles

Роли пользователя

add_user_role

Назначить одну роль пользователю (без массовой замены)

remove_user_role

Снять одну роль с пользователя

list_roles

Список ролей

create_role

Создать роль с именем и объектом прав

get_role

Получить роль

update_role

Обновить роль

delete_role

Удалить роль

get_profile

Получить собственный профиль

update_profile

Обновить собственный профиль

get_favorites

Получить избранное

set_favorites

Задать избранное

list_config_sets

Список наборов конфигураций

Расписания (9 инструментов)

Инструмент

Описание

list_schedules

Список расписаний

get_schedule_settings

Получить настройки

update_schedule_settings

Обновить настройки

get_schedule_executions

История выполнения

get_schedule_execution

Сведения о выполнении

get_schedule

Получить расписание

run_schedule_now

Запустить немедленно

toggle_schedule

Включить/отключить

toggle_system_schedule

Переключить системное расписание

Автообновление (3 инструмента)

Инструмент

Описание

get_auto_update_settings

Получить все настройки автообновления

get_container_auto_update

Получить автообновление контейнера

set_container_auto_update

Задать политику автообновления

Самопомощь / мета-инструменты (6 инструментов)

Диагностика самого этого MCP-сервера, в отличие от инструментов API Dockhand выше — полезно для клиента или оператора, который спрашивает «здоров ли этот сервер и правильно ли он настроен?» а не «здоров ли Dockhand?». Ни один из этих шести не принимает входных аргументов, и ни один из них не оборачивает отдельную конечную точку Dockhand так, как это делают таблицы выше (get_tool_manifest и get_runtime_stats вообще не вызывают конечную точку Dockhand) — см. src/tools/meta.ts.

Инструмент

Описание

get_server_info

Собственная версия этого сервера, git SHA, дата сборки, время работы, версия протокола MCP, а также URL-адрес Dockhand и версия сервера, к которому он подключён

check_for_update

Сравнивает работающую версию этого сервера с последним релизом GitHub (с TTL-кэшированием)

get_tool_manifest

Перечисляет каждый зарегистрированный инструмент с его Dockhand {method, path}, а также закреплённый коммит/версию OpenAPI Dockhand, по которому были сгенерированы инструменты этого сервера

self_check

Сквозная диагностика: доступность Dockhand, действительность учётных данных и живая проверка доступности для каждого окружения (POST /api/environments/{id}/test, выполняется параллельно с 5-секундным таймаутом на окружение) плюс статус подключения Hawser-агента — одним вызовом

validate_config

Проверяет, что обязательные переменные окружения DOCKHAND_URL/DOCKHAND_USERNAME/DOCKHAND_PASSWORD присутствуют и что они успешно проходят аутентификацию

get_runtime_stats

Внутрипроцессные счётчики для этого сервера: общее количество вызовов и ошибок по каждому инструменту, время работы и последняя ошибка (инструмент/сообщение/временная метка)

Примечания:| Инструмент | Описание | | ------------------------- | --------------------------- | | list_volumes | Список всех томов | | get_volume | Получить сведения о томе | | inspect_volume | Проверить том | | browse_volume | Просмотр файлов в томе | | get_volume_file_content | Чтение файла из тома | | release_volume_browse | Завершить сеанс просмотра | | clone_volume | Клонировать том | | export_volume | Экспортировать том | | remove_volume | Удалить том (необратимо) |

Git-стеки (15 инструментов)

Инструмент

Описание

list_git_stacks

Список Git-стеков

get_git_stack

Получить сведения о Git-стеке

deploy_git_stack

Развернуть Git-стек (SSE)

sync_git_stack

Синхронизация с удалённым репозиторием

test_git_stack

Проверить Git-подключение

get_git_stack_env_files

Получить env-файлы

trigger_git_webhook

Вызвать вебхук

get_git_webhook

Получить сведения о вебхуке

list_git_credentials

Список учётных данных Git

create_git_credential

Создать учётные данные Git

get_git_credential

Получить сведения об учётных данных

update_git_credential

Обновить учётные данные

delete_git_credential

Удалить учётные данные

list_git_repositories

Список Git-репозиториев

create_git_repository

Создать конфигурацию репозитория

Панель управления и активность (8 инструментов)

Инструмент

Описание

get_dashboard_stats

Получить статистику панели управления

get_dashboard_preferences

Получить настройки отображения

set_dashboard_preferences

Задать настройки отображения

get_activity_feed

Получить ленту активности

get_container_activity

Активность контейнеров

get_activity_events

События активности

get_activity_stats

Статистика активности

get_merged_logs

Объединённые журналы контейнеров

Аутентификация и Hawser (12 инструментов)

Инструмент

Описание

get_auth_session

Проверить статус сеанса

get_auth_providers

Список провайдеров аутентификации

get_auth_settings

Получить настройки аутентификации

create_oidc_provider

Создать OIDC-провайдера

get_oidc_provider

Получить OIDC-провайдера

test_oidc_provider

Проверить OIDC-провайдера

create_ldap_provider

Создать LDAP-провайдера

get_ldap_provider

Получить LDAP-провайдера

test_ldap_provider

Проверить LDAP-провайдера

list_hawser_tokens

Список токенов Hawser

create_hawser_token

Создать токен Hawser

revoke_hawser_token

Отозвать токен Hawser

Аудит (4 инструмента)

Инструмент

Описание

get_audit_log

Получить журнал аудита

get_audit_events

Получить типы событий аудита

get_audit_users

Данные аудита по пользователям

export_audit_log

Экспортировать журнал аудита

Уведомления (8 инструментов)

Инструмент

Описание

list_notifications

Список уведомлений

create_notification

Создать уведомление

get_notification

Получить уведомление

update_notification

Обновить уведомление

delete_notification

Удалить уведомление

test_notification

Проверить уведомление

test_notification_config

Проверить без сохранения

trigger_test_notification

Запустить реальное тестовое событие для заданного типа события и полезной нагрузки

Реестры (10 инструментов)

Инструмент

Описание

list_registries

Список реестров

create_registry

Добавить реестр

get_registry

Получить сведения о реестре

update_registry

Обновить реестр

delete_registry

Удалить реестр

set_default_registry

Установить по умолчанию

search_registry

Поиск в реестре

get_registry_catalog

Получить каталог

get_registry_image

Получить образ из реестра

get_registry_tags

Получить теги образа

Система и настройки (19 инструментов)

Инструмент

Описание

health_check

Состояние сервера

health_check_database

Состояние базы данных

get_host_info

Сведения о хосте

get_system_info

Сведения о системе

get_system_disk

Использование диска

list_system_files

Список системных файлов

get_system_file_content

Чтение системного файла

get_changelog

Журнал изменений

get_dependencies

Зависимости

get_general_settings

Общие настройки

update_general_settings

Обновить настройки

get_theme_settings

Настройки темы

update_theme_settings

Обновить тему

get_scanner_settings

Настройки сканера

update_scanner_settings

Обновить сканер

get_license

Сведения о лицензии

activate_license

Активировать лицензию по имени и ключу

get_prometheus_metrics

Метрики Prometheus

prune_all

Очистить все ресурсы

Пользователи, роли и настройки (20 инструментов)

Инструмент

Описание

list_users

Список пользователей

create_user

Создать пользователя

get_user

Получить сведения о пользователе

update_user

Обновить пользователя

delete_user

Удалить пользователя

get_user_mfa_status

Статус MFA

enable_user_mfa

Включить MFA

disable_user_mfa

Отключить MFA

get_user_roles

Получить роли пользователя

add_user_role

Назначить одну роль пользователю (без массовой замены)

remove_user_role

Снять одну роль с пользователя

list_roles

Список ролей

create_role

Создать роль с именем и объектом прав

get_role

Получить роль

update_role

Обновить роль

delete_role

Удалить роль

get_profile

Получить собственный профиль

update_profile

Обновить собственный профиль

get_favorites

Получить избранное

set_favorites

Задать избранное

list_config_sets

Список наборов конфигураций

Расписания (9 инструментов)

Инструмент

Описание

list_schedules

Список расписаний

get_schedule_settings

Получить настройки

update_schedule_settings

Обновить настройки

get_schedule_executions

История выполнения

get_schedule_execution

Сведения о выполнении

get_schedule

Получить расписание

run_schedule_now

Запустить немедленно

toggle_schedule

Включить/отключить

toggle_system_schedule

Переключить системное расписание

Автообновление (3 инструмента)

Инструмент

Описание

get_auto_update_settings

Получить все настройки автообновления

get_container_auto_update

Получить автообновление контейнера

set_container_auto_update

Задать политику автообновления

Самопомощь / мета-инструменты (6 инструментов)

Диагностика для самого этого MCP-сервера, в отличие от инструментов API Dockhand выше — полезно для клиента или оператора, задающего вопрос «здоров ли этот сервер и правильно ли он настроен?» вместо «здоров ли Dockhand?». Ни один из этих шести не принимает входных аргументов, и ни один из них не оборачивает одну конечную точку Dockhand так, как это делают таблицы выше (get_tool_manifest и get_runtime_stats вообще не вызывают конечную точку Dockhand) — см. src/tools/meta.ts.

Инструмент

Описание

get_server_info

Собственная версия этого сервера, git SHA, дата сборки, время работы, версия протокола MCP и URL-адрес Dockhand/версия сервера, к которому он подключён

check_for_update

Сравнивает работающую версию этого сервера с последним релизом GitHub (с TTL-кэшированием)

get_tool_manifest

Перечисляет каждый зарегистрированный инструмент с его Dockhand {method, path}, а также закреплённый коммит/версию OpenAPI Dockhand, для которого были сгенерированы инструменты этого сервера

self_check

Сквозная диагностика: доступность Dockhand, действительность учётных данных и живая проверка доступности для каждого окружения (POST /api/environments/{id}/test, выполняется параллельно с 5-секундным таймаутом на окружение) плюс статус подключения Hawser-агента в одном вызове

validate_config

Проверяет, что обязательные переменные окружения DOCKHAND_URL/DOCKHAND_USERNAME/DOCKHAND_PASSWORD присутствуют и успешно проходят аутентификацию

get_runtime_stats

Внутрипроцессные счётчики для этого сервера: общее количество вызовов и ошибок по каждому инструменту, время работы и последняя ошибка (инструмент/сообщение/временная метка)

Примечания:

  • 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-инструмент по умолчанию использует режим слияния:

  1. Он получает текущий список переменных через GET /api/stacks/{name}/env.

  2. Он объединяет входящие переменные по ключу (при коллизии ключей новые значения перезаписывают существующие).

  3. Он записывает полный объединённый список обратно через 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).

Лицензия

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    A
    maintenance
    Exposes 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.
    29
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Exposes the Dockhand Docker management API as tools for LLMs, enabling container, stack, image, volume, and network management via natural language.
    3
    MIT
  • F
    license
    B
    quality
    B
    maintenance
    An MCP server that gives LLMs direct control over a local Docker daemon, enabling container, image, volume, network, and Compose stack management through natural language.
    23
    4

View all related MCP servers

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.

View all MCP Connectors

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/d7eeem/mcp-dockhand'

If you have feedback or need assistance with the MCP directory API, please join our Discord server