Releases: staticrevolution-com/sr-truenas-mcp
Release list
v1.2.1 — reporting_get_data forwards unit/page
Patch. Completes the 2026-08-21 field report. Additive parameters only — no action surface change, no change to existing call behaviour.
Fixed — unit and page are forwarded
Both were discarded before the call, so a caller paging backwards received correctly-shaped data for the last hour with nothing to indicate the parameters had been ignored. The query schema accepts both, and its additionalProperties is false, so middleware would have rejected them loudly — silently dropping them was the only reason it went unnoticed.
page is not an index. unit: "HOUR", page: 3 returns the last three hours, not the third hour back. unit and start/end are mutually exclusive (the API rejects the combination) and page requires unit; both are now rejected client-side with a clear message.
Documented — two gaps closed without new actions
Enumerating middleware (781 methods on 26.0.0-BETA.1) settled both:
- Kernel log is unreachable — no method exposes the ring buffer, and containers can't substitute without
CAP_SYSLOG. TROUBLESHOOTING.md now records the substitute that works: cgroupmemory.eventsplusState.OOMKilled, which is what separates a host-wide OOM from a cgroup-limit kill. - No memory/swap/ARC action will be added — memory and ARC compose from a single
reporting_get_datacall, cheap now thatdetaildefaults to"summary". Swap has no middleware source at all.
272 tests pass. Action count (270) and safety tiers unchanged.
v1.2.0 — usable reporting windows, summary-by-default responses
Fixes the two reporting_get_data defects found during a live memory-pressure investigation against TrueNAS 26.0.0-BETA.1. Full write-up: docs/FIELD-REPORT-2026-08-21-reporting-and-diagnostics.md.
Fixed — start/end were unsatisfiable
Neither spelling worked. The Zod schema demanded a string, middlewared's query schema demands an integer epoch, and the value was forwarded verbatim — so a string returned query.start: Input should be a valid integer while a number never got past the schema. ISO 8601 was never converted despite the parameter description promising it, which left the no-argument call and its fixed last-hour window as the only thing that worked.
Both now accept epoch seconds (number or string) or ISO 8601 and coerce to integer epoch seconds. An inverted window is rejected up front instead of being passed upstream.
Changed — responses default to a summary
A two-graph, one-hour query returned 400,403 characters (3,601 points per graph at 1s resolution), while the aggregations block the payload already carries is ~200 bytes and answers most of what these graphs get consulted for.
detail now defaults to "summary" — keeps aggregations, legend, start, end; drops the raw series; reports the elided count as data_points.
data should pass detail: "raw". detail: "downsampled" returns roughly max_points rows (default 120), bucketed to preserve each bucket's minimum and maximum — a mean-based reduction erases exactly the spikes and troughs the series is read for.
aggregate's description is also corrected: it adds the aggregations block and does not reduce the size of data.
Notes
Minor rather than major: the change is additive with a documented opt-out, following the precedent of 1.1.2, which altered the content of every response (secret redaction) as a patch. No action surface change — 270 registered actions and the tier counts are unchanged. 268 tests pass.
v1.1.2
Bug-fix + hardening release. Verified against TrueNAS-26.0.0-BETA.1. Full details in CHANGELOG.md.
Security
- Fixed a response-filter bypass that returned sensitive fields (e.g. VM display passwords) in cleartext in tool-call responses. Resource reads were unaffected.
Fixed
- The confirm gate is satisfiable again for create/update actions —
confirmno longer leaks into strict upstream payloads (and is now a first-class top-level dispatcher field). vm_device_create/vm_device_updatenestdtypeunderattributesas current middleware requires.dataset_set_permissions(was non-functional),replication_restorevalidation,vm_display_uri,vm_update,alertservice_test, andcpu_modeunderscore tolerance.
Changed
- Long-running
@jobactions return a structured descriptor instead of a bare job id. - Safety tiers tightened: iSCSI creates and the
*_runfamily are now tier-2 (93 tier-2 / 157 tier-3). - Unknown params are dropped centrally (registry
.strip()).
v1.1.1
Bug-fix release carrying the TrueNAS 26.0.0-BETA.1 field-report fixes — the same code as the withdrawn v1.0.1, renumbered to sit above the 1.1.0 image that was running in production. No new actions, no schema changes, no breaking changes.
Why 1.1.1 and not 1.0.1: the production gateway was pinned to an orphaned :1.1.0 GHCR image left over from before the 2026-05-01 history rewrite (which consolidated the old internal 1.0.0/1.0.1/1.1.0 tags into the single public 1.0.0). A patch cut from master as 1.0.1 would have numbered below the deployed image. Current master is a superset of that orphaned 1.1.0 (same 270-action / 17-category surface plus these fixes), so 1.1.1 deploys the fixes with zero surface loss. v1.0.1 is withdrawn — do not deploy it.
Fixed
- API errors no longer collapse to "API call failed." The client now surfaces middlewared's
errname+ first line ofreason(e.g.[EZFS_EXISTS] ... dataset already exists); the legacymessage/codeshape still works. - Filesystem write handlers no longer report false success.
filesystem.chown/setperm/setaclare@jobmethods — the handlers now wait for the job and surface its terminal state (a FAILED/ABORTED job is an error). filesystem_mkdirverifies the directory exists after creating it, anddataset_createwarns when the new dataset is left unmounted (both seen against 26.0.0-BETA.1).- Discovery errors no longer render an empty action list. Unknown categories now list valid categories; unknown actions list that category's actions.
Changed
- Category-list discovery output points callers at
system_version. - 226 tests (was 211).
Full triage record: docs/FIELD-REPORT-2026-06-12-truenas-26.md.
Full changelog: v1.0.0...v1.1.1
v1.0.1 — WITHDRAWN (superseded by v1.1.1)
Withdrawn — do not deploy. This release was numbered below the 1.1.0 image that was running in production (an orphaned pre-rewrite artifact). The identical fix code was re-released as v1.1.1, which sorts above the deployed version. Use v1.1.1.
v1.0.0 — Initial public release
First public release of sr-truenas-mcp.
A hardened Model Context Protocol server for TrueNAS SCALE. 270 safety-tiered actions across 17 categories, exposed through a single hierarchical truenas tool. Forked from spranab/truenas-mcp; transport migrated from REST to WebSocket JSON-RPC 2.0, four-tier safety classification, layered response filtering, path / dataset-name validation, fail-closed registration.
Licensed under PolyForm Noncommercial 1.0.0 — free for personal, educational, governmental, and research use. Commercial use requires a paid commercial license; email admin@staticrevolution.com. Upstream MIT attribution preserved in NOTICES.
See CHANGELOG.md for the full development log.
Assets
sr-truenas-mcp-linux-x64.tar.gz— standalone Linux x64 binary, no Node.js install required (~21 MB)sr-truenas-mcp-linux-x64.tar.gz.sha256— SHA-256 checksum of the tarballsr-truenas-mcp-linux-x64.spdx.json— SPDX SBOM of the buildsr-truenas-mcp-1.0.0.tgz— npm package (Node.js 20+)
Verifying the binary
sha256sum -c sr-truenas-mcp-linux-x64.tar.gz.sha256
tar -xzf sr-truenas-mcp-linux-x64.tar.gz
./sr-truenas-mcp --version
# Expected: 1.0.0+6210ee8