Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Docker Agent Backend

FreeNot checked

Lightweight, secure Docker agent with REST and WebSocket APIs for container management and real-time monitoring, built with FastAPI.

GitHubEmbed

About

Lightweight, secure Docker agent with REST and WebSocket APIs for container management and real-time monitoring, built with FastAPI.

README

A lightweight, secure, and extensible backend agent built with FastAPI that lets you manage and monitor Docker containers remotely — via both REST APIs and real-time WebSocket streaming.

License: MIT Ask DeepWiki

Features

  • List Docker containers
  • View container details and logs
  • Start / stop / restart containers
  • Real-time log streaming via WebSocket
  • Stream live container stats
  • Docker events stream (start/stop/etc)
  • List images
  • MCP (Model Context Protocol) support for AI assistants
  • API versioning (/api/v1/)
  • JWT authentication with token expiration
  • Rate limiting to prevent abuse
  • CORS configuration
  • Request tracing with unique request IDs
  • Structured logging (JSON in production)
  • Production-ready Docker setup (non-root, health checks)

API Overview

Note: All endpoints are prefixed with /api/v1

Auth

Method Endpoint Description Auth Required
POST /api/v1/auth/login Get JWT token No
GET /api/v1/auth/check Validate token & get user info Yes

Containers

Method Endpoint Description Rate Limit
GET /api/v1/containers/ List all containers 60/min
GET /api/v1/containers/{id} Get container details 60/min
GET /api/v1/containers/{id}/logs View container logs 60/min
POST /api/v1/containers/{id}/start Start container 10/min
POST /api/v1/containers/{id}/stop Stop container 10/min
POST /api/v1/containers/{id}/restart Restart container 10/min

Stats & System

Method Endpoint Description Auth Required
GET /api/v1/stats/{id} CPU, memory, network, I/O stats Yes
GET /api/v1/version Docker version, API version, OS, arch Yes
GET /api/v1/healthz Basic health check No
GET /api/v1/health Enhanced health with system info Yes

Images

Method Endpoint Description
GET /api/v1/images/ List Docker images

WebSocket Endpoints

Real-time streaming with JWT token passed as query parameter.

Path Description
/api/v1/logs/ws/{id}?token=JWT Stream live logs
/api/v1/stats/ws/{id}?token=JWT Stream live CPU/memory
/api/v1/events/ws?token=JWT Stream Docker events

MCP (Model Context Protocol)

Enables AI assistants (Claude, Cursor, etc.) to interact with Docker via the MCP protocol.

Path Description Auth
GET /mcp/sse SSE endpoint for MCP connection API Key (Bearer)
POST /mcp/messages/ Handle MCP messages API Key (Bearer)

Available MCP Tools:

Tool Description
docker_health Get Docker daemon health and system info
docker_version Get Docker version information
list_containers List all containers with status and ports
get_container Get detailed container info
get_container_logs Get container logs
get_container_stats Get container CPU/memory/network stats
list_images List all Docker images
start_container Start a stopped container
stop_container Stop a running container
restart_container Restart a container

Installation

Using Docker Compose (Recommended)

# Clone the repo
git clone https://github.com/ahmed-gelemli/docker-agent-backend.git
cd docker-agent-backend

# Create environment file
cat > .env << EOF
SECRET_KEY=$(openssl rand -base64 32)
API_USERNAME=admin
API_PASSWORD=your_secure_password
EOF

# Build and run
docker compose up --build -d

Local Development

# Create virtual environment
python -m venv venv
source venv/bin/activate  # Linux/Mac
# or: venv\Scripts\activate  # Windows

# Install dependencies
pip install -r requirements.txt

# Create .env file (see Configuration section)

# Run development server
python run.py

Configuration

Create a .env file in the project root:

# REQUIRED - Generate with: openssl rand -base64 32
SECRET_KEY=your-secret-key-at-least-32-characters

# API Credentials
API_USERNAME=admin
API_PASSWORD=your_secure_password

# JWT Settings (optional)
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30

# CORS (optional) - comma-separated origins
CORS_ORIGINS=https://your-dashboard.com,https://another-origin.com

# Rate Limiting (optional)
RATE_LIMIT_ENABLED=true
RATE_LIMIT_REQUESTS=100
RATE_LIMIT_WINDOW=60

# MCP Configuration
MCP_ENABLED=true
MCP_API_KEY=your-mcp-api-key-at-least-16-chars  # Generate with: openssl rand -base64 32
MCP_DEBUG=false

# Application (optional)
DEBUG=false
APP_NAME=Docker Agent

Usage

1. Get a JWT Token

curl -X POST http://localhost:9000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username": "admin", "password": "your_password"}'

Response:

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer",
  "expires_in": 1800
}

2. Use the Token

# List containers
curl http://localhost:9000/api/v1/containers/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Response:

{
  "containers": [
    {
      "id": "9a2dd44bdbed",
      "name": "my-container",
      "image": "nginx:latest",
      "status": "running",
      "state": "running",
      "created": 1735123456,
      "ports": []
    }
  ],
  "total": 1
}
# Get container details
curl http://localhost:9000/api/v1/containers/CONTAINER_ID \
  -H "Authorization: Bearer YOUR_TOKEN"

Response:

{
  "id": "9a2dd44bdbedabc123...",
  "short_id": "9a2dd44bdbed",
  "name": "my-container",
  "image": "nginx:latest",
  "status": "running",
  "state": {
    "status": "running",
    "running": true,
    "paused": false,
    "pid": 12345,
    "exit_code": 0
  },
  "config": {
    "hostname": "9a2dd44bdbed",
    "env": ["PATH=/usr/local/bin", "NGINX_VERSION=1.25"],
    "cmd": ["nginx", "-g", "daemon off;"],
    "labels": {}
  },
  "mounts": [],
  "networks": {
    "bridge": {
      "ip_address": "172.17.0.2",
      "gateway": "172.17.0.1"
    }
  },
  "ports": []
}
# Get enhanced health check
curl http://localhost:9000/api/v1/health \
  -H "Authorization: Bearer YOUR_TOKEN"

Response:

{
  "status": "ok",
  "docker_connected": true,
  "docker_version": "24.0.7",
  "api_version": "1.43",
  "os": "linux",
  "arch": "amd64",
  "containers_running": 3,
  "containers_total": 5,
  "images_total": 12,
  "memory_total": 16777216000,
  "cpus": 8
}
# Restart a container
curl -X POST http://localhost:9000/api/v1/containers/CONTAINER_ID/restart \
  -H "Authorization: Bearer YOUR_TOKEN"

3. WebSocket Connection

const token = "your_jwt_token";
const ws = new WebSocket(`ws://localhost:9000/api/v1/logs/ws/CONTAINER_ID?token=${token}`);

ws.onmessage = (event) => {
  console.log("Log:", event.data);
};

4. MCP Connection

Configure your AI assistant (Claude Desktop, Cursor, etc.) with the MCP server URL:

{
  "mcpServers": {
    "docker-agent": {
      "url": "http://localhost:9000/mcp/sse",
      "headers": {
        "Authorization": "Bearer YOUR_MCP_API_KEY"
      }
    }
  }
}

Or use the API key as a query parameter:

http://localhost:9000/mcp/sse?api_key=YOUR_MCP_API_KEY

MCP Deployment Notes

✅ Works With

Environment Status
Single instance deployment
Cloud VMs (EC2, DigitalOcean, etc.)
Kubernetes (1 replica)
Docker Compose (single container)

⚠️ Limitations

Environment Issue
Horizontal scaling (multiple replicas) SSE sessions are stored in-memory; needs sticky sessions
Serverless (Lambda, Vercel Functions) SSE requires long-lived connections
Some load balancers May timeout idle SSE connections (30-60s)

Workarounds

  • Sticky Sessions: Configure your load balancer to route the same client to the same instance
  • Single Replica: Deploy with replicas: 1 if horizontal scaling isn't needed
  • Increase Timeouts: Configure load balancer idle timeout > expected connection duration

Future TODOs

  • Add StreamableHTTP transport for stateless MCP (better scaling support)
  • Redis-backed session store for multi-instance deployments
  • MCP tool for docker exec commands
  • MCP tool for pulling images
  • MCP tool for creating/removing containers
  • MCP prompts and resources support

Security & Observability

Feature Description
API Versioning All endpoints prefixed with /api/v1 for future compatibility
JWT Auth Tokens expire after 30 minutes (configurable)
Rate Limiting Auth: 5/min, Actions: 10/min, Reads: 60/min
CORS Configurable allowed origins
Request Tracing Every response includes X-Request-ID and X-Process-Time headers
Structured Logging JSON logs in production, colored output in debug mode
Non-root Container Runs as dockeragent user
No Stack Traces Errors don't leak internal details
Health Checks Basic (/healthz) and enhanced (/health) endpoints

from github.com/ahmed-gelemli/docker-agent-backend

Installing Docker Agent Backend

This server has no published package — it is built from source. Open the repository and follow its README.

▸ github.com/ahmed-gelemli/docker-agent-backend

FAQ

Is Docker Agent Backend MCP free?

Yes, Docker Agent Backend MCP is free — one-click install via Unyly at no cost.

Does Docker Agent Backend need an API key?

No, Docker Agent Backend runs without API keys or environment variables.

Is Docker Agent Backend hosted or self-hosted?

Self-hosted: the server runs locally on your machine via the install command above.

How do I install Docker Agent Backend in Claude Desktop, Claude Code or Cursor?

Open Docker Agent Backend on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.

Related MCPs

Compare Docker Agent Backend with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All development MCPs