Skip to main content
Glama
hifishhe

Synology Docker MCP Server

by hifishhe
README.md
# Synology Docker MCP Server

*(Scroll down for English version / 英文版本在下方)*

## 🇨🇳 中文说明 (Chinese Version)

这是一个专门为群晖 (Synology NAS) 设计的 Model Context Protocol (MCP) 服务器。它旨在通过大语言模型直接管理、配置和调试群晖 Container Manager 中的 Docker 容器和 Docker Compose 项目。

### ✨ 核心功能与亮点

- **基于 SSH 的安全管理**: 直接通过 SSH 与您的群晖 NAS 进行通信,安全执行原生命令,彻底免除对外暴露 Docker TCP 接口的风险。
- **自动提权系统 (Auto-Privilege Escalation)**: 自动注入凭证静默执行 `sudo`,完美解决群晖管理员账号在执行 docker 时常见的 `Permission Denied` 权限壁垒。
- **DSM Container Manager 原生 Project 控制面**: 对 DSM 创建/管理的 Project,通过 `SYNO.Docker.Project` 调用原生 Project API;不再将普通 `docker-compose` wrapper 视为 DSM Project 控制面。
- **全方位工具集**:
  - `synology_docker_ps`: 查看所有运行中的容器。
  - `synology_docker_logs`: 获取并追踪容器日志。
  - `synology_docker_manage`: 控制容器的启动、停止、重启或移除。
  - `synology_project_list`: 自动搜索并发现 `/volume1/docker/` 目录下的 Compose 项目。
  - `synology_project_manage`: **仅限非 DSM 管理项目**的 legacy `docker-compose` wrapper;不得用于 Container Manager Project。
  - `synology_dsm_project_list` / `synology_dsm_project_log`: 读取 DSM 原生 Project registry 和操作日志。
  - `synology_dsm_container_list`: 读取 DSM Container Manager 的容器名称/ID 映射。
  - `synology_dsm_project_manage`: 对 DSM Project 执行 `build_stream`、`start_stream`、`stop_stream` 或 `restart_stream`;刻意不暴露 `clean` / `delete`。
  - `synology_read_file` / `synology_write_file`: 远程读取或修改 `.env` 与 `docker-compose.yml` 配置文件。

### 🔒 安全加固记录 (v1.1.0)

| 漏洞 | 修复方案 |
|------|---------|
| 密码特殊字符展开(`$`/反引号) | `echo "..."` 改为 `printf '%s\n' '...'`,避免 shell 展开 |
| 命令注入(容器名/项目名/路径拼接) | 所有用户输入经 `shQuote()` 单引号包裹后再拼接命令 |
| action 参数未验证 | 代码层白名单校验,独立于 schema enum |
| 路径遍历(`/etc/shadow` 等) | `synology_read_file` / `synology_write_file` 限制在 `NAS_DOCKER_DIR` 内,拒绝含 `..` 的路径 |
| `tail` 参数注入 | 强制正整数,上限 10000,默认 100 |
| SSH 连接无超时 | 添加 `readyTimeout: 30000` |

### 🚀 快速上手 (面向终端用户)

1. **开启群晖 SSH 服务**: 
   前往 **控制面板 -> 终端机和 SNMP** 并勾选 **启动 SSH 功能**。
   
2. **接入 MCP 客户端 (例如 Claude Desktop 或 Cursor)**:
   您**不需要**克隆代码或安装任何东西。只需将以下内容添加到客户端的 MCP 配置文件 JSON 中,客户端会自动通过 `npx` 帮您拉取并运行最新版代码:
   ```json
   {
     "mcpServers": {
       "synology-docker": {
         "command": "npx",
         "args": [
           "-y",
           "synology-docker-mcp"
         ],
         "env": {
           "NAS_HOST": "192.168.1.xxx",
           "NAS_PORT": "22",
           "NAS_USER": "your_admin_account",
           "NAS_PASSWORD": "your_admin_password",
           "NAS_DOCKER_DIR": "/volume1/docker"
         }
       }
     }
   }
   ```

### 🛠️ 本地开发 (面向开发者)

如果您希望修改此项目的源代码:

1. **克隆并配置**:
   复制项目中的 `.env.example` 并重命名为 `.env`,填入您的 NAS 连接信息。

2. **安装依赖并构建**:
   ```bash
   npm install
   npm run build
   ```

3. **测试运行**:
   ```bash
   npm start
   ```

### 📦 npm 发布(维护者)

项目通过 GitHub Actions 的 npm Trusted Publishing 发布,不保存长期 npm token。首次发布前,在 npm 包设置中添加 trusted publisher:

```text
Repository: hifishhe/Synology-Docker-MCP
Workflow filename: publish-npm.yml
```

之后在 GitHub **Actions → Publish npm package → Run workflow** 中输入要发布的 tag(例如 `v1.0.2`)。以后推送新的 `v*` tag 会自动触发发布。

---

## 🇬🇧 English Version

This is a Model Context Protocol (MCP) server specifically designed to manage, configure, and debug Docker containers and Docker Compose projects on Synology NAS devices.

### ✨ Features & Highlights

- **SSH-Based Management**: Communicates with your Synology NAS directly via SSH, ensuring secure execution of native commands without needing to expose the Docker TCP socket.
- **Auto-Privilege Escalation**: Automatically injects credentials to run `sudo` silently, bypassing the `Permission Denied` issues commonly faced by Synology administrator accounts.
- **DSM Container Manager Native Project Control Plane**: DSM-created or DSM-managed Projects are operated through the native `SYNO.Docker.Project` API. A plain `docker-compose` wrapper is not treated as DSM Project control.
- **Comprehensive Toolset**:
  - `synology_docker_ps`: View all running containers.
  - `synology_docker_logs`: Stream container logs.
  - `synology_docker_manage`: Start, stop, restart, or remove containers.
  - `synology_project_list`: Discover Compose projects under `/volume1/docker/`.
  - `synology_project_manage`: Legacy `docker-compose` wrapper for **non-DSM-managed projects only**; never use it for a Container Manager Project.
  - `synology_dsm_project_list` / `synology_dsm_project_log`: Read the native DSM Project registry and action log.
  - `synology_dsm_container_list`: Read DSM Container Manager's displayed container name-to-ID mapping.
  - `synology_dsm_project_manage`: Run `build_stream`, `start_stream`, `stop_stream`, or `restart_stream` for a DSM Project; `clean` and `delete` are intentionally unavailable.
  - `synology_read_file` / `synology_write_file`: Edit `.env` and `docker-compose.yml` configurations remotely.

### 🔒 Security Hardening (v1.1.0)

| Vulnerability | Fix |
|---------------|-----|
| Password shell expansion (`$`, backticks) | Replaced `echo "..."` with `printf '%s\n' '...'` to prevent shell expansion |
| Command injection (container/project name/path concatenation) | All user inputs wrapped with `shQuote()` before shell concatenation |
| Unvalidated `action` parameter | Code-level whitelist enforced independently of schema enum |
| Path traversal (e.g. reading `/etc/shadow`) | `synology_read_file` / `synology_write_file` restricted to `NAS_DOCKER_DIR`; paths with `..` segments rejected |
| `tail` parameter injection | Enforced positive integer, capped at 10000, defaults to 100 |
| SSH connection hangs indefinitely | Added `readyTimeout: 30000` |

### 🚀 Setup Instructions

1. **Enable SSH on Synology NAS**: 
   Go to **Control Panel -> Terminal & SNMP** and check **Enable SSH service**.
   
2. **Configure Credentials**:
   Copy `.env.example` to `.env` and fill in your NAS connection details:
   ```env
   NAS_HOST=192.168.1.xxx
   NAS_PORT=22
   NAS_USER=your_admin_account
   NAS_PASSWORD=your_admin_password
   NAS_DOCKER_DIR=/volume1/docker
   ```

3. **Install Dependencies & Build**:
   ```bash
   npm install
   npm run build
   ```

4. **Connect to MCP Client (e.g. Claude Desktop / Cursor)**:
   While you can use a local `node` path if built locally, the **highly recommended** method is to use `npx` (which pulls directly from npm, requiring no local cloning). Add the following to your MCP configuration JSON:
   ```json
   {
     "mcpServers": {
       "synology-docker": {
         "command": "npx",
         "args": [
           "-y",
           "synology-docker-mcp"
         ],
         "env": {
           "NAS_HOST": "192.168.1.xxx",
           "NAS_PORT": "22",
           "NAS_USER": "your_admin_account",
           "NAS_PASSWORD": "your_admin_password",
           "NAS_DOCKER_DIR": "/volume1/docker"
         }
       }
     }
   }
   ```

### 📦 npm Publishing (Maintainers)

This project uses GitHub Actions npm Trusted Publishing and stores no long-lived npm token. Before the first publication, add a trusted publisher in the npm package settings:

```text
Repository: hifishhe/Synology-Docker-MCP
Workflow filename: publish-npm.yml
```

Then run **Actions → Publish npm package → Run workflow** and enter the tag to publish (for example `v1.0.2`). Future `v*` tags trigger publishing automatically.

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct operation: container logs, lifecycle, listing; project listing, lifecycle; file read/write. No overlap in functionality.

Naming Consistency4/5

All tools share the 'synology_' prefix, but verb placement varies: some are verb_noun (synology_read_file) while others are noun_verb (synology_docker_logs). Mostly consistent with minor deviations.

Tool Count5/5

7 tools cover the essential Docker and project management operations without being excessive or sparse. Well-scoped for a NAS-specific server.

Completeness4/5

Covers core container and project lifecycle, logs, and file editing. Minor gaps like lack of image management or detailed inspect, but adequate for typical use.

Maintenance

ActivityStale
ResponsivenessNo issues