Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Docker MCP Serverlist all my running containers and their status"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Docker MCP Server
Powerful Docker management for AI assistants
A comprehensive Model Context Protocol (MCP) server that empowers AI assistants like Cursor, Claude Desktop, and other MCP-compatible clients to seamlessly manage Docker containers, images, networks, volumes, and registries through natural language interactions.
Why Docker MCP Server?
Zero Configuration - Works out of the box with
npx, no installation neededSafety First - Two-step confirmation for destructive operations
Cross-Platform - Works on Windows, Linux, and macOS with automatic Docker socket detection
Comprehensive - Full Docker API coverage including Compose, registries, and system operations
AI-Native - Designed specifically for AI assistants with clear, structured responses
Features
Container Management
Full lifecycle control: Create, start, stop, restart, kill, and remove containers
Monitoring: Real-time logs, statistics, and container inspection
Advanced operations: Pause/unpause, exec commands, and resource management
Image Management
Registry operations: Pull, push, tag, and remove images
Build support: Build images from Dockerfiles with full configuration
Inspection: Detailed image history, layers, and metadata
Network Management
Network operations: Create, remove, and inspect Docker networks
Container connectivity: Connect/disconnect containers from networks
Network discovery: List and filter networks with advanced options
Volume Management
Volume operations: Create, remove, and inspect volumes
Data persistence: Manage persistent storage for containers
Volume inspection: Detailed volume information and mount points
System Operations
System information: Docker daemon info, version, and capabilities
Resource cleanup: Prune unused images, containers, volumes, and networks
Event monitoring: Real-time Docker event stream
Container Execution
Command execution: Run commands in running containers
Interactive sessions: Create and manage exec instances
Output streaming: Real-time command output and logs
Registry Integration
Docker Hub: Search repositories, list tags, authenticate, pull/push images
GitHub Container Registry (GHCR): Full authentication and image management
Multi-registry support: Seamlessly work with multiple registries
Docker Compose Support
Multi-container management: Start, stop, restart compose services
Service monitoring: View logs and status of compose services
Build operations: Build compose services with dependency management
Configuration validation: Parse and validate docker-compose.yml files
Safety Features
Two-step confirmation for all destructive operations
Resource preview: See what will be deleted before confirmation
Dual confirmation methods:
Confirm parameter (default): Works everywhere, simple and reliable
MCP Elicitation API (advanced): Interactive form-based confirmation for better UX
Installation
Via npx (Recommended)
npx @alisaitteke/docker-mcpLocal Installation
npm install -g @alisaitteke/docker-mcpOr install locally in your project:
npm install @alisaitteke/docker-mcpQuick Start
With Cursor
Add to your Cursor MCP configuration (usually in
.cursor/mcp.jsonor similar):
{
"mcpServers": {
"docker": {
"command": "npx",
"args": ["@alisaitteke/docker-mcp"]
}
}
}Restart Cursor and start managing Docker with AI!
With Claude Desktop
Add to your Claude Desktop configuration:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"docker": {
"command": "npx",
"args": ["@alisaitteke/docker-mcp"]
}
}
}Restart Claude Desktop and start managing Docker with AI!
Local Development and Testing
Prerequisites
Node.js 18.0.0 or higher
Docker daemon running
npm or yarn
Setup
Clone the repository:
git clone <repository-url>
cd docker-mcpInstall dependencies:
npm installBuild the project:
npm run buildRunning Locally
Method 1: Using npm start (after build)
# Build first
npm run build
# Run the server
npm startMethod 2: Using npm run dev (development mode with tsx)
npm run devThis uses tsx to run TypeScript directly without building.
Method 3: Direct execution
# Build first
npm run build
# Run directly with node
node dist/index.jsMethod 4: Using the binary
# Build first
npm run build
# Make sure the binary is executable
chmod +x bin/docker-mcp-server.js
# Run the binary
./bin/docker-mcp-server.jsDevelopment Workflow
Make changes to source files in
src/Build the project:
npm run buildTest the changes:
npm start
# or
npm run devCheck for TypeScript errors:
npm run typecheckLint the code:
npm run lintTroubleshooting
Docker connection issues:
Ensure Docker daemon is running:
docker psLinux/macOS: Check Docker socket permissions:
ls -la /var/run/docker.sockWindows: Ensure Docker Desktop is running and named pipe is accessible
For remote Docker, set environment variables:
DOCKER_HOST,DOCKER_CERT_PATH, etc.macOS: If
/var/run/docker.sockdoesn't exist, try~/.docker/run/docker.sock(Docker Desktop 4.0+)
Build errors:
Clear node_modules and reinstall:
rm -rf node_modules && npm installCheck TypeScript version compatibility
Ensure all dependencies are installed:
npm install
Runtime errors:
Check that Docker is accessible:
docker versionVerify the build was successful:
ls -la dist/Check server logs (errors are written to stderr)
Configuration
The server automatically detects the operating system and uses the appropriate Docker socket path:
Platform-Specific Defaults
Linux:
/var/run/docker.sock(Unix socket)macOS:
/var/run/docker.sockor~/.docker/run/docker.sock(Docker Desktop 4.0+)Windows:
//./pipe/docker_engine(Named pipe)
Connection Methods (in order of priority)
Environment variables (highest priority):
DOCKER_HOST- Docker daemon host (e.g.,tcp://localhost:2376,npipe:////./pipe/docker_engine)DOCKER_PORT- Docker daemon portDOCKER_PROTOCOL- Protocol (httporhttps)DOCKER_SOCKET_PATH- Path to Docker socket (overrides platform default)DOCKER_CERT_PATH- Path to Docker certificates directoryDOCKER_TLS_VERIFY- Enable TLS verification (1or0)
Platform-specific defaults (automatic detection):
Linux:
/var/run/docker.sockmacOS:
/var/run/docker.sock(or~/.docker/run/docker.sockif available)Windows:
//./pipe/docker_engine
Windows Configuration
On Windows, Docker Desktop uses named pipes. The server automatically detects Windows and uses the correct path. You can also explicitly set:
# Using environment variable
set DOCKER_SOCKET_PATH=//./pipe/docker_engine
# Or using DOCKER_HOST
set DOCKER_HOST=npipe:////./pipe/docker_engineRemote Docker Host
To connect to a remote Docker host:
# Linux/macOS
export DOCKER_HOST=tcp://192.168.1.100:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=/path/to/certs
# Windows
set DOCKER_HOST=tcp://192.168.1.100:2376
set DOCKER_TLS_VERIFY=1
set DOCKER_CERT_PATH=C:\path\to\certsAvailable Tools
Container Tools
docker_list_containers- List all containersdocker_create_container- Create a new containerdocker_start_container- Start a containerdocker_stop_container- Stop a containerdocker_restart_container- Restart a containerdocker_kill_container- Kill a containerdocker_remove_container- Remove a containerdocker_inspect_container- Get container detailsdocker_container_logs- Get container logsdocker_container_stats- Get container statisticsdocker_pause_container- Pause a containerdocker_unpause_container- Unpause a container
Image Tools
docker_list_images- List all imagesdocker_pull_image- Pull an image from registrydocker_push_image- Push an image to registrydocker_tag_image- Tag an imagedocker_remove_image- Remove an imagedocker_inspect_image- Get image detailsdocker_image_history- Get image history
Network Tools
docker_list_networks- List all networksdocker_create_network- Create a networkdocker_remove_network- Remove a networkdocker_inspect_network- Get network detailsdocker_connect_container- Connect container to networkdocker_disconnect_container- Disconnect container from network
Volume Tools
docker_list_volumes- List all volumesdocker_create_volume- Create a volumedocker_remove_volume- Remove a volumedocker_inspect_volume- Get volume details
System Tools
docker_system_info- Get Docker system informationdocker_version- Get Docker versiondocker_prune_system- Prune all unused resourcesdocker_prune_images- Prune unused imagesdocker_prune_containers- Prune stopped containersdocker_prune_volumes- Prune unused volumesdocker_prune_networks- Prune unused networks
Exec Tools
docker_exec- Execute a command in a containerdocker_inspect_exec- Get exec instance details
Compose Tools
docker_compose_up- Start Docker Compose servicesdocker_compose_down- Stop and remove Docker Compose servicesdocker_compose_ps- List Docker Compose servicesdocker_compose_logs- View output from Docker Compose servicesdocker_compose_config- Parse and validate docker-compose.yml filedocker_compose_build- Build Docker Compose servicesdocker_compose_restart- Restart Docker Compose servicesdocker_compose_stop- Stop Docker Compose servicesdocker_compose_start- Start Docker Compose services
Registry Tools
dockerhub_search- Search Docker Hubdockerhub_get_tags- Get repository tags from Docker Hubdockerhub_authenticate- Authenticate with Docker Hubdockerhub_pull- Pull from Docker Hubdockerhub_push- Push to Docker Hubghcr_authenticate- Authenticate with GitHub Container Registryghcr_pull- Pull from GHCRghcr_push- Push to GHCR
Examples
List running containers
{
"name": "docker_list_containers",
"arguments": {
"all": false
}
}Create and start a container
{
"name": "docker_create_container",
"arguments": {
"image": "nginx:latest",
"name": "my-nginx",
"ports": {"80/tcp": {}}
}
}Then start it:
{
"name": "docker_start_container",
"arguments": {
"id": "my-nginx"
}
}Pull an image from Docker Hub
{
"name": "docker_pull_image",
"arguments": {
"name": "ubuntu:20.04"
}
}Search Docker Hub
{
"name": "dockerhub_search",
"arguments": {
"query": "node",
"limit": 10
}
}Execute a command in a container
{
"name": "docker_exec",
"arguments": {
"containerId": "my-container",
"cmd": ["ls", "-la"],
"tty": false
}
}Start Docker Compose services
{
"name": "docker_compose_up",
"arguments": {
"projectDir": "/path/to/compose/project",
"detach": true,
"build": true
}
}View Compose logs
{
"name": "docker_compose_logs",
"arguments": {
"projectDir": "/path/to/compose/project",
"follow": false,
"tail": 100
}
}Removing Resources with Confirmation
All destructive operations (remove, kill, prune) support two confirmation methods:
Method 1: Confirm Parameter (Default - Works Everywhere)
Step 1: Preview (without confirm)
{
"name": "docker_remove_volume",
"arguments": {
"name": "my-volume"
}
}This returns volume details and a warning message.
Step 2: Confirm (with confirm=true)
{
"name": "docker_remove_volume",
"arguments": {
"name": "my-volume",
"confirm": true
}
}This actually removes the volume.
Method 2: MCP Elicitation API (Advanced - Better UX)
If your MCP client (Cursor, Claude Desktop) supports Elicitation API, you can use interactive confirmation:
{
"name": "docker_remove_volume",
"arguments": {
"name": "my-volume",
"useElicitation": true
}
}This will show an interactive confirmation dialog in the client (if supported). The client will display a form asking for confirmation, and the operation proceeds only if the user accepts.
Note: Elicitation API support depends on the MCP client. If the client doesn't support it, the server automatically falls back to the confirm parameter method.
Operations requiring confirmation:
docker_remove_volume- Remove volumesdocker_remove_container- Remove containersdocker_kill_container- Kill containersdocker_remove_image- Remove imagesdocker_remove_network- Remove networksdocker_prune_system- Prune all unused resourcesdocker_prune_images- Prune unused imagesdocker_prune_containers- Prune stopped containersdocker_prune_volumes- Prune unused volumesdocker_prune_networks- Prune unused networks
Testing the Server
Quick Test
Build the project:
npm run buildUse the test script:
./test-server.shOr test manually:
Test Docker connection:
# The server will exit with error if Docker is not accessible
node dist/index.jsIf Docker is running, you should see:
Docker MCP Server running on stdioTest with a simple MCP request (using jq for JSON formatting):
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | node dist/index.js | jqNote: The server communicates via stdio, so it will wait for JSON-RPC requests. Press Ctrl+C to exit.
Manual Testing Steps
Start the server:
npm run build
npm startIn another terminal, test with curl (if using HTTP transport) or use an MCP client
Verify Docker operations work:
List containers: Use
docker_list_containerstoolCheck system info: Use
docker_system_infotool
Integration Testing
For full integration testing, you'll need an MCP client. The server communicates via stdio (standard input/output), so it's designed to work with MCP-compatible clients like:
Cursor IDE
Claude Desktop
Custom MCP clients
Debugging
Enable verbose logging by checking stderr output. The server writes errors and status messages to stderr:
# Run and capture stderr
node dist/index.js 2> debug.logRequirements
Node.js 18.0.0 or higher
Docker daemon running and accessible
Supported Platforms:
Linux (x64, ARM64)
macOS (Intel, Apple Silicon)
Windows (x64, ARM64)
For remote Docker: Proper network access and TLS certificates (if using TLS)
Platform-Specific Notes
Linux: Requires Docker daemon with Unix socket at
/var/run/docker.sockmacOS: Works with Docker Desktop. Automatically detects socket location.
Windows: Works with Docker Desktop. Uses named pipe
//./pipe/docker_engine
Quick Start (Local Development)
# Clone and setup
git clone <repository-url>
cd docker-mcp
npm install
# Build
npm run build
# Test
./test-server.sh
# Run
npm start
# or for development
npm run devLicense
MIT
Testing with MCP Clients
Testing with Cursor (Local Development)
If you're developing locally and want to test with Cursor:
Build the project:
npm run buildAdd to Cursor MCP configuration (usually in
.cursor/mcp.jsonor similar):
{
"mcpServers": {
"docker": {
"command": "node",
"args": ["/absolute/path/to/docker-mcp/dist/index.js"]
}
}
}Or if using the binary:
{
"mcpServers": {
"docker": {
"command": "/absolute/path/to/docker-mcp/bin/docker-mcp-server.js"
}
}
}Testing with Claude Desktop (Local Development)
If you're developing locally and want to test with Claude Desktop:
Build the project:
npm run buildAdd to Claude Desktop configuration:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"docker": {
"command": "node",
"args": ["/absolute/path/to/docker-mcp/dist/index.js"]
}
}
}Testing with MCP Inspector (CLI)
You can test the server using MCP Inspector or any MCP client:
# Build first
npm run build
# The server communicates via stdio, so you can pipe commands to it
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | node dist/index.jsContributing
Contributions are welcome! Please feel free to submit a Pull Request.