Skip to main content
Glama
cmeans

mcp-synology

mcp-synology

PyPI version Python versions License Tests Coverage Downloads Glama

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

linux downloads macos downloads windows downloads

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

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

System

system

2 ยท ๐ŸŸก Partial

โ€”

Any; get_resource_usage and some details need an admin

7.1 โ€“ 7.4.1

File Station

filestation

7 ยท ๐ŸŸข Most

8 ยท ๐ŸŸก Partial

Any

7.1 โ€“ 7.4.1

Synology Photos

photos

4 ยท ๐ŸŸข Most

15 ยท ๐ŸŸข Most

Any, with the Photos privilege

7.1 โ€“ 7.4.1 (favorites and concepts: 7.2.2+)

Download Station

downloadstation

5 ยท ๐ŸŸข Most

7 ยท ๐ŸŸก Partial

Any, with the Download Station privilege (non-admins see only their own tasks)

7.1 โ€“ 7.4.1

Storage

storage

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 mcp-synology serve, on its VM

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 setup

Requires 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 instances

Adding a module

  1. 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.

  2. Edit your config file: the one setup wrote (the file your client's --config names), or the per-NAS file such as home-nas.yaml if you use Multi-NAS. Add the module inside the existing modules: section; don't add a second modules: key. Each module below has a block to copy.

  3. 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.

  4. 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 check

Alternative: env-var-only mode

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

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

Or from the CLI:

SYNOLOGY_HOST=192.168.1.100 uvx mcp-synology check

Without 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

SYNOLOGY_HOST

connection.host (needed for env-only mode)

โ€”

SYNOLOGY_PORT

connection.port

5000, or 5001 with HTTPS

SYNOLOGY_HTTPS

connection.https (true, 1 or yes for on; anything else is off)

false

SYNOLOGY_USERNAME

auth.username

the keyring

SYNOLOGY_PASSWORD

auth.password

the keyring

SYNOLOGY_DEVICE_ID

auth.device_id (2FA device token)

the keyring

SYNOLOGY_INSTANCE_ID

instance_id (names the keyring entry and state folder)

derived from the host

SYNOLOGY_LOG_LEVEL

logging.level (debug, info, warning, error)

info

SYNOLOGY_UPDATE_NOTICES

update_notices (all, security, off)

all

Modules

Every module is configured the same way, under modules::

  • enabled: true (the default) or false. Listing a module is enough to load it; enabled: false keeps its block in the file without loading it.

  • permission: read (the default) registers the READ tools only; write adds the WRITE tools. admin is also accepted and is the same as write today. 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 as permision stops the server instead of being ignored.

System

Monitor NAS health and resource usage.

  • READ: get_system_info, get_resource_usage

  • WRITE: none

modules:
  system:
    enabled: true   # no write tools, so no permission is needed

Settings: 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_file

  • WRITE: 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/uploads

Settings:

Setting

Default

Accepted

What it does

hide_recycle_in_listings

false

true, false

Hide #recycle folders from list_files.

file_type_indicator

emoji

emoji, text

Markers for files and folders in listings.

async_timeout

120

10โ€“3600 s

Time limit for search_files and get_dir_size. It doesn't apply to delete, copy, move or restore.

search_timeout

async_timeout

10โ€“3600 s

Time limit for search_files only. The NAS search is stopped when it runs out.

dir_size_timeout

async_timeout

10โ€“3600 s

Time limit for get_dir_size only.

delete_timeout

30

10โ€“3600 s

How long delete_files waits before handing off (capped at 600).

copy_move_timeout

30

10โ€“3600 s

How long copy_files, move_files and restore_from_recycle_bin wait before handing off (capped at 600).

upload_timeout

300

10โ€“3600 s

Time limit for upload_file.

download_timeout

300

10โ€“3600 s

Time limit for download_file.

search_poll_interval

1.0

0.5โ€“10.0 s

How often search_files checks on DSM's search while it runs.

allowed_local_paths

your Downloads folder

local folders

Local folders upload_file and download_file may use, including subfolders. See Local path confinement.

default_download_dir

none

a local folder

Where download_file saves when no dest_folder is given. It's always allowed.

default_upload_dir

none

a NAS folder

Where upload_file uploads when no dest_folder is given.

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 with file_task: check its progress or final result, or stop it. file_task with 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_TIMEOUT environment variable (milliseconds; 0 turns the check off), or for this server only with a timeout field (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_size and search_files don'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_file of a folder saves DSM's ZIP of it as <folder>.zip (or under filename, 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_files refuses 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_files also 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_photos

  • WRITE: 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
      #   - ~/Downloads

Settings:

Setting

Default

Accepted

What it does

task_timeout

30

1โ€“600 s

How long copy_photos, move_photos, delete_photos and delete_photo_folders wait before handing off with a photos:<id> handle for photo_task. Also when upload_photos stops starting new files (at most 45 s, below Claude Desktop's tool-call timeout of about 60 s; it lists the ones not tried, for another call).

allowed_local_paths

your Downloads folder

local folders

Local folders upload_photos reads from and download_photos writes to. See Local path confinement.

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 that photo_task follows 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_schedule

  • WRITE: 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
        - ~/Torrents

Settings:

Setting

Default

Accepted

What it does

allowed_local_paths

your Downloads folder

local folders

Local folders create_download's torrent_file_path may read .torrent and .nzb files from. Magnet links and URLs aren't affected. See Local path confinement.

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_download with an explicit destination still creates the task but warns that it won't start. Without a destination, it refuses and says what to set. That refusal applies to any account, admin included, whenever there's no default destination to fall back on.

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

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

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

Known limits:

  • A destination must be an existing folder: Download Station doesn't create missing folders. Create it first with File Station's create_folder (/video/TV/New show; the filestation module needs permission: 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_download returns no task IDs for URLs that use username / password.

  • edit_download changes 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_snapshots

  • WRITE: none yet (phase 2)

modules:
  storage:
    enabled: true   # no write tools yet, so no permission is needed

Settings: 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 except create_folder, rename, upload_photos, create_download, pause_download and resume_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 it

  • Long 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_photos and delete_photo_folders also hand off, after task_timeout (default 30 s, up to 600), with a photos:<id> handle for photo_task

  • Local path confinement โ€” upload_file, download_file, upload_photos, download_photos and create_download's torrent files only use local folders listed in allowed_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 ~/Downloads if you still want it. create_download only reads .torrent and .nzb files. 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 config

  • config-power-user.yaml โ€” every module, HTTPS, custom timeouts, logging, instructions

  • config-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: write

Connection 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: HomeNAS

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

Custom Instructions

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

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

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

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

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

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

Full control โ€” instructions_file replaces the built-in prompt entirely. 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.md

Both 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:

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

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

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

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

security 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 version

Troubleshooting

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 commands

Or set it persistently in your config file:

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

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

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 changes

Contributing

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

Acknowledgements

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

Unlike vibe coding, where you describe what you want and let the AI generate code on the fly, spec-first coding treats design as a separate, deliberate phase. The four 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

Apache 2.0


Available Tools

48 tools
copy_filesA
Destructive

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.

NameRequiredDescriptionDefault
pathsYesFiles or folders to copy (`/video/Downloads/clip.mkv`).
overwriteNoReplace items already at the destination (default false: they're skipped and listed).
dest_folderYesThe existing folder to copy into (`/video/Archive`).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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: CopyA
Destructive

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.

NameRequiredDescriptionDefault
idsNoItem IDs from list_photos, in `space`, at most 1,000. Pass `ids`, `folders` or both.
spaceNoSource space: `personal` (default) or `shared` (Shared Space).personal
foldersNoFolder IDs or paths, with everything in them; not the space root. At most 1,000.
dest_spaceNoSpace of `destination`, if not `space`: `personal` or `shared`.
destinationYesThe existing target folder's ID or path, in `dest_space`.
on_conflictNoA file with that name already at the destination: `skip` (default) or `overwrite` (replaces it).skip

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
uriNoOne or more source URIs, comma-separated: HTTP, HTTPS, FTP, magnet and others. Pass this or `torrent_file_path`, not both.
passwordNoPassword for a protected `uri`; not for torrent files.
usernameNoUser name for a protected `uri`; not for torrent files.
destinationNoExisting folder to download into, share-relative (`video/Torrents`). Omit it to use your default destination.
torrent_file_pathNoPath 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

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_folderA
Idempotent

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.

NameRequiredDescriptionDefault
pathsYesFull paths of the folders to create (`["/video/TV Shows/New Show"]`).
force_parentNoCreate missing parent folders too (default true); with `false`, each parent must already exist.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_downloadA
Destructive

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.

NameRequiredDescriptionDefault
task_idsYesIDs of the tasks to remove, from list_downloads.
force_completeNoAsk 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

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_filesA
Destructive

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.

NameRequiredDescriptionDefault
pathsYesExact paths of the files or folders to delete (`/video/Downloads/old.mkv`); wildcards aren't expanded.
recursiveNoDelete a folder with everything in it (default true); with `false`, a folder that isn't empty is refused and kept.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_albumsA
Destructive

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.

NameRequiredDescriptionDefault
albumsYesAlbum IDs (list_photo_collections type=album) or unique names; a name several albums share deletes nothing.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 foldersA
Destructive

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.

NameRequiredDescriptionDefault
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
foldersYesNot the space root; at most 1,000. Folder ID (list_photo_collections type=folder) or path, such as `/Trips/2024`.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 itemsA
Destructive

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.

NameRequiredDescriptionDefault
idsYesItem IDs from list_photos, at most 1,000 per call.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_fileA
Destructive

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.

NameRequiredDescriptionDefault
pathYesThe NAS file or folder (`/video/Movies/Dune.mkv`).
filenameNoName to save as, a plain file name with no folders (default: the NAS name, or `<folder>.zip` for a folder).
overwriteNoReplace a local file of the same name (default false: the call fails and the local file is kept).
dest_folderNoLocal 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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: DownloadA
Destructive

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.

NameRequiredDescriptionDefault
idsYes1-50 item IDs from list_photos.
sizeNo`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
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
overwriteNoReplace a local file with the same name; otherwise that item is skipped.
dest_folderNoAn 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

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_downloadA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
task_idsYesIDs of the tasks to change, from list_downloads.
destinationNoNew destination folder, share-relative (`video/Torrents`); it must already exist. The only editable field, so a call needs it.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_personA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
nameNoThe new name; `""` makes them unnamed.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
actionYes`rename` (`name`), `hide`, `unhide` or `set_cover` (`item_id`).
personYesPerson ID (list_photo_collections type=person) or unique name. Hidden ones need include_hidden=true there.
item_idNoAn item ID from list_photos of a photo showing this person.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_photoA
Destructive

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.

NameRequiredDescriptionDefault
idsYesItem IDs from list_photos, at most 1,000 per call.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
ratingNo0-5; `0` clears the rating.
rotateNo`left` or `right`; a repeat rotates again.
favoriteNo`true` marks favorite, `false` unmarks (Photos 1.9.1+).
taken_timeNoLocal date-time such as `2024-07-04T19:30:00`; an offset is dropped, not converted. Not with `shift_hours`.
descriptionNoNew description; `""` clears it, and one of only spaces shows as `โ€”`, like none.
shift_hoursNoShifts the taken time by hours (`-6`, `1.5`); a repeat shifts again.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_taskA
Destructive

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.

NameRequiredDescriptionDefault
actionNo`status` (default) or `stop`.status
handleNoThe handle from a delete/copy/move/restore reply. Omit it to list running operations.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_sizeA
Read-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).

NameRequiredDescriptionDefault
pathYesThe folder to measure (`/video/TV Shows`).

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ('Calculate the total size of a 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.

Usage Guidelines4/5

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_configA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_infoA
Read-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.

NameRequiredDescriptionDefault
task_idYesOne task ID (`dbid_โ€ฆ`), from list_downloads.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_statsA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_infoA
Read-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.

NameRequiredDescriptionDefault
pathsYesOne or more full paths (`/video/Movies/Dune.mkv`).
additionalNoFields 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

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_photoA
Read-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.

NameRequiredDescriptionDefault
idsYes1-20 item IDs from list_photos.
exifNoAlso show each item's full EXIF table.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_usageA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_scheduleA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_infoA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_downloadsA
Read-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.

NameRequiredDescriptionDefault
limitNoMost tasks to return, 1 or more.
offsetNoTasks to skip, 0 or more; the footer gives the next offset.
sort_byNo`queue` (default: queue order, oldest first), `created` or `completed` (both newest first; never-completed tasks last).queue
status_filterNo`all` (default), `downloading` (also waiting, finishing, hash checking, waiting for a file host, or extracting), `finished` (also seeding), `paused` or `error`.all

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_filesA
Read-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.

NameRequiredDescriptionDefault
pathYesThe folder to list (`/video/TV Shows`).
limitNoMost items to return; `0` returns them all.
offsetNoItems to skip; a reply with more says which offset is next.
patternNoName 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_byNo`name` (default), `size`, `mtime` (modified), `crtime` (created), `atime` (accessed), `ctime` (changed), `user` (the owner) or `type`.name
filetypeNo`all` (default), `file` or `dir`.all
sort_directionNo`asc` (default) or `desc`.asc

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_collectionsA
Read-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.

NameRequiredDescriptionDefault
nameNoOnly names containing this text, any case (folders: the path).
typeYes`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`).
limitNoMost entries to return, 1-1,000.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space. Albums are always personal.personal
offsetNoEntries to skip, for the next page.
parentNo`type=folder`: the folder ID or path to list (default the space root).
include_hiddenNo`person`, `concept`: include hidden ones (and people with few photos).

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_photosA
Read-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.

NameRequiredDescriptionDefault
tagNoOnly items with this tag name.
typeNo`all` (default), `photo` or `video`.all
albumNoOne album only (personal space). Album ID (list_photo_collections type=album) or unique name.
limitNoMost items to return, 1-500.
placeNoOne place only: a place ID from list_photo_collections type=place.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
folderNoOnly items directly in this folder, not subfolders. Folder ID (list_photo_collections type=folder) or path, such as `/Trips/2024`.
offsetNoEntries to skip, for the next page.
personNoOnly items showing this person. Person ID (list_photo_collections type=person) or unique name.
conceptNoOne concept only (a thing or scene Photos recognized): an ID from list_photo_collections type=concept. Photos 1.9.1+.
keywordNoSearch filenames and tag names; works alone, in search order (no sorting).
sort_byNo`taken` (default), `filename`, `size` or `type`.taken
end_dateNoTaken on or before this date, `YYYY-MM-DD`.
favoriteNo`true`: favorites only (Photos 1.9.1+). `false` doesn't filter.
min_ratingNoMinimum rating, 1-5.
start_dateNoTaken on or after this date, `YYYY-MM-DD` (the photo's local time).
sort_directionNo`desc` (default) or `asc`.desc

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_binA
Read-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.

NameRequiredDescriptionDefault
limitNoMost items to return; `0` returns them all.
shareYesThe shared folder whose bin to list, as a name (`video`) or path (`/video`).
offsetNoItems to skip; a reply with more says which offset is next.
patternNoName 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_byNo`mtime` (default: the file's own modified time), `ctime` (closest to when it was deleted), `name`, `size`, `crtime` or `atime`.mtime
sort_directionNo`desc` (default) or `asc`.desc

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

list_sharesA
Read-only

List all shared folders on the NAS: the top-level folders every file path starts with (/video). Call this first to discover paths. Shows each share's volume, that volume's free space (shared by every share on it) and whether its recycle bin is on; for how much space a share uses, call get_dir_size.

NameRequiredDescriptionDefault
sort_byNo`name` (default), `user` (the owner), `mtime` (modified) or `crtime` (created).name
sort_directionNo`asc` (default) or `desc`.asc

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/non-destructive, and the description adds real value beyond them: what each entry contains (volume, recycle-bin flag) and the caveat that free space is per-volume and shared across shares. It stops short of describing pagination or exact return shape, but the behavioral profile is clear.

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

Conciseness4/5

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

Front-loaded with the core definition and the "call this first" directive before the details; three dense sentences that mostly earn their place, though the free-space parenthetical is slightly compressed.

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

Completeness4/5

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

With no output schema, the description usefully summarizes what is returned (volume, free space, recycle-bin status) and flags the shared-free-space nuance. It omits any mention of the sortable fields or the number/shape of entries, which is a minor gap.

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

Parameters3/5

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

Schema coverage is 100%, so sort_by and sort_direction are fully documented in the schema; the description says nothing about sorting. Baseline 3 applies since the schema carries this dimension.

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

Purpose5/5

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

States a specific verb and resource ("List all shared folders on the NAS") and adds a concrete definition ("the top-level folders every file path starts with (`/video`)"), which separates it cleanly from siblings like list_files or get_dir_size.

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

Usage Guidelines5/5

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

Explicitly says "Call this first to discover paths" and routes the size question to get_dir_size, so both when-to-use and the alternative are stated outright.

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

merge_peopleA
Destructive

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.

NameRequiredDescriptionDefault
nameNoThe name after the merge; default the target's.
mergeYesThe people merged into `target`, as IDs or unique names.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
targetYesThe person to keep. Person ID (list_photo_collections type=person) or unique name.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_filesA
Destructive

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.

NameRequiredDescriptionDefault
pathsYesFiles or folders to move (`/video/Downloads/clip.mkv`).
overwriteNoReplace items already at the destination (default false: they're skipped and listed).
dest_folderYesThe existing folder to move into (`/video/Archive`).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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: MoveA
Destructive

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.

NameRequiredDescriptionDefault
idsNoItem IDs from list_photos, in `space`, at most 1,000. Pass `ids`, `folders` or both.
spaceNoSource space: `personal` (default) or `shared` (Shared Space).personal
foldersNoFolder IDs or paths, with everything in them; not the space root. At most 1,000.
dest_spaceNoSpace of `destination`, if not `space`: `personal` or `shared`.
destinationYesThe existing target folder's ID or path, in `dest_space`.
on_conflictNoA file with that name already at the destination: `skip` (default) or `overwrite` (replaces it).skip

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
task_idsYesIDs of the tasks to pause, from list_downloads.

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_albumA
Destructive

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.

NameRequiredDescriptionDefault
idsNoPersonal space item IDs from list_photos, at most 1,000; exactly one for `set_cover`.
nameNoAlbum name for `create`, `create_smart`, `rename` and `copy`.
albumNoThe album to change; not for creates. Album ID (list_photo_collections type=album) or unique name.
actionYes`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).
conditionNoAt 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

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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: FolderA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
nameNoOne folder name, without `/`.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
actionYes`create` (`name` inside `parent`), `rename` (`folder` to `name`) or `set_cover` (`folder`, `item_id`).
folderNoFor `rename` and `set_cover`; not the space root. Folder ID (list_photo_collections type=folder) or path, such as `/Trips/2024`.
parentNo`create`: the parent folder's ID or path (default `/`, the space root)./
item_idNo`set_cover`: an item ID from list_photos.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_requestA
Destructive

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).

NameRequiredDescriptionDefault
spaceNoLibrary of `folder`: `personal` (default) or `shared`.personal
actionYes`create` (`subject`, `folder`), `list`, `update` (the fields given) or `delete`.
folderNoThe existing folder uploads go into, as a path in `space` such as `/Inbox`; required for `create`.
expiresNoLink 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).
requestNo`update`, `delete`: the request's passphrase from action=list.
subjectNoThe subject; required for `create`.
descriptionNoAn optional note.
max_file_mibNoLargest file accepted, in MiB; `0` (create's default): no limit.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_taskA
Destructive

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.

NameRequiredDescriptionDefault
actionNo`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
handleNoThe handle a reply gave, such as `photos:14`; omit to list the tasks.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
pathYesThe file or folder to rename (`/video/TV Shows/Severence`).
new_nameYesThe new name only, not a path (`Severance`).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_binA
Destructive

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.

NameRequiredDescriptionDefault
pathsYesItems 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.
shareYesThe shared folder whose bin holds the items, as a name (`video`) or path (`/video`).
overwriteNoReplace an item already at the destination (default false: it's skipped and stays in the bin).
dest_folderNoAn existing folder to restore everything into, flat (default: each item's original folder).

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
task_idsYesIDs of the paused tasks to resume, from list_downloads.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_filesA
Read-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.

NameRequiredDescriptionDefault
limitNoMost results to return; the reply says when there are more.
patternNoName 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_toNoLargest size to match, in the same format as `size_from`.
filetypeNo`all` (default: files and folders), `file` or `dir`.all
mtime_toNoModified before this time (a file modified at exactly this time doesn't match), in the same formats as `mtime_from`.
extensionNoFile extension, without the dot (`mkv`).
recursiveNoSearch subfolders too (default true); `false` searches only `folder_path` itself.
size_fromNoSmallest size to match, in bytes or with a unit (`500MiB`, `2GiB`).
mtime_fromNoModified 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_pathYesThe folder to search (`/video`).
exclude_patternNoWildcard pattern for names to leave out (`*.torrent`), case-insensitive. Applied to the results DSM returns, so a reply can hold fewer than `limit`.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_configA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
bt_max_uploadNoNAS-wide BitTorrent upload limit in KB/s; `0` means unlimited. Manager/admin accounts only.
bt_max_downloadNoNAS-wide BitTorrent download limit in KB/s; `0` means unlimited. Manager/admin accounts only.
emule_max_uploadNoNAS-wide eMule upload limit in KB/s; `0` means unlimited. Manager/admin accounts only.
emule_max_downloadNoNAS-wide eMule download limit in KB/s; `0` means unlimited. Manager/admin accounts only.
default_destinationNoFolder new tasks go to when create_download gets no destination, share-relative (`video/Torrents`). A non-manager sets only their own.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_scheduleA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
enabledNoTurn the schedule on or off, for the whole NAS.
upload_rateNoUpload speed in KB/s for hours marked `2`; `0` means unlimited.
download_rateNoDownload speed in KB/s for hours marked `2`; `0` means unlimited.
emule_enabledNoTurn the eMule schedule on or off, for the whole NAS.
schedule_planNo168 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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_photosA
Destructive

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.

NameRequiredDescriptionDefault
idsYesItem IDs from list_photos, at most 1,000 per call.
tagsYesTag names, any case, such as `["beach", "2024"]`.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
actionYes`add` (creates tags that don't exist) or `remove`.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_fileA
Destructive

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.

NameRequiredDescriptionDefault
filenameNoName for the file on the NAS (default: the local file's name).
overwriteNoReplace a NAS file of the same name (default false: the call fails and the NAS file is kept).
local_pathYesThe file on this machine, inside one of the allowed local folders (/root/Downloads), or below it.
dest_folderNoNAS folder to upload into (`/video/Uploads`). Optional when a default upload folder is configured.
create_parentsNoCreate `dest_folder` and any missing folders above it (default true); with `false`, `dest_folder` must already exist.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
albumNoAn existing album to add them to (personal space; create one with photo_album). Album ID (list_photo_collections type=album) or unique name.
spaceNo`personal` (default) or `shared` (Shared Space). IDs belong to one space.personal
folderNoThe existing folder's ID or path (default `/`, the space root)./
local_pathsYes1-50 local files inside one of the allowed local folders (/root/Downloads), or below it.
on_duplicateNoA file with that name already there: `rename` (default) keeps both, `skip` leaves the existing one and skips that file.rename

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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. 1 tool updatev0.10.0
    • Changeddownload_photos1 field changed
      • changedInput schema / properties / size / description
        Previous 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."
  2. 19 tool updatesv0.9.2
    • Addedcopy_photos
    • Addeddelete_photo_albums
    • Addeddelete_photo_folders
    • Addeddelete_photos
    • Addeddownload_photos
    • Addededit_person
    • Addededit_photo
    • Addedget_photo
    • Addedlist_photo_collections
    • Addedlist_photos
    • Addedmerge_people
    • Addedmove_photos
    • Addedphoto_album
    • Addedphoto_folder
    • Addedphoto_request
    • Addedphoto_share_link
    • Addedphoto_task
    • Addedtag_photos
    • Addedupload_photos
  3. 29 tool updatesv0.9.1
    • Changedcopy_files4 fields changed
      • addedInput schema / properties / dest_folder / description
        Added value: +"The existing folder to copy into (`/video/Archive`)."
      • addedInput schema / properties / overwrite / description
        Added value: +"Replace items already at the destination (default false: they're skipped and listed)."
      • addedInput schema / properties / paths / description
        Added value: +"Files or folders to copy (`/video/Downloads/clip.mkv`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_copy_filesOutput",
        -  "type": "object"
        -}New value: +null
    • Changedcreate_download6 fields changed
      • addedInput schema / properties / destination / description
        Added value: +"Existing folder to download into, share-relative (`video/Torrents`). Omit it to use your default destination."
      • addedInput schema / properties / password / description
        Added value: +"Password for a protected `uri`; not for torrent files."
      • addedInput schema / properties / torrent_file_path / description
        Added 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."
      • addedInput schema / properties / uri / description
        Added value: +"One or more source URIs, comma-separated: HTTP, HTTPS, FTP, magnet and others. Pass this or `torrent_file_path`, not both."
      • addedInput schema / properties / username / description
        Added value: +"User name for a protected `uri`; not for torrent files."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_create_downloadOutput",
        -  "type": "object"
        -}New value: +null
    • Changedcreate_folder3 fields changed
      • addedInput schema / properties / force_parent / description
        Added value: +"Create missing parent folders too (default true); with `false`, each parent must already exist."
      • addedInput schema / properties / paths / description
        Added value: +"Full paths of the folders to create (`[\"/video/TV Shows/New Show\"]`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_create_folderOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddelete_download3 fields changed
      • addedInput schema / properties / force_complete / description
        Added 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."
      • addedInput schema / properties / task_ids / description
        Added value: +"IDs of the tasks to remove, from list_downloads."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_delete_downloadOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddelete_files3 fields changed
      • addedInput schema / properties / paths / description
        Added value: +"Exact paths of the files or folders to delete (`/video/Downloads/old.mkv`); wildcards aren't expanded."
      • addedInput schema / properties / recursive / description
        Added value: +"Delete a folder with everything in it (default true); with `false`, a folder that isn't empty is refused and kept."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_delete_filesOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddownload_file5 fields changed
      • addedInput schema / properties / dest_folder / description
        Added 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."
      • addedInput schema / properties / filename / description
        Added value: +"Name to save as, a plain file name with no folders (default: the NAS name, or `<folder>.zip` for a folder)."
      • addedInput schema / properties / overwrite / description
        Added value: +"Replace a local file of the same name (default false: the call fails and the local file is kept)."
      • addedInput schema / properties / path / description
        Added value: +"The NAS file or folder (`/video/Movies/Dune.mkv`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_download_fileOutput",
        -  "type": "object"
        -}New value: +null
    • Changededit_download3 fields changed
      • addedInput schema / properties / destination / description
        Added value: +"New destination folder, share-relative (`video/Torrents`); it must already exist. The only editable field, so a call needs it."
      • addedInput schema / properties / task_ids / description
        Added value: +"IDs of the tasks to change, from list_downloads."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_edit_downloadOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfile_task1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_file_taskOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_dir_size2 fields changed
      • addedInput schema / properties / path / description
        Added value: +"The folder to measure (`/video/TV Shows`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_dir_sizeOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_download_config1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_download_configOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_download_info2 fields changed
      • addedInput schema / properties / task_id / description
        Added value: +"One task ID (`dbid_โ€ฆ`), from list_downloads."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_download_infoOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_download_stats1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_download_statsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_file_info3 fields changed
      • addedInput schema / properties / additional / description
        Added 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."
      • addedInput schema / properties / paths / description
        Added value: +"One or more full paths (`/video/Movies/Dune.mkv`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_file_infoOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_resource_usage1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_resource_usageOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_schedule1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_scheduleOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_system_info1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_get_system_infoOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_downloads5 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Most tasks to return, 1 or more."
      • addedInput schema / properties / offset / description
        Added value: +"Tasks to skip, 0 or more; the footer gives the next offset."
      • addedInput schema / properties / sort_by / description
        Added value: +"`queue` (default: queue order, oldest first), `created` or `completed` (both newest first; never-completed tasks last)."
      • addedInput schema / properties / status_filter / description
        Added value: +"`all` (default), `downloading` (also waiting, finishing, hash checking, waiting for a file host, or extracting), `finished` (also seeding), `paused` or `error`."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_list_downloadsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_files8 fields changed
      • addedInput schema / properties / filetype / description
        Added value: +"`all` (default), `file` or `dir`."
      • addedInput schema / properties / limit / description
        Added value: +"Most items to return; `0` returns them all."
      • addedInput schema / properties / offset / description
        Added value: +"Items to skip; a reply with more says which offset is next."
      • addedInput schema / properties / path / description
        Added value: +"The folder to list (`/video/TV Shows`)."
      • addedInput schema / properties / pattern / description
        Added 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`)."
      • addedInput schema / properties / sort_by / description
        Added value: +"`name` (default), `size`, `mtime` (modified), `crtime` (created), `atime` (accessed), `ctime` (changed), `user` (the owner) or `type`."
      • addedInput schema / properties / sort_direction / description
        Added value: +"`asc` (default) or `desc`."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_list_filesOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_recycle_bin7 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Most items to return; `0` returns them all."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Items to skip; a reply with more says which offset is next.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / pattern / description
        Added 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)."
      • addedInput schema / properties / share / description
        Added value: +"The shared folder whose bin to list, as a name (`video`) or path (`/video`)."
      • addedInput schema / properties / sort_by / description
        Added value: +"`mtime` (default: the file's own modified time), `ctime` (closest to when it was deleted), `name`, `size`, `crtime` or `atime`."
      • addedInput schema / properties / sort_direction / description
        Added value: +"`desc` (default) or `asc`."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_list_recycle_binOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_shares3 fields changed
      • addedInput schema / properties / sort_by / description
        Added value: +"`name` (default), `user` (the owner), `mtime` (modified) or `crtime` (created)."
      • addedInput schema / properties / sort_direction / description
        Added value: +"`asc` (default) or `desc`."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_list_sharesOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmove_files4 fields changed
      • addedInput schema / properties / dest_folder / description
        Added value: +"The existing folder to move into (`/video/Archive`)."
      • addedInput schema / properties / overwrite / description
        Added value: +"Replace items already at the destination (default false: they're skipped and listed)."
      • addedInput schema / properties / paths / description
        Added value: +"Files or folders to move (`/video/Downloads/clip.mkv`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_move_filesOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpause_download2 fields changed
      • addedInput schema / properties / task_ids / description
        Added value: +"IDs of the tasks to pause, from list_downloads."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_pause_downloadOutput",
        -  "type": "object"
        -}New value: +null
    • Changedrename3 fields changed
      • addedInput schema / properties / new_name / description
        Added value: +"The new name only, not a path (`Severance`)."
      • addedInput schema / properties / path / description
        Added value: +"The file or folder to rename (`/video/TV Shows/Severence`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_renameOutput",
        -  "type": "object"
        -}New value: +null
    • Changedrestore_from_recycle_bin5 fields changed
      • addedInput schema / properties / dest_folder / description
        Added value: +"An existing folder to restore everything into, flat (default: each item's original folder)."
      • addedInput schema / properties / overwrite / description
        Added value: +"Replace an item already at the destination (default false: it's skipped and stays in the bin)."
      • addedInput schema / properties / paths / description
        Added 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."
      • addedInput schema / properties / share / description
        Added value: +"The shared folder whose bin holds the items, as a name (`video`) or path (`/video`)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_restore_from_recycle_binOutput",
        -  "type": "object"
        -}New value: +null
    • Changedresume_download2 fields changed
      • addedInput schema / properties / task_ids / description
        Added value: +"IDs of the paused tasks to resume, from list_downloads."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_resume_downloadOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsearch_files12 fields changed
      • addedInput schema / properties / exclude_pattern / description
        Added 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`."
      • addedInput schema / properties / extension / description
        Added value: +"File extension, without the dot (`mkv`)."
      • addedInput schema / properties / filetype / description
        Added value: +"`all` (default: files and folders), `file` or `dir`."
      • addedInput schema / properties / folder_path / description
        Added value: +"The folder to search (`/video`)."
      • addedInput schema / properties / limit / description
        Added value: +"Most results to return; the reply says when there are more."
      • addedInput schema / properties / mtime_from / description
        Added 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."
      • addedInput schema / properties / mtime_to / description
        Added value: +"Modified before this time (a file modified at exactly this time doesn't match), in the same formats as `mtime_from`."
      • addedInput schema / properties / pattern / description
        Added 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\"`."
      • addedInput schema / properties / recursive / description
        Added value: +"Search subfolders too (default true); `false` searches only `folder_path` itself."
      • addedInput schema / properties / size_from / description
        Added value: +"Smallest size to match, in bytes or with a unit (`500MiB`, `2GiB`)."
      • addedInput schema / properties / size_to / description
        Added value: +"Largest size to match, in the same format as `size_from`."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_search_filesOutput",
        -  "type": "object"
        -}New value: +null
    • Changedset_download_config6 fields changed
      • addedInput schema / properties / bt_max_download / description
        Added value: +"NAS-wide BitTorrent download limit in KB/s; `0` means unlimited. Manager/admin accounts only."
      • addedInput schema / properties / bt_max_upload / description
        Added value: +"NAS-wide BitTorrent upload limit in KB/s; `0` means unlimited. Manager/admin accounts only."
      • addedInput schema / properties / default_destination / description
        Added value: +"Folder new tasks go to when create_download gets no destination, share-relative (`video/Torrents`). A non-manager sets only their own."
      • addedInput schema / properties / emule_max_download / description
        Added value: +"NAS-wide eMule download limit in KB/s; `0` means unlimited. Manager/admin accounts only."
      • addedInput schema / properties / emule_max_upload / description
        Added value: +"NAS-wide eMule upload limit in KB/s; `0` means unlimited. Manager/admin accounts only."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_set_download_configOutput",
        -  "type": "object"
        -}New value: +null
    • Changedset_schedule6 fields changed
      • addedInput schema / properties / download_rate / description
        Added value: +"Download speed in KB/s for hours marked `2`; `0` means unlimited."
      • addedInput schema / properties / emule_enabled / description
        Added value: +"Turn the eMule schedule on or off, for the whole NAS."
      • addedInput schema / properties / enabled / description
        Added value: +"Turn the schedule on or off, for the whole NAS."
      • addedInput schema / properties / schedule_plan / description
        Added 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."
      • addedInput schema / properties / upload_rate / description
        Added value: +"Upload speed in KB/s for hours marked `2`; `0` means unlimited."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_set_scheduleOutput",
        -  "type": "object"
        -}New value: +null
    • Changedupload_file6 fields changed
      • addedInput schema / properties / create_parents / description
        Added value: +"Create `dest_folder` and any missing folders above it (default true); with `false`, `dest_folder` must already exist."
      • addedInput schema / properties / dest_folder / description
        Added value: +"NAS folder to upload into (`/video/Uploads`). Optional when a default upload folder is configured."
      • addedInput schema / properties / filename / description
        Added value: +"Name for the file on the NAS (default: the local file's name)."
      • addedInput schema / properties / local_path / description
        Added value: +"The file on this machine, inside one of the allowed local folders (/root/Downloads), or below it."
      • addedInput schema / properties / overwrite / description
        Added value: +"Replace a NAS file of the same name (default false: the call fails and the NAS file is kept)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "tool_upload_fileOutput",
        -  "type": "object"
        -}New value: +null
  4. 1 tool updatev0.9.0
    • Addedfile_task
  5. 3 tool updatesv0.8.0
    • Changedlist_files1 field changed
      • removedInput schema / properties / additional
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
    • Changedlist_shares1 field changed
      • removedInput schema / properties / additional
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
    • Changedsearch_files1 field changed
      • removedInput schema / properties / additional
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
  6. 21 tool updatesv0.7.1
    • Addedcopy_files
    • Addedcreate_download
    • Addedcreate_folder
    • Addeddelete_download
    • Addeddelete_files
    • Addededit_download
    • Addedget_download_config
    • Addedget_download_info
    • Addedget_download_stats
    • Addedget_resource_usage
    • Addedget_schedule
    • Addedget_system_info
    • Addedlist_downloads
    • Addedmove_files
    • Addedpause_download
    • Addedrename
    • Addedrestore_from_recycle_bin
    • Addedresume_download
    • Addedset_download_config
    • Addedset_schedule
    • Addedupload_file
  7. 7 tool updatesv0.7.0
    • Changeddownload_file11 fields changed
      • removedInput schema / properties / dest_folder / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / dest_folder / default
        Removed value: -null
      • removedInput schema / properties / dest_folder / title
        Removed value: -"Dest Folder"
      • addedInput schema / properties / dest_folder / type
        Added value: +"string"
      • removedInput schema / properties / filename / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / filename / default
        Removed value: -null
      • removedInput schema / properties / filename / title
        Removed value: -"Filename"
      • addedInput schema / properties / filename / type
        Added value: +"string"
      • removedInput schema / properties / overwrite / title
        Removed value: -"Overwrite"
      • removedInput schema / properties / path / title
        Removed value: -"Path"
      • removedInput schema / title
        Removed value: -"tool_download_fileArguments"
    • Changedget_dir_size2 fields changed
      • removedInput schema / properties / path / title
        Removed value: -"Path"
      • removedInput schema / title
        Removed value: -"tool_get_dir_sizeArguments"
    • Changedget_file_info3 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / paths / title
        Removed value: -"Paths"
      • removedInput schema / title
        Removed value: -"tool_get_file_infoArguments"
    • Changedlist_files12 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / filetype / title
        Removed value: -"Filetype"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / path / title
        Removed value: -"Path"
      • removedInput schema / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pattern / default
        Removed value: -null
      • removedInput schema / properties / pattern / title
        Removed value: -"Pattern"
      • addedInput schema / properties / pattern / type
        Added value: +"string"
      • removedInput schema / properties / sort_by / title
        Removed value: -"Sort By"
      • removedInput schema / properties / sort_direction / title
        Removed value: -"Sort Direction"
      • removedInput schema / title
        Removed value: -"tool_list_filesArguments"
    • Changedlist_recycle_bin9 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pattern / default
        Removed value: -null
      • removedInput schema / properties / pattern / title
        Removed value: -"Pattern"
      • addedInput schema / properties / pattern / type
        Added value: +"string"
      • removedInput schema / properties / share / title
        Removed value: -"Share"
      • removedInput schema / properties / sort_by / title
        Removed value: -"Sort By"
      • removedInput schema / properties / sort_direction / title
        Removed value: -"Sort Direction"
      • removedInput schema / title
        Removed value: -"tool_list_recycle_binArguments"
    • Changedlist_shares4 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / sort_by / title
        Removed value: -"Sort By"
      • removedInput schema / properties / sort_direction / title
        Removed value: -"Sort Direction"
      • removedInput schema / title
        Removed value: -"tool_list_sharesArguments"
    • Changedsearch_files28 fields changed
      • addedInput schema / properties / additional
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / exclude_pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / exclude_pattern / default
        Removed value: -null
      • removedInput schema / properties / exclude_pattern / title
        Removed value: -"Exclude Pattern"
      • addedInput schema / properties / exclude_pattern / type
        Added value: +"string"
      • removedInput schema / properties / extension / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / extension / default
        Removed value: -null
      • removedInput schema / properties / extension / title
        Removed value: -"Extension"
      • addedInput schema / properties / extension / type
        Added value: +"string"
      • removedInput schema / properties / filetype / title
        Removed value: -"Filetype"
      • removedInput schema / properties / folder_path / title
        Removed value: -"Folder Path"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • addedInput schema / properties / mtime_from
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / mtime_to
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pattern / default
        Removed value: -null
      • removedInput schema / properties / pattern / title
        Removed value: -"Pattern"
      • addedInput schema / properties / pattern / type
        Added value: +"string"
      • removedInput schema / properties / recursive / title
        Removed value: -"Recursive"
      • removedInput schema / properties / size_from / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / size_from / default
        Removed value: -null
      • removedInput schema / properties / size_from / title
        Removed value: -"Size From"
      • addedInput schema / properties / size_from / type
        Added value: +"string"
      • removedInput schema / properties / size_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / size_to / default
        Removed value: -null
      • removedInput schema / properties / size_to / title
        Removed value: -"Size To"
      • addedInput schema / properties / size_to / type
        Added value: +"string"
      • removedInput schema / title
        Removed value: -"tool_search_filesArguments"
  8. 7 tool updatesv0.4.1
    • First observeddownload_file
    • First observedget_dir_size
    • First observedget_file_info
    • First observedlist_files
    • First observedlist_recycle_bin
    • First observedlist_shares
    • First observedsearch_files

TDQS

A4/5.0

Scored across 48 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

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