On this page
Docker MCP is three pieces: the open-source MCP Gateway that runs servers in containers, the MCP Toolkit UI in Docker Desktop that drives it, and the MCP Catalog of containerized servers. TrustedMCP grades the Gateway B. The servers you run through it each need their own review.
How the three pieces fit
MCP Gateway. Docker's docs call it "Docker's open source solution for
orchestrating Model Context Protocol (MCP) servers." It's the docker mcp CLI
plugin from the docker/mcp-gateway repo.
Your AI client connects to the Gateway as one MCP server, and the Gateway
starts the real servers in containers and routes each tool call to the right
one.
MCP Toolkit. The Toolkit docs describe it as "a management interface integrated into Docker Desktop." You pick servers, set their config and secrets, and connect clients with buttons. Under the hood it uses the Gateway. The docs say that with the Toolkit enabled, "the Gateway runs automatically in the background."
MCP Catalog. The catalog docs describe "a curated collection of verified MCP servers, packaged as Docker images and distributed through Docker Hub." You can browse it at hub.docker.com/mcp or in the Toolkit's Catalog tab.
Profiles tie it together. A profile is a named set of servers with their config. You connect a client to a profile, and the client sees only those servers' tools.
Setup
Docker Desktop (Toolkit). Docker's Toolkit docs cover Docker Desktop 4.62 and later. Open MCP Toolkit from the Docker Desktop menu, add servers from the Catalog tab to a profile, then open the Clients tab and select Connect next to your client.
Claude Code (from the mcp-gateway README):
docker mcp profile create --name dev-tools \
--server catalog://mcp/docker-mcp-catalog/github
docker mcp client connect claude-code --profile dev-tools --global
The README says to run docker mcp catalog pull mcp/docker-mcp-catalog
first.
Cursor: add --connect cursor to the profile create command above, or use
the general form docker mcp client connect <client-name> --profile <profile-id>.
Claude Desktop: in the Toolkit's Clients tab, select Connect next to Claude Desktop, then restart Claude Desktop if it's running.
VS Code (one project):
docker mcp client connect vscode --profile my_profile
echo ".vscode/mcp.json" >> .gitignore
VS Code (global): the Toolkit docs add an MCP_DOCKER server to your user
mcp.json that runs the Gateway over stdio:
"mcp": {
"servers": {
"MCP_DOCKER": {
"command": "docker",
"args": [
"mcp",
"gateway",
"run",
"--profile",
"my_profile"
],
"type": "stdio"
}
}
}
Without Docker Desktop: download the docker-mcp binary from the repo's
releases into ~/.docker/cli-plugins/ and run docker mcp --help to check it.
The README also says to set DOCKER_MCP_IN_CONTAINER=1 for WSL2, containers or
Docker CE, and to run docker mcp feature enable profiles before using
profiles.
What the containers isolate
Docker documents these protections in the Toolkit docs and the Gateway's security notes:
- One container per server, started with
no-new-privilegesand resource limits. The defaults are 1 CPU and 2 GB of memory per server (--cpusand--memory). - No host filesystem by default. You grant mounts per server. Host paths are mounted read-only unless you explicitly allow a writable path.
- Per-server secrets. The Gateway passes a server only the environment
variables, config and secrets declared for that server. Your host environment
isn't passed through. Secrets live in Docker Desktop's secret store
(
docker mcp secret), not in your client config. For the general pattern, see keeping API keys out of your MCP config. - Secret blocking.
--block-secretsis on by default and scans tool-call arguments and responses for secret-like values. - Signed images.
--verify-signaturesis on by default for Docker'smcp/images on Docker Hub. The catalog docs say Docker builds and signs its local servers and ships each with provenance and SBOM metadata. - Call logging.
--log-callsis on by default and records the tool name and argument shape, not full values. - Interceptors.
--interceptorruns your own hooks around tool calls, in the formwhen:type:path(for examplebefore:exec:/bin/path).
What they don't isolate
- Network egress is open by default. Docker's security notes say egress
"is not globally denied by default." Add
--block-network, or use per-serverdisableNetworkandallowHostssettings. - Granted access is still access. A server with your GitHub token can do whatever that token allows. The container stops it reading your disk. It doesn't stop it misusing the token.
- Prompt injection passes straight through. Docker's notes put poisoned tool output out of scope unless it breaks a Gateway boundary. Text from an issue or web page reaches your model the same way it would without Docker.
- HTTP mode needs care. The
sseandstreamingtransports require a bearer token by default, but--allow-unauthenticatedturns that off. Keep the Gateway on stdio, or bind it to localhost.
Review each server, not just the Gateway
Running a server in a container doesn't make the server trustworthy. Every catalog entry is a different codebase from a different publisher, with its own auth model, its own write tools and its own bugs. The container limits the damage, but you still decide whether to give that server your credentials.
So check each server before you add it to a profile. Use the
5-minute safety check and look the server
up in the directory. Enable only the tools you need. The Gateway
supports per-profile tool lists, for example
docker mcp profile tools <profile-id> --enable github.create_issue. Fewer
tools also means less context spent on tool definitions, as covered in
how much context MCP tools cost. And don't
rely on a server's read-only labels alone; see
MCP tool annotations explained.
Why it grades B
The Gateway is first-party, open source and actively maintained, and its
defaults are good: per-server secrets, signature checks, secret blocking and
no host filesystem. That puts it well above running the same servers directly
with npx.
It loses ground in three places. Network egress is open unless you turn on
--block-network. The HTTP transports rely on one shared bearer token, which
can be switched off. And its advisory history is long for a young project: ten
published advisories, two rated critical, including one where image signature
verification was off by default. Run a current release.
The grade is about the Gateway only. It says nothing about the servers you run through it. Details are on the Docker MCP Gateway listing.
Frequently asked questions
What's the difference between the Gateway and the Toolkit?
The Gateway is the engine: an open-source CLI plugin that runs servers in containers and gives your client one endpoint. The Toolkit is the Docker Desktop UI for managing it. You can use the Gateway alone from the command line. The Toolkit always uses the Gateway.
What's in the Docker MCP catalog?
Docker's docs say "300+" servers. Local servers run as containers on your machine and are built and signed by Docker. Remote servers run on the provider's infrastructure, from partners such as Stripe, Grafana and New Relic. Others can submit servers through Docker's registry. You can also build custom catalogs for your team.
Is the Docker MCP Toolkit deprecated?
Docker's docs don't describe it as deprecated or renamed as of Oct 2026. The current Toolkit docs cover Docker Desktop 4.62 and later and note that earlier versions have a different UI, which may be why older tutorials look out of date. The docs present the Toolkit, Gateway and Catalog as current, actively documented features.
Does it need Docker Desktop?
The Toolkit does. The Gateway doesn't: Docker documents installing the
docker-mcp plugin on Docker Engine without Docker Desktop. Docker Desktop
does give you its secret store and the Clients tab, so CLI-only setups take
more configuration.
More: MCP security best practices ยท Is this MCP server safe to install?