zspace-cli
This server lets you manage a ZSpace NAS through the local desktop client proxy: browse files, search, reorganize, transfer data, and check storage health.
Connectivity & storage:
zspace_checkverifies the NAS proxy is online;zspace_pool_inforeturns per-pool capacity;zspace_disk_statsexposes raw disk health diagnostics.Browsing & discovery:
zspace_lslists a directory (with hidden-file support),zspace_infogets detailed metadata,zspace_treeshows a nested folder tree, andzspace_searchfinds files by name across the NAS index.File organization:
zspace_rename,zspace_move,zspace_copy,zspace_mkdir, andzspace_remove(permanent, destructive) let you restructure files and folders.Data transfer:
zspace_uploadpushes local files to the NAS (auto sliced upload for >64 MB) andzspace_downloadpulls files to the local machine.Automation friendly: all operations are exposed as MCP tools, suitable for AI agents and scripted workflows.
zspace-cli
English · 简体中文
Manage your 极空间 (ZSpace) NAS from the terminal or AI agents — no password, no SSH, no DDNS.
mcp-name: io.github.skyzhao1223/zspace-cli
Just keep the ZSpace desktop client logged in on macOS.
📖 How large-file sliced upload was born: 一次 1.4GB 备份引发的逆向 (zh, CSDN) · CLI guide: 极空间 NAS 命令行管理指南 (zh, CSDN)
Beginner guide (no coding required) · Skills — incl. 9 cross-NAS organizer skills for AI agents · 中文文档
Install
pip install zspace-cli # base
pip install "zspace-cli[mcp]" # optional MCP support
zs check # ✓ reads the desktop client login statePrerequisite: the ZSpace desktop client is running and logged in on macOS.
Related MCP server: File Organizer MCP
Quick start
zs ls /sata11/my/data/影视
zs find "权力的游戏" # full-text search
zs tree /sata11/my/data -d 3
zs up ./本地文件.mp4 /sata11/my/data/影视 # upload
zs up ./本地文件.mp4 /sata11/my/data/影视 --verify # upload + MD5 round-trip check
zs down /sata11/my/data/影视/某文件.mkv ./下载 # downloadfrom zspace_cli import ZSpaceClient
with ZSpaceClient() as zs:
for f in zs.ls("/sata11/my/data"):
print(f"{'📁' if f.is_dir else '📄'} {f.name}")CLI options
Command | Meaning |
| Verify the desktop client proxy is reachable |
| List directory ( |
| Detailed file/dir info |
| Rename a file or directory |
| Move a file/directory |
| Copy a file/directory |
| Create a directory |
| Delete into the personal recycle bin ( |
| Full-text search across the NAS |
| Tree view ( |
| Storage profile — physical usage per pool, per user, per category. The only view that includes Time Machine backups, other users' spaces, and Docker/RAID overhead ( |
| Directory size via server-side statistics. Refuses to pass off a partial number as final when the NAS won't converge on a large tree; |
| Largest files, scanned server-side ( |
| Per-disk free space, temperature, health, fragmentation, power-on hours, plus empty bays |
| SMART report ( |
| Recycle bin contents with original locations ( |
| Restore items to their original location |
| Permanently delete only the named items ( |
| Purge the whole personal bin — irreversible, so it lists the contents first ( |
| Retention policy; |
| Upload ( |
| Download |
| Baidu NetDisk via the NAS |
| Copy Agent skills into a project ( |
| Point at a non-default |
zs check, zs ls, zs info, zs find, zs tree, zs usage, zs du,
zs bigfiles, zs disks, zs smart, zs recycle list/config accept --json
for machine-readable output. zs mv/zs cp/zs rm/zs down accept * ? glob
patterns on the source path. zs baidu check/ls/tasks/fails also accept
--json.
lspages through large directories automatically (the NAS API returns at most 50 entries per call).finduses the NAS full-text index, so it searches across directories. Upload/download show a progress bar on a real terminal and stream the file (no full-file buffering). Pass--verifytozs upto download the uploaded file to a temporary directory and compare its MD5 with the local source; verification is opt-in because it doubles transfer. CJK paths work out of the box. Files above 64 MB are uploaded through the desktop client's sliced/v2/file/uploadprotocol (2 MB slices), because the local proxy rejects oversized single-request bodies with HTTP 413; a 413 on a smaller file falls back to slices automatically.
Features
Operation | CLI | SDK | MCP |
List directory |
|
|
|
File info |
|
|
|
Rename |
|
|
|
Create dir |
|
|
|
Move |
|
|
|
Copy |
|
|
|
Delete |
|
|
|
Search |
|
|
|
Tree view |
|
|
|
Upload |
|
|
|
Download |
|
|
|
Health check |
|
|
|
Storage pools |
|
|
|
Disk diagnostics | — |
|
|
Storage profile |
|
|
|
Directory size |
|
|
|
Largest files |
|
|
|
Per-disk health |
|
|
|
SMART report |
|
|
|
Recycle bin (read) |
|
|
|
Recycle bin (write) |
|
|
|
Baidu NetDisk (read side) |
|
| — |
Use with AI agents (Skills)
zs skill --list # see what's available
zs skill ~/your-project/.cursor/skills/ # install all (Cursor)
# zs skill ~/your-project/skills/ # Claude Code, etc.
zs skill ~/your-project/skills/ --only nas-report,photo-organizer # or pick a fewThen tell your agent things like "list the files in /sata11/my/data". The skills ship inside the wheel, so zs skill works on any machine that has zspace-cli installed.
Besides zspace-nas (the zero-config base for ZSpace file ops), zs skill installs a family of 9 cross-NAS organizer skills. Their scanners are pure-stdlib and run on any mounted path (SMB/NFS), so they work with ZSpace, Synology, QNAP, UGREEN, etc. All follow the same read-only pattern: scan → the LLM drafts an old→new plan → you confirm → the agent executes (deletes always quarantine first).
Skill | What it does |
nas-report | 🧭 Entry point: whole-disk storage profile + routes you to the right specialist skill |
file-sorter | 🧹 Any mixed pile: recognizes 255 extensions across 15 categories (photos / video / audio / docs / ebooks / archives / installers / fonts / code / design sources / CAD drawings / disk images…), computes each |
photo-organizer | Photos/videos: file by shoot date ( |
music-organizer | Music: Artist/Album/Track structure, track numbers, covers, built-in ID3v2 parsing |
work-organizer | Work files: archive loose files, version chaos, copies, stale-file archiving |
portfolio-organizer | Portfolio: project structure, cover/README, separate finals from sources |
download-cleaner | Downloads: triage & clean (partials/torrents/installers/archives/unsorted media) |
dedup-finder | Content-level exact de-dup (3-stage fingerprint size→head→full sha1, zero false positives) |
backup-auditor | Backup health: version rotation, staleness, coverage check |
Start with nas-report to see the big picture, then run whichever specialist it recommends. The most common combo is dedup-finder + file-sorter. De-duping first is recommended — you skip moving bytes you're about to delete, and you avoid same-name collisions — but the reverse order misses nothing: de-dup is content-level and independent of directory layout (verified: both orders find the identical duplicate groups). file-sorter reports suspected copies: X MB (N% of the bytes to move) so you can decide by the number instead of by a rule. See skills/README.md for the full list. Media-library naming stays a separate project: media-manager-skill.
How it works
ZSpace has no official CLI or public API. zspace-cli talks to the desktop client's local proxy, so it works behind NAT as long as the client is online:
Skill / zs / SDK / MCP → 127.0.0.1:13579 (desktop client proxy) → NASDisclaimer — This is an unofficial, community-maintained project, not affiliated with or endorsed by ZSpace (极空间). It relies on the desktop client's local proxy interface, which is not officially documented. It only reads the login state of your own account on your own machine — it does not bypass authentication, crack encryption, or touch anyone else's data. Use at your own risk; make sure your use complies with the ZSpace user agreement and your local laws.
Platform support
Works on any OS where the ZSpace desktop client exposes its local proxy on
127.0.0.1:13579. The login state (vuex.json) is auto-detected:
Platform | Default location |
macOS |
|
Windows |
|
Linux |
|
If the client stores it elsewhere, point the CLI/SDK at it explicitly:
zs --config-dir ~/path/to/zspace-config check
ZS_CONFIG_DIR=~/path/to/zspace-config zs check # or as an env varWindows/Linux config locations are best-effort guesses (not verified against a real client). If auto-detection misses yours, please open an issue with the actual path so it can be added.
Windows on ARM — some
[mcp]dependencies (e.g.cryptography) don't ship ARM64 wheels for every version, sopip install "zspace-cli[mcp]"may try to build them from source (slow, or fails without Rust). Force prebuilt wheels:pip install --only-binary=:all: "zspace-cli[mcp]".
MCP configuration (optional)
{
"mcpServers": {
"zspace": { "command": "zs-mcp", "args": [] }
}
}Docker (headless)
Multi-arch images (linux/amd64, linux/arm64) are published to GHCR on every
release, so there is nothing to build:
docker pull ghcr.io/skyzhao1223/zspace-cli:latest # or pin a release, e.g. :0.1.9
docker run --rm --network host \
-e ZS_BASE_URL=http://127.0.0.1:13579 \
-e ZS_CONFIG_DIR=/config \
-v "$HOME/Library/Application Support/zspace:/config:ro" \
ghcr.io/skyzhao1223/zspace-cli zs checkThe image's default command is zs-mcp, so an MCP client can run
ghcr.io/skyzhao1223/zspace-cli directly to start the server; pass zs … to
use the CLI instead. Tags are latest plus each release version.
To run the CLI / MCP server in a container against the desktop client proxy on the host via compose — no desktop client needed inside the image:
export ZS_CONFIG_HOST_DIR="$HOME/Library/Application Support/zspace" # macOS
# export ZS_CONFIG_HOST_DIR="$APPDATA/zspace" # Windows
# export ZS_CONFIG_HOST_DIR="$HOME/.zspace" # Linux
docker compose build
docker compose run --rm zspace-cli zs check
docker compose run --rm zspace-cli zs ls /sata11/my/dataIt mounts the host's ZSpace config read-only (ZS_CONFIG_HOST_DIR) and points
ZS_BASE_URL at the host via host.docker.internal. On Linux hosts, either use
network_mode: host or the included extra_hosts mapping. To build the image
yourself instead of pulling it from GHCR:
docker build -t zspace-cli .
docker run --rm --network host \
-e ZS_BASE_URL=http://127.0.0.1:13579 \
-e ZS_CONFIG_DIR=/config \
-v "$HOME/Library/Application Support/zspace:/config:ro" \
zspace-cli zs checkGlobbing
rm / mv / cp / down accept glob patterns (*, ?, [...], **) that
are expanded on the NAS:
zs rm "/sata11/my/data/影视/*.mkv" --force
zs cp "/sata11/my/data/**/*.mp4" /sata11/my/data/movies
zs down "/sata11/my/data/photos/*.jpg" ./photosOr via the SDK: client.glob("/sata11/my/data/**/*.mkv").
API reference
Endpoint | Key Parameters |
|
|
|
|
|
|
|
|
|
|
|
|
| binary body, header |
| sliced upload: query |
| GET |
|
|
Note: the interface parameter names are non-standard (
parent/toinstead ofpath/dest) — documented by the community from the desktop client's behavior.
Repository layout
zspace-cli/
├── src/zspace_cli/
│ ├── cli.py # Typer CLI (zs ...)
│ ├── client.py # ZSpaceClient SDK (retry / stream / progress)
│ ├── auth.py # vuex.json auto-detection + credential cache
│ ├── mcp_server.py # MCP tools (zs-mcp)
│ └── skills/ # packaged skill copies shipped in the wheel (keep in sync!)
├── skills/ # skill sources — the source of truth (edit here)
├── scripts/mcp_smoke.py
├── tests/ # pytest (CLI + SDK + MCP + auth)
└── promo/ # launch/promo material (submodule)Integrations
Pair zspace-cli with Jellyfin / Emby / MoviePilot / MCP clients / Docker and media-manager-skill for media library tooling.
For cloud-drive → NAS pipelines, combine with baidu-pan-skill: it downloads Baidu NetDisk (百度网盘) share links reliably (cookie extraction, transfer-save, resumable chunked downloads, structural verification), then zs up takes over for the sliced large-file upload to the NAS. Both ship as agent skills, so one prompt can drive the whole backup.
Roadmap
File upload/download
Linux / Windows client auth (best-effort path detection +
ZS_CONFIG_DIR)Docker headless option (
ZS_BASE_URL+docker-compose.yml)Pre-built multi-arch images on GHCR (
ghcr.io/skyzhao1223/zspace-cli, published per release)Batch glob helpers (
glob()+zs rm/mv/cp/downpatterns)Agent skill family: 9 cross-NAS organizers (incl.
file-sorterfor generic type-based archiving) +nas-reportentry, selective install (zs skill --list/--only)Optional EXIF-based photo dating (
photo-organizer --exif: exiftool → mdls → mtime fallback) — #14Per-skill config overrides (
skills/<name>/config.json: whitelist dirs / extension rules) — #15 · shipped for all 8 scanners (nas-reportdeliberately excluded). The key set differs per skill andwhitelist_dirshas four distinct effects across five of them — see the family table inskills/README.mdGrowth-trend reports (
nas-report difftwo snapshots: category/dir growth, rate & ETA) — #16
Contributing
PRs welcome — see
CONTRIBUTING.md for dev setup, quality gates, and the
skill-authoring guide (including the skills/ ↔ src/zspace_cli/skills/
dual-copy sync rule that CI enforces).
🧭 Not sure where to start? Pick from CONTRIBUTION_IDEAS.md (difficulty-tagged backlog, incl. reverse-engineered NAS API notes) or the
good first issuelabel💬 Questions & showcases: Discussions
🔒 Security issues: private reporting via SECURITY.md
🤝 This project follows the Contributor Covenant
Legal
Unofficial community project, not affiliated with or endorsed by ZSpace/极空间.
It automates your own logged-in desktop client on your own machine —
no passwords handled, no service gates bypassed (membership-gated features are
documented as gated, never worked around). API notes are interoperability
documentation of observed client behavior and may break with client updates.
Concerns or takedown requests: skyzhao1223@users.noreply.github.com —
legitimate requests are answered promptly. Source archives ship with every
GitHub Release; the maintainer keeps off-platform git bundle mirrors.
License
MIT
Available Tools
24 toolszspace_bigfilesFind the largest files (server-side scan)ARead-only
List the largest files under the given directories, biggest first.
Use to find cleanup candidates. The NAS scans server-side, which is far faster than walking: a 7k-file tree returns in ~2 seconds versus ~765 requests and ~10 seconds client-side. Returns {complete, scanned, matched, files: [{name, path, bytes, modify_time}]}.
There is a single shared task slot, so this call clears any stale task
before starting one; that is harmless but means two concurrent bigfiles
scans would interfere. Check complete -- if the timeout elapsed the
results are partial. Read-only.
For a directory's total size use zspace_du; for pool-level accounting use zspace_usage.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many largest matches to return | |
| paths | Yes | Directories to scan, e.g. ["/sata11/my/data"] | |
| min_size_mib | No | Only report files at least this many MiB (default 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only readOnly/openWorld, but the description discloses operational traits the agent could not otherwise know: a single shared task slot that clears stale tasks, interference between concurrent scans, and that `complete` may be false with partial results on timeout. It also quantifies the server-side speed advantage over client-side walking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and use case, then layers caveats and alternatives. Every sentence carries distinct information — performance rationale, concurrency warning, completeness check — with no restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite a return shape being restated (redundant given the output schema exists), the definition covers everything an agent needs: purpose, alternatives, concurrency hazard, partial-result signal, and safety profile. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `top`, `paths`, and `min_size_mib` are already documented in the schema; the description adds only the ordering guarantee ('biggest first') which is not a parameter property. Baseline 3 is appropriate when the schema carries parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with ordering semantics: 'List the largest files under the given directories, biggest first.' It also explicitly differentiates itself from zspace_du and zspace_usage, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('find cleanup candidates') and names the two alternatives with the condition that selects each: zspace_du for a directory's total size, zspace_usage for pool-level accounting. This is explicit when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_checkCheck ZSpace NAS connectionARead-only
Check whether the ZSpace NAS is reachable through the local desktop client proxy and, if so, return a summary of storage pools.
Call this first to verify the proxy at 127.0.0.1:13579 is online before running other file operations. Returns {"connected": true, "pools": [{name, total_tb, free_tb}]} when the NAS responds, or {"connected": false} when it does not. Never modifies NAS state.
Unlike zspace_pool_info, this is a connectivity probe that happens to include a pool summary; use pool_info when you only need capacity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include readOnlyHint and openWorldHint, but the description adds concrete behavioral detail: it reports both connected and disconnected outcomes, states it 'never modifies NAS state,' and specifies the exact proxy endpoint. This goes beyond what annotations alone convey and gives an agent confidence about side effects and result semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the core purpose, then gives usage timing, return format, safety note, and sibling differentiation in a logical order. No sentence is wasted, and the sibling contrast is placed at the end where it is least likely to obscure the primary instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter connectivity probe with an output schema present, the description is complete. It gives the endpoint, success and failure response shapes, a no-mutation guarantee, and when to call it. There is no missing information an agent would need to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema fully covers the parameter surface with 100% coverage. The description confirms the fixed target (127.0.0.1:13579) and return shape, which is sufficient; there is no parameter meaning left to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'check whether the ZSpace NAS is reachable through the local desktop client proxy' — and explicitly differentiates the tool from zspace_pool_info by clarifying this is a connectivity probe with a pool summary. An agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this first to verify the proxy at 127.0.0.1:13579 is online before running other file operations.' It also names the alternative and the condition for choosing it: 'use pool_info when you only need capacity.' This fully covers usage context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_copyCopy files or directoriesA
Copy one or more files/directories on the NAS into a destination folder.
Use to duplicate media or create backups without removing the originals. Accepts a single path or a list; the destination must already exist (create it with zspace_mkdir). Returns {status: "copied", paths, to}. Mutates NAS state but leaves the sources untouched.
The non-destructive counterpart of zspace_move — pick copy when the original must stay where it is, move when it should not. Copies consume additional capacity; check zspace_pool_info first for large trees.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Destination directory (absolute path) | |
| paths | Yes | One absolute path or a list of absolute paths to copy |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint in annotations, the description carries the full burden of disclosing side effects. It explicitly states 'Mutates NAS state but leaves the sources untouched', requires the destination to exist, and notes copies consume additional capacity. This goes well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with each sentence serving a distinct purpose: operation, use case, return shape, side effects, and alternative selection. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only two clearly documented parameters, existing output schema, and modest annotations, the description is complete enough for an agent to invoke the tool correctly. It covers behavior, prerequisites, return shape, capacity impact, and how to choose between this and zspace_move.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful extra semantics by clarifying that the destination must already exist and may need to be created with zspace_mkdir, which is not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Copy'), a resource ('files/directories on the NAS'), and a target ('destination folder'). It also distinguishes itself from zspace_move explicitly by noting the originals are left untouched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: duplicating media or creating backups. It names the alternative (zspace_move) and gives the selection rule: choose copy when the original must remain, move when it should not. Also directs users to create the destination with zspace_mkdir and check capacity with zspace_pool_info for large trees.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_disksPer-disk capacity, health and free baysARead-only
Report every physical disk: free space, temperature, health, SMART counters, fragmentation and power-on hours, plus how many bays are empty.
Use before recommending a drive purchase or when a pool is nearly full -- pool-level free space can be misleading, since in a ZDR pool the space may all sit on one spindle while another is effectively full (observed: a pool reporting 476 GiB free had one disk with only 59.8 GiB left).
Returns {free_bays: {sata, nvme, esata}, disks: [{pool, position, model, sn, dev_type, total_bytes, free_bytes, used_pct, temp_c, health, power_on_hours, reallocated_sectors, fragment_pct, suspected_smr}]}. Read-only.
Tip: power_on_hours greater than the hours since the disk was installed means the drive was previously used elsewhere. For full SMART attributes use zspace_smart; for pool totals use zspace_usage.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description's 'Read-only' line merely restates that. The valuable additions are the ZDR-pool caveat explaining why disk-level data can contradict pool-level free space, and the power_on_hours interpretation tip about previously used drives, neither of which is derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the usage guidance follows logically, but the explicit return-shape listing duplicates the output schema that already exists, which is wasted text. The illustrative 476 GiB / 59.8 GiB example is helpful but adds length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With readOnly/openWorld annotations and a full output schema present, the description needs only to justify when to call the tool and what pitfalls exist. It does both, including the disk-vs-pool free-space trap and sibling routing, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The documented return fields do not function as parameters here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb ('Report') and resource ('every physical disk') and enumerates exactly what is covered: free space, temperature, health, SMART counters, fragmentation, power-on hours, and empty bay counts. It is clearly separable from siblings like zspace_smart and zspace_usage, which it explicitly names later.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('Use before recommending a drive purchase or when a pool is nearly full') and explains why the tool is needed over the pool-level alternative, with a concrete observed example of a misleading pool report. It also routes the agent to zspace_smart for full SMART attributes and zspace_usage for pool totals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_disk_statsGet disk statisticsARead-only
Return raw disk statistics reported by the ZSpace NAS.
Use for diagnostics and health monitoring (I/O, capacity, SMART-style counters as exposed by the NAS API). Returns the raw stats object. Read-only; never modifies NAS state.
Unlike zspace_pool_info, the shape is whatever the NAS API exposes and is not normalized — choose pool_info for "how much free space", this one for "is a disk unhealthy".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true, and the description consistently states "Read-only; never modifies NAS state." It adds helpful context beyond annotations by revealing that the return shape is "whatever the NAS API exposes and is not normalized," which sets expectations about variability. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with the core action first, followed by usage context, read-only note, and sibling differentiation. It is slightly redundant with the annotation ("Read-only; never modifies NAS state") but every sentence otherwise adds value and nothing is extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only diagnostics tool with an output schema present, the description covers all necessary aspects: purpose, usage triggers, read-only guarantee, return shape variability, and distinction from the closest sibling. There are no gaps that would prevent correct selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the input schema is empty, so there is nothing for the description to clarify beyond what the schema already reflects. The description appropriately focuses on behavior, not parameters, matching the baseline for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: "Return raw disk statistics reported by the ZSpace NAS." It clearly differentiates from the sibling zspace_pool_info by noting the raw, unnormalized shape versus normalized pool info, so an agent can distinguish them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit use cases are given: "Use for diagnostics and health monitoring (I/O, capacity, SMART-style counters as exposed by the NAS API)." It also provides a direct exclusion and alternative: "choose pool_info for 'how much free space', this one for 'is a disk unhealthy'." This leaves no ambiguity about when to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_downloadDownload file from NASARead-only
Download a file from the ZSpace NAS to a local directory.
Use to pull media or documents off the NAS. The local_dir must already exist. Returns {saved_to: ""}. Does not modify NAS state.
NAS -> local, the inverse of zspace_upload. Unlike upload this never changes anything on the NAS, so it is safe to retry; an existing local file of the same name is overwritten.
| Name | Required | Description | Default |
|---|---|---|---|
| local_dir | No | Local directory to save the file into (defaults to current dir) | . |
| remote_path | Yes | Absolute path of the file on the NAS to download |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds meaningful behavioral context beyond that: it states the tool does not modify NAS state, overwrites an existing local file of the same name, requires local_dir to exist, and returns a specific shape. This helps the agent predict side effects and retry safety without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core purpose in the first sentence. There is slight redundancy between 'Does not modify NAS state' and 'Unlike upload this never changes anything on the NAS,' but overall every major point is covered without excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple two-parameter tool with an output schema and read-only annotations. The description covers the tool's direction, key constraints, retry safety, local overwrite behavior, and return value. Nothing important is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by clarifying that local_dir must already exist, that remote_path is an absolute NAS path, and that an existing local file of the same name will be overwritten. These are behavioral details tied to parameters that are not fully explicit in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Download a file from the ZSpace NAS to a local directory.' It also distinguishes the tool from its siblings by explicitly framing it as 'NAS -> local' and 'the inverse of zspace_upload.' This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance: 'Use to pull media or documents off the NAS.' It also names the relevant alternative zspace_upload and explains the key difference in behavior, including that download never changes NAS state and is safe to retry. This is explicit when/why guidance, not just an implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_duDirectory size and file countARead-only
Get the size, file count and directory count of one NAS directory.
Returns {path, bytes, files, dirs, state, complete, source, categories}.
Always check complete before reporting the numbers. The server-side
statistic is instant and exact for small-to-medium trees, but on large ones
the NAS returns state="running" with a partial snapshot that never
converges -- measured on a 1.175 TiB / 448k-file folder, fourteen
consecutive calls all reported ~0.35 TiB with the file count jittering
between 27k and 30k. There is no poll endpoint that works, so when
complete is false either pass walk=true or tell the user the figure is a
lower bound. Never present a partial number as the answer.
walk=true traverses via /v2/file/list at roughly one request per directory; a 448k-file tree needs ~93k requests and ~12 minutes. Read-only.
Do not cross-check this against a du run on an SMB mount and assume one of
them is broken. The mount exposes directories the file API cannot see at all
-- notably "@Recycle", the same recycle bin that zspace_recycle_list reads
as "/.recycle/my" -- so a mount-side count includes recycled data this tool
correctly excludes. Mount-side scans must skip "@Recycle" (and
".zspace_trash"); counting it inflates totals without raising any error.
For whole-pool accounting use zspace_usage; to list individual large files use zspace_bigfiles.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute directory path, e.g. /sata11/my/data/影视 | |
| walk | No | Force an exact client-side traversal (slow, but the only reliable option for very large trees) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond by disclosing the non-converging partial-snapshot failure mode on large trees, with a concrete measured example (1.175 TiB / 448k files, ~0.35 TiB reported over fourteen calls), the absence of a working poll endpoint, and the cost of the exact path (~93k requests, ~12 minutes for 448k files). This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the critical `complete` caveat and the walk trade-off, before the file-API/NAS gotchas. Every paragraph carries actionable information, though the @Recycle cross-check warning and the repeated 'never present a partial number' admonitions make it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still supplies the one field an agent must interpret (`complete`) along with the returned key set. Combined with the cost model, failure mode, and alternative-tool routing, nothing needed to call this correctly on either a small or a very large tree is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds genuine semantics for `walk`: it explains the underlying /v2/file/list mechanism, the request-per-directory ratio, and a realistic runtime. That substantially extends the schema's terse 'slow, but the only reliable option' note. The `path` parameter gets no added meaning, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource -- 'Get the size, file count and directory count of one NAS directory' -- and immediately differentiates from siblings by naming zspace_usage for whole-pool accounting and zspace_bigfiles for individual large files. An agent can distinguish it from zspace_ls, zspace_tree and the other listing tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not guidance: always check `complete` first, pass walk=true or report a lower bound when complete is false, never present a partial number as the answer. It also routes to the correct alternatives (zspace_usage, zspace_bigfiles) and warns against a specific misuse (cross-checking against an SMB du run).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_infoGet file or directory infoARead-only
Return detailed metadata for one file or directory on the ZSpace NAS.
Use when you need more than the ls summary exposes (permissions, timestamps, exact size, type details). Returns the raw info object from the NAS API. Read-only; the path must already exist.
One path only — use zspace_ls to enumerate a directory, or zspace_search to locate an item first.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the file or directory to inspect, e.g. /sata11/my/data/影视 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces it with 'Read-only' while adding non-redundant constraints: 'the path must already exist' and 'Returns the raw info object'. This goes beyond the annotation to inform error conditions and return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short paragraphs, each earning its place: purpose, usage, and exclusions. It is front-loaded with the core purpose, and there is zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with an output schema, the description covers everything an agent needs: when to use, what it returns, the constraint that the path must exist, and how to handle multiple paths. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for 'path' including an example. The description adds no additional parameter-level meaning beyond the schema, only the constraint that the path must exist, which is usage guidance rather than parameter semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and resource ('detailed metadata for one file or directory on the ZSpace NAS'), and explicitly contrasts with ls by mentioning 'more than the ls summary exposes'. This clearly distinguishes the tool from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use ('when you need more than the ls summary exposes') and when-not-to-use ('use zspace_ls to enumerate a directory, or zspace_search to locate an item first'), naming the exact alternative tools. No ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_lsList directory contentsARead-only
List the contents of a directory on the ZSpace NAS at the given path.
Use to browse files, locate items, or pick targets for later move/copy operations. Large directories are paginated automatically (the NAS API returns at most 50 entries per call). Returns a list of {name, path, is_dir, size} objects. Read-only; pass show_hidden=True to include hidden entries.
Flat and one level deep: use zspace_tree for nested structure, zspace_search when you know a name but not the location, and zspace_info for full metadata on one path you already have.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Absolute path on the NAS, e.g. /sata11/my/data | /sata11/my/data |
| show_hidden | No | Include hidden files and directories |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses automatic pagination (max 50 entries per call), the exact return shape ({name, path, is_dir, size}), and the effect of show_hidden=True. This gives the agent a concrete behavioral model without any contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: purpose first, then behavior, then alternatives. Every sentence adds value and none merely repeats the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with output schema and annotations, the description covers pagination, return shape, option semantics, and sibling routing. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters with defaults and descriptions, so schema coverage is 100%. The description restates the path and show_hidden behavior but adds no substantial meaning beyond the schema, which fits the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('list') and resource ('directory on the ZSpace NAS'), and clarifies its flat scope. It also names sibling tools it is not, making differentiation from zspace_tree, zspace_search, and zspace_info immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use: browse files, locate items, or pick targets for move/copy. It also gives clear alternatives with conditions: zspace_tree for nested structure, zspace_search when name is known, and zspace_info for metadata on a known path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_mkdirCreate directoryA
Create a new directory on the ZSpace NAS under the given parent.
Use to prepare a destination before moving files into it. name is the bare basename, not a path. Fails if a directory of that name already exists. Returns the created {name, path}. Mutates NAS state.
zspace_move and zspace_copy both require the destination to exist already, so call this first when reorganizing into a new folder.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new directory (basename only) | |
| parent | Yes | Absolute path of the parent directory, e.g. /sata11/my/data |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide openWorldHint=true, so the description must carry behavioral disclosure. It explicitly states the side effect ('Mutates NAS state'), a failure condition ('Fails if a directory of that name already exists'), and the return value ('Returns the created {name, path}'). This fully discloses the tool's behavior beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences long, each earning its place: purpose, use case, parameter nuance, failure/return, and relationship to siblings. It is front-loaded with the core action and avoids any redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with an output schema, the description covers purpose, usage, failure, return, and side effects. Nothing an agent needs to invoke it correctly is missing, especially given the output schema already documents the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers both parameters with descriptions and examples (100% coverage). The description adds critical nuance for 'name' by clarifying it is a 'bare basename, not a path,' which is not explicit in the schema. This extra semantic guidance raises it above the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource statement: 'Create a new directory on the ZSpace NAS under the given parent.' It precisely identifies the operation and the target namespace, and differentiates from siblings by implying it is a preparatory action rather than a move/copy/delete. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use to prepare a destination before moving files into it.' It also states when to use it relative to zspace_move and zspace_copy, which require the destination to already exist. This tells an agent exactly when to call this tool and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_moveMove files or directoriesA
Move one or more files/directories on the NAS into a destination folder.
Use to reorganize files, e.g. sort media into per-genre folders. Accepts a single path or a list; the destination must already exist (create it with zspace_mkdir). Returns {status: "moved", paths, to}. Mutates NAS state; sources are removed from their original location.
Choose move vs copy by whether the originals should survive: copy keeps them, move does not. To change only the name within the same directory, use zspace_rename instead.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Destination directory (absolute path) | |
| paths | Yes | One absolute path or a list of absolute paths to move |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include openWorldHint: true, which is minimal. The description carries the burden and discloses key behaviors: it mutates NAS state, removes sources from original location, requires destination to exist (with a pointer to zspace_mkdir), and returns a specific structure. It does not detail error cases or permission requirements, but the main side effects are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise paragraphs: a one-sentence definition, a usage paragraph with input format, precondition, return, and mutation warning, and a decision paragraph. It is front-loaded with the core purpose and avoids redundancy. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (accepts single or list, has preconditions, mutates state) and the presence of an output schema, the description covers the essential aspects: purpose, usage, input flexibility, precondition, return structure, and differentiation from siblings. Minor gaps like error handling or permission requirements exist, but overall it is sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented. The description adds semantic value by clarifying that 'paths' can be a single path or a list, and that 'to' must be an existing directory (with a creation hint). This goes beyond the raw schema descriptions, enriching the agent's understanding of parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Move one or more files/directories on the NAS into a destination folder.' It also distinguishes itself from copy and rename by explicitly mentioning those alternatives, so an agent can immediately tell what this tool does and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use to reorganize files, e.g. sort media into per-genre folders.' It further provides decision rules: 'Choose move vs copy by whether the originals should survive' and 'To change only the name within the same directory, use zspace_rename instead.' This fully guides when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_pool_infoGet storage pool infoARead-only
List every storage pool on the ZSpace NAS with its name and capacity.
Use to inspect free space before an upload or to report total capacity. Returns a list of {name, total_tb, free_tb} objects, one per pool. Read-only; never modifies NAS state.
Prefer this over zspace_disk_stats for capacity questions: it returns normalized per-pool numbers, whereas disk_stats returns the NAS's raw diagnostics object. Use zspace_check instead if you need to know whether the NAS is reachable at all.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, so the description's 'Read-only; never modifies NAS state' is consistent and helpful. It goes further by disclosing that it returns normalized per-pool numbers rather than raw diagnostics, which is meaningful behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core capability, followed by usage guidance and sibling differentiation. Every sentence adds value; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with an output schema, this description is complete: it states what is returned (a list of {name, total_tb, free_tb} objects), when to use it, and how it differs from related siblings. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to clarify about arguments. The description correctly implies an unqualified list operation, and the baseline for a no-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List every storage pool on the ZSpace NAS with its name and capacity.' It clearly distinguishes itself from zspace_disk_stats and zspace_check, so an agent can tell which tool answers a capacity question without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('inspect free space before an upload or to report total capacity'), and when to prefer alternatives ('Prefer this over zspace_disk_stats... Use zspace_check instead if you need to know whether the NAS is reachable at all'). This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_recycle_configRecycle bin retention policyARead-only
Read the recycle bin retention policy: {my_cycle, public_cycle} in days.
-1 means never auto-purge, which is the factory default -- so deleted data keeps occupying pool space indefinitely until something empties the bin. If a user reports that deleting files did not free space, check this first. Read-only; there is deliberately no MCP tool for changing it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, but the description adds real behavioral context: -1 means never auto-purge, that is the factory default, and deleted data will occupy pool space indefinitely as a consequence. The 'Read-only' sentence is redundant with the annotation, and no auth or rate-limit context is offered, so it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The tool's purpose and returned fields are front-loaded in the first clause, followed by only the interpretations and the diagnostic cue that an agent actually needs. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with annotations and an output schema, everything required to call and interpret it is present. The -1 semantics are exactly the piece an output schema cannot convey, and they are supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description's detail about the returned value -- days, with -1 meaning never auto-purge -- is interpretationally useful, though strictly it describes output rather than input, and an output schema is already present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (read the recycle bin retention policy) and names the exact fields returned ({my_cycle, public_cycle} in days). This clearly separates it from the mutating siblings (zspace_recycle_purge/empty/restore) without the agent needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete diagnostic trigger: 'If a user reports that deleting files did not free space, check this first.' It also eliminates the alternative explicitly -- 'there is deliberately no MCP tool for changing it' -- so the agent knows not to hunt for a write counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_recycle_emptyEmpty an entire recycle binADestructive
Permanently purge an entire recycle bin. Irreversible, and this is the only way deleted files actually stop occupying pool space.
Two things make this easy to get wrong. First, the personal and public bins are separate stores: emptying the public bin after deleting from a personal space succeeds with total_num=0 and frees nothing. Second, it purges EVERYTHING in that bin, not just what the current task deleted.
Always call zspace_recycle_list first, show the user the contents, and get their agreement. Requires confirm=true. Returns the server task summary {total_num, succeed_num, fail_num, total_size} -- verify total_num is non-zero before claiming space was freed. Use zspace_recycle_purge to remove specific items instead.
| Name | Required | Description | Default |
|---|---|---|---|
| public | No | True empties the shared/family bin, False the personal one | |
| confirm | No | Must be explicitly true; the call is refused otherwise |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true and openWorldHint=true, and the description adds substantial context beyond them: irreversibility, that this is the only operation that actually frees pool space, that personal and public bins are separate stores (with the total_num=0 failure mode), and that it purges everything in the bin rather than just the current task's deletions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive outcome in the first sentence, then organizes the remaining guidance into pitfalls and workflow. Every sentence carries operational value; nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, yet the description still names the summary fields and tells the agent to verify total_num is non-zero before claiming space was freed. Combined with the pitfall and confirmation guidance, an agent has everything needed to invoke this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the personal/public and confirm semantics are already documented, giving a baseline of 3. The description goes further by explaining the operational consequence of choosing the wrong bin (success with total_num=0 and no space freed) and reinforcing that confirm must be explicitly true or the call is refused.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Permanently purge an entire recycle bin.' It explicitly contrasts with the sibling that handles the narrower case ('Use zspace_recycle_purge to remove specific items instead'), so an agent can disambiguate without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition workflow (call zspace_recycle_list first, show the user, get agreement), states the required confirm=true, and names the alternative tool and the condition that selects it. It also warns when the call will silently succeed but do nothing, which is genuine when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_recycle_listList recycle bin contentsARead-only
List what is currently in a recycle bin, including each item's original location.
Always call this before zspace_recycle_empty -- emptying purges every item in the bin, including files deleted earlier by other means, and is irreversible. The personal and public bins are separate stores; files deleted from //my/data land in the personal one.
The listing triggers a server-side scan and this call waits for it to
settle, so an in-progress scan is not mistaken for an empty bin. Returns
{bin, total, items: [{name, path, original_path, is_dir, bytes}]}. The
path is the in-bin location and is what zspace_recycle_restore and
zspace_recycle_purge need. Read-only.
Naming: this tool reaches the bin through the API, where it is "/.recycle/my". The same bin is visible on an SMB mount as a directory called "@Recycle" at the share root (plus a ".zspace_trash" variant), which is outside //my/data and therefore not readable through the file API at all. If you are also running scripts against a mounted path -- the skills/ scanners do exactly that -- they must skip "@Recycle", or recycled files get counted as live data. That miscount raises no error, it just quietly inflates totals; it survived in 8 of the 9 scanners before being caught. Do not try to list "@Recycle" through this API to cross-check: it returns N001411 for every path outside my/data whether or not it exists, so that response tells you nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum items to return | |
| public | No | True for the shared/family bin, False for the personal one |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint/openWorldHint, but the description adds substantial non-obvious behavior: the listing triggers a server-side scan that the call waits to settle (so an in-progress scan isn't misread as empty), personal and public bins are separate stores, and the read path is '/.recycle/my' via API versus '@Recycle'/'.zspace_trash' on SMB. The 'Read-only' statement agrees with readOnlyHint, so no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with purpose and the critical ordering rule, and headings help scanning. However it runs long for a two-parameter list tool, with an extended aside about scanner miscounts ('survived in 8 of the 9 scanners') and the N001411 error that, while genuinely useful, is disproportionate detail. Several sentences could be compressed without losing decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is fully covered: annotations carry the read-only/open-world profile, an output schema exists so the inline return shape is a bonus rather than a necessity, and the description supplies the operational hazards (irreversibility, scan settling, SMB/API path split, misleading error code) an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real semantic content about the `public` parameter: the personal and public bins are separate stores with different deletion origins ('/<pool>/my/data' lands in the personal one). It also ties the returned `path` field to the parameters of downstream tools, which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource (list recycle bin contents) plus the distinguishing payload detail (each item's original location). It is immediately separable from the sibling mutation tools zspace_recycle_restore, zspace_recycle_purge and zspace_recycle_empty by describing itself as the read-side listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit ordering rule with rationale: 'Always call this before zspace_recycle_empty', explaining that emptying is irreversible and purges items deleted by other means. It also names the sibling tools that consume the returned `path` (restore/purge) and warns against using this API to cross-check the SMB '@Recycle' view. Nothing about when to reach for this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_recycle_purgePermanently delete specific recycle bin itemsADestructive
Permanently delete only the named items from the personal recycle bin, leaving everything else untouched. Irreversible.
Prefer this over zspace_recycle_empty whenever the goal is to free the space held by specific files: the bin may also contain items the user did not put there. Call zspace_recycle_list first and show the user what will be destroyed. Requires confirm=true; without it the call is refused and nothing happens. Returns {purged, failed}.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | In-bin paths from zspace_recycle_list | |
| confirm | No | Must be explicitly true; the call is refused otherwise |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds critical context the annotations cannot: irreversibility, the confirm=true guard that refuses otherwise, and the exact return shape {purged, failed}. Minor gap: no mention of auth requirements or partial-failure semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the irreversible warning, then the sibling preference, then the required workflow, then the guard, then the return shape. Every sentence earns its place with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, irreversibility, sibling differentiation, prerequisite listing call, confirmation guard, and return shape. With annotations covering destructiveness and a 100% schema, nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds meaning beyond schema: the confirm gate is tied to the refusal behavior, and paths are framed as 'in-bin paths from zspace_recycle_list' which clarifies the required format source. It also explains the consequence of omitting confirm.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (permanently delete) and resource (named items in the personal recycle bin) with scope precision ('only the named items, leaving everything else untouched'). This clearly distinguishes it from zspace_recycle_empty and zspace_remove.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Prefer this over zspace_recycle_empty whenever the goal is to free the space held by specific files.' Also prescribes calling zspace_recycle_list first and showing the user the destruction set, which is a complete when-to-use workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_recycle_restoreRestore files from the recycle binA
Restore items from the personal recycle bin to their original locations.
Paths must be the in-bin paths reported by zspace_recycle_list, not the original locations. Returns {restored, failed}. Restores data rather than removing it, so this is the recovery path after an accidental zspace_remove -- but it only works while the bin has not been emptied.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | In-bin paths from zspace_recycle_list, e.g. ["/sata11/.recycle/my/photo.jpg"] |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry openWorldHint, so the description must disclose the mutation profile and does: it clarifies the operation restores data rather than deleting it, and states a hard precondition (bin must not be emptied). It does not cover permissions required or behavior when a destination path already exists, leaving a modest gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, purpose front-loaded, followed by the critical path constraint and then recovery context. No redundant restatement of the name or schema; every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the brief 'Returns {restored, failed}' is supplementary rather than required. For a mutation tool with near-empty annotations, it discloses the non-destructive nature and precondition but omits auth requirements and destination-overwrite behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantic value beyond the schema's example: paths must be in-bin paths from zspace_recycle_list, not original locations. That constraint is the main way an agent would get this wrong, and the description prevents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (restore) and resource (items from the personal recycle bin to their original locations). Easily distinguished from sibling recycle tools (list, purge, empty) whose names imply different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames this as the recovery path after an accidental zspace_remove, names the precondition ('only works while the bin has not been emptied'), and points to zspace_recycle_list as the source of valid paths. When-to-use, when-not-to-use, and the related sibling are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_removeDelete files or directoriesADestructive
Permanently delete one or more files/directories from the ZSpace NAS.
Use only when you are sure the items are no longer needed — deletion is immediate and NOT recoverable. Accepts a single path or a list. Returns {status: "removed", paths}. Marked destructive: confirm intent before calling.
There is no trash or undo: zspace_move is the reversible alternative when the goal is only to get items out of the way. Confirm the exact paths with zspace_ls or zspace_search before calling, and never pass a pool root.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | One absolute path or a list of absolute paths to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint, but the description adds substantial behavioral context: deletion is immediate and unrecoverable, there is no trash/undo, what the return payload looks like, and the pool-root prohibition. This goes well beyond what annotations alone provide and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then flows into safety warning, alternatives, and confirmation steps. Every sentence contributes unique value, and no filler or redundancy inflates the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations and an output schema, the description supplies everything an agent needs: purpose, irreversibility, alternative, precondition checks, and return format. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description enriches the sole parameter by clarifying it accepts a single path or list, emphasizes absolute paths (already in schema), and adds the critical constraint 'never pass a pool root,' which is absent from the schema. This adds real meaning beyond the structured definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently delete one or more files/directories from the ZSpace NAS,' which states a specific verb, resource, and permanence. It differentiates from siblings by explicitly naming zspace_move as the reversible alternative, so an agent can choose correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('only when you are sure the items are no longer needed'), when-not-to-use (reversible case → zspace_move), and pre-call safety steps (confirm paths with zspace_ls or zspace_search, never pass a pool root). This exhaustively routes the agent around misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_renameRename file or directoryA
Rename one file or directory on the ZSpace NAS, keeping it in place.
Use to fix a name without changing location; the parent directory stays the same. new_name is the bare basename, not a path. Returns the updated {name, path}. This mutates NAS state; it cannot be undone.
Same-directory only — use zspace_move to relocate to a different parent (move also accepts several paths at once, rename does not).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the file or directory to rename, e.g. /sata11/my/data/old | |
| new_name | Yes | New name (basename only), e.g. newname.mkv |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include openWorldHint=true, so the description carries the burden. It discloses that the operation mutates NAS state, cannot be undone, keeps the parent directory the same, and returns the updated {name, path}. It does not mention permission requirements or what happens if the target name already exists, but the core behavioral traits are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the action and scope, the second explains the use case, and the third gives the key constraint. Every sentence earns its place, and the sibling comparison is concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with 100% schema coverage and an output schema, the description is nearly complete. It covers the mutation risk, the same-directory constraint, and the return value. A minor gap is the lack of error conditions (e.g., name collision), but the description is sufficient for an agent to invoke it correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying that new_name is a bare basename, not a path, and that the parent directory stays the same. This prevents a common misuse where a user might pass a full path as new_name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Rename'), a specific resource ('one file or directory on the ZSpace NAS'), and the key constraint 'keeping it in place.' It clearly distinguishes from siblings by noting it is same-directory only and does not accept multiple paths, unlike zspace_move.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('fix a name without changing location') and when not to ('use zspace_move to relocate to a different parent'), and notes that move accepts several paths while rename does not. This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_searchSearch files by nameARead-only
Search for files/directories on the NAS whose names contain the keyword.
Use to find a file without knowing its exact location. Returns a list of {name, path, is_dir} matches, capped at 100. Read-only; never modifies NAS state.
The NAS full-text index is searched GLOBALLY, then results are filtered
client-side to path. Because path defaults to /sata11/my/data, a match
living in another pool is silently dropped and you get an empty list —
pass the pool root (or the widest directory you mean) before concluding a
file does not exist. Unlike zspace_ls / zspace_tree this matches by name
across the index rather than walking a directory.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Directory to search under, e.g. /sata11/my/data | /sata11/my/data |
| keyword | Yes | Keyword to match against file names |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the global index search with client-side filtering, the default path, the 100-result cap, and the silent-drop behavior for matches outside the path. It also confirms read-only status. These details go well beyond the readOnlyHint and openWorldHint annotations, providing essential operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with purpose, then usage, then behavioral nuances and a warning, then differentiation from siblings. Every sentence adds value—no fluff—and it remains readable despite length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return format is covered. The description covers purpose, usage, behavioral pitfalls, parameter nuances, and differentiators. The caution about empty results from path filtering is critical for correct invocation. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover both parameters, but the description adds meaningful semantics: it explains the default path's role in filtering, the meaning of 'keyword' (match against file names), and the consequence of the default. This goes beyond the schema, though it could explicitly tie parameters to behavior even more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for files/directories by name keyword, and explicitly differentiates from zspace_ls and zspace_tree ('matches by name across the index rather than walking a directory'). This gives a precise verb-resource-action and distinguishes it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use ('Use to find a file without knowing its exact location') and provides a critical warning about the default path filtering behavior, advising the user to widen the path before concluding a file doesn't exist. It also names alternatives (zspace_ls, zspace_tree) and explains why they differ.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_smartSMART attribute report for one diskARead-only
Return the full SMART attribute table for one disk.
The endpoint is keyed on serial number -- passing a pool id or a /dev name returns N300403. Get serials from zspace_disks first. Returns {health, attributes: [{id, attr_name, en_attr_name, now_value, worst, thresh, str_value, health}]}; the server also supplies warning/fault text per attribute. NVMe drives report no classic attributes. Read-only.
Focus on ids 5 (reallocated), 187 (reported uncorrectable), 197 (current pending), 198 (offline uncorrectable) and 199 (UDMA CRC) -- those are the ones that predict failure. For a quick health overview use zspace_disks.
| Name | Required | Description | Default |
|---|---|---|---|
| sn | Yes | Disk serial number, as reported by zspace_disks |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true and openWorld=true, yet the description adds substantial context: the endpoint is keyed on serial and rejects other identifiers with N300403, NVMe drives report no classic attributes, and the response includes server-supplied warning/fault text. This is real behavioral disclosure beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with the core purpose first, then input constraints, then output shape, then interpretation guidance. Slightly redundant in enumerating the return object fields even though an output schema exists, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations and an output schema, this covers everything needed: valid input source, invalid input failure, return contents, NVMe exception, and which attribute ids matter. Nothing required for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required 'sn' parameter, so the schema carries the baseline. The description adds genuine meaning: the parameter must be a serial (not a pool id or /dev name) or the call fails, and where to obtain a valid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the full SMART attribute table for one disk') and explicitly distinguishes itself from the sibling zspace_disks, which is positioned as the quick-overview tool. An agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the prerequisite ('Get serials from zspace_disks first'), the wrong-input failure mode (pool id or /dev name returns N300403), and the alternative for a different need ('For a quick health overview use zspace_disks'). Explicit when-to-use and when-to-use-something-else.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_treeShow directory treeARead-only
Return a nested tree view of a directory on the ZSpace NAS.
Use to understand overall folder structure before deep operations. depth caps recursion (default 2). Returns the nested tree structure as exposed by the NAS API. Read-only.
Nested rather than flat: use zspace_ls for a single level with sizes, or zspace_search when you are looking for a name rather than a layout.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Root directory to show as a tree, e.g. /sata11/my/data | /sata11/my/data |
| depth | No | Maximum recursion depth (1 = current level only) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description's 'Read-only' line adds no new safety info. It does add the recursion-depth behavior and the note that output is 'as exposed by the NAS API', which is mild context, but nothing about pagination, error cases, or the exact structure. With annotations covering the key safety trait, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight: a one-sentence purpose, a short usage note, a brief behavioral note, and a clear alternative line. Every sentence earns its place, and the key distinguishing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tree tool with two simple parameters and an output schema present, the description covers purpose, usage, alternatives, and the key recursion behavior. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'path' and 'depth' are already documented with defaults and descriptions. The description repeats 'depth caps recursion (default 2)' but adds no meaning beyond the schema. Baseline 3 applies because the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'a nested tree view of a directory on the ZSpace NAS', and immediately distinguishes itself from siblings (zspace_ls and zspace_search). This gives an agent an unambiguous mental model of what the tool does and how it differs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('to understand overall folder structure before deep operations') and provides clear exclusions and alternatives ('use zspace_ls for a single level with sizes, or zspace_search when you are looking for a name rather than a layout'). No inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_uploadUpload local file to NASA
Upload a file from the local machine to a directory on the ZSpace NAS.
Use to push media or documents to the NAS. remote_dir must already exist (create it with zspace_mkdir); pass new_name to rename it on arrival. Returns the upload result from the NAS API. Mutates NAS state; a file with the same name is overwritten.
Local -> NAS, the inverse of zspace_download. Files above 64 MB go through the desktop client's sliced upload protocol (2 MB slices) automatically, because the local proxy rejects oversized single-request bodies with HTTP 413. Check zspace_pool_info for free space before large uploads.
| Name | Required | Description | Default |
|---|---|---|---|
| new_name | No | Optional remote file name; defaults to the local basename | |
| local_path | Yes | Local filesystem path of the file to upload | |
| remote_dir | Yes | Destination directory on the NAS (absolute path) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide openWorldHint, so the description carries the behavioral burden. It explicitly warns that this mutates NAS state and that a same-named file is overwritten, and it discloses the >64 MB sliced protocol triggered by HTTP 413. These are exactly the hidden behaviors an agent needs before invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the main purpose, then organized into related notes about parameters, large files, and related tools. It is slightly longer than strictly necessary, but every sentence contributes operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating upload tool with only an openWorldHint annotation, the description covers prerequisites, overwrite semantics, size limits, the underlying HTTP 413 reason, related sibling operations, and the return value. Nothing critical is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all three parameters at 100% coverage, so the baseline is 3. The description adds meaning beyond the schema by stating that remote_dir must already exist, that new_name renames the file on arrival, and that local_path is the source of the upload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Upload a file from the local machine to a directory on the ZSpace NAS.' It also distinguishes itself from siblings by calling itself 'the inverse of zspace_download' and linking remote_dir creation to zspace_mkdir, so an agent can disambiguate it from the other zspace_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it ('push media or documents to the NAS'), gives an explicit prerequisite (remote_dir must exist and can be created with zspace_mkdir), names the alternative direction via zspace_download, and advises checking zspace_pool_info for free space before large uploads. This is concrete routing guidance, not just a restatement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zspace_usageStorage profile by pool, user and categoryARead-only
Report where physical disk space actually goes on the ZSpace NAS.
Use this FIRST for any "is my NAS full?" or "what is using my space?" question. It is the only view that includes Time Machine backups, other users' spaces, the safe box, Docker, RAID metadata and the recycle bins -- every one of those is outside //my/data and returns N001411 to file listing, so walking the file tree systematically under-reports pool usage (measured: a full 57-minute walk of 2.69M files accounted for only 4.84 TiB of a 7.97 TiB pool).
Returns per pool: total/used/free bytes, used_pct, and entries of {kind, owner, label, label_cn, bytes} sorted largest first, where label is one of my / my_tm (Time Machine) / my_recycle / my_safe / sys_docker / sys_raid / sys_vm / sys_iscsi / sys_other. Read-only.
The my_recycle entry is the recycle bin's physical footprint, so this is
the cheap way to see how much space deleted-but-not-purged data is holding
before deciding whether to list or empty it. Also note these are physical
sizes: my includes the second copy of every double-backed-up folder,
whereas a file-level walk (zspace_du) reports logical sizes. The walk
therefore comes out lower by exactly the mirrored bytes -- measured on one
pool as 4.838 TiB walked vs 6.008 TiB reported here, the 1.17 TiB gap being
the double-written folder. Neither number is wrong; they measure different
things.
If you compare these figures against a scan run on an SMB mount, expect a mismatch: the mount exposes "@Recycle" and other directories the file API cannot see, and a mount-side scan that fails to skip "@Recycle" counts recycled data as live. That inflates totals silently rather than erroring.
For the size of one specific directory use zspace_du instead; for per-disk health use zspace_disks.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Ask the NAS to recompute the snapshot first (slower) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavioral context: the exact categories included, that they return N001411 to file listing, that figures are physical (not logical) sizes including mirrored second copies, and that SMB-mount scans can silently mismatch due to '@Recycle'. This is far beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the routing rule, and every paragraph targets a real decision (walk under-reporting, physical vs logical, SMB mismatch). It is somewhat verbose with repeated measured figures, but the density of decision-relevant information mostly justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return-value explanation is optional, yet the description still sketches the per-pool return shape and label taxonomy. Combined with the documented pitfalls (physical vs logical sizing, SMB mismatch, recycle footprint), it is complete for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single optional `refresh` parameter documented in the schema; the description adds no additional parameter detail. Baseline 3 applies since the schema fully carries parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: reporting where physical disk space goes on the ZSpace NAS, broken down per pool/user/category. It explicitly distinguishes itself from siblings by naming zspace_du (single-directory size) and zspace_disks (per-disk health) as different tools for different questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule ('Use this FIRST for any "is my NAS full?" or "what is using my space?" question') and names alternatives for adjacent questions (zspace_du for one directory, zspace_disks for disk health). It also tells the agent when this view is the only one that sees certain categories.
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.
10 tool updates
v0.1.13- Added
zspace_bigfiles - Added
zspace_disks - Added
zspace_du - Added
zspace_recycle_config - Added
zspace_recycle_empty - Added
zspace_recycle_list - Added
zspace_recycle_purge - Added
zspace_recycle_restore - Added
zspace_smart - Added
zspace_usage
11 tool updates
v0.1.1- Changed
zspace_copy2 fields changed- added
Input schema / properties / paths / descriptionAdded value: +"One absolute path or a list of absolute paths to copy" - added
Input schema / properties / to / descriptionAdded value: +"Destination directory (absolute path)"
- Changed
zspace_download2 fields changed- added
Input schema / properties / local_dir / descriptionAdded value: +"Local directory to save the file into (defaults to current dir)" - added
Input schema / properties / remote_path / descriptionAdded value: +"Absolute path of the file on the NAS to download"
- Changed
zspace_info1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Absolute path of the file or directory to inspect, e.g. /sata11/my/data/影视"
- Changed
zspace_ls2 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Absolute path on the NAS, e.g. /sata11/my/data" - added
Input schema / properties / show_hidden / descriptionAdded value: +"Include hidden files and directories"
- Changed
zspace_mkdir2 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Name of the new directory (basename only)" - added
Input schema / properties / parent / descriptionAdded value: +"Absolute path of the parent directory, e.g. /sata11/my/data"
- Changed
zspace_move2 fields changed- added
Input schema / properties / paths / descriptionAdded value: +"One absolute path or a list of absolute paths to move" - added
Input schema / properties / to / descriptionAdded value: +"Destination directory (absolute path)"
- Changed
zspace_remove1 field changed- added
Input schema / properties / paths / descriptionAdded value: +"One absolute path or a list of absolute paths to delete"
- Changed
zspace_rename2 fields changed- added
Input schema / properties / new_name / descriptionAdded value: +"New name (basename only), e.g. newname.mkv" - added
Input schema / properties / path / descriptionAdded value: +"Absolute path of the file or directory to rename, e.g. /sata11/my/data/old"
- Changed
zspace_search2 fields changed- added
Input schema / properties / keyword / descriptionAdded value: +"Keyword to match against file names" - added
Input schema / properties / path / descriptionAdded value: +"Directory to search under, e.g. /sata11/my/data"
- Changed
zspace_tree2 fields changed- added
Input schema / properties / depth / descriptionAdded value: +"Maximum recursion depth (1 = current level only)" - added
Input schema / properties / path / descriptionAdded value: +"Root directory to show as a tree, e.g. /sata11/my/data"
- Changed
zspace_upload3 fields changed- added
Input schema / properties / local_path / descriptionAdded value: +"Local filesystem path of the file to upload" - added
Input schema / properties / new_name / descriptionAdded value: +"Optional remote file name; defaults to the local basename" - added
Input schema / properties / remote_dir / descriptionAdded value: +"Destination directory on the NAS (absolute path)"
14 tool updates
v0.1.0- First observed
zspace_check - First observed
zspace_copy - First observed
zspace_disk_stats - First observed
zspace_download - First observed
zspace_info - First observed
zspace_ls - First observed
zspace_mkdir - First observed
zspace_move - First observed
zspace_pool_info - First observed
zspace_remove - First observed
zspace_rename - First observed
zspace_search - First observed
zspace_tree - First observed
zspace_upload
TDQS
Scored across 24 tools
Descriptions go to extraordinary lengths to cross-reference and steer between tools (e.g. pool_info vs disk_stats vs check, ls vs tree vs search, move vs copy vs rename, purge vs empty), which resolves most overlaps. However, a cluster of 6-8 tools (pool_info, check, disk_stats, usage, disks, smart, du, bigfiles) all answer varying flavors of 'capacity/health' questions and remain easy to mis-pick despite the guidance.
All 24 tools share a uniform zspace_ prefix and snake_case, with the recycle family (list/restore/purge/empty/config) being especially tidy. Minor deviation: many names are noun phrases (du, disks, smart, info, usage, bigfiles) rather than the verb_noun style used elsewhere (upload, download, mkdir, remove), so the convention is consistent but not purely verb-first.
24 tools is at the heavy end but the domain genuinely spans file operations, recycle-bin management, and disk/space diagnostics, and nearly every tool has a defensible role. There is some redundancy in the capacity/health cluster (pool_info, check, disk_stats, disks), which keeps it from a 5.
File lifecycle is well covered (ls, info, search, tree, mkdir, rename, move, copy, remove, upload, download), the recycle bin has full list/restore/purge/empty coverage, and disk/space accounting is thorough. Minor gaps: no permissions/chmod tool, no direct file-content write beyond upload, and recycle policy is intentionally read-only.
Maintenance
Related MCP Connectors
Persistent file storage for AI agents via MCP and curl. Upload, download, and version files.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Browse and manage files in your Moxt AI workspace from any MCP client.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceComprehensive MCP server for filesystem operations, process management, interactive sessions, and async file search. Includes utilities for JSON repair, encoding fixes, duplicate detection, OCR, ZIP archives, and Markdown export.46102 npm5MIT
- AlicenseBqualityAmaintenanceA powerful, security-hardened MCP server for intelligent file organization. Provides high-level atomic tools for organizing files into categories, detecting duplicates, extracting EXIF/ID3 metadata, scheduling automatic organization, and more — for use with Claude, Cursor, and Gemini CLI.26313 npm46MIT
- AlicenseAqualityFmaintenanceMCP server for the Rclone RC API. Gives AI assistants the ability to manage cloud storage remotes, copy/sync files, list directories, and more — all through natural language.5681 npm12MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that gives AI agents file system access: read, write, search, hash, directory trees — 12 tools, zero dependencies, pure Python stdlib.MIT