mcp-dockhand
MCP Dockhand
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.mdfür die genaue, automatisch aktualisierte AbdeckungStreamable-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:latestDocker 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-passwordAus 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 startKonfiguration
Variable | Required | Default | Description |
| Ja | - | Dockhand-Server-URL |
| Ja | - | Dockhand-Benutzername |
| Ja | - | Dockhand-Passwort |
| Nein |
| Port für den MCP-Server |
| Nein |
| Inaktivitäts-Timeout, bevor eine aufbewahrte MCP-Sitzung abläuft |
| Nein |
| Intervall zum Entfernen abgelaufener Sitzungen (auf die Sitzungs-TTL begrenzt) |
| Nein |
| Maximale Anzahl aufbewahrter Sitzungen; |
| Nein |
| Lauschadresse. Standardmäßig als Wildcard-Adresse belassen, damit der veröffentlichte Docker-Port ( |
| Nein | (nicht gesetzt — Host-Prüfung deaktiviert) | Kommagetrennte Zulassungsliste für den |
| Nein | (nicht gesetzt — Origin-Prüfung deaktiviert) | Kommagetrennte Zulassungsliste für den |
| Nein | (nicht gesetzt — Endpunkt nicht authentifiziert) | Gemeinsames Geheimnis, das bei jeder |
| Nein |
|
|
| Nein | (leer) | Kommagetrennte Adressen oder CIDRs, die |
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:
Host-Allowlist (
MCP_ALLOWED_HOSTS). Sobald sie auf einen nicht-leeren Wert gesetzt ist, wird jede Anfrage an/mcp–POST,GETundDELETE– mit403abgelehnt, sofern ihrHost-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:8080für das dokumentierte lokale Setup, oder, wenn Sie sich direkt über eine Adresse statt überlocalhostverbinden (einschließlich des weiter unten beschriebenen mcp-proxy-Fernserver-Setups), auf das exaktehost:port, das Ihr Client sendet, z. B.100.100.50.40:8222. Wenn Sie das falsch einstellen, wird jede Anfrage mit403 Invalid Host headerabgelehnt – prüfen Sie die Meldung, sie gibt den erkannten Host-Wert wieder.Origin-Allowlist (
MCP_ALLOWED_ORIGINS). Sobald gesetzt, wird jede Anfrage, die doch einenOrigin-Header sendet, der nicht in der Liste steht, mit403abgelehnt. Ein fehlenderOrigin-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/mcpkommuniziert; die Host-Allowlist oben ist es, die DNS-Rebinding tatsächlich stoppt.Bearer-Token (
MCP_AUTH_TOKEN). Sobald gesetzt, muss jede/mcp-AnfrageAuthorization: Bearer <token>enthalten, andernfalls wird sie mit401abgelehnt; 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-mcpBeide 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 |
| Wiederholte |
| 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 istevt.Parsed.verb == 'POST'– ein Literal, keine Liste. Dieser Server bedientPOST,GETundDELETEauf/mcp, und die Bearer-Prüfung läuft allen dreien voraus, sodass ein falsches Token aufGET /mcpoderDELETE /mcpgenauso401zurückgibt wie beiPOST– undLePresidente/http-generic-401-bfzählt diese nie. Jemand, derMCP_AUTH_TOKENüberGET /mcperrä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 „wiederholte401aufPOST/mcp“.
Setzen Sie
TRUSTED_PROXIES, bevor Sie dies aktivieren. Hinter einem Reverse-Proxy kommt jede Anfrage von der Adresse des Proxys. OhneTRUSTED_PROXIESwird 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_TOKENgesetzt – siehe Sichern des Transports), muss der Client es alsAuthorization-Header senden, andernfalls wird jede Anfrage mit401abgelehnt. In der.mcp.jsonvon Claude Code fügen Sie einenheaders-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_TOKENin der Umgebung, aus der Claude Code gestartet wird (z. B. aus einer gitignorieten.env, die Sie vor dem Startsourcen). DerHost/dashost:port, mit dem Sie sich verbinden, muss außerdem inMCP_ALLOWED_HOSTSdes Servers stehen, falls diese Allowlist gesetzt ist. Für Claude Desktop (die native Konfiguration hat keinheaders-Feld) übergeben Sie das Token über die mcp-proxy-Lösung unten – mcp-proxy leitet einenAuthorization-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 |
| Alle Container in einer Umgebung auflisten |
| Container-Details abrufen |
| Docker inspect (vollständige Details) |
| Container-Logs abrufen |
| Statistiken zur Ressourcennutzung abrufen |
| Laufende Prozesse abrufen |
| Einen Container starten |
| Einen Container stoppen |
| Einen Container neu starten |
| Einen Container pausieren |
| Einen Container fortsetzen |
| Einen Container umbenennen |
| Container-Einstellungen aktualisieren |
| Einen neuen Container erstellen |
| Verfügbare Shells auflisten |
| 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 |
| Dateien im Container durchsuchen |
| Datei aus Container lesen |
| Eine leere Datei oder ein leeres Verzeichnis im Container erstellen (kein Inhalt — verwenden Sie dafür |
| Datei im Container löschen |
| Datei im Container umbenennen |
| Dateiberechtigungen ändern |
| Nach Image-Updates suchen |
| Ausstehende Updates abrufen |
| Container stapelweise aktualisieren |
| Eine Massen-Lebenszyklusoperation (start/stop/restart/remove usw.) über Container, Images, Volumes, Netzwerke oder Stacks ausführen |
| Container-Datenträgergrößen abrufen |
| Aggregierte Statistiken abrufen |
Stacks (21 Tools)
Tool | Beschreibung |
| Alle Stacks auflisten |
| Stack-Details abrufen |
| Einen Stack erstellen und optional bereitstellen |
| Einen Stack starten (compose up) |
| Einen Stack stoppen (compose stop) |
| Einen Stack neu starten |
| Einen Stack herunterfahren (compose down) |
| Einen Stack löschen |
| Compose-Datei lesen |
| Compose-Datei aktualisieren |
| Umgebungsvariablen lesen |
| Umgebungsvariablen aktualisieren (merge standardmäßig — sicher für partielle Aktualisierungen; verwenden Sie |
| Rohe .env-Datei lesen |
| Env-Variablen validieren |
| Dateisystem nach Stacks durchsuchen |
| Einen nicht verfolgten Stack übernehmen |
| Stack an neuen Pfad verschieben |
| Stack-Quellen abrufen |
| Basis-Pfad abrufen |
| Pfadvorschläge abrufen |
| Einen Stack-Pfad validieren |
Images (9)
Tool | Beschreibung |
| Alle Images auflisten |
| Image-Details abrufen |
| Image-Layer-Verlauf abrufen |
| Ein Image taggen |
| Ein Image entfernen |
| Ein Image pullen |
| Ein Image pushen |
| Schwachstellenscan (Trivy/Grype) |
| Image als Tarball exportieren |
Umgebungen (18)
Tool | Beschreibung |
| Alle Umgebungen auflisten |
| Umgebungsdetails abrufen |
| Eine Umgebung erstellen |
| Eine Umgebung aktualisieren |
| Eine Umgebung löschen |
| Verbindung testen |
| Ohne Speichern testen |
| Socket automatisch erkennen |
| Zeitzone abrufen |
| Zeitzone festlegen |
| Update-Check-Einstellungen abrufen |
| Update-Check-Einstellungen festlegen |
| Image-Prune-Einstellungen abrufen |
| Image-Prune-Einstellungen festlegen |
| Benachrichtigungen auflisten |
| Benachrichtigung erstellen |
| Benachrichtigung abrufen |
| Benachrichtigung löschen |
Netzwerke (7)
Tool | Beschreibung |
| Alle Netzwerke auflisten |
| Netzwerkdetails abrufen |
| Netzwerk inspizieren |
| Ein Netzwerk erstellen |
| Ein Netzwerk entfernen |
| Container verbinden |
| Container trennen |
Volumes (9 Tools)
Tool | Beschreibung |
| Alle Volumes auflisten |
| Volume-Details abrufen |
| Volume prüfen |
| Dateien im Volume durchsuchen |
| Datei aus Volume lesen |
| Browse-Sitzung freigeben |
| Volume klonen |
| Volume exportieren |
| Volume entfernen (zerstörend) |
Git-Stacks (15 Tools)
Tool | Beschreibung |
| Git-basierte Stacks auflisten |
| Git-Stack-Details abrufen |
| Git-Stack bereitstellen (SSE) |
| Mit Remote-Repository synchronisieren |
| Git-Verbindung testen |
| Env-Dateien abrufen |
| Webhook auslösen |
| Webhook-Details abrufen |
| Git-Anmeldedaten auflisten |
| Git-Anmeldedaten erstellen |
| Anmeldedaten-Details abrufen |
| Anmeldedaten aktualisieren |
| Anmeldedaten löschen |
| Git-Repositories auflisten |
| Repository-Konfiguration erstellen |
Dashboard & Aktivität (8 Tools)
Tool | Beschreibung |
| Dashboard-Statistiken abrufen |
| Anzeigeeinstellungen abrufen |
| Anzeigeeinstellungen festlegen |
| Aktivitätsfeed abrufen |
| Container-Aktivität |
| Aktivitätsereignisse |
| Aktivitätsstatistiken |
| Zusammengeführte Logs aus Containern |
Auth & Hawser (12 Tools)
Tool | Beschreibung |
| Sitzungsstatus prüfen |
| Auth-Anbieter auflisten |
| Auth-Einstellungen abrufen |
| OIDC-Anbieter erstellen |
| OIDC-Anbieter abrufen |
| OIDC-Anbieter testen |
| LDAP-Anbieter erstellen |
| LDAP-Anbieter abrufen |
| LDAP-Anbieter testen |
| Hawser-Tokens auflisten |
| Hawser-Token erstellen |
| Hawser-Token widerrufen |
Audit (4 Tools)
Tool | Beschreibung |
| Audit-Log abrufen |
| Audit-Ereignistypen abrufen |
| Audit-Daten nach Benutzer |
| Audit-Log exportieren |
Benachrichtigungen (8 Tools)
Tool | Beschreibung |
| Benachrichtigungen auflisten |
| Benachrichtigung erstellen |
| Benachrichtigung abrufen |
| Benachrichtigung aktualisieren |
| Benachrichtigung löschen |
| Benachrichtigung testen |
| Ohne Speichern testen |
| Echtes Test-Ereignis für einen bestimmten Ereignistyp + Payload auslösen |
Registries (10 Tools)
Tool | Beschreibung |
| Registries auflisten |
| Registry hinzufügen |
| Registry-Details abrufen |
| Registry aktualisieren |
| Registry löschen |
| Als Standard festlegen |
| Registry durchsuchen |
| Katalog abrufen |
| Image aus Registry abrufen |
| Image-Tags abrufen |
System & Einstellungen (19 Tools)
Tool | Beschreibung |
| Server-Health |
| Datenbank-Health |
| Host-Informationen |
| Systeminformationen |
| Speicherplatznutzung |
| Systemdateien auflisten |
| Systemdatei lesen |
| Changelog |
| Abhängigkeiten |
| Allgemeine Einstellungen |
| Einstellungen aktualisieren |
| Theme-Einstellungen |
| Theme aktualisieren |
| Scanner-Einstellungen |
| Scanner aktualisieren |
| Lizenzinformationen |
| Lizenz nach Name und Schlüssel aktivieren |
| Prometheus-Metriken |
| Alle Ressourcen bereinigen |
Benutzer, Rollen & Einstellungen (20 Tools)
Tool | Beschreibung |
| Benutzer auflisten |
| Benutzer erstellen |
| Benutzerdetails abrufen |
| Benutzer aktualisieren |
| Benutzer löschen |
| MFA-Status |
| MFA aktivieren |
| MFA deaktivieren |
| Benutzerrollen abrufen |
| Eine Rolle einem Benutzer zuweisen (kein Massenersatz) |
| Eine Rolle von einem Benutzer entfernen |
| Rollen auflisten |
| Rolle mit Name + Berechtigungsobjekt erstellen |
| Rolle abrufen |
| Rolle aktualisieren |
| Rolle löschen |
| Eigenes Profil abrufen |
| Eigenes Profil aktualisieren |
| Favoriten abrufen |
| Favoriten festlegen |
| Konfigurationssätze auflisten |
Zeitpläne (9 Tools)
Tool | Beschreibung |
| Zeitpläne auflisten |
| Einstellungen abrufen |
| Einstellungen aktualisieren |
| Ausführungsverlauf |
| Ausführungsdetails |
| Zeitplan abrufen |
| Sofort ausführen |
| Aktivieren/Deaktivieren |
| Systemzeitplan umschalten |
Auto-Update (3 Tools)
Tool | Beschreibung |
| Alle Auto-Update-Einstellungen abrufen |
| Container-Auto-Update abrufen |
| 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 |
| Eigene Version dieses Servers, Git-SHA, Build-Datum, Betriebszeit, MCP-Protokollversion und die Dockhand-URL/Serverversion, mit der er verbunden ist |
| Vergleicht die laufende Version dieses Servers mit der neuesten GitHub-Version (TTL-zwischengespeichert) |
| Listet jedes registrierte Tool mit seinem Dockhand |
| End-to-End-Diagnose: Dockhand-Erreichbarkeit, Gültigkeit der Anmeldedaten und eine Live-Erreichbarkeitsprüfung pro Umgebung ( |
| Prüft, ob die erforderlichen Umgebungsvariablen |
| 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_updatebenötigt ausgehenden Netzwerkzugriff aufapi.github.com(die Releases-API von GitHub) — es degradiert zuupdateAvailable: null, anstatt zu scheitern, falls diese nicht erreichbar ist.Kein Meta-Tool legt einen geheimen Wert offen.
validate_configmeldet 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_checkmeldet die Gültigkeit der Authentifizierung auf dieselbe Weise.lastErrorvonget_runtime_statsenthä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 eigeneDockhand API error: ... returned <status>: <body>-Meldung vonDockhandClient), und sie wird an denjenigen MCP-Client zurückgegeben, der als Nächstesget_runtime_statsaufruft — 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:
Es ruft die aktuelle Variablenliste über
GET /api/stacks/{name}/envab.Es führt die eingehenden Variablen nach Schlüssel zusammen (neue Werte überschreiben vorhandene bei Schlüsselkollision).
Es schreibt die vollständige kombinierte Liste über
PUTzurü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 devLinting
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
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceExposes over 130 Dockhand API endpoints as tools to manage Docker infrastructure through AI assistants. It enables comprehensive control over containers, stacks, networks, and volumes across multiple environments and hosts.29MIT
- AlicenseNot gradedqualityFmaintenanceExposes the Dockhand Docker management API as tools for LLMs, enabling container, stack, image, volume, and network management via natural language.3MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that gives any LLM client the ability to list, inspect, start, stop, and monitor Docker containers on the host machine.1
- FlicenseBqualityBmaintenanceAn MCP server that gives LLMs direct control over a local Docker daemon, enabling container, image, volume, network, and Compose stack management through natural language.234
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/d7eeem/mcp-dockhand'
If you have feedback or need assistance with the MCP directory API, please join our Discord server