Docker MCP Server
OCI · GHCR.IO/L337-ORG/DOCKER-MCP-SERVER:2.2.2 · 3 COMPONENTS · SCANNED AUG 3
Manage Docker (containers, images, Compose, Swarm, registries) via the Docker SDK and CLI.
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 →
Supply Chain Security0
- Malware scan not yet available for this package.Unverified
- CVE data not yet available for this package.Unverified
- Install-script risk not yet assessed.Unverified
- Dependency-health data not yet available.Unverified
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 2 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability72
- 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 35053 tokens (~216/item across 162 items; 156 tools + 6 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 Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
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
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Unverified: 2 categories
Categories scored 0 because we could not verify them: 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.
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
oci · ghcr.io/l337-org/docker-mcp-server:2.2.2
claude mcp add l337-org-docker-mcp-server -- docker run --rm -i ghcr.io/l337-org/docker-mcp-server:2.2.2
codex mcp add l337-org-docker-mcp-server -- docker run --rm -i ghcr.io/l337-org/docker-mcp-server:2.2.2
{
"$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.2"
],
"enabled": true
}
}
} mcp_servers:
l337-org-docker-mcp-server:
command: "docker"
args: ["run", "--rm", "-i", "ghcr.io/l337-org/docker-mcp-server:2.2.2"] {
"mcpServers": {
"l337-org-docker-mcp-server": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"ghcr.io/l337-org/docker-mcp-server:2.2.2"
]
}
}
} 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.
- 1 Aug 26 +27
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- MCP protocol: unverified → pass ▲ functional
- Schema quality: unverified → 100 ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- First check of Schema quality: good functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 0 functional
- First check of Tool coverage: 23 functional
- First check of Schema quality: fail functional
- 31 Jul 26 6
First indexed and scored.
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 3 Aug 2026 · Analysed oci/ghcr.io/l337-org/docker-mcp-server:2.2.2
Provenance none
Ecosystem: oci · Outcome: none
Reason: no_attestation
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.
container_logs ~377
Get the logs of a container: a one-shot snapshot by default, or a bounded live tail with `follow=True`. Follow mode returns when `limit_lines` lines are collected, `timeout_seconds` elapses, or the container exits, whichever comes first — so the agent can watch live output without blocking forever. `limit_lines`/`timeout_seconds` apply only in follow mode; `until` only in snapshot mode. Caveat for `ssh://` daemons: docker-py can't cancel an SSH stream, so in follow mode the `timeout_seconds` watchdog can't interrupt a fully silent container — use the snapshot mode there if you need a hard time bound. args: id_or_name - The container id or name stdout - Include stdout stderr - Include stderr timestamps - Include timestamps tail - Number of lines from the end (default 200), or the literal "all" for everything since - Only return logs created after this unix timestamp until - Only return logs created before this unix timestamp (snapshot mode only) follow - Follow the live log stream instead of returning a snapshot limit_lines - Follow mode: max lines to collect before returning (default 200) timeout_seconds - Follow mode: max wall-clock seconds before returning what was collected (default 30) returns: str - Decoded log output (up to `limit_lines` lines in follow mode)
| Name | Type | Req | Description |
|---|---|---|---|
| follow | boolean | — | — |
| id_or_name | string | yes | — |
| limit_lines | integer | — | — |
| since | number | — | — |
| stderr | boolean | — | — |
| stdout | boolean | — | — |
| tail | — | — | — |
| timeout_seconds | number | — | — |
| timestamps | boolean | — | — |
| until | number | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
container_pause ~127
Suspend all processes in a container using the kernel freezer cgroup. Unlike sending SIGSTOP, the freezer cgroup suspends processes without their being able to observe or intercept the suspension. A paused container keeps its resources (memory, open file descriptors) but consumes no CPU. Resume with `container_unpause` — `container_exec` fails against a paused container until it is unpaused. args: id_or_name - The container id or name returns: dict - The container's full inspect payload after pause (State.Paused true)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
container_prune ~156
Remove all stopped containers to reclaim disk space. Only removes containers that are not running — running containers are never affected. Use `container_list(all=True)` to preview what would be removed before calling this. Valid filter keys: `until` (RFC3339 timestamp or duration like "24h" — removes containers stopped before that point), `label` (key or key=value). For a broader cleanup of containers plus unused images, networks, and volumes see the `prune_managed` prompt. args: filters - Narrow which stopped containers to remove; omit to remove all stopped returns: dict - {"ContainersDeleted": [...], "SpaceReclaimed": <bytes>}
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | — | — |
No output schema declared.
No examples provided.
container_remove ~172
Remove a container, deleting its writable layer. The image is untouched (`image_remove` deletes images); named volumes are never removed — volumes=True only covers anonymous ones. A running container is refused unless force=True, which kills it first. When the server runs containerized it refuses to remove its own container. args: id_or_name - The container id or name volumes - Also remove anonymous volumes (the CLI's `--volumes`); named volumes persist link - Remove the specified link force - Kill a running container before removing it (default False: running is an error) returns: bool - True after removal completes
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| id_or_name | string | yes | — |
| link | boolean | — | — |
| volumes | boolean | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
container_rename ~143
Rename a container in place; its id, state, and configuration are unchanged. Use it to free up or claim a container name (names are unique per daemon) — e.g. before starting a replacement under the old name. Fails with a conflict error if the new name is already taken. Not related to `image_tag`, which names images. args: id_or_name - The container id or name name - The new name; must not be in use by any other container returns: dict - The container's full inspect payload after the rename
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| name | string | yes | — |
No output schema declared.
No examples provided.
container_restart ~147
Restart a container: stop then start again in one call. The container receives its configured stop signal (`STOPSIGNAL`, default SIGTERM), SIGKILL after stop_timeout_seconds, and is then started. Use `container_stop`/`container_start` to do the halves separately. When the server runs containerized it refuses to restart its own container. args: id_or_name - The container id or name stop_timeout_seconds - Seconds between the stop signal and SIGKILL (default 10) returns: dict - The container's full inspect payload after the restart
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| stop_timeout_seconds | integer | — | — |
No output schema declared.
No examples provided.
container_run ~529
Run a container from an image (create and start in one call, like `docker run`). Use `container_create` to prepare a container without starting it, or `container_exec` to run a command in a container that already exists. With detach=False the call blocks until the container exits and returns its output, so long-running images need detach=True. Created containers are stamped with provenance labels. args: image - The image to run command - The command to run in the container name - Name to assign to the container detach - Run in the background and return container info environment - Environment variables to set ports - Port mappings, e.g. {'2222/tcp': 3333} volumes - Volumes to mount network - Name of the network to attach hostname - Optional hostname for the container user - Username or UID to run as working_dir - Working directory inside the container entrypoint - Entrypoint to override the image default restart_policy - Restart policy, e.g. {'Name': 'on-failure', 'MaximumRetryCount': 3} labels - Labels to set on the container remove - Remove the container when it exits (only with detach=False) auto_remove - Enable auto-removal of the container on daemon side privileged - Give extended privileges to the container tty - Allocate a pseudo-TTY stdin_open - Keep STDIN open mem_limit - Memory limit cpu_count - Number of CPUs extra_kwargs - Additional keyword arguments forwarded to ContainerCollection.run (call `docs_lookup(section="containers")` for the full accepted set) returns: dict | str - Container attrs when detach=True, otherwise stdout/stderr as a string
| Name | Type | Req | Description |
|---|---|---|---|
| auto_remove | boolean | — | — |
| command | — | — | — |
| cpu_count | integer | — | — |
| detach | boolean | — | — |
| entrypoint | — | — | — |
| environment | — | — | — |
| extra_kwargs | object | — | — |
| hostname | string | — | — |
| image | string | yes | — |
| labels | — | — | — |
| mem_limit | — | — | — |
| name | string | — | — |
| network | string | — | — |
| ports | object | — | — |
| privileged | boolean | — | — |
| remove | boolean | — | — |
| restart_policy | — | — | — |
| stdin_open | boolean | — | — |
| tty | boolean | — | — |
| user | string | — | — |
| volumes | — | — | — |
| working_dir | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | — | yes | — |
No examples provided.
container_start ~121
Start an existing stopped container. Use this to restart a container that was previously created or stopped without removing it. To create and start a new container in one step use `container_run` instead. Calling on an already-running container has no effect (the daemon returns 304 and no error is raised). To stop then start a running container use `container_restart`. args: id_or_name - Container id (full or short) or name returns: dict - The container's full inspect payload after starting
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
container_stats ~135
Get one point-in-time resource-usage snapshot for a container (non-streaming). Returns the raw engine stats payload; CPU percent must be computed from the delta between `cpu_stats` and `precpu_stats`. For a pre-computed human-readable summary prefer the `docker-stats://{id_or_name}` resource; for a process listing use `container_top`. args: id_or_name - The container id or name returns: dict - Engine stats payload (read, cpu_stats, precpu_stats, memory_stats, networks, pids_stats, ...)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
container_stop ~186
Gracefully stop a running container (its configured stop signal, then SIGKILL after a timeout). Prefer this over `container_kill` for a clean shutdown: the main process receives the container's stop signal (`STOPSIGNAL`, default SIGTERM) and has stop_timeout_seconds to exit before the daemon force-kills it. Use `container_restart` to stop and start again in one call, or `container_pause` to freeze processes without stopping. When the server runs containerized it refuses to stop its own container. args: id_or_name - The container id or name stop_timeout_seconds - Seconds between the stop signal and SIGKILL (default 10) returns: dict - The container's attrs after the stop (exit code under State.ExitCode)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| stop_timeout_seconds | integer | — | — |
No output schema declared.
No examples provided.
container_top ~161
List the processes running inside a container (the daemon runs `ps` on the host). Works on any running container without executing anything in it, so it needs no shell or `ps` binary in the image — unlike `container_exec` with `ps`. Use `container_stats` for resource usage rather than process lists. Fails if the container is not running. args: id_or_name - The container id or name ps_args - Extra ps arguments (e.g. "aux"); default is the daemon's standard ps invocation returns: dict - {"Titles": [ps column names], "Processes": [[one row of values per process]]}
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| ps_args | string | — | — |
No output schema declared.
No examples provided.
container_unpause ~100
Resume all processes in a paused container (the reverse of `container_pause`). Only valid on a paused container — it fails if the container is merely stopped; use `container_start` for stopped containers. Processes continue from where they were frozen. args: id_or_name - The container id or name returns: dict - The container's attrs after unpause (State.Paused becomes false)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
container_update ~246
Update resource limits on a container without recreating it. Changes take effect immediately on Linux (cgroups); not all fields are updatable on every platform. Common `updates` keys: `mem_limit` (bytes, e.g. 134217728 for 128 MB), `memswap_limit` (memory+swap in bytes; -1 = unlimited), `cpu_shares` (relative weight, default 1024), `cpu_period` / `cpu_quota` (microseconds for CFS throttling), `cpuset_cpus` (e.g. "0-1"), `restart_policy` (dict with `Name` such as "on-failure"/"always"/"unless-stopped" and optional `MaximumRetryCount`). To change image, env, or volumes the container must be recreated (`container_remove` + `container_run`). args: id_or_name - Container id or name to update updates - Resource fields to update; see description for valid keys returns: dict - The container's full inspect payload after the update
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| updates | object | yes | — |
No output schema declared.
No examples provided.
container_wait ~698
Block until a container reaches a condition: stopped, "healthy", or its logs contain a pattern. One contract for every mode: never raises on timeout — the result always carries `met` (condition reached) and `timed_out`. The stop conditions ("not-running"/"next-exit"/"removed") use the daemon's blocking wait and fill `status_code`/`error` (the container's exit info); "healthy" polls the container's HEALTHCHECK every `poll_interval`s and fills `health`/`status`; "log-match" polls recent logs every `poll_interval`s for `pattern` and fills `matched_line`. For a compose project use `compose_wait`; for swarm services use `service_wait`. Health semantics: with no HEALTHCHECK defined, once the container is `running` the tool returns promptly with `health: null` and `met: false` (false = "not confirmed healthy", not "unhealthy" — check `health` to tell them apart). A container that exits before becoming healthy returns its terminal `status` and `met: false`. Log-match semantics: `pattern` is matched as a **plain substring** by default — safe against any input, including adversarial ones. Pass `regex=True` to match `pattern` as a regular expression (via `re.search`) instead; only do this with patterns you trust, since a regex with catastrophic backtracking run against attacker-influenced log content can exhaust CPU (ReDoS). Checks stdout and stderr, most recent lines first within each poll. If the container exits/dies before the pattern ever appears, returns promptly with `met=false` (not `timed_out`) — no further logs can arrive, so there's nothing to keep polling for. args: id_or_name - The container id or name until - Condition to wait for: "not-running" (default), "next-exit", "removed", "healthy", or "log-match" (requires `pattern`) timeout_seconds - Max seconds to wait before returning with timed_out=true (default 600) poll_interval - "healthy"/"log-match" only: seconds between re-checks (default 2, > 0); capped by t…
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| pattern | string | — | — |
| poll_interval | number | — | — |
| regex | boolean | — | — |
| timeout_seconds | number | — | — |
| until | string | — | — |
No output schema declared.
No examples provided.
context_create ~289
Create a new Docker CLI context pointing at a daemon endpoint. Registers a named endpoint for the CLI; switch with `context_use`, enumerate with `context_list`. It does not retarget this server's docker-py client (pinned at startup). Does not raise on a non-zero CLI exit — inspect `returncode`/`stderr` in the result. args: name - Name for the new context (must not already exist) docker_host - Daemon URL, e.g. "tcp://10.0.0.5:2376" or "unix:///var/run/docker.sock" description - Optional human description shown in `context ls` tls_ca - Path on the local host to the CA cert (for TLS daemons) tls_cert - Path on the local host to the client cert tls_key - Path on the local host to the client key skip_tls_verify - Disable TLS verification (insecure; for testing only) returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool}
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | — | — |
| docker_host | string | yes | — |
| name | string | yes | — |
| skip_tls_verify | boolean | — | — |
| tls_ca | string | — | — |
| tls_cert | string | — | — |
| tls_key | string | — | — |
No output schema declared.
No examples provided.
context_inspect ~104
Return the full configuration for a single Docker context. Full endpoint/TLS detail for one context; `context_list` gives the one-line summary of all. Raises RuntimeError if the CLI call fails. args: name - Context name (use the `Name` field from `context_list`) returns: dict - The parsed `docker context inspect` entry (keys include "Name" and "Endpoints" with the daemon URL)
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | — |
No output schema declared.
No examples provided.
context_list ~128
List Docker CLI contexts known to the host running this MCP server. Contexts are a CLI concept (stored in the docker config dir) letting one CLI target multiple daemons. This server uses whatever DOCKER_HOST / current-context resolved to at startup, so changing contexts only affects future subprocess-based tools, not the docker-py SDK client. Use `context_inspect` for one context's full config and `context_use` to switch. Raises RuntimeError if the CLI call fails. returns: list - One dict per context with at least name, description, dockerEndpoint, and current
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
context_remove ~134
Remove a Docker CLI context. Deletes only the CLI's connection metadata — the daemon it pointed at is untouched. The current context needs force=True (or `context_use` another first). Does not raise on a non-zero CLI exit — inspect `returncode`/`stderr` in the result. args: name - Context name to remove force - Force removal even if the context is the current one returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool}
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| name | string | yes | — |
No output schema declared.
No examples provided.
context_use ~134
Set the active Docker context for the CLI on the host running this MCP server. Note: this does not retarget the long-lived docker-py client — SDK-backed tools keep using the endpoint they connected to at startup. To retarget those, restart the server with a different DOCKER_HOST / DOCKER_CONTEXT. Create contexts with `context_create`; list them with `context_list`. args: name - Existing context name to set as default returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool}
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | — |
No output schema declared.
No examples provided.
docs_lookup ~283
Look up Docker SDK/CLI/registry reference documentation by section. A tool-callable mirror of the docker-docs:// resources, for clients that can't read MCP resources (e.g. Claude Desktop, Cursor). Always registered regardless of DOCKER_MCP_SERVER_DISABLE — looking something up costs nothing and isn't tied to any single Docker feature area — but an individual section still refuses if the domain it documents is disabled, matching the equivalent `docker-docs://{section}` resource exactly. Omit `section` to list every available section with its source URL (same as `docker-docs://contents`); pass a `section` name to fetch that page's content (same as `docker-docs://{section}`). Most useful before constructing an `extra_kwargs`-style passthrough dict for a tool like `container_run`/`container_create`/`service_create` (their docstrings only list common keys, not every key docker-py accepts), or before writing Compose/Dockerfile/buildx bake-file syntax, which no tool generates. args: section - Section name (from a no-argument call's index); omit to list all sections instead returns: str - JSON section index (no `section`) or that section's raw HTML/Markdown content
| Name | Type | Req | Description |
|---|---|---|---|
| section | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
host_list ~164
List the Docker hosts configured via DOCKER_MCP_SERVER_HOSTS. With a single host (or the var unset) this is the one resolved daemon; with several it is the set that the `host` argument selects from. The `default` entry is the one used when `host` is omitted; pass a `name` as the `host` argument of daemon-backed tools (`system_ping(host=...)` checks one entry). The `docker-mcp://hosts` resource mirrors this tool. returns: list[dict] - one per host: name; url (resolved daemon URL, null = docker-py platform default); read_only; tls (whether a per-host cert dir is configured); default (the omitted-host fallback)
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | — |
No examples provided.
hub_rate_limit ~230
Report the caller's remaining Docker Hub pull-rate-limit budget. Sends a HEAD to the `ratelimitpreview/test` manifest (a HEAD isn't metered as a pull, so the check costs no budget) and reads the RateLimit-Limit / RateLimit-Remaining headers. Call it before a large `compose_pull` / `image_pull` to avoid hitting the cap mid-deploy. Credentials raise the limit and switch metering from per-IP to per-account; falls back to DOCKER_MCP_SERVER_REGISTRY_USERNAME / DOCKER_MCP_SERVER_REGISTRY_PASSWORD, does NOT read `~/.docker/config.json`. Plans with no limit return no headers — reported as `"unlimited": true`. args: username - Optional Hub username (overrides DOCKER_MCP_SERVER_REGISTRY_USERNAME) password - Optional Hub password/token (overrides DOCKER_MCP_SERVER_REGISTRY_PASSWORD) returns: dict - {"authenticated", "limit", "remaining", "window_seconds", "unlimited"}
| Name | Type | Req | Description |
|---|---|---|---|
| password | string | — | — |
| username | string | — | — |
No output schema declared.
No examples provided.
hub_repo_info ~139
Fetch Docker Hub metadata for a repository. Public repos only: sends no auth and does NOT read the local Docker credential store; private repos return 404/401. Hub-only metadata (stars, pulls, description) — use `registry_tags` for tag lists on any OCI registry and `hub_tags` for Hub tag details. args: repository - Hub repository, e.g. "library/alpine" or "myorg/myimage" returns: dict - The Hub /v2/repositories/<repo>/ response (description, star_count, pull_count, last_updated, is_private, etc.)
| Name | Type | Req | Description |
|---|---|---|---|
| repository | string | yes | — |
No output schema declared.
No examples provided.
hub_tags ~191
List tags on a Docker Hub repository with Hub-specific metadata. Hits the Hub UI API (hub.docker.com) for richer per-tag data than `registry_tags` — last pushed date, per-platform sizes, digest. Public repos only: sends no auth and does NOT read `~/.docker/config.json`; private repos return 404/401 (use `registry_tags` against registry-1.docker.io with credentials). args: repository - Hub repository, e.g. "library/alpine" or "myorg/myimage" limit - Max tags to return (default 100, >= 1); pagination capped at 50 pages returns: dict - {"name": <repo>, "tags": [{name, full_size, last_updated, digest, images}, ...], "truncated": bool}
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| repository | string | yes | — |
No output schema declared.
No examples provided.
image_build ~620
Build an image from a Dockerfile using the daemon's classic builder. Use this for simple single-platform builds from a local context. For multi-platform builds, BuildKit cache export/import, or advanced build features prefer `buildx_build`. `path` must be a directory accessible on the host running this server (it is the build context sent to the daemon). `dockerfile` is relative to `path`; omit to use the default `Dockerfile`. args: path - Build context directory path on the server host tag - Name and optional tag in "name:tag" format to apply to the built image quiet - Suppress verbose build output (final image id still returned) nocache - Ignore the layer cache and rebuild all layers rm - Remove intermediate containers on success (default True) pull - Always pull a newer version of each FROM base image before building forcerm - Remove intermediate containers even on build failure dockerfile - Dockerfile filename relative to path (default: "Dockerfile") buildargs - Build-time variables passed as `--build-arg`; dict of str→str container_limits - Resource limits for the build container, e.g. {"memory": 134217728} shmsize - Size of /dev/shm in bytes for build steps that need shared memory labels - Labels to set on the resulting image (dict of str→str) cache_from - List of image references to use as layer cache sources target - Stop at this named build stage (multi-stage Dockerfiles) network_mode - Network mode for RUN instructions during build (e.g. "host", "none") squash - Squash all new layers into one (experimental; requires daemon flag) extra_hosts - Additional /etc/hosts entries during build; dict of hostname→ip platform - Target platform, e.g. "linux/amd64" (single platform only; use buildx for multi) isolation - Windows isolation technology ("default", "process", "hyperv") use_config_proxy - Forward proxy env vars from Docker client config to build returns: dict - The built imag…
| Name | Type | Req | Description |
|---|---|---|---|
| buildargs | object | — | — |
| cache_from | array | — | — |
| container_limits | object | — | — |
| dockerfile | string | — | — |
| extra_hosts | object | — | — |
| forcerm | boolean | — | — |
| isolation | string | — | — |
| labels | object | — | — |
| network_mode | string | — | — |
| nocache | boolean | — | — |
| path | string | — | — |
| platform | string | — | — |
| pull | boolean | — | — |
| quiet | boolean | — | — |
| rm | boolean | — | — |
| shmsize | integer | — | — |
| squash | boolean | — | — |
| tag | string | — | — |
| target | string | — | — |
| use_config_proxy | boolean | — | — |
No output schema declared.
No examples provided.
image_history ~144
Return the layer history of an image. Useful for auditing what commands built each layer and diagnosing image size. Each entry includes `Id` (layer digest or "<missing>" for imported layers), `Created` (unix timestamp), `CreatedBy` (the Dockerfile command that produced the layer, e.g. a RUN or COPY), `Size` (bytes added by that layer), and `Comment`. For full image metadata use `image_inspect` instead. args: id_or_name - Image name (with optional tag/digest) or id returns: list - Layer history entries, newest first
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
image_inspect ~173
Return the full inspect detail for a single local image. Includes config (env, entrypoint, exposed ports), size, layer digests (`RootFS.Layers`), and all tags/digests referencing it (`RepoTags`/`RepoDigests`). For a quick overview of many images use `image_list` instead. For the per-layer build history (which command produced each layer) use `image_history`. Only inspects images already present locally — for a remote image's manifest without pulling it use `image_registry_data` or `registry_manifest`. args: id_or_name - Image name (with optional tag/digest) or id returns: dict - Full image inspect attrs (equivalent to `docker inspect` on an image)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
image_list ~172
List images in the daemon's local store. Local only — for a registry's contents use `registry_tags` / `hub_tags`, and `image_search` to find images on Docker Hub. Dangling (untagged) build leftovers show with filters={"dangling": True}. args: repository - Only show images of this repository all - Show intermediate image layers filters - Filter by attributes (label, dangling, before, since, etc.) returns: list - One summary dict per image ({"Id", "RepoTags", "RepoDigests", "Created", "Size", "Labels", ...}); use `image_inspect` for a full inspect payload
| Name | Type | Req | Description |
|---|---|---|---|
| all | boolean | — | — |
| filters | object | — | — |
| repository | string | — | — |
No output schema declared.
No examples provided.
image_load ~201
Load an image from a tarball produced by `image_save`, from in-band bytes or a file on the server host. Counterpart of `image_save`; when the image lives in a registry, `image_pull` is the normal route. Pass exactly one of `data` (tarball bytes in band) or `from_file` (a path on the server host, streamed straight to the daemon — preferred for anything but small images, since in-band bytes are base64-encoded by MCP). `from_file` is read by the server's user; `~` is expanded. args: data - Tarball contents; exactly one of data/from_file from_file - Path to a tarball produced by `docker save` / `image_save`; exactly one of data/from_file returns: list - One full inspect payload per loaded image
| Name | Type | Req | Description |
|---|---|---|---|
| data | string | — | — |
| from_file | string | — | — |
No output schema declared.
No examples provided.
image_prune ~166
Remove unused local images to reclaim disk space. Without filters removes only "dangling" images — untagged layers not referenced by any tag or container. To remove all images not used by any container (including tagged ones) pass `filters={"dangling": False}`. Valid filter keys: `dangling` (bool as string "true"/"false"), `until` (RFC3339 timestamp or duration like "24h"), `label` (key or key=value). Use `system_df` first to see how much space is reclaimable. args: filters - Narrow which images to remove; omit to remove dangling images only returns: dict - {"ImagesDeleted": [...], "SpaceReclaimed": <bytes>}
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | — | — |
No output schema declared.
No examples provided.
image_pull ~166
Pull an image from a registry to the daemon's local store. Private repositories need credentials — `system_login` (or `docker login` on the host) first. Use `image_load` for tarballs, and `registry_manifest` / `image_registry_data` to inspect a remote image without pulling it. args: repository - The image repository tag - The image tag (ignored when all_tags=True) all_tags - Pull all tags from the repository platform - Platform in os/arch format returns: dict | list - Pulled image attrs (or a list of attrs if all_tags=True)
| Name | Type | Req | Description |
|---|---|---|---|
| all_tags | boolean | — | — |
| platform | string | — | — |
| repository | string | yes | — |
| tag | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | — | yes | — |
No examples provided.
image_push ~185
Push an image or repository to a registry. The local image must already bear the target name — `image_tag` it with the registry-qualified `repository[:tag]` first; a bare name pushes to Docker Hub. Private registries need credentials (`system_login`, or `docker login` on the host). Security: `auth_config` carries registry credentials, which many MCP clients log verbatim. Prefer `docker login` on the host so the `docker` module reuses credentials cached in `~/.docker/config.json`, and leave `auth_config` unset. args: repository - The image repository tag - The tag to push auth_config - Optional registry authentication config returns: str - Push output as a string
| Name | Type | Req | Description |
|---|---|---|---|
| auth_config | object | — | — |
| repository | string | yes | — |
| tag | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
image_registry_data ~168
Get registry data for an image without pulling it, via the daemon's distribution endpoint. Uses the daemon (and its cached credentials) to resolve the remote descriptor and platform list. For direct registry access without a daemon use `registry_manifest`. Security: `auth_config` carries registry credentials, which many MCP clients log verbatim. Prefer `docker login` on the host so the `docker` module reuses credentials cached in `~/.docker/config.json`, and leave `auth_config` unset. args: repository - Image reference auth_config - Optional registry authentication config returns: dict - {"Descriptor", "Platforms"} — the OCI descriptor and the platforms available for the reference
| Name | Type | Req | Description |
|---|---|---|---|
| auth_config | object | — | — |
| repository | string | yes | — |
No output schema declared.
No examples provided.
image_remove ~181
Remove a local image by name or id. Fails without `force` if the image is tagged by multiple names (untag first with `image_tag`) or if stopped containers reference it. Running containers always block removal regardless of `force`. `noprune` keeps untagged parent layers that would otherwise be removed as a side-effect; leave False unless you need to preserve the parent layers for another purpose. args: id_or_name - Image name (with optional tag/digest) or id to remove force - Remove even if referenced by stopped containers or multiple tags noprune - Do not delete untagged intermediate parent layers returns: bool - True after removal completes
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| id_or_name | string | yes | — |
| noprune | boolean | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
image_save ~321
Save an image as a tar archive: to a file on the server host, or in band. The archive keeps layers, tags, and metadata so `image_load` can restore it — different from `container_export`, which flattens one container's filesystem. With `dest_path` the archive streams straight to disk (no byte cap), so it handles large images — the file is written by the server's user, `~` is expanded, and an existing file is refused unless `overwrite=True`. Without `dest_path` the tar bytes are returned in band, capped at `max_bytes` (default 32 MiB) because MCP base64-encodes them — a fallback for when no writable host path exists (e.g. a containerized server without a bind mount). args: id_or_name - Image name or id dest_path - Destination path on the server host; omit to return the bytes in band named - Whether to retain repository/tag names in the saved archive overwrite - Replace dest_path if it already exists (default False) max_bytes - In-band mode: abort with ValueError beyond this many bytes (default 32 MiB) returns: bytes | dict - the tarball bytes (in band), or {"path": <resolved path>, "bytes_written": int}
| Name | Type | Req | Description |
|---|---|---|---|
| dest_path | string | — | — |
| id_or_name | string | yes | — |
| max_bytes | integer | — | — |
| named | boolean | — | — |
| overwrite | boolean | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | — | yes | — |
No examples provided.
image_search ~136
Search Docker Hub for public images matching a term. Searches Docker Hub only — not GHCR, ECR, or other registries. For listing tags on a specific image from any OCI registry use `registry_tags` instead. args: term - Search keyword, e.g. "nginx" or "python" limit - Maximum number of results to return (Docker Hub default is 25) returns: list - Result dicts: {"name", "description", "star_count", "is_official", "is_automated"}
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| term | string | yes | — |
No output schema declared.
No examples provided.
image_tag ~173
Tag an image into a repository (add a name to an existing local image). The image id stays the same and no data is copied — a tag is an alias. Typical flow: tag with the registry-qualified name, then `image_push`. `image_remove` on a tag merely untags while other names remain. args: id_or_name - The source image name or id repository - Target repository name (registry-qualified for pushing, e.g. "ghcr.io/o/r") tag - Optional tag for the new image (default "latest") force - Force the tag returns: bool - True if the image was tagged
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| id_or_name | string | yes | — |
| repository | string | yes | — |
| tag | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
network_connect ~294
Attach a running container to an additional network without restarting it. Use this to give a container access to services on a network it was not started with. `aliases` sets extra DNS names for this container within the network (other containers can reach it by those names in addition to its container name). `ipv4_address` / `ipv6_address` assign a specific IP on the network; omit to let the driver assign one. `links` is a legacy feature (deprecated; prefer DNS aliases). Use `network_disconnect` to undo. args: id_or_name - Network id or name to connect the container to container - Container id or name to attach aliases - Additional DNS names for this container within the network links - Legacy container links (deprecated) ipv4_address - Static IPv4 address to assign on this network ipv6_address - Static IPv6 address to assign on this network link_local_ips - Link-local IP addresses to assign driver_opt - Driver-specific endpoint options returns: bool - True after the container is connected
| Name | Type | Req | Description |
|---|---|---|---|
| aliases | array | — | — |
| container | string | yes | — |
| driver_opt | object | — | — |
| id_or_name | string | yes | — |
| ipv4_address | string | — | — |
| ipv6_address | string | — | — |
| link_local_ips | array | — | — |
| links | array | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
network_create ~344
Create a network. The daemon default driver is `bridge` (single-host); use `overlay` for swarm-wide networks. Creating a network attaches nothing — connect containers afterwards with `network_connect` or at start via `container_run(network=...)`. Created networks are stamped with provenance labels (find them later via `network_list(managed_only=True)`). args: name - The name of the network driver - Driver name (daemon default `bridge`; `overlay` for swarm scope) options - Driver-specific options dict ipam - IPAM configuration as a dict (engine shape: {"Driver", "Config": [{"Subnet", "Gateway", ...}]}) check_duplicate - Reject creation if a duplicate name exists (deprecated: recent daemons always check) internal - Restrict external access labels - Labels to set on the network enable_ipv6 - Enable IPv6 networking attachable - Allow standalone containers to attach (swarm overlay networks) scope - Network scope: "local", "global", or "swarm" ingress - Make this an ingress network for swarm routing-mesh returns: dict - The created network's attrs (Id, Name, Driver, Scope, IPAM)
| Name | Type | Req | Description |
|---|---|---|---|
| attachable | boolean | — | — |
| check_duplicate | boolean | — | — |
| driver | string | — | — |
| enable_ipv6 | boolean | — | — |
| ingress | boolean | — | — |
| internal | boolean | — | — |
| ipam | object | — | — |
| labels | object | — | — |
| name | string | yes | — |
| options | object | — | — |
| scope | string | — | — |
No output schema declared.
No examples provided.
network_disconnect ~137
Disconnect a container from a network. The container keeps running with its other network attachments; only this endpoint is removed (the reverse of `network_connect`). A network with connected containers cannot be deleted, so disconnect them before `network_remove`. args: id_or_name - The network id or name container - The container id or name to disconnect force - Force the disconnect; use to clear a stale endpoint (e.g. from a deleted container) returns: bool - True after the container is disconnected
| Name | Type | Req | Description |
|---|---|---|---|
| container | string | yes | — |
| force | boolean | — | — |
| id_or_name | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
network_inspect ~126
Return the full inspect detail for a single network. Includes the connected containers (`Containers`, keyed by container id, with each entry's assigned IP), IPAM config, and driver options. For a quick overview of many networks use `network_list` instead — its default (non-`greedy`) response omits the per-network `Containers` detail for speed. args: id_or_name - The network id or name returns: dict - Full network inspect attrs (equivalent to `docker network inspect`)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
network_list ~280
List networks. Valid filter keys: `driver` (driver name), `label` (key or key=value), `type` ("custom" or "builtin"). `names`/`ids` are a separate shorthand for filtering by exact name/id, applied in addition to `filters`. Set `greedy` to fetch each network's attrs individually (adds the connected-containers detail that `network_inspect` returns, at the cost of one extra daemon call per network) — leave it False for a fast summary list. args: names - Filter by exact network names ids - Filter by exact network ids filters - Additional server-side filters; see description for valid keys greedy - Fetch extended per-network details (including connected containers) managed_only - Only return networks created by this MCP server (filters on the docker-mcp-server.managed label); combines with any `filters` given returns: list - One dict ({"Id", "Name", "Driver", "Scope", ...}) per network: summary attrs by default, full inspect attrs (adding "Containers") when greedy=True
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | — | — |
| greedy | boolean | — | — |
| ids | array | — | — |
| managed_only | boolean | — | — |
| names | array | — | — |
No output schema declared.
No examples provided.
network_prune ~123
Remove networks that have no active container endpoints. Built-in networks (bridge, host, none) are never removed. Only networks with zero connected containers are eligible. Valid filter keys: `until` (RFC3339 timestamp or duration — removes networks created before that point), `label` (key or key=value). Use `network_remove` to delete one specific network instead. args: filters - Narrow which networks to remove; omit to remove all unused custom networks returns: dict - {"NetworksDeleted": [...]}
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | — | — |
No output schema declared.
No examples provided.
network_remove ~114
Remove a single custom network by id or name. Fails if any container is still attached (disconnect with `network_disconnect` or stop the containers first). Built-in networks (`bridge`, `host`, `none`) can never be removed and return an error regardless of attachment state. For bulk cleanup of every unused custom network at once use `network_prune` instead. args: id_or_name - The network id or name returns: bool - True after removal
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
node_inspect ~135
Get a swarm node's full inspect payload by id or name. Must run against a swarm manager. Shows role, availability, status, and manager reachability — use `node_list` to enumerate nodes first, or the `docker://nodes` resource for a fleet summary; `service_ps(filters={"node": ...})` shows what a service runs on one node. args: id_or_name - The node id or hostname (as shown by `node_list`) returns: dict - The node's attrs (Spec{Role, Availability}, Status, ManagerStatus for managers)
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
No output schema declared.
No examples provided.
node_list ~99
List swarm nodes. Must run against a swarm manager. The fleet view of membership, role, and state; drill into one node with `node_inspect`, or read the `docker://nodes` resource for a computed summary. args: filters - Filter by attributes (id, name, membership, role) returns: list - One full node document per node (Spec, Status, ManagerStatus for managers)
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | — | — |
No output schema declared.
No examples provided.
node_remove ~114
Remove a node from the swarm. A node should normally be drained (`node_update` with Availability "drain") and have left the swarm first, so its tasks reschedule cleanly. Removing an active/reachable node requires `force=True`. args: id_or_name - The node id or name to remove force - Force removal of an active/reachable node returns: bool - True after the node is removed
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| id_or_name | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
node_update ~150
Replace a node's spec (availability, name, role, labels). Replacement, not a merge: `spec` becomes the node's entire spec, and omitted keys are cleared. Fetch the current spec via `node_inspect` (its `Spec` key), modify it, and resubmit the whole dict — e.g. sending just {"Availability": "drain"} would also wipe the node's role and labels. args: id_or_name - The node id or name spec - The complete new node spec (see description — omitted keys are cleared) returns: bool - True after the update
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| spec | object | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.
node_wait ~323
Block until a swarm node's Status.State reaches a target value. Never raises on timeout — the result always carries `met` and `timed_out`. Polls `Status.State` (one of "unknown"/"down"/"ready"/"disconnected") every `poll_interval`s. Common uses: `until="ready"` after a newly joined node, or `until="down"` while draining a node before removal. Does not track task placement — for "has this drained node's workload fully moved off", inspect the relevant services' tasks directly; no single cheap call spans every service in the swarm, so that check isn't built into this tool. `service_wait` covers service convergence; `node_list` shows every node's state at once. args: id_or_name - The node id or name until - Target Status.State to wait for: "ready" (default), "down", "disconnected", "unknown" timeout_seconds - Max seconds to wait before returning with timed_out=true (default 300) poll_interval - Seconds between re-inspections (default 2, > 0); capped by the time left so a large value can't push the total wait past the timeout returns: dict - {"node", "until", "met", "timed_out", "state", "availability", "waited_seconds"}
| Name | Type | Req | Description |
|---|---|---|---|
| id_or_name | string | yes | — |
| poll_interval | number | — | — |
| timeout_seconds | number | — | — |
| until | string | — | — |
No output schema declared.
No examples provided.
plugin_configure ~164
Set runtime configuration options on an installed plugin. Use `plugin_inspect` first to see which keys the plugin exposes under `Settings.Env`; pass those same keys as a plain dict, e.g. `{"DEBUG": "1", "SOCKET": "/run/x.sock"}`. The plugin must be disabled before reconfiguring — call `plugin_disable` first if it is currently active, then `plugin_enable` afterwards to apply the new settings. args: name - Plugin name, e.g. "vieux/sshfs:latest" options - Key/value settings to apply, matching the plugin's declared env keys returns: bool - True after configuration
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | — |
| options | object | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | boolean | yes | — |
No examples provided.