docker-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DOCKER_HOST | No | Docker daemon endpoint (e.g., tcp://..., unix://..., ssh://...). Used when DOCKER_MCP_SERVER_HOSTS is not set. | |
| SSH_AUTH_SOCK | No | Path to SSH agent socket for SSH-based remote daemon connections. | |
| DOCKER_CONTEXT | No | Name of Docker context to use for resolving the default daemon. | |
| DOCKER_CERT_PATH | No | Path to directory containing TLS certificates (ca.pem, cert.pem, key.pem). | |
| DOCKER_TLS_VERIFY | No | Set to '1' to enable TLS verification for the Docker daemon connection. | |
| DOCKER_MCP_SERVER_HOSTS | No | Comma-separated list of name=endpoint pairs for multiple daemons. e.g., 'local=auto, prod=ssh://user@host(ro)' | |
| DOCKER_MCP_SERVER_DISABLE | No | Comma-separated list of domains to disable (e.g., 'swarm,buildx,scout'). | |
| DOCKER_MCP_SERVER_READONLY | No | Set to '1', 'true', 'yes', or 'on' to register only read-only tools. | |
| DOCKER_MCP_SERVER_NO_LABELS | No | Set to '1' to disable provenance labels on created Docker objects. | |
| DOCKER_MCP_SERVER_NO_DESTRUCTIVE | No | Set to '1', 'true', 'yes', or 'on' to register everything except destructive tools. | |
| DOCKER_MCP_SERVER_REGISTRY_PASSWORD | No | Password or token for private registry authentication. | |
| DOCKER_MCP_SERVER_REGISTRY_USERNAME | No | Username for private registry authentication (fallback when not provided in tool call). | |
| DOCKER_MCP_SERVER_ALLOW_SELF_TERMINATE | No | Set to '1' to allow destructive actions on the server's own container (bypasses self-termination guard). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| buildx_buildA | Build an image with BuildKit via Replaces the legacy args:
context - Build context: a filesystem path or Git/HTTP URL (verbatim; no |
| buildx_bakeA | Build multiple targets defined in a bake file (HCL, JSON, or compose). Use it for multi-target builds declared in args:
targets - Bake targets to build (default: the |
| buildx_imagetools_inspectA | Inspect a manifest in a registry without pulling. Replaces args:
image - Image reference, e.g. "alpine:3.19" or "ghcr.io/org/repo@sha256:..."
raw - Return the raw manifest bytes (a JSON document) instead of the
human-rendered tree
format - Go template format string (mutually exclusive with |
| buildx_imagetools_createA | Create a manifest list / OCI image index from existing per-platform tags. Replaces args:
target - Tag for the new manifest list ( |
| buildx_listA | List builder instances. Machine-parsed view of every builder; use returns: list - One dict per builder (parsed from |
| buildx_history_listA | List recent build records (BuildKit build history), parsed from Each record is a past build with its ref, name, status, step counts, and timestamps — useful for
finding a build to drill into with args: builder - Builder instance to read history from (defaults to the active builder) returns: list - One dict per build record (ref, name, status, total/completed/cached steps, times) |
| buildx_history_inspectA | Inspect a single build record by ref, parsed from Returns the full record for one build — duration, materials, attestations, error (if any) —
for debugging a failed or slow build found via args:
ref - Build record ref. Pass the |
| buildx_inspectA | Inspect a builder instance. Human-readable detail (driver, status, supported platforms) for one builder; args: name - Builder name (defaults to the active builder) bootstrap - Boot the builder if it isn't already running returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool}. stdout is human-readable; parse with the agent or call buildx_list for JSON. |
| buildx_duA | Report BuildKit cache disk usage as a list of records. A large cache can easily generate more output than MAX_CLI_OUTPUT_BYTES; if that happens the
captured stdout is truncated and this tool drops the final (partial) record before parsing.
For an exhaustive accounting on a busy builder, run args: builder - Override the active builder
returns: list - One dict per cache record (parsed from |
| buildx_pruneA | Remove BuildKit cache entries. Destructive: this tool always passes args: all - Include internal/frontend images filters - Filter by attributes (e.g. {"until": "24h", "type": "exec.cachemount"}) reserved_space - Amount of disk to always keep (e.g. "10GB") max_used_space - Maximum disk space the cache may use (e.g. "20GB") min_free_space - Target amount of free disk after pruning (e.g. "5GB") builder - Override the active builder timeout_seconds - Subprocess timeout (default 600s) returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool} |
| buildx_createA | Create a new BuildKit builder instance. Needed when the default args:
name - Name for the new builder (defaults to a generated name)
driver - BuildKit driver (e.g. "docker-container", "kubernetes", "remote")
driver_opts - Driver-specific options (each becomes |
| buildx_useA | Select the active builder for subsequent buildx operations. Without args:
name - Builder name to activate (from |
| buildx_removeA | Remove a builder instance. Deletes a builder made by args:
name - Builder name to remove (mutually exclusive with |
| system_pingA | Check that the Docker server is responsive. The cheapest daemon health check. A failure here usually means connection config rather than
daemon load — returns: bool - True if the daemon responded successfully |
| system_versionA | Return Docker server version information. Engine version, API level, and per-component versions — the first thing to check for feature
availability. returns: dict - {"Version", "ApiVersion", "MinAPIVersion", "Os", "Arch", "Components", ...} |
| system_infoA | Return system-wide Docker information, like Daemon runtime state: container/image counts, storage and logging drivers, swarm role, and
daemon warnings. Use returns: dict - {"Containers", "Images", "Driver", "ServerVersion", "Swarm", "Warnings", ...} |
| system_dfA | Summarize Docker disk usage: layer storage plus per-object sizes for images, containers, volumes, build cache. Equivalent to returns: dict - {"LayersSize", "Images", "Containers", "Volumes", "BuildCache"} with per-object size fields |
| host_listA | 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 returns: list[dict] - one per host: name; url (resolved daemon URL, null = docker-py platform default); read_only; non_destructive (blocks destructive calls only); tls (whether a per-host cert dir is configured); default (the omitted-host fallback) |
| system_loginA | Authenticate with a Docker registry. Security: the password is sent as a tool argument, which many MCP clients log verbatim. Prefer
running 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 |
| system_logoutA | Clear cached registry credentials from this server's in-memory Docker client. docker-py / the Engine have no true logout: Reaches into a private docker-py attribute ( args: registry - Registry key to clear, or None to clear every cached credential returns: dict - {"cleared": []} |
| system_eventsA | Stream real-time events from the Docker server, bounded by Returns when Caveat for "Wait for the next matching event" idiom: pass 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 (default 100) timeout_seconds - Max wall-clock seconds before returning what was collected (default 30) returns: list - A list of decoded event dicts (length <= limit) |
| system_closeA | 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 returns: bool - True once closed |
| system_reconnectA | 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 returns: dict - the rebuilt host's version info (same shape as |
| compose_upA | Bring up a Docker Compose project, detached. Always runs detached ( args:
project_dir - Dir with the compose file (default: server cwd, copied to the target host if no local
plugin; paths verbatim, no shell expansion)
files - Explicit compose file paths (repeatable, |
| compose_downA | Stop and remove containers, networks (and optionally volumes) for a compose project. Inverse of args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_psA | List containers in a compose project, parsed from Container-level view of one project (state, health, publishers); args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_logsA | Fetch a bounded slice of logs from a compose project (never follows). Bounded and non-following by design, so it always returns promptly. For one container's logs
use args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_configA | Render the canonical compose configuration after merges, profiles, and variable substitution. Use it to validate compose files and see exactly what the CLI will run before args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_buildA | Build images for a compose project. Builds the images declared by the project's args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_pullA | Pre-fetch images for a compose project's services without starting them. Use this to stage images before an outage window, to refresh cached images before
args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_restartA | Stop then start services without recreating containers or applying config changes. Use this to bounce a service (e.g. to pick up a runtime file change or clear an
in-memory state). If the compose file has changed (new image, environment, volumes,
ports) use args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_stopA | Stop services in a compose project without removing their containers. Unlike args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_startA | Start existing (stopped) containers of a compose project. Counterpart to args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_runA | Run a one-off command against a compose service. Always passes args:
service - Service name from the compose file
command - Command + args to run (exec-form; no shell unless you invoke one)
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_execA | Run a command inside an already-running compose service container (see also Always passes args:
service - Service name from the compose file
command - Argv to execute inside the container
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_imagesA | List the images used by a compose project's services, parsed from Answers "what image and tag does each service container actually run?" — the containers must
exist ( args:
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_portA | Resolve the host binding for a service's container port. The compose equivalent of args:
service - Service name from the compose file
private_port - The container-internal port to look up
protocol - "tcp" (default) or "udp"
index - Container index when the service has multiple replicas (default 1)
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_waitA | Block until the named service containers stop, then return their exit codes. For one-shot / batch services. A long-running service that never exits blocks until
args:
services - One or more services to wait on. At least one is required.
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_topA | Show the running processes of a compose project's containers. Output is the args:
services - Restrict to these services (default: all)
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_cpA | Copy files/folders between a service container and the server host's filesystem. Exactly one of args:
source - |
| compose_killA | Send a signal to a compose project's containers (default SIGKILL). Immediate, with no grace period — prefer args:
services - Restrict to these services (default: all)
signal - Signal to send (default "SIGKILL"; e.g. "SIGTERM", "SIGHUP")
remove_orphans - Also remove containers for services not in the compose file
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_pauseA | Pause the containers of a compose project (freezes their processes in place). Paused containers stop consuming CPU but keep memory, network endpoints, and state; resume
with args:
services - Restrict to these services (default: all)
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_unpauseA | Unpause the containers of a compose project (resumes paused processes). Reverse of args:
services - Restrict to these services (default: all)
project_dir - Dir with the compose file (default: server cwd; copied to the target host if no local plugin)
files - Explicit compose file paths (repeatable, |
| compose_listA | List compose projects known to the daemon (across all directories). Project-level view (one entry per project); args: all - Include stopped projects
returns: list - One dict per project (parsed from |
| config_createA | Create an immutable Swarm config object; requires a swarm manager. Configs store non-sensitive configuration files (nginx.conf, app.yaml, etc.) and mount
them into service containers at a specified path. Unlike secrets, config data is not
encrypted at rest — use args: name - Unique config name within the swarm data - Raw bytes content of the config file labels - Labels to set on the config templating - Templating driver config (e.g. {"Name": "golang"} for Go template syntax) returns: dict - The created config's attrs ({"ID", "Version", "CreatedAt", "Spec", ...}) |
| config_inspectA | Get a swarm config's full inspect payload by id or name. Requires a swarm manager. Unlike a secret, a config's payload IS readable after creation:
args: id_or_name - The config id or name returns: dict - The config's attrs (ID, CreatedAt, UpdatedAt, Spec{Name, Labels, Data base64}) |
| config_listA | List swarm configs; requires a swarm manager. Unlike secrets, config attrs include the actual config data ( args: filters - Narrow the list; omit to return every config returns: list - One full config document ({"ID", "Spec", ...}) per config |
| config_removeA | Remove a swarm config. Requires a swarm manager, and fails while any service still references the config — update or
remove those services first. The last step of the rotation flow described in args: id_or_name - The config id or name returns: bool - True after removal |
| container_runA | Run a container from an image (create and start in one call, like Use 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
|
| container_createA | Create a container from an image without starting it. Use this when you need to configure a container (with args: image - Image to create the container from, e.g. "nginx:alpine" command - Override the image's default command; string or list of strings extra_kwargs - Additional docker-py ContainerCollection.create keyword arguments returns: dict - The created container's attrs (not yet running) |
| container_inspectA | Return the full inspect detail for a single container. Use this when you need complete information about one container — config, state,
network settings, mounts, environment variables, and resource limits. To enumerate many
containers use args: id_or_name - Container id (full or short) or name
returns: dict - Full container inspect attrs (equivalent to |
| container_listA | List containers on the daemon (running only by default). Pass all=True to include stopped containers. For a compose project args:
all - Show all containers, including stopped ones (default False: running only)
since - Only show containers created after this id or name
before - Only show containers created before this id or name
limit - Maximum number of results
filters - Filter by attributes (e.g. status, label)
sparse - Skip inspect calls and return less detail
ignore_removed - Ignore containers removed during listing
managed_only - Only return containers created by this MCP server (filters on the
docker-mcp-server.managed label); combines with any |
| container_pruneA | Remove all stopped containers to reclaim disk space. Only removes containers that are not running — running containers are never affected.
Use args: filters - Narrow which stopped containers to remove; omit to remove all stopped returns: dict - {"ContainersDeleted": [...], "SpaceReclaimed": } |
| container_startA | 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 args: id_or_name - Container id (full or short) or name returns: dict - The container's full inspect payload after starting |
| container_stopA | Gracefully stop a running container (its configured stop signal, then SIGKILL after a timeout). Prefer this over 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) |
| container_restartA | Restart a container: stop then start again in one call. The container receives its configured stop signal ( 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 |
| container_killA | Send a signal to a running container (default SIGKILL — immediate, no graceful shutdown). Use it to force-kill a container that ignores args: id_or_name - The container id or name signal - Signal name or number as a string (e.g. "SIGHUP", "9"); default SIGKILL returns: dict - The container's full inspect payload after the signal |
| container_pauseA | 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 args: id_or_name - The container id or name returns: dict - The container's full inspect payload after pause (State.Paused true) |
| container_unpauseA | Resume all processes in a paused container (the reverse of Only valid on a paused container — it fails if the container is merely stopped; use
args: id_or_name - The container id or name returns: dict - The container's attrs after unpause (State.Paused becomes false) |
| container_removeA | Remove a container, deleting its writable layer. The image is untouched ( args:
id_or_name - The container id or name
volumes - Also remove anonymous volumes (the CLI's |
| container_logsA | Get the logs of a container: a one-shot snapshot by default, or a bounded live tail with Follow mode returns when Snapshot mode is capped at 32 MiB and raises ValueError past it, so a noisy container can't
exhaust the server's memory; Caveat for 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 |
| container_statsA | 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
args: id_or_name - The container id or name returns: dict - Engine stats payload (read, cpu_stats, precpu_stats, memory_stats, networks, pids_stats, ...) |
| container_topA | List the processes running inside a container (the daemon runs Works on any running container without executing anything in it, so it needs no shell or 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]]} |
| container_execA | Run a command inside a running container (for a compose service, prefer Security: when any element of args: id_or_name - The container id or name cmd - Command to execute (prefer exec-form argv, no shell, when any element is agent-controlled) stdout - Attach to stdout stderr - Attach to stderr stdin - Attach to stdin tty - Allocate a pseudo-TTY privileged - Run with extended privileges user - User to run the command as detach - Detach from the exec environment - Environment variables workdir - Working directory inside the container demux - Return stdout and stderr separately returns: dict - {"exit_code", "output"}; output is combined stdout+stderr, or a [stdout, stderr] pair with demux=True |
| container_commitA | Snapshot a container's current filesystem state as a new image. Useful for capturing a debugging state or saving manual changes made inside a container.
For repeatable builds use args: id_or_name - Container id or name to snapshot repository - Repository name for the new image, e.g. "myorg/myimage" tag - Tag for the new image (default: "latest") message - Commit message stored in the image metadata author - Author string stored in the image metadata pause - Pause the container during commit for consistency (default True) changes - Dockerfile instructions (CMD, ENV, EXPOSE, etc.) to apply to the image conf - Additional image configuration overrides as a dict returns: dict - The new image's full inspect payload (Id is the new image id) |
| container_diffA | List filesystem changes a container has made relative to its image. Use it to audit what a container wrote before args: id_or_name - The container id or name returns: list - Dicts of {"Path", "Kind"}; Kind 0=modified, 1=added, 2=deleted |
| container_renameA | 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 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 |
| container_updateA | 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 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 |
| container_waitA | 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 Health semantics: with no HEALTHCHECK defined, once the container is Log-match semantics: 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 |
| container_exportA | Export a container's filesystem as a tar archive: to a file on the server host, or in band. The tar is a flat filesystem snapshot with no image metadata or layers — use args: id_or_name - The container id or name dest_path - Destination path on the server host; omit to return the bytes in band 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 tar bytes (in band), or {"path": , "bytes_written": int} |
| container_archive_getA | Retrieve a file or directory from a container as a tar archive, returned in band. For large paths prefer args: id_or_name - The container id or name path - Path inside the container max_bytes - Abort with ValueError if the archive exceeds this many bytes (defaults to 32 MiB) returns: dict - Mapping with archive (bytes) and stat (dict) keys |
| container_archive_get_to_fileA | Retrieve a file or directory from a container as a tar archive written to a file on the server host. File-writing variant of args: id_or_name - The container id or name path - Path inside the container dest_path - Destination path on the server host for the tarball overwrite - Replace dest_path if it already exists (default False) returns: dict - {"path": , "bytes_written": int, "stat": dict} |
| container_archive_putA | Upload a tar archive to a path inside a container, from in-band bytes or a file on the server host. Inverse of args: id_or_name - The container id or name path - Destination path inside the container (must already exist) data - Tar archive bytes; exactly one of data/from_file from_file - Path on the server host to the tar archive to upload; exactly one of data/from_file returns: bool - True if the upload succeeded |
| context_listA | 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 returns: list - One dict per context with at least name, description, dockerEndpoint, and current |
| context_inspectA | Return the full configuration for a single Docker context. Full endpoint/TLS detail for one context; args: name - Context name (use the |
| context_createA | Create a new Docker CLI context pointing at a daemon endpoint. Registers a named endpoint for the CLI; switch with 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"; no commas
description - Optional human description shown in |
| context_useA | 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 args: name - Existing context name to set as default returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool} |
| context_removeA | 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 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} |
| image_buildA | 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
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"); an absolute path
or one containing ".." reads that file from the server host instead of the context
buildargs - Build-time variables passed as |
| image_inspectA | Return the full inspect detail for a single local image. Includes config (env, entrypoint, exposed ports), size, layer digests ( args: id_or_name - Image name (with optional tag/digest) or id
returns: dict - Full image inspect attrs (equivalent to |
| image_registry_dataA | 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 Security: args: repository - Image reference auth_config - Optional registry authentication config returns: dict - {"Descriptor", "Platforms"} — the OCI descriptor and the platforms available for the reference |
| image_listA | List images in the daemon's local store. Local only — for a registry's contents use 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_pullA | Pull an image from a registry to the daemon's local store. Private repositories need credentials — 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) |
| image_pushA | Push an image or repository to a registry. The local image must already bear the target name — Security: args: repository - The image repository tag - The tag to push auth_config - Optional registry authentication config returns: str - Push output as a string |
| image_removeA | Remove a local image by name or id. Fails without 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 |
| image_searchA | 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 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"} |
| image_pruneA | 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 args: filters - Narrow which images to remove; omit to remove dangling images only returns: dict - {"ImagesDeleted": [...], "SpaceReclaimed": } |
| image_prune_buildsA | Delete the daemon's build cache to reclaim disk space. Prunes the build cache — a separate Engine resource from the images args:
filters - Narrow which cache records to remove, e.g. {"until": "24h"} (a duration or
timestamp relative to the daemon's clock); also accepts |
| image_loadA | Load an image from a tarball produced by Counterpart of args:
data - Tarball contents; exactly one of data/from_file
from_file - Path to a tarball produced by |
| image_importA | Create an image from a flat root-filesystem tarball, like Imports a filesystem archive as a new single-layer image with no build history — not the same
thing as args:
repository - Repository name to give the new image, e.g. "myorg/rootfs"; may include a tag
( |
| image_saveA | 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 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": , "bytes_written": int} |
| image_tagA | 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 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 |
| image_historyA | Return the layer history of an image. Useful for auditing what commands built each layer and diagnosing image size. Each entry
includes args: id_or_name - Image name (with optional tag/digest) or id returns: list - Layer history entries, newest first |
| network_createA | Create a network. The daemon default driver is args:
name - The name of the network
driver - Driver name (daemon default |
| network_inspectA | Return the full inspect detail for a single network. Includes the connected containers ( args: id_or_name - The network id or name
returns: dict - Full network inspect attrs (equivalent to |
| network_listA | List networks. Valid filter keys: 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 |
| network_pruneA | 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: args: filters - Narrow which networks to remove; omit to remove all unused custom networks returns: dict - {"NetworksDeleted": [...]} |
| network_removeA | Remove a single custom network by id or name. Fails if any container is still attached (disconnect with args: id_or_name - The network id or name returns: bool - True after removal |
| network_connectA | 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.
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 |
| network_disconnectA | Disconnect a container from a network. The container keeps running with its other network attachments; only this endpoint is removed
(the reverse of 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 |
| node_inspectA | 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 args: id_or_name - The node id or hostname (as shown by |
| node_listA | List swarm nodes. Must run against a swarm manager. The fleet view of membership, role, and state; drill into
one node with args: filters - Filter by attributes (id, name, membership, role) returns: list - One full node document per node (Spec, Status, ManagerStatus for managers) |
| node_updateA | Replace a node's spec (availability, name, role, labels). Replacement, not a merge: 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 |
| node_removeA | Remove a node from the swarm. A node should normally be drained ( 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 |
| node_waitA | Block until a swarm node's Status.State reaches a target value. Never raises on timeout — the result always carries 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"} |
| plugin_createA | Build a plugin from a local plugin data directory and install it under The counterpart to args:
name - Local name for the plugin, |
| plugin_inspectA | Return the full attrs for a single installed plugin. Use this to check a plugin's args: name - Plugin name, e.g. "vieux/sshfs:latest"
returns: dict - The plugin's attrs, including |
| plugin_installA | Install a plugin from Docker Hub.
args: remote - Docker Hub plugin reference, e.g. "vieux/sshfs:latest" local_name - Alias to refer to the plugin locally; defaults to remote returns: dict - The installed plugin's attrs ({"Id", "Name", "Enabled", "Settings", "Config"}) |
| plugin_privilegesA | Ask the registry which host privileges a not-yet-installed plugin demands. The review step before args: remote - Registry plugin reference, |
| plugin_pushA | Push an installed plugin to its registry. The write-side counterpart to Bypasses docker-py's Caveat for args:
name - Installed plugin name to push, |
| plugin_listA | List installed engine plugins with their full attrs. Covers managed engine plugins (volume/network/logging drivers installed via returns: list - One attrs dict per installed plugin (Id, Name, Enabled, Settings, Config) |
| plugin_configureA | Set runtime configuration options on an installed plugin. Use 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 |
| plugin_disableA | Disable a plugin so it stops intercepting Docker API calls; the plugin remains installed. A disabled plugin cannot be used by new containers but existing containers that already
have it attached are unaffected. Use args: name - The plugin name force - Disable even if active containers are using the plugin (may disrupt them) returns: bool - True after the plugin is disabled |
| plugin_enableA | Activate an installed plugin so Docker routes relevant API calls through it. Activates a plugin that is currently disabled — either freshly installed or previously
disabled via args: name - The plugin name to enable timeout_seconds - Seconds to wait for the plugin to become healthy (0 = no timeout) returns: bool - True after the plugin is enabled |
| plugin_removeA | Uninstall an engine plugin from the daemon. Permanent removal — to deactivate but keep a plugin installed use args: name - The plugin name (e.g. "vieux/sshfs:latest") force - Remove even if the plugin is enabled (default False) returns: bool - True after removal |
| plugin_upgradeA | Upgrade an installed plugin to a newer version. The plugin must be disabled first — call args: name - The plugin name to upgrade remote - Reference to upgrade to, e.g. "vieux/sshfs:next" (default: same as name) returns: bool - True after the upgrade completes |
| registry_tagsA | List tags for a repository in an OCI v2 registry without pulling. Works against Docker Hub, GHCR, ECR, GAR, and any OCI-compliant registry; anonymous if no
credentials are passed. Talks directly to the registry over HTTPS and does NOT read
args:
repository - Image/repository ref, e.g. "alpine", "ghcr.io/org/repo"; any |
| registry_tag_waitA | Block until a specific tag appears in a repository (e.g. waiting for a CI push to land). Never raises on timeout — the result always carries Caveat: args:
repository - Image/repository ref, e.g. "alpine", "ghcr.io/org/repo"; any |
| registry_manifestA | Fetch a repository's manifest without pulling. May return a single-platform image manifest or a multi-platform manifest list / OCI image
index, depending on what the registry serves for that tag. Talks HTTPS directly — no daemon
or CLI needed. Alternatives for the same question: args:
repository - Image/repository ref, e.g. "ghcr.io/org/repo"; |
| registry_image_configA | Fetch and parse an image's config blob from a registry without pulling. Answers "what's inside this image?" — env vars, entrypoint/cmd, workdir, exposed ports, user,
labels, layer history (what args:
repository - Image/repository ref, e.g. "ghcr.io/org/repo"; |
| hub_tagsA | 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 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": , "tags": [{name, full_size, last_updated, digest, images}, ...], "truncated": bool} |
| hub_repo_infoA | 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
args: repository - Hub repository, e.g. "library/alpine" or "myorg/myimage" returns: dict - The Hub /v2/repositories// response (description, star_count, pull_count, last_updated, is_private, etc.) |
| hub_rate_limitA | Report the caller's remaining Docker Hub pull-rate-limit budget. Sends a HEAD to the 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"} |
| service_createA | Create a Swarm service; requires a swarm manager node. Use this instead of args: image - Image to run service tasks from (e.g. "nginx:alpine") command - Override the image's default command; string or list of strings extra_kwargs - Additional docker-py ServiceCollection.create keyword arguments returns: dict - The created service's full document ({"ID", "Version", "Spec", ...}) |
| service_inspectA | Get a swarm service by id or name. Must run against a swarm manager. Returns the desired-state spec and rollout status — for the
actually-running tasks use args: id_or_name - The service id or name insert_defaults - Merge default values into the output returns: dict - The full service document ({"ID", "Version", "Spec", "Endpoint", ...}; "UpdateStatus" during a rolling update) |
| service_listA | List swarm services. Must run against a swarm manager. One entry per service (the desired state); args:
filters - Filter by attributes (id, name, label, mode)
managed_only - Only return services created by this MCP server (filters on the
docker-mcp-server.managed label); combines with any |
| service_updateA | Update a swarm service's configuration, or force a redeploy with no spec change. Pass exactly one of args: id_or_name - The service id or name updates - Fields to update on the service; exactly one of updates/force force - Redeploy the service without changing its spec; exactly one of updates/force returns: bool - True after the update |
| service_removeA | Stop and remove a swarm service. Requires a swarm manager. Deletes the service definition and shuts down its tasks — no
confirmation, no undo. To stop work but keep the definition, args: id_or_name - The service id or name returns: bool - True after the service is removed |
| service_psA | List a swarm service's tasks (per-replica scheduling units), like Shows where replicas run and why they fail: each task carries args: id_or_name - The service id or name filters - Filter dict; keys: id, name, node, label, desired-state (running|shutdown|accepted) returns: list - Task dicts (ID, Slot, NodeID, Status, DesiredState, Spec) |
| service_logsA | Get a bounded snapshot of a swarm service's logs (never follows).
args: id_or_name - The service id or name details - Show extra details stdout - Include stdout stderr - Include stderr since - Show logs since this Unix timestamp timestamps - Include timestamps tail - Number of lines from the end (default 200), or the literal "all" for everything max_bytes - Abort with ValueError if the buffered logs exceed this many bytes (default 32 MiB) returns: str - Decoded log output |
| service_scaleA | Set the desired replica count for a Replicated-mode swarm service. Only applies to services in args: id_or_name - The service id or name replicas - The desired number of running task replicas returns: bool - True once the scale request is accepted |
| service_rollbackA | Roll a swarm service back to its previous spec (the docker Re-applies the service's args: id_or_name - The service id or name returns: dict - The daemon response (a dict with a "Warnings" key) |
| service_waitA | Block until a swarm service's tasks converge, or a rolling update finishes. One contract for both modes: never raises on timeout — the result always carries args:
id_or_name - The service id or name
until - Condition to wait for: "running" (default) or "update-converged"
replicas - "running" mode only: override the desired replica count (e.g. right after a
same-turn |
| docs_lookupA | 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 Omit args: section - Section name (from a no-argument call's index); omit to list all sections instead
returns: str - JSON section index (no |
| tool_listA | List this server's registered tools as compact rows, filtered by domain, category or keyword. A tool-callable mirror of args:
domain - Exact domain name (see any result's |
| scout_cvesA | List vulnerabilities (CVEs) in an image via Docker Scout. Anonymous scans work for public images; Hub policy enforcement and richer recommendations need
args:
image - Image reference (a tag or a digest)
only_fixed - Only report CVEs with a fixed version available
only_severity - Filter to these severities (omit for all)
ignore_base - Exclude CVEs introduced by the base image
format - Parsed into |
| scout_quickviewA | Render a compact summary of an image's CVE posture. The fastest triage step — counts per severity plus base-image status. Drill into individual
findings with args: image - Image reference platform - Platform of the image to analyze, e.g. "linux/amd64" returns: dict - {"result": , "raw": } |
| scout_recommendationsA | Suggest base-image upgrades for an image. Computed against Docker Scout's catalog; generally needs args: image - Image reference only_refresh - Only show "refresh" recommendations (same major/minor) only_update - Only show "update" recommendations (newer minor/major) tag - Restrict to suggestions matching this tag pattern platform - Platform of the image to analyze returns: dict - {"result": , "raw": } |
| scout_compareA | Compare two image references and report the CVE delta. Exactly one of args:
image - The new / candidate image reference
to - Compare against this image reference, directory, or archive (a local directory/archive
only when the CLI runs on this host — see above)
to_env - Compare against an image associated with this Scout environment
to_latest - Compare against the latest scan of |
| scout_sbomA | Generate a Software Bill of Materials (SBOM) for an image. Package inventory only — args:
image - Image reference
format - "spdx" (default, SPDX JSON), "cyclonedx" (CycloneDX JSON), "json" (Scout's native
JSON), or "list" (plain-text package list)
platform - Platform of the image to analyze
returns: dict - {"format", "result", "raw": }. |
| secret_createA | Create a swarm secret; requires a swarm manager. Write-once: the payload can never be read back through the API ( args: name - Name for the secret (unique within the swarm) data - The secret payload (max 500 KB; must be empty when driver is set) labels - Labels to set on the secret driver - Optional secret-driver config for values held in an external store returns: dict - The created secret's attrs (ID and Spec metadata; never the payload) |
| secret_inspectA | Get a swarm secret's metadata by id or name; requires a swarm manager. The returned attrs never include the secret's actual data ( args: id_or_name - The secret id or name returns: dict - The secret's attrs, excluding the actual secret data |
| secret_listA | List swarm secrets' metadata; requires a swarm manager. Like args: filters - Narrow the list; omit to return every secret returns: list - A list of secret attrs dicts (data-free) |
| secret_removeA | Remove a Swarm secret; requires a swarm manager. Removing a secret does not immediately affect running service tasks — tasks that already
have the secret mounted retain access until they are restarted or the service is updated.
Use args: id_or_name - The secret id or name to remove returns: bool - True after removal |
| stack_deployA | Deploy (or update) a stack to the swarm from one or more Compose files. Requires the target daemon to be a swarm manager. Re-running with the same args:
name - Name of the stack to create or update
compose_files - One or more Compose file paths (repeated |
| stack_listA | List the stacks deployed to the swarm, parsed from Requires the target daemon to be a swarm manager. returns: list - One dict per stack (name, services count, orchestrator) |
| stack_psA | List the tasks of a stack, parsed from Task-level view across every service in the stack ( args: name - The stack to list tasks for no_trunc - Do not truncate task IDs / errors in the output filters - Filter by attributes, e.g. {"desired-state": "running"}; a list value repeats the filter returns: list - One dict per task (id, name, node, image, desired/current state, error) |
| stack_servicesA | List the services of a stack, parsed from Service-level rollup (replicas ready per service); use args: name - The stack to list services for filters - Filter by attributes, e.g. {"name": "web"}; a list value repeats the filter returns: list - One dict per service (id, name, mode, replicas, image, ports) |
| stack_removeA | Remove one or more stacks from the swarm (tears down their services, networks, and secrets). Destructive: this stops and deletes every service in the named stack(s) — the reverse of
args: names - One or more stack names to remove. At least one is required. detach - Return immediately (True) vs wait for the stack(s) to be fully removed (False) timeout_seconds - Subprocess timeout (default 300s) returns: dict - {"returncode": int, "stdout": str, "stderr": str, "truncated": bool} |
| swarm_initA | Initialize a new swarm, making this Engine its first manager node. Fails if the Engine is already part of a swarm — call args: advertise_addr - Externally reachable address advertised to other nodes listen_addr - Listen address used for inter-manager communication force_new_cluster - Force a new single-node cluster from this node's current state (disaster recovery when a majority of managers is lost) default_addr_pool - IP address pools for swarm overlay networks subnet_size - Subnet size for the IP pool data_path_addr - Address to use for data path traffic data_path_port - Port number for data path traffic name - Name of the swarm labels - Labels to set on the swarm autolock_managers - Require the unlock key after every manager restart log_driver - Default log driver configuration returns: str - The node id of the newly created swarm manager |
| swarm_joinA | Join this Engine to an existing swarm as a worker or manager. Fails if the Engine is already part of a swarm. Whether this node joins as a worker or
a manager is determined entirely by which token is passed — args:
remote_addrs - Address(es) of existing swarm managers to connect to
join_token - The worker or manager join token (from |
| swarm_leaveA | Leave the current swarm. The daemon's service tasks are rescheduled to the remaining nodes. A manager refuses to leave
without force=True, since leaving can break raft quorum. The departed node lingers as "down"
in args: force - Force leave even if the node is a manager returns: bool - True after leaving the swarm |
| swarm_updateA | Update swarm-wide settings: the single home for join-token and unlock-key rotation. 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 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 returns: bool - True after the update completes |
| swarm_inspectA | Inspect the swarm this daemon belongs to (id, spec, join-token config, CA info). Works on a manager node only. Cluster-level configuration — for per-node state use
returns: dict - The swarm's attrs, as returned by the daemon's swarm inspect endpoint |
| swarm_unlockA | Unlock a manager node that is locked after restart due to autolock being enabled. When autolock is enabled (via args: key - The swarm unlock key (from |
| swarm_unlock_keyA | Return the swarm's current unlock key. The key only serves a purpose when autolock is enabled (see returns: dict - {"UnlockKey": } |
| swarm_join_tokensA | Return the swarm's worker and manager join tokens. These are the tokens a new node passes to returns: dict - {"Worker": , "Manager": } |
| swarm_task_listA | List tasks across the whole swarm, like The cluster-wide view of what is actually scheduled. args:
filters - Filter dict; keys: id, name, service, node, label, desired-state
(running|shutdown|accepted); omit for every task in the cluster
returns: list - One full task document per task (ID, ServiceID, NodeID, Slot, Spec, Status,
DesiredState), the same shape |
| swarm_task_inspectA | Inspect a single swarm task, like For when you already hold a task reference -- from a args:
id_or_name - The task id, an unambiguous id prefix, or the task's full name -- which is the
container-name form |
| volume_createA | 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 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 attrs ({"Name", "Driver", "Mountpoint", "Labels", ...}) |
| volume_inspectA | Get a volume's full inspect payload by name. Use it after args: name - The volume name (volumes have no ids) returns: dict - The volume's attrs (Name, Driver, Mountpoint, CreatedAt, Labels, Options, Scope) |
| volume_listA | List volumes. Volumes are addressed by name only — feed a Name to 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 |
| volume_pruneA | 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 args: filters - Narrow which unused volumes to remove; omit to remove all anonymous ones returns: dict - {"VolumesDeleted": [...], "SpaceReclaimed": } |
| volume_removeA | 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 args: name - Volume name to remove force - Remove even if a container still references the volume returns: bool - True after removal |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| lookup_docker_docs | Read the Docker SDK for Python documentation for a section before writing code that uses it. |
| verify_docker_method | Verify that a specific Docker SDK method exists before relying on it. |
| deploy_container | Deploy a containerized application end-to-end: image, network, volume, container. |
| troubleshoot_container | Troubleshoot a misbehaving container by gathering logs, state, and stats. |
| monitor_container_fleet | Sweep every running container for health and resource pressure (read-only monitoring). |
| triage_incident | Triage a host-wide incident from symptoms when you don't yet know which container is at fault. |
| migrate_container | Replace a running container with a new image while preserving its configuration. |
| clean_environment | Reclaim disk space by pruning unused docker resources. |
| prune_managed | Tear down only the resources this MCP server created, leaving everything else untouched. |
| inspect_stack | Inspect every docker resource that shares a label. |
| plan_compose_stack | Plan a multi-container application from an informal description. |
| deploy_compose_project | Bring up a Docker Compose project and verify it's healthy. |
| troubleshoot_compose_project | Diagnose a misbehaving Docker Compose project. |
| audit_docker_contexts | Review this server's configured hosts and Docker contexts, and the daemon it targets. |
| audit_swarm_health | Audit the health of a docker swarm: nodes, services, and task convergence. |
| find_latest_image_tag | Find the latest tag for an image without pulling it. |
| plan_multiarch_build | Plan and run a multi-platform image build with buildx. |
| audit_image_cves | Audit an image's CVE posture with Docker Scout. |
| compare_image_versions | Compare two image versions and report the CVE delta. |
| recommend_base_image | Recommend a safer base image via Docker Scout. |
| inspect_multiarch_manifest | Inspect a multi-arch manifest list / OCI image index without pulling. |
| create_multiarch_manifest | Create a multi-arch manifest list from existing per-platform tags. |
| migrate_from_docker_manifest | Translate `docker manifest …` commands into buildx imagetools equivalents. |
| review_dockerfile | Review a Dockerfile for security, correctness, and cache-efficiency issues. |
| audit_container_security | Audit running containers for risky runtime configuration (privilege, host access). |
| debug_container_networking | Diagnose why one container cannot reach another over the network. |
| investigate_disk_usage | Investigate what is consuming docker disk space before pruning. |
| backup_volume | Back up a named volume's contents to a tar file on the server host. |
| restore_volume | Restore a named volume's contents from a tar file on the server host. |
| deploy_swarm_stack | Deploy a Compose file to a swarm as a stack and verify the rollout. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| list_docs_sections | List the available documentation sections. The response keeps the original `base_url` and `sections` (a list of section names) fields for backward compatibility with clients that parsed the pre-extension shape. Sections served from external URLs (compose, context, registry specs) appear in `sections` alongside the SDK ones; their absolute URLs live in `section_urls`. returns: str - JSON describing each section's source URL and how to read it |
| get_tool_catalog | List every tool this server knows about with its domain, mutation category, and whether the active env switches actually registered it. Read this to see the blast radius of a tool before calling it (READ_ONLY / MUTATING / DESTRUCTIVE) and to confirm which whole domains the operator disabled via DOCKER_MCP_SERVER_DISABLE (or the read-only switches) — a tool absent from the live tool list but present here as `registered: false` was filtered out by configuration, not missing by mistake. returns: str - JSON with `switches`, per-domain counts, and a per-tool list |
| get_hosts_resource | The Docker hosts configured via DOCKER_MCP_SERVER_HOSTS — the same data as the `host_list` tool: each host's name, resolved daemon URL, read_only / non_destructive / tls flags, and which one is the default used when a tool's `host` argument is omitted. The resolved default is observable here but is not itself a selectable label. returns: str - JSON list, one object per configured host |
| list_container_resources | Index every container with the resource URIs for reading its logs and live stats. Lists all containers (running and stopped). Each entry carries a `logs` URI (readable in any state — useful for diagnosing why a container exited) and, for running containers only, a `stats` URI (a stopped container has no live cgroup to sample). Exited containers include their `exit_code` as a triage signal. returns: str - JSON object {"containers": [{id, name, image, status, exit_code?, logs, stats?}, ...]} |
| list_service_resources | Index every swarm service with the resource URIs for reading its logs and task/rollout status. returns: str - JSON object {"services": [{id, name, image, mode, desired_replicas, logs, tasks}, ...]} |
| list_node_resources | Index every swarm node with its state, availability, role, and (for managers) reachability. Index only — no per-node child resource. Watch this to notice a node flapping between ready/down, or an unexpected availability/role change, without re-querying `node_list`. returns: str - JSON object {"nodes": [{id, hostname, state, availability, role, manager_reachability}, ...]} |
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/L337-org/docker-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server