fix: address 54 MEDIUM/LOW priority PR review issues

Comprehensive fixes across Python code, shell scripts, and documentation
addressing all remaining MEDIUM and LOW priority review comments.

Python Code Fixes (27 fixes):
- tools/info.py: Simplified dispatch with lookup tables, defensive guards,
  CPU fallback formatting, !s conversion flags, module-level sync assertion
- tools/docker.py: Case-insensitive container ID regex, keyword-only confirm,
  module-level ALL_ACTIONS constant
- tools/virtualization.py: Normalized single-VM dict responses, unified
  list/details queries
- core/client.py: Fixed HTTP client singleton race condition, compound key
  substring matching for sensitive data redaction
- subscriptions/: Extracted SSL context creation to shared helper in utils.py,
  replaced deprecated ssl._create_unverified_context API
- tools/array.py: Renamed parity_history to parity_status, hoisted ALL_ACTIONS
- tools/storage.py: Fixed dict(None) risks, temperature 0 falsiness bug
- tools/notifications.py, keys.py, rclone.py: Fixed dict(None) TypeError risks
- tests/: Fixed generator type annotations, added coverage for compound keys

Shell Script Fixes (13 fixes):
- dashboard.sh: Dynamic server discovery, conditional debug output, null-safe
  jq, notification count guard order, removed unused variables
- unraid-query.sh: Proper JSON escaping via jq, --ignore-errors and --insecure
  CLI flags, TLS verification now on by default
- validate-marketplace.sh: Removed unused YELLOW variable, defensive jq,
  simplified repository URL output

Documentation Fixes (24+ fixes):
- Version consistency: Updated all references to v0.2.0 across pyproject.toml,
  plugin.json, marketplace.json, MARKETPLACE.md, __init__.py, README files
- Tool count updates: Changed all "26 tools" references to "10 tools, 90 actions"
- Markdown lint: Fixed MD022, MD031, MD047 issues across multiple files
- Research docs: Fixed auth headers, removed web artifacts, corrected stale info
- Skills docs: Fixed query examples, endpoint counts, env var references

All 227 tests pass, ruff and ty checks clean.
This commit is contained in:
Jacob Magar
2026-02-15 17:09:31 -05:00
parent 6bbe46879e
commit 37e9424a5c
58 changed files with 1333 additions and 1175 deletions

View File

@@ -1,14 +1,14 @@
# Competitive Analysis: Unraid Integration Projects
> **Date:** 2026-02-07
> **Purpose:** Identify features and capabilities that competing Unraid integration projects offer that our `unraid-mcp` server (26 tools, GraphQL-based) currently lacks.
> **Purpose:** Identify features and capabilities that competing Unraid integration projects offer that our `unraid-mcp` server (10 tools, 90 actions, GraphQL-based) currently lacks.
## Table of Contents
- [Executive Summary](#executive-summary)
- [Project Profiles](#project-profiles)
- [1. unraid-management-agent (Go plugin)](#1-unraid-management-agent)
- [2. domalab/unraid-api-client (Python library)](#2-domalabu nraid-api-client)
- [2. domalab/unraid-api-client (Python library)](#2-domalabunraid-api-client)
- [3. mcp-ssh-sre / unraid-ssh-mcp (SSH-based MCP)](#3-mcp-ssh-sre--unraid-ssh-mcp)
- [4. PSUnraid (PowerShell module)](#4-psunraid)
- [5. ha-unraid (Home Assistant integration)](#5-ha-unraid)
@@ -22,7 +22,7 @@
## Executive Summary
Our `unraid-mcp` server provides 26 MCP tools built on the official Unraid GraphQL API. After analyzing six competing projects, we identified several significant gaps:
Our `unraid-mcp` server provides 10 MCP tools (90 actions) built on the official Unraid GraphQL API. After analyzing six competing projects, we identified several significant gaps:
**Critical gaps (high-value features we lack):**
1. **Array control operations** (start/stop array, parity check control, disk spin up/down)
@@ -71,7 +71,7 @@ Our `unraid-mcp` server provides 26 MCP tools built on the official Unraid Graph
**Key differentiators from our project:**
- Runs as an Unraid plugin directly on the server (no external dependency on GraphQL API)
- Collects data directly from /proc, /sys, Docker SDK, and libvirt
- 59 REST endpoints vs our 26 MCP tools
- 59 REST endpoints vs our 10 MCP tools (90 actions)
- 54 MCP tools with Resources and Prompts
- Real-time WebSocket event streaming (9 event types, 5-60s intervals)
- 41 Prometheus metrics for Grafana dashboards
@@ -341,7 +341,7 @@ The project's documentation explicitly compares SSH vs API capabilities:
### Monitoring Features
| Feature | Our MCP (26 tools) | mgmt-agent (54 MCP tools) | unraid-api-client | mcp-ssh-sre (79 actions) | PSUnraid | ha-unraid | chris-mc1 |
| Feature | Our MCP (10 tools, 90 actions) | mgmt-agent (54 MCP tools) | unraid-api-client | mcp-ssh-sre (79 actions) | PSUnraid | ha-unraid | chris-mc1 |
|---------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| System info (hostname, uptime) | Y | Y | Y | Y | Y | Y | N |
| CPU usage | Y | Y | Y | Y | Y | Y | Y |
@@ -458,7 +458,7 @@ The project's documentation explicitly compares SSH vs API capabilities:
| Feature | Our MCP | mgmt-agent | unraid-api-client | mcp-ssh-sre | PSUnraid | ha-unraid | chris-mc1 |
|---------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| MCP tools | Y (26) | Y (54) | N | Y (79 actions) | N | N | N |
| MCP tools | Y (10 tools, 90 actions) | Y (54) | N | Y (79 actions) | N | N | N |
| MCP Resources | N | Y (5) | N | N | N | N | N |
| MCP Prompts | N | Y (3) | N | N | N | N | N |
| REST API | N | Y (59) | N | N | N | N | N |

View File

@@ -1,7 +1,7 @@
# Unraid API Feature Gap Analysis
> **Date:** 2026-02-07
> **Purpose:** Comprehensive inventory of every API capability that could become an MCP tool, cross-referenced against our current 26 tools to identify gaps.
> **Purpose:** Comprehensive inventory of every API capability that could become an MCP tool, cross-referenced against our current 10 tools (90 actions) to identify gaps.
> **Sources:** 7 research documents (3,800+ lines), Unraid API source code analysis, community project reviews, official documentation crawl.
---
@@ -497,7 +497,7 @@ GRAPHQL_PUBSUB_CHANNEL {
## F. API Capabilities NOT Currently in the MCP Server
The current MCP server has 26 tools. The following capabilities are available in the Unraid API but NOT covered by any existing tool.
The current MCP server has 10 tools (90 actions) after consolidation. The following capabilities are available in the Unraid API but NOT covered by any existing tool.
### F.1 HIGH PRIORITY - New Tool Candidates
@@ -663,7 +663,7 @@ The current MCP server has 26 tools. The following capabilities are available in
| **Queries** | ~30+ | 14 | ~16+ uncovered |
| **Mutations** | ~50+ | 10 (start/stop Docker+VM, RClone CRUD) | ~40+ uncovered |
| **Subscriptions** | ~30+ | 0 (2 diagnostic only) | ~30+ uncovered |
| **Total Operations** | ~110+ | 24 active | ~86+ uncovered |
| **Total Operations** | ~110+ | 90 active (10 tools) | ~20+ uncovered |
**Current coverage: approximately 22% of available API operations.**
@@ -691,7 +691,7 @@ Capabilities this project offers that we do NOT:
| **Update Status** | Check for OS/plugin updates | NOT available via GraphQL API |
| **Mover Control** | Invoke the mover tool | NOT available via GraphQL API (Issue #1873) |
| **Disk Thresholds** | Warning/critical temp settings | Partially available via `ArrayDisk.warning`/`critical` |
| **54 MCP Tools** | Full MCP tool suite | We have 26 |
| **54 MCP Tools** | Full MCP tool suite | We have 10 tools (90 actions) |
| **WebSocket Events** | Real-time event stream | We have diagnostic-only subscriptions |
### G.2 PSUnraid (PowerShell Module)
@@ -828,7 +828,7 @@ Chose SSH over GraphQL API due to these gaps:
| | **Low Priority Subtotal** | **18** | **92** |
| | **GRAND TOTAL NEW TOOLS** | **66** | **92** |
**Current tools: 26 | Potential total: 92 | Gap: 66 tools (72% of potential uncovered)**
**Current tools: 10 (90 actions) | Potential total: ~110+ operations | Remaining gap: ~20+ uncovered operations**
---

View File

@@ -1,6 +1,7 @@
[Skip to main content](https://docs.unraid.net/unraid-connect/remote-access#__docusaurus_skipToContent_fallback)
# Remote Access (Unraid Connect)
On this page
> **Source:** [Unraid Documentation - Remote Access](https://docs.unraid.net/unraid-connect/remote-access)
> **Scraped:** 2026-02-07 | Raw content for reference purposes
Unlock secure, browser-based access to your Unraid WebGUI from anywhere with remote access. This feature is ideal for managing your server when you're away from home - no complicated networking or VPN Tunnel setup is required. For more advanced needs, such as connecting to Docker containers or accessing network drives, a VPN Tunnel remains the recommended solution.

View File

@@ -1,6 +1,7 @@
[Skip to main content](https://docs.unraid.net/unraid-os/release-notes/7.0.0#__docusaurus_skipToContent_fallback)
# Unraid OS 7.0.0 Release Notes
On this page
> **Source:** [Unraid OS Release Notes - 7.0.0](https://docs.unraid.net/unraid-os/release-notes/7.0.0)
> **Scraped:** 2026-02-07 | Raw content for reference purposes
This version of Unraid OS includes significant improvements across all subsystems, while attempting to maintain backward compatibility as much as possible.
@@ -882,77 +883,4 @@ With the [Unraid Patch plugin](https://forums.unraid.net/topic/185560-unraid-pat
* VM Manager: fix issue with blank Discard field on vDisk
* Include installed patches in diagnostics
Note: if you have the Mover Tuning plugin installed, you will be prompted to reboot in order to apply these patches.
* [Upgrading](https://docs.unraid.net/unraid-os/release-notes/7.0.0#upgrading)
* [Known issues](https://docs.unraid.net/unraid-os/release-notes/7.0.0#known-issues)
* [Rolling back](https://docs.unraid.net/unraid-os/release-notes/7.0.0#rolling-back)
* [Storage](https://docs.unraid.net/unraid-os/release-notes/7.0.0#storage)
* [unRAID array optional](https://docs.unraid.net/unraid-os/release-notes/7.0.0#unraid-array-optional)
* [Share secondary storage may be assigned to a pool](https://docs.unraid.net/unraid-os/release-notes/7.0.0#share-secondary-storage-may-be-assigned-to-a-pool)
* [ReiserFS file system option has been disabled](https://docs.unraid.net/unraid-os/release-notes/7.0.0#reiserfs-file-system-option-has-been-disabled)
* [Using 'mover' to empty an array disk](https://docs.unraid.net/unraid-os/release-notes/7.0.0#using-mover-to-empty-an-array-disk)
* [Predefined shares handling](https://docs.unraid.net/unraid-os/release-notes/7.0.0#predefined-shares-handling)
* [ZFS implementation](https://docs.unraid.net/unraid-os/release-notes/7.0.0#zfs-implementation)
* [Allocation profiles for btrfs, zfs, and zfs subpools](https://docs.unraid.net/unraid-os/release-notes/7.0.0#allocation-profiles-for-btrfs-zfs-and-zfs-subpools)
* [Pool considerations](https://docs.unraid.net/unraid-os/release-notes/7.0.0#pool-considerations)
* [Other features](https://docs.unraid.net/unraid-os/release-notes/7.0.0#other-features)
* [VM Manager](https://docs.unraid.net/unraid-os/release-notes/7.0.0#vm-manager)
* [Improvements](https://docs.unraid.net/unraid-os/release-notes/7.0.0#improvements)
* [Other changes](https://docs.unraid.net/unraid-os/release-notes/7.0.0#other-changes)
* [Docker](https://docs.unraid.net/unraid-os/release-notes/7.0.0#docker)
* [Docker fork bomb prevention](https://docs.unraid.net/unraid-os/release-notes/7.0.0#docker-fork-bomb-prevention)
* [Add support for overlay2 storage driver](https://docs.unraid.net/unraid-os/release-notes/7.0.0#add-support-for-overlay2-storage-driver)
* [Other changes](https://docs.unraid.net/unraid-os/release-notes/7.0.0#other-changes-1)
* [Networking](https://docs.unraid.net/unraid-os/release-notes/7.0.0#networking)
* [Tailscale integration](https://docs.unraid.net/unraid-os/release-notes/7.0.0#tailscale-integration)
* [Support iframing the webGUI](https://docs.unraid.net/unraid-os/release-notes/7.0.0#support-iframing-the-webgui)
* [Other changes](https://docs.unraid.net/unraid-os/release-notes/7.0.0#other-changes-2)
* [webGUI](https://docs.unraid.net/unraid-os/release-notes/7.0.0#webgui)
* [Integrated Dynamix File Manager plugin](https://docs.unraid.net/unraid-os/release-notes/7.0.0#integrated-dynamix-file-manager-plugin)
* [Integrated GUI Search plugin](https://docs.unraid.net/unraid-os/release-notes/7.0.0#integrated-gui-search-plugin)
* [Outgoing Proxy Manager](https://docs.unraid.net/unraid-os/release-notes/7.0.0#outgoing-proxy-manager)
* [Notification Agents](https://docs.unraid.net/unraid-os/release-notes/7.0.0#notification-agents)
* [NTP Configuration](https://docs.unraid.net/unraid-os/release-notes/7.0.0#ntp-configuration)
* [NFS Shares](https://docs.unraid.net/unraid-os/release-notes/7.0.0#nfs-shares)
* [Dashboard](https://docs.unraid.net/unraid-os/release-notes/7.0.0#dashboard)
* [SMART improvements](https://docs.unraid.net/unraid-os/release-notes/7.0.0#smart-improvements)
* [Diagnostics](https://docs.unraid.net/unraid-os/release-notes/7.0.0#diagnostics)
* [Other changes](https://docs.unraid.net/unraid-os/release-notes/7.0.0#other-changes-3)
* [Misc](https://docs.unraid.net/unraid-os/release-notes/7.0.0#misc)
* [Other changes](https://docs.unraid.net/unraid-os/release-notes/7.0.0#other-changes-4)
* [Linux kernel](https://docs.unraid.net/unraid-os/release-notes/7.0.0#linux-kernel)
* [Base distro](https://docs.unraid.net/unraid-os/release-notes/7.0.0#base-distro)
* [Patches](https://docs.unraid.net/unraid-os/release-notes/7.0.0#patches)
Note: if you have the Mover Tuning plugin installed, you will be prompted to reboot in order to apply these patches.

View File

@@ -468,6 +468,9 @@ unraid-api apikey --delete --name "workflow key" --json
#!/bin/bash
set -e
# Set up cleanup trap early so it fires even if key creation fails
cleanup() { echo "Cleaning up..."; unraid-api apikey --delete --name "temp deployment key" 2>/dev/null || true; }
# 1. Create temporary API key
echo "Creating temporary API key..."
KEY_DATA=$(unraid-api apikey --create \
@@ -476,20 +479,20 @@ KEY_DATA=$(unraid-api apikey --create \
--description "Temporary key for deployment $(date)" \
--json)
# Register trap after key creation succeeds
trap cleanup EXIT
# 2. Extract the API key
API_KEY=$(echo "$KEY_DATA" | jq -r '.key')
echo "API key created successfully"
# 3. Use the key for operations
echo "Configuring services..."
curl -H "Authorization: Bearer $API_KEY" \
curl -H "x-api-key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"provider": "azure", "clientId": "your-client-id"}' \
http://localhost:3001/graphql
# 4. Clean up (always runs, even on error)
trap 'echo "Cleaning up..."; unraid-api apikey --delete --name "temp deployment key"' EXIT
echo "Deployment completed successfully"
```
@@ -714,6 +717,8 @@ type Mutation {
}
```
> **Note:** The client schema above uses `ID!` for disk mutation args (e.g., `mountArrayDisk(id: ID!)`), but the actual server resolvers use `PrefixedID!`. The MCP tool code correctly uses `PrefixedID!` based on server source analysis.
#### Subscription Type
```graphql

View File

@@ -119,7 +119,7 @@ The API implements a **multi-layered security architecture** separating authenti
Applications can request API access via a self-service flow ([source](https://docs.unraid.net/API/api-key-app-developer-authorization-flow/)):
```
https://[unraid-server]/ApiKeyAuthorize?name=MyApp&&scopes=docker:read,vm:*&&redirect_uri=https://myapp.com/callback&&state=abc123
https://[unraid-server]/ApiKeyAuthorize?name=MyApp&scopes=docker:read,vm:*&redirect_uri=https://myapp.com/callback&state=abc123
```
**Scope Format:** `resource:action` pattern
@@ -302,7 +302,7 @@ The subscription system is event-driven: file changes on disk (detected by choki
**jmagar/unraid-mcp** (this project) is the primary MCP server for Unraid ([source](https://glama.ai/mcp/servers/@jmagar/unraid-mcp), [source](https://mcpmarket.com/server/unraid)):
- Python-based MCP server using FastMCP framework
- 26 tools for comprehensive Unraid management
- 10 tools with 90 actions for comprehensive Unraid management
- Read-only access by default for safety
- Listed on Glama, MCP Market, MCPServers.com, LangDB, UBOS, JuheAPI
- 21 GitHub stars

View File

@@ -322,6 +322,7 @@ query {
```
#### RClone Remotes (`rclone`)
```graphql
query {
rclone {
@@ -334,6 +335,7 @@ query {
```
#### Notifications
```graphql
query {
notifications {
@@ -343,6 +345,7 @@ query {
```
#### Shares
```graphql
query {
shares {
@@ -354,6 +357,7 @@ query {
### Mutation Types
#### Docker Container Management
```graphql
mutation {
docker {
@@ -366,6 +370,7 @@ mutation {
- Mutations are idempotent (starting an already-running container returns success)
#### VM Management
```graphql
mutation {
vm {