Skip to main content
Glama

ugreen-nas-mcp

中文 | English

让任意支持 MCP 的 AI 客户端(Claude Desktop、Claude Code、Cursor、WorkBuddy、Codex 等)管理你自己的绿联 NAS。

非官方项目。 本项目与绿联(UGREEN)没有关联,UGREEN 是其所有者的商标。它通过绿联官方发布的 unc 命令行工具工作,不包含也不分发 unc。

工作方式

MCP 客户端 ⇄ stdio ⇄ ugreen-nas-mcp ──▶ unc(绿联官方 CLI)──HTTPS──▶ 你的 NAS

server 只做两件事:把 unc 的命令映射成带参数校验的 MCP 工具,并在中间加一层你能控制的权限边界。它不读、不存、不回显你的访问令牌。

Related MCP server: UGOS Pro MCP Server

前置条件

  1. Node.js 20 或更高。

  2. 已安装 unc(绿联 UGOS Pro 开放 CLI 的官方命令行工具),按绿联官方说明安装。装好后在终端运行 unc version 应能看到版本号。

  3. 一个访问令牌,在 NAS 的控制面板里创建,以 ugpoa_v1. 开头。创建时按需勾选权限节点:令牌只能调用被授权的方法,且创建后权限不能修改。应用的安装与卸载需要管理员签发的令牌。

快速开始

第一步:让 unc 能连上 NAS

两种方式任选其一。

方式 A(推荐):在终端登录一次。 令牌只保存在 unc 自己的本机缓存里,MCP 配置文件中不出现令牌。

unc auth login --host https://192.168.1.10:9443 --token 'ugpoa_v1.***'

方式 B:在 MCP 配置里用环境变量。 设置 UNC_NAS_URL 和 UNC_NAS_TOKEN(见下方示例)。注意这样令牌会以明文留在配置文件里。

NAS 地址只支持 https://。局域网地址要带端口(通常是 9443),也可以用 UGLink 地址,如 https://ug.link/your-id。

第二步:在客户端里添加 server

Claude Desktop、Cursor、WorkBuddy 等使用 mcpServers 配置的客户端:

{
  "mcpServers": {
    "ugreen-nas": {
      "command": "npx",
      "args": ["-y", "ugreen-nas-mcp"],
      "env": {
        "UNC_NAS_URL": "https://192.168.1.10:9443",
        "UNC_NAS_TOKEN": "ugpoa_v1.***"
      }
    }
  }
}

用方式 A 登录过的话,去掉整个 env 即可。

Claude Code:

claude mcp add ugreen-nas -- npx -y ugreen-nas-mcp

Codex(~/.codex/config.toml):

[mcp_servers.ugreen-nas]
command = "npx"
args = ["-y", "ugreen-nas-mcp"]

从源码运行

git clone https://github.com/Mrgaols/ugreen-nas-mcp.git
cd ugreen-nas-mcp
npm install
npm run build

然后把配置里的命令换成 "command": "node"、"args": ["/绝对路径/ugreen-nas-mcp/dist/index.js"]。

第三步:试一下

对 agent 说「看看我 NAS 的硬盘健康状况」或「我的 NAS 现在卡不卡」。连接有问题时让它调用 nas_status。

环境变量

变量

默认

说明

UNC_NAS_URL

无

NAS 地址。unc 自己的变量,server 原样传给它

UNC_NAS_TOKEN

无

访问令牌。同上;不设则使用 unc auth login 的本机缓存

UGREEN_MCP_ACCESS

read

访问级别:read、write 或 admin

UGREEN_MCP_TOOLSETS

全部

启用的工具组,逗号分隔:file,search,docker,download,app,storage,ctl,network,taskmgr

UGREEN_MCP_ALLOWED_PATHS

不限

允许访问的 NAS 文件夹,逗号分隔,如 /volume1/docs,/home/alice

UGREEN_MCP_LOCAL_DIR

未设

上传、下载可以读写的本机目录。不设则没有上传、下载工具

UGREEN_MCP_UNC_BIN

自动查找

unc 的完整路径。默认先找 PATH,再找 ~/.local/bin/unc

UGREEN_MCP_MAX_OUTPUT_CHARS

60000

单次返回的字符上限,超出部分截断

权限模型

开箱是只读的。要让 agent 能改东西,必须由你在配置里显式放开。

访问级别

级别

允许的操作

工具数

read(默认)

只读查询

25

write

另加「只新增、不覆盖、不中断服务」的操作:建目录、建新文件、复制、从回收站恢复、打标签、创建和暂停下载任务、拉取镜像

33(配置了本机目录时 35)

admin

另加删除、移动、覆盖、改配额、启停容器与应用、创建和删除 Compose 项目、安装和卸载应用、创建用户

44(配置了本机目录时 46)

超出当前级别的工具不会注册,agent 看不到也调不了。有些工具的风险取决于参数,例如 nas_file_copy 默认属于 write,带 on_conflict: "replace" 就属于 admin。

两段式确认

所有 admin 级的调用分两步:

  1. 第一次调用只做预演(unc --dry-run),返回预演结果和一个确认码,NAS 上什么都不变。

  2. 第二次调用带上同样的参数和确认码,才真正执行。

确认码一次有效、5 分钟过期,并且与参数绑定:改动任何一个参数,确认码就失效。

路径白名单

设置 UGREEN_MCP_ALLOWED_PATHS 后,file 和 search 两组工具的所有路径都必须落在这些文件夹内,nas_download_create 的保存目录也一样。原本可以不给路径的调用(如列出个人文件夹)此时必须显式给出路径。

本机传输目录

nas_file_upload 和 nas_file_download 只有在设置了 UGREEN_MCP_LOCAL_DIR 后才存在,而且只能读写这个目录里的文件(会解析符号链接,防止绕出目录;下载目标如果本身是一个符号链接,会被拒绝)。这样 agent 无法借它读取或覆盖你电脑上的其他文件。

局限

请在放开权限之前读完这一节。

  • 确认码不等于你本人同意。 它保证的是「必须先预演,且执行的就是预演过的那一份」。agent 可以自己走完两步。真正由人把关的是 MCP 客户端的工具审批弹窗,这些工具都标注了 destructiveHint,请不要对它们开启自动批准。

  • 路径白名单是字符串判断。 它无法识别 NAS 上的符号链接。路径本身不能含英文逗号。

  • 路径白名单不约束 docker 和 app 两组的 admin 操作。 例如创建 Compose 项目可以挂载任意目录。不需要这些能力时,用 UGREEN_MCP_TOOLSETS 把这两组关掉。

  • 最终的权限由令牌决定。 server 的限制是第二道防线。请按最小权限创建令牌:只做查询就只勾只读节点。

  • 一个 server 进程只连一台 NAS。多台 NAS 请配置多条 server,各自设置环境变量。

  • 能做什么取决于 NAS 的系统版本。某个功能在你的设备上不可用时,工具会如实返回,可用 nas_status 加 doctor: true 查看细节。

工具清单

共 46 个。风险一栏是该工具的最低级别;标注「→ admin」的表示某些参数会把它提升到 admin。

核心

工具

风险

说明

nas_status

read

登录状态、unc 版本、server 当前策略;可选完整体检

file

工具

风险

说明

nas_file_roots

read

列出可访问的共享文件夹,不知道路径时从这里开始

nas_file_list

read

列目录;省略路径列个人文件夹

nas_file_read

read

读取文件的一段内容

nas_file_stat

read

类型、大小、时间等元数据

nas_file_find

read

按名称、类型、大小、时间在目录下查找

nas_file_usage

read

目录占用空间,或目录配额

nas_file_checksum

read

MD5 或 SHA-256

nas_file_tags

read

查询标签、文件的标签、带某标签的文件

nas_file_mkdir

write

新建目录

nas_file_create

write

新建文件,目标已存在则失败

nas_file_copy

write → admin

复制到已有目录;覆盖同名文件属于 admin

nas_file_restore

write

从回收站恢复

nas_file_tag_edit

write → admin

新建标签、打标签;删除标签属于 admin

nas_file_upload

write → admin

本机文件上传到 NAS,需本机目录;覆盖属于 admin

nas_file_download

write

NAS 文件下载到本机,需本机目录

nas_file_move

admin

移动或重命名

nas_file_delete

admin

删除,默认进回收站

nas_file_write

admin

覆盖或追加已有文件

nas_file_quota_set

admin

设置目录配额

工具

风险

说明

nas_search_files

read

全局按文件名搜索

nas_search_results

read

翻页、取消或释放一次搜索

docker

工具

风险

说明

nas_docker_containers

read

容器列表,含 CPU、内存、端口

nas_docker_images

read

本地镜像,或搜索镜像仓库

nas_docker_projects

read

Compose 项目列表

nas_docker_logs

read

容器或项目的最近日志

nas_docker_check

read

部署前检查端口、目录、独显占用

nas_docker_app_usage

read

应用中心 Docker 应用的资源占用

nas_docker_pull

write

拉取镜像

nas_docker_container_control

admin

启动、停止、重启容器

nas_docker_project_control

admin

启动、停止、重启、删除 Compose 项目

nas_docker_project_create

admin

用 YAML 创建 Compose 项目

nas_docker_app_rebuild

admin

重建应用中心的容器应用

download

工具

风险

说明

nas_download_list

read

下载任务与进度

nas_download_create

write

让 NAS 下载一个链接

nas_download_control

write → admin

暂停、继续、重试;移除任务或作用于全部任务属于 admin

app

工具

风险

说明

nas_app_list

read

应用列表或搜索(精简输出)

nas_app_get

read

单个应用详情,或安装与运行状态

nas_app_manage

admin

安装、更新、卸载、启动、停止应用

storage

工具

风险

说明

nas_storage_info

read → admin

磁盘、存储池、存储卷;SMART 原始数据属于 admin

ctl

工具

风险

说明

nas_users

read

用户或群组列表

nas_system_info

read

系统版本、更新状态、风扇、电源、UPS 等设置

nas_user_create

admin

创建用户

nas_group_add_member

admin

向群组添加成员

network 与 taskmgr

工具

风险

说明

nas_network_info

read

网卡、IP、网关、DNS、代理

nas_performance

read

CPU、内存、网络、磁盘实时负载,进程与服务占用

不提供的操作:登录与令牌管理、创建共享文件夹、修改文件权限(ACL)、修改网络和硬件设置、系统更新、创建或删除存储池。这些请在 NAS 的管理界面完成。

常见问题

提示找不到 unc。 先在终端确认 unc version 能运行。图形界面的客户端启动时不一定带上你 shell 的 PATH,这时用 UGREEN_MCP_UNC_BIN 指定完整路径。

返回 401。 令牌无效或已过期,重新登录或更换令牌。

返回 403。 分两种情况:访问的路径不在你有权限的共享文件夹里(卷根 /volume1 本身不可访问),或者令牌没有勾选这个方法的权限节点。后一种需要在 NAS 上新建令牌,因为已有令牌的权限改不了。

提示功能在这台 NAS 上不可用。 对应的套件没装、没运行,或系统版本还不支持。重试没有用,让 agent 调用 nas_status 并带 doctor: true 看具体原因。

提示 context deadline exceeded 或命令超时。 NAS 没有在限定时间内答复。查询类操作可以缩小范围,或调大工具的 timeout_seconds(列目录、查找、校验、上传下载都有这个参数)。如果是修改类操作,它可能已经在 NAS 上生效,先查看当前状态,不要直接重试。

客户端提示工具太多。 用 UGREEN_MCP_TOOLSETS 只保留需要的工具组,例如 file,storage,taskmgr。

改了配置不生效。 环境变量只在 server 启动时读取,修改后需要重启客户端或重新连接 server。

开发

npm install
npm test            # 构建并运行全部测试,不需要 NAS
npm run live-check  # 在真实 NAS 上逐个调用只读工具,不做任何修改

live-check 只调用只读工具和 admin 工具的预演步骤,不发送确认码。

许可证

MIT

Available Tools

25 tools
nas_app_getApp details or statusA
Read-only

view "detail" (default) returns everything about one app, including install_parameters, whose keys are what nas_app_manage expects in params; the values still have to come from the user. An unknown app ID is an error. view "status" returns the install, running and auto-start state for one or more apps in data.status keyed by app ID: decide from is_installed and is_running. An empty run_state, or one resting at APP_RUNNER_STAGE_FREE, just means no workflow is in progress and is not a failure.

Inputs: app_ids (required), view.

nas_app_listList or search app-center appsA
Read-only

List the apps of the NAS app center, or search them by keyword. The output is a compact summary per app (app_id, name, install_status, installed_version, available_version); for full details and install parameters call nas_app_get. filter narrows the list to installed, not installed, updatable or broken apps. keyword (at most 20 characters) searches by name; a search can be combined only with filter "installed", and it does not find port apps or portal apps, so if nothing matches, list without keyword and look through the names. Always take app IDs from this output and confirm the choice with the user.

Inputs: filter, keyword.

nas_docker_app_usageResource use of app-center Docker appsA
Read-only

Report CPU, memory, network and disk rates for Docker-based apps installed from the app center (data.usages, keyed by app ID). It only covers app-center apps: a plain container or a self-made Compose project, or a misspelled ID, comes back as all zeros without an error, so zeros do not mean idle. App IDs are the application field of nas_docker_containers. For any container's CPU and memory use nas_docker_containers instead. Rates are strings in bytes per second.

Inputs: app_ids.

nas_docker_checkPre-deployment checksA
Read-only

Check for conflicts before deploying. kind "port" tells whether a host port is taken by a container (needs port; protocol optional). kind "dir" tells whether a folder is mounted by a container (needs dir). kind "gpu" tells whether an app is using the discrete GPU of the given vendor (needs vendor; ask the user if unknown). These checks only see Docker containers: occupied: false does not guarantee that the port is free, because other services on the NAS are not covered.

Inputs: kind (required), dir, port, vendor, +1 more.

nas_docker_containersList Docker containersA
Read-only

List containers with their state, image, CPU and memory use, and published ports (data.result[]). This is the place to read a container's CPU and memory; mem_used is a string holding bytes. The status filter takes "running" or "stopped", while the status field in the response uses a different set (CONTAINER_DETAIL_STATUS_RUNNING, _EXITED, _RESTARTING, _UPDATING), so do not feed response values back into the filter. port_mappings is only filled for running containers, so an empty list does not prove that no ports are configured. Mounts, environment variables, restart policy, network mode and health checks cannot be read through this server; point the user to the Docker app on the NAS for those.

Inputs: name, type, order, status, +2 more.

nas_docker_imagesList local images or search a registryA
Read-only

source "local" (default) lists the images stored on the NAS (data.result[]), optionally filtered by name or status and sorted; image_size is a string holding bytes. To find what can be cleaned up, filter status "unused" and sort by size. source "registry" searches the remote image registry for name (data.search_image[]) and supports page and page_size. Images cannot be deleted through this server; the user has to do that in the Docker app on the NAS.

Inputs: name, page, order, source, +3 more.

nas_docker_logsRead container or project logsA
Read-only

Fetch recent log output (data.logs, one multi-line string). target "container" takes the full container_id from nas_docker_containers and returns the latest 200 entries. target "project" takes a project_name from nas_docker_projects and returns the combined log of all its containers, 200 lines in total, possibly with ANSI colour codes. There is no way to get older lines, follow the log or filter by time; for that the user needs the Docker app on the NAS.

Inputs: id (required), target (required).

nas_docker_projectsList Compose projectsA
Read-only

List Docker Compose projects (data.projects[]) with status, path, container counts and whether image updates are available. Projects that carry an application_id are managed by the app center: they cannot be deleted here and must be uninstalled with nas_app_manage. update_available is three-state: omit it for no filter, true for projects with updates, false for projects without. A status ending in _OPERATING means an operation is still in progress. data.original_total is the unfiltered project count.

Inputs: kind, name, order, status, +2 more.

nas_download_listList download tasksA
Read-only

Show the tasks of the NAS download center with their progress. Without task_ids it lists every task, including finished ones; with task_ids it returns just those, and fails as a whole if any ID does not exist. Tasks are in data.tasks[]. Use progress_percent (a number from 0 to 100) rather than dividing bytes: total_bytes can be negative while the size is unknown. saved_path and file_name are empty until task_status is TASK_STATUS_COMPLETED, which does not mean failure. When waiting for a task, check a few seconds apart and stop at COMPLETED, FAILED or PAUSED; the access token has a per-minute request quota.

Inputs: task_ids.

nas_file_checksumFile checksumA
Read-only

Compute the MD5 or SHA-256 checksum of files on the NAS, for example to verify a transfer. The NAS reads each whole file, so large files take a while: timeout_seconds applies to each file, and a file that needs longer fails with "context deadline exceeded". The result has items[], one per path; check each for success.

Inputs: paths (required), algorithm (required), timeout_seconds.

nas_file_findFind files under foldersA
Read-only

Walk one or more folders and return entries matching the filters. kind selects plain files, folders, or a media category (image, video, audio, archive, doc, font, app). Sizes take a unit suffix such as 10K or 4M. since and until are Unix seconds and need time_field to say which timestamp they apply to. Roots must be shared folders or folders inside them; a volume root is reported as an invalid root. All roots are searched in one request, so matches are in the top-level entries[] of the result, and that key is absent when nothing matched. For finding files by name across a large area, nas_search_files is faster.

Inputs: roots (required), kind, name, limit, +7 more.

nas_file_listList a folderA
Read-only

List the entries of a folder on the NAS. Omit path to list the personal folder of the logged-in user. Volume roots such as /volume1 are not accessible; start from a shared folder (see nas_file_roots). Entries are in items[0].entries[]; size and the time fields are strings holding 64-bit integers, and the mode field is unreliable, so do not use it to judge permissions. Recursive listing of a large folder can take a minute or more: prefer a deeper path, or nas_search_files when looking for a file by name.

Inputs: path, limit, recursive, timeout_seconds.

nas_file_readRead part of a fileA
Read-only

Read bytes from a file on the NAS without saving it locally. Returns { path, offset, bytes, encoding, content }: encoding is "utf8" when the bytes are valid UTF-8 text, otherwise "base64". By default the first 64 KiB are read and at most 1 MiB per call; for a longer file call again with offset increased by the bytes already read. A result with fewer bytes than requested means the end of the file was reached. To copy a whole file to this computer use nas_file_download.

Inputs: path (required), length, offset.

nas_file_rootsList shared foldersA
Read-only

List the shared folders this NAS account can access. This is the starting point whenever you do not know a path: file access is granted per shared folder, and volume roots such as /volume1 cannot be listed directly. Use the returned paths with the other nas_file_* tools. For the personal folder, call nas_file_list with no path instead.

Inputs: no named parameters.

nas_file_statFile or folder metadataA
Read-only

Get type, size and timestamps for one or more paths. The result always has items[], one per path in the order given; check each item for success, because one missing path does not stop the others. size and the time fields are strings; times are Unix seconds. The mode field is unreliable on existing paths, so do not use it to decide whether something is readable or writable.

Inputs: paths (required).

nas_file_tagsQuery file tagsA
Read-only

Query the tag system of the file manager. query "list_tags" returns all tags with their IDs. "tags_of_paths" returns the tags on the given paths (needs paths). "files_by_tag" returns the files that carry the given tags (needs tag_ids from list_tags; optionally limit it to scope_path, with recursive to include subfolders). Tag IDs are numbers taken from list_tags; never guess them.

Inputs: query (required), paths, tag_ids, recursive, +2 more.

nas_file_usageDisk usage and folder quotaA
Read-only

kind "du" reports how much space folders occupy (items[].entries[] with size, dir_count and file_count), optionally broken down to a given depth; it walks the tree and can be slow. kind "quota" reports the size limit set on a personal or shared folder: the value is in MB as a string, and "0" means no quota is set, not a quota of zero. Quotas exist only at the level of a personal or shared folder, not on subfolders or volume roots. For free space on a whole volume use nas_storage_info with kind "volumes".

Inputs: kind (required), paths (required), depth, timeout_seconds.

nas_network_infoNetwork interfaces and general network settingsA
Read-only

kind "interfaces" (default) lists network interfaces (data.ifaces[]) with link state, speed, MAC and IPv4/IPv6 settings; pass iface to see only one. To find the NAS address, take an interface whose connection is CONNECT_STATUS_CONNECTED and whose ipv4.ip_addr is not empty: decide by ip_addr, not by ipv4.status, which reads "enabled" even without an address. A speed of -1 or 0 means no link. An unknown interface name returns an empty list rather than an error. kind "general" returns the default gateway, DNS mode and servers, and proxy settings; the manual DNS list there only applies in manual mode and may differ from the per-interface DNS, so report both when asked about DNS. Network settings cannot be changed through this server.

Inputs: kind, iface.

nas_performanceLive load and resource useA
Read-only

Read the task manager. kind "overview" (default) returns CPU, GPU, memory, fans, network and disk activity in one call and is the right first step for "is the NAS slow". "cpu", "gpu", "mem", "net", "disk" and "volume" return one metric each; in net, disk and volume the entry named "overview" is the total. "processes" and "services" list resource use per process or service; sort by cpu, mem or name (pid for processes only) and top keeps the first N (0 for all). Every value is a single instant: to judge a trend, call again a few seconds later. Mind the units: network and per-process disk rates are bytes per second, whole-disk and volume rates are kilobytes per second, memory is bytes, and most numbers are strings. A temperature of 0 means unreadable. On older task manager versions every kind reports "not available"; do not retry. Processes cannot be ended and services cannot be stopped here.

Inputs: top, kind, sort.

nas_search_filesSearch files by nameA
Read-only

Search the NAS index for files and folders whose name contains the query (case-insensitive). It matches names, not file content. Give paths to limit the search to folders; subfolders are included unless recursive is false. The call waits for the search to finish and returns the first sorted page in data.results.ordered_items[], plus data.task_id. When data.next_offset is present there are more results: page through them with nas_search_results using the same sort_by and order. When data.task_removed is not true the search task is still stored on the NAS; release it with nas_search_results action "remove" when you are done. file_size and the time fields are strings. A search without paths or query can take minutes; narrow it first.

Inputs: limit, order, paths, query, +11 more.

nas_search_resultsPage, cancel or release a searchA
Read-only

Work with a search started by nas_search_files, identified by its task_id. action "page" returns another page: entries are in data.ordered_items[] (there is no results wrapper here, unlike nas_search_files). Pass the offset from the previous next_offset and the same sort_by and order as the original search, otherwise pages overlap or skip entries. The search is exhausted only when a page has no next_offset; do not use total_count to decide. "cancel" stops a search that is still running and keeps what was found. "remove" discards the stored search task and its results; it never touches any file. A task that was already removed reports "not found", which is not a failure worth retrying.

Inputs: task_id (required), limit, order, action, +2 more.

nas_statusNAS connection and server statusA
Read-only

Check whether this server can reach the NAS, and what it is allowed to do. Returns the login state (NAS address and user name, never the token), the unc CLI version, and the server policy: access level, enabled toolsets, allowed NAS paths and whether local file transfer is enabled. Call it first when another tool fails with an authentication, connection or "not available" error. Set doctor to true for a full health report with firmware and component versions and the methods this NAS does not support; that report takes longer, so do not request it before every call.

Inputs: doctor.

nas_storage_infoDisks, storage pools and volumesA
Destructive

Read storage state. kind "disks" lists internal disks with health and temperature; "volumes" lists storage volumes with total and used space, mount point and warnings; "pools" lists storage pools with RAID level, status and member disks. To answer "are my disks healthy" check both disks and pools; for "how much space is left" use volumes (free = total - used). Sizes are strings in bytes, and a total of "0" means not mounted, so do not compute usage from it. A temperature of 0 means unreadable, not zero degrees. Disk status UNSUPPORTED means health cannot be determined, which is not the same as healthy. A pool reported as GOOD can still contain a missing or unhealthy disk, so also read disks[].status; a missing disk does not make the call fail. kind "smart" returns raw SMART attributes for every disk: this is sensitive diagnostic data, needs admin access and a confirmation, and should be requested only when the user explicitly asks for it. Serial numbers are masked unless show_serial is true, which is likewise only for an explicit request. Pools and volumes cannot be created, expanded or deleted through this server.

Inputs: kind (required), show_serial, confirm_token.

nas_system_infoSystem version and hardware settingsA
Read-only

Read one group of system settings. "identity": device model and system version. "update_status": whether a system update exists (read-only; it never starts a check or an update, and UNSPECIFIED means unknown, not up to date). "fan", "beep", "cpu", "led", "zram", "power" and "ups": the corresponding control panel settings. For cpu, when is_support says frequency control is unsupported, the frequency value is meaningless. For ups, read right_now first (true means act immediately); otherwise a standby_time of "-1" means "when the UPS battery is low", not "unset". "identity", "update_status" and "zram" are missing on older control panel versions and then report "not available"; do not retry, and use nas_status with doctor: true for the firmware version instead. Nothing here can be changed through this server.

Inputs: kind (required).

nas_usersList users or groupsA
Read-only

kind "users" (default) lists NAS accounts (data.users[]): uid is a number, role is in user_base.role, group membership in user_base.groups[], and an expired account has user_base.is_expired true (there is no server-side filter for expiry, so list all and check the field). names matches exactly and is case sensitive. kind "groups" lists user-created groups with their members (data.groups[]); gid there is a string. The built-in groups admin, users and ughomeusers are not listed and cannot take new members. Passwords are never returned. Users cannot be modified or deleted and groups cannot be created through this server; that is done in the NAS control panel.

Inputs: kind, role, uids, names, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 25 tools

    Disambiguation4/5

    Each tool maps to a distinct subsystem (files, docker, apps, storage, system, network, performance), and the longer descriptions explicitly cross-reference siblings to prevent misselection (e.g. nas_search_files vs nas_file_find vs nas_file_list, nas_file_usage vs nas_storage_info, nas_docker_containers vs nas_docker_app_usage). The remaining overlap among the three file-finding tools and among the read status tools is handled well by the descriptions, though an agent could still hesitate briefly.

    Naming Consistency5/5

    Every tool uses the nas_ prefix with snake_case and a grouped domain sub-prefix (nas_file_*, nas_docker_*, nas_search_*, nas_app_*). Read-only aggregators consistently use an _info/_status noun form, giving a predictable and readable pattern throughout.

    Tool Count4/5

    25 tools is at the upper edge, but they span many genuinely distinct NAS subsystems (files, Docker, app center, storage, users, system, network, performance, downloads), so the breadth is justified rather than duplicative. It is slightly heavy but each tool has a defensible role.

    Completeness3/5

    The surface is broad but deliberately read/monitor-heavy, with obvious gaps: no file write/upload tool, and several descriptions reference tools that do not exist (nas_file_download, nas_app_manage), which will dead-end agents trying to follow the guidance. User/group creation, image deletion, and pool/volume management are also unavailable, so lifecycle coverage is partial.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI agents to control a Xiaomi Smart Storage NAS over its HTTPS WebDAV endpoint, providing 14 nas_* tools for browsing, transferring, and organizing files in /pool0/data, with recursive deletion requiring explicit confirmation.
      645 PyPI
      9
      Apache 2.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to inspect and operate a UGOS Pro NAS through its built-in HTTPS API via 25 tools covering system stats, storage volumes, files, downloads, photos, and media libraries, without SSH. Read-only tools run directly, write tools prompt for confirmation, destructive deletes require an explicit second confirmation, and it can be deployed either locally over stdio or on the NAS via Docker SSE.
      2
      MIT
    • A
      license
      C
      quality
      C
      maintenance
      Enables any MCP client to manage an fnOS NAS through natural language, covering authentication, files, AI photo search, app center, Docker, downloads, logs, monitoring, network, power, storage, users, and Baidu Netdisk via 83 tools. Built on FastMCP with bundled trim-cli binaries and OAuth 2.0 + PKCE login, it also exposes raw API passthroughs as a fallback.
      219
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables management of a UGREEN NAS running UGOS over SSH and SFTP, exposing 39 tools for system status, Docker containers/images/networks/compose, files and data transfer, backups, and network inspection. Every mutating action runs through a dry-run plan with a single-use confirmation token, so operations are reviewed before anything changes.
      76 npm
      1
      MIT