Skip to main content
Glama
cmeans

mcp-synology

mcp-synology

PyPI version Python versions License Tests Coverage Downloads Glama

pip downloads pipenv downloads pipx downloads uv downloads poetry downloads pdm downloads

linux downloads macos downloads windows downloads

MCP server for Synology NAS devices. Exposes Synology DSM API functionality as MCP tools that Claude can use.

Migrating from synology-mcp

If you're upgrading from synology-mcp (v0.3.x or earlier), the package has been renamed. A migration script handles config, state, keyring entries, and Claude Desktop config automatically:

# Download and run the migration script
curl -O https://raw.githubusercontent.com/cmeans/mcp-synology/main/scripts/migrate-from-synology-mcp.py
python migrate-from-synology-mcp.py          # dry run — preview changes
python migrate-from-synology-mcp.py --apply  # apply changes

The script migrates:

  • Config directory (~/.config/synology-mcp/ → ~/.config/mcp-synology/)

  • State directory (~/.local/state/synology-mcp/ → ~/.local/state/mcp-synology/)

  • Keyring credentials

  • Claude Desktop claude_desktop_config.json (updates command and paths)

See CHANGELOG.md for full details on breaking changes.

Related MCP server: synology-office-mcp

Supported Modules

File Station

Browse, search, transfer, and manage files on your NAS. 14 tools across two permission tiers:

  • READ — list_shares, list_files, list_recycle_bin, search_files, get_file_info, get_dir_size, download_file

  • WRITE — create_folder, rename, copy_files, move_files, delete_files, restore_from_recycle_bin, upload_file

System

Monitor NAS health and resource utilization. 2 read-only tools:

  • get_system_info — model, firmware version, RAM, temperature, uptime (works for all users)

  • get_resource_usage — live CPU load, memory usage, disk I/O, network throughput (requires admin account)

Download Station

Manage the Download Station queue and settings. 12 tools across two permission tiers:

  • READ — list_downloads, get_download_info, get_download_stats, get_download_config, get_schedule

  • WRITE — create_download, delete_download, pause_download, resume_download, edit_download, set_download_config, set_schedule

Download Station is opt-in: mcp-synology setup only configures File Station. To turn it on:

  1. Install Download Station on the NAS from Package Center, if it isn't installed already. Without the package the tools still appear, but every call fails with api_not_found.

  2. Edit your config file. That's ~/.config/mcp-synology/config.yaml, or the per-NAS file such as home-nas.yaml if you use Multi-NAS. Add downloadstation inside the existing modules: section; don't add a second modules: key. Use permission: read for the read tools only, or permission: write for all 12:

    modules:
      filestation:          # already there
        enabled: true
        permission: write
      downloadstation:      # add this
        enabled: true
        permission: write   # or read
  3. Check the config: mcp-synology check --config <your config file> reports YAML or validation mistakes and confirms the login still works.

  4. Restart your MCP client (for example, Claude Desktop). The server reads its config only at startup. The Download Station tools (list_downloads and the rest) then appear alongside the File Station ones. Ask the assistant to "list my downloads" to try it.

If the account isn't an admin, read Accounts below first: a non-admin needs a one-time setup step before Download Station will run its tasks.

Accounts. An admin (Download Station manager) can use every tool. A non-admin account needs the Download Station application privilege (Control Panel → User & Group → [account] → Edit → Applications). It also has these limits, all enforced or reported by the tools:

  • First-time setup. Download Station doesn't start a non-admin's tasks until that user has a default destination; until then they wait forever. A user who has never opened Download Station has none. Set it once with set_download_config(default_destination="<share>"), which DSM applies to that user only. Until then, create_download with an explicit destination still creates the task but warns that it won't start. Without a destination, it refuses and says what to set. That refusal applies to any account, admin included, whenever there's no default destination to fall back on.

  • Own tasks only. list_downloads and the other task tools see only the user's own tasks.

  • Settings. get_download_config shows the user's own view, not the NAS-wide settings. set_download_config can change only the user's own default_destination; the speed limits are NAS-wide and are refused, because DSM accepts and then silently ignores them from a non-admin.

  • Schedule. The weekly plan and limited-speed rates in get_schedule / set_schedule need an admin. A non-admin can still turn the schedule on or off, and that switch is NAS-wide.

Known limits:

  • create_download returns no task IDs for URLs that use username / password.

  • edit_download changes only the destination.

  • There is no way to pick individual files inside a torrent.

  • BT search and RSS feeds are not supported yet.

  • delete_download(force_complete=true) doesn't reliably keep partial data: DSM discarded unfinished HTTP downloads anyway. DSM also refuses it for finished tasks, and the tool reports those as not removed.

Tested against DSM 7.1 (Download Station 3.9-4627) and DSM 7.2.2 (Download Station 4.1-5012).

Features

  • Interactive setup — guided configuration that creates your config, stores credentials, handles 2FA, and emits a Claude Desktop snippet

  • Permission tiers — READ or WRITE per module, enforced at tool registration. Tiers control what the server can do on the NAS; download_file, which writes on this machine, is annotated as destructive so your client can confirm it. A read-only connection tells the model which tools it withholds and how to enable them, so the model doesn't claim the server can't do it

  • Local path confinement — upload_file and download_file only use local folders listed in allowed_local_paths (File Station settings), by default your Downloads folder. Symlinks and .. are resolved first, so they can't lead outside. Set it to ["/"] to allow everything (macOS/Linux)

  • 2FA support — auto-detected; device token bootstrap with automatic silent re-auth

  • Secure credentials — OS keyring integration that works transparently on macOS, Windows, and Linux (including from Claude Desktop). See docs/credentials.md.

  • Multi-NAS — manage multiple NAS devices with separate configs, credentials, and state

Quick Start

1. Run setup

uvx mcp-synology setup

Requires uv. uvx downloads and runs the latest version automatically — no separate install step needed.

Setup will prompt for your NAS host, credentials, and preferences. If your account has 2FA enabled, it will prompt for an OTP code and store a device token for automatic future logins.

At the end, it prints a Claude Desktop JSON snippet ready to copy-paste.

2. Add to Claude Desktop

Copy the snippet from setup into your claude_desktop_config.json and restart Claude Desktop. It will look something like:

{
  "mcpServers": {
    "synology-nas": {
      "command": "uvx",
      "args": ["mcp-synology", "serve", "--config", "~/.config/mcp-synology/nas.yaml"]
    }
  }
}

The config file name (e.g., nas.yaml) also serves as a natural identifier for the connection — you can name it to match your NAS (e.g., home-nas.yaml, office-nas.yaml).

On Linux, the server auto-detects the D-Bus session socket for keyring access. If auto-detection fails, add "env": {"DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/<uid>/bus"} to the Claude Desktop config. The setup command includes this in the generated snippet.

3. Verify

uvx mcp-synology check                # Validates credentials work
uvx mcp-synology setup --list         # Shows all configured NAS instances

Alternative: global install

If you prefer a persistent install (avoids download on each invocation). Requires uv — install with curl -LsSf https://astral.sh/uv/install.sh | sh (macOS/Linux) or see the installation guide for other options.

uv tool install mcp-synology
mcp-synology setup
mcp-synology check

Alternative: env-var-only mode

No config file needed if SYNOLOGY_HOST is set. This is useful for Docker or CI environments:

{
  "mcpServers": {
    "synology": {
      "command": "uvx",
      "args": ["mcp-synology", "serve"],
      "env": {
        "SYNOLOGY_HOST": "192.168.1.100",
        "SYNOLOGY_USERNAME": "your_user",
        "SYNOLOGY_PASSWORD": "your_password"
      }
    }
  }
}

Or from the CLI:

SYNOLOGY_HOST=192.168.1.100 uvx mcp-synology check

2FA Support

mcp-synology fully supports DSM accounts with two-factor authentication. It's auto-detected — you don't need to configure anything special:

  1. Bootstrap — mcp-synology setup detects 2FA, prompts for your OTP code, and stores a device token in the keyring

  2. Silent re-auth — subsequent logins use the device token automatically (no OTP prompts)

  3. Per-instance — each NAS config gets its own device token, so mixed 2FA/non-2FA setups work fine

Device tokens have no fixed lifetime: they last until the trusted device is removed in DSM (Personal > Security > Sign-in Activity) or DSM otherwise stops accepting it. If DSM rejects the stored token, the error says so; run mcp-synology setup again to sign in with a new 2FA code.

Keyring & Credentials

Credentials are stored in the OS keyring and accessed transparently:

Platform

Backend

Notes

macOS

Keychain

Just works

Windows

Credential Manager

Just works

Linux

GNOME Keyring / KWallet

Auto-detects D-Bus session, works from Claude Desktop

Credential resolution order: env vars > config file > keyring. Explicit sources override the implicit default.

For environments without a keyring (Docker, CI), use environment variables or inline credentials in the config file.

See docs/credentials.md for keyring service names, multi-NAS setup, and how to inspect/remove stored credentials.

Updates

mcp-synology checks for updates and notifies you in your Claude Desktop conversation — the first tool response in each session will include a notice if a newer version is available on PyPI.

To manage updates from the CLI:

mcp-synology --check-update                 # Check for a newer version
mcp-synology --auto-upgrade enable           # Auto-upgrade on each interactive run
mcp-synology --revert                        # Roll back to previous version
mcp-synology --revert 0.1.0                  # Roll back to a specific version

To disable update notifications, add to your config (top level):

# ~/.config/mcp-synology/config.yaml
check_for_updates: false

Configuration

Interactive setup creates a config file for you. For manual configuration or advanced options, see examples/:

  • config-minimal.yaml — simplest possible config

  • config-power-user.yaml — HTTPS, custom timeouts, logging, instructions

  • config-docker.yaml — environment-variable-driven

Multi-NAS

Each NAS gets its own config file, credentials, and Claude Desktop entry. The config file name serves as a natural identifier (e.g., home-nas.yaml, media-server.yaml).

Set alias to give Claude a display name for the connection:

# ~/.config/mcp-synology/home-nas.yaml
alias: HomeNAS

The alias appears in the MCP server name (e.g., synology-HomeNAS) so Claude knows which NAS it's talking to.

Custom Instructions

Custom instructions let you shape how Claude interacts with your NAS tools. This is useful when:

  • Multiple NAS connections — tell Claude which connection to prefer for different tasks ("use this for media, use admin for cross-user operations")

  • Safety guardrails — add rules like "always confirm before deleting" or "never touch /Backups"

  • Context — explain what's on the NAS ("this is a media server, /video has our library sorted by genre")

Add context — custom_instructions is prepended to the built-in prompt (higher priority):

# ~/.config/mcp-synology/config.yaml
custom_instructions: |
  This is the admin NAS with elevated privileges.
  Prefer this connection for file operations requiring cross-user access.
  Never delete files from /Backups without explicit confirmation.

Full control — instructions_file replaces the built-in prompt entirely. Copy the built-in server.md as a starting point. A replacement file is used as written, apart from HTML comments, so it doesn't get the generated PERMISSIONS section, which tells the model which tools this connection withholds and how to enable them (custom_instructions keeps it):

# ~/.config/mcp-synology/config.yaml
instructions_file: ~/.config/mcp-synology/my-instructions.md

Both support template variables: {display_name}, {instance_id}, {host}, {port}.

HTML comments (<!-- ... -->) are removed from both before the text is sent, so they can hold notes for whoever edits the file. A comment on a line of its own is removed with that line.

Debugging

Two ways to enable debug logging:

mcp-synology check --verbose                          # --verbose flag on setup/check
SYNOLOGY_LOG_LEVEL=debug mcp-synology serve           # env var, works for all commands

Or set it persistently in your config file:

# ~/.config/mcp-synology/config.yaml
logging:
  level: debug
  file: ~/.local/state/mcp-synology/nas/server.log  # optional, logs to stderr by default

Debug output includes every DSM API request/response (passwords masked), credential resolution steps, config discovery, version negotiation, and module registration decisions.

Contributing

See DEVELOPMENT.md for build commands, testing, integration test setup, and design docs.

Acknowledgements

This project was built using a Spec-First Coding approach — a human-AI collaboration model where design precedes implementation and specs are the contract between the two.

Unlike vibe coding, where you describe what you want and let the AI generate code on the fly, spec-first coding treats design as a separate, deliberate phase. The four specs in docs/specs/ were developed through extended conversation — exploring trade-offs, rejecting alternatives, and documenting decisions with rationale. Implementation then used the specs as the source of truth across 11 build phases.

Live testing against real hardware revealed behaviors the specs couldn't anticipate (DSM API quirks, such as JSON-parsed parameter values that once looked like search-service throttling, and version format incompatibilities). These discoveries are documented in CLAUDE.md and the code, which is authoritative where specs diverge.

License

Apache 2.0


Available Tools

7 tools
download_fileA
Destructive

Download a NAS file to a local directory on this machine. Provide the NAS file path. dest_folder is optional if default_download_dir is configured. Does not overwrite existing local files by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
filenameNo
overwriteNo
dest_folderNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds the meaningful nuance that maps to that hint — it writes a local file but 'does not overwrite existing local files by default' — which tells the agent the default is non-clobbering. No auth, rate-limit, or partial-transfer behavior is covered, but the added context is substantive rather than a restatement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action and destination, and the overwrite caveat is placed last where it belongs. The only near-waste is 'Provide the NAS file path,' which largely restates the required field in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the annotations carry the safety profile. The description covers destination resolution and overwrite behavior adequately for a 4-param tool; the unexplained 'filename' parameter and unstated behavior on directories are the only gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains path (required), dest_folder's optionality and its dependency on default_download_dir, and the overwrite default — but never mentions 'filename', leaving one of four parameters entirely unexplained in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Download a NAS file') with an explicit destination scope ('to a local directory on this machine'), which cleanly separates it from every sibling (list_files, search_files, get_file_info all operate NAS-side). No sibling name is needed because none of them perform a download.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the one prerequisite (provide the NAS file path) and a conditional for one optional parameter (dest_folder is optional if default_download_dir is configured), which is genuine operational guidance. However, it never says when to prefer this over alternatives or what conditions make it inappropriate, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dir_sizeA
Read-only

Calculate the total size of a directory, including all files and subdirectories. Returns total size, file count, and directory count. This is the best tool for answering 'how much space does X use' questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare this a safe read (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description adds genuine behavioral content beyond that: recursion into all subdirectories and the three metrics returned. It omits any warning about cost/latency on very large trees or permission-denied behavior, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero waste, with the core action front-loaded and the usage hint deferred to the end where it belongs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain the return payload, and the annotations cover safety. It is nearly complete for a single-parameter read tool; the remaining gap is the absence of any caveat about slow scans on large directories.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but there is only one parameter and the description implicitly constrains it to a directory rather than a file. It says nothing about absolute vs relative paths or symlink handling, so it adds only marginal meaning over the bare 'path: string' schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Calculate the total size of a directory') with the recursive scope made explicit ('including all files and subdirectories'). It is plainly distinguishable from siblings like get_file_info and list_files, which do not aggregate sizes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'This is the best tool for answering how much space does X use questions' gives a clear usage context and implicitly routes the agent away from list_files/get_file_info. It does not name an alternative tool or state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_file_infoA
Read-only

Get detailed metadata for specific files or folders: size, owner, timestamps, permissions, and real path. additional optionally picks the DSM fields to fetch: real_path, size, owner, time, perm, type (the file's extension type) and mount_point_type (shown only for a mount point). Default: real_path, size, owner, time, perm. Unknown values are rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
additionalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the default field set returned, that 'unknown values are rejected', and that mount_point_type only appears for mount points — all useful invocation-time facts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a tight second sentence covering the optional field selector, its allowed values, and the default. Dense but every clause carries information; the parenthetical clarifications for 'type' and 'mount_point_type' are load-bearing, not filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be described. For a two-parameter read-only tool the description covers the non-obvious parameter thoroughly and states the default and rejection behavior; only the `paths` input format remains under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load, and it does for `additional`: it lists the accepted field values, explains 'type' as the extension type, notes mount_point_type is mount-only, and gives the default set. `paths` is left thinner — it is never stated whether paths are absolute, relative, or share-qualified — which keeps this from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed metadata for specific files or folders') and enumerates exactly what is returned: size, owner, timestamps, permissions, real path. That enumeration cleanly separates it from list_files/search_files/get_dir_size in practice, though no sibling is named explicitly, which caps it below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for specific files or folders' implies the caller must already know the paths, which implicitly distinguishes this from listing or search tools. However, there is no explicit when-to-use statement, no mention of alternatives such as search_files or get_dir_size, and no stated prerequisites or failure conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesA
Read-only

List files and folders in a directory. Supports glob pattern filtering, file type filtering, sorting, and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
offsetNo
patternNo
sort_byNoname
filetypeNoall
additionalNo
sort_directionNoasc

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the capability surface (globbing, filtering, sorting, pagination) but says nothing about recursion depth, hidden-file handling, or behavior on a missing path, which are the traits an agent would still need.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core action front-loaded ahead of the capability list. Every clause maps to a real feature of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With read-only annotations and an output schema present, the description needn't explain returns or safety, and it covers the main behavioral knobs. It falls short only on edge-case behavior (recursion, defaults, error handling) for an 8-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden and largely succeeds: 'glob pattern filtering' maps to pattern, 'file type filtering' to filetype, 'sorting' to sort_by/sort_direction, and 'pagination' to limit/offset. The 'additional' parameter and any glob syntax details are left unexplained, so it is not fully compensating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource (list files and folders) and scope (in a directory), plus the supported capability set. It does not differentiate itself from siblings like search_files or list_recycle_bin, which an agent could plausibly confuse for directory listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance. The phrase 'in a directory' weakly implies directory-scoped enumeration versus a global search tool like search_files, but the agent is left to infer this; no alternative is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recycle_binC
Read-only

List the contents of a shared folder's recycle bin. Shows recently deleted files that can be restored.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
shareYes
patternNo
sort_byNomtime
sort_directionNodesc

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful fact that entries are restorable deleted files, but says nothing about pagination, default limits, or how the recycle bin is scoped to a share.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and free of filler. The second sentence is arguably redundant but adds a useful qualifier about restorability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and annotations cover safety. However, with five undocumented parameters at 0% coverage, a filtered/sorted list tool needs more detail about scoping, filtering, and sorting than two sentences provide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Five parameters exist with 0% schema description coverage, and the description documents none of them. Only the word 'shared folder' loosely implies the required 'share' parameter; limit, pattern, sort_by, and sort_direction are entirely unexplained, so the description fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('List the contents of a shared folder's recycle bin') and clarifies the resource further ('recently deleted files that can be restored'). It does not, however, distinguish this tool from close siblings like list_files or search_files, so an agent must infer the recycle-bin scope on its own.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance and no named alternative (e.g., list_files for live contents vs. this for deleted items). The phrase 'recently deleted files that can be restored' hints at the use case but leaves the selection decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sharesA
Read-only

List all shared folders on the NAS. This is the starting point for file navigation — call this first to discover available paths. Shows each share's volume and that volume's free space (shared by every share on it); for how much space a share uses, call get_dir_size.

ParametersJSON Schema
NameRequiredDescriptionDefault
sort_byNoname
additionalNo
sort_directionNoasc

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful semantics beyond that: the returned free space is per-volume and shared across all shares on it, which is a real interpretive trap the agent would otherwise misread. It doesn't mention auth requirements or pagination, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each load-bearing: purpose, role in the workflow, and a disambiguation of the returned free-space value. Front-loaded with the core action and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values needn't be fully explained, and the description still clarifies the volume/free-space semantic. The only real gap is the undocumented parameters, which is a meaningful omission for a tool with sort and pass-through options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, including the opaque 'additional' array, so the description carries the full burden — and it says nothing about sort_by, sort_direction, or additional. With low coverage the description must compensate, and here it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List all shared folders on the NAS') and immediately frames itself as the entry point for file navigation, which cleanly separates it from siblings like list_files, search_files, and get_dir_size. An agent knows exactly what this returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit sequencing guidance — 'call this first to discover available paths' — and an explicit alternative with its condition: use get_dir_size for per-share space usage. This is textbook when-to-use plus when-to-use-something-else.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_filesA
Read-only

Search recursively for files by keyword, extension, size, or modification date. The pattern parameter is a keyword/substring match on filenames (not glob). Use extension for file type filtering (e.g., extension="mkv"). Accepts human-readable sizes like "500MiB". mtime_from / mtime_to accept ISO 8601 ("2026-04-01T12:00:00+00:00"), a calendar date ("YYYY-MM-DD"), or Unix epoch seconds; naive dates are treated as UTC. For directory contents or sizes, use list_files or get_dir_size instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
patternNo
size_toNo
filetypeNoall
mtime_toNo
extensionNo
recursiveNo
size_fromNo
additionalNo
mtime_fromNo
folder_pathYes
exclude_patternNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is established by structured data. The description adds useful semantics (substring-not-glob, default recursion, human-readable size formats) but says nothing about result caps/pagination behavior even though limit defaults to 500 in the schema. Adequate but not rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded: purpose first, then per-parameter clarification, then the alternative-tool routing. Every sentence earns its place, though the single long paragraph is packed more tightly than ideal for scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no schema descriptions, the description covers the high-value parameters well and an output schema exists so return values need no explanation. It falls short only on the secondary parameters (exclude_pattern, additional, filetype, limit semantics).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 12 parameters, so the description carries the burden and largely does: it explains pattern (keyword substring, not glob), extension (with an example), size_from/size_to (human-readable '500MiB'), and the three accepted mtime formats including naive-date-as-UTC. It leaves limit, filetype, recursive, exclude_pattern, additional, and folder_path undocumented, which is a real gap but not fatal to the common path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search), resource (files), and the four filter dimensions (keyword, extension, size, modification date), plus scope (recursive). It also names the sibling tools it is not (list_files, get_dir_size), so an agent can separate it from the other read tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The final sentence gives an explicit when-not rule with named alternatives: 'For directory contents or sizes, use list_files or get_dir_size instead.' Combined with the recursive-search framing, the agent knows when this tool is the right pick versus its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.7.0
    • Changeddownload_file11 fields changed
      • removedInput schema / properties / dest_folder / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / dest_folder / default
        Removed value: -null
      • removedInput schema / properties / dest_folder / title
        Removed value: -"Dest Folder"
      • addedInput schema / properties / dest_folder / type
        Added value: +"string"
      • removedInput schema / properties / filename / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / filename / default
        Removed value: -null
      • removedInput schema / properties / filename / title
        Removed value: -"Filename"
      • addedInput schema / properties / filename / type
        Added value: +"string"
      • removedInput schema / properties / overwrite / title
        Removed value: -"Overwrite"
      • removedInput schema / properties / path / title
        Removed value: -"Path"
      • removedInput schema / title
        Removed value: -"tool_download_fileArguments"
    • Changedget_dir_size2 fields changed
      • removedInput schema / properties / path / title
        Removed value: -"Path"
      • removedInput schema / title
        Removed value: -"tool_get_dir_sizeArguments"
    • Changedget_file_info3 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / paths / title
        Removed value: -"Paths"
      • removedInput schema / title
        Removed value: -"tool_get_file_infoArguments"
    • Changedlist_files12 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / filetype / title
        Removed value: -"Filetype"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / path / title
        Removed value: -"Path"
      • removedInput schema / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pattern / default
        Removed value: -null
      • removedInput schema / properties / pattern / title
        Removed value: -"Pattern"
      • addedInput schema / properties / pattern / type
        Added value: +"string"
      • removedInput schema / properties / sort_by / title
        Removed value: -"Sort By"
      • removedInput schema / properties / sort_direction / title
        Removed value: -"Sort Direction"
      • removedInput schema / title
        Removed value: -"tool_list_filesArguments"
    • Changedlist_recycle_bin9 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pattern / default
        Removed value: -null
      • removedInput schema / properties / pattern / title
        Removed value: -"Pattern"
      • addedInput schema / properties / pattern / type
        Added value: +"string"
      • removedInput schema / properties / share / title
        Removed value: -"Share"
      • removedInput schema / properties / sort_by / title
        Removed value: -"Sort By"
      • removedInput schema / properties / sort_direction / title
        Removed value: -"Sort Direction"
      • removedInput schema / title
        Removed value: -"tool_list_recycle_binArguments"
    • Changedlist_shares4 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / sort_by / title
        Removed value: -"Sort By"
      • removedInput schema / properties / sort_direction / title
        Removed value: -"Sort Direction"
      • removedInput schema / title
        Removed value: -"tool_list_sharesArguments"
    • Changedsearch_files28 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / exclude_pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / exclude_pattern / default
        Removed value: -null
      • removedInput schema / properties / exclude_pattern / title
        Removed value: -"Exclude Pattern"
      • addedInput schema / properties / exclude_pattern / type
        Added value: +"string"
      • removedInput schema / properties / extension / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / extension / default
        Removed value: -null
      • removedInput schema / properties / extension / title
        Removed value: -"Extension"
      • addedInput schema / properties / extension / type
        Added value: +"string"
      • removedInput schema / properties / filetype / title
        Removed value: -"Filetype"
      • removedInput schema / properties / folder_path / title
        Removed value: -"Folder Path"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • addedInput schema / properties / mtime_from
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / mtime_to
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pattern / default
        Removed value: -null
      • removedInput schema / properties / pattern / title
        Removed value: -"Pattern"
      • addedInput schema / properties / pattern / type
        Added value: +"string"
      • removedInput schema / properties / recursive / title
        Removed value: -"Recursive"
      • removedInput schema / properties / size_from / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / size_from / default
        Removed value: -null
      • removedInput schema / properties / size_from / title
        Removed value: -"Size From"
      • addedInput schema / properties / size_from / type
        Added value: +"string"
      • removedInput schema / properties / size_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / size_to / default
        Removed value: -null
      • removedInput schema / properties / size_to / title
        Removed value: -"Size To"
      • addedInput schema / properties / size_to / type
        Added value: +"string"
      • removedInput schema / title
        Removed value: -"tool_search_filesArguments"
  2. 7 tool updatesv0.4.1
    • First observeddownload_file
    • First observedget_dir_size
    • First observedget_file_info
    • First observedlist_files
    • First observedlist_recycle_bin
    • First observedlist_shares
    • First observedsearch_files

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct operation: browsing shares/directories, recursive search, metadata retrieval, directory size calculation, downloading, and recycle bin listing. Descriptions explicitly cross-reference alternatives (e.g., 'use get_dir_size for sizes'), preventing misselection.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (list_, get_, search_, download_). There are no mixed conventions or vague verbs.

Tool Count5/5

Seven tools is well-scoped for a NAS file browsing and retrieval server. Each tool serves a clear purpose without redundancy or filler.

Completeness3/5

Read-oriented coverage is solid (navigation, search, metadata, size, download), but the surface lacks write operations such as upload, delete, move/rename, or create folder. Listing a recycle bin without a restore tool also creates a notable dead end for common NAS management tasks.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Self-hosted MCP server that exposes Synology Drive, Spreadsheet, MailPlus, and Calendar as structured tools for AI agents, enabling file, spreadsheet, email, and calendar management via natural language.
    39
    16 npm
    11
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables interaction with Synology NAS services including DSM, File Station, Calendar, Note Station, Contacts, Chat, Download Station, and Container Manager through a modular MCP interface with configurable safety modes.
    MIT