Built-in MCP server · Docker, Swarm, Kubernetes
Monitor your Docker servers from one container.
Containers, endpoints, TLS certificates, cron jobs, host resources and image updates. One tool instead of Uptime Kuma, Healthchecks, a certificate checker and a Grafana stack.
Read-only: it never starts, stops or changes a container. Under 30 MB of RAM at idle.
Free on one server. Personal 149 € incl. VAT once. Pro 29 €/month excl. VAT. See pricing
- Under 30 MB of RAM at idle
- Read-only access to the Docker socket
- Docker · Swarm · Kubernetes
- Apache 2.0 open source core
Five tools to watch one server.
Uptime Kuma for HTTP, Healthchecks for cron jobs, Prometheus, cAdvisor and Grafana for metrics, a script for certificates. Five things to install, update and secure, and none of them sees the whole stack.
Maintenant is one container that reads the Docker socket and finds what runs on its own. Endpoints and certificates are declared with Docker labels, next to the service they watch.
What it watches
- Containers
- Found on their own on Docker, Swarm and Kubernetes. States, health checks, restart loops, logs.
- Endpoints
- HTTP and TCP checks with latency and the status code you expect, declared as Docker labels.
- Cron jobs
- One ping URL per job. You get an alert when a run is late or fails.
- TLS certificates
- Found on your HTTPS endpoints. Alerts at 30, 14, 7, 3 and 1 day before expiry.
- Image updates and CVEs
- Which containers have a newer image, and Personal which known vulnerabilities they carry.
- Exposure
- Ports published on every interface, privileged and host-network containers, a host OS past its end of life.
- Status page
- Public and live, built from your monitors. Pro adds subscribers and branding.
- Several servers
- Personal Read-only agents on your other hosts, one dashboard for all of them. How it works
- MCP server
- Claude Code, OpenCode or n8n read your containers, logs and alerts, and nothing else.
See it running before you install anything.
The demo runs the Pro edition with every feature unlocked, on real containers. No account, no install. Open the alerts, the status page, the security posture and the multi-server view.
Open the live demo

Maintenant watches. Your agent investigates.
The loop has three steps.
Detect
Fixed rules decide that something is down: consecutive failures, thresholds, missed deadlines, restart loops. No model is involved, so an alert is never invented and nothing is spent while everything is fine.
Push
The alert leaves as a webhook:
alert.firedwhen it starts,alert.resolvedwhen it recovers, with the host it belongs to (agent_id) and a link back to it.Investigate
Your agent receives the alert and queries the built-in MCP server: the container's logs, the endpoint's check history, CPU and memory, the other active alerts on the same host. You get a diagnosis, not just a red light.
Show the setup
With Claude Code
A small receiver (Python, standard library only) runs on the host next to Maintenant. Each fired alert starts a headless Claude Code session that can only call Maintenant's read-only MCP tools, and the diagnosis lands in reports/<alert-id>.md.
# on the host, next to Maintenant
export RECEIVER_TOKEN=$(openssl rand -hex 32)
python3 examples/agent-webhook/receiver.py # listens on 127.0.0.1:9099
# what the receiver runs for each alert
claude -p "maintenant just fired this alert: {...} Investigate it read-only." \
--mcp-config mcp.json --strict-mcp-config --tools "" \
--allowedTools mcp__maintenant__list_alerts \
mcp__maintenant__get_container_logs \
mcp__maintenant__get_endpoint_history \
mcp__maintenant__get_resourcesmcp.json reaches Maintenant over stdio with docker exec -i maintenant /app/maintenant --mcp-stdio, so no MCP port is opened. Point a webhook channel at the receiver with an Authorization: Bearer header and route alerts to it with a trigger.
With OpenCode, the same receiver calls opencode run instead of claude -p, with Maintenant declared as a local MCP server in opencode.json.
With n8n, a Webhook trigger feeds an AI Agent node whose MCP Client tool points at your instance's /mcp endpoint.
Free on one server. Paid when you outgrow it.
Same binary in every edition. A license key lifts the limits: no reinstall, no migration.
Install with one compose file.
# docker-compose.yml
services:
maintenant:
image: ghcr.io/kolapsis/maintenant:latest
ports:
- "8080:8080"
read_only: true
security_opt:
- no-new-privileges:true
tmpfs:
- /tmp:noexec,nosuid,size=64m
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /proc:/host/proc:ro
- /etc/os-release:/host/etc/os-release:ro
- maintenant-data:/data
environment:
MAINTENANT_ADDR: "0.0.0.0:8080"
MAINTENANT_DB: "/data/maintenant.db"
restart: unless-stopped
volumes:
maintenant-data:This is a first run on your own machine. It publishes 8080 on every interface, which leaves the admin API open to whoever reaches the host, and mounting the socket read-only protects the file, not the Docker API behind it. Keep maintenant behind a reverse proxy that authenticates, and reach Docker through a socket proxy. Read the security guide
Containers show up on their own. Add a label to watch an endpoint. Bought a key later? Set MAINTENANT_LICENSE_KEY and restart: same container, same data.
Compatible with Docker Engine 19.03+ and Kubernetes · Linux amd64/arm64 · macOS · WSL2
How it compares
Honest comparisons, including what each of these tools does better.
See the paid editions running.
The demo has every Pro feature on. When you know which edition fits, the pricing page has the rest.