Docker/Hetzner MCP Server
MCP (Model Context Protocol) server for managing Docker containers, Compose stacks, and server resources on a Hetzner dedicated server via SSH. Also includes Cloudflare DNS record management.
Tools
Containers
- list_containers -- List running (or all) Docker containers
- container_logs -- Get recent logs from a container
- container_stats -- Get CPU, memory, and network I/O for a container
- restart_container -- Restart a container
- stop_container -- Stop a running container
- start_container -- Start a stopped container
Stacks
- list_stacks -- List all Docker Compose stacks found under /opt/
- stack_status -- Get status of a Compose stack
System
- system_info -- Docker system info (disk usage, image/container counts)
- disk_usage -- Server disk usage for all mount points and key directories
- system_resources -- CPU, RAM, load average, uptime, top processes
- list_images -- List Docker images sorted by size
- prune_system -- Prune unused Docker resources (not volumes)
Caddy
- caddy_reload -- Reload the Caddy reverse proxy configuration
Cloudflare DNS
- list_dns_records -- List all DNS records for a Cloudflare zone
Setup
cd docker-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Configure
cp run-mcp.sh.example run-mcp.sh
chmod +x run-mcp.sh
# Edit run-mcp.sh and set your credentials
Prerequisites
- SSH access to the Hetzner server (configured in
~/.ssh/configas an alias) - Docker installed on the remote server
- (Optional) Cloudflare API credentials for DNS management
Environment Variables
| Variable | Required | Description |
|---|---|---|
HETZNER_SSH_HOST | Yes | SSH host alias (default: hetzner) |
CLOUDFLARE_ZONE_ID | No | Cloudflare Zone ID (for DNS tools) |
CLOUDFLARE_EMAIL | No | Cloudflare account email |
CLOUDFLARE_API_KEY | No | Cloudflare Global API Key |
Claude Code Configuration
Add to ~/.mcp.json:
{
"mcpServers": {
"docker": {
"command": "/path/to/docker-mcp/run-mcp.sh",
"type": "stdio"
}
}
}
License
MIT -- see LICENSE