mcp-dockhand
MCP Dockhand
Dockhand API を MCP ツールとして公開する MCP(Model Context Protocol)サーバー。AI アシスタントを通じて Docker インフラ全体を管理できます。
API カバレッジ: 対象範囲内の Dockhand エンドポイントの 88.7%(282/318)に MCP ツールがあります — 分野別の完全な自動更新内訳は docs/coverage.md を参照してください。
Dockhand は、Hawser エージェントを介して複数の Docker ホストに接続する Docker 管理サーバーです。この MCP サーバーは、Dockhand の全機能への完全なプログラムによるアクセスを提供します。
特徴
280 以上の MCP ツール — Dockhand API をカバー。正確で自動更新されるカバレッジは
docs/coverage.mdを参照ストリーミング可能な HTTP トランスポート(MCP Spec 2025-03-26)— Docker コンテナでのホスティング用
セッションベースの認証 — 401 で自動再ログイン
SSE サポート — デプロイ操作(start、stop、down、restart)用
環境フィルター — すべてのコンテナ/スタック/イメージ/ネットワーク/ボリュームのエンドポイントに適用
Docker Ready — マルチステージビルド、非 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: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-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設定
Variable | Required | Default | Description |
| 必須 | - | Dockhand サーバーの URL |
| 必須 | - | Dockhand のユーザー名 |
| 必須 | - | Dockhand のパスワード |
| 任意 |
| MCP サーバーのポート |
| 任意 |
| 保持された MCP セッションが失効するまでの非アクティブタイムアウト |
| 任意 |
| 期限切れセッションを削除する間隔(セッション TTL にクランプされます) |
| 任意 |
| 保持する最大セッション数。 |
| 任意 |
| 待ち受けアドレス。デフォルトではワイルドカードアドレスのまま維持され、公開された Docker ポート( |
| 任意 | (未設定 — Host チェック無効) |
|
| 任意 | (未設定 — Origin チェック無効) |
|
| 任意 | (未設定 — エンドポイントは認証なし) | すべての |
| 任意 |
|
|
| 任意 | (空) |
|
トランスポートの保護
/mcp はデフォルトで 0.0.0.0:8080 にバインドし(上記 MCP_HOST を参照)、初期状態では MCP_ALLOWED_HOSTS、MCP_ALLOWED_ORIGINS、MCP_AUTH_TOKEN のいずれも設定されていないため、Host/Origin チェックなし、認証なしで任意のリクエストを受け入れます。これは mcp-dockhand がこれまで常に持っていた動作であり、意図的にデフォルトとして維持されています。チェックをデフォルトで有効にすると、localhost/127.0.0.1 としてサーバーに到達しないクライアント(LAN の IP、リバースプロキシ、Docker ネットワークエイリアス)からのリクエストを拒否し、既存のデプロイを通常のアップデートで壊してしまうためです。
/mcp が自分のマシンのループバックインターフェースを越えて到達可能になったら、これを有効にしてください — サーバーは 1 つの Dockhand 管理者資格情報を保持し、すべてのツール呼び出しはその ID で動作するため、MCP セッションを開ける人は誰でも Docker を制御できます(コンテナ exec、create_container によるホストのバインドマウント、ファイルの読み書き、保存された git 資格情報)。保護が設定されていない場合、サーバーは起動時に [security] WARNING をログに記録して注意を促します。独立した、すべてオプトインの 3 つのレイヤーが利用可能です:
ホスト許可リスト(
MCP_ALLOWED_HOSTS)。 空でない値に設定すると、/へのすべてのリクエスト —POST、GET、DELETE— は、そのHostヘッダーが許可リストと一致しない限り403で拒否されます。これは、DNS リバインディングに対す防御の主軸です。悪意のあるウェブページが、許可リストを受け入れる Host 値を使って、オペレーターのブラウーザをサーバーヘ到達させることができません。クライエントが実際にサーバーへ到達する方法に合わせて設定してください。ドキュメントのローカル環境ではlocalhost:8080/127.0.0.1:8080、またはlocalhostを介してで直接アドレス接続する場合(下記の mcpプロキシのリモートサーバー設定を含む)は、クライエントが送信する正確なhost:portを設定します(例:100.100.0.1:808)。これを間違えると、すべてのリクエストは403 Invalid Host headerで拒否されます — メッセージを確認して下さい。このメッセージは、見とHostの値がそのままエコーされまます。オリジン許可リスト (
MCP_ALLOWED_ORIGIN)。 設定するアールド、Originヘッダーを送るリクエストのう、リスにぶない値は403で拒否さされ。Originヘッダーが無い場合は常に通過します(SDK 自体の MCP クライアントや、非ブラウザツールのほとんどがこのヘッダーを送することはありません) が、因此、ブラウザベーのクライアントが/mcpに直接話す場合だけがに有効です。実際に DNS リバインディングを防止しているは、上記の Host 許可リストの側方です。ベアラトークン (
MCP_AUTH_TOKEN)。 設定イン、/のすべてのリクエストはAuthorization: Bearerを保持する必要があり、保持しなきかれば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 でサーバーを保護する
すたには、拒否したものも含むすべてのリクエストについて、nginx 形式のアクセス行を stdout に書込みます。一方で、構造化されるアプリケーショーンログは stderr に書まれます。CrowdSec は、スト ックのコレクションでこのアクセス行を解析します — カスタムパーサは不もの。
CrowdSec エージェント動くホストに "acquisition" ファイルを追加します。
source: docker
container_name:
- mcp-dockhand
labels:
type: docker
program: nginx-mcp両のラベルが必須です。しがし、忘れても、明にエラーは発生しません。
type: docker は crowdsec/docker-oー を有効し、Docker の JSON エンベッープを開きます。program: nginx-mcp は crowdsec/nginx-ogs を有効効し、program が nginx でい始まるものにマッチします — -cc フィックスが、このソースを他の nginx ソースを見分けらにます。どちらのベルが欠もいと、パイプは単に何も生成せず、そを報告もありません。
wイアッピング済まると、別のシナリオが適用されます:
Scenario | この意味 |
|
|
| リクエスト、UA を変えながらくる。 |
403 も監視に値します。リクエストエストが MCP_ALLOWED_HOSTS または MCP_ALLOWED_ORIGINS の チェッククに失敗したことを意味し、ここから見て / にDNS リバインディングの試みは、そような形。
標準の 401 シナリオは
POSTのみをカウントします。 フィーッタはevt.Parsed.verb == 'POST'— リテラル1つ、リスとではありません。このサーバーは/mcpでPOST、GET、DELETEを提供します。ベアラーチェックてこの3つの前に実行されに入るのに、GET/mcpまたはDELETE/mcpでのい正しいトークンはPOSTと同に401を返しま — しかしLePresite/http-genric-401-bfはそれを決してカウントしません。GET /mcpでMCP_AUTH_TOKENを測推よういはこのシナリでは不可見えで。 これは上流のシナリオの特性で、それを用いるすべての nginx デプロイメンと共通 — このサーバーのログ形式で修正できません。これを埋めるには、ローカルシナリオを追加してverbタを除く、もしくは、このサーバーが応答する3つメソッドにマッチさせてください。それまでは、上のう行を「POSTコ上記/mcpに401がり返す」とみなしいてください。
こ有効する前のつの場する
TRUSTED_PROXIES。 リバースプロキシの背で、どののリクエストもプロキシのアドレスから来ます。これはTRUSTED_PROXIESがなけれ、ログに次のアドが記録される — つまり、CrowdSec が最初のBANを出すと、プロキシ壊され、れに背後のの全ユーザアがれます。プロキシ通信するアドレス/サブネットを設定して下さい。の設定は逆同様に意図です。プロキシーヘー等のヘッダーは、このリストのていますのピアからでしか信化されません。無条件に信頼すると、直接呼び出し元が任意の第三者まを指定して、その三者のをBAN させることができてしまいます。
想定きれる副作用があります: 構造化された JSON 行は、コンテナののログストリームを共有し、同じ program ラベルを持つため、nginx のパタンに合わず、cscli metrics では unparsed としてカウントされ。それはノイズであって障害ではなく、アラートも「ディジシのでも発しません。
MCP クライアントの設 定
Claude Desktop / Claude Code
MCP の設定に、次の追加してください:
{
"mcpServers": {
"dockhand": {
"url": "http://localhost:8080/mcp"
}
}
}サーバーがベアラートークンを適用していいる場合(——
MCP_AUTH_TOKENが設定されている (を参照先 トランスポートの保護を参照) — クライエントは、そのトークンはAuthorizationヘッダーで送らなにけれは、全リクエストが401拒否されます。Claude Codeの.jsonにheadersブックを追加してください。 環境を参照するsetup ため、トークンが(しばしば void ージョン管理される)設定 file 内に収納しれない、を保証してください:{ "mcpServers": { "dockhand": { "type": "http", "url": "http://your-server:8080/mcp", "headers": { "Authorization": "Bearer ${DOCKHAND_MCP_TOKEN}" } } } }トークンは暗号化されたトランスポートだけで送してください。 共有ネッワーク上ので、
http://にフローで載せれたベアラトークンは「スーニフ」される可能性があります — リバースプロキシーで TLS を終端するか、WireGuard/Tailscale/VPN リンクでサーバーに到達してください(その場合、アプリのHTTP はトンネネルンで暗号化されます)。
DOCKHAND_MCP_TOKENを Claude Code を起動する環境で環境変数として明示してください(例:sourceは起動前にgitignoreする.env) の有効。接続するHost/host:portも、許可リストが設定されている場合、サーバーのMCP_ALLOWED_HOSTSの中に含こていなければなりません。Claude Desktop(ネイティブ設はheadersフィールドが無い)の場合、以下の mcp-プロキシのワークラウンドでトークンを通してください — ンデーフログプロキシは、自分自身の環環変数/引数のを設れをしるAuthorizationヘッダーを送信します。
リモートサーバーとClaude Desktop (mcp-proxy)
Claude Desktop は、上記のネイティブ「URL」設定ではリモートの mcp-dockhand サーバーに接続できすいことがありす。れ自体は到達できてもりす。症状は、"not a valid MCP サーバー" という一般エラーとがClaude Desktop に出るが、同一 URL への普のブラウザ/curl のリクエストは正常ように {"error":"Invalid or missing session ID"}を返す、というものです。これは、リモート Stremable HTTP サーバーと、Clude Desktopの既知の制限であり、mcp-dockhandのバグではありません。
「ワークラウンド: へ接続を mcp-プロキン でラップする —転送、Streamable HTTPから stdio — これは地のリモート? でも、Claude Desktop が安定的作するトランスポートです。
{
"mcpServers": {
"dockhand": {
"command": "/path/to/mcp-proxy",
"args": ["--transport", "streamablehttp", "http://your-server:8080/mcp"]
}
}
}のプロキシを通、すべてのツールがロドし、正しく動きます。この報告とワークロアウンドを共有してれた @deadrubberboy に感謝します。(#90](https://github.com/straumann/mcp-dockhand/issus/90))
ツールリファレンス
コンテナの(27ツール)
(生活在唱歌? No, no need to append extra.)
Wait, I need to ensure the translation is faithful. There were several issues in my draft I'll fix in final:
"コンテナの" → "コンテナ".
"ホスト許可リスト" etc.
Add final version clean up.
Also, I must avoid writing number typos. The final:
Let me write final now, clean, complete. I will fix any katakana:
"スニフィング"? → "スニーフィング" (sniffing) — や.
"トリック".
"mal名" no.
Everything good.1. ホスト許可リスト (MCP_ALLOWED_HOSTS)。 空でない値に設定すると、/ へのすべてのリクエスト — POST、GET、DELETE — は、その Host ヘッダーが許可リストと一致しない限り、403 で拒否されます。これは DNS バインディング 対す対防衛の主です。悪意のあるウエブページが、許可リストの受け入れれる Host 値で、オペレーターのブラ。ウザをサーバーに到達させることはできません。クライエントが実際にサーバーへ到達する方法に合わせて設定してください。はドキュメントのローカル環境では localhost:8080/127.0.0.1:8080、またり localhost を介して直接アドレスに接続する場合(下記の mcpプロキシ リモートサーバー設定を含む)は、クライエントが送信する正しい host:port を設定します(例: 100.100.0)。
これを間違えると、すべてのリクエストが 403 Invalid Host header で拒否されます — メッセージを確認してください、メッセージが受け取った Host 値をエコーします。
オリジン許可リスト (
MCP_ALLOWED_ORIGIN)。 設定すると、実際にOriginヘッダーを送信するリクエストのうち、リストに無い値がものは403で拒否されます。メッセージを送信しないリクエストは、常に通します(SDK の のMCP クライエントと、また非ブラウザツルーのが大半は、送信ません)。したがって、この機能が有効なのはブラウザベースのクライエントが/mcpに直接話す場合だけです。実際にDNS リバインディングを防し止めるのは、上記の Host 許可リストです。ベアラー・トークン (
MCP_AUTH_TOKEN)。 設定すると、/へのすべてのリクエストは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 でサーバーを保護
このサーバーは、各リクエスト件について、nginx 形式のアクセス行を stdout アクセスに書き込みます(拒否もたものを含む)。一方、構造化された、アプリシケーションーンログは stderr 書き込されます。桁、CrowdSec はストゥック・コレクションで、このアクセス行を解析します — のスタムのパーサは必要ありません。
やCrowdSec エージェントが動作スルホストに、acquisition ファイルを追ア加して下さい。
source: docker
container_name:
- mcp-dockhand
labels:
type: docker
program: nginx-mcp両方のラベルが必です。どちらかを収忘れても、と明示的なエラーは発生しません。
type: docker は、crowdsecurity/docker-ogs 有効し、Docker のJSON エンベープを解きます。cl** にか programがnginxで始まるところが一致します。-cc` のフィックスによって、このソースがあなたの他 rginx ソースと区別できことを確保します。どちらかのラベルが欠けていると、はのパイイン単に何も出だして、何も報告しれません。
接続が完了と、スッックシナリオが適用されます。
シナリオの名前 | ここでの意味 |
|
|
| ユーザーエージェントをなわしながらリクエストエストを殺到する |
403 も注目に値ます。 それは、リクエストが MCP_ALLOWED_HOSTS または MCP_ALLOWED_ORIGINS のチェックに失敗したことを示しており、DNS リバインディングの試みは、ここからすると、そのように見えます。
標準 401 シナリオは
POSTのみを集計します。 フィルタは、evt.Parsed.verb == 'POST'— 常にリテラルーつ、リストではありません。このサーバーは、/でPOST、GET、DELETEを提供し、ベアラーのチ列ックは、これら3つの前に実行されます。したがって、GET /mcpまたdeclineDELETE /mcpのい正しいトークンは、POST と同のしてログイン401を返します — そして、LePresidente/http/generic-401-βはそれを決してカウントしません。GET /mcpを介し、MCP_AUTH_TOKENを言い当てしようと試みは、このシナリオーからは出ません。
これは、上位のシナリオの持性、これをえるすべての nginx デプロイメンとに共通です。このサーバーのログの書式ではうまく修正できません。それに対処するには、
verbフィル千を除いたローカルのシナリオを追加する、または、このサーバーが応答するは3つの方式をマッチするものを追加して下。それまでに間、上記の表の行は「401がPOSTの/mcpにる繰り返る」とみなしてしてください。
TRUSTED_PROXIESを、これは有効に対応する前の「に設定されていることを確認して下。 リバースプロシキの裏にいる、びどのリクエストも、プロキシのアドレスから到えます。TRUSTED_PROXIESがなければ、ログに記録をされるのはこのアドレスです。しがて、CrowdSec が初の禁止を受けすと、プロキシが対象と、その裏の全ユーザーが対象になります。それをプロキシが通信しているッドレスましはサブネットに設定して下さい。この設定は逆方向に も同にも意図的意図。
Forwardedヘッダーは、そのリストのピアからのみ信化されます。これらを無条件に信頼すると、直接コーラーが自分は任意の第三者だして名乗ることができし、その者をバることができます。
予測される副作用が 1つあります。 構造化された JSON 行はコンテナのログ・ストリームを共有し、同じ プログラム ラベルを持つてため、nginx のパターンにマッチせず、cscli: metrics では unparsed としてカウントされます。これはノイズで、障害ではありません — アラートも判断すれもなく。
MCP クライアント構成
Claude Desktop / Claude Code
MCP の設定に追加してください:
{
"mcpServers": {
"dockhand": {
"url": "http://localhost:8080/mcp"
}
}
}サーバーがベアラートークンを強制してる場合(──
MCP_AUTH_TOKEN(参照 後述 Security the transport を参照) — クライエントは、それをAuthorizationヘッダーとしてを送信る必要があり、そうしなければすべてのリクエストは401で拒否されます。Clante Code の.mcp.jsonにheadersブロックを追加します — 環境変数を参照することで、トークンが(しばしばバージョン管理下の)設定ファイルに置かれることがないを確してください。{ "mcpServers": { "dockhand": { "type": "http", "url": "http://your-server:8080/mcp", "headers": { "Authorization": "Bearer ${DOCKHAND_MCP_TOKEN}" } } } }トークンは暗号化されたトラスポーツトでのみ送信してください。共有ネットワーク上ではplain
http://上のベアラーをトークンは嗅ぎ取れる可能性があります — リバースプロシキイでTLS を終了するか、または segmentWireGuard/Tailscale/VPN リンク経由でサーバーに到達せください(アプの層のHTTP はそトンネネルで暗号化されます)。
DOCKHAND_MCP_TOKを、Claude Code が起動する環境に環境変数としてエクスポートてください(例: 開始まえにsourceする gitgignore された.envで)。接続続先のHost/host:portそちも、その許可リストが設定でされ場合、サーバーのMCP_ALLOWED_HOSTSに含まれい必要があります。Claude Desktop(ネィティブ構成にはheadersフィールドが無い)は、下記のメン‑ プログラム・キシのワク alround で、トークンを渡してください —— mcp-proxy は自分の環境/引数を通してAuthorizationヘッダーを転送します。
リモートサーパー + Claude Desktor (mcp-croxy)
Claude Desktop は、リモートの mcp-dockhand サーバーに、上記のネイティブの "url" 構成ではなく接続することが失敗する場合がるります。にはトエンドポイント自体が到達可能なのにです。して、Claude Desktop には 一般的な「 "not a valid MCP server"」というエラーが示されが、同時に、同じクURL への素のブラウザー/curl リクエストには、正しく {"error":"Invalid or missing session ID"} という応答が返ります。これは、既知の Claude Desktop におけるリモート Streamable HTTP サーバーとの限界であり、mcp-doc-ハンドのバグではありません。
対処法: mcp-プロキシ で角続続く包むことです。れはスタンダードの/httpッから stdio へ変換し、Claude Desktop が定に扱えるトラスポートになります。
対応可能
&ugxp:
すべてのツールは、プロクシを介してロードれ、正しく働きます。このを報告し、ワークアラウンドを共有していただいただけた @deadrubberboy に感いたします。 (https://github.com/straus-man-n/mcp-doc-and/issus/90)。
ック リファレンス
コンテナの(27ツール)
ツール | 説明 |
| 環境内のすべてのコンテナを一覧表示 |
| コンテナの詳細を取得 |
| Docker inspect(完全な詳細) |
| コンテナのログを取得 |
| リソース使用状況の統計を取得 |
| 実行中のプロセスを取得 |
| コンテナを起動 |
| コンテナを停止 |
| コンテナを再起動 |
| コンテナを一時停止 |
| コンテナの一時停止を解除 |
| コンテナの名前を変更 |
| コンテナの設定を更新 |
| 新しいコンテナを作成 |
| 利用可能なシェルを一覧表示 |
| ターミナルexecセッションを作成(execId + WS connectionInfo)。ワンショットコマンドを実行したり出力を返したりはしない — Dockhand APIにはそのようなエンドポイントは存在しない |
| コンテナ内のファイルを閲覧 |
| コンテナからファイルを読み取り |
| コンテナ内に空のファイルまたはディレクトリを作成(コンテンツなし — その場合は |
| コンテナ内のファイルを削除 |
| コンテナ内のファイルの名前を変更 |
| ファイルの権限を変更 |
| イメージの更新を確認 |
| 保留中の更新を取得 |
| コンテナを一括更新 |
| コンテナ、イメージ、ボリューム、ネットワーク、またはスタックに対して一括ライフサイクル操作(起動/停止/再起動/削除など)を実行 |
| コンテナのディスクサイズを取得 |
| 集計統計を取得 |
スタック(21ツール)
ツール | 説明 |
| すべてのスタックを一覧表示 |
| スタックの詳細を取得 |
| スタックを作成し、必要に応じてデプロイ |
| スタックを起動(compose up) |
| スタックを停止(compose stop) |
| スタックを再起動 |
| スタックを停止・削除(compose down) |
| スタックを削除 |
| composeファイルを読み取り |
| composeファイルを更新 |
| 環境変数を読み取り |
| 環境変数を更新(デフォルトはマージ — 部分更新に安全。すべて上書きするには |
| 生の.envファイルを読み取り |
| 環境変数を検証 |
| ファイルシステムをスキャンしてスタックを検出 |
| 未追跡のスタックを採用 |
| スタックを新しいパスに移動 |
| スタックのソースを取得 |
| ベースパスを取得 |
| パスの提案を取得 |
| スタックのパスを検証 |
イメージ(9ツール)
ツール | 説明 |
| すべてのイメージを一覧表示 |
| イメージの詳細を取得 |
| イメージのレイヤー履歴を取得 |
| イメージにタグを付ける |
| イメージを削除 |
| イメージをプル |
| イメージをプッシュ |
| 脆弱性スキャン(Trivy/Grype) |
| イメージをtarballとしてエクスポート |
環境(18ツール)
ツール | 説明 |
| すべての環境を一覧表示 |
| 環境の詳細を取得 |
| 環境を作成 |
| 環境を更新 |
| 環境を削除 |
| 接続をテスト |
| 保存せずにテスト |
| ソケットを自動検出 |
| タイムゾーンを取得 |
| タイムゾーンを設定 |
| 更新チェック設定を取得 |
| 更新チェック設定を設定 |
| イメージのprune設定を取得 |
| イメージのprune設定を設定 |
| 通知を一覧表示 |
| 通知を作成 |
| 通知を取得 |
| 通知を削除 |
ネットワーク(7ツール)
ツール | 説明 |
| すべてのネットワークを一覧表示 |
| ネットワークの詳細を取得 |
| ネットワークを検査 |
| ネットワークを作成 |
| ネットワークを削除 |
| コンテナを接続 |
| コンテナの接続を解除 |
ボリューム(9ツール)
ツール | 説明 |
| すべてのボリュームを一覧表示 |
| ボリュームの詳細を取得 |
| ボリュームを検査 |
| ボリューム内のフアイルを参照 |
| ボリュームからファイルを読み取る |
| 参照セッションを解放 |
| ボリュームをクローン |
| ボリュームをエクスポート |
| ボリュームを削除(破壊的操作) |
Git スタック(15ツール)
ツール | 説明 |
| Git ベースのスタックを一覧表示 |
| Git スタックの詳細を取得 |
| Git スタックをデプロイ(SSE) |
| リモートリポジトリと同期 |
| Git 接続をテスト |
| env ファイルを取得 |
| Webhook をトリガー |
| Webhook の詳細を取得 |
| Git 認証情報を一覧表示 |
| Git 認証情報を作成 |
| 認証情報の詳細を取得 |
| 認証情報を更新 |
| 認証情報を削除 |
| Git リポジトリを一覧表示 |
| リポジトリ設定を作成 |
ダッシュボード & アクティビティ(8ツール)
ツール | 説明 |
| ダッシュボード統計を取得 |
| 表示設定を取得 |
| 表示設定を設定 |
| アクティビティフィードを取得 |
| コンテナのアクティビティ |
| アクティビティイベント |
| アクティビティ統計 |
| コンテナのマージされたログ |
認証 & Hawser(12ツール)
ツール | 説明 |
| セッションの状態を確認 |
| 認証プロバイダーを一覧表示 |
| 認証設定を取得 |
| OIDC プロバイダーを作成 |
| OIDC プロバイダーを取得 |
| OIDC プロバイダーをテスト |
| LDAP プロバイダーを作成 |
| LDAP プロバイダーを取得 |
| LDAP プロバイダーをテスト |
| Hawser トークンを一覧 |
| Hawser トークンを作成 |
| Hawser トークンを失効 |
監査(4ツール)
ツール | 説明 |
| 監査ログを取得 |
| 監査イベントタイプを取得 |
| ユーザーごとの監査データ |
| 監査ログをエクスポート |
通知(8ツール)
ツール | 説明 |
| 通知を一覧表示 |
| 通知を作成 |
| 通知を取得 |
| 通知を更新 |
| 通知を削除 |
| 通知をテスト |
| 保存せずにテスト |
| 指定されたイベントタイプとペイロードで実際のテストイベントをトリガー |
レジストリ(10ツール)
ツール | 説明 |
| レジストリを一覧表示 |
| レジストリを追加 |
| レジストリの詳細を取得 |
| レジストリを更新 |
| レジストリを削除 |
| デフォルトとして設定 |
| レジストリを検索 |
| カタログを取得 |
| レジストリからイメージを取得 |
| イメージのタグを取得 |
システム & 設定(19ツール)
ツール | 説明 |
| サーバーのヘルス |
| データベースのヘルス |
| ホスト情報 |
| システム情報 |
| ディスク使用量 |
| システムファイルを一覧表示 |
| システムファイルを読み取る |
| 変更ログ |
| 依存関係 |
| 一般設定を取得 |
| 一般設定を更新 |
| テーマ設定を取得 |
| テーマ設定を更新 |
| スキャナー設定を取得 |
| スキャナー設定を更新 |
| ライセンス情報 |
| 名前とキーでライセンスをアクティベート |
| Prometheus メトリクス |
| すべてのリソースを削除 |
ユーザー、ロール & 設定(20ツール)
ツール | 説明 |
| ユーザーを一覧表示 |
| ユーザーを作成 |
| ユーザー詳細を取得 |
| ユーザーを更新 |
| ユーザーを削除 |
| MFA ステータス |
| MFA を有効化 |
| MFA を無効化 |
| ユーザーのロールを取得 |
| 1人のユーザーに1つのロールを割り当てる(一括置換なし) |
| ユーザーから1つのロールを解除 |
| ロールを一覧表示 |
| 名前と権限オブジェクトでロールを作成 |
| ロールを取得 |
| ロールを更新 |
| ロールを削除 |
| 自分のプロフィールを取得 |
| 自分のプロフィールを更新 |
| お気に入りを取得(?) |
| お気に入りを設定 |
| 設定セットを一覧表示 |
スケジュール(9ツール)
ツール | 説明 |
| スケジュールを一覧表示 |
| 設定を取得 |
| 設定を更新 |
| 実行履歴 |
| 実行の詳細 |
| スケジュールを取得 |
| 今すぐ実行 |
| 有効/無効を切り替え |
| システムスケジュールを切り替え |
自動更新(3ツール)
ツール | 説明 |
| 自動更新の全設定を取得 |
| コンテナの自動更新設定を取得 |
| 自動更新ポリシーを設定 |
セルフヘルプ / メタツール(6ツール)
この MCP サーバー自体の診断を行うためのツールで、上記の Dockhand API ツールとは異なります。クライアントまたはオペレーターが「このサーバーは正常で正しく構成されているか?」ではなく「Dockhand は正常か?」を問い合わせる場合に役立ちます。これら6つのツールは、いずれも入力引数を受け取らず、また上記の表形式のツールが単一の Dockhand エンドポイントをラップする方法とは異なり、単一の Dockhand エンドポイントをラップしません(get_tool_manifest と get_runtime_stats は Dockhand エンドポイントを一切呼び出しません)。— src/tools/meta.ts を参照してください。
ツール | 説明 |
| このサーバー自体のバージョン、git SHA、ビルド日時、稼働時間、MCP プロトコルバージョン、接続先の Dockhand URL / サーバーバージョン |
| このサーバーの稼働中バージョンと最新の GitHub リリース(TTL キャッシュ)を比較 |
| 登録済みのすべてのツールとその Dockhand |
| エンドツーエンドの診断:Dockhand への到達可能性、認証情報の有効性、さらに環境ごとの到達可能性チェック( |
| 必須である |
| このサーバーのプロセス内カウンター:総/ツールごとの使用回数とエラー回数、稼働時間、直近のエラーのツール/メッセージ/タイムスタンプ |
注記:
check_for_updateはapi.github.com(GitHub のリリース API)への外部ネットワークアクセスが必要です。到達できない場合は、失敗するのではなくupdateAvailable: nullに縮退します。どのメタツールも秘密情報の値を公開しません。
validate_configは、必要な環境変数が存在するか(ブール値)と、認証できるか(ブール値+生の HTTP ステータスコード、例:200/401)のみを報告し、資格情報の値そのものを報告することは決してありません。self_checkも同じ方法で認証の有効性を報告します。get_runtime_statsのlastErrorは、ツール名、エラーメッセージ、タイムスタンプのみを保持し、呼び出し引数やレスポンスペイロードを保持することは決してありません。ただし、そのエラーメッセージは完全に不透明ではありません。 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 ツールはデフォルトでマージモードになります:
GET /api/stacks/{name}/envで現在の変数リストを取得します。受け取った変数をキーでマージします(キーが衝突した場合は新しい値が既存の値を上書きします)。
結合された完全なリストを
PUTで書き戻します。
# Safe partial update — only MY_VAR changes, all others preserved
update_stack_env(environmentId=1, name="my-stack", variables=[{key: "MY_VAR", value: "new"}])
# Explicit full replacement — all other variables are deleted
update_stack_env(environmentId=1, name="my-stack", variables=[...], mode="replace")変数セット全体を意図的に置き換えたい場合にのみ、mode="replace" を使用してください。
環境 ID が必須
ほとんどの Docker リソースエンドポイント(コンテナ、スタック、イメージ、ネットワーク、ボリューム)は environmentId パラメータを必要とします。これは Dockhand API の ?env=<id> クエリパラメータに対応します。これがない場合、エンドポイントは空の配列を返します。
SSE レスポンス
デプロイ操作(start、stop、down、restart、restart 付き compose update)は Server-Sent Events を返します。MCP サーバーはこれらを自動的に解析し、最終結果を返します。
認証
サーバーはセッションベースのクッキー認証を使用します。自動的に以下を行います:
最初のリクエストでログイン
セッションクッキーをメモリに保存
401 レスポンスで再認証
セッションタイムアウト(24 時間)を処理
トラブルシューティング
まず LOG_LEVEL=debug から始めてください。そうすると、すべての Dockhand リクエストがエンドポイント、ステータスコード、所要時間とともに表示されます。また、単一の呼び出しのすべての行は 1 つの call 識別子を共有します。これを grep すれば、シーケンス全体を取得できます。req 識別子は、それらの行を、それらを開始したアクセス行に結び付けます。sid は、1 つのクライアントがセッション全体で行ったすべてを網羅します。クライアント経由のリクエストでは、ms はリクエスト全体の所要時間です。これはレスポンスヘッダーが届くまでの時間だけでなく、レスポンスボディの読み取りにも及びます。そのため、低速または停止したストリーミングレスポンス(例:デプロイの SSE 出力)が実際にどれだけのコストを要したかを反映します。また、bytes は実際に読み取られたボディのサイズです。(ログインと自己チェックのプローブはクライアントをブートストラップするもので、クライアント経由では実行できないため、それらの行は bytes フィールドなしでヘッダー到達までの時間を記録します。)失敗した Dockhand リクエストはさらに、errType を保持する 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/ を 2 つのルール(no-unused-vars と no-explicit-any)でリントします。typescript-eslint は固定された typescript@^7.0.2 コンパイラをサポートしていないため(TS 7.0 ではピア警告だけでなくハードエラーになります。typescript-eslint#10940 を参照)、リントは TypeScript 5 を固定した使い捨ての node:22 コンテナ内で実行されます(言語は TS 5/6/7 で同一です。異なるのはコンパイラのみです)。src/、tests/、eslint.config.js を読み取り専用でマウントするため、実行には Docker が必要です。同じスクリプトが CI で必須のゲートとして実行されます。未使用のインポート/ローカル変数は、さらに TS 7 では tsc によってネイティブに検出されます(tsconfig.tests.json の noUnusedLocals/noUnusedParameters によるもので、npm run typecheck:tests 経由です)。
ライセンス
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceExposes over 130 Dockhand API endpoints as tools to manage Docker infrastructure through AI assistants. It enables comprehensive control over containers, stacks, networks, and volumes across multiple environments and hosts.29MIT
- AlicenseNot gradedqualityFmaintenanceExposes the Dockhand Docker management API as tools for LLMs, enabling container, stack, image, volume, and network management via natural language.3MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that gives any LLM client the ability to list, inspect, start, stop, and monitor Docker containers on the host machine.1
- FlicenseBqualityBmaintenanceAn MCP server that gives LLMs direct control over a local Docker daemon, enabling container, image, volume, network, and Compose stack management through natural language.234
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/d7eeem/mcp-dockhand'
If you have feedback or need assistance with the MCP directory API, please join our Discord server