You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Renamed the binary unraid → runraid (package remains unraid-mcp; env vars and
the ~/.unraid data dir are unchanged — only the executable name moved).
Default MCP port is now 40010 (config.rsdefault_mcp_port() and config.toml
agree). Earlier docs referencing 3100/6970 were incorrect.
The binary loads ~/.unraid/.env (or /data/.env in a container) at startup via dotenvy before Config::load, so it can find its credentials without a process
manager. The loader is symlink-guarded (a symlinked .env is refused) and never
overrides already-set env vars.
CI and release builds are now linux/amd64 only — the arm64 leg (QEMU-emulated,
taking 50+ minutes per build) has been dropped from both the Docker image build and
the release binary matrix. Documented in the README prerequisites.
Added
status MCP action — a server reachability/health observability action
(requires unraid:read). MCP-only; no CLI command.
setup install and doctor CLI commands (CLI-only; not exposed as MCP actions).
Pagination/filtering on list actions (limit/offset, plus state/name filters
where relevant), returning a {items, total, limit, offset, has_more, next_offset}
envelope (MCP surface).
~40 KB truncation cap on MCP tool responses.
docker_restart action (unraid:admin), added after re-vendoring schema/unraid-schema.graphql from unraid/api@2679fda1 picked up a new DockerMutations.restart mutation.
array_set_state accepts optional decryption_password/decryption_keyfile
(MCP-only — not exposed via the CLI, to avoid putting secrets in shell
history/process listings), so an encrypted array can be started without the
web UI unlock step. Also picked up from the same schema re-vendor.
Full coverage of the remaining Unraid GraphQL surface found via the same
schema re-vendor (~142 total operations now implemented, up from 111): the
Docker Organizer subsystem (docker_create_folder, docker_create_folder_with_items, docker_set_folder_children, docker_delete_entries, docker_move_entries_to_folder, docker_move_items_to_position, docker_rename_folder; CLI parity for all
of these), plus docker_update_view_preferences / docker_update_autostart_configuration / refresh_docker_digests / reset_docker_template_mappings / sync_docker_template_paths (MCP-only
for the two JSON-blob ones); customization_set_locale / customization_set_theme; the full Onboarding lifecycle
(onboarding_bypass_onboarding, onboarding_clear_onboarding_override, onboarding_close_onboarding, onboarding_open_onboarding, onboarding_resume_onboarding, onboarding_refresh_internal_boot_context, onboarding_create_internal_boot_pool, onboarding_set_onboarding_override
— the last MCP-only, its input tree is deeply nested); connect_sign_in, setup_remote_access, enable_dynamic_remote_access (MCP-only, nested
input), update_api_settings, update_settings (MCP-only, raw JSON), update_ssh_settings, initiate_flash_backup, notify_if_unique; and the preview_effective_permissions query.
Fixed
GraphQL injection: queries now pass arguments as GraphQL variables instead of
interpolating them into the query string.
UTF-8 truncation panic: response truncation no longer splits a multi-byte character.
/status info leak: the endpoint no longer returns server details to unauthenticated
callers.
Widened the /health upstream reachability probe timeout to 5s and log the
underlying error cause on failure (was too tight, causing false-negative
"unreachable" reports under normal upstream latency).
quinn-proto bumped to 0.11.15 for RUSTSEC-2026-0185 (remote memory
exhaustion via unbounded out-of-order stream reassembly); pulled in
transitively via lab-auth → reqwest 0.13.
Stale plugin-hook contract test (tests/setup_contract.rs) that still
asserted the pre-e2c22d0 binary-direct hook command instead of the
current scripts/plugin-setup.sh wrapper.