ugreen-nas-mcp
Manages Docker on the NAS: lists containers (with CPU, memory, port info) and local/repository images, lists and controls Compose projects (start, stop, restart, delete), creates Compose projects from YAML, pulls images, reads container/project logs, checks port/directory/GPU availability before deployment, and rebuilds container apps from the NAS app center.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ugreen-nas-mcp check the health of my NAS drives"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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──▶ 你的 NASserver 只做两件事:把 unc 的命令映射成带参数校验的 MCP 工具,并在中间加一层你能控制的权限边界。它不读、不存、不回显你的访问令牌。
Related MCP server: UGOS Pro MCP Server
前置条件
Node.js 20 或更高。
已安装
unc(绿联 UGOS Pro 开放 CLI 的官方命令行工具),按绿联官方说明安装。装好后在终端运行unc version应能看到版本号。一个访问令牌,在 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-mcpCodex(~/.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。
环境变量
变量 | 默认 | 说明 |
| 无 | NAS 地址。 |
| 无 | 访问令牌。同上;不设则使用 |
|
| 访问级别: |
| 全部 | 启用的工具组,逗号分隔: |
| 不限 | 允许访问的 NAS 文件夹,逗号分隔,如 |
| 未设 | 上传、下载可以读写的本机目录。不设则没有上传、下载工具 |
| 自动查找 |
|
|
| 单次返回的字符上限,超出部分截断 |
权限模型
开箱是只读的。要让 agent 能改东西,必须由你在配置里显式放开。
访问级别
级别 | 允许的操作 | 工具数 |
| 只读查询 | 25 |
| 另加「只新增、不覆盖、不中断服务」的操作:建目录、建新文件、复制、从回收站恢复、打标签、创建和暂停下载任务、拉取镜像 | 33(配置了本机目录时 35) |
| 另加删除、移动、覆盖、改配额、启停容器与应用、创建和删除 Compose 项目、安装和卸载应用、创建用户 | 44(配置了本机目录时 46) |
超出当前级别的工具不会注册,agent 看不到也调不了。有些工具的风险取决于参数,例如 nas_file_copy 默认属于 write,带 on_conflict: "replace" 就属于 admin。
两段式确认
所有 admin 级的调用分两步:
第一次调用只做预演(
unc --dry-run),返回预演结果和一个确认码,NAS 上什么都不变。第二次调用带上同样的参数和确认码,才真正执行。
确认码一次有效、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。
核心
工具 | 风险 | 说明 |
| read | 登录状态、 |
file
工具 | 风险 | 说明 |
| read | 列出可访问的共享文件夹,不知道路径时从这里开始 |
| read | 列目录;省略路径列个人文件夹 |
| read | 读取文件的一段内容 |
| read | 类型、大小、时间等元数据 |
| read | 按名称、类型、大小、时间在目录下查找 |
| read | 目录占用空间,或目录配额 |
| read | MD5 或 SHA-256 |
| read | 查询标签、文件的标签、带某标签的文件 |
| write | 新建目录 |
| write | 新建文件,目标已存在则失败 |
| write → admin | 复制到已有目录;覆盖同名文件属于 admin |
| write | 从回收站恢复 |
| write → admin | 新建标签、打标签;删除标签属于 admin |
| write → admin | 本机文件上传到 NAS,需本机目录;覆盖属于 admin |
| write | NAS 文件下载到本机,需本机目录 |
| admin | 移动或重命名 |
| admin | 删除,默认进回收站 |
| admin | 覆盖或追加已有文件 |
| admin | 设置目录配额 |
search
工具 | 风险 | 说明 |
| read | 全局按文件名搜索 |
| read | 翻页、取消或释放一次搜索 |
docker
工具 | 风险 | 说明 |
| read | 容器列表,含 CPU、内存、端口 |
| read | 本地镜像,或搜索镜像仓库 |
| read | Compose 项目列表 |
| read | 容器或项目的最近日志 |
| read | 部署前检查端口、目录、独显占用 |
| read | 应用中心 Docker 应用的资源占用 |
| write | 拉取镜像 |
| admin | 启动、停止、重启容器 |
| admin | 启动、停止、重启、删除 Compose 项目 |
| admin | 用 YAML 创建 Compose 项目 |
| admin | 重建应用中心的容器应用 |
download
工具 | 风险 | 说明 |
| read | 下载任务与进度 |
| write | 让 NAS 下载一个链接 |
| write → admin | 暂停、继续、重试;移除任务或作用于全部任务属于 admin |
app
工具 | 风险 | 说明 |
| read | 应用列表或搜索(精简输出) |
| read | 单个应用详情,或安装与运行状态 |
| admin | 安装、更新、卸载、启动、停止应用 |
storage
工具 | 风险 | 说明 |
| read → admin | 磁盘、存储池、存储卷;SMART 原始数据属于 admin |
ctl
工具 | 风险 | 说明 |
| read | 用户或群组列表 |
| read | 系统版本、更新状态、风扇、电源、UPS 等设置 |
| admin | 创建用户 |
| admin | 向群组添加成员 |
network 与 taskmgr
工具 | 风险 | 说明 |
| read | 网卡、IP、网关、DNS、代理 |
| 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 工具的预演步骤,不发送确认码。
许可证
Available Tools
25 toolsnas_app_getApp details or statusARead-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 appsARead-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 appsARead-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 checksARead-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 containersARead-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 registryARead-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 logsARead-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 projectsARead-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 tasksARead-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 checksumARead-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 foldersARead-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 folderARead-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 fileARead-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 foldersARead-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 metadataARead-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 tagsARead-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 quotaARead-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 settingsARead-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 useARead-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 nameARead-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 searchARead-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 statusARead-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 volumesADestructive
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 settingsARead-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 groupsARead-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
Scored across 25 tools
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.
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.
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.
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
Related MCP Connectors
Reach your own computers from any AI app: files, search, commands, approvals and outage alerts.
- DNS-DATA RemoteDeprecatedcom.dns-data
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Connect AI assistants to your approved computer for files, commands, browser and desktop tasks.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables 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 PyPI9Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables 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.2MIT
- AlicenseCqualityCmaintenanceEnables 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.219MIT
- AlicenseNot gradedqualityBmaintenanceEnables 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 npm1MIT