
Synology MCP Server
β 132from atom2ueki
Manage files and downloads on Synology NAS devices using an AI assistant.
πΎ Synology MCP Server
A Model Context Protocol (MCP) server for Synology NAS devices. Enables AI assistants to manage files and downloads through secure authentication and session management.
π NEW: Unified server supports both Claude/Cursor (stdio) and Xiaozhi (WebSocket) simultaneously!
π Xiaozhi Integration
New unified architecture supports both clients simultaneously!
How It Works
-
ENABLE_XIAOZHI=false (default): Standard MCP server for Claude/Cursor via stdio
-
ENABLE_XIAOZHI=true: Multi-client bridge supporting both:
-
π‘ Xiaozhi: WebSocket connection
-
π» Claude/Cursor: stdio connection
Setup Steps
- Add to your .env file:
ENABLE_XIAOZHI=true
XIAOZHI_TOKEN=your_xiaozhi_token_here
- Run normally:
# Same command, different behavior based on environment
python main.py
# OR
docker-compose up
Key Features
-
β Zero Configuration Conflicts: One server, multiple clients
-
β Parallel Operation: Both clients can work simultaneously
-
β All Tools Available: Xiaozhi gets access to all Synology MCP tools
-
β Backward Compatible: Existing setups work unchanged
-
β Auto-Reconnection: Handles WebSocket connection drops
-
β Environment Controlled: Simple boolean flag to enable/disable
Startup Messages
Claude/Cursor only mode:
π Synology MCP Server
==============================
π Claude/Cursor only mode (ENABLE_XIAOZHI=false)
Both clients mode:
π Synology MCP Server with Xiaozhi Bridge
==================================================
π Supports BOTH Xiaozhi and Claude/Cursor simultaneously!
π οΈ Available MCP Tools
π Authentication
-
synology_status- Check authentication status and active sessions -
synology_list_nas- List all configured NAS units from settings.json -
synology_login- Authenticate with Synology NAS (conditional) -
synology_logout- Logout from session (conditional)
π File System Operations
-
list_shares- List all available NAS shares -
list_directory- List directory contents with metadata -
path(required): Directory path starting with/ -
get_file_info- Get detailed file/directory information -
path(required): File path starting with/ -
search_files- Search files matching pattern -
path(required): Search directory -
pattern(required): Search pattern (e.g.,*.pdf) -
create_file- Create new files with content -
path(required): Full file path starting with/ -
content(optional): File content (default: empty string) -
overwrite(optional): Overwrite existing files (default: false) -
create_directory- Create new directories -
folder_path(required): Parent directory path starting with/ -
name(required): New directory name -
force_parent(optional): Create parent directories if needed (default: false) -
delete- Delete files or directories (auto-detects type) -
path(required): File/directory path starting with/ -
rename_file- Rename files or directories -
path(required): Current file path -
new_name(required): New filename -
move_file- Move files to new location -
source_path(required): Source file path -
destination_path(required): Destination path -
overwrite(optional): Overwrite existing files
π₯ Download Station Management
-
ds_get_info- Get Download Station information -
ds_list_tasks- List all download tasks with status -
offset(optional): Pagination offset -
limit(optional): Max tasks to return -
ds_create_task- Create new download task -
uri(required): Download URL or magnet link -
destination(optional): Download folder path -
ds_pause_tasks- Pause download tasks -
task_ids(required): Array of task IDs -
ds_resume_tasks- Resume paused tasks -
task_ids(required): Array of task IDs -
ds_delete_tasks- Delete download tasks -
task_ids(required): Array of task IDs -
force_complete(optional): Force delete completed -
ds_get_statistics- Get download/upload statistics
π₯ Health Monitoring
-
synology_system_info- Get system model, serial, DSM version, uptime, temperature -
synology_utilization- Get real-time CPU, memory, swap, and disk I/O utilization -
synology_disk_health- List all physical disks with SMART status, model, temp, size -
synology_disk_smart- Get detailed SMART attributes for a specific disk -
synology_volume_status- List all volumes with status, size, usage, filesystem type -
synology_storage_pool- List RAID/storage pools with level, status, member disks -
synology_network- Get network interface status and transfer rates -
synology_ups- Get UPS status, battery level, power readings -
synology_services- List installed packages and their running status -
synology_system_log- Get recent system log entries -
synology_health_summary- Aggregate system info, utilization, disk health, and volume status
π³ Container Manager
-
synology_container_list- List Container Manager containers -
offset(optional): Pagination offset -
limit(optional): Maximum containers to return -
container_type(optional): Container filter (default:all) -
synology_container_get- Get a Container Manager container -
name(required): Container name -
synology_container_start- Start a Container Manager container -
name(required): Container name -
synology_container_stop- Stop a Container Manager container -
name(required): Container name -
synology_container_restart- Restart a Container Manager container -
name(required): Container name -
synology_container_delete- Delete a Container Manager container -
name(required): Container name -
force(optional): Force deletion (default: false) -
preserve_profile(optional): Preserve Synology container profile (default: true) -
synology_container_logs- Get Container Manager container logs -
name(required): Container name -
since(optional): Log start time/filter -
offset(optional): Pagination offset (default: 0) -
limit(optional): Maximum log lines to return (default: 1000) -
synology_container_resource- Get real-time resource usage for a Container Manager container -
name(required): Container name -
synology_container_project_list- List Container Manager projects -
synology_container_project_get- Get a Container Manager project -
name(required): Project name -
synology_container_project_create- Create a Container Manager project -
name(required): Project name -
share_path(required): Project folder path on the NAS -
content(required): Docker Compose YAML content -
enable_service_portal(optional): Enable Synology service portal (default: false) -
service_portal_name(optional): Service portal name -
service_portal_port(optional): Service portal port -
service_portal_protocol(optional): Service portal protocol (default:http) -
synology_container_project_update- Update a Container Manager project -
name(required): Project name -
content(required): Docker Compose YAML content -
enable_service_portal(optional): Enable Synology service portal -
service_portal_name(optional): Service portal name -
service_portal_port(optional): Service portal port -
service_portal_protocol(optional): Service portal protocol -
synology_container_project_start- Start a Container Manager project -
name(required): Project name -
synology_container_project_stop- Stop a Container Manager project -
name(required): Project name -
synology_container_project_restart- Restart a Container Manager project -
name(required): Project name -
synology_container_project_build- Build a Container Manager project -
name(required): Project name -
synology_container_project_clean- Clean a Container Manager project -
name(required): Project name -
synology_container_project_delete- Delete a Container Manager project -
name(required): Project name -
synology_container_image_list- List Container Manager images -
offset(optional): Pagination offset -
limit(optional): Maximum images to return -
show_dsm(optional): Include DSM images (default: false) -
synology_container_image_get- Get a Container Manager image -
name(required): Image repository name -
tag(optional): Image tag (default:latest) -
synology_container_image_delete- Delete a Container Manager image -
name(required): Image repository name -
tag(optional): Image tag (default:latest) -
synology_container_image_pull- Pull a Container Manager image -
repository(required): Image repository name -
tag(optional): Image tag (default:latest) -
synology_container_registry_list- List Container Manager registries -
synology_container_registry_search- Search Container Manager registries -
query(required): Image search query -
offset(optional): Pagination offset -
limit(optional): Maximum results to return -
synology_container_registry_tags- List tags for a registry image -
repository(required): Image repository name -
offset(optional): Pagination offset -
limit(optional): Maximum tags to return -
synology_container_registry_download- Download a registry image -
repository(required): Image repository name -
tag(optional): Image tag (default:latest) -
synology_container_network_list- List Container Manager networks -
synology_container_network_get- Get a Container Manager network -
name(required): Network name -
synology_container_network_create- Create a Container Manager network -
name(required): Network name -
driver(optional): Network driver (default:bridge) -
subnet(optional): Subnet CIDR -
gateway(optional): Gateway IP -
ip_range(optional): Allocatable IP range CIDR -
enable_ipv6(optional): Enable IPv6 (default: false) -
synology_container_network_delete- Delete a Container Manager network -
name(required): Network name
π¦ NFS Management
-
synology_nfs_status- Get NFS service status and configuration -
synology_nfs_enable- Enable or disable the NFS service -
synology_nfs_list_shares- List all shared folders with their NFS permissions -
synology_nfs_set_permission- Set NFS client access permissions on a shared folder
π§ Claude Code / Claude.ai Skill
For Claude Code, Claude Desktop, and claude.ai users, this repo ships an Anthropic Agent Skill that teaches Claude how to use the MCP tools effectively β picking the right tool, targeting the right NAS in multi-NAS setups, preferring aggregate health checks over fan-out calls, and using correct path conventions.
The skill lives at skills/synology-nas/ and uses progressive disclosure across seven domains (auth, files, downloads, health, containers, shares/NFS, user management).
Install:
-
Claude Code: copy or symlink the folder into
~/.claude/skills/synology-nas/ -
Claude.ai / Claude Desktop: upload the
synology-nas/folder via the Skills settings page
The skill is purely additive β it works alongside the MCP and only triggers on Synology/NAS-related prompts.
β¨ Features
-
β Unified Entry Point - Single
main.pysupports both stdio and WebSocket clients -
β Environment Controlled - Switch modes via
ENABLE_XIAOZHIenvironment variable -
β Multi-Client Support - Simultaneous Claude/Cursor + Xiaozhi access
-
β Secure Authentication - RSA encrypted password transmission
-
β Session Management - Persistent sessions across multiple NAS devices
-
β Complete File Operations - Create, delete, list, search, rename, move files with detailed metadata
-
β Directory Management - Recursive directory operations with safety checks
-
β Download Station - Complete torrent and download management
-
β Docker Support - Easy containerized deployment
-
β Backward Compatible - Existing configurations work unchanged
-
β Error Handling - Comprehensive error reporting and recovery
ποΈ Architecture
File Structure
mcp-server-synology/
βββ main.py # π― Unified entry point
βββ src/
β βββ mcp_server.py # Standard MCP server
β βββ multiclient_bridge.py # Multi-client bridge
β βββ auth/ # Authentication modules
β βββ filestation/ # File operations
β βββ downloadstation/ # Download management
βββ docker-compose.yml # Single service, environment-controlled
βββ Dockerfile
βββ requirements.txt
βββ .env # Configuration
Mode Selection
-
ENABLE_XIAOZHI=falseβmain.pyβmcp_server.py(stdio only) -
ENABLE_XIAOZHI=trueβmain.pyβmulticlient_bridge.pyβmcp_server.py(both clients)
Perfect for any workflow - from simple Claude/Cursor usage to advanced multi-client setups! π
# Install dependencies
pip install -r requirements.txt
# Run with environment control
python main.pyBefore it works, you'll need: SYNOLOGY_URLSYNOLOGY_USERNAMESYNOLOGY_PASSWORDAUTO_LOGINENABLE_XIAOZHI
π Quick Start with Docker
1οΈβ£ Setup Environment
# Clone repository
git clone https://github.com/atom2ueki/mcp-server-synology.git
cd mcp-server-synology
# Create environment file
cp env.example .env
2οΈβ£ Configure .env File
Basic Configuration (Claude/Cursor only):
# Required: Synology NAS connection
SYNOLOGY_URL=http://192.168.1.100:5000
SYNOLOGY_USERNAME=your_username
SYNOLOGY_PASSWORD=your_password
# Optional: Auto-login on startup
AUTO_LOGIN=true
VERIFY_SSL=false
Extended Configuration (Both Claude/Cursor + Xiaozhi):
# Required: Synology NAS connection
SYNOLOGY_URL=http://192.168.1.100:5000
SYNOLOGY_USERNAME=your_username
SYNOLOGY_PASSWORD=your_password
# Optional: Auto-login on startup
AUTO_LOGIN=true
VERIFY_SSL=false
# Enable Xiaozhi support
ENABLE_XIAOZHI=true
XIAOZHI_TOKEN=your_xiaozhi_token_here
XIAOZHI_MCP_ENDPOINT=wss://api.xiaozhi.me/mcp/
3οΈβ£ Run with Docker
One simple command supports both modes:
# Claude/Cursor only mode (default if ENABLE_XIAOZHI not set)
docker-compose up -d
# Both Claude/Cursor + Xiaozhi mode (if ENABLE_XIAOZHI=true in .env)
docker-compose up -d
# Build and run
docker-compose up -d --build
4οΈβ£ Alternative: Local Python
# Install dependencies
pip install -r requirements.txt
# Run with environment control
python main.py
π Client Setup
π€ Claude Desktop
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"synology": {
"command": "docker-compose",
"args": [
"-f", "/path/to/your/mcp-server-synology/docker-compose.yml",
"run", "--rm", "synology-mcp"
],
"cwd": "/path/to/your/mcp-server-synology"
}
}
}
βοΈ Cursor
Add to your Cursor MCP settings:
{
"mcpServers": {
"synology": {
"command": "docker-compose",
"args": [
"-f", "/path/to/your/mcp-server-synology/docker-compose.yml",
"run", "--rm", "synology-mcp"
],
"cwd": "/path/to/your/mcp-server-synology"
}
}
}
π Continue (VS Code Extension)
Add to your Continue configuration (.continue/config.json):
{
"mcpServers": {
"synology": {
"command": "docker-compose",
"args": [
"-f", "/path/to/your/mcp-server-synology/docker-compose.yml",
"run", "--rm", "synology-mcp"
],
"cwd": "/path/to/your/mcp-server-synology"
}
}
}
π» Codeium
For Codeium's MCP support:
{
"mcpServers": {
"synology": {
"command": "docker-compose",
"args": [
"-f", "/path/to/your/mcp-server-synology/docker-compose.yml",
"run", "--rm", "synology-mcp"
],
"cwd": "/path/to/your/mcp-server-synology"
}
}
}
π Alternative: Direct Python Execution
If you prefer not to use Docker:
{
"mcpServers": {
"synology": {
"command": "python",
"args": ["main.py"],
"cwd": "/path/to/your/mcp-server-synology",
"env": {
"SYNOLOGY_URL": "http://192.168.1.100:5000",
"SYNOLOGY_USERNAME": "your_username",
"SYNOLOGY_PASSWORD": "your_password",
"AUTO_LOGIN": "true",
"ENABLE_XIAOZHI": "false"
}
}
}
}
π Remote HTTP/SSE Deployment (NEW)
By default the server speaks stdio, which means the MCP client has to spawn the process locally (or via a bridge such as SSH/docker exec). For setups where the NAS is remote (different machine from where Claude/Cursor runs), you can expose the MCP server over HTTP/SSE using mcp-proxy. This makes it consumable by any MCP client that supports URL-based connectors β exactly like ha-mcp or other "remote" MCP servers.
Architecture
[Claude Desktop / Cursor / ...]
β
β HTTPS (URL connector)
βΌ
[Reverse proxy: DSM / Nginx / Traefik / Caddy]
β (TLS termination + auth)
β HTTP localhost:8765
βΌ
[Docker container]
ββ mcp-proxy
ββ python main.py (stdio)
Deploy
-
mcp-proxyis installed automatically when you build the HTTP image β it lives inrequirements-http.txtand the provided compose file sets theINSTALL_HTTP=truebuild arg (it is not in the default stdio/Xiaozhi image). -
Use the provided
docker-compose.http.yml:
# Edit credentials in docker-compose.http.yml first
docker compose -f docker-compose.http.yml up -d --build
docker logs -f synology-mcp-http
You should see mcp-proxy report Uvicorn running on http://0.0.0.0:8765 and the auto-login succeed.
Reverse proxy
Most MCP clients require HTTPS, so the HTTP endpoint must be fronted by a TLS-terminating reverse proxy. For DSM users, the built-in Login Portal β Reverse Proxy does the job:
-
Source:
HTTPS, hostnamesynology-mcp.example.com, port443 -
Destination:
HTTP,localhost, port8765 -
Custom Headers: click Create β WebSocket (adds the headers needed for SSE/long-lived connections)
For Nginx, the equivalent is:
location / {
proxy_pass http://localhost:8765;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# SSE-specific
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 24h;
}
Client configuration
In Claude Desktop (or any MCP client that supports remote connectors), add a custom connector pointing at:
https://synology-mcp.example.com/sse
No command, no args, no local Python β just a URL.
Security
mcp-proxy does not provide server-side authentication. Anything that can reach the HTTP endpoint can call every tool. Mitigations:
-
Keep it on a private network or behind a VPN
-
Use the reverse proxy to enforce an IP allow-list
-
Add Basic Auth / mTLS / OAuth2 proxy at the reverse proxy layer
-
Use a dedicated low-privilege DSM user (already recommended in the security warning above)
βοΈ Configuration Options
β οΈ Security Warning: Use a Dedicated Account
For this MCP server, create a dedicated Synology user account with appropriate permissions. This account should:
-
NOT have 2FA enabled - The MCP server cannot handle 2FA prompts and will fail authentication
-
Have minimal required permissions only (not admin!)
-
Be used exclusively for MCP server automation
Using your primary account with 2FA is dangerous - if auto-login fails, you may be locked out of your NAS!
Using settings.json (Recommended)
Variable Required Default Description
SYNOLOGY_URL Yes* - NAS base URL (e.g., http://192.168.1.100:5000)
SYNOLOGY_USERNAME Yes* - Username for authentication
SYNOLOGY_PASSWORD Yes* - Password for authentication
AUTO_LOGIN No true Auto-login on server start
VERIFY_SSL No false Verify SSL certificates
DEBUG No false Enable debug logging
ENABLE_XIAOZHI No false Enable Xiaozhi WebSocket bridge
XIAOZHI_TOKEN Xiaozhi only - Authentication token for Xiaozhi
XIAOZHI_MCP_ENDPOINT No wss://api.xiaozhi.me/mcp/ Xiaozhi WebSocket endpoint
*Required for auto-login and default operations
Using settings.json (Multi-NAS Support)
For managing multiple Synology NAS devices, use the XDG standard config directory (~/.config/synology-mcp/settings.json):
mkdir -p ~/.config/synology-mcp
touch ~/.config/synology-mcp/settings.json
chmod 600 ~/.config/synology-mcp/settings.json # Important: secure permissions!
Note: This follows the XDG Base Directory Specification - ~/.config/ is the standard location for user configuration files on Linux/macOS. You can customize the location by setting the XDG_CONFIG_HOME environment variable.
With Docker:
The docker-compose.yml automatically mounts your ~/.config/synology-mcp directory into the container at /home/mcpuser/.config/synology-mcp, so multi-NAS works out of the box with Docker as well.
settings.json format:
{
"synology": {
"nas1": {
"host": "192.168.1.100",
"port": 5000,
"username": "admin",
"password": "your_password",
"note": "Primary NAS at home"
},
"nas2": {
"host": "192.168.1.200",
"port": 5001,
"username": "admin",
"password": "your_password",
"note": "Backup NAS"
}
},
"xiaozhi": {
"enabled": false,
"token": "your_xiaozhi_token",
"endpoint": "wss://api.xiaozhi.me/mcp/"
},
"server": {
"auto_login": true,
"verify_ssl": false,
"session_timeout": 3600,
"debug": false,
"log_level": "INFO"
}
}
Configuration fields:
Field Required Description
host Yes NAS hostname or IP address
port No API port (default: 5000 for HTTP, 5001 for HTTPS)
username Yes NAS username
password Yes NAS password
note No Optional description for your reference
Notes:
-
The server will use port 5001 (HTTPS) if port is 5001, otherwise defaults to HTTP (5000)
-
File permissions:
chmod 600 ~/.config/synology-mcp/settings.jsonis required for security -
The server will refuse to load settings if permissions are too open
-
Both .env and settings.json can be used together (settings.json takes priority)
β οΈ Security Recommendations
SSL Certificate Verification (VERIFY_SSL):
-
Default is
falseto support self-signed certificates on internal NAS devices -
If your NAS has a valid SSL certificate (e.g., from Let's Encrypt or a corporate CA), set
VERIFY_SSL=true -
Setting
VERIFY_SSL=falsedisables certificate verification and makes your connection vulnerable to man-in-the-middle (MITM) attacks -
Never disable SSL verification on untrusted networks
Auto-Login (AUTO_LOGIN):
-
Default is
truefor convenience with settings.json -
Credentials are stored securely in
~/.config/synology-mcp/settings.jsonwith 0600 permissions -
If you prefer manual login, set
AUTO_LOGIN=falseand use thesynology_logintool
π Usage Examples
π File Operations
β Creating Files and Directories
// List directory
{
"path": "/volume1/homes"
}
// Search for PDFs
{
"path": "/volume1/documents",
"pattern": "*.pdf"
}
// Create new file
{
"path": "/volume1/documents/notes.txt",
"content": "My important notes\nLine 2 of notes",
"overwrite": false
}
ποΈ Deleting Files and Directories
// Delete file or directory (auto-detects type)
{
"path": "/volume1/temp/old-file.txt"
}
// Move file
{
"source_path": "/volume1/temp/file.txt",
"destination_path": "/volume1/archive/file.txt"
}
β¬οΈ Download Management
π οΈ Creating a Download Task
// Create download task
{
"uri": "https://example.com/file.zip",
"destination": "/volume1/downloads"
}
// Pause tasks
{
"task_ids": ["dbid_123", "dbid_456"]
}
𦦠Download Results
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.