mcp-synology
MCP server for Synology DSM that exposes Claude tools to inspect and manage NAS files, downloads, photos, and system status, with per-module read/write permissions.
File Station: browse shares; list/search files; get metadata and folder sizes; download/upload; create, rename, copy, move, delete, and restore recycle-bin items; track long-running file operations.
Download Station: list and inspect download tasks/stats; create, pause, resume, edit, and delete downloads; view/update config and schedules.
Synology Photos: browse/search photos and collections; get details/EXIF; download/upload; manage albums, folders, share links, and photo requests; tag/edit photos; manage people/merge faces; copy/move/delete items and folders; track photo tasks.
System: read NAS identity, DSM version, RAM, uptime, temperature, and admin-only live CPU/memory/disk/network usage.
Operational safeguards: supports read-only vs write modes, destructive-action annotations, and async handles for long-running deletes/copies/moves/restores.
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.
Tested against DSM 7.1.1-42962 Update 9, 7.2.2-72806 Update 10, 7.3.2-86009 Update 5 and 7.4.1-90080 Update 1: CI runs the integration tests for every module on a virtual DSM of each. Release candidates are also live-tested on a real NAS (DSM 7.1.1-42962 Update 9) by AI clients driving the tools: for 0.10.0, Claude Code, claude.ai through the desktop app, and Meta Muse, as admin, regular, read-only and restricted users. See docs/live-testing.md.
Supported modules
Each module covers one DSM package. A module loads only when it's listed under modules: in the config, and its permission decides whether you get its READ tools only or its WRITE tools too.
Module | Config key | READ tools | WRITE tools | DSM account | DSM versions |
| 2 ยท ๐ก Partial | โ | Any; | 7.1 โ 7.4.1 | |
| 7 ยท ๐ข Most | 8 ยท ๐ก Partial | Any | 7.1 โ 7.4.1 | |
| 4 ยท ๐ข Most | 15 ยท ๐ข Most | Any, with the Photos privilege | 7.1 โ 7.4.1 (favorites and concepts: 7.2.2+) | |
| 5 ยท ๐ข Most | 7 ยท ๐ก Partial | Any, with the Download Station privilege (non-admins see only their own tasks) | 7.1 โ 7.4.1 | |
| 11 ยท ๐ข Most | โ | Admin only | 7.1 โ 7.4.1 |
Coverage, per tier, of what the package itself can do: โ Full: everything; ๐ข Most: the main features, with gaps listed under the module; ๐ก Partial: the core features, with notable gaps; โ no tools in that tier.
What's not covered yet, in short:
System: process list, system health, logs, connected users. No WRITE tools (no reboot or shutdown).
File Station: compress and extract, share links, favorites, thumbnails, MD5 checksums, permissions and ownership changes, mounting remote folders.
Synology Photos: timeline and similar-photo views, video streaming, Shared Space folder permissions, face-level People edits, guest uploads to photo requests, Photos' own settings.
Download Station: BT search, RSS feeds, choosing files inside a torrent, editing a torrent's trackers, settings other than speed limits and the default destination.
Storage: no WRITE tools yet (phase 2: scrubbing, S.M.A.R.T. tests, hot spares, settings, snapshots); no iSCSI LUNs and SAN Manager, Hyper Backup or Task Scheduler. Never anything that wipes disks or changes a pool's layout.
Tested clients
Each release candidate is live-tested by these clients driving the tools on a real NAS (how):
Client | Model | How it runs the server | Notes |
Claude Code | Claude Opus 5.5 | Starts it itself (stdio) | Gets the server's instructions; no short reply limit (it aborts a call only after 30 minutes idle by default), so long operations and hand-offs are tested here |
claude.ai in the Claude desktop app | Claude Opus 5.5 | The app starts it locally; claude.ai reaches it through the app's device bridge | Doesn't pass on the server's instructions, tool titles or annotations, so the tools are written to work from their descriptions and replies alone. Replies are cut off after about 60 s |
Meta Muse (free plan) | Muse Spark | Its own script around | By default a fresh server process per call (slow: every call logs in). Ask it to keep one long-lived session instead: docs/muse.md has the instructions to paste |
A client can change the outcome on its own: the same model does less well through a client that drops the server's instructions or annotations.
Tested models
For best results, use Claude Sonnet 5.5 or better. The live tests above ran on Claude Opus 5.5 in both Claude clients. To compare models, we held the client fixed: headless Claude Code (server instructions and full tool schemas delivered, no other tools), the same 12 tasks across System, File Station, Synology Photos and Download Station (Storage came later), on a DSM 7.2.2 test NAS restored fresh for each model, as a non-admin user (2026-10-28).
Model | Tasks completed |
Claude Sonnet 5.5 | 12 of 12 |
Claude Haiku 5.5 | 11 of 12 |
Both handled Photos uploads, albums and tags, recycle-bin checks, Download Station tasks and honest answers about what isn't supported. The task Haiku missed needed an extra lookup it didn't think to make (matching a download by its source URL); Sonnet made it. Haiku is fine for reads; for writes, and deletes above all, use Sonnet or better. The tasks, how each was graded and the per-task results are in Comparing models.
Related MCP server: synology-office-mcp
Quick Start
1. Run setup
uvx mcp-synology setupRequires uv. uvx downloads the latest version and caches it โ no separate install step needed. It checks PyPI again once its cached copy of the index is more than 10 minutes old, so a restart of your MCP client usually picks up a new release; see Updates.
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. It writes a config with the File Station module only; add other modules afterward (see each module below).
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 instancesAdding a module
Install the package on the NAS (Synology Photos or Download Station) from Package Center, if it isn't installed already. Without it the module's tools still appear, but every call fails with
api_not_found.Edit your config file: the one
setupwrote (the file your client's--confignames), or the per-NAS file such ashome-nas.yamlif you use Multi-NAS. Add the module inside the existingmodules:section; don't add a secondmodules:key. Each module below has a block to copy.Check the config:
mcp-synology check --config <your config file>reports YAML or validation mistakes, names misspelled settings and modules, and confirms the login still works.Restart your MCP client (for example, Claude Desktop). The server reads its config only at startup.
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 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 checkWithout a config file, mcp-synology always runs File Station, read-only. No environment variable enables another module or the write tools; for those, use a config file (the same variables then override its values). The variables:
Variable | Sets | Default |
|
| โ |
|
| 5000, or 5001 with HTTPS |
|
|
|
|
| the keyring |
|
| the keyring |
|
| the keyring |
|
| derived from the host |
|
|
|
|
|
|
Modules
Every module is configured the same way, under modules::
enabled:true(the default) orfalse. Listing a module is enough to load it;enabled: falsekeeps its block in the file without loading it.permission:read(the default) registers the READ tools only;writeadds the WRITE tools.adminis also accepted and is the same aswritetoday. It doesn't refer to the DSM account: an admin account doesn't need it.settings: the module's own options, listed in its section. A setting the module doesn't know is ignored with a warning that names the valid ones, so a config written for a newer version still loads. Any other key next to these three is an error, so a typo such aspermisionstops the server instead of being ignored.
System
Monitor NAS health and resource usage.
READ:
get_system_info,get_resource_usageWRITE: none
modules:
system:
enabled: true # no write tools, so no permission is neededSettings: none.
Tools. get_system_info gives every account the model, serial number, DSM version, RAM, uptime, the NAS's local time and code page, and the temperature where the NAS has a sensor. An admin account also gets the CPU, time zone and current UTC offset, NTP server, firmware date, DSM's update-ready and crash flags, eSATA port, attached USB, SATA and PCIe devices, and redundant power on models that report it; any other account gets a line naming what needs an administrator. get_resource_usage shows live CPU load, memory usage, disk I/O and network throughput, and needs an admin account.
Accounts. Any account can use get_system_info; an admin account sees more (above). get_resource_usage needs an admin account.
DSM versions: 7.1 โ 7.4.1. The incompatible-NIC flag (admin only) appears from DSM 7.2.2.
Not covered: process list, system health, logs, connected users; no reboot or shutdown.
Spec: docs/specs/system-module-spec.md.
File Station
Browse, search, transfer and manage the files in the NAS's shared folders.
READ:
list_shares,list_files,list_recycle_bin,search_files,get_file_info,get_dir_size,download_fileWRITE:
create_folder,rename,copy_files,move_files,delete_files,restore_from_recycle_bin,upload_file,file_task
modules:
filestation:
enabled: true
permission: write # or read
settings: # all optional; the values shown are the defaults
hide_recycle_in_listings: false
file_type_indicator: emoji # or text
async_timeout: 120 # search_files and get_dir_size
# search_timeout: 120 # defaults to async_timeout
# dir_size_timeout: 120 # defaults to async_timeout
delete_timeout: 30 # how long delete_files waits before handing off
copy_move_timeout: 30 # copy_files, move_files, restore_from_recycle_bin
upload_timeout: 300
download_timeout: 300
search_poll_interval: 1.0
# allowed_local_paths: # default: your Downloads folder
# - ~/Downloads
# default_download_dir: ~/Downloads
# default_upload_dir: /home/uploadsSettings:
Setting | Default | Accepted | What it does |
|
|
| Hide |
|
|
| Markers for files and folders in listings. |
|
| 10โ3600 s | Time limit for |
|
| 10โ3600 s | Time limit for |
|
| 10โ3600 s | Time limit for |
|
| 10โ3600 s | How long |
|
| 10โ3600 s | How long |
|
| 10โ3600 s | Time limit for |
|
| 10โ3600 s | Time limit for |
|
| 0.5โ10.0 s | How often |
| your Downloads folder | local folders | Local folders |
| none | a local folder | Where |
| none | a NAS folder | Where |
Accounts. Any account. The tools see the shared folders that account can see, and can change only what its DSM permissions allow.
DSM versions: 7.1 โ 7.4.1, the same tools on each.
Not covered: compress and extract, share links, favorites, thumbnails, MD5 checksums, permissions and ownership changes, mounting remote folders.
Long operations hand off. For delete, copy, move and restore, the timeout is how long a call waits before handing off, not a limit on the operation. An operation that finishes within the wait returns its result as usual. One that's still running is left running on the NAS, and the reply gives a handle, such as
delete:FileStation_โฆ, to use withfile_task: check its progress or final result, or stop it.file_taskwith no handle lists the operations still running. The wait is capped at 600 s whatever the setting, because an MCP client that gives up on a call cancels it, and a canceled call stops the operation.Client timeouts. The MCP client has its own time limits. Claude Code aborts a tool call that sends no result and no progress notification for an idle window: 30 minutes by default for a stdio server like this one (5 minutes for HTTP servers). Raise it with the
CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUTenvironment variable (milliseconds;0turns the check off), or for this server only with atimeoutfield (milliseconds) in its MCP config entry, which also sets a hard limit per call. See Claude Code's MCP docs. Delete, copy, move and restore send progress notifications while they wait, so they don't hit the idle limit.get_dir_sizeandsearch_filesdon't send progress yet (#252), so one that runs longer than the idle window can be aborted by the client; raise the client's limit, or narrow the path.Folder downloads.
download_fileof a folder saves DSM's ZIP of it as<folder>.zip(or underfilename, when given). A whole shared folder can't be downloaded this way (DSM doesn't send one), so it's refused.Shared folders aren't deleted.
delete_filesrefuses a whole shared folder (/video): on DSM 7.2.2 to 7.4.1 (tested), and likely later, File Station's delete of/<share>removes the shared folder itself, beyond its recycle bin's reach. Delete a shared folder's items by path, or the shared folder in DSM's Control Panel.delete_filesalso refuses a path with a.,.., empty or whitespace-only part, or a NUL.
Spec: docs/specs/filestation-module-spec.md.
Synology Photos
Browse, search, organize and share a Synology Photos library, in your personal space and in Shared Space. Needs the Synology Photos package (Photo Station, its DSM 6 predecessor, isn't supported).
READ:
list_photos,list_photo_collections,get_photo,download_photosWRITE:
upload_photos,photo_album,photo_share_link,photo_folder,copy_photos,move_photos,photo_task,tag_photos,edit_photo,edit_person,photo_request,merge_people,delete_photos,delete_photo_folders,delete_photo_albums
modules:
photos:
enabled: true
permission: write # or read
settings: # all optional; the values shown are the defaults
task_timeout: 30 # seconds a copy, move or delete waits before handing off
# allowed_local_paths: # default: your Downloads folder
# - ~/DownloadsSettings:
Setting | Default | Accepted | What it does |
|
| 1โ600 s | How long |
| your Downloads folder | local folders | Local folders |
Accounts. The account needs the Synology Photos application privilege (Control Panel โ Application Privileges โ Synology Photos), and the personal space needs the user home service (Control Panel โ User & Group โ Advanced โ User Home). Shared Space must be enabled in Synology Photos' settings, with access granted to the account. The tools report each of these by name when it's missing.
DSM versions: DSM 7.1 (Synology Photos 1.3.4) and DSM 7.2.2, 7.3.2 and 7.4.1 (Synology Photos 1.9.1). Favorites and concepts (things and scenes Photos recognized) need Photos 1.9.1; on 1.3.4 they're refused with not_supported.
Not covered: timeline and similar-photo views, video streaming, Shared Space folder permissions, face-level People edits, guest uploads to photo requests, changing Photos' own settings.
Edits change the original files. Photos writes ratings, descriptions, tags, taken-time changes and rotations into the files themselves, so their dates and sizes change; backup and sync tools see new versions.
Tags are given by name. A tag exists only while some item has it, so removing it from every item deletes it.
Deletes go to the recycle bin of the share that holds the space, when it has one; Photos has no trash of its own. A large copy, move or delete hands off with a
photos:<id>handle thatphoto_taskfollows up on.
Spec: docs/specs/photos-module-spec.md, with what each tool sends and the DSM behavior behind it.
Download Station
Manage the Download Station queue and settings.
READ:
list_downloads,get_download_info,get_download_stats,get_download_config,get_scheduleWRITE:
create_download,delete_download,pause_download,resume_download,edit_download,set_download_config,set_schedule
modules:
downloadstation:
enabled: true
permission: write # or read
settings: # optional
allowed_local_paths: # folders create_download may read .torrent/.nzb files from
- ~/Downloads # the default; list it to keep it when adding others
- ~/TorrentsSettings:
Setting | Default | Accepted | What it does |
| your Downloads folder | local folders | Local folders |
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), and must set a default destination once before Download Station will start its tasks: set_download_config(default_destination="<share>"). More below.
DSM versions: DSM 7.1 (Download Station 3.9-4627) and DSM 7.2.2, 7.3.2 and 7.4.1 (Download Station 4.1-5012), the same tools on each.
Not covered: BT search, RSS feeds, choosing files inside a torrent, editing a torrent's trackers, settings other than the speed limits and the default destination (BT, FTP/HTTP, NZB, auto-extract).
Non-admin accounts. All of these are 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:
A
destinationmust be an existing folder: Download Station doesn't create missing folders. Create it first with File Station'screate_folder(/video/TV/New show; thefilestationmodule needspermission: write) or in DSM's own File Station, then pass it share-relative (video/TV/New show). An error that says the destination doesn't exist names this fix (#296).create_downloadreturns no task IDs for URLs that useusername/password.edit_downloadchanges only the destination.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.
Spec: docs/specs/downloadstation-module-spec.md.
Storage
See the health of the NAS's storage: storage pools and RAID, volumes and free space, disks with S.M.A.R.T., SSD caches, external drives and share snapshots.
READ:
get_storage_overview,list_storage_pools,list_volumes,get_volume,list_disks,get_disk,list_ssd_caches,get_storage_schedules,get_storage_settings,list_external_storage,list_snapshotsWRITE: none yet (phase 2)
modules:
storage:
enabled: true # no write tools yet, so no permission is neededSettings: none.
Tools. Start with get_storage_overview: DSM's own status summary, every pool, volume, disk and SSD cache in one line each, anything that needs attention (a degraded pool, a failing disk, a nearly full volume) and the storage tasks running or scheduled next. The others give one area in full, with every field DSM sends: get_disk adds every S.M.A.R.T. attribute, test results and history and a 12-month health trend; get_volume adds space by category, TRIM, deduplication and the attached SSD cache.
Accounts. An administrator account only: Storage Manager answers no other account, so with any other account every tool returns permission_denied. list_snapshots also needs the Snapshot Replication package.
DSM versions: 7.1 โ 7.4.1, the same tools on each. A volume's encryption and lock state, a snapshot's immutable flag and the drive database version appear from DSM 7.2.2. A section a NAS doesn't support (deduplication on some models, for example) is left out with a note.
Not covered: no WRITE tools yet: phase 2 plans data scrubbing, S.M.A.R.T. tests, hot spares, storage settings, TRIM and snapshot management. iSCSI LUNs and SAN Manager, Hyper Backup and Task Scheduler aren't covered. Anything that wipes disks or changes a pool's layout (creating, deleting, expanding or repairing pools and volumes, secure erase) is left out on purpose.
Spec: docs/specs/storage-module-spec.md.
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. Tools that write on this machine (
download_file,download_photos) are annotated as destructive so your client can confirm them, and so is every WRITE tool exceptcreate_folder,rename,upload_photos,create_download,pause_downloadandresume_download. 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 itLong operations keep running โ a large delete, copy, move or recycle-bin restore reports progress while the call waits, and if it's still running when the wait ends (30 s by default) the NAS keeps working on it: the reply gives a handle for
file_task, which checks on it, lists running operations or stops one. See File Station. Photos'copy_photos,move_photos,delete_photosanddelete_photo_foldersalso hand off, aftertask_timeout(default 30 s, up to 600), with aphotos:<id>handle forphoto_taskLocal path confinement โ
upload_file,download_file,upload_photos,download_photosandcreate_download's torrent files only use local folders listed inallowed_local_paths, by default your Downloads folder. Set it at the top level of the config for every module, or per module in that module's settings (File Station, Synology Photos and Download Station each have their own list). A module's own list adds to the top-level list when that's set. Without a top-level list, it replaces the Downloads default, so include~/Downloadsif you still want it.create_downloadonly reads.torrentand.nzbfiles. 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
Configuration
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โ every module, HTTPS, custom timeouts, logging, instructionsconfig-docker.yamlโ environment-variable-driven
The full reference is docs/specs/config-schema-spec.md. After editing a config, run mcp-synology check --config <file>: it reports YAML and validation mistakes, names misspelled settings and modules, then tries to log in. Module settings are in each module's section under Modules.
A config with every module, READ and WRITE (the module sections list each one's settings):
# ~/.config/mcp-synology/config.yaml
schema_version: 1
connection:
host: 192.168.1.100
https: true
verify_ssl: false # DSM's default self-signed certificate
auth:
username: your_user # the password stays in the keyring (setup puts it there)
modules:
system:
enabled: true
filestation:
enabled: true
permission: write
photos:
enabled: true
permission: write
downloadstation:
enabled: true
permission: writeConnection and HTTPS
connection:
host: 192.168.1.100 # or a hostname
https: true # default false: credentials then cross the network in cleartext
port: 5001 # default 5000, or 5001 with https: true
verify_ssl: false # default true; false for DSM's default self-signed certificate
timeout: 30 # seconds per request, 1 to 600 (default 30)Use https: true unless the NAS is on a network you trust: with plain HTTP, the login and every request travel unencrypted, and the server logs a warning saying so. setup writes https: true unless you decline. docs/https.md covers DSM's self-signed certificate and how to get a trusted one. If DSM uses its own self-signed certificate, set verify_ssl: false (the server warns that verification is off), or install a certificate the machine trusts and keep it true. A misspelled key in connection, auth or logging (htps, verfy_ssl) stops the server with an error naming it, rather than being ignored and leaving HTTPS off. When the key may be part of a password (any unknown key under auth, or one with no value), the error names the real key it's close to instead, or lists the valid keys.
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. Start from the built-in files: server.md is sent on every connection, filestation.md only when File Station is enabled, filestation-write.md after it only when File Station's WRITE tools are enabled (permission: write or admin), and local.md before the generated LOCAL PATHS section. The Synology Photos section is generated in server.py (_PHOTOS_NOTICE, plus _PHOTOS_WRITE_NOTICE when the Photos WRITE tools are enabled); copy it from a Photos connection's instructions if you use Photos. 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}, {home_dir} (the local home folder) and {platform} (Linux, macOS or Windows). Any other brace is left as written, so JSON examples are fine ({{ and }} are not escapes).
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.
2FA 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 (if device_id is set in the environment, SYNOLOGY_DEVICE_ID, or the config file, it overrides the keyring: remove it there first, then restart the server after setup).
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 PyPI for a newer version once a day (hourly while PyPI can't be reached), in the background when the server starts, and tells your MCP client's model, which passes it on:
On the first tool result after the check finds one, whichever module the tool belongs to. An ordinary release is announced once a week per install: connections that share an install (one copy serving several NASes) say it once between them.
A security release is announced in every session: in the server's instructions when the previous check already knew of it (so the model knows from the first message), otherwise on the first tool result.
Outside the chat: the client's MCP server log gets a WARNING, and
mcp-synology checkprints it.
The notice names the new version, the command that upgrades your install (uv tool upgrade mcp-synology, pipx upgrade mcp-synology, a restart for uvx, with uv cache clean mcp-synology if it still runs the old version, or pip install -U), and the release notes.
Each config (connection) chooses what it hears, since configs may run different installs and versions:
update_notices: all # all (default) | security | offsecurity keeps only security releases; off stops every notice in the chat (the log line and check still report it). check_for_updates: false turns off the check altogether.
To hear about releases without running the server, watch the repository on GitHub (Watch โ Custom โ Releases), or follow PyPI or the MCP Registry.
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 versionTroubleshooting
An error's help_url points to its section in docs/error-codes.md. For behavior that looks wrong but isn't an error (a download sitting in waiting, a Photos date that reads back old, a delete that hands off with a handle), see docs/troubleshooting.md, organized by module.
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.
Migrating from synology-mcp
The package was called synology-mcp up to v0.3.x. If you still have that install, a migration script moves its config and state directories, keyring credentials and Claude Desktop entry to the new names:
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 changesContributing
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 original 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
48 toolscopy_filesADestructive
Copy files or folders into a destination folder; a folder is copied with everything in it, and the sources stay in place. To move instead, use move_files. dest_folder must already exist; it isn't created. With overwrite=false (default), items already at the destination are skipped and listed, and the rest are copied. If any source is missing, nothing is copied. A long copy keeps running on the NAS and returns a handle for file_task.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Files or folders to copy (`/video/Downloads/clip.mkv`). | |
| overwrite | No | Replace items already at the destination (default false: they're skipped and listed). | |
| dest_folder | Yes | The existing folder to copy into (`/video/Archive`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: all-or-nothing validation ('If any source is missing, nothing is copied'), partial-success semantics under overwrite=false (skipped items are listed), and long-running behavior returning a handle for file_task. The description refines destructiveHint=true rather than fighting it โ the default path destroys nothing.
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?
Five tight sentences, each carrying distinct operational information, with the core purpose and the move_files routing front-loaded. No filler and no restatement of the name.
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?
No output schema exists, and the description covers the return path (handle for file_task) plus batch outcomes (skipped-and-listed), so nothing an agent needs in order to call or follow up correctly is missing.
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 already 100%, so the baseline is 3; the description earns above that by explaining the consequence of overwrite's default ('items already at the destination are skipped and listed') and by reinforcing the existence precondition on dest_folder, which the schema only implies.
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 (copy files or folders into a destination folder) and pins the semantics that distinguish it from move: 'the sources stay in place' and folders copy recursively.
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?
Explicitly names the alternative ('To move instead, use move_files') and adds preconditions to use: 'dest_folder must already exist; it isn't created.' It also explains what happens under each overwrite mode, so the agent knows which call shape suits which intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_photosPhotos: CopyADestructive
Copy Synology Photos items and/or whole folders into another folder, in the same space or the other one. Waits up to the configured task timeout (30 s by default); a longer copy keeps running on the NAS and the reply gives a handle for photo_task. With on_conflict=overwrite it replaces files at the destination.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Item IDs from list_photos, in `space`, at most 1,000. Pass `ids`, `folders` or both. | |
| space | No | Source space: `personal` (default) or `shared` (Shared Space). | personal |
| folders | No | Folder IDs or paths, with everything in them; not the space root. At most 1,000. | |
| dest_space | No | Space of `destination`, if not `space`: `personal` or `shared`. | |
| destination | Yes | The existing target folder's ID or path, in `dest_space`. | |
| on_conflict | No | A file with that name already at the destination: `skip` (default) or `overwrite` (replaces it). | skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the destructiveHint=true annotation: the async timeout behavior, that the operation keeps running server-side after the reply, that a handle is returned for photo_task, and that overwrite replaces existing destination files. These are exactly the behavioral traits an agent needs to reason about a long-running destructive write.
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 tightly packed sentences with no filler; the destructive overwrite behavior is stated at the end and the timeout/handle behavior is front-loaded where an agent will see it before calling.
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 no output schema, the description still tells the agent that a handle for photo_task may be returned for long copies, covering the key return-value concern. It leaves some ambiguity about the reply's structure in the synchronous case but is otherwise sufficient for a 6-parameter rewrite 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 100%, so the baseline is 3, but the description goes beyond the schema by explaining the on_conflict=overwrite consequence and the same-space/cross-space semantics of space vs dest_space. It does not add syntax or format details for ids/folders/destination beyond what the schema already documents.
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 (copy) and resource (Synology Photos items and/or whole folders), plus the scope of copying into another folder within or across spaces. This clearly distinguishes it from move_photos and copy_files, which act on different resource types or semantics.
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 description gives clear operating context: it blocks up to a task timeout (30 s by default), longer copies continue on the NAS with a handle for photo_task, and on_conflict=overwrite replaces destination files. It does not explicitly name when to prefer move_photos or copy_files, but the copy-vs-move distinction and cross-space capability are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_downloadA
Create one or more download tasks, from URIs or from a local .torrent / .nzb file. destination must be an existing folder, share-relative (DS doesn't create folders; make a new one first with File Station's create_folder when File Station write is enabled, or ask the user to create it in DSM). Omit it to use your default destination (a non-manager who has none must set it first with set_download_config, because DS won't start their tasks until then). Returns the new task IDs when DSM provides them (not for URLs with username / password); long magnet links and URI lists are supported.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | One or more source URIs, comma-separated: HTTP, HTTPS, FTP, magnet and others. Pass this or `torrent_file_path`, not both. | |
| password | No | Password for a protected `uri`; not for torrent files. | |
| username | No | User name for a protected `uri`; not for torrent files. | |
| destination | No | Existing folder to download into, share-relative (`video/Torrents`). Omit it to use your default destination. | |
| torrent_file_path | No | Path on this machine to a `.torrent` or `.nzb` file, inside one of the allowed local folders (/root/Downloads), or below it. Pass this or `uri`, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false/destructiveHint=false, the description adds substantial context: destination must already exist (DS won't create it), omitting it falls back to default, non-managers must set a default first, and task IDs are returned only in certain cases (not for credentialed URLs). Rich disclosure beyond annotations.
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-loads purpose then constraints. Dense but every clause (folder prerequisite, default fallback, ID-return caveat) carries real information, though the parenthetical nesting is slightly heavy.
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 mutation tool with no output schema, it covers the key operational facts an agent needs: source precedence, destination requirements, and return-value conditions. Nothing essential is missing.
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 100%, but the description still adds meaning: destination is share-relative and must be existing, and the default-destination behavior with the non-manager caveat. Goes beyond the schema on the most consequential parameter.
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 ('Create') and resource ('download tasks') with the two supported source types (URIs or local .torrent/.nzb file). Clearly distinguishable from siblings like delete_download, list_downloads, or edit_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?
Explains the destination prerequisite and routes to create_folder or set_download_config when a folder or default destination is missing. Clear context for use, though it doesn't explicitly contrast with sibling task-creation flows, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderAIdempotent
Create one or more folders, each given as a full path starting with its shared folder (/video/TV Shows/New Show). By default (force_parent=true), missing folders above it are created too, and a folder that already exists is not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Full paths of the folders to create (`["/video/TV Shows/New Show"]`). | |
| force_parent | No | Create missing parent folders too (default true); with `false`, each parent must already exist. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose non-read-only, idempotent, and non-destructive behavior. The description adds useful context: paths must start from the shared folder root, missing parents are created by default, and existing folders are not an error (reinforcing idempotency). It does not cover permissions or return behavior, but adds meaningful traits beyond annotations.
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 tightly written sentences with zero waste. The path format constraint is front-loaded and the default behavior is explained immediately after.
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 two-parameter creation tool with full schema coverage and safety annotations, the description covers path format, parent creation, and idempotency. Return values are not described, but no output schema exists; the only minor gap is not stating permission requirements.
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 100%, so both parameters are fully documented in the schema. The description adds an example path and clarifies the default effect of force_parent, but largely mirrors what the schema already states.
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 ('Create one or more folders') and immediately clarifies the input format with a full-path example. No sibling tool offers folder creation, and the scope (batch, shared-folder paths) is unambiguous.
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?
Usage is implied by the clear purpose and path requirement, but the description never says when to use this versus alternatives (e.g., relying on upload_file's implicit parent creation). It also provides no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_downloadADestructive
Remove one or more download tasks. A deleted task can't be restored (its source URL is gone with it), so name the tasks and confirm with the user before deleting. Files from finished tasks are always kept. For unfinished tasks the partial data is discarded (irreversible); don't rely on force_complete to keep it.
| Name | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | IDs of the tasks to remove, from list_downloads. | |
| force_complete | No | Ask DSM to keep an unfinished task's partial file instead of discarding it (DSM may discard it anyway). Leave false (default) for finished tasks: DSM refuses them with it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it destructive, and the description adds substantial behavioral detail beyond that: source URLs are lost, finished task files are retained, unfinished partial data is discarded irreversibly, and force_complete should not be relied on. This is exactly the kind of destructive-operation disclosure an agent needs.
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 tightly written sentences, with the core action front-loaded and the irreversible consequences and confirmation requirement following immediately. No 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?
For a destructive, parameter-light tool with no output schema, the description covers the essential risk profile, file-retention behavior, confirmation requirement, and force_complete caveat. Nothing needed to call it safely appears missing.
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 100%, so task_ids and force_complete are already documented in the input schema. The description reinforces the force_complete caveat but does not add much semantic detail beyond the schema, so the baseline 3 is appropriate.
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: removing download tasks. It also clarifies that finished task files are kept, which helps distinguish it from a file-deletion sibling, but it does not explicitly name alternatives such as delete_files or pause_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?
Gives clear usage context: deletion is permanent and requires naming tasks and confirming with the user before proceeding. It does not explicitly compare when to use this instead of pausing, editing, or deleting files, so it falls short of full alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_filesADestructive
Delete files or folders. A folder is deleted with everything in it (recursive, default true). On a share with a recycle bin, deleted items go to the bin: list_recycle_bin shows them and restore_from_recycle_bin brings them back. Without a bin, and for anything inside a bin (/<share>/#recycle), deletion is permanent. Paths are exact, not wildcard patterns, and if any path is missing nothing is deleted. A long delete keeps running on the NAS and returns a handle for file_task.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Exact paths of the files or folders to delete (`/video/Downloads/old.mkv`); wildcards aren't expanded. | |
| recursive | No | Delete a folder with everything in it (default true); with `false`, a folder that isn't empty is refused and kept. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, and the description adds substantial context: recycle-bin routing, permanent deletion inside a bin, recursive default behavior, all-or-nothing path handling, and an async handle for long deletes. These details go well beyond the annotations without contradicting them.
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?
The action and recursive behavior are front-loaded, and each subsequent sentence adds a distinct operational fact needed for a destructive tool. There is minor overlap with the schema on exact paths and recursive behavior, but no 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?
For a destructive tool with annotations but no output schema, the description covers the essential behavior an agent needs: recycle bin versus permanent deletion, recursive folder handling, atomicity when paths are missing, and async handling for long operations. Nothing critical is omitted.
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 100%, so the schema already documents exact paths and the recursive default/refusal behavior. The description reinforces those points but adds little parameter-specific syntax or meaning beyond the schema, so the baseline of 3 applies.
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 opens with a specific verb and resource ('Delete files or folders') and immediately distinguishes the recursive folder behavior. It is clearly distinct from siblings such as delete_download and file_task.
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 explains the conditions that determine whether a deletion is recyclable or permanent, notes that paths are exact and that any missing path aborts the whole delete, and points to list_recycle_bin, restore_from_recycle_bin, and file_task. It does not explicitly say when to prefer delete_files over delete_download, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_photo_albumsADestructive
Delete Synology Photos albums (normal or smart) and their share links. The photos in them stay where they are, but the albums' selections, conditions and links can't be recovered. Confirm with the user first. To only take items out of an album, use photo_album action=remove; to delete the photos themselves, delete_photos.
| Name | Required | Description | Default |
|---|---|---|---|
| albums | Yes | Album IDs (list_photo_collections type=album) or unique names; a name several albums share deletes nothing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes further by disclosing exactly what survives (the photos stay in place) versus what is unrecoverable (selections, conditions, share links) and requiring user confirmation beforehand. That is precisely the missing behavioral context a destructive tool needs.
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, front-loaded with the destructive action and the survivability caveat, then confirmation, then alternatives. No sentence is filler and the ordering matches how an agent should reason about the call.
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 one-parameter destructive tool with annotations covering safety and no output schema, the description supplies everything else an agent needs: what is destroyed, what remains, irreversibility, confirmation requirement, and sibling routing. Nothing material is missing.
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 100% and the schema itself already explains the ID-or-name input and the ambiguous-name behavior, so the description carries no additional parameter burden. It says nothing about the 'albums' argument beyond what the schema documents, so the baseline 3 applies.
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 ('Delete Synology Photos albums') with the scope of what is deleted made explicit (album objects plus their share links, normal or smart). It also names the two nearest siblings it is not โ photo_album action=remove and delete_photos โ so an agent can separate it from them without reading 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?
Explicitly states when not to use it ('To only take items out of an album, use photo_album action=remove; to delete the photos themselves, delete_photos') and adds a procedural gate ('Confirm with the user first'). The routing conditions are fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_photo_foldersPhotos: Delete foldersADestructive
Delete folders in Synology Photos with everything in them (files and subfolders). They go to the recycle bin of the share that holds the space if it has one, otherwise they're gone. A large delete keeps running on the NAS and the reply gives a handle for photo_task. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| folders | Yes | Not the space root; at most 1,000. Folder ID (list_photo_collections type=folder) or path, such as `/Trips/2024`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past destructiveHint=true by explaining recycle-bin semantics (and the permanence fallback when no recycle bin exists) and the async pattern where a large delete keeps running on the NAS and returns a handle for photo_task. These are exactly the consequences an agent needs before invoking a destructive operation.
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, each carrying new information: what gets deleted, where it goes, what happens on big deletes, and the confirmation requirement. The destruction scope is front-loaded so nothing important is buried.
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?
No output schema exists, and the description compensates by explaining that the reply returns a task handle for photo_task. It leaves out permission/auth requirements and partial-failure behavior on a multi-folder delete (up to 1,000 IDs), which would matter for a destructive bulk operation.
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 100%, so the baseline is 3; the description earns the extra point by clarifying that deletion is recursive over the folders argument and by giving the 'gone, not recycled' caveat that conditions how the space parameter's behavior plays out.
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?
Names a specific verb (Delete) and resource (folders in Synology Photos) and states the recursive scope ('everything in them (files and subfolders)'), which immediately distinguishes it from delete_photos and delete_photo_albums in the sibling list.
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?
Gives an explicit operational guardrail ('Confirm with the user first') and implies the space-scoped context, but never explicitly routes an agent to delete_photos for individual files or names when not to use this tool โ the disambiguation is inferable from the sibling names rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_photosPhotos: Delete itemsADestructive
Delete Synology Photos items (the files themselves) by id. They go to the recycle bin of the share that holds the space if it has one, otherwise they're gone. A large delete keeps running on the NAS and the reply gives a handle for photo_task. Confirm with the user first. To only take items out of an album, use photo_album remove.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Item IDs from list_photos, at most 1,000 per call. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: it discloses recycle-bin placement, the case where items are permanently unrecoverable ('otherwise they're gone'), and that a large delete runs asynchronously returning a handle for photo_task. This is exactly the safety/async context annotations cannot convey.
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-loads the core action and scope, then layers destructiveness, async behavior, and the alternative in tight sentences. Every sentence earns its place with no redundancy.
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 destructive two-param mutation with no output schema, it covers safety (recycle bin vs. permanent), async result handling (photo_task handle), confirmation, and the nearest alternative. Nothing an agent needs for correct invocation is missing.
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 100%, so both `ids` and `space` are fully documented in the schema. The description adds only 'by id' and 'the files themselves', which the schema already implies; baseline 3 applies when schema does the heavy lifting.
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 ('Delete Synology Photos items (the files themselves) by id') and immediately disambiguates from album removal via 'photo_album remove'. An agent can distinguish it from delete_photo_folders, delete_photo_albums, and delete_files 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?
Gives an explicit alternative ('To only take items out of an album, use photo_album remove') and a prerequisite ('Confirm with the user first'). It doesn't address all sibling confusions (delete_photo_folders, delete_files) or the space-scoping choice, but the highest-risk alternative is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileADestructive
Download a NAS file to a folder on this machine (where this server runs). A folder downloads as a ZIP of it, saved as <folder>.zip; a whole shared folder can't be downloaded. An existing local file is not replaced unless overwrite is true.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The NAS file or folder (`/video/Movies/Dune.mkv`). | |
| filename | No | Name to save as, a plain file name with no folders (default: the NAS name, or `<folder>.zip` for a folder). | |
| overwrite | No | Replace a local file of the same name (default false: the call fails and the local file is kept). | |
| dest_folder | No | Local folder to save into: one of the allowed local folders (/root/Downloads), or a folder below it. Optional when a default download folder is configured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description earns credit by explaining exactly what gets destroyed and when: an existing local file is kept and the call fails unless `overwrite` is true. It doesn't cover other behavior an agent might need, such as whether the call blocks until the transfer completes or what is returned (no output schema exists).
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 tight sentences: the core action first, then folder/zip semantics and the shared-folder restriction, then the overwrite caveat. No padding.
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 4-parameter tool with no output schema, the description covers the destructive path and the notable edge cases well. It leaves out the return value (presumably the saved local path) and any indication of long-running/large-transfer behavior, which matters for a NAS download.
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 100%, so `filename`, `overwrite`, `dest_folder` and `path` are all documented in the schema already. The description restates the overwrite default and the zip naming rule but adds no semantics beyond the schema โ baseline 3 is appropriate.
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 plus the destination ('Download a NAS file to a folder on this machine (where this server runs)'), which separates it from the download-station style siblings like create_download. It also defines the scope precisely: a folder becomes a ZIP, a whole shared folder is not allowed.
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 description gives concrete conditions that govern use โ folder downloads produce `<folder>.zip`, shared folders can't be downloaded, and existing local files block the call unless `overwrite` is set. It never explicitly names an alternative sibling (e.g. create_download) or when not to use this tool, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_photosPhotos: DownloadADestructive
Download Synology Photos items by id to a folder on this machine: the original files or JPEG previews, one file per item, named after the original. Only writes inside the allowed local folders, and never replaces an existing file unless overwrite=true. For files outside Photos, use File Station's download_file when that module is enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | 1-50 item IDs from list_photos. | |
| size | No | `original` (default), or a JPEG preview saved as `<name>_<size>.jpg`: `xl`, `m` or `sm`: 1280, 320 or 240 px on the short side, never larger than the original. | original |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| overwrite | No | Replace a local file with the same name; otherwise that item is skipped. | |
| dest_folder | No | An existing local folder: one of the allowed local folders (/root/Downloads), or one below it; default the allowed folder, when there's only one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description usefully narrows that: writes are confined to allowed local folders and existing files are preserved unless overwrite=true. That scoping context goes beyond the annotations. It doesn't cover failure modes for missing IDs or partial batches, which would be the next layer.
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 tight sentences, front-loaded with verb, resource, and destination, then behavior, then the sibling escape hatch. No 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?
With no output schema, the description adequately characterizes the result (one file per item, named after the original, previews suffixed). It stops short of describing return values or progress reporting, but nothing essential for correct invocation is missing.
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 100%, so the baseline is 3; the description adds the naming convention ('one file per item, named after the original') that the schema does not state, and reinforces the overwrite-skip semantics. The size and space parameters' meanings are left entirely to the 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 (download) and resource (Synology Photos items by id) plus the destination (a local folder) and the output form (original files or JPEG previews, one file per item, named after the original). It also explicitly distinguishes itself from download_file in a sibling module.
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?
Gives an explicit alternative route โ use File Station's download_file for files outside Photos when that module is enabled โ which is a clear when-to-use rule. It doesn't address when to prefer copy_photos or when to pick previews over originals in prose, but the core routing guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_downloadADestructiveIdempotent
Edit task parameters. Currently supports destination (change the task's output share). Requires a newer Download Station (Task API v2); older versions get a clear error. This changes only the listed tasks; for global settings, use set_download_config. A finished task's file isn't moved: the reply says not changed for it.
| Name | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | IDs of the tasks to change, from list_downloads. | |
| destination | No | New destination folder, share-relative (`video/Torrents`); it must already exist. The only editable field, so a call needs it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read-only, idempotent, destructive mutation. The description adds valuable behavior beyond annotations: API version requirements, scope limited to listed tasks, and the fact that finished tasks are not moved and report `not changed`.
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 tightly written sentences, front-loaded with purpose and scope, then prerequisites, alternatives, and edge-case behavior. No 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?
Given the toolโs complexity as a mutation with no output schema, the description covers the essential context: what can be edited, API compatibility, task scoping, the global-settings alternative, and finished-task behavior. An agent can call it correctly from this.
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 100%, so the schema already documents task_ids and destination thoroughly. The description reinforces that destination is the only editable field, but adds little syntax or format detail beyond the 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 (edit task parameters) and names the only currently supported editable field, destination. It also distinguishes the tool from the sibling set_download_config, which handles global settings.
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?
Explicitly says to use set_download_config for global settings and edit_download only for listed tasks. It also gives the prerequisite of a newer Download Station with Task API v2 and notes the clear error on older versions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_personADestructiveIdempotent
Change one person (a face-recognition group) in Synology Photos: rename them, hide or unhide them in the people list, or set their cover photo. To combine groups that are the same person, use merge_people.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new name; `""` makes them unnamed. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| action | Yes | `rename` (`name`), `hide`, `unhide` or `set_cover` (`item_id`). | |
| person | Yes | Person ID (list_photo_collections type=person) or unique name. Hidden ones need include_hidden=true there. | |
| item_id | No | An item ID from list_photos of a photo showing this person. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=true, so the safety profile is covered by structured data. The description adds value by framing the target as a face-recognition group, but it never explains which of the listed actions is destructive or whether effects are reversible (e.g. does renaming overwrite an existing name, does hiding persist). Given the destructive flag, a note on irreversibility would have earned a 4-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?
Two sentences, front-loaded with the core verb and resource, followed by the enumeration and the alternative. Nothing is wasted and no sentence repeats 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?
For a 5-parameter mutation tool whose parameters are fully documented and which has no output schema, the description covers purpose, the operation set and the one obvious sibling. The remaining gap is behavioral: a destructive mutation tool with no output schema should say what the caller gets back or what gets lost, so it falls just short of complete.
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 100%, so every parameter (name, space, action, person, item_id) is already documented in the schema, including the `""` unnamed convention and the include_hidden caveat. The description only echoes the action list, adding no syntax or format detail beyond the schema; baseline 3 applies.
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 ('Change one person ... in Synology Photos'), clarifies the domain concept ('a face-recognition group'), and enumerates the concrete operations (rename, hide/unhide, set cover). It also names the sibling merge_people, so an agent can separate 'edit one' from 'combine two' without opening either schema.
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?
Explicitly routes the agent to merge_people when the task is combining duplicate groups, which is the main confusion risk in this domain. It stops short of naming the other adjacent operations (listing people via list_photo_collections, deleting a person) as out of scope, so the exclusion set is not fully closed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_photoADestructive
Edit Synology Photos items: rating, description, taken time (set or shift), rotation and favorite (Photos 1.9.1+). Pass only the fields to change; they apply to every id given. Photos writes these into the original files, so file dates and sizes change. Location can't be edited; for tags use tag_photos.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Item IDs from list_photos, at most 1,000 per call. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| rating | No | 0-5; `0` clears the rating. | |
| rotate | No | `left` or `right`; a repeat rotates again. | |
| favorite | No | `true` marks favorite, `false` unmarks (Photos 1.9.1+). | |
| taken_time | No | Local date-time such as `2024-07-04T19:30:00`; an offset is dropped, not converted. Not with `shift_hours`. | |
| description | No | New description; `""` clears it, and one of only spaces shows as `โ`, like none. | |
| shift_hours | No | Shifts the taken time by hours (`-6`, `1.5`); a repeat shifts again. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds context the annotations cannot: edits are written into the original files, so file dates and sizes change, and favorite requires Photos 1.9.1+. It also documents repeat-behavior for rotate and shift_hours. That is substantive added value beyond the structured fields.
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 tight sentences with zero filler. The editable-field list, the mutation warning, and the routing to tag_photos are front-loaded in that order, so the most decision-relevant information comes first.
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 destructive, multi-parameter mutation tool with no output schema, the description covers what changes, what is irreversible (original files modified), what is out of scope, and where to go for tags. Nothing an agent needs before calling is missing.
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 100%, so the baseline is 3; the description earns an extra point by stating cross-parameter semantics the schema can only partially convey: fields apply uniformly to every id, and taken_time vs shift_hours are mutually exclusive alternatives. It stops short of explaining the space/id coupling, which the schema handles alone.
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 ('Edit Synology Photos items') and enumerates exactly which attributes are editable (rating, description, taken time, rotation, favorite). It also names the sibling tag_photos and explicitly excludes location, so an agent can distinguish it from neighboring photo tools without opening any schema.
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?
Gives concrete invocation guidance: 'Pass only the fields to change; they apply to every id given,' plus explicit exclusions โ location can't be edited and tags must go through tag_photos. That is when-to-use, how-to-use, and when-to-use-something-else in one short block.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
file_taskADestructive
Follow up on a delete, copy, move or restore that is still running on the NAS. Those tools hand off long operations and return a handle such as delete:FileStation_โฆ, because the NAS keeps working after the reply. With a handle: action="status" shows progress, or the final result if DSM still has it; action="stop" stops it, and the operation may then be partly done. Without a handle: lists this user's running operations, which is useful in a new chat or after a restart. Handles only work for the same NAS user. Don't poll in a loop: check when the user asks, or before doing something that depends on the result.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | `status` (default) or `stop`. | status |
| handle | No | The handle from a delete/copy/move/restore reply. Omit it to list running operations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the NAS keeps working after the reply, stop may leave the operation partly done (consistent with destructiveHint=true), status may return the final result only if DSM still has it, and handles are scoped to the same NAS user. These are real behavioral constraints an agent cannot get from readOnlyHint/destructiveHint.
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-loads the purpose, then the handle/no-handle cases, then the caveats. Every sentence carries a distinct piece of information, and the closing polling warning is the right thing to end on.
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 no output schema, the description supplies what the agent needs about return behavior: status shows progress or the final result, stop may leave partial state, and no-handle returns the user's running operations. Nothing material is missing for a two-parameter follow-up 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 100%, so the baseline is 3, but the description earns more by explaining what each action yields (progress versus final result; stop with possible partial completion) and what omitting the handle does. The only gap is that it doesn't specify handle format beyond the example prefix.
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 action (follow up on a running delete/copy/move/restore) and the resource (NAS file operations), and explicitly ties itself to the sibling tools that produce the handles. An agent can distinguish this from delete_files/copy_files/move_files without opening any schema.
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?
Gives explicit branching: with a handle use action=status or action=stop; without a handle it lists the user's running operations, which is called out as useful in a new chat or after a restart. It also names an anti-pattern (don't poll in a loop) and the condition that should trigger a check instead.
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 folder, including everything below it: total size, file count and folder count. This is the tool for 'how much space does X use' questions. Counts only what this DSM user can read: a subfolder it can't read is left out without notice. A very large tree can take minutes, and the call gives up after a timeout (120 s unless the server is configured otherwise).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The folder to measure (`/video/TV Shows`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/non-destructive; the description adds genuinely non-obvious behavior: permission-scoped counting with silent omission of unreadable subfolders, runtime that can reach minutes on large trees, and a 120 s timeout that aborts the call. These are exactly the operational facts an agent needs before invoking it.
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 sentences in priority order: what it computes, when to reach for it, the permission caveat, then the performance/timeout caveat. No repetition of the schema or the annotations.
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?
No output schema exists, so the description compensates by naming the three returned metrics, and it also covers the two failure modes an agent must anticipate (unreadable subfolders, timeout). Nothing material is left undefined for a one-parameter read 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?
There is a single required parameter and schema coverage is 100%, with the schema already supplying an example path, so the schema carries the load. The description adds no format, path-relative, or permission detail about the argument beyond what is structured, so the baseline of 3 applies.
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 folder') and enumerates the three values returned (total size, file count, folder count), which separates it from get_file_info and list_files. The scope 'including everything below it' makes the recursive nature explicit.
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?
Explicitly frames the trigger question ('how much space does X use'), giving a clear context for selection. It does not name a sibling alternative or an exclusion (e.g., use get_file_info for a single file's size), so it falls short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_download_configARead-only
Get Download Station global configuration: default destination, BT/HTTP/FTP/NZB/eMule max speeds, eMule and auto-unzip state. For accounts that are not Download Station managers DSM returns a per-user view (labeled as such), not the NAS-wide settings. Use get_schedule for the weekly plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: non-manager accounts get a per-user view labeled as such rather than NAS-wide settings โ an important output-shape caveat an agent could not infer from structured fields.
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, each carrying distinct information: what is returned, the permission-dependent view caveat, and the sibling alternative. Nothing is repeated from the schema or annotations.
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 no output schema, the description usefully names the configuration categories returned, and the per-user caveat covers the main behavioral surprise. It could say slightly more about the shape of the speed values, but for a no-argument read tool this is close to complete.
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?
The tool takes zero parameters, so there is no parameter meaning for the description to supply; baseline 4 applies. The description does not need to compensate for any schema 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?
States a specific verb (Get) and resource (Download Station global configuration) and enumerates the exact fields returned: default destination, BT/HTTP/FTP/NZB/eMule max speeds, eMule and auto-unzip state. This clearly separates it from sibling config tools like get_schedule and set_download_config.
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?
"Use get_schedule for the weekly plan" gives an explicit alternative and the condition that selects it. It does not mention set_download_config for modifying these same settings, which is the nearest sibling and a likely confusion point, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_download_infoARead-only
Get detailed information for a specific download task: detail (status, destination, URI), transfer (size downloaded/uploaded, speed, peers), files (per-file selection for BT), trackers (BT only), peers (BT only). Use list_downloads first to find the task_id. For totals across all tasks, use get_download_stats; for settings, use get_download_config.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | One task ID (`dbid_โฆ`), from list_downloads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true/destructiveHint=false, so safety is covered. The description adds non-obvious behavioral context: which data blocks are included and the conditional availability of files/trackers/peers (BT only), which prevents an agent from assuming empty results mean failure. It doesn't mention whether trackers/peers can be slow or omitted for non-BT tasks beyond the '(BT only)' note, but that gap is minor.
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?
One dense sentence enumerating return contents, followed by two short routing sentences. Zero filler and front-loaded with the purpose before the sibling disambiguation.
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 no output schema, the description compensates well by listing exactly what the response contains. For a single-parameter read-only lookup with annotations covering the safety profile, nothing an agent needs to call it correctly is missing.
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 100% and the schema already specifies task_id format (`dbid_โฆ`) and its source. The description restates the source ('Use list_downloads first') without adding syntax or validation detail beyond the schema. Baseline 3 is appropriate.
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+resource (retrieve detailed info for a specific download task) and enumerates the four information blocks returned (detail, transfer, files, trackers, peers). Clearly distinguishes itself from get_download_stats and get_download_config by naming both siblings.
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?
Explicit sequencing ('Use list_downloads first to find the task_id') plus explicit routing rules for alternatives: totals โ get_download_stats, settings โ get_download_config. Nothing is left to inference for an agent picking among the three get_* download tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_download_statsARead-only
Get current Download Station throughput statistics: total download and upload speed across all tasks, plus eMule download/upload speed when the eMule service is enabled. For per-task speeds use list_downloads.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 behavioral detail that eMule figures appear only when the eMule service is enabled, but says nothing about whether the values are instantaneous samples, cumulative averages, or what units they're in.
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 waste, with the returned metrics front-loaded and the sibling routing placed last where it belongs as a disambiguation clause.
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 zero-param read tool with no output schema, the description covers what comes back (total down/up plus conditional eMule speeds) which is the main thing an agent needs. The missing piece is units/sampling semantics of the returned numbers, but the shape of the response is adequately conveyed.
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?
Zero parameters, so the schema carries no semantics burden and there is nothing for the description to compensate for. Baseline 4 applies.
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?
Uses a specific verb (get) and resource (Download Station throughput statistics) and spells out exactly which metrics are returned: aggregate download/upload speed plus conditional eMule speeds. It also distinguishes the aggregate scope from the per-task view in list_downloads, so an agent can tell it apart from siblings.
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?
Explicitly routes the agent: use this for aggregate throughput, use list_downloads for per-task speeds. Clear usage context, though it doesn't address other plausibly adjacent siblings such as get_download_info or get_resource_usage.
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 files or folders whose paths you know: size, owner, timestamps, permissions and real path on the volume. To see what's in a folder, use list_files; for a folder's total size, use get_dir_size. A path that doesn't exist is reported as not found.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | One or more full paths (`/video/Movies/Dune.mkv`). | |
| additional | No | Fields to fetch: `real_path`, `size`, `owner`, `time`, `perm`, `type` (DSM's extension type) and `mount_point_type` (shown only for a mount point). Default: the first five. Unknown values are rejected. |
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 useful behavior beyond that: the error case for missing paths and a preview of the returned fields. It stops short of saying how multiple paths are handled on partial failure or any batching limits, which keeps it below 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 tight sentences with the core purpose front-loaded, followed by the sibling disambiguation and error behavior. Every sentence carries distinct information.
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 no output schema, the description usefully names the returned metadata fields and the not-found behavior, making it callable without opening the schema. It could say a bit more about multi-path results or limits, but nothing critical is missing.
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 100%, so both `paths` and `additional` (field list, defaults, rejected unknown values) are fully documented in the schema. The description only restates example fields like 'real path on the volume' and 'permissions' rather than adding syntax or format details, so the baseline 3 applies.
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 โ retrieving detailed metadata for files/folders at known paths โ and enumerates what metadata (size, owner, timestamps, permissions, real path). It explicitly distinguishes itself from list_files and get_dir_size by naming those siblings.
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?
Gives an explicit precondition ('whose paths you know') and routes the agent to the correct alternatives: list_files for folder contents and get_dir_size for a folder's total size. It also sets expectations for a non-existent path being reported as not found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_photoARead-only
Get full details for Synology Photos items by id: filename, folder, taken time, size, resolution, rating, favorite (Photos 1.9.1+), description, tags, people, GPS location and address, and camera details, plus the full EXIF table with exif=true. Use it when list_photos' one-line rows aren't enough. IDs that don't exist are listed as not found.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | 1-20 item IDs from list_photos. | |
| exif | No | Also show each item's full EXIF table. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe read (readOnlyHint=true, destructiveHint=false), so the lower bar applies. The description adds real value beyond that: it discloses the full return field set, that EXIF requires an explicit flag, and that nonexistent IDs are surfaced as 'not found' rather than erroring out. It does not mention permissions or space-boundary behavior, which keeps it from 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 tight sentences: what it returns first, the routing hint second, the not-found edge case last. No filler, and the most decision-relevant information (the detail payload vs. list_photos) is front-loaded.
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?
No output schema exists, yet the description enumerates the returned fields comprehensively (filename, folder, taken time, size, resolution, rating, favorite, description, tags, people, GPS, camera, EXIF), so an agent knows what it will get. The not-found handling covers the main surprising edge case for an ID-based lookup.
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 100%, so the schema already documents ids (1-20 from list_photos), exif, and space. The description's 'full EXIF table with exif=true' restates the schema rather than adding syntax or constraints, and it never explains the personal/shared space semantics. Baseline 3 is appropriate.
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 full details for Synology Photos items by id') and then enumerates exactly which fields are returned, including the opt-in EXIF table. An agent can distinguish this from list_photos or get_file_info without opening any schema.
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?
Explicitly names the alternative and the condition that selects it: 'Use it when list_photos' one-line rows aren't enough,' and notes IDs come from list_photos. It stops short of stating when NOT to use it (e.g. bulk retrieval vs. the download/copy photo tools), so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resource_usageARead-only
Get live resource utilization: CPU load, memory usage, disk I/O, and network throughput. Needs a DSM administrator account; any other account gets permission_denied. Use this to check if the NAS is under heavy load before starting expensive work on it. For the model, firmware, temperature and uptime, use get_system_info.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 genuinely new behavioral context: it requires a DSM administrator account and other accounts receive permission_denied, plus it flags the data as live. It doesn't discuss sampling windows or response shape, so 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, front-loaded with the resource and metrics, then auth constraint, then the disambiguation pointer. Every sentence carries distinct information with no repetition.
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 parameterless read-only tool with annotations covering safety and no output schema, the description supplies everything an agent needs: what it returns, the auth prerequisite and failure mode, when to call it, and which sibling to use for adjacent data.
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?
The tool takes zero parameters, so there is nothing the description needs to disambiguate; baseline for zero-param tools applies. Nothing in the description contradicts the empty 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 (get live resource utilization) and enumerates the metrics returned: CPU load, memory, disk I/O, network throughput. It also explicitly separates itself from the sibling get_system_info by naming what that tool covers instead.
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?
Gives an explicit use case ('check if the NAS is under heavy load before starting expensive work on it') and routes the agent elsewhere for model/firmware/temperature/uptime. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleARead-only
Get the Download Station schedule: whether it is enabled, the limited-speed (alt) download/upload rates, and the weekly plan as a 7-day ร 24-hour grid where each hour is full speed, limited, or no download. The weekly plan needs a Download Station manager/admin account; otherwise only the flags are shown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds the important behavioral nuance that output degrades to flags-only without admin rights. It does not describe pagination or any rate/size considerations, but for a zero-parameter read that is minor.
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 waste. The returned content is front-loaded and the permission caveat follows as a qualifier, which is the right order for an agent scanning for what it will get back.
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 no output schema and no parameters, the description carries the entire burden of explaining the return value, and it does so concretely: named fields plus the shape and domain of the weekly grid. Nothing an agent needs in order to call this correctly is missing.
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?
The tool takes no parameters, which is the baseline-4 case; there is nothing for the description to clarify. The description correctly implies no input is needed by framing the call purely in terms of what is returned.
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 ('Get') and resource ('Download Station schedule') and then enumerates exactly what the response contains: enabled flag, limited-speed rates, and a 7-day ร 24-hour weekly plan with three state values. This is clearly the read counterpart to the sibling set_schedule, so an agent can distinguish them without opening either schema.
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 gives a clear usage condition: retrieving the weekly plan requires a Download Station manager/admin account, and without one only the flags are returned. That is a real prerequisite rather than generic filler, though it never explicitly names set_schedule as the mutation alternative or states when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_system_infoARead-only
Get everything DSM reports about the NAS. Every account gets the model, serial number, DSM version, RAM, uptime, the NAS's local time and its code page, and the temperature where the NAS has a sensor. A DSM administrator account also gets the CPU, time zone with the current UTC offset, NTP server, firmware date, DSM's update-ready and crash flags, eSATA and attached devices, the network-card flag on DSM 7.2.2 and later, and redundant power on models that report it; any other account gets a line saying so. Use this to identify the NAS, check its basic health or tell the time on it. For live CPU, memory, disk and network load, use get_resource_usage.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnlyHint/destructiveHint annotations by disclosing that the response is account-dependent: admins get CPU, time zone, NTP, firmware, update/crash flags, eSATA, redundancy, while 'any other account gets a line saying so'. It also conditions fields on hardware ('the temperature where the NAS has a sensor') and DSM version ('on DSM 7.2.2 and later'), which is exactly the behavioral context an agent cannot infer.
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 a one-line summary, then the conditional detail, then the routing pointer to the sibling โ a sound structure. The middle sentence is a long comma-separated field inventory, which is dense but earns its place given there is no output schema; some of that enumeration could be tightened.
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?
No output schema exists, so the description must carry return-value information โ and it does, covering both the always-present fields and the admin-only conditional fields, including the fallback line for non-admins. Combined with the sibling pointer and account-dependence caveat, nothing an agent needs to call this correctly is missing.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-arg tool applies. The description correctly spends no words on inputs and puts the budget into output shape instead.
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 ('Get everything DSM reports about the NAS') with an explicit enumeration of the resource's contents. It also names the sibling it must not be confused with (get_resource_usage), so an agent can separate the two without opening either schema.
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?
Explicit when-to-use ('identify the NAS, check its basic health or tell the time on it') plus a named alternative with the selecting condition ('For live CPU, memory, disk and network load, use get_resource_usage'). Both sides of the routing decision are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_downloadsARead-only
List download tasks in the Download Station queue. Returns a table with id, title, type (bt/http/ftp/nzb), status, size, progress%, download and upload speed, ETA, and completion time. Paged (25 by default); the footer gives the true total and the next offset. A status filter or sort covers the whole queue, not just one page: sort_by=completed with limit=1 gives the most recently finished task. Accounts that are not Download Station managers see only their own tasks (the output says so), so an empty list does not mean the NAS is idle.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most tasks to return, 1 or more. | |
| offset | No | Tasks to skip, 0 or more; the footer gives the next offset. | |
| sort_by | No | `queue` (default: queue order, oldest first), `created` or `completed` (both newest first; never-completed tasks last). | queue |
| status_filter | No | `all` (default), `downloading` (also waiting, finishing, hash checking, waiting for a file host, or extracting), `finished` (also seeding), `paused` or `error`. | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, and the description adds substantial behavioral context beyond that: paged output with a footer total, filter/sort covering the whole queue, and permission-scoped visibility for non-managers. The caveat that an empty list may reflect permissions rather than NAS idleness is especially useful.
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?
The description is front-loaded with the core purpose, then adds return shape, pagination, cross-page filtering semantics, and the permission caveat in a compact set of sentences. Every sentence contributes specific operational value.
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?
There is no output schema, but the description explains the return columns, footer behavior, and permission-scoped results. Combined with the read-only annotations and fully documented parameters, an agent has enough information to call this correctly.
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 100%, so the baseline is 3. The description adds cross-parameter meaning beyond the schema, notably that sort/filter operate across the full queue and that sort_by=completed with limit=1 returns the most recently finished task.
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 and resource: list download tasks in the Download Station queue. It also immediately frames the result as a tabular summary, which distinguishes it from sibling tools like get_download_info and get_download_stats that focus on detail or aggregates.
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 description gives clear usage context for pagination, status filtering, and sorting, including a concrete example of using sort_by=completed with limit=1 to find the latest finished task. It does not explicitly name alternatives such as get_download_info, so it stops short of full when-to-use routing.
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 the files and folders directly inside one folder (one level; subfolders' contents aren't listed). To find files anywhere below a folder by name, extension, size or date, use search_files. Folders show no size; for a folder's total, use get_dir_size. DSM sorts folders and files separately: ascending lists folders first, descending files first. A long listing is paged, and the reply says which offset is next.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The folder to list (`/video/TV Shows`). | |
| limit | No | Most items to return; `0` returns them all. | |
| offset | No | Items to skip; a reply with more says which offset is next. | |
| pattern | No | Name filter, case-insensitive: a bare word matches anywhere in the name; with `*` or `?` the whole name must match (`*.mkv`); commas separate alternatives (`*.mkv,*.mp4`). | |
| sort_by | No | `name` (default), `size`, `mtime` (modified), `crtime` (created), `atime` (accessed), `ctime` (changed), `user` (the owner) or `type`. | name |
| filetype | No | `all` (default), `file` or `dir`. | all |
| sort_direction | No | `asc` (default) or `desc`. | asc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive profile, and the description adds genuinely non-obvious behavior: DSM sorts folders and files in separate groups (so ascending puts folders first, descending files first) and long listings are paged with the next offset reported in the reply. It stops short of describing per-item fields or permission/error behavior, so 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?
Four compact sentences, each earning its place: scope first, alternatives second, output caveats third, sorting/paging last. No filler or restatement of the tool name.
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 no output schema, the description supplies the key return-shape facts an agent needs (paged results, next offset, folders have no size), which is exactly the right compensation. It omits what other per-item fields come back, a minor gap for a read-only listing tool with full parameter documentation.
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 100%, so the baseline is 3, but the description adds meaning the schema cannot: the folder-vs-file sort grouping that determines what sort_direction actually yields, and the paging contract tying limit/offset to the reported next offset. Pattern and filetype semantics are left to the 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+resource ('List the files and folders') and immediately bounds scope ('directly inside one folder (one level; subfolders' contents aren't listed)'). It also names the sibling it is not (search_files for recursive lookups), so an agent can distinguish it without opening any schema.
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?
Explicitly routes to alternatives with conditions: use search_files to find files anywhere below by name/extension/size/date, and get_dir_size for a folder's total size. It also pre-empts a likely misuse by noting folders report no size.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_photo_collectionsARead-only
List one type of Synology Photos collection with ids and item counts: albums, albums shared with you, people, tags, places, concepts or folders. Use it to find the ids and names that list_photos filters by. Paged; name narrows the list by substring.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only names containing this text, any case (folders: the path). | |
| type | Yes | `album` (yours, with sharing status), `shared_with_me` (albums others shared with you), `person` (face recognition), `tag`, `place`, `concept` (things and scenes Photos recognized; 1.9.1+) or `folder` (subfolders of `parent`). | |
| limit | No | Most entries to return, 1-1,000. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. Albums are always personal. | personal |
| offset | No | Entries to skip, for the next page. | |
| parent | No | `type=folder`: the folder ID or path to list (default the space root). | |
| include_hidden | No | `person`, `concept`: include hidden ones (and people with few photos). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds useful behavioral detail โ that results are paged and that substring name matching narrows the list. It does not discuss permissions needed for the shared space or how hidden people/concepts affect counts, but with annotations present the bar is lower and this is solid supplementary 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?
Three sentences, front-loaded with the enumeration of types, then the use case, then the paging/filter note. Nothing is redundant or padded, and the reader gets the highest-value information first.
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 no output schema, the description correctly discloses what comes back โ ids and item counts โ and covers paging and filtering, which is what an agent needs to call it. The only gap is that the personal-vs-shared space semantics that affect ID validity are left entirely to the schema, so it falls just short of fully self-contained.
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 100%, so all seven parameters, including the enum-like `type` values and `space`, are already fully documented in the schema. The description only echoes the name-substring behavior and paging, adding no syntax or edge-case detail beyond what the schema states. Baseline 3 applies when the schema carries the parameter burden.
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 names a specific verb ('List') and resource ('Synology Photos collection') and enumerates the exact collection types it can return, including 'albums shared with you' as its own type. It also distinguishes itself from list_photos and the filesystem tools by framing the output as ids and item counts. An agent can identify this tool's domain without consulting the schema.
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 gives a concrete use case and routes the agent to the pairing sibling: 'Use it to find the ids and names that list_photos filters by.' That is clear usage context, but it stops short of exclusions โ e.g., it never says to use list_photos or search_files instead when you merely want photo metadata rather than a collection listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_photosARead-only
List or search photos and videos in Synology Photos, newest first by default, with the total. folder, person and tag combine with the date, type, rating and favorite filters; album, place, concept and keyword each work alone. Each row has the item's id, filename, taken time, type, size and folder; pass the ids to get_photo for full details or to download_photos to save the files. For files outside Photos, use File Station's list_files when that module is enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only items with this tag name. | |
| type | No | `all` (default), `photo` or `video`. | all |
| album | No | One album only (personal space). Album ID (list_photo_collections type=album) or unique name. | |
| limit | No | Most items to return, 1-500. | |
| place | No | One place only: a place ID from list_photo_collections type=place. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| folder | No | Only items directly in this folder, not subfolders. Folder ID (list_photo_collections type=folder) or path, such as `/Trips/2024`. | |
| offset | No | Entries to skip, for the next page. | |
| person | No | Only items showing this person. Person ID (list_photo_collections type=person) or unique name. | |
| concept | No | One concept only (a thing or scene Photos recognized): an ID from list_photo_collections type=concept. Photos 1.9.1+. | |
| keyword | No | Search filenames and tag names; works alone, in search order (no sorting). | |
| sort_by | No | `taken` (default), `filename`, `size` or `type`. | taken |
| end_date | No | Taken on or before this date, `YYYY-MM-DD`. | |
| favorite | No | `true`: favorites only (Photos 1.9.1+). `false` doesn't filter. | |
| min_rating | No | Minimum rating, 1-5. | |
| start_date | No | Taken on or after this date, `YYYY-MM-DD` (the photo's local time). | |
| sort_direction | No | `desc` (default) or `asc`. | desc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read operation, so the bar is lower, and the description still adds real behavior: default ordering is newest-first, the total is returned, and keyword search runs in search order with no sorting applied. It also enumerates the row fields, though it omits pagination behavior details beyond the offset/limit params.
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 purpose and the most consequential constraint (combination rules) before the return-shape and routing details. It is dense and slightly run-on but nearly every clause carries non-redundant information.
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 17-parameter, zero-required filter tool with no output schema, the description covers what the rows contain and how to chain into get_photo/download_photos, which is exactly the context an agent needs. Nothing critical is missing.
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 100%, so baseline would be 3, but the description adds cross-parameter semantics not present in the schema: the mutual-exclusion/combination rules between filter families and the note that IDs belong to one space. That is genuine meaning beyond the field-level descriptions.
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+resource ('List or search photos and videos in Synology Photos') with scope details (newest first by default, total included) and distinguishes itself from get_photo, download_photos, and File Station's list_files. An agent can tell exactly what this tool does and what it is not for.
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?
Explicitly encodes the combination rules: folder/person/tag combine with date/type/rating/favorite, while album/place/concept/keyword work alone. It also names downstream alternatives ('pass the ids to get_photo for full details or to download_photos') and the File Station alternative with its enablement condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recycle_binARead-only
List what's in one shared folder's recycle bin: the files and folders deleted from that share. list_shares shows which shares have a bin; for files that weren't deleted, use list_files. Without pattern, only the bin's top level is listed, and DSM sorts folders and files separately, as in list_files. With pattern, the bin is searched, subfolders included (up to 200 folders and 5,000 items; the reply says when it stops early), and each match shows its path in the bin. Modified is the file's own time, not when it was deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most items to return; `0` returns them all. | |
| share | Yes | The shared folder whose bin to list, as a name (`video`) or path (`/video`). | |
| offset | No | Items to skip; a reply with more says which offset is next. | |
| pattern | No | Name filter, as in list_files (case-insensitive; `*` and `?`; a bare word matches anywhere), applied across the bin, subfolders included (up to 200 folders and 5,000 items; the reply says when it stops early). | |
| sort_by | No | `mtime` (default: the file's own modified time), `ctime` (closest to when it was deleted), `name`, `size`, `crtime` or `atime`. | mtime |
| sort_direction | No | `desc` (default) or `asc`. | desc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral detail beyond them: top-level-only listing without a pattern, folder/file sorting parity with list_files, recursive search with pattern, caps of 200 folders and 5,000 items, early-stop notification, path reporting per match, and the distinction between file mtime and deletion time. No behavior contradicts the annotations.
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?
The purpose and scope are front-loaded in the first sentence, followed by sibling routing and then behavioral nuances in a compact paragraph. Every sentence contributes distinct selection or invocation information, with no 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?
For a read-only listing tool with six parameters, full schema coverage, and no output schema, the description covers the important gaps: list behavior with and without pattern, search limits and early-stop signaling, path reporting, sorting, and the meaning of modified time. An agent has enough information to invoke it correctly.
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 100%, so the schema already defines each parameter. The description still adds useful meaning: it explains how pattern changes scope (search across the bin, subfolders included), describes the search caps, and clarifies that 'modified' is the file's own time rather than deletion time. This goes beyond schema restatement, though much of it is behavioral context rather than per-parameter syntax.
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 opens with a specific verb and resource: 'List what's in one shared folder's recycle bin: the files and folders deleted from that share.' It explicitly distinguishes this tool from list_shares (which shares have a bin) and list_files (non-deleted files), so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names two concrete alternatives and the conditions that select them: list_shares for checking which shares have a bin, and list_files for files that were not deleted. That provides explicit routing guidance and a clear when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_peopleADestructive
Merge people (face-recognition groups) in Synology Photos that are the same person: every person in merge joins target, which keeps its id, and the merged people are gone. If any person isn't found, nothing is merged. This can't be undone, so confirm with the user first. To rename or hide one person, use edit_person.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The name after the merge; default the target's. | |
| merge | Yes | The people merged into `target`, as IDs or unique names. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| target | Yes | The person to keep. Person ID (list_photo_collections type=person) or unique name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds important behavioral details: target keeps its id, merged people disappear, the operation is all-or-nothing if any person is missing, and the merge is irreversible. This gives the agent the operational context needed before invoking a destructive tool.
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?
The description is tightly written and front-loaded: the merge behavior comes first, followed by the all-or-nothing rule, the irreversibility warning, and the sibling alternative. Every sentence carries useful information.
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 destructive mutation tool with no output schema, the description covers the essential risks and semantics: what gets merged, what survives, failure behavior, irreversibility, and which sibling to use for a related operation. Nothing critical is missing for correct invocation.
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 100%, so the parameters are already well documented. The description reinforces the target/merge relationship by stating that every person in merge joins target and target keeps its id, but it does not add meaning for the name or space parameters beyond what the schema already provides.
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 and resource: merge people/face-recognition groups in Synology Photos that are the same person. It explains the core effectโmerge joins target, target keeps its id, merged people are goneโand distinguishes this from edit_person, which is for renaming or hiding one person.
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 explicitly tells the agent when to use this tool (merging duplicate people) and when to use the sibling edit_person instead (renaming or hiding one person). It also gives a clear prerequisite: confirm with the user first because the action cannot be undone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_filesADestructive
Move files or folders into a destination folder; a folder moves with everything in it, and the sources are removed. To keep the sources, use copy_files. dest_folder must already exist; it isn't created. With overwrite=false (default), items already at the destination are skipped, listed and left at the source. If any source is missing, nothing is moved. A long move keeps running on the NAS and returns a handle for file_task.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Files or folders to move (`/video/Downloads/clip.mkv`). | |
| overwrite | No | Replace items already at the destination (default false: they're skipped and listed). | |
| dest_folder | Yes | The existing folder to move into (`/video/Archive`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: annotations only declare destructiveHint=true, while the description spells out that folders move recursively, that overwrite=false skips and lists existing destination items leaving them at source, that a missing source aborts the whole operation, and that long moves continue on the NAS and return a handle for file_task. These are the exact behaviors an agent needs before invoking a destructive operation.
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?
Five short clauses, front-loaded with the core action and destruction consequence, then the alternative, then preconditions and edge cases. No sentence repeats the name or title and none could be dropped without losing a decision-relevant fact.
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 3-parameter destructive tool with no output schema, the description covers the mutation effect, prerequisite state, partial-failure semantics, and the async escape hatch to file_task. Nothing an agent needs in order to call it safely is missing.
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 100%, so the baseline is 3, but the description adds meaning the schema lacks: the all-or-nothing atomicity tied to `paths` ('if any source is missing, nothing is moved') and the fact that skipped items remain at the source under `overwrite=false`. It largely restates the `dest_folder` existence requirement already in the schema, keeping it short of 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 (move files or folders into a destination folder) and immediately distinguishes the semantics from the closest sibling by noting that sources are removed and pointing to copy_files for the non-destructive variant. An agent can pick this over copy_files without inspecting either schema.
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?
Explicitly names the alternative (copy_files) and the condition that selects it ('to keep the sources'). It also gives preconditions ('dest_folder must already exist; it isn't created') and the default-mode behavior, so both use and non-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_photosPhotos: MoveADestructive
Move Synology Photos items and/or whole folders into another folder of the same space, or from the personal space into Shared Space (Photos can't move out of Shared Space: copy, then delete). Waits up to the configured task timeout (30 s by default); a longer move keeps running on the NAS and the reply gives a handle for photo_task. With on_conflict=overwrite it replaces files at the destination.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Item IDs from list_photos, in `space`, at most 1,000. Pass `ids`, `folders` or both. | |
| space | No | Source space: `personal` (default) or `shared` (Shared Space). | personal |
| folders | No | Folder IDs or paths, with everything in them; not the space root. At most 1,000. | |
| dest_space | No | Space of `destination`, if not `space`: `personal` or `shared`. | |
| destination | Yes | The existing target folder's ID or path, in `dest_space`. | |
| on_conflict | No | A file with that name already at the destination: `skip` (default) or `overwrite` (replaces it). | skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a write with destructiveHint=true, but the description adds genuinely new behavior: the 30 s task timeout, that longer moves keep running server-side, and that the reply carries a handle for photo_task. That async/completion detail is exactly what an agent needs and is not in annotations. It stops short of saying whether the move is reversible or how partial failures are reported.
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 dense sentences, front-loaded with the core action and immediately followed by the critical scope exclusion. The parenthetical workaround and the timeout clause are efficiently packed, though the timeout/handle sentence could be tightened without losing meaning.
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?
No output schema exists, and the description compensates by explaining the response behavior (task handle on timeout). Combined with 100% schema coverage and mutation annotations, an agent has everything needed to call this correctly, including the async continuation path via photo_task.
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 100%, so ids, folders, space, dest_space, destination and on_conflict are all documented at the field level. The description reinforces the space semantics ('another folder of the same space') and the overwrite effect, but adds no syntax or constraint detail beyond what the schema already states. Baseline 3 applies.
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 set ('Move Synology Photos items and/or whole folders') plus the exact scope boundaries: within one space, or personalโShared Space only. That scope statement separates it cleanly from copy_photos and move_files without the agent needing to open either schema.
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?
Gives explicit when-not guidance ('Photos can't move out of Shared Space') and names the workaround alternative ('copy, then delete'). The overwrite condition is also framed as a usage choice ('With on_conflict=overwrite it replaces files'), not just a parameter restatement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_downloadA
Pause one or more download tasks. When some of the tasks can be paused, an already-paused or finished one is refused for its id (error 405) or shown as not paused: already finished, and the others are paused. When none can be paused (one finished or already-paused task alone, a missing id, or another user's task), the whole call fails with invalid_parameter; list_downloads shows each task's status.
| Name | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | IDs of the tasks to pause, from list_downloads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description goes far beyond that by disclosing partial-failure semantics, the 405/`not paused: already finished` per-id outcome, and the invalid_parameter whole-call failure conditions. This is exactly the kind of operational detail an agent cannot infer from structured fields.
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 action in the first clause, then failure behavior, with zero filler sentences. The middle sentence is dense and its 'refused for its id (error 405) or shown as...' phrasing is slightly convoluted, but every clause carries information.
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 one required parameter and no output schema, the description covers the decisive gaps: which ids fail, what happens on partial success, and where to check status via list_downloads. It does not say what a fully successful call returns, but that is a minor omission for a simple state-change 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 100%, so the baseline is 3, but the description adds real meaning: a missing id or another user's task causes the entire batch to fail with invalid_parameter rather than being silently skipped. That constraint on the task_ids array is not visible in the 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?
Names a specific verb and resource ("Pause one or more download tasks") and makes the batch scope explicit via "one or more." It is distinct from sibling resume_download by plain naming, but the description never explicitly contrasts the two, which keeps it just short of 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?
Rather than generic 'when to use' prose, it enumerates the exact states in which the call succeeds, partially succeeds, or fails outright, which tells an agent precisely when invocation is appropriate. It lacks an explicit pointer to resume_download as the inverse operation, so it stops at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photo_albumADestructive
Create or change a Synology Photos album: create one (normal, or smart: filled automatically from a condition), rename it, add or remove items, set its cover, copy it, or replace a smart album's condition. The photos themselves never move. Personal space albums only. To delete albums use delete_photo_albums; to share one, photo_share_link.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Personal space item IDs from list_photos, at most 1,000; exactly one for `set_cover`. | |
| name | No | Album name for `create`, `create_smart`, `rename` and `copy`. | |
| album | No | The album to change; not for creates. Album ID (list_photo_collections type=album) or unique name. | |
| action | Yes | `create` (`name`, optional `ids`), `create_smart` (`name`, `condition`), `rename` (`name`), `add` / `remove` (`ids`; normal albums), `set_cover` (one id in `ids`), `copy` (a normal album, into a new one named `name`) or `set_condition` (replaces a smart album's). | |
| condition | No | At least one of `folders` (IDs or paths), `people` (IDs or names), `tags` (names), `places` (place IDs), `start_date` / `end_date` (`YYYY-MM-DD`), `type` (`all`, `photo`, `video`), `ratings` (list of 0-5), `keywords`; `people_match`, `tags_match`, `keywords_match`: `any` (default) or `all`. Example: `{"tags": ["beach"], "start_date": "2024-01-01"}`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true; the description adds the crucial nuance that item removal affects only album membership, not the underlying photos, and that set_condition *replaces* an existing smart album condition. It does not say whether operations are reversible or what error/permission conditions apply, but the mutation footprint is substantially clarified beyond the annotation.
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?
The operation list comes first, followed by the scope constraint, then sibling routing โ front-loaded with zero filler. Every clause carries information an agent would otherwise have to infer.
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?
Covers scope, per-action semantics, the nested condition object's role, and sibling boundaries for a 5-parameter mutation tool with no output schema. The remaining gap is what an invocation returns (e.g., the new album's ID for create/copy), which matters because there is no output schema to fall back on.
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 100%, so the action-to-parameter mapping the description implies is already spelled out per-property in the schema. The description adds no syntax, format, or constraint detail absent from the schema (the 1,000-item cap, set_cover's single id, and condition fields all live in schema descriptions). Baseline 3 is appropriate.
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?
Names a specific resource (Synology Photos album) and enumerates the concrete operations it performs: create, create_smart, rename, add/remove items, set cover, copy, set_condition. It also disambiguates from siblings by naming delete_photo_albums and photo_share_link as the tools for deletion and sharing, so an agent can pick the right tool without opening any schema.
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?
Explicitly routes two adjacent jobs elsewhere ('To delete albums use delete_photo_albums; to share one, photo_share_link') and states a hard scope boundary ('Personal space albums only'). The 'photos themselves never move' line also tells the agent this is not a substitute for move_photos, which is the most likely confusion given the add/remove vocabulary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photo_folderPhotos: FolderADestructiveIdempotent
Create or rename a folder in Synology Photos, or set its cover photo. A name the parent folder already has is refused. To copy or move folders use copy_photos / move_photos; to delete, delete_photo_folders. For folders outside Photos, use File Station's create_folder and rename when File Station write is enabled, or ask the user to do it in DSM.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | One folder name, without `/`. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| action | Yes | `create` (`name` inside `parent`), `rename` (`folder` to `name`) or `set_cover` (`folder`, `item_id`). | |
| folder | No | For `rename` and `set_cover`; not the space root. Folder ID (list_photo_collections type=folder) or path, such as `/Trips/2024`. | |
| parent | No | `create`: the parent folder's ID or path (default `/`, the space root). | / |
| item_id | No | `set_cover`: an item ID from list_photos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds a real behavioral rule: a name already present in the parent is refused rather than overwriting. It also discloses the File Station-write prerequisite for the fallback path. It stops short of explaining why this mutating-but-non-deleting tool is flagged destructive, which would have closed the loop.
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 sentences, front-loaded with the core operation, then the collision rule, then sibling routing. No sentence is redundant and nothing is buried.
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 6-parameter tool with no output schema, the description covers scope, failure behavior, prerequisites, and all sibling alternatives, while annotations carry the safety profile and the schema carries parameter semantics. Nothing an agent needs to select or invoke this correctly is missing.
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 100% and every parameter โ name, space, action, folder, parent, item_id โ is documented inline, including per-action applicability. The description adds little beyond that, only hinting at the name-collision constraint. Baseline 3 is appropriate when the schema carries parameter meaning.
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 specific verbs (create, rename, set cover) against a specific resource (folder in Synology Photos) and immediately scopes itself away from siblings like copy_photos, move_photos, and delete_photo_folders. An agent knows exactly what this tool does and does not cover 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use copy_photos/move_photos for copying or moving, delete_photo_folders for deletion, and File Station's create_folder/rename for non-Photos folders, with the caveat that File Station write must be enabled or the user must act in DSM. That is when-to-use plus when-not-to-use plus alternatives in two sentences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photo_requestADestructive
Manage Synology Photos photo requests: links that let anyone with the link upload files into one of your Photos folders. action: create (returns the link), list (every request with its passphrase and link), update, or delete (its link stops working).
| Name | Required | Description | Default |
|---|---|---|---|
| space | No | Library of `folder`: `personal` (default) or `shared`. | personal |
| action | Yes | `create` (`subject`, `folder`), `list`, `update` (the fields given) or `delete`. | |
| folder | No | The existing folder uploads go into, as a path in `space` such as `/Inbox`; required for `create`. | |
| expires | No | Link expiry: `YYYY-MM-DD` (end of that day, UTC), a date-time with offset (`2026-12-31T18:00-05:00`) or `never` (create's default). | |
| request | No | `update`, `delete`: the request's passphrase from action=list. | |
| subject | No | The subject; required for `create`. | |
| description | No | An optional note. | |
| max_file_mib | No | Largest file accepted, in MiB; `0` (create's default): no limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable operational context by defining the side effects of the actions (e.g., create returns the link, delete breaks it). While annotations cover the safety profile, this text clarifies the practical consequences of using the tool.
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?
The description is highly efficient. It is a single, well-structured paragraph that clearly explains the scope and all possible functional states of the resource.
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?
Given the high-quality input schema and clear behavioral hints, the description provides all necessary high-level context for an AI agent to select and correctly invoke the tool for CRUD operations.
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?
The schema coverage is 100%, so the structure of the parameters is fully documented. The description mainly summarizes the functionality rather than adding meaning to specific parameters like 'folder' or 'expires'.
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 immediately identifies the resource ('Synology Photos photo requests') and defines the management capabilities ('Manage... photo requests'), clearly distinguishing it from generic file upload/download tools.
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 provides explicit usage guidance by defining the outcomes of the `action` parameter: 'create' returns a link, 'delete' makes it stop working. This helps the agent select the right operational mode based on its goal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photo_taskADestructive
Follow up on a Synology Photos copy, move or delete that is still running. With a handle (photos:): action=status shows progress; action=stop stops it (it may then be partly done). Without a handle: lists this user's copy, move and delete tasks. action=clear removes finished tasks from that list. Don't poll in a loop: check when the user asks, or before doing something that depends on the result.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | `status` (default; progress, or the task list), `stop` (needs `handle`; what's done stays done) or `clear` (removes every finished task from the list). | status |
| handle | No | The handle a reply gave, such as `photos:14`; omit to list the tasks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true and readOnlyHint=false globally, but the description differentiates the actions themselves: status is a read, stop may leave the task 'partly done', clear removes only finished tasks. That partial-completion caveat is the key behavioral fact an agent needs and it is not in the annotations. Missing only permission/auth notes and what a handle looks like when stale.
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 compact sentences, front-loaded with the primary use case and with the anti-polling warning placed last as a guardrail. There is mild duplication of the schema's action enumeration, which is the only waste.
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?
No output schema, yet the description says what status yields (progress for a handle, otherwise this user's task list), which covers the return-value gap adequately for a 2-parameter tool. It stops short of describing task fields or how finished vs running tasks are distinguished in the list.
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 100%, and the schema already documents `action` (with its default and per-value meaning) and `handle` (including the `photos:14` example). The description largely restates that, adding only the 'handle a reply gave' provenance cue and the 'stop needs a handle' dependency.
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?
Names the precise resource (a running Synology Photos copy/move/delete task) and the three operations keyed off the presence of a handle. An agent can distinguish it from copy_photos, move_photos, delete_photos and file_task without opening a schema.
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?
Explicitly splits behavior on the `handle` parameter (with handle -> status/stop on that task; without -> list this user's tasks) and explicitly states when NOT to poll: 'check when the user asks, or before doing something that depends on the result.' That is a real usage constraint, not an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renameA
Rename a file or folder in place. If the new name is already taken in that folder, DSM refuses and nothing is replaced. To move something to another folder, use move_files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The file or folder to rename (`/video/TV Shows/Severence`). | |
| new_name | Yes | The new name only, not a path (`Severance`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive, non-read-only mutation, and the description adds the important failure semantics: a name collision is refused and nothing is replaced. It stops short of saying what the response looks like or whether the operation is atomic, but the key risk behavior is disclosed.
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, each doing work: what it does, what happens on conflict, and where to go instead. Front-loaded and free of 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?
For a two-parameter mutation with full schema coverage, this covers purpose, conflict behavior, and the sibling alternative. Minor gaps remain (return value, whether folders recurse or any permission prerequisites), but nothing needed to call it correctly is missing.
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 100% and both parameters have examples showing full path vs. bare name. The description's 'new name ... in that folder' reinforces the scoping but adds little beyond the schema itself, so the baseline 3 applies.
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 ('Rename a file or folder') and adds the scope qualifier 'in place', which cleanly separates it from move_files. An agent can pick between the two without opening either schema.
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?
Explicitly names the alternative ('use move_files') and the condition that selects it (moving to another folder). It also states the use case this tool does cover, so both branches of the decision are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_from_recycle_binADestructive
Restore deleted files or folders from one shared folder's recycle bin. Check what's there first with list_recycle_bin: every path must be in that share's bin, or nothing is restored. Without dest_folder, each item goes back to its original folder, which is re-created if it's gone. An item already at the destination is skipped and stays in the bin, unless overwrite=true, which replaces the existing one. A long restore keeps running on the NAS and returns a handle for file_task.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Items to restore, as paths in the bin the way list_recycle_bin shows them (`Shows/Ep1.mkv`); full paths such as `/video/#recycle/Shows/Ep1.mkv` work too. | |
| share | Yes | The shared folder whose bin holds the items, as a name (`video`) or path (`/video`). | |
| overwrite | No | Replace an item already at the destination (default false: it's skipped and stays in the bin). | |
| dest_folder | No | An existing folder to restore everything into, flat (default: each item's original folder). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only and destructive=true; the description goes well beyond them by disclosing atomic all-or-nothing semantics, folder re-creation, skip-vs-overwrite behavior, and that long restores continue server-side returning a handle for file_task. This is exactly the operational context an agent needs before a destructive call.
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 action and scope, then the precondition, then the parameter behaviors in a logical order. Dense but nearly every clause carries new information; a couple of clauses duplicate schema-documented defaults.
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 destructive 4-parameter mutation with no output schema, the description covers preconditions, partial-failure semantics, destination behavior, and the async continuation path (file_task). Nothing an agent needs to invoke it safely is missing.
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 100%, so the baseline is 3; the description still adds value with the 'flat' behavior of dest_folder and the re-creation of the original folder when dest_folder is omitted, plus how overwrite interacts with the skip rule. Some of the restatement of overwrite semantics overlaps the schema, keeping it off 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?
Opens with a specific verb+resource+scope: 'Restore deleted files or folders from one shared folder's recycle bin.' It immediately distinguishes itself from the obvious sibling list_recycle_bin by naming it as the read-only precursor.
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?
Explicitly tells the agent to call list_recycle_bin first and states the hard precondition ('every path must be in that share's bin, or nothing is restored'), which is effectively a when-not-to-use condition. The alternative sibling is named with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_downloadA
Resume one or more paused download tasks. An active or finished task is refused for that id (error 405), while the others are resumed. list_downloads with status_filter=paused finds the paused tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | IDs of the paused tasks to resume, from list_downloads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the real behavioral load and does so: it discloses non-atomic batch semantics โ an invalid id fails with error 405 while the remaining ids are still resumed. It doesn't say what the response looks like (counts, per-id results), which is the main remaining gap.
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. The operation and its failure mode are front-loaded, and the discovery hint trails 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?
For a one-parameter mutation with no output schema, the definition covers purpose, precondition, source of IDs, and partial-failure behavior. Only the shape of the return value on partial success is left implicit.
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 100%, so the baseline is 3, but the description adds value beyond the schema: it clarifies that task_ids is a batch (partial success per id) and where the IDs come from. That is meaningful semantics the schema item description only hints at.
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 (resume) and resource (paused download tasks) with explicit scope: 'one or more paused download tasks.' It is clearly distinguishable from the nearby pause_download and delete_download siblings without opening any schema.
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?
Gives a concrete discovery path โ 'list_downloads with status_filter=`paused` finds the paused tasks' โ and states the precondition (task must be paused, otherwise 405). It does not name the inverse tool (pause_download) explicitly, but the when-to-use context is essentially complete.
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 a folder and everything below it for files and folders by name, extension, size or modified date. For what's in one known folder, use list_files; for how much space a folder uses, use get_dir_size, not a search. With no filter, it returns everything under the folder, up to limit. A search that runs out of time returns what it found so far and says so.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most results to return; the reply says when there are more. | |
| pattern | No | Name to look for: a bare word matches anywhere in the name (`Severance` finds `Severance.S02E10.mkv`); with `*` or `?` it's a wildcard pattern. `*.mkv` is treated as `extension="mkv"`. | |
| size_to | No | Largest size to match, in the same format as `size_from`. | |
| filetype | No | `all` (default: files and folders), `file` or `dir`. | all |
| mtime_to | No | Modified before this time (a file modified at exactly this time doesn't match), in the same formats as `mtime_from`. | |
| extension | No | File extension, without the dot (`mkv`). | |
| recursive | No | Search subfolders too (default true); `false` searches only `folder_path` itself. | |
| size_from | No | Smallest size to match, in bytes or with a unit (`500MiB`, `2GiB`). | |
| mtime_from | No | Modified at or after this time: ISO 8601 (`2026-04-01T12:00:00+00:00`), a date (`2026-04-01`) or Unix epoch seconds; a time with no zone is UTC. | |
| folder_path | Yes | The folder to search (`/video`). | |
| exclude_pattern | No | Wildcard pattern for names to leave out (`*.torrent`), case-insensitive. Applied to the results DSM returns, so a reply can hold fewer than `limit`. |
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 genuinely new behavior: no-filter returns everything up to `limit`, and a timed-out search returns partial results with a notice. It doesn't cover result ordering or how truncation is signalled beyond 'says so', but that is a minor gap against solid annotation coverage.
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 capability, then immediately routes to alternatives, then covers edge cases. Every sentence carries distinct information: scope, exclusions, default behavior, timeout semantics. No 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?
For an 11-parameter read tool with full schema coverage and no output schema, the description covers the essential unknowns: unfiltered behavior, the result cap, and partial results on timeout. Return-value shape is left unspecified, which is acceptable since the schema carries no output contract, but a note on result ordering would round it out.
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 100%, so all 11 parameters are already documented in the schema, including wildcard, size units, and date formats. The description only re-states the `limit` cap ('up to `limit`') and adds nothing about parameter syntax beyond the schema, which is appropriate at the 100%-coverage baseline.
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) with clear scope (a folder and everything below it) and enumerates the filterable facets: name, extension, size, modified date. It explicitly names the two siblings it is not (list_files, get_dir_size), so an agent can distinguish it without opening any schema.
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?
Gives explicit when-not rules: 'For what's in one known folder, use list_files; for how much space a folder uses, use get_dir_size, not a search.' It also documents the no-filter case ('returns everything under the folder, up to limit'), so an agent knows what an unqualified call does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_download_configADestructiveIdempotent
Set Download Station global configuration. All parameters are optional: only the fields you pass are updated. The rate fields require a Download Station manager/admin account: DSM silently ignores them from other accounts, so the tool refuses them. Any user can set default_destination: DSM applies it per user, and DS won't start a non-manager's tasks until it is set.
| Name | Required | Description | Default |
|---|---|---|---|
| bt_max_upload | No | NAS-wide BitTorrent upload limit in KB/s; `0` means unlimited. Manager/admin accounts only. | |
| bt_max_download | No | NAS-wide BitTorrent download limit in KB/s; `0` means unlimited. Manager/admin accounts only. | |
| emule_max_upload | No | NAS-wide eMule upload limit in KB/s; `0` means unlimited. Manager/admin accounts only. | |
| emule_max_download | No | NAS-wide eMule download limit in KB/s; `0` means unlimited. Manager/admin accounts only. | |
| default_destination | No | Folder new tasks go to when create_download gets no destination, share-relative (`video/Torrents`). A non-manager sets only their own. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: partial-update semantics, admin-only rate fields, DSM silently ignoring them otherwise, the tool refusing them, and the per-user nature of default_destination. This is exactly the context an agent needs to avoid a false success.
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 tight sentences, front-loaded with what the tool does and then the permission caveats. No filler; each sentence carries actionable information.
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?
No output schema exists, but the description covers the critical success/failure semantics for a destructive, idempotent setter: optionality, partial updates, admin-only fields, and per-user defaults. Nothing essential is missing for correct invocation.
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 100%, and each parameter already documents meaning and permissions. The description reinforces the permission model and partial-update behavior, but adds little parameter-level detail beyond the 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: 'Set Download Station global configuration.' It is immediately distinguishable from read-only siblings like get_download_config, but it does not explicitly name alternatives or sibling boundaries.
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?
Explains that all parameters are optional and only passed fields update, and gives clear permission-based usage rules for rate fields vs. default_destination. It stops short of naming get_download_config or other alternatives explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_scheduleADestructiveIdempotent
Set the Download Station schedule; get_schedule shows the current one. All parameters are optional: only what you pass is updated. enabled / emule_enabled toggle whether the schedule applies (DSM lets any Download Station user toggle this NAS-wide flag). schedule_plan is in the NAS's local hours, and download_rate / upload_rate are the limited speed. The plan and rates need a Download Station manager/admin account; if that write is refused, nothing is applied.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | No | Turn the schedule on or off, for the whole NAS. | |
| upload_rate | No | Upload speed in KB/s for hours marked `2`; `0` means unlimited. | |
| download_rate | No | Download speed in KB/s for hours marked `2`; `0` means unlimited. | |
| emule_enabled | No | Turn the eMule schedule on or off, for the whole NAS. | |
| schedule_plan | No | 168 characters, one per hour from Sunday 00:00 to Saturday 23:00 in NAS local time: `0` no download, `1` full speed, `2` limited speed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: partial-update semantics, NAS-wide scope of the enable flags, local-time interpretation of schedule_plan, and the admin/manager requirement for plan and rate writes. It also discloses that a refused write applies nothing, which is important for a destructive/idempotent mutation.
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-loads the action and sibling distinction, then packs the remaining sentences with scope, partial-update behavior, time semantics, and permission constraints. There is no filler or redundancy.
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 five-parameter mutation tool with full schema coverage and annotations covering safety traits, the description supplies the remaining operational context: partial update behavior, NAS-wide effects, local-time format implications, and permission failure behavior. Nothing essential is missing.
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 already 100%, so parameter definitions carry the baseline. The description still adds useful meaning by tying enabled and emule_enabled to a NAS-wide scope, explaining that plan/rates require elevated permissions, and reinforcing that unspecified parameters are left unchanged.
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 ("Set the Download Station schedule") and immediately distinguishes the read-only sibling by naming get_schedule. An agent can tell exactly what this tool changes versus what the companion tool retrieves.
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?
Explicitly says get_schedule shows the current schedule and clarifies that all parameters are optional so only passed fields are updated. That gives clear usage context, though it does not spell out when-not-to-use scenarios beyond the read/write split with get_schedule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_photosADestructive
Add or remove tags on Synology Photos items. Photos writes tags into the original files and re-indexes them, so file dates and sizes change. A tag disappears once no item has it, so to delete a tag remove it from every item that has it (list_photos tag=...); to rename, add the new name to those items, then remove the old one.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Item IDs from list_photos, at most 1,000 per call. | |
| tags | Yes | Tag names, any case, such as `["beach", "2024"]`. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| action | Yes | `add` (creates tags that don't exist) or `remove`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that tags are written into original files, that file dates and sizes change, and that items get re-indexed โ material side effects an agent must know before calling. It also explains the tag lifecycle (a tag vanishes when unused), which is not inferable from destructiveHint alone.
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 sentences, front-loaded with the core action, then the side-effect warning, then the lifecycle/workflow note. No filler; every sentence carries distinct information.
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 mutation tool with no output schema, it covers side effects, batch limit context, and tag semantics thoroughly. It stops short of saying what a successful call returns (e.g., resulting tag set or status), which would close the last gap.
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 100%, so ids, tags, space, and action are already documented with formats and defaults. The description adds only the incidental hint of list_photos tag= filtering for sourcing ids, so the baseline 3 applies.
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 pair (add/remove) on a specific resource (tags on Synology Photos items), which cleanly separates it from siblings like edit_photo or rename. An agent can identify its role 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete workflow guidance: to delete a tag, remove it from every item (routing to list_photos tag=...), and to rename, add the new name then remove the old. It lacks an explicit 'when not to use' or contrast with edit_photo, but the operational routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileADestructive
Upload one file from this machine (where this server runs) to a NAS folder; a local folder can't be uploaded. An existing NAS file of the same name is not replaced unless overwrite is true.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | Name for the file on the NAS (default: the local file's name). | |
| overwrite | No | Replace a NAS file of the same name (default false: the call fails and the NAS file is kept). | |
| local_path | Yes | The file on this machine, inside one of the allowed local folders (/root/Downloads), or below it. | |
| dest_folder | No | NAS folder to upload into (`/video/Uploads`). Optional when a default upload folder is configured. | |
| create_parents | No | Create `dest_folder` and any missing folders above it (default true); with `false`, `dest_folder` must already exist. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations mark this as non-read-only and potentially destructive, and the description usefully clarifies the key destructive behavior: an existing NAS file of the same name is kept unless overwrite is true. This adds important safety context beyond the annotations. It does not discuss permissions or return behavior, but the overwrite semantics are well covered.
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?
The description is short, front-loaded with the core action, and contains no filler. The semicolon cleanly introduces the two most important constraints: single-file scope and default non-overwrite behavior.
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?
Given the 100% schema coverage and annotations, the description is nearly complete for an upload tool: it explains the source/destination relationship, single-file limitation, and overwrite safety default. It could be slightly stronger by mentioning that dest_folder creation is controlled by create_parents or by naming an alternative for folder uploads, but those gaps are minor.
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 100%, so the schema already documents all five parameters, including overwrite, dest_folder, and create_parents. The description adds the single-file constraint and reinforces the overwrite default, but it does not add substantial meaning beyond the schema for most parameters.
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 and resource: upload one file from the local machine to a NAS folder. It also clarifies the scope by saying a local folder cannot be uploaded, which helps distinguish it from folder-oriented operations. It is clear but does not explicitly differentiate against sibling upload/download/file-management tools.
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 description gives useful context that this tool uploads a single file and cannot upload a local folder, and it explains the default overwrite behavior. However, it does not say when to use this vs siblings such as copy_files, move_files, or download_file, nor does it name an alternative tool for folder uploads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_photosPhotos: UploadA
Upload photos or videos from this machine into a Synology Photos folder, optionally adding them to an existing album. Only reads files inside the allowed local folders. Starts no new file after the configured task timeout (30 s by default, at most 45 s) and lists the files not tried, to pass to another call. Photos indexes new items over the next seconds to minutes; until then their taken dates and previews may be missing.
| Name | Required | Description | Default |
|---|---|---|---|
| album | No | An existing album to add them to (personal space; create one with photo_album). Album ID (list_photo_collections type=album) or unique name. | |
| space | No | `personal` (default) or `shared` (Shared Space). IDs belong to one space. | personal |
| folder | No | The existing folder's ID or path (default `/`, the space root). | / |
| local_paths | Yes | 1-50 local files inside one of the allowed local folders (/root/Downloads), or below it. | |
| on_duplicate | No | A file with that name already there: `rename` (default) keeps both, `skip` leaves the existing one and skips that file. | rename |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say write, non-destructive; the description goes well beyond that with a 30s default / 45s max timeout, partial-batch semantics with the untried files list, the local read restriction, and the indexing lag that can hide taken dates and previews. These are exactly the operational facts an agent cannot get from structured fields.
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 sentences, purpose first, then access constraint, then timeout/partial-result behavior, then indexing consequence. No filler and each sentence carries a distinct operational fact.
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 mutation tool with no output schema and thin annotations, it covers the safety-relevant behavior (local-only reads, timeouts, partial batches) well. The main gap is the response shape, e.g. whether it returns a task identifier or per-file statuses, which the agent must discover at runtime.
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 100%, so the schema already explains album, space, folder, local_paths and on_duplicate. The description restates the album-optional relationship and the allowed-folder constraint on local_paths but adds no syntax or format detail beyond the schema, so the baseline applies.
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?
It names a specific verb (upload) plus resource (photos/videos), destination (Synology Photos folder) and the optional album attachment. 'From this machine' implicitly separates it from server-side siblings like copy_photos or move_photos, though no sibling is named explicitly.
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 gives real operating context: files must live inside allowed local folders, album attachment is optional, and results are truncated by a task timeout with untried files returned for a follow-up call. It never explicitly contrasts with upload_file or copy_photos, so the alternative-selection guidance is inferred rather than stated.
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 tool update
v0.10.0- Changed
download_photos1 field changed- changed
Input schema / properties / size / descriptionPrevious value: -"`original` (default), or a JPEG preview saved as `<name>_<size>.jpg`: `xl` (~1280 px), `m` (~320 px) or `sm` (~240 px)."New value: +"`original` (default), or a JPEG preview saved as `<name>_<size>.jpg`: `xl`, `m` or `sm`: 1280, 320 or 240 px on the short side, never larger than the original."
19 tool updates
v0.9.2- Added
copy_photos - Added
delete_photo_albums - Added
delete_photo_folders - Added
delete_photos - Added
download_photos - Added
edit_person - Added
edit_photo - Added
get_photo - Added
list_photo_collections - Added
list_photos - Added
merge_people - Added
move_photos - Added
photo_album - Added
photo_folder - Added
photo_request - Added
photo_share_link - Added
photo_task - Added
tag_photos - Added
upload_photos
29 tool updates
v0.9.1- Changed
copy_files4 fields changed- added
Input schema / properties / dest_folder / descriptionAdded value: +"The existing folder to copy into (`/video/Archive`)." - added
Input schema / properties / overwrite / descriptionAdded value: +"Replace items already at the destination (default false: they're skipped and listed)." - added
Input schema / properties / paths / descriptionAdded value: +"Files or folders to copy (`/video/Downloads/clip.mkv`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_copy_filesOutput", - "type": "object" -}New value: +null
- Changed
create_download6 fields changed- added
Input schema / properties / destination / descriptionAdded value: +"Existing folder to download into, share-relative (`video/Torrents`). Omit it to use your default destination." - added
Input schema / properties / password / descriptionAdded value: +"Password for a protected `uri`; not for torrent files." - added
Input schema / properties / torrent_file_path / descriptionAdded value: +"Path on this machine to a `.torrent` or `.nzb` file, inside one of the allowed local folders (/root/Downloads), or below it. Pass this or `uri`, not both." - added
Input schema / properties / uri / descriptionAdded value: +"One or more source URIs, comma-separated: HTTP, HTTPS, FTP, magnet and others. Pass this or `torrent_file_path`, not both." - added
Input schema / properties / username / descriptionAdded value: +"User name for a protected `uri`; not for torrent files." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_create_downloadOutput", - "type": "object" -}New value: +null
- Changed
create_folder3 fields changed- added
Input schema / properties / force_parent / descriptionAdded value: +"Create missing parent folders too (default true); with `false`, each parent must already exist." - added
Input schema / properties / paths / descriptionAdded value: +"Full paths of the folders to create (`[\"/video/TV Shows/New Show\"]`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_create_folderOutput", - "type": "object" -}New value: +null
- Changed
delete_download3 fields changed- added
Input schema / properties / force_complete / descriptionAdded value: +"Ask DSM to keep an unfinished task's partial file instead of discarding it (DSM may discard it anyway). Leave false (default) for finished tasks: DSM refuses them with it." - added
Input schema / properties / task_ids / descriptionAdded value: +"IDs of the tasks to remove, from list_downloads." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_delete_downloadOutput", - "type": "object" -}New value: +null
- Changed
delete_files3 fields changed- added
Input schema / properties / paths / descriptionAdded value: +"Exact paths of the files or folders to delete (`/video/Downloads/old.mkv`); wildcards aren't expanded." - added
Input schema / properties / recursive / descriptionAdded value: +"Delete a folder with everything in it (default true); with `false`, a folder that isn't empty is refused and kept." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_delete_filesOutput", - "type": "object" -}New value: +null
- Changed
download_file5 fields changed- added
Input schema / properties / dest_folder / descriptionAdded value: +"Local folder to save into: one of the allowed local folders (/root/Downloads), or a folder below it. Optional when a default download folder is configured." - added
Input schema / properties / filename / descriptionAdded value: +"Name to save as, a plain file name with no folders (default: the NAS name, or `<folder>.zip` for a folder)." - added
Input schema / properties / overwrite / descriptionAdded value: +"Replace a local file of the same name (default false: the call fails and the local file is kept)." - added
Input schema / properties / path / descriptionAdded value: +"The NAS file or folder (`/video/Movies/Dune.mkv`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_download_fileOutput", - "type": "object" -}New value: +null
- Changed
edit_download3 fields changed- added
Input schema / properties / destination / descriptionAdded value: +"New destination folder, share-relative (`video/Torrents`); it must already exist. The only editable field, so a call needs it." - added
Input schema / properties / task_ids / descriptionAdded value: +"IDs of the tasks to change, from list_downloads." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_edit_downloadOutput", - "type": "object" -}New value: +null
- Changed
file_task1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_file_taskOutput", - "type": "object" -}New value: +null
- Changed
get_dir_size2 fields changed- added
Input schema / properties / path / descriptionAdded value: +"The folder to measure (`/video/TV Shows`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_dir_sizeOutput", - "type": "object" -}New value: +null
- Changed
get_download_config1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_download_configOutput", - "type": "object" -}New value: +null
- Changed
get_download_info2 fields changed- added
Input schema / properties / task_id / descriptionAdded value: +"One task ID (`dbid_โฆ`), from list_downloads." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_download_infoOutput", - "type": "object" -}New value: +null
- Changed
get_download_stats1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_download_statsOutput", - "type": "object" -}New value: +null
- Changed
get_file_info3 fields changed- added
Input schema / properties / additional / descriptionAdded value: +"Fields to fetch: `real_path`, `size`, `owner`, `time`, `perm`, `type` (DSM's extension type) and `mount_point_type` (shown only for a mount point). Default: the first five. Unknown values are rejected." - added
Input schema / properties / paths / descriptionAdded value: +"One or more full paths (`/video/Movies/Dune.mkv`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_file_infoOutput", - "type": "object" -}New value: +null
- Changed
get_resource_usage1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_resource_usageOutput", - "type": "object" -}New value: +null
- Changed
get_schedule1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_scheduleOutput", - "type": "object" -}New value: +null
- Changed
get_system_info1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_get_system_infoOutput", - "type": "object" -}New value: +null
- Changed
list_downloads5 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Most tasks to return, 1 or more." - added
Input schema / properties / offset / descriptionAdded value: +"Tasks to skip, 0 or more; the footer gives the next offset." - added
Input schema / properties / sort_by / descriptionAdded value: +"`queue` (default: queue order, oldest first), `created` or `completed` (both newest first; never-completed tasks last)." - added
Input schema / properties / status_filter / descriptionAdded value: +"`all` (default), `downloading` (also waiting, finishing, hash checking, waiting for a file host, or extracting), `finished` (also seeding), `paused` or `error`." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_list_downloadsOutput", - "type": "object" -}New value: +null
- Changed
list_files8 fields changed- added
Input schema / properties / filetype / descriptionAdded value: +"`all` (default), `file` or `dir`." - added
Input schema / properties / limit / descriptionAdded value: +"Most items to return; `0` returns them all." - added
Input schema / properties / offset / descriptionAdded value: +"Items to skip; a reply with more says which offset is next." - added
Input schema / properties / path / descriptionAdded value: +"The folder to list (`/video/TV Shows`)." - added
Input schema / properties / pattern / descriptionAdded value: +"Name filter, case-insensitive: a bare word matches anywhere in the name; with `*` or `?` the whole name must match (`*.mkv`); commas separate alternatives (`*.mkv,*.mp4`)." - added
Input schema / properties / sort_by / descriptionAdded value: +"`name` (default), `size`, `mtime` (modified), `crtime` (created), `atime` (accessed), `ctime` (changed), `user` (the owner) or `type`." - added
Input schema / properties / sort_direction / descriptionAdded value: +"`asc` (default) or `desc`." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_list_filesOutput", - "type": "object" -}New value: +null
- Changed
list_recycle_bin7 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Most items to return; `0` returns them all." - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Items to skip; a reply with more says which offset is next.", + "type": "integer" +} - added
Input schema / properties / pattern / descriptionAdded value: +"Name filter, as in list_files (case-insensitive; `*` and `?`; a bare word matches anywhere), applied across the bin, subfolders included (up to 200 folders and 5,000 items; the reply says when it stops early)." - added
Input schema / properties / share / descriptionAdded value: +"The shared folder whose bin to list, as a name (`video`) or path (`/video`)." - added
Input schema / properties / sort_by / descriptionAdded value: +"`mtime` (default: the file's own modified time), `ctime` (closest to when it was deleted), `name`, `size`, `crtime` or `atime`." - added
Input schema / properties / sort_direction / descriptionAdded value: +"`desc` (default) or `asc`." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_list_recycle_binOutput", - "type": "object" -}New value: +null
- Changed
list_shares3 fields changed- added
Input schema / properties / sort_by / descriptionAdded value: +"`name` (default), `user` (the owner), `mtime` (modified) or `crtime` (created)." - added
Input schema / properties / sort_direction / descriptionAdded value: +"`asc` (default) or `desc`." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_list_sharesOutput", - "type": "object" -}New value: +null
- Changed
move_files4 fields changed- added
Input schema / properties / dest_folder / descriptionAdded value: +"The existing folder to move into (`/video/Archive`)." - added
Input schema / properties / overwrite / descriptionAdded value: +"Replace items already at the destination (default false: they're skipped and listed)." - added
Input schema / properties / paths / descriptionAdded value: +"Files or folders to move (`/video/Downloads/clip.mkv`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_move_filesOutput", - "type": "object" -}New value: +null
- Changed
pause_download2 fields changed- added
Input schema / properties / task_ids / descriptionAdded value: +"IDs of the tasks to pause, from list_downloads." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_pause_downloadOutput", - "type": "object" -}New value: +null
- Changed
rename3 fields changed- added
Input schema / properties / new_name / descriptionAdded value: +"The new name only, not a path (`Severance`)." - added
Input schema / properties / path / descriptionAdded value: +"The file or folder to rename (`/video/TV Shows/Severence`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_renameOutput", - "type": "object" -}New value: +null
- Changed
restore_from_recycle_bin5 fields changed- added
Input schema / properties / dest_folder / descriptionAdded value: +"An existing folder to restore everything into, flat (default: each item's original folder)." - added
Input schema / properties / overwrite / descriptionAdded value: +"Replace an item already at the destination (default false: it's skipped and stays in the bin)." - added
Input schema / properties / paths / descriptionAdded value: +"Items to restore, as paths in the bin the way list_recycle_bin shows them (`Shows/Ep1.mkv`); full paths such as `/video/#recycle/Shows/Ep1.mkv` work too." - added
Input schema / properties / share / descriptionAdded value: +"The shared folder whose bin holds the items, as a name (`video`) or path (`/video`)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_restore_from_recycle_binOutput", - "type": "object" -}New value: +null
- Changed
resume_download2 fields changed- added
Input schema / properties / task_ids / descriptionAdded value: +"IDs of the paused tasks to resume, from list_downloads." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_resume_downloadOutput", - "type": "object" -}New value: +null
- Changed
search_files12 fields changed- added
Input schema / properties / exclude_pattern / descriptionAdded value: +"Wildcard pattern for names to leave out (`*.torrent`), case-insensitive. Applied to the results DSM returns, so a reply can hold fewer than `limit`." - added
Input schema / properties / extension / descriptionAdded value: +"File extension, without the dot (`mkv`)." - added
Input schema / properties / filetype / descriptionAdded value: +"`all` (default: files and folders), `file` or `dir`." - added
Input schema / properties / folder_path / descriptionAdded value: +"The folder to search (`/video`)." - added
Input schema / properties / limit / descriptionAdded value: +"Most results to return; the reply says when there are more." - added
Input schema / properties / mtime_from / descriptionAdded value: +"Modified at or after this time: ISO 8601 (`2026-04-01T12:00:00+00:00`), a date (`2026-04-01`) or Unix epoch seconds; a time with no zone is UTC." - added
Input schema / properties / mtime_to / descriptionAdded value: +"Modified before this time (a file modified at exactly this time doesn't match), in the same formats as `mtime_from`." - added
Input schema / properties / pattern / descriptionAdded value: +"Name to look for: a bare word matches anywhere in the name (`Severance` finds `Severance.S02E10.mkv`); with `*` or `?` it's a wildcard pattern. `*.mkv` is treated as `extension=\"mkv\"`." - added
Input schema / properties / recursive / descriptionAdded value: +"Search subfolders too (default true); `false` searches only `folder_path` itself." - added
Input schema / properties / size_from / descriptionAdded value: +"Smallest size to match, in bytes or with a unit (`500MiB`, `2GiB`)." - added
Input schema / properties / size_to / descriptionAdded value: +"Largest size to match, in the same format as `size_from`." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_search_filesOutput", - "type": "object" -}New value: +null
- Changed
set_download_config6 fields changed- added
Input schema / properties / bt_max_download / descriptionAdded value: +"NAS-wide BitTorrent download limit in KB/s; `0` means unlimited. Manager/admin accounts only." - added
Input schema / properties / bt_max_upload / descriptionAdded value: +"NAS-wide BitTorrent upload limit in KB/s; `0` means unlimited. Manager/admin accounts only." - added
Input schema / properties / default_destination / descriptionAdded value: +"Folder new tasks go to when create_download gets no destination, share-relative (`video/Torrents`). A non-manager sets only their own." - added
Input schema / properties / emule_max_download / descriptionAdded value: +"NAS-wide eMule download limit in KB/s; `0` means unlimited. Manager/admin accounts only." - added
Input schema / properties / emule_max_upload / descriptionAdded value: +"NAS-wide eMule upload limit in KB/s; `0` means unlimited. Manager/admin accounts only." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_set_download_configOutput", - "type": "object" -}New value: +null
- Changed
set_schedule6 fields changed- added
Input schema / properties / download_rate / descriptionAdded value: +"Download speed in KB/s for hours marked `2`; `0` means unlimited." - added
Input schema / properties / emule_enabled / descriptionAdded value: +"Turn the eMule schedule on or off, for the whole NAS." - added
Input schema / properties / enabled / descriptionAdded value: +"Turn the schedule on or off, for the whole NAS." - added
Input schema / properties / schedule_plan / descriptionAdded value: +"168 characters, one per hour from Sunday 00:00 to Saturday 23:00 in NAS local time: `0` no download, `1` full speed, `2` limited speed." - added
Input schema / properties / upload_rate / descriptionAdded value: +"Upload speed in KB/s for hours marked `2`; `0` means unlimited." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_set_scheduleOutput", - "type": "object" -}New value: +null
- Changed
upload_file6 fields changed- added
Input schema / properties / create_parents / descriptionAdded value: +"Create `dest_folder` and any missing folders above it (default true); with `false`, `dest_folder` must already exist." - added
Input schema / properties / dest_folder / descriptionAdded value: +"NAS folder to upload into (`/video/Uploads`). Optional when a default upload folder is configured." - added
Input schema / properties / filename / descriptionAdded value: +"Name for the file on the NAS (default: the local file's name)." - added
Input schema / properties / local_path / descriptionAdded value: +"The file on this machine, inside one of the allowed local folders (/root/Downloads), or below it." - added
Input schema / properties / overwrite / descriptionAdded value: +"Replace a NAS file of the same name (default false: the call fails and the NAS file is kept)." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "tool_upload_fileOutput", - "type": "object" -}New value: +null
1 tool update
v0.9.0- Added
file_task
3 tool updates
v0.8.0- Changed
list_files1 field changed- removed
Input schema / properties / additionalRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -}
- Changed
list_shares1 field changed- removed
Input schema / properties / additionalRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -}
- Changed
search_files1 field changed- removed
Input schema / properties / additionalRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -}
21 tool updates
v0.7.1- Added
copy_files - Added
create_download - Added
create_folder - Added
delete_download - Added
delete_files - Added
edit_download - Added
get_download_config - Added
get_download_info - Added
get_download_stats - Added
get_resource_usage - Added
get_schedule - Added
get_system_info - Added
list_downloads - Added
move_files - Added
pause_download - Added
rename - Added
restore_from_recycle_bin - Added
resume_download - Added
set_download_config - Added
set_schedule - Added
upload_file
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 48 tools
Most tools target clearly distinct actions and resources, and the descriptions include useful cross-references (e.g. list_files vs search_files vs get_dir_size; delete_photos vs delete_photo_albums vs delete_photo_folders). However, with 48 tools there is still some overlap an agent must resolve, such as copy_photos vs copy_files, photo_task vs file_task, and get_download_stats vs get_resource_usage vs get_download_info.
The set is overwhelmingly snake_case and uses a predictable verb_noun pattern (get_*, list_*, create_*, delete_*, copy_*, move_*, upload_*, download_*, edit_*, set_*). The main deviations are grouped noun-first tools like photo_album, photo_folder, photo_share_link, file_task and photo_task, plus the bare rename, but these remain readable and mostly consistent with resource grouping.
48 tools is too many for one MCP server and exceeds the practical range where an agent can reliably select among them. The server bundles three large domains (File Station, Download Station, and Synology Photos), each with many similar-sounding operations, which would be better split into separate servers or reduced with more action-parameterized tools.
The surface is extensive and covers core lifecycles well: file CRUD/search/upload/download/recycle bin, download task creation/pause/resume/deletion/config/schedule, and Photos listing/editing/album/folder/people/request operations. Some gaps remain, such as finer Download Station per-file controls, File Station permission/compression operations, and richer photo sharing beyond album links, but agents can work around most of them.
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.322 PyPI238MIT
- 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.3912 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