{"name":"io.github.Omodaka9375/ugnas-mcp","slug":"omodaka9375-ugnas-mcp","title":null,"description":"Generic MCP server for UGREEN NAS (UGOS) over SSH — 39 tools with dry-run safety.","url":"https://mcp.market/server/omodaka9375-ugnas-mcp","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":27,"stars":1,"forks":0,"downloads_week":79,"last_push_at":"2026-10-19T10:12:57.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Omodaka9375/ugnas-mcp","website":null,"version":"0.1.2","remotes":[],"packages":[{"registryType":"npm","identifier":"ugnas-mcp","version":"0.1.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"Path to the config JSON (default: ~/.ugnas-mcp/config.json). See the README for the schema.","format":"string","name":"UGNAS_MCP_CONFIG"},{"description":"NAS host, e.g. 192.168.1.50. Overrides the config file.","format":"string","name":"UGNAS_HOST"},{"description":"SSH username. Overrides the config file.","format":"string","name":"UGNAS_USER"},{"description":"Path to the SSH private key (alternative to UGNAS_PASSWORD).","format":"string","isSecret":true,"name":"UGNAS_KEY_PATH"},{"description":"SSH password (alternative to UGNAS_KEY_PATH).","format":"string","isSecret":true,"name":"UGNAS_PASSWORD"},{"description":"SSH port. Overrides the config file.","format":"string","name":"UGNAS_PORT"},{"description":"Base directory for relative tool paths (default /volume1).","format":"string","name":"UGNAS_DEFAULT_SHARE"},{"description":"Pinned SSH host key fingerprint (SHA256:...).","format":"string","name":"UGNAS_HOST_KEY_SHA256"}]}],"tools":[{"name":"backup.create","description":"Archive a directory into a .tar.gz on the NAS. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"backup.list","description":"List backup archives (*.tar.gz, *.tgz, *.tar, *.zip) in a directory. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"backup.restore","description":"Extract a .tar.gz archive into a destination directory. Destructive: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"backup.schedule","description":"Install a cron job that runs recurring backups. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"backup.verify","description":"Check a backup archive exists, compute its checksum, and list its entry count. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.compose","description":"Run `docker compose up -d` / `down` / `restart` for a stack directory on the NAS. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"docker.containers.inspect","description":"Return full `docker inspect` JSON for one container. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.containers.list","description":"List Docker containers on the NAS with id, name, image, state and status. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.containers.logs","description":"Fetch the most recent log lines from a container. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.containers.remove","description":"Delete a container. Destructive: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"docker.containers.restart","description":"Restart a container. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.containers.start","description":"Start a stopped container. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.containers.stop","description":"Stop a running container. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.images.list","description":"List locally stored Docker images. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.images.pull","description":"Pull an image from its registry. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.images.remove","description":"Remove a local image. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"docker.networks.connect","description":"Attach a container to a network. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.networks.create","description":"Create a Docker network. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"docker.networks.disconnect","description":"Detach a container from a network. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.networks.inspect","description":"Return `docker network inspect` JSON (subnets, attached containers). Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.networks.list","description":"List Docker networks. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"docker.networks.remove","description":"Remove a Docker network. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files.copy","description":"Copy a file or directory within the NAS (or NAS-to-NAS). Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.download","description":"Download a file from the NAS to the local machine via SFTP. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.find","description":"Search for files by name glob and/or extension across a directory tree. Read-only. Returns path, size, modified time, and extension for each match.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.list","description":"List a directory on the NAS (name, type, size, owner, modified). Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.mkdir","description":"Create a directory. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files.move","description":"Move or rename a path on the NAS. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.remove","description":"Delete a file or directory. Destructive: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files.sync","description":"Sync a path to another on the NAS (or NAS-to-NAS) with rsync. A trailing slash on the source means 'contents', otherwise 'the directory'. If rsync is missing on the NAS, pass fallback:'cp' to use a built-in copy fallback (no delete/mirror). Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.thumbnail","description":"Generate a preview thumbnail of an image or video on the NAS with ffmpeg and download it locally. For videos a frame is captured (default 1s in). Mutating (it writes a file on the local machine): returns a dry-run plan unless a confirmation token is supplied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files.upload","description":"Upload a local file to the NAS via SFTP. Mutating: returns a dry-run plan unless a confirmation token is supplied.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files.usage","description":"Report disk usage (`du`) for a path, optionally per subdirectory. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"network.interfaces","description":"List host network interfaces with IPv4/IPv6 addresses and scopes. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"network.ports","description":"Show listening TCP/UDP sockets and the processes bound to them. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"network.routes","description":"Show the host IPv4 and IPv6 routing tables. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system.info","description":"Report system details: OS release, CPU cores, load average, memory, temperatures, mounted disks, and Docker version. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system.pools","description":"Report storage pool and RAID health: mdadm arrays and degradation state, LVM volume/logical/physical volumes, btrfs devices, block devices and filesystems. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"system.status","description":"Test connectivity to the configured UGREEN NAS over SSH and report hostname, kernel, uptime, and whether Docker is available. Read-only.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-10-28T18:34:08.474Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-28T18:34:08.427Z","components":{"code":{"score":25,"max":25,"notes":["29 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 9 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"ugnas-mcp","version":"0.1.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-10-17T14:44:25.250Z","repositoryUrl":"git+https://github.com/Omodaka9375/ugnas-mcp.git","weeklyDownloads":79}],"repo":{"found":true,"owner":"Omodaka9375","repo":"ugnas-mcp","archived":false,"pushedAt":"2026-10-19T10:12:57Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/39777434?v=4","ownerCreatedAt":"2018-05-30T19:07:37Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/39777434?v=4&s=128","source":"github"},"presence":{"stars":1,"forks":0,"downloadsWeek":79,"license":"MIT","lastPushAt":"2026-10-19T10:12:57.000Z","score":27}}}},"grade_history":[],"reviews":[]}