Releases: nucleusv/linux-mcp-daemon
Release list
v0.3.5
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.3.5Or install a package below: sudo apt install ./linux-mcp-daemon_0.3.5_amd64.deb / sudo dnf install ./linux-mcp-daemon-0.3.5-1.x86_64.rpm (arm64: _arm64.deb / .aarch64.rpm) - next steps.
Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.3.5 (linux/amd64, linux/arm64).
Changelog
Features
- e4d7ec2 feat(mcpd): stdio mode - MCP over stdin/stdout, as the caller, never root
Other
- 8ed63f4 release: v0.3.5 notes, Release Notes docs page, 0.3.5 in the install commands
Upgrading from 0.3.4
Nothing to change: configs, tools and their output are the same.
- New:
mcpd stdio- MCP over stdin/stdout for clients that start a server as a local process: this machine (claude mcp add linux -- mcpd stdio), a remote server over SSH with no open port (ssh host mcpd stdio), or inside a container (docker exec -i app mcpd stdio --user app). No daemon, token or TLS. Calls run as the user who started mcpd and never as root:privileged: trueis refused andmcp-sudo.yamlis not read; started as root, mcpd needs--user NAME. Stdio mode. - Notifications are no longer answered. A client's
notifications/cancelled(or any message without anid) used to get aMethod not foundreply withid: null; JSON-RPC forbids replying to a notification. - Listed in MCP catalogs: the official MCP Registry (
io.github.nucleusv/linux-mcp-daemon) and Glama. - Docs: a Release Notes page: what changed in each release.
v0.3.4
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.3.4Or install a package below: sudo apt install ./linux-mcp-daemon_0.3.4_amd64.deb / sudo dnf install ./linux-mcp-daemon-0.3.4-1.x86_64.rpm (arm64: _arm64.deb / .aarch64.rpm) - next steps.
Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.3.4 (linux/amd64, linux/arm64).
Changelog
Security
- 0b09c51 fix(security): a privileged call with no host in view fails instead of running inside the container
Bug fixes
- f3e7cb9 fix: clearer root hint and container error
Other
- 7e505b2 configs: comment every grant of the privileged reference block
- 8dcee77 docs(mcp-sudo): Docker's --privileged vs a call's privileged: true
- a593c42 docs(mcp-sudo): why paths: ["/"] follows symlinks; containers without --pid host now fail
- 2d4092b docs(site): Architecture right after Introduction in the sidebar
- ffdd727 release: v0.3.4 notes; v0.3.4 in the install commands
Upgrading from 0.3.3
- In a container, a privileged call now always reaches the host - or fails. With
worker.containerized: true(the container image's config), a container started without--pid hostsees its own PID 1; aprivileged: truecall used to run as root inside the container without an error, while the caller believed it acted on the host. It now fails withcannot switch to the host's filesystem - is the mcpd container running with --privileged --pid host?, and mcpd warns at startup. Start the container with--privileged --pid hostas the install shows; if mcpd runs directly on the host withworker.containerized: true, set it tofalse. Details. - Clearer messages: a permission error for a tool the user may run as root names the tool and where it's granted (
files/read is granted to you as root in mcp-sudo.yaml: retry with privileged: true). - Docs: the mcp-sudo page shows the full reference config with a comment on every grant, and explains Docker's
--privilegedversus a call'sprivileged: true.
v0.3.3
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.3.3Or install a package below: sudo apt install ./linux-mcp-daemon_0.3.3_amd64.deb / sudo dnf install ./linux-mcp-daemon-0.3.3-1.x86_64.rpm (arm64: _arm64.deb / .aarch64.rpm) - next steps.
Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.3.3 (linux/amd64, linux/arm64).
Changelog
Security
- fc2e55d fix(security): a uid 0 MCP user is a config error
- 003c9f6 fix(security): refuse MCP users that map to a uid 0 account
Features
- 0d63cae feat(linuxctl): -k / -tls-insecure / MCP_TLS_INSECURE replace -insecure / MCP_INSECURE
- 2061c52 feat(linuxctl): errors to stderr, and -silent / -s to drop them
- f065434 feat: TLS by default, with a generated self-signed certificate
- ac90d7b feat: penguin logo; the image no longer bundles the docs site
- 9c2a826 feat: processes/list and processes/top JSON in bytes
- b486952 feat: sizes in bytes by default everywhere, human_readable for units
Bug fixes
- 9785164 fix(install.sh): the security note follows the installed config
- 890ce58 fix(rpc): disks/free, disks/usage and files/list descriptions say sizes are bytes by default
- 717a63e fix: findings from the live tool-by-tool test on the systemd host
Other
- 8d8125c docs(ci): /next/ is for checking docs before a release - not in versions.json
- c085f33 docs(site): blue-grey call to action and a navy 'unreleased' banner
- afec62f docs(site): colors from the penguin logo
- d2bfc76 docs(site): label the current release 'vX.Y.Z (current)'
- a0ac42e docs(site): the newest release is labelled 'current' in the version menu
- 922a5ca docs(site): version menu - 'current (vX.Y.Z)' first, older releases below, main last
- b3c07e7 docs(site): versioned docs - latest release at the root, each release under /vX.Y.Z/, main under /next/
- 59b9a40 docs(site): versions.json lists every version with its URL, in menu order
- bdc9dfa investigations: backlog 27 - disks/usage prints the path first
- fd964e1 investigations: backlog item 26, compare with two other Linux MCP servers
- cc3b1a3 investigations: item 26 findings - os-mcp and Mohabdo21/linux-mcp compared
- b096134 release: per-release notes from docs/release-notes/.md, v0.3.3's upgrade notes
- 1094ed2 test(connections): TestMatchesSS retries until ss and /proc agree
Upgrading from 0.3.2
- Sizes are bytes by default in every tool's text output;
human_readable: truegivesdf -h/free -h-style units. JSON field renames:processes/listrss_kb→rss_bytes;processes/topmem_mib/swap_mib→mem_bytes/swap_bytes,virt_kib/res_kib/shr_kib→virt_bytes/res_bytes/shr_bytes. - TLS is on by default for new installs (a generated self-signed certificate on 9091; plain HTTP off). An existing
daemon.yamlwithout aserver.httpblock keeps serving plain HTTP as before.linuxctldefaults tohttps://localhost:9091and trusts the server byMCP_TLS_FINGERPRINTorMCP_CA_CERT(linuxctl describe mcpd tlsshows the fingerprint). - An MCP user whose OS account is root (uid 0) is a config error - mcpd won't start with one. Map MCP users to unprivileged accounts and grant root per tool.
- Root grants on path tools need
paths:(files/*,disks/usage,disks/free;paths: ["/"]for everything) - an error on reload andlinuxctl edit, a warning at startup. - linuxctl:
-insecure/MCP_INSECUREare now-tls-insecure/-k/MCP_TLS_INSECURE; errors go to stderr,-silent/-sdrops them. - The container image no longer serves
/docs/; the documentation is at https://nucleusv.github.io/linux-mcp-daemon/ (now versioned - this release's is at https://nucleusv.github.io/linux-mcp-daemon/v0.3.3/).
New: Permissions and Risks - read it before granting root.
v0.3.2
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.3.2Or install a package below: sudo apt install ./linux-mcp-daemon_0.3.2_amd64.deb / sudo dnf install ./linux-mcp-daemon-0.3.2-1.x86_64.rpm (arm64: _arm64.deb / .aarch64.rpm) - next steps.
Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.3.2 (linux/amd64, linux/arm64).
Changelog
Bug fixes
- 5bb7a4f fix(docs-ci): build the site for GitHub Pages' /linux-mcp-daemon/ baseUrl
v0.3.1
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.3.1Or install a package below: sudo apt install ./linux-mcp-daemon_0.3.1_amd64.deb / sudo dnf install ./linux-mcp-daemon-0.3.1-1.x86_64.rpm (arm64: _arm64.deb / .aarch64.rpm) - next steps.
Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.3.1 (linux/amd64, linux/arm64).
Changelog
Security
- c649604 fix(security): root file tools under a paths: limit never follow symlinks
Features
- f5c18e5 feat(logging): readable text format - time, level and message without keys
Bug fixes
- 827472c fix(logging): startup/listen failures are logged at ERROR at any level
v0.3.0
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.3.0Or install a package below: sudo apt install ./linux-mcp-daemon_0.3.0_amd64.deb / sudo dnf install ./linux-mcp-daemon-0.3.0-1.x86_64.rpm (arm64: _arm64.deb / .aarch64.rpm) - next steps.
Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.3.0 (linux/amd64, linux/arm64).
Changelog
Features
- 39784de feat(packaging): .deb and .rpm packages for amd64 and arm64
- 67af8a3 feat: leveled, structured daemon logging (log/slog)
- 1cb1048 feat: native files/filetype and network/connections (no file(1), no ss)
Bug fixes
- eb10c8b fix(reload): don't list daemon.yaml twice when users still live in it
v0.2.0
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.2.0Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.2.0 (linux/amd64, linux/arm64).
Changelog
Features
- 2bde2c0 feat(files): ls -la style files/list; files/chmod and files/chown that never follow symlinks
- 4c9441c feat(install): macOS mode installs the linuxctl CLI
- 799ae10 feat: reload config without restart (daemon/reload-config); users move to users.yaml
Bug fixes
- da65dce fix(config): grant files/stat to privileged; check_docs.sh covers resources and templates
- 57375a3 fix(docker): copy docs/imgs into the docs build stage
- 0c1ed4b fix(files/chmod): accept numeric modes (linuxctl sends 0755 as 755)
- 39880d8 fix(linuxctl): positional args fill a tool's required fields; docs for list/chmod/chown
- 56ba273 fix: enforce paths: for every path tool; linuxctl exit codes and flags; configs at /etc/mcpd/configs
Other
- 6f5ef32 ci: move release actions to their Node 24 majors; pin ubuntu-24.04
- fafb636 docs(backlog): leveled daemon logging; mark done items
- 51881ab docs(install): fix gaps found by a from-scratch newcomer install
- 654121b docs(install): newcomer walkthrough of the current code - upgrades, containers, no-systemd
v0.1.0
Install or upgrade on Linux (systemd):
curl -fsSL https://raw.githubusercontent.com/nucleusv/linux-mcp-daemon/main/scripts/install.sh | sudo bash -s -- --version v0.1.0Container image: ghcr.io/nucleusv/linux-mcp-daemon:0.1.0 (linux/amd64, linux/arm64).
Changelog
Security
- 73aec77 feat(security): native sysctl, and per-user sysctl write restrictions
- 9068ad8 feat(security): per-tool network destination restrictions for curl/ping
- 3a7c7ac fix(security): input validation audit across all tools and resources
- 64d1948 fix(security): sysctl write-policy check must fail closed; accept numeric values
- c2e8212 refactor(security): drop sysctl.read_only; testuser gets glob write_keys
Features
- a36f6b8 feat(cli): gracefully format nested JSON arrays and objects in table outputs
- 887e38c feat(cli): recursively render nested arrays of objects as subtables
- 0b9ab97 feat(cli): set list as default command for groups
- 095e9c5 feat(linuxctl): bash/zsh completion, MCP_SERVER, table/json/yaml fixes
- 20b65bc feat(release): versioned builds, release pipeline, install script
- ea10d7d feat(tools): add disks/mounts, users/list, and logs/logins
- f0eb4a2 feat(tools): add services/list tool for listing systemd services
- d746824 feat: add automatic host-access for containerized deployments, system/packages tool, and fix multiple registry/config bugs
- bf3596d feat: add disks/iostat tool to read /proc/diskstats
- 3cea2cc feat: add disks://{name}/stats resource
- 421b741 feat: add fdisk, smartctl, lsblk, traceroute to system tools pack
- 448a44c feat: add network statistics to interfaces resource
- 2f508a4 feat: add network://interfaces/{name} resource template
- 816f7e2 feat: add robust binary file detection logic and fix curl build
- 4be3a4a feat: complete implementation of file group tools (create, update, find, type)
- 1a23cd5 feat: disks/list renders an lsblk-style device tree
- 127b062 feat: implement files/read precision streaming with line and byte offsets
- 8691e56 feat: implement files/stat and files/content resource endpoints with strict context truncation
- 95d52b5 feat: implement linuxctl verb/group grammar, UID pinning, docs restructure
- 2cb0c80 feat: implement process resource templates
- f06f5e6 feat: implement system operations & debugging pack (dbus services, journalctl, dmesg, sysctl)
- ae51714 feat: local-only linuxctl mcpd user/token admin, salted token hashes
- 5f9d96d feat: processes/top - a native
top -b -n 1; syscall.Kill for delete
Bug fixes
- 1394f72 fix(auth): protect cached resources from being served to unauthorized users by adding pre-authorization checks
- 80f154c fix(config): update mcp-sudo.yaml to use valid array structure for static resources
- 3a60057 fix(docs): escape curly braces for MDX
- 63bb872 fix(linuxctl): readable YAML from mcpd user create; accurate next steps
- 1838355 fix(linuxctl,top): table/wide rendering - column order, cells, top layout
- 619478d fix(mcp): split resourceTemplates into official resources/templates/list JSON-RPC protocol endpoint
- d2d6c7e fix(network): correctly export ReadRoutes signature and add routes package import
- a66d458 fix(tools): remove literal backslashes from OutputFormat json struct tags
- 66008d7 fix: add ARM64 fallbacks for cpuinfo extraction
- 73d4316 fix: build mcpd for the actual target architecture, not hardcoded arm64
- 4b6efcc fix: linuxctl arg parsing and rpc schema updates
- 25760da fix: native disks/partitions, journal-control gaps, linuxctl table formatting
- edf625f fix: packages lists packages; interfaces read in a worker; disks/health usable
- 3d2ad2d fix: rename get mcp meta-group to get mcp-api (avoid mcpd confusion
- 91b0990 fix: resolve JSON formatting errors in cpu/list and disks/usage tools
- 55b1130 fix: resolve sudoConfig undefined compilation error
- c604f3d fix: setns(CLONE_NEWNS) fails to compile on linux/amd64
Other
- e892ea9 Add README
- bab3e07 Add inline Go documentation to tool parameter structs
- d773496 Add man pages for mcpd and linuxctl
- 9c7ee45 Add pure Go disk_free and disk_usage tools
- 0c92d74 Add tools_group metadata to tool schemas
- c298169 CLI: Add 'linuxctl stdio' command to proxy JSON-RPC between Claude Desktop and Daemon
- abceed1 CLI: Add smart positional argument mapping for path parameters
- 6869e7a CLI: Drop verb, support / syntax with suffix matching
- 7c7299c CLI: Implement syntax based on tools_group metadata
- 582d1b9 CLI: Refactor linuxctl to use kubectl Verb + Resource paradigm
- afceeb8 CLI: Refactor linuxctl to use tools_group dynamic command tree
- e6d9473 Change base image to ubuntu and install tools
- 8e2e480 Daemon: Implement MCP initialization and ping lifecycle methods
- 399b621 Docs: Add Configuration section for daemon.yaml and mcp-sudo.yaml
- 845f8e7 Docs: Update linuxctl man pages for new / syntax
- b619101 Feature: Implement native TLS support in daemon
- c2dab8d Feature: Support concurrent HTTP and HTTPS port binding
- c7b1435 Finish Phase 2: MCP Protocol Compliance and Isolated Resources
- 4f36992 Finish Phase 3: Implement devices as isolated worker resources
- 4e7a0a1 Fix worker permission denied by moving mcpd out of /root
- 5e9d1f3 Fix: Force rollout restart in deploy script to ensure new local image layers are loaded by Kubernetes
- 4da8c1d Fix: Set deployment strategy to Recreate to avoid hostNetwork port conflicts during rollouts
- 3b426bd Implement Ephemeral Workers, get_sudo_rules, and Dynamic Sudo Discovery
- 588e06f Implement Phase 5: Native Network tools (ping, arp, curl, nslookup)
- 78375e8 Implement SSE, JSON-RPC routing, Rate Limiter and list_directory tool
- 96413c8 Implement Singleflight caching and advanced du parameters
- f61acf0 Implement advanced parameters for du and df tools
- 988120d Implement deep nesting group/action/name folder structure
- e76d557 Implement per-tool timeout overrides in daemon config
- ddb08c9 Implement worker timeouts via context.WithTimeout
- cc5c70d Initial commit
- 19c84ae Initialize docs-website with Vite and premium design
- 22882f5 Install man-db and add man pages to Docker image
- a54ce32 Migrate documentation site to Docusaurus and serve via daemon
- 671b1e1 Move struct documentation inline
- 02d122b Pipeline: Use dynamic container tags to fix stale Kubernetes deployments and dynamically map expected doc routes in tests
- 74cc88b Refactor tools into subpackages
- 4629382 Refactor: Move docs-website into docs/website
- cc8de53 Refactor: Update mcp-sudo.yaml to use privileged map schema with paths validation
- 679f3fb Rename du.go to disk_usage.go and df.go to disk_free.go
- 58f98a3 Restructure plan directory into tools and resources
- f4e36d5 Scripts: Add master run_all.sh script to build, deploy, and test the entire stack
- 954607c Tests: Add end-to-end integration testing for MCP SSE protocol and documentation server
- 44b739d Tests: Add get_disk_space to linuxctl test suite
- d18950e Tests: Add linuxctl tes...