zspace-cli
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| zspace_checkA | 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. |
| zspace_pool_infoA | 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. |
| zspace_disk_statsA | 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". |
| zspace_lsA | 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. |
| zspace_infoA | 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. |
| zspace_renameA | 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). |
| zspace_mkdirA | 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. |
| zspace_moveA | 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. |
| zspace_copyA | 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. |
| zspace_removeA | 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. |
| zspace_searchA | 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 |
| zspace_treeA | 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. |
| zspace_uploadA | 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. |
| zspace_downloadA | 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. |
| zspace_usageA | 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 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. |
| zspace_duA | Get the size, file count and directory count of one NAS directory. Returns {path, bytes, files, dirs, state, complete, source, categories}. Always check 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 For whole-pool accounting use zspace_usage; to list individual large files use zspace_bigfiles. |
| zspace_bigfilesA | 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 For a directory's total size use zspace_du; for pool-level accounting use zspace_usage. |
| zspace_disksA | 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. |
| zspace_smartA | 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. |
| zspace_recycle_listA | 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
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. |
| zspace_recycle_configA | 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. |
| zspace_recycle_restoreA | 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. |
| zspace_recycle_purgeA | 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}. |
| zspace_recycle_emptyA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.