mcp-synology
Enables interaction with Synology NAS devices through the DSM API, providing tools for file management (browsing, searching, transferring, organizing, and deleting files via File Station) and system monitoring (CPU load, memory usage, disk I/O, temperature, uptime), with support for permission tiers, multi-instance configurations, and two-factor authentication.
mcp-synology
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 changesThe 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:
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.Edit your config file. That's
~/.config/mcp-synology/config.yaml, or the per-NAS file such ashome-nas.yamlif you use Multi-NAS. Adddownloadstationinside the existingmodules:section; don't add a secondmodules:key. Usepermission: readfor the read tools only, orpermission: writefor all 12:modules: filestation: # already there enabled: true permission: write downloadstation: # add this enabled: true permission: write # or readCheck the config:
mcp-synology check --config <your config file>reports YAML or validation mistakes and confirms the login still works.Restart your MCP client (for example, Claude Desktop). The server reads its config only at startup. The Download Station tools (
list_downloadsand 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_downloadwith an explicitdestinationstill creates the task but warns that it won't start. Without adestination, 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_downloadsand the other task tools see only the user's own tasks.Settings.
get_download_configshows the user's own view, not the NAS-wide settings.set_download_configcan change only the user's owndefault_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_scheduleneed an admin. A non-admin can still turn the schedule on or off, and that switch is NAS-wide.
Known limits:
create_downloadreturns no task IDs for URLs that useusername/password.edit_downloadchanges 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 itLocal path confinement —
upload_fileanddownload_fileonly use local folders listed inallowed_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 setupRequires 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 instancesAlternative: 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 checkAlternative: 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 check2FA Support
mcp-synology fully supports DSM accounts with two-factor authentication. It's auto-detected — you don't need to configure anything special:
Bootstrap —
mcp-synology setupdetects 2FA, prompts for your OTP code, and stores a device token in the keyringSilent re-auth — subsequent logins use the device token automatically (no OTP prompts)
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 versionTo disable update notifications, add to your config (top level):
# ~/.config/mcp-synology/config.yaml
check_for_updates: falseConfiguration
Interactive setup creates a config file for you. For manual configuration or advanced options, see examples/:
config-minimal.yaml— simplest possible configconfig-power-user.yaml— HTTPS, custom timeouts, logging, instructionsconfig-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: HomeNASThe 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.mdBoth 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 commandsOr 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 defaultDebug 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
Available Tools
7 toolsdownload_fileADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| filename | No | ||
| overwrite | No | ||
| dest_folder | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_sizeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | ||
| additional | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_filesARead-only
List files and folders in a directory. Supports glob pattern filtering, file type filtering, sorting, and pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| offset | No | ||
| pattern | No | ||
| sort_by | No | name | |
| filetype | No | all | |
| additional | No | ||
| sort_direction | No | asc |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_binCRead-only
List the contents of a shared folder's recycle bin. Shows recently deleted files that can be restored.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| share | Yes | ||
| pattern | No | ||
| sort_by | No | mtime | |
| sort_direction | No | desc |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
search_filesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pattern | No | ||
| size_to | No | ||
| filetype | No | all | |
| mtime_to | No | ||
| extension | No | ||
| recursive | No | ||
| size_from | No | ||
| additional | No | ||
| mtime_from | No | ||
| folder_path | Yes | ||
| exclude_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.7.0- Changed
download_file11 fields changed- removed
Input schema / properties / dest_folder / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / dest_folder / defaultRemoved value: -null - removed
Input schema / properties / dest_folder / titleRemoved value: -"Dest Folder" - added
Input schema / properties / dest_folder / typeAdded value: +"string" - removed
Input schema / properties / filename / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / filename / defaultRemoved value: -null - removed
Input schema / properties / filename / titleRemoved value: -"Filename" - added
Input schema / properties / filename / typeAdded value: +"string" - removed
Input schema / properties / overwrite / titleRemoved value: -"Overwrite" - removed
Input schema / properties / path / titleRemoved value: -"Path" - removed
Input schema / titleRemoved value: -"tool_download_fileArguments"
- Changed
get_dir_size2 fields changed- removed
Input schema / properties / path / titleRemoved value: -"Path" - removed
Input schema / titleRemoved value: -"tool_get_dir_sizeArguments"
- Changed
get_file_info3 fields changed- added
Input schema / properties / additionalAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / paths / titleRemoved value: -"Paths" - removed
Input schema / titleRemoved value: -"tool_get_file_infoArguments"
- Changed
list_files12 fields changed- added
Input schema / properties / additionalAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / filetype / titleRemoved value: -"Filetype" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - removed
Input schema / properties / path / titleRemoved value: -"Path" - removed
Input schema / properties / pattern / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / pattern / defaultRemoved value: -null - removed
Input schema / properties / pattern / titleRemoved value: -"Pattern" - added
Input schema / properties / pattern / typeAdded value: +"string" - removed
Input schema / properties / sort_by / titleRemoved value: -"Sort By" - removed
Input schema / properties / sort_direction / titleRemoved value: -"Sort Direction" - removed
Input schema / titleRemoved value: -"tool_list_filesArguments"
- Changed
list_recycle_bin9 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / pattern / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / pattern / defaultRemoved value: -null - removed
Input schema / properties / pattern / titleRemoved value: -"Pattern" - added
Input schema / properties / pattern / typeAdded value: +"string" - removed
Input schema / properties / share / titleRemoved value: -"Share" - removed
Input schema / properties / sort_by / titleRemoved value: -"Sort By" - removed
Input schema / properties / sort_direction / titleRemoved value: -"Sort Direction" - removed
Input schema / titleRemoved value: -"tool_list_recycle_binArguments"
- Changed
list_shares4 fields changed- added
Input schema / properties / additionalAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / sort_by / titleRemoved value: -"Sort By" - removed
Input schema / properties / sort_direction / titleRemoved value: -"Sort Direction" - removed
Input schema / titleRemoved value: -"tool_list_sharesArguments"
- Changed
search_files28 fields changed- added
Input schema / properties / additionalAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / exclude_pattern / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / exclude_pattern / defaultRemoved value: -null - removed
Input schema / properties / exclude_pattern / titleRemoved value: -"Exclude Pattern" - added
Input schema / properties / exclude_pattern / typeAdded value: +"string" - removed
Input schema / properties / extension / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / extension / defaultRemoved value: -null - removed
Input schema / properties / extension / titleRemoved value: -"Extension" - added
Input schema / properties / extension / typeAdded value: +"string" - removed
Input schema / properties / filetype / titleRemoved value: -"Filetype" - removed
Input schema / properties / folder_path / titleRemoved value: -"Folder Path" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - added
Input schema / properties / mtime_fromAdded value: +{ + "type": "string" +} - added
Input schema / properties / mtime_toAdded value: +{ + "type": "string" +} - removed
Input schema / properties / pattern / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / pattern / defaultRemoved value: -null - removed
Input schema / properties / pattern / titleRemoved value: -"Pattern" - added
Input schema / properties / pattern / typeAdded value: +"string" - removed
Input schema / properties / recursive / titleRemoved value: -"Recursive" - removed
Input schema / properties / size_from / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / size_from / defaultRemoved value: -null - removed
Input schema / properties / size_from / titleRemoved value: -"Size From" - added
Input schema / properties / size_from / typeAdded value: +"string" - removed
Input schema / properties / size_to / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / size_to / defaultRemoved value: -null - removed
Input schema / properties / size_to / titleRemoved value: -"Size To" - added
Input schema / properties / size_to / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"tool_search_filesArguments"
7 tool updates
v0.4.1- First observed
download_file - First observed
get_dir_size - First observed
get_file_info - First observed
list_files - First observed
list_recycle_bin - First observed
list_shares - First observed
search_files
TDQS
Scored across 7 tools
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.
All tool names follow a consistent snake_case verb_noun pattern (list_, get_, search_, download_). There are no mixed conventions or vague verbs.
Seven tools is well-scoped for a NAS file browsing and retrieval server. Each tool serves a clear purpose without redundancy or filler.
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
Related MCP Connectors
MCP server for SmartAgent CRM: leads, tasks, sales pipelines, property listings
Build, deploy, and host full-stack web apps from any MCP client. DB, auth, storage, cron included.
MCP server for InsForge BaaS — database, storage, edge functions, and deployments
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to manage Synology NAS devices with file operations (create, delete, move, search) and Download Station control through secure authentication and session management.132 PyPI228MIT
- AlicenseAqualityCmaintenanceSelf-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.3916 npm11MIT
- AlicenseNot gradedqualityFmaintenanceComprehensive Synology NAS management through MCP, enabling file operations, downloads, backups, Docker, photos, VMs, snapshots, and more across up to 9 NAS units.5MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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