Skip to main content
Glama
d7eeem

mcp-dockhand

by d7eeem

MCP Dockhand

CI License: MIT Docker

Ein MCP-Server (Model Context Protocol), der die Dockhand-API als MCP-Tools bereitstellt. Verwalten Sie Ihre gesamte Docker-Infrastruktur über KI-Assistenten.

API-Abdeckung: 88.7% der im Rahmen liegenden Dockhand-Endpunkte (282/318) haben ein MCP-Tool — siehe docs/coverage.md für die vollständige, automatisch aktualisierte Aufschlüsselung nach Bereich.

Dockhand ist ein Docker-Verwaltungsserver, der über Hawser-Agenten eine Verbindung zu mehreren Docker-Hosts herstellt. Dieser MCP-Server bietet vollständigen programmatischen Zugriff auf alle Dockhand-Funktionen.

Funktionen

  • 280+ MCP-Tools für die Dockhand-API — siehe docs/coverage.md für die genaue, automatisch aktualisierte Abdeckung

  • Streamable-HTTP-Transport (MCP-Spezifikation 2025-03-26) für das Hosten in Docker-Containern

  • Sitzungsbasierte Authentifizierung mit automatischem Relogin bei 401

  • SSE-Unterstützung für Deploy-Operationen (start, stop, down, restart)

  • Umgebungsfilter, erzwungen für alle Container-/Stack-/Image-/Netzwerk-/Volume-Endpunkte

  • Docker-bereit mit mehrstufigem Build, Nicht-Root-Benutzer und Health Checks

Related MCP server: dockhand-mcp

Schnellstart

Docker (empfohlen)

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

Aus dem Quellcode

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

Konfiguration

Variable

Required

Default

Description

DOCKHAND_URL

Ja

-

Dockhand-Server-URL

DOCKHAND_USERNAME

Ja

-

Dockhand-Benutzername

DOCKHAND_PASSWORD

Ja

-

Dockhand-Passwort

MCP_PORT

Nein

8080

Port für den MCP-Server

MCP_SESSION_TTL_SECONDS

Nein

1800

Inaktivitäts-Timeout, bevor eine aufbewahrte MCP-Sitzung abläuft

MCP_SESSION_CLEANUP_INTERVAL_SECONDS

Nein

300

Intervall zum Entfernen abgelaufener Sitzungen (auf die Sitzungs-TTL begrenzt)

MCP_MAX_SESSIONS

Nein

0

Maximale Anzahl aufbewahrter Sitzungen; 0 behält das bisherige unbegrenzte Verhalten bei

MCP_HOST

Nein

0.0.0.0

Lauschadresse. Standardmäßig als Wildcard-Adresse belassen, damit der veröffentlichte Docker-Port (-p 8080:8080 / docker-compose.yml) weiterhin funktioniert; siehe Sichern des Transports für die empfohlene Methode, den Endpunkt zu schützen, anstatt nur Loopback zu binden

MCP_ALLOWED_HOSTS

Nein

(nicht gesetzt — Host-Prüfung deaktiviert)

Kommagetrennte Zulassungsliste für den Host-Header für /mcp (DNS-Rebinding-Schutz). Opt-in: Nicht gesetzt bedeutet keine Host-Prüfung (bisheriges Verhalten, damit bestehende Bereitstellungen durch ein Update nicht beschädigt werden). Empfohlen, sobald Sie es eingerichtet haben — siehe Sichern des Transports

MCP_ALLOWED_ORIGINS

Nein

(nicht gesetzt — Origin-Prüfung deaktiviert)

Kommagetrennte Zulassungsliste für den Origin-Header für /mcp. Opt-in, wie oben. Wird nur erzwungen, wenn ein Aufrufer tatsächlich einen Origin-Header sendet (Nicht-Browser-MCP-Clients tun das normalerweise nicht)

MCP_AUTH_TOKEN

Nein

(nicht gesetzt — Endpunkt nicht authentifiziert)

Gemeinsames Geheimnis, das bei jeder /mcp-Anfrage als Authorization: Bearer <token> erforderlich ist. Opt-in; empfohlen, sobald der Endpunkt über Ihren eigenen Loopback hinaus erreichbar ist — siehe Sichern des Transports

LOG_LEVEL

Nein

info

error, warn, info oder debug. debug fügt eine Zeile pro Dockhand-Anfrage hinzu (Methode, Endpunktvorlage, Status, Dauer). Bei Anfragen über den Client umfasst die Dauer den gesamten Antworttext, und ein Feld bytes für die Antwortgröße wird hinzugefügt; die Login- und Self-Check-Tests (die den Client bootstrappen und daher nicht darüber laufen können) protokollieren die Zeit bis zu den Headern ohne ein bytes-Feld. Niemals ein Pfadsegment oder ein Parameterwert. Ein nicht erkannter Wert erzeugt eine Warnung und fällt auf info zurück.

TRUSTED_PROXIES

Nein

(leer)

Kommagetrennte Adressen oder CIDRs, die X-Forwarded-For / X-Real-IP setzen dürfen, z. B. 10.0.0.0/8, 100.64.0.0/10. Leer bedeutet, dass die Header ignoriert und die Peer-Adresse verwendet wird.

Sichern des Transports

/mcp bindet standardmäßig an 0.0.0.0:8080 (siehe MCP_HOST oben) und akzeptiert ohne Konfiguration — wenn weder MCP_ALLOWED_HOSTS, MCP_ALLOWED_ORIGINS noch MCP_AUTH_TOKEN gesetzt sind — jede Anfrage ohne Host-/Origin-Prüfung und ohne Authentifizierung. Dies ist dasselbe Verhalten, das mcp-dockhand schon immer hatte, und wurde bewusst als Standard beibehalten: Wenn eine Prüfung standardmäßig aktiviert wäre, würden Anfragen von jedem Client abgelehnt, der den Server nicht als localhost/127.0.0.1 erreicht (eine LAN-IP, ein Reverse-Proxy, ein Docker-Netzwerk-Alias), was bestehende Bereitstellungen bei einem routinemäßigen Update beschädigen würde.

Sie sollten dies aktivieren, sobald /mcp über die Loopback-Schnittstelle Ihrer eigenen Maschine hinaus erreichbar ist — der Server verfügt über eine Dockhand-Admin-Anmeldeinformation, und jeder Tool-Aufruf handelt mit dieser Identität, sodass jeder, der eine MCP-Sitzung öffnen kann, Docker kontrolliert (Container-Exec, Host-Bind-Mounts über create_container, Datei-Lesen/-Schreiben, gespeicherte Git-Anmeldedaten). Wenn kein Schutz konfiguriert ist, protokolliert der Server beim Start eine [security] WARNING als Erinnerung. Drei unabhängige, alle optional aktivierbare Ebenen sind verfügbar:

  1. Host-Allowlist (MCP_ALLOWED_HOSTS). Sobald sie auf einen nicht-leeren Wert gesetzt ist, wird jede Anfrage an /mcpPOST, GET und DELETE – mit 403 abgelehnt, sofern ihr Host-Header nicht der Allowlist entspricht. Dies ist die primäre Verteidigung gegen DNS-Rebinding: Eine bösartige Webseite kann den Browser des Betreibers nicht dazu bringen, den Server unter einem Host-Wert zu erreichen, den die Allowlist akzeptiert. Setzen Sie sie darauf, wie Ihr Client den Server tatsächlich erreicht – localhost:8080/127.0.0.1:8080 für das dokumentierte lokale Setup, oder, wenn Sie sich direkt über eine Adresse statt über localhost verbinden (einschließlich des weiter unten beschriebenen mcp-proxy-Fernserver-Setups), auf das exakte host:port, das Ihr Client sendet, z. B. 100.100.50.40:8222. Wenn Sie das falsch einstellen, wird jede Anfrage mit 403 Invalid Host header abgelehnt – prüfen Sie die Meldung, sie gibt den erkannten Host-Wert wieder.

  2. Origin-Allowlist (MCP_ALLOWED_ORIGINS). Sobald gesetzt, wird jede Anfrage, die doch einen Origin-Header sendet, der nicht in der Liste steht, mit 403 abgelehnt. Ein fehlender Origin-Header wird immer durchgelassen (der eigene MCP-Client des SDKs und die meisten Nicht-Browser-Tools senden keinen), daher ist dies nur nützlich, wenn ein browserbasierter Client direkt mit /mcp kommuniziert; die Host-Allowlist oben ist es, die DNS-Rebinding tatsächlich stoppt.

  3. Bearer-Token (MCP_AUTH_TOKEN). Sobald gesetzt, muss jede /mcp-Anfrage Authorization: Bearer <token> enthalten, andernfalls wird sie mit 401 abgelehnt; der Vergleich erfolgt in konstanter Zeit. Empfohlen zusammen mit der Host-Allowlist für jede Bereitstellung, die von mehr als nur dem eigenen Rechner des Betreibers aus erreichbar ist.

# .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`>

Absichern des Servers mit CrowdSec

Der Server schreibt für jede Anfrage eine Zugriffszeile im nginx-Format nach stdout, einschließlich der abgelehnten, während das strukturierte Anwendungsprotokoll nach stderr geht. CrowdSec parst die Zugriffszeilen mit seinen Standard-Kollektionen – kein benutzerdefinierter Parser erforderlich.

Fügen Sie auf dem Host, auf dem Ihr CrowdSec-Agent läuft, eine Akquisitionsdatei hinzu:

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

Beide Labels sind erforderlich, und keines von beiden meldet sich lautstark, wenn man es vergisst. type: docker aktiviert crowdsecurity/docker-logs, das den JSON-Envelope von Docker entpackt. program: nginx-mcp aktiviert crowdsecurity/nginx-logs, das auf program mit Präfix nginx abgleicht – das Suffix -mcp hält diese Quelle von Ihren anderen nginx-Quellen unterscheidbar. Fehlt ein Label, erzeugt die Kette schlicht nichts, und nichts meldet es.

Nach der Einrichtung greifen die Standard-Szenarien:

Szenario

Bedeutung hier

LePresidente/http-generic-401-bf

Wiederholte 401 auf /mcp – jemand rät MCP_AUTH_TOKEN

crowdsecurity/http-dos-swithcing-ua

Anforderungsfluten mit rotierenden User-Agents

Eine 403 ist ebenfalls beachtenswert: Sie bedeutet, dass eine Anfrage die MCP_ALLOWED_HOSTS- oder MCP_ALLOWED_ORIGINS-Prüfung nicht bestanden hat, was aus dieser Perspektive wie ein DNS-Rebinding-Versuch aussieht.

Das Standard-401-Szenario zählt nur POST. Sein Filter ist evt.Parsed.verb == 'POST' – ein Literal, keine Liste. Dieser Server bedient POST, GET und DELETE auf /mcp, und die Bearer-Prüfung läuft allen dreien voraus, sodass ein falsches Token auf GET /mcp oder DELETE /mcp genauso 401 zurückgibt wie bei POST – und LePresidente/http-generic-401-bf zählt diese nie. Jemand, der MCP_AUTH_TOKEN über GET /mcp errät, ist dafür unsichtbar.

Dies ist eine Eigenschaft des Upstream-Szenarios, die jede nginx-Bereitstellung teilt, die es verwendet – nicht etwas, das das Protokollformat dieses Servers beheben kann. Um das zu schließen, fügen Sie ein lokales Szenario hinzu, das den verb-Filter entfernt oder die drei Methoden abgleicht, die dieser Server beantwortet. Behandeln Sie die obige Zeile bis dahin als „wiederholte 401 auf POST /mcp“.

Setzen Sie TRUSTED_PROXIES, bevor Sie dies aktivieren. Hinter einem Reverse-Proxy kommt jede Anfrage von der Adresse des Proxys. Ohne TRUSTED_PROXIES wird diese Adresse protokolliert – der erste von CrowdSec ausgesprochene Bann nimmt also den Proxy mit aus dem Verkehr und damit jeden Benutzer dahinter. Setzen Sie sie auf die Adresse oder das Subnetz, aus dem Ihr Proxy spricht.

Die Einstellung ist auch in die andere Richtung bewusst gewählt: Die Weiterleitungs-Header werden nur von einem Peer auf dieser Liste akzeptiert. Ihnen bedingungslos zu vertrauen, würde es jedem direkten Aufrufer erlauben, einen beliebigen Dritten zu benennen und dessen Sperrung zu veranlassen.

Eine erwartete Nebenwirkung: Die strukturierten JSON-Zeilen teilen sich den Container-Logstream und tragen dasselbe program-Label, sodass sie das nginx-Muster nicht erfüllen und in cscli metrics als unparsed zählen. Das ist Rauschen, kein Fehler – kein Alarm, keine Entscheidung.

MCP-Client-Konfiguration

Claude Desktop / Claude Code

Fügen Sie zu Ihren MCP-Einstellungen hinzu:

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

Wenn der Server ein Bearer-Token erzwingt (MCP_AUTH_TOKEN gesetzt – siehe Sichern des Transports), muss der Client es als Authorization-Header senden, andernfalls wird jede Anfrage mit 401 abgelehnt. In der .mcp.json von Claude Code fügen Sie einen headers-Block hinzu – referenzieren Sie eine Umgebungsvariable, damit das Token nie in der (oft versionsverwalteten) Konfigurationsdatei lebt:

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

Senden Sie das Token nur über einen verschlüsselten Transport. Ein Bearer-Token über unverschlüsseltes http:// in einem gemeinsamen Netzwerk kann mitgelesen werden – beenden Sie TLS an einem Reverse-Proxy oder erreichen Sie den Server über eine WireGuard/Tailscale/VPN-Verbindung (das HTTP auf Anwendungsebene wird dann vom Tunnel verschlüsselt).

Exportieren Sie DOCKHAND_MCP_TOKEN in der Umgebung, aus der Claude Code gestartet wird (z. B. aus einer gitignorieten .env, die Sie vor dem Start sourcen). Der Host/das host:port, mit dem Sie sich verbinden, muss außerdem in MCP_ALLOWED_HOSTS des Servers stehen, falls diese Allowlist gesetzt ist. Für Claude Desktop (die native Konfiguration hat kein headers-Feld) übergeben Sie das Token über die mcp-proxy-Lösung unten – mcp-proxy leitet einen Authorization-Header über seine eigene Umgebung/Argumente weiter.

Claude Desktop mit einem entfernten Server (mcp-proxy)

Claude Desktop kann mit der nativen "url"-Konfiguration oben keine Verbindung zu einem entfernten mcp-dockhand-Server (nicht localhost) herstellen, selbst wenn der Endpunkt selbst erreichbar ist. Das Symptom ist ein allgemeiner "not a valid MCP server"-Fehler in Claude Desktop, während eine einfache Browser-/curl-Anfrage an dieselbe URL korrekt {"error":"Invalid or missing session ID"} zurückgibt. Dies ist eine bekannte Einschränkung von Claude Desktop mit entfernten Streamable-HTTP-Servern, kein mcp-dockhand-Fehler.

Lösung: Wickeln Sie die Verbindung mit mcp-proxy, das Streamable HTTP in stdio übersetzt – einen Transport, den Claude Desktop zuverlässig verarbeitet:

{
  "mcpServers": {
    "dockhand": {
      "command": "/path/to/mcp-proxy",
      "args": ["--transport", "streamablehttp", "http://your-server:8080/mcp"]
    }
  }
}

Alle Tools laden und funktionieren über den Proxy korrekt. Dank an @deadrubberboy für die Meldung und das Teilen der Lösung (#90).

Tool-Referenz

Container (27 Tools)

Tool

Beschreibung

list_containers

Alle Container in einer Umgebung auflisten

get_container

Container-Details abrufen

inspect_container

Docker inspect (vollständige Details)

get_container_logs

Container-Logs abrufen

get_container_stats

Statistiken zur Ressourcennutzung abrufen

get_container_top

Laufende Prozesse abrufen

start_container

Einen Container starten

stop_container

Einen Container stoppen

restart_container

Einen Container neu starten

pause_container

Einen Container pausieren

unpause_container

Einen Container fortsetzen

rename_container

Einen Container umbenennen

update_container

Container-Einstellungen aktualisieren

create_container

Einen neuen Container erstellen

get_container_shells

Verfügbare Shells auflisten

exec_container

Eine Terminal-Exec-Sitzung erstellen (execId + WS-Verbindungsinfo); führt KEINEN einmaligen Befehl aus und gibt keine Ausgabe zurück — ein solcher Endpunkt existiert in der Dockhand-API nicht

list_container_files

Dateien im Container durchsuchen

get_container_file_content

Datei aus Container lesen

create_container_file

Eine leere Datei oder ein leeres Verzeichnis im Container erstellen (kein Inhalt — verwenden Sie dafür write_container_file_content)

delete_container_file

Datei im Container löschen

rename_container_file

Datei im Container umbenennen

chmod_container_file

Dateiberechtigungen ändern

check_container_updates

Nach Image-Updates suchen

get_pending_updates

Ausstehende Updates abrufen

batch_update_containers

Container stapelweise aktualisieren

execute_batch

Eine Massen-Lebenszyklusoperation (start/stop/restart/remove usw.) über Container, Images, Volumes, Netzwerke oder Stacks ausführen

get_container_sizes

Container-Datenträgergrößen abrufen

get_containers_stats

Aggregierte Statistiken abrufen

Stacks (21 Tools)

Tool

Beschreibung

list_stacks

Alle Stacks auflisten

get_stack

Stack-Details abrufen

create_stack

Einen Stack erstellen und optional bereitstellen

start_stack

Einen Stack starten (compose up)

stop_stack

Einen Stack stoppen (compose stop)

restart_stack

Einen Stack neu starten

down_stack

Einen Stack herunterfahren (compose down)

delete_stack

Einen Stack löschen

get_stack_compose

Compose-Datei lesen

update_stack_compose

Compose-Datei aktualisieren

get_stack_env

Umgebungsvariablen lesen

update_stack_env

Umgebungsvariablen aktualisieren (merge standardmäßig — sicher für partielle Aktualisierungen; verwenden Sie mode="replace", um alle zu überschreiben)

get_stack_env_raw

Rohe .env-Datei lesen

validate_stack_env

Env-Variablen validieren

scan_stacks

Dateisystem nach Stacks durchsuchen

adopt_stack

Einen nicht verfolgten Stack übernehmen

relocate_stack

Stack an neuen Pfad verschieben

get_stack_sources

Stack-Quellen abrufen

get_stack_base_path

Basis-Pfad abrufen

get_stack_path_hints

Pfadvorschläge abrufen

validate_stack_path

Einen Stack-Pfad validieren

Images (9)

Tool

Beschreibung

list_images

Alle Images auflisten

get_image

Image-Details abrufen

get_image_history

Image-Layer-Verlauf abrufen

tag_image

Ein Image taggen

remove_image

Ein Image entfernen

pull_image

Ein Image pullen

push_image

Ein Image pushen

scan_image

Schwachstellenscan (Trivy/Grype)

export_image

Image als Tarball exportieren

Umgebungen (18)

Tool

Beschreibung

list_environments

Alle Umgebungen auflisten

get_environment

Umgebungsdetails abrufen

create_environment

Eine Umgebung erstellen

update_environment

Eine Umgebung aktualisieren

delete_environment

Eine Umgebung löschen

test_environment

Verbindung testen

test_environment_connection

Ohne Speichern testen

detect_docker_socket

Socket automatisch erkennen

get_environment_timezone

Zeitzone abrufen

set_environment_timezone

Zeitzone festlegen

get_environment_update_check

Update-Check-Einstellungen abrufen

set_environment_update_check

Update-Check-Einstellungen festlegen

get_environment_image_prune

Image-Prune-Einstellungen abrufen

set_environment_image_prune

Image-Prune-Einstellungen festlegen

list_environment_notifications

Benachrichtigungen auflisten

create_environment_notification

Benachrichtigung erstellen

get_environment_notification

Benachrichtigung abrufen

delete_environment_notification

Benachrichtigung löschen

Netzwerke (7)

Tool

Beschreibung

list_networks

Alle Netzwerke auflisten

get_network

Netzwerkdetails abrufen

inspect_network

Netzwerk inspizieren

create_network

Ein Netzwerk erstellen

remove_network

Ein Netzwerk entfernen

connect_container_to_network

Container verbinden

disconnect_container_from_network

Container trennen

Volumes (9 Tools)

Tool

Beschreibung

list_volumes

Alle Volumes auflisten

get_volume

Volume-Details abrufen

inspect_volume

Volume prüfen

browse_volume

Dateien im Volume durchsuchen

get_volume_file_content

Datei aus Volume lesen

release_volume_browse

Browse-Sitzung freigeben

clone_volume

Volume klonen

export_volume

Volume exportieren

remove_volume

Volume entfernen (zerstörend)

Git-Stacks (15 Tools)

Tool

Beschreibung

list_git_stacks

Git-basierte Stacks auflisten

get_git_stack

Git-Stack-Details abrufen

deploy_git_stack

Git-Stack bereitstellen (SSE)

sync_git_stack

Mit Remote-Repository synchronisieren

test_git_stack

Git-Verbindung testen

get_git_stack_env_files

Env-Dateien abrufen

trigger_git_webhook

Webhook auslösen

get_git_webhook

Webhook-Details abrufen

list_git_credentials

Git-Anmeldedaten auflisten

create_git_credential

Git-Anmeldedaten erstellen

get_git_credential

Anmeldedaten-Details abrufen

update_git_credential

Anmeldedaten aktualisieren

delete_git_credential

Anmeldedaten löschen

list_git_repositories

Git-Repositories auflisten

create_git_repository

Repository-Konfiguration erstellen

Dashboard & Aktivität (8 Tools)

Tool

Beschreibung

get_dashboard_stats

Dashboard-Statistiken abrufen

get_dashboard_preferences

Anzeigeeinstellungen abrufen

set_dashboard_preferences

Anzeigeeinstellungen festlegen

get_activity_feed

Aktivitätsfeed abrufen

get_container_activity

Container-Aktivität

get_activity_events

Aktivitätsereignisse

get_activity_stats

Aktivitätsstatistiken

get_merged_logs

Zusammengeführte Logs aus Containern

Auth & Hawser (12 Tools)

Tool

Beschreibung

get_auth_session

Sitzungsstatus prüfen

get_auth_providers

Auth-Anbieter auflisten

get_auth_settings

Auth-Einstellungen abrufen

create_oidc_provider

OIDC-Anbieter erstellen

get_oidc_provider

OIDC-Anbieter abrufen

test_oidc_provider

OIDC-Anbieter testen

create_ldap_provider

LDAP-Anbieter erstellen

get_ldap_provider

LDAP-Anbieter abrufen

test_ldap_provider

LDAP-Anbieter testen

list_hawser_tokens

Hawser-Tokens auflisten

create_hawser_token

Hawser-Token erstellen

revoke_hawser_token

Hawser-Token widerrufen

Audit (4 Tools)

Tool

Beschreibung

get_audit_log

Audit-Log abrufen

get_audit_events

Audit-Ereignistypen abrufen

get_audit_users

Audit-Daten nach Benutzer

export_audit_log

Audit-Log exportieren

Benachrichtigungen (8 Tools)

Tool

Beschreibung

list_notifications

Benachrichtigungen auflisten

create_notification

Benachrichtigung erstellen

get_notification

Benachrichtigung abrufen

update_notification

Benachrichtigung aktualisieren

delete_notification

Benachrichtigung löschen

test_notification

Benachrichtigung testen

test_notification_config

Ohne Speichern testen

trigger_test_notification

Echtes Test-Ereignis für einen bestimmten Ereignistyp + Payload auslösen

Registries (10 Tools)

Tool

Beschreibung

list_registries

Registries auflisten

create_registry

Registry hinzufügen

get_registry

Registry-Details abrufen

update_registry

Registry aktualisieren

delete_registry

Registry löschen

set_default_registry

Als Standard festlegen

search_registry

Registry durchsuchen

get_registry_catalog

Katalog abrufen

get_registry_image

Image aus Registry abrufen

get_registry_tags

Image-Tags abrufen

System & Einstellungen (19 Tools)

Tool

Beschreibung

health_check

Server-Health

health_check_database

Datenbank-Health

get_host_info

Host-Informationen

get_system_info

Systeminformationen

get_system_disk

Speicherplatznutzung

list_system_files

Systemdateien auflisten

get_system_file_content

Systemdatei lesen

get_changelog

Changelog

get_dependencies

Abhängigkeiten

get_general_settings

Allgemeine Einstellungen

update_general_settings

Einstellungen aktualisieren

get_theme_settings

Theme-Einstellungen

update_theme_settings

Theme aktualisieren

get_scanner_settings

Scanner-Einstellungen

update_scanner_settings

Scanner aktualisieren

get_license

Lizenzinformationen

activate_license

Lizenz nach Name und Schlüssel aktivieren

get_prometheus_metrics

Prometheus-Metriken

prune_all

Alle Ressourcen bereinigen

Benutzer, Rollen & Einstellungen (20 Tools)

Tool

Beschreibung

list_users

Benutzer auflisten

create_user

Benutzer erstellen

get_user

Benutzerdetails abrufen

update_user

Benutzer aktualisieren

delete_user

Benutzer löschen

get_user_mfa_status

MFA-Status

enable_user_mfa

MFA aktivieren

disable_user_mfa

MFA deaktivieren

get_user_roles

Benutzerrollen abrufen

add_user_role

Eine Rolle einem Benutzer zuweisen (kein Massenersatz)

remove_user_role

Eine Rolle von einem Benutzer entfernen

list_roles

Rollen auflisten

create_role

Rolle mit Name + Berechtigungsobjekt erstellen

get_role

Rolle abrufen

update_role

Rolle aktualisieren

delete_role

Rolle löschen

get_profile

Eigenes Profil abrufen

update_profile

Eigenes Profil aktualisieren

get_favorites

Favoriten abrufen

set_favorites

Favoriten festlegen

list_config_sets

Konfigurationssätze auflisten

Zeitpläne (9 Tools)

Tool

Beschreibung

list_schedules

Zeitpläne auflisten

get_schedule_settings

Einstellungen abrufen

update_schedule_settings

Einstellungen aktualisieren

get_schedule_executions

Ausführungsverlauf

get_schedule_execution

Ausführungsdetails

get_schedule

Zeitplan abrufen

run_schedule_now

Sofort ausführen

toggle_schedule

Aktivieren/Deaktivieren

toggle_system_schedule

Systemzeitplan umschalten

Auto-Update (3 Tools)

Tool

Beschreibung

get_auto_update_settings

Alle Auto-Update-Einstellungen abrufen

get_container_auto_update

Container-Auto-Update abrufen

set_container_auto_update

Auto-Update-Richtlinie festlegen

Selbsthilfe-/Meta-Tools (6 Tools)

Diagnose für diesen MCP-Server selbst, abweichend von den Dockhand-API-Tools oben — nützlich für einen Client oder Betreiber, der fragt: „Ist dieser Server gesund und korrekt konfiguriert?" und nicht „Ist Dockhand gesund?". Keines dieser sechs Tools akzeptiert Eingabeargumente, und keines kapselt einen einzelnen Dockhand-Endpunkt wie die Tabellen oben (get_tool_manifest und get_runtime_stats rufen überhaupt keinen Dockhand-Endpunkt auf) — siehe src/tools/meta.ts.

Tool

Beschreibung

get_server_info

Eigene Version dieses Servers, Git-SHA, Build-Datum, Betriebszeit, MCP-Protokollversion und die Dockhand-URL/Serverversion, mit der er verbunden ist

check_for_update

Vergleicht die laufende Version dieses Servers mit der neuesten GitHub-Version (TTL-zwischengespeichert)

get_tool_manifest

Listet jedes registrierte Tool mit seinem Dockhand {method, path} sowie den fixierten Dockhand-OpenAPI-Commit/die Version, gegen die die Tools dieses Servers generiert wurden

self_check

End-to-End-Diagnose: Dockhand-Erreichbarkeit, Gültigkeit der Anmeldedaten und eine Live-Erreichbarkeitsprüfung pro Umgebung (POST /api/environments/{id}/test, parallel mit einem 5s-Timeout pro Umgebung) plus Hawser-Agent-Verbindungsstatus, in einem Aufruf

validate_config

Prüft, ob die erforderlichen Umgebungsvariablen DOCKHAND_URL/DOCKHAND_USERNAME/DOCKHAND_PASSWORD vorhanden sind und ob sie sich erfolgreich authentifizieren

get_runtime_stats

In-Process-Zähler für diesen Server: Gesamt-/Pro-Tool-Aufruf- und Fehlerzahlen, Betriebszeit sowie Tool/Meldung/Zeitstempel des letzten Fehlers

Hinweise:

  • check_for_update benötigt ausgehenden Netzwerkzugriff auf api.github.com (die Releases-API von GitHub) — es degradiert zu updateAvailable: null, anstatt zu scheitern, falls diese nicht erreichbar ist.

  • Kein Meta-Tool legt einen geheimen Wert offen. validate_config meldet nur, ob die erforderlichen Umgebungsvariablen vorhanden sind (boolesche Werte) und ob sie authentifizieren (ein boolescher Wert + der rohe HTTP-Statuscode, z. B. 200/401) — niemals die Anmeldedatenwerte selbst. self_check meldet die Gültigkeit der Authentifizierung auf dieselbe Weise. lastError von get_runtime_stats enthält nur einen Toolnamen, eine Fehlermeldung und einen Zeitstempel — niemals Aufrufargumente oder Antwort-Payloads. Diese Fehlermeldung ist jedoch nicht vollständig undurchsichtig: Bei einem fehlgeschlagenen Dockhand-API-Aufruf kann sie einen Ausschnitt des vorgelagerten HTTP-Status und des Antworttexts einbetten (über die eigene Dockhand API error: ... returned <status>: <body>-Meldung von DockhandClient), und sie wird an denjenigen MCP-Client zurückgegeben, der als Nächstes get_runtime_stats aufruft — nicht unbedingt an den, der den ursprünglichen Fehler ausgelöst hat. Sie enthält niemals Anfragetexte oder Anmeldedatenwerte und wird auf 500 Zeichen gekürzt (mit einem Auslassungszeichen), bevor sie gespeichert wird, sodass eine übermäßig große vorgelagerte Antwort niemals vollständig zurückgegeben wird.

Wichtige Hinweise

update_stack_env — Zusammenführen- vs. Ersetzen-Semantik

Der Dockhand-REST-Endpunkt PUT /api/stacks/{name}/env hat Ersetzen-Semantik: Das Übermitteln einer partiellen Variablenliste löscht stillschweigend alle anderen Variablen aus dem Stack. Ein Update einer einzelnen Variablen würde alles andere löschen.

Um versehentlichen Datenverlust zu verhindern, verwendet dieses MCP-Tool standardmäßig den Zusammenführen-Modus:

  1. Es ruft die aktuelle Variablenliste über GET /api/stacks/{name}/env ab.

  2. Es führt die eingehenden Variablen nach Schlüssel zusammen (neue Werte überschreiben vorhandene bei Schlüsselkollision).

  3. Es schreibt die vollständige kombinierte Liste über PUT zurück.

# 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")

Verwenden Sie mode="replace" nur, wenn Sie die gesamte Variablengruppe absichtlich ersetzen möchten.

Umgebungs-ID ist erforderlich

Die meisten Docker-Ressourcen-Endpunkte (Container, Stacks, Images, Netzwerke, Volumes) erfordern einen Parameter environmentId. Dieser wird auf den Abfrageparameter ?env=<id> in der Dockhand-API abgebildet. Ohne ihn geben die Endpunkte leere Arrays zurück.

SSE-Antworten

Bereitstellungsvorgänge (start, stop, down, restart, compose update with restart) geben Server-Sent Events zurück. Der MCP-Server parst diese automatisch und gibt das Endergebnis zurück.

Authentifizierung

Der Server verwendet sitzungsbasierte Cookie-Authentifizierung. Er:

  • Meldet sich bei der ersten Anfrage an

  • Speichert das Sitzungscookie im Speicher

  • Authentifiziert sich bei 401-Antworten erneut

  • Behandelt Sitzungszeitüberschreitung (24h)

Fehlerbehebung

Beginnen Sie mit LOG_LEVEL=debug. Jede Dockhand-Anfrage erscheint dann mit ihrem Endpunkt, Statuscode und ihrer Dauer, und jede Zeile eines einzelnen Aufrufs teilt sich eine call-Kennung — greppen Sie danach, um die gesamte Sequenz zu erhalten. Die req-Kennung verbindet diese Zeilen mit der Zugriffszeile, die sie ausgelöst hat, und sid umfasst alles, was ein Client während seiner gesamten Sitzung getan hat. Bei Anfragen über den Client ist ms die vollständige Anfragedauer — sie umfasst das Lesen des Antworttexts, nicht nur die Zeit bis zum Eintreffen der Antwortheader, sodass sie widerspiegelt, was eine langsame oder stockende gestreamte Antwort (z. B. die SSE-Ausgabe einer Bereitstellung) tatsächlich gekostet hat — und bytes ist die Größe des tatsächlich gelesenen Texts. (Die Anmelde- und Selbstprüf-Sonden bootstrappen den Client und können nicht über ihn geleitet werden, daher protokollieren ihre Zeilen die Zeit bis zu den Headern ohne ein bytes-Feld.) Eine fehlgeschlagene Dockhand-Anfrage protokolliert zusätzlich eine warn-Zeile mit errType — dem Ausnahmenamen (z. B. TimeoutError, TypeError), einem begrenzten Vokabular statt freiem Text — sodass Sie Fehler nach Fehlertyp filtern können. Diese Warnzeile wird sowohl ausgelöst, wenn die Anfrage selbst fehlschlug, bevor eine Antwort eintraf, als auch, wenn das Lesen eines Antworttexts teilweise fehlschlug (z. B. ein SSE-Stream, der mitten im Stream sein Timeout erreicht) — in beiden Fällen spiegelt ms wider, wie lange es gedauert hat, bis der Fehler auftrat.

Entwicklung

# 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

Linting

npm run lint lintet src/ und tests/ mit zwei Regeln: no-unused-vars und no-explicit-any. Da typescript-eslint den festgepinnten typescript@^7.0.2-Compiler nicht unterstützt — es wirft bei TS 7.0 einen harten Fehler, nicht nur eine Peer-Warnung: siehe typescript-eslint#10940 — läuft das Linting in einem Wegwerf-node:22-Container mit festgepinntem TypeScript 5 (die Sprache ist über TS 5/6/7 identisch; nur der Compiler unterscheidet sich). Es mountet src/, tests/ und eslint.config.js schreibgeschützt, daher ist Docker erforderlich, um es auszuführen. Dasselbe Skript läuft als harte Hürde in CI. Ungenutzte Importe/Lokale werden zusätzlich nativ auf TS 7 von tsc erkannt (noUnusedLocals/noUnusedParameters in tsconfig.tests.json, über npm run typecheck:tests).

Lizenz

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