diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ca2a5b8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [0.2.0] - 2026-04-14 + +### Added + +**Images** +- `list_images` — list local images sorted by size; marks images in use and with available updates +- `delete_image` — delete image by `name:tag` or hash; refuses if image is used by a container + +**Container** +- `container_stats` — live CPU %, RAM used/limit, network I/O, block I/O + +**System** +- `system_df` — Docker disk usage: image count/size, running/stopped containers, reclaimable space +- `system_prune` — remove dangling images, stopped containers, and unused networks + +**Networks** +- `list_networks` — list all Docker networks with driver, subnet, gateway, attached containers +- `create_network` — create a new bridge (or other driver) network +- `delete_network` — delete a network; refuses if any container is still attached + +### Fixed + +- `get_container_status` now reads the correct DSM response fields (`details.State` for status/running, `profile.image` for image name) and displays IP addresses, port bindings, and mounts +- `redeploy_project` is now status-aware: RUNNING → stop + start; STOPPED → start directly; BUILD_FAILED → force-stop + start; unknown status returns a clear error with workaround hint +- Container names with hash prefix (e.g. `f93cb8b504f7_jenkins`) are now transparently stripped in `list_containers`, `container_stats`, `get_container_status`, `get_container_logs`, and `exec_in_container` + +### Changed + +- `DsmClient` gained a `post_request()` method for form-encoded POST operations required by image delete, network create/delete + +## [0.1.0] - 2026-04-13 + +### Added + +- Initial implementation +- **Projects**: `list_projects`, `get_project_status`, `start_project`, `stop_project`, `redeploy_project` +- **Containers**: `list_containers`, `get_container_status`, `get_container_logs`, `exec_in_container` +- **Compose**: `read_compose`, `update_compose`, `update_image_tag`, `update_env_var` +- **Images**: `check_image_updates` +- DSM session management with auto re-authentication on session timeout +- OS keyring integration for secure credential storage +- 2FA / device token support +- Interactive `setup` wizard and `check` connectivity command diff --git a/CLAUDE.md b/CLAUDE.md index 1267e2d..e1069a9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -32,7 +32,7 @@ via Container Manager. Der MCP-Server ist in Claude Desktop aktiv verbunden. ## Aktueller Stand -### Implementierte Tools (17) +### Implementierte Tools (22) | Kategorie | Tools | |---|---| diff --git a/README.md b/README.md index 1dde188..784e0f6 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,19 @@ # mcp-synology-container -An MCP (Model Context Protocol) server for managing Docker projects on a Synology NAS via Container Manager. Enables Claude Desktop to list, start, stop, redeploy, and modify Docker Compose projects directly. +An MCP (Model Context Protocol) server for managing Docker on a Synology NAS via Container Manager. Enables Claude Desktop to inspect, start, stop, redeploy, and modify Docker Compose projects directly — including live resource stats, log tailing, network management, and disk usage. ## Features -- **Project management**: list, start, stop, redeploy Container Manager projects -- **Container inspection**: list containers, view status and resource usage, fetch logs -- **Compose file editing**: read, modify image tags, update env vars, or replace compose files entirely -- **Image update checks**: see which images have updates available +- **Project management**: list, start, stop, redeploy Container Manager projects (status-aware) +- **Container inspection**: status with IPs/ports/mounts, live resource stats, log tailing, exec +- **Compose file editing**: read, replace, update image tags and env vars +- **Image management**: list images with sizes, check for updates, delete unused images +- **Network management**: list, create, and delete Docker networks +- **System overview**: disk usage (images, containers), prune dangling resources +- **Hash-prefix handling**: transparent resolution of DSM hash-prefixed container names - **2FA support**: device token flow for Synology accounts with OTP enabled - **OS keyring integration**: credentials stored securely, never in config files -- **Confirmation required** for all destructive operations (stop, redeploy, exec, compose writes) +- **Confirmation required** for all destructive operations ## Requirements @@ -121,41 +124,59 @@ Credentials from environment variables take priority over the keyring. ## MCP Tools -See [docs/tools.md](docs/tools.md) for the full tool reference. +22 tools across 6 categories. ### Projects | Tool | Description | Confirmation | |---|---|---| -| `list_projects` | List all Container Manager projects | — | -| `get_project_status` | Detailed project status | — | -| `start_project` | Start a project | — | -| `stop_project` | Stop a project | required | -| `redeploy_project` | Pull images + restart project | required | +| `list_projects` | List all Container Manager projects with status and container count | — | +| `get_project_status` | Detailed status, path, services, and container IDs | — | +| `start_project` | Start a stopped project | — | +| `stop_project` | Stop a running project (halts all containers) | required | +| `redeploy_project` | Stop and restart a project; auto-detects current state (RUNNING/STOPPED/BUILD_FAILED) | required | ### Containers | Tool | Description | Confirmation | |---|---|---| -| `list_containers` | List containers (optionally filtered by project) | — | -| `get_container_status` | Status, uptime, resource limits | — | -| `get_container_logs` | Fetch container log output | — | -| `exec_in_container` | Execute command in container | required | +| `list_containers` | List containers, optionally filtered by project | — | +| `get_container_status` | Status, running state, image, IP addresses, port bindings, mounts | — | +| `get_container_logs` | Fetch log output with optional keyword filter | — | +| `exec_in_container` | Execute a shell command inside a running container | required | +| `container_stats` | Live CPU %, RAM used/limit, network I/O, block I/O | — | ### Compose Files | Tool | Description | Confirmation | |---|---|---| | `read_compose` | Read the compose file of a project | — | -| `update_image_tag` | Update image tag for a service | required | -| `update_env_var` | Add/update an environment variable | required | -| `update_compose` | Replace entire compose file | required | +| `update_image_tag` | Update the image tag for a specific service | required | +| `update_env_var` | Add or update an environment variable for a service | required | +| `update_compose` | Replace the entire compose file | required | ### Images | Tool | Description | Confirmation | |---|---|---| -| `check_image_updates` | Check for available image updates | — | +| `list_images` | List local images sorted by size (largest first); marks images in use and available updates | — | +| `delete_image` | Delete a local image by `name:tag` or hash; refuses if image is in use | required | +| `check_image_updates` | Check which images have updates available; optionally filter by project | — | + +### System + +| Tool | Description | Confirmation | +|---|---|---| +| `system_df` | Docker disk usage: image count/size, running/stopped containers, reclaimable space | — | +| `system_prune` | Remove dangling images, stopped containers, and unused networks | required | + +### Networks + +| Tool | Description | Confirmation | +|---|---|---| +| `list_networks` | List all Docker networks with driver, subnet, gateway, and attached containers | — | +| `create_network` | Create a new Docker network (bridge or other driver) | required | +| `delete_network` | Delete a network; refuses if any container is attached | required | ## Development diff --git a/pyproject.toml b/pyproject.toml index 7b8db63..08bf8f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mcp-synology-container" -version = "0.1.0" +version = "0.2.0" description = "MCP server for Synology Container Manager" requires-python = ">=3.12" dependencies = [