An MCP server that provides tools for managing Docker containers, including starting, stopping, restarting, listing, running, and deleting containers, as well as retrieving logs and statistics.
This server presents moderate definition quality with mixed results across tools. All 8 tools have names starting with action verbs (get_, list_, start_, stop_, restart_, run_, delete_) and are individually named, which is positive. However, critical gaps exist: parameter descriptions are minimal or absent in many tools, output schemas are entirely undocumented, error handling provides only generic error wrapping with no recovery guidance, and there is no information about the structured format of responses. The descriptions themselves are brief (10-30 chars typical) but present. Schema definitions exist in Python signatures but are not formally exposed or documented for the agent. All tools lack output schema documentation, making it impossible for an LLM to plan downstream calls or extract structured data. Error responses return raw exception strings (e.g., 'Error: {str(e)}') without actionable guidance. No pagination, batching, or composition support is evident.
Get CPU and memory usage of a container
Delete (remove) a Docker container
Get last N lines of logs from a container
List all Docker containers with ID, name, and status
Restart a container
Run a new Docker container
Start a stopped container
No output schemas documented. All tools return plain strings with no structure (e.g., 'Container xyz started' or 'Error: {error}'). LLMs cannot parse or plan downstream calls against undefined output.
Minimal or missing parameter descriptions. Most parameters (e.g., 'container_id', 'ports', 'detach') have only 1-3 word descriptions. LLMs lack context to understand constraints, formats, or when to use them. E.g., 'ports' says 'Optional port mappings' but does not explain the format (dict structure, keys/values, valid syntax).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Stop a running container
No error handling guidance. All error paths return 'Error: {str(e)}' or generic Docker exception messages. No recovery path suggested (retry, user action, alternative tool call). LLM cannot determine if error is retryable or fatal.
Destructive operation (delete_container) lacks confirmation or dry-run support. No pre-delete validation, no undo recovery path, no user confirmation step before irreversible deletion.
list_containers returns unbounded results as a single string. No pagination, no limit parameter, no cursor or offset. If 1000 containers exist, the response is a giant string that wastes tokens and risks context exhaustion.
Tool descriptions are too brief (10-30 chars). They state WHAT the tool does but not WHEN to use it, PREREQUISITES, or DEPENDENCIES. Insufficient for LLM tool selection.
Parameter 'container_id' is opaque. No guidance on accepting container names as aliases. Users say 'stop my-app-container'; agent must guess whether to pass the name or resolve via list_containers first. Requires extra lookup call.
Parameter 'ports' in run_container lacks format specification. Description says 'Optional port mappings' but dict structure is undefined. LLM cannot know whether to pass {'8080': '80'}, {'host': '8080', 'container': '80'}, or other formats.
No input validation. Invalid parameters (bad container_id, invalid port mapping) are silently caught and returned as 'Error: {exception}'. No validation message tells LLM what constraint was violated or how to fix it.
No tool composition support. Tools are isolated; no response fields are designed to feed into downstream calls. E.g., run_container returns container name but not container_id; subsequent tools need the ID, forcing a list_containers lookup.