Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Docker MCP Server

OCI · GHCR.IO/L337-ORG/DOCKER-MCP-SERVER:2.2.6 · 3 COMPONENTS · SCANNED SEP 21

Manage Docker (containers, images, Compose, Swarm, registries) via the Docker SDK and CLI.

+5 this week 41 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • Malware scan not yet available for this package.Unverified
  • Known CVEs could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.Unverified
Provenance & Transparency35
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 40054 tokens (~238/item across 168 items; 165 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management37
  • Stability observed for 11 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (23% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 17 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 167 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the Docker MCP Server server?

Docker MCP Server runs locally as a container image, launched with docker run --rm -i ghcr.io/l337-org/docker-mcp-server:2.2.6. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/l337-org/docker-mcp-server:2.2.6

# add to Claude Code
claude mcp add l337-org-docker-mcp-server -- docker run --rm -i ghcr.io/l337-org/docker-mcp-server:2.2.6
// .cursor/mcp.json
{
  "mcpServers": {
    "l337-org-docker-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/l337-org/docker-mcp-server:2.2.6"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "l337-org-docker-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/l337-org/docker-mcp-server:2.2.6"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add l337-org-docker-mcp-server -- docker run --rm -i ghcr.io/l337-org/docker-mcp-server:2.2.6
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "l337-org-docker-mcp-server": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/l337-org/docker-mcp-server:2.2.6"
      ],
      "enabled": true
    }
  }
}
# ~/.hermes/config.yaml
mcp_servers:
  l337-org-docker-mcp-server:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/l337-org/docker-mcp-server:2.2.6"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "l337-org-docker-mcp-server": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/l337-org/docker-mcp-server:2.2.6"
      ]
    }
  }
}
// mcp.json
{
  "mcpServers": {
    "l337-org-docker-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/l337-org/docker-mcp-server:2.2.6"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 19 Sept 26 +4
    • Stability: unverified → 0.30 functional
  • 10 Sept 26 36

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed oci/ghcr.io/l337-org/docker-mcp-server:2.2.6

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem oci
Reason No attestation published

Background: How many MCP packages publish verified provenance →

MCP tools · 165 exposed · ~39,062 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
swarm_update ~417

Update swarm-wide settings: the single home for join-token rotation and cluster spec changes. Must be called on a swarm manager node. Token rotation invalidates the old join token immediately - nodes that have not yet joined using the old token must use the new one. Existing joined nodes are unaffected. Use `swarm_join_tokens` to retrieve the new tokens after rotation. Rotating the unlock key requires all managers to be re-unlocked on restart with the new key; retrieve it immediately via `swarm_unlock_key`. Rotation and `updates` are independent and may be combined in one call; `swarm_init` sets these same fields when the swarm is first created, and `swarm_inspect` reads the current values back. The Engine replaces the whole cluster spec on every update, so this reads the current spec first and resubmits it, merging `updates` over it - omitting `updates` therefore changes nothing but the requested rotation. Args: rotate_worker_token: Issue a new worker join token, invalidating the current one rotate_manager_token: Issue a new manager join token, invalidating the current one rotate_manager_unlock_key: Issue a new autolock unlock key for manager restart updates: Engine SwarmSpec fields to change, merged over the current spec one top-level key at a time, so a named block is replaced whole rather than field by field: keys are "Name", "Labels", "Orchestration", "Raft", "Dispatcher", "CAConfig", "EncryptionConfig" and "TaskDefaults", e.g. {"EncryptionConfig": {"AutoLockManagers": True}} to turn manager autolock on. Read the current blocks from `swarm_inspect` Returns: bool: True after the update completes

NameTypeReqDescription
rotate_manager_tokenboolean
rotate_manager_unlock_keyboolean
rotate_worker_tokenboolean
updatesobject
NameTypeReqDescription
resultbooleanyes

No examples provided.

system_close ~115

Close and drop pooled Docker client connection(s); each is rebuilt lazily on next use. Use this to force a stale or errored connection to be discarded. Prefer `system_reconnect` when you want to immediately re-establish the connection rather than wait for the next tool call to trigger a lazy rebuild. With `host` omitted every pooled client is closed (unlike other tools, where omitting it means the default host). Closing clients does not affect running containers. Returns: bool: True once closed

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultbooleanyes

No examples provided.

system_df ~134

Summarize Docker disk usage: layer storage plus per-object sizes for images, containers, volumes, build cache. Equivalent to `docker system df`. Use it to find what to reclaim before `image_prune` / `container_prune` / `volume_prune` / `buildx_prune`; use `system_info` for daemon config and counts rather than sizes. The reply enumerates every object on the daemon, so expect a large payload on busy hosts. Returns: dict: {"LayersSize", "Images", "Containers", "Volumes", "BuildCache"} with per-object size fields

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

system_events ~352

Stream real-time events from the Docker server, bounded by `limit` events or `timeout_seconds`. Returns when `limit` events are collected or `timeout_seconds` elapses, whichever comes first (`limit` caps memory; `timeout_seconds` caps how long the call blocks - without it a quiet daemon would block indefinitely, since the stream only yields on an actual event). Caveat for `ssh://` daemons: docker-py can't cancel an SSH stream, so the `timeout_seconds` watchdog can't interrupt a fully idle stream - bound with `until`/`limit` (or a non-SSH endpoint). "Wait for the next matching event" idiom: pass `limit=1` with `filters` narrowed to what you care about (e.g. `{"type": "container", "event": "health_status"}`) and a generous `timeout_seconds`. This blocks until that one event arrives (or the timeout elapses, returning an empty list) instead of re-polling a snapshot on a timer - there's no separate wait tool for this since the filtering this call already does covers it. Args: since: Show events created since this timestamp until: Show events created until this timestamp filters: Filters to apply to the event stream limit: Max events to return timeout_seconds: Max wall-clock seconds before returning what was collected Returns: list: A list of decoded event dicts (length <= limit)

NameTypeReqDescription
filtersobject
limitinteger
sincestring
timeout_secondsnumber
untilstring

No output schema declared.

No examples provided.

system_info ~86

Return system-wide Docker information, like `docker info`. Daemon runtime state: container/image counts, storage and logging drivers, swarm role, and daemon warnings. Use `system_version` for version/API level and `system_df` for disk usage. Returns: dict: {"Containers", "Images", "Driver", "ServerVersion", "Swarm", "Warnings", ...}

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

system_login ~234

Authenticate with a Docker registry. Security: the password is sent as a tool argument, which many MCP clients log verbatim. Prefer running `docker login` once on the host so the `docker` module reuses the credentials cached in `~/.docker/config.json`, and avoid calling this tool from an agent loop. Credentials let `image_pull` / `image_push` reach private repositories; `system_logout` clears them. Args: username: Registry username password: Registry password or token email: Registry account email registry: URL to the registry (defaults to Docker Hub) reauth: Force re-authentication even if valid credentials exist dockercfg_path: Path to a custom dockercfg file Returns: dict: The login response: {"Status"} always; "IdentityToken" only when the registry issues one

NameTypeReqDescription
dockercfg_pathstring
emailstring
passwordstringyes
reauthboolean
registrystring
usernamestringyes

No output schema declared.

No examples provided.

system_logout ~210

Clear cached registry credentials from this server's in-memory Docker client. docker-py / the Engine have no true logout: `system_login` validates against the registry (the daemon's `/auth` is stateless) and caches credentials in-process. This drops that in-memory cache; it does NOT contact the daemon or touch the host's `~/.docker/config.json`. With no `registry`, clears every cached credential; pass one to clear just that entry (key must match `system_login`; Docker Hub is cached under "docker.io"). `system_close`/`system_reconnect` also clear it by discarding the client. Reaches into a private docker-py attribute (`api._auth_configs`); degrades to clearing nothing if that internal shape changes. Args: registry: Registry key to clear, or None to clear every cached credential Returns: dict: {"cleared": [<registry keys removed>]}

NameTypeReqDescription
registrystring

No output schema declared.

No examples provided.

system_ping ~84

Check that the Docker server is responsive. The cheapest daemon health check. A failure here usually means connection config rather than daemon load - `system_reconnect` rebuilds a wedged client, `host_list` shows the configured endpoints. For daemon details use `system_version` / `system_info`. Returns: bool: True if the daemon responded successfully

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultbooleanyes

No examples provided.

system_reconnect ~146

Rebuild a pooled Docker client from its configured endpoint, to recover a wedged connection. Validates the rebuilt client before swapping in (and only then closes the old one), so a failed rebuild leaves the working client in place. Rebuilds the default host's client when `host` is omitted. It CANNOT retarget to a different daemon - to add or change a daemon, edit DOCKER_MCP_SERVER_HOSTS and restart. `system_close` closes pooled clients without rebuilding; `host_list` shows the configured endpoints. Returns: dict: the rebuilt host's version info (same shape as `system_version`), confirming connectivity

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

system_version ~82

Return Docker server version information. Engine version, API level, and per-component versions - the first thing to check for feature availability. `system_info` reports runtime state (counts, drivers, swarm role) instead. Returns: dict: {"Version", "ApiVersion", "MinAPIVersion", "Os", "Arch", "Components", ...}

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

tool_list ~427

List this server's registered tools as compact rows, filtered by domain, category or keyword. A tool-callable mirror of `docker-mcp://tool-catalog` for clients that can't read MCP resources (e.g. Claude Desktop, Cursor), and the only way to ask what no per-tool description search can express: which tools are destructive, which accept a `host`, what this server actually registered. Use it to brief on an unfamiliar area (`domain="buildx"` returns one line per tool rather than ~13 full definitions), to check blast radius (`category="destructive"`), or to establish that nothing matches - `matched: 0` is a definitive negative, which a client's fuzzy search cannot give. Covers this server's own surface; `docs_lookup` covers external Docker reference documentation. Rows are summaries, not definitions - fetch a tool's own definition for its parameters. Read-only, never raises on a query matching nothing, and always registered even when DOCKER_MCP_SERVER_DISABLE drops every domain. A tool dropped by a switch or a disabled domain is absent rather than flagged; `hidden_by_configuration` reports how many each domain hides. Args: domain: Exact domain name (see any result's `domains` key); omit for every domain category: Exact category; omit for all three keyword: Case-insensitive substring over tool names, summaries and parameter names Returns: dict: {"matched": int, "tools": [{"name", "domain", "category", "summary"}], "domains": {domain: count}, "no_domain": int, "hidden_by_configuration": {domain: count}, "switches", "filters"}. Every `domains` key is a value `domain` accepts; `no_domain` counts the domain-less tools, whose rows carry `domain: null` and which no `domain` value selects.

NameTypeReqDescription
categorystring
domainstring
keywordstring

No output schema declared.

No examples provided.

volume_create ~324

Create a volume managed by Docker. Named volumes persist after their containers stop or are removed; use them for databases, uploads, or any data that must outlive a container. Anonymous volumes (no `name`) are only removed automatically when the container was started with `--rm` or removed with `docker rm -v`; otherwise they accumulate and must be pruned manually. Common `driver_opts` for the default `local` driver: bind-mount an existing host path with `{"type": "none", "device": "/host/path", "o": "bind"}`, or mount an NFS share with `{"type": "nfs", "device": "server:/export", "o": "addr=server,rw"}`. Third-party drivers (e.g. `rexray`, `convoy`) accept their own option keys. List existing volumes with `volume_list`; reclaim unused ones with `volume_prune`. Created volumes are stamped with provenance labels. Args: name: Volume name; auto-generated if omitted (creates an anonymous volume) driver: Volume driver to use (default: "local") driver_opts: Driver-specific options dict labels: Labels to set on the volume Returns: dict: The created volume's full document (keys include Name, Driver, Mountpoint, CreatedAt, Labels, Options, Scope)

NameTypeReqDescription
driverstring
driver_optsobject
labelsobject
namestring

No output schema declared.

No examples provided.

volume_inspect ~121

Get a volume's full inspect payload by name. Use it after `volume_list` to see a volume's on-disk location, driver, and labels - e.g. before a backup or `volume_remove`. Volumes are addressed purely by name; they have no separate id. Args: name: The volume name (volumes have no ids) Returns: dict: The volume's full document (keys include Name, Driver, Mountpoint, CreatedAt, Labels, Options, Scope)

NameTypeReqDescription
namestringyes

No output schema declared.

No examples provided.

volume_list ~151

List volumes. Volumes are addressed by name only - feed a Name to `volume_inspect` for detail or `volume_remove` / `volume_prune` to clean up. filters={"dangling": True} finds volumes that no container references. Args: filters: Filter by attributes (e.g. dangling, name, label) managed_only: Only return volumes created by this MCP server (filters on the docker-mcp-server.managed label); combines with any `filters` given Returns: list: One volume document ({"Name", "Driver", "Mountpoint", ...}) per volume

NameTypeReqDescription
filtersobject
managed_onlyboolean

No output schema declared.

No examples provided.

volume_prune ~162

Remove volumes not referenced by any container, running or stopped. A volume used by even one stopped container is not "unused" and survives the prune - remove the container first (or use `container_prune`, then this) to reclaim its volumes. Valid filter keys: `label` (key or key=value), `all` ("true" as a string - without it only anonymous volumes are eligible, matching `docker volume prune`'s default). Use `volume_list` first to see what currently exists. Args: filters: Narrow which unused volumes to remove; omit to remove all anonymous ones Returns: dict: {"VolumesDeleted": [...], "SpaceReclaimed": <bytes>}

NameTypeReqDescription
filtersobject

No output schema declared.

No examples provided.

volume_remove ~130

Remove a single volume by name. Fails if any container, running or stopped, still references the volume - remove or recreate those containers first, or pass `force=True` to remove it anyway (the containers keep their reference but lose the underlying data). For bulk cleanup of volumes with no container references at all, use `volume_prune` instead. Args: name: Volume name to remove force: Remove even if a container still references the volume Returns: bool: True after removal

NameTypeReqDescription
forceboolean
namestringyes
NameTypeReqDescription
resultbooleanyes

No examples provided.

Common questions

What is the Docker MCP Server server?

Docker MCP Server is listed in the public MCP registry as io.github.L337-org/docker-mcp-server. Manage Docker (containers, images, Compose, Swarm, registries) via the Docker SDK and CLI. This page covers its container image (ghcr.io/l337-org/docker-mcp-server:2.2.6).

Is the Docker MCP Server server safe to use?

Docker MCP Server scores 41 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Docker MCP Server server expose?

Docker MCP Server exposes 165 tools: buildx_build, buildx_bake, buildx_imagetools_inspect, buildx_imagetools_create, buildx_list, and 160 more. Their descriptions and schemas cost roughly 39,062 tokens of context every time the server is loaded.

Is the Docker MCP Server server still maintained?

Docker MCP Server is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.