Skip to main content
Glama
d7eeem

mcp-dockhand

by d7eeem

MCP Dockhand

CI License: MIT Docker

一个将 Dockhand API 暴露为 MCP 工具的 MCP(模型上下文协议)服务器。通过 AI 助手管理你的整个 Docker 基础设施。

API 覆盖率: 范围内 Dockhand 端点的 88.7%(282/318)已有对应的 MCP 工具——完整的、按区域自动更新的明细请参阅 docs/coverage.md

Dockhand 是一个 Docker 管理服务器,通过 Hawser 代理连接多个 Docker 主机。此 MCP 服务器提供对所有 Dockhand 功能的完整编程式访问。

功能特性

  • 280+ 个 MCP 工具,覆盖 Dockhand API——精确的、自动更新的覆盖率请参阅 docs/coverage.md

  • 可流式 HTTP 传输(MCP 规范 2025-03-26),适用于 Docker 容器托管

  • 基于会话的认证,在收到 401 时自动重新登录

  • SSE 支持,用于部署操作(start、stop、down、restart)

  • 环境过滤器,在所有容器/堆栈/镜像/网络/卷端点上强制执行

  • Docker 就绪,采用多阶段构建、非 root 用户和健康检查

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

Docker Compose

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

配置

变量

必填

默认值

描述

DOCKHAND_URL

-

Dockhand 服务器 URL

DOCKHAND_USERNAME

-

Dockhand 用户名

DOCKHAND_PASSWORD

-

Dockhand 密码

MCP_PORT

8080

MCP 服务器的端口

MCP_SESSION_TTL_SECONDS

1800

保留的 MCP 会话在过期前的不活动超时时间

MCP_SESSION_CLEANUP_INTERVAL_SECONDS

300

移除过期会话的间隔(限制在会话 TTL 以内)

MCP_MAX_SESSIONS

0

最大保留会话数;0 保持现有的无限制行为

MCP_HOST

0.0.0.0

监听地址。默认保留为通配地址,以便已发布的 Docker 端口(-p 8080:8080 / docker-compose.yml)继续工作;保护端点的推荐方式请参阅保护传输层,而不是仅绑定回环地址

MCP_ALLOWED_HOSTS

(未设置——主机检查已禁用)

/mcp 的逗号分隔 Host 头允许列表(DNS 重绑定防护)。选择启用:未设置意味着不进行任何 Host 检查(与之前的行为一致,这样现有部署不会因更新而中断)。设置好后建议启用——请参阅保护传输层

MCP_ALLOWED_ORIGINS

(未设置——来源检查已禁用)

/mcp 的逗号分隔 Origin 头允许列表。选择启用,同上。仅在调用方实际发送 Origin 头时才强制执行(非浏览器的 MCP 客户端通常不会发送)

MCP_AUTH_TOKEN

(未设置——端点无认证)

共享密钥,每个 /mcp 请求都需要以 Authorization: Bearer <token> 形式提供。选择启用;当端点超出你自己的回环地址可达时建议启用——请参阅保护传输层

LOG_LEVEL

info

errorwarninfodebugdebug 为每个 Dockhand 请求增加一行日志(方法、端点模板、状态、耗时)。对于通过客户端发出的请求,耗时涵盖完整响应体,并额外增加一个 bytes 响应体大小字段;登录和自检探针(它们用于引导客户端,因此无法经由客户端路由)记录到响应头的时间,不包含 bytes 字段。绝不记录路径段或参数值。无法识别的值会发出警告并回退到 info

TRUSTED_PROXIES

(空)

允许设置 X-Forwarded-For / X-Real-IP 的逗号分隔地址或 CIDR,例如 10.0.0.0/8, 100.64.0.0/10。为空表示忽略这些头并使用对端地址。

保护传输层

/mcp 默认绑定 0.0.0.0:8080(参见上面的 MCP_HOST),并且在默认情况下——即 MCP_ALLOWED_HOSTSMCP_ALLOWED_ORIGINSMCP_AUTH_TOKEN 均未设置时——它接受任何请求,进行 Host/Origin 检查,也没有认证。这是 mcp-dockhand 一直以来的行为,刻意保留为默认值:默认启用检查会拒绝任何不以 localhost/127.0.0.1 方式访问服务器的客户端(如局域网 IP、反向代理、Docker 网络别名),从而在常规更新时破坏现有部署。

一旦 /mcp 超出你自己机器的回环接口可达,你就应该启用它——服务器持有一个 Dockhand 管理员凭据,每个工具调用都以该身份执行,因此任何能打开 MCP 会话的人都可以控制 Docker(容器 exec、通过 create_container 进行主机绑定挂载、文件读写、已存储的 git 凭据)。在未配置任何保护的情况下,服务器会在启动时记录一条 [security] WARNING 作为提醒。有三个相互独立、全部选择启用的保护层可用:

  1. 主机允许列表(MCP_ALLOWED_HOSTS)。 一旦设置为非空值,对 /mcp 的每个请求——POSTGETDELETE——除非其 Host 头与允许列表匹配,否则都会以 403 被拒绝。这是针对 DNS-rebinding 的主要防御:恶意网页无法让操作者的浏览器在允许列表接受的 Host 值下访问服务器。将其设置为你的客户端实际访问服务器的方式——文档中的本地设置为 localhost:8080/127.0.0.1:8080,或者,如果你直接通过地址连接而不是通过 localhost(包括下面的 mcp-proxy 远程服务器设置),则设置为你的客户端实际发送的 host:port,例如 100.100.50.40:8222。设置错误会导致每个请求都被以 403 Invalid Host header 拒绝——检查该消息,它会回显它看到的 Host 值。

  2. Origin 允许列表(MCP_ALLOWED_ORIGINS)。 一旦设置,任何确实发送了不在列表中的 Origin 头的请求都会被以 403 拒绝。缺少 Origin 头的请求始终通过(SDK 自己的 MCP 客户端和大多数非浏览器工具从不发送),因此这仅在基于浏览器的客户端直接与 /mcp 通信时才有用;上面的 Host 允许列表才是真正阻止 DNS-rebinding 的机制。

  3. Bearer 令牌(MCP_AUTH_TOKEN)。 一旦设置,每个 /mCP 请求都必须携带 Authorization: Bearer <token>,否则会被以 401 拒绝;比较是恒定时间的。建议与 Host 允许列表一起使用,适用于任何可从操作者自身机器之外访问的部署。

# .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 保护服务器

服务器为每个请求(包括被拒绝的请求)向 stdout 写入一行 nginx 格式的访问日志,而结构化应用程序日志则进入 stderr。CrowdSec 使用其标准集合解析访问日志行——无需自定义解析器。

在运行 CrowdSec 代理的主机上添加一个采集文件:

source: docker
container_name:
  - mcp-dockhand
labels:
  type: docker
  program: nginx-mcp

两个标签都是必需的,如果你忘记其中一个,都不会大声报错。 type: docker 启用 crowdsecurity/docker-logs,它会解包 Docker 的 JSON 信封。program: nginx-mcp 启用 crowdsecurity/nginx-logs,它匹配以 nginx 开头的 program——-mcp 后缀使此来源与你的其他 nginx 来源区分开来。缺少一个标签,整个链路就什么都不产生,而且没有任何东西会报告它。

一旦接通,标准场景即可应用:

场景

在这里的含义

LePresidente/http-generic-401-bf

/mcp 的重复 401——有人在猜测 MCP_AUTH_TOKEN

crowdsecurity/http-dos-swithcing-ua

使用轮换用户代理的请求洪泛

403 也值得关注:它意味着请求未通过 MCP_ALLOWED_HOSTSMCP_ALLOWED_ORIGINS 检查,而这正是 DNS-rebinding 尝试在这里的表现形式。

标准的 401 场景只统计 POST 其过滤器是 evt.Parsed.verb == 'POST'——一个字面值,而不是一个列表。此服务器在 /mcp 上提供 POSTGETDELETE,并且 bearer 检查先于这三个方法运行,因此 GET /mcpDELETE /mcp 上的错误令牌 返回 401 的方式与 POST 完全相同——而 LePresidente/http-generic-401-bf 永远不会统计这些。有人通过 GET /mcp 猜测 MCP_AUTH_TOKEN 对它来说是不可见的。

这是上游场景的一个属性,与使用它的每个 nginx 部署共享——不是此服务器的日志格式可以修复的。要关闭它,请添加一个删除 verb 过滤器的本地场景,或者匹配此服务器响应的三个方法。在此之前,请将上面的行视为“对 POST /mcp 的重复 401”。

在启用此功能之前设置 TRUSTED_PROXIES 在反向代理后面,每个请求都来自代理的地址。如果没有 TRUSTED_PROXIES,该地址就是被记录的地址——因此 CrowdSec 发出的第一个禁令 就会封掉代理,以及它后面的每个用户。将其设置为 你的代理通信的地址或子网。

该设置在其他方向同样刻意:转发头 仅从该列表中的对等方获得信任。无条件信任它们会 让任何直接调用者指定任意第三方并使其被禁止。

一个预期的副作用: 结构化 JSON 行共享容器的日志 流并携带相同的 program 标签,因此它们无法通过 nginx 模式,并在 cscli metrics 中计为 unparsed。这是噪音,不是故障——没有警报,没有决策。

MCP 客户端配置

Claude Desktop / Claude Code

添加到你的 MCP 设置中:

{
  "mcpServers": {
    "dockhand": {
      "url": "http://localhost:8080/mcp"
    }
  }
}

如果服务器强制执行 bearer 令牌(设置了 MCP_AUTH_TOKEN——请参阅 保护传输),客户端必须将其作为 Authorization 头发送,否则每个请求都会被以 401 拒绝。在 Claude Code 的 .mcp.json 中,添加一个 headers 块——引用环境变量,以便令牌 永远不会存在于(通常受版本控制的)配置文件中:

{
  "mcpServers": {
    "dockhand": {
      "type": "http",
      "url": "http://your-server:8080/mcp",
      "headers": { "Authorization": "Bearer ${DOCKHAND_MCP_TOKEN}" }
    }
  }
}

仅通过加密传输发送令牌。 在共享网络上通过纯 http:// 发送的 bearer 令牌 可能被嗅探——在反向代理处终止 TLS,或通过 WireGuard/Tailscale/VPN 链路访问服务器(应用层 HTTP 随后由隧道加密)。

在启动 Claude Code 的环境中导出 DOCKHAND_MCP_TOKEN(例如,从 一个被 gitignore 的 .envsource 它)。你连接的 Host/host:port 也必须位于服务器的 MCP_ALLOWED_HOSTS 中(如果设置了该允许列表)。对于 Claude Desktop(原生配置没有 headers 字段),请通过下面的 mcp-proxy 变通方法传递令牌——mcp-proxy 通过其自身的 环境/参数转发 Authorization 头。

使用远程服务器(mcp-proxy)的 Claude Desktop

Claude Desktop 可能无法使用上述原生 "url" 配置连接到 远程 mcp-dockhand 服务器(非 localhost),即使端点本身是可访问的。症状是 Claude Desktop 中出现通用的 "not a valid MCP server" 错误,而普通浏览器/curl 请求到同一 URL 却正确返回 {"error":"Invalid or missing session ID"}。这是 Claude Desktop 与远程 Streamable HTTP 服务器的一个已知限制,而不是 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 个工具)

工具

描述

list_containers

列出环境中的所有容器

get_container

获取容器详细信息

inspect_container

Docker 检查(完整详细信息)

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

列出可用的 shell

exec_container

创建终端执行会话(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 个工具)

工具

描述

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

更新环境变量(默认合并——对部分更新安全;使用 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 个工具)

工具

描述

list_images

列出所有镜像

get_image

获取镜像详细信息

get_image_history

获取镜像层历史

tag_image

标记镜像

remove_image

移除镜像

pull_image

拉取镜像

push_image

推送镜像

scan_image

漏洞扫描(Trivy/Grype)

export_image

将镜像导出为 tar 包

环境(18 个工具)

工具

描述

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 个工具)

工具

描述

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

获取环境变量文件

trigger_git_webhook

触发 Webhook

get_git_webhook

获取 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 服务器本身的诊断——与上述 Dockhand API 工具不同——适用于客户端或操作者询问"此服务器是否健康且配置正确?",而非"Dockhand 是否健康?"。这六个工具均不接受任何输入参数,也不像上表那样包装单个 Dockhand 端点(get_tool_manifestget_runtime_stats 完全不调用任何 Dockhand 端点)——参见 src/tools/meta.ts

工具

描述

get_server_info

此服务器自身的版本、git SHA、构建日期、运行时间、MCP 协议版本,以及其连接的 Dockhand URL/服务器版本

check_for_update

将此服务器的运行版本与最新的 GitHub 版本进行比较(TTL 缓存)

get_tool_manifest

列出每个注册的工具及其 Dockhand {method, path},以及此服务器工具所依据的固定 Dockhand OpenAPI 提交/版本

self_check

端到端诊断:Dockhand 可达性、凭据有效性,以及实时的按环境可达性检查(POST /api/environments/{id}/test,以每个环境 5 秒超时并行运行),外加 Hawser-agent 连接状态,一次调用完成

validate_config

检查所需的 DOCKHAND_URL/DOCKHAND_USERNAME/DOCKHAND_PASSWORD 环境变量是否存在,以及它们能否成功认证

get_runtime_stats

此服务器的进程内计数器:总调用/每工具调用和错误计数、运行时间,以及最后一个错误的工具/消息/时间戳

备注:

  • check_for_update 需要出站网络访问 api.github.com(GitHub 的 releases API)——如果该地址不可达,它会降级为 updateAvailable: null 而不是失败。

  • 没有任何元工具会暴露任何机密值。 validate_config 仅报告所需环境变量是否存在(布尔值)以及它们是否通过认证(一个布尔值加上原始 HTTP 状态码,例如 200/401)——绝不会报告凭据值本身。self_check 以相同方式报告认证有效性。get_runtime_statslastError 仅携带工具名称、错误消息和时间戳——绝不会携带调用参数或响应负载。不过,该错误消息并非完全不透明: 对于失败的 Dockhand API 调用,它可能嵌入上游 HTTP 状态和响应正文的片段(通过 DockhandClient 自身的 Dockhand API error: ... returned <status>: <body> 消息),并且它会被回显给下一个调用 get_runtime_stats 的 MCP 客户端——不一定是触发原始错误的那一个。它绝不会包含请求正文或凭据值,并且在存储前会被截断为 500 个字符(带省略号标记),因此过大的上游响应绝不会被整体回显。

重要说明

update_stack_env —— 合并与替换语义

Dockhand REST 端点 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"

环境 ID 是必需的

大多数 Docker 资源端点(容器、堆栈、镜像、网络、卷)都需要 environmentId 参数。这映射到 Dockhand API 中的 ?env=<id> 查询参数。没有它,端点会返回空数组。

SSE 响应

部署操作(start、stop、down、restart、带重启的 compose update)返回 Server-Sent Events。MCP 服务器会自动解析这些事件并返回最终结果。

认证

服务器使用基于会话的 Cookie 认证。它会自动:

  • 在首次请求时登录

  • 将会话 Cookie 存储在内存中

  • 在收到 401 响应时重新认证

  • 处理会话超时(24 小时)

故障排查

LOG_LEVEL=debug 开始。此后每个 Dockhand 请求都会显示其端点、状态码和持续时间,并且单次调用的每一行日志共享同一个 call 标识符——用 grep 搜索它即可获得完整序列。req 标识符将这些行关联回启动它们的访问行,而 sid 覆盖单个客户端在整个会话期间所做的一切。对于通过客户端发出的请求,ms 是完整请求持续时间——它涵盖响应正文被读取的整个过程,而不仅仅是直到响应头到达的时间,因此它反映了慢速或停滞的流式响应(例如部署的 SSE 输出)实际花费的成本——而 bytes 是实际读取的正文大小。(登录和自检探针会引导客户端且无法通过它路由,因此它们的行记录的是到响应头的时间,没有 bytes 字段。)失败的 Dockhand 请求还会额外记录一条 warn 行,携带 errType——异常名称(例如 TimeoutErrorTypeError),这是一个有界词汇表而非自由文本——因此您可以按错误类型过滤失败。该 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-varsno-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 中作为硬性门禁运行。未使用的导入/局部变量还会由 tsc 在 TS 7 上原生捕获(tsconfig.tests.json 中的 noUnusedLocals/noUnusedParameters,通过 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