Query, monitor, and manage Unraid servers via GraphQL API through MCP tools. Supports system info, Docker, VMs, array/parity, notifications, plugins, rclone, and live telemetry.
claude mcp add unraid-mcp -- uvx unraid-mcp{
"mcpServers": {
"unraid-mcp": {
"command": "uvx",
"args": ["unraid-mcp"],
"env": {
"UNRAID_API_URL": "<unraid_api_url>",
"UNRAID_API_KEY": "<unraid_api_key>"
}
}
}
}UNRAID_API_URLUNRAID_API_KEYMCP Servers overview
# Unraid MCP <!-- mcp-name: tv.tootie/unraid-mcp --> [](https://pypi.org/project/unraid-mcp/) [](https://github.com/jmagar/unraid-mcp/pkgs/container/unraid-mcp) GraphQL-backed MCP server for Unraid. Exposes a unified `unraid` tool for system inspection, management operations, live telemetry, and destructive actions gated by explicit confirmation. ## Installation The plugin lives at `plugins/unraid/` and launches the server with `uvx unraid-mcp` (the published [PyPI package](https://pypi.org/project/unraid-mcp/)), so no local checkout is required once it's installed. You'll need [`uv`](https://docs.astral.sh/uv/) on your `PATH`. ### Claude Code (plugin + marketplace) Add this repo as a marketplace, then install the plugin: ```text /plugin marketplace add jmagar/unraid-mcp /plugin install unraid-mcp@unraid-mcp ``` `marketplace add` accepts the `owner/repo` shorthand (or a full git URL / local path). After install, Claude Code prompts for **Unraid GraphQL API URL** and **Unraid API Key** (the plugin's `userConfig`); they're passed to the server and persisted to `~/.unraid-mcp/.env` by the SessionStart hook. ### Codex (plugin + marketplace) The repo ships a Codex marketplace manifest at `.agents/plugins/marketplace.json`: ```bash codex plugin marketplace add jmagar/unraid-mcp # then enable `unraid-mcp@unraid-mcp` from the Codex `/plugins` view ``` Codex does not expand plugin-config placeholders into the MCP env, so export your credentials in the shell that launches Codex (the manifest forwards them by name): ```bash export UNRAID_API_URL="https://tower.local/graphql" export UNRAID_API_KEY="your-api-key" ``` Alternatively, populate `~/.unraid-mcp/.env` (run `uvx unraid-mcp setup`) — the server reads it automatically. ### Gemini CLI (extension) Install the extension straight from the repo (`gemini extensions install` reads `gemini-extension.json` from the repo root): ```bash gemini extensions install https://github.com/jmagar/unraid-mcp ``` Gemini prompts for the `UNRAID_API_URL` and `UNRAID_API_KEY` settings on install and exports them to the server's environment. ### Run the server directly with uvx No clone needed — run the published package on demand: ```bash export UNRAID_API_URL="https://tower.local/graphql" export UNRAID_API_KEY="your-api-key" uvx unraid-mcp ``` ### Local development ```bash uv sync --dev uv run unraid-mcp-server ``` Equivalent entrypoints: ```bash uv run unraid-mcp uv run python -m unraid_mcp ``` ### Docker ```bash docker compose up -d ``` ### Claude Desktop Newer Claude Desktop builds may reject the raw `streamable-http` URL config when the server runs in Docker. Connect through the `mcp-remote` proxy instead — see [docs/mcp/CONNECT.md](docs/mcp/CONNECT.md#claude-desktop-via-mcp-remote-proxy) for the macOS/Linux and Windows config snippets. ## Configuration Create `.env` from `.env.example`: ```bash just setup ``` ### Environment variables | Variable | Required | Default | Description | | --- | --- | --- | --- | | `UNRAID_API_URL` | Yes | — | GraphQL endpoint URL, e.g. `https://tower.local/graphql` | | `UNRAID_API_KEY` | Yes | — | Unraid API key (see below) | | `UNRAID_MCP_TRANSPORT` | No | `streamable-http` | Transport: `streamable-http`, `stdio`, or legacy `sse` (deprecated; removed in v3.0.0) | | `UNRAID_MCP_HOST` | No | `127.0.0.1` bare metal; Docker sets `0.0.0.0` | Bind address for HTTP transports | | `UNRAID_MCP_PORT` | No | `6970` | Listen port for HTTP transports | | `UNRAID_MCP_MAX_RESPONSE_BYTES` | No | `40000` | Max serialized tool-response size; over-cap responses return a parseable truncation marker | | `UNRAID_MCP_BEARER_TOKEN` | Conditional | — | Static Bearer token for HTTP transports; auto-generated on first start if unset | | `UNRAID_MCP_DISABLE_HTTP_AUTH` | No | `false` | Set `true` to skip Bearer auth (use behind a reverse proxy that handles auth) | | `UNRAID_MCP_TRUST_PROXY` | Conditional | `false` | Required when disabling HTTP auth while binding a non-loopback interface | | `UNRAID_MCP_GOOGLE_CLIENT_ID` | No | — | Google OAuth client ID; setting both client ID and secret enables OAuth for HTTP transports (required for claude.ai connectors). An explicitly set `UNRAID_MCP_BEARER_TOKEN` stays valid alongside OAuth | | `UNRAID_MCP_GOOGLE_CLIENT_SECRET` | No | — | Google OAuth client secret | | `UNRAID_MCP_GOOGLE_BASE_URL` | Conditional | — | Public server base URL, required when Google OAuth is enabled | | `UNRAID_MCP_GOOGLE_REQUIRED_SCOPES` | No | `openid` + `userinfo.email` | Comma/space-separated OAuth scopes | | `UNRAID_MCP_GOOGLE_ALLOWED_EMAILS` | Conditional | — | Verified Google emails allowed to use the MCP server | | `UNRAID_MCP_GOOGLE_ALLOWED_DOMAINS` | Conditional | — | Verified Google email domains allowed to use the MCP server | | `UNRAID_MCP_GOOGLE_ALLOW_ANY_USER` | No | `false` | Explicitly allow any verified Google account; only for private/trusted deployments | | `UNRAID_MCP_GOOGLE_REDIRECT_PATH` | No | `/auth/callback` | OAuth callback path configured in Google Cloud | | `UNRAID_MCP_GOOGLE_JWT_SIGNING_KEY` | Conditional | — | With the encryption key, enables restart-surviving encrypted token storage | | `UNRAID_MCP_GOOGLE_ENCRYPTION_KEY` | Conditional | — | Fernet key for encrypted OAuth token storage | | `UNRAID_MCP_GOOGLE_STORAGE_DIR` | No | `~/.unraid-mcp/oauth-tokens` | Directory for persisted encrypted OAuth tokens | | `UNRAID_VERIFY_SSL` | No | `true` | Upstream Unraid API TLS verification; may also be a CA-bundle path | | `UNRAID_ALLOW_INSECURE_TLS` | Conditional | `false` | Required second opt-in when `UNRAID_VERIFY_SSL=false` | | `UNRAID_MCP_LOG_LEVEL` | No | `INFO` | Log verbosity: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | | `UNRAID_MCP_LOG_FILE` | No | `unraid-mcp.log` | Log filename under `logs/` or `/app/logs/` in Docker | | `UNRAID_AUTO_START_SUBSCRIPTIONS` | No | `true` | Lazily initialize enabled subscriptions on first resource/diagnostic access | | `UNRAID_MAX_RECONNECT_ATTEMPTS` | No | `10` | Max WebSocket reconnect attempts | | `UNRAID_AUTOSTART_LOG_PATH` | No | auto-detect | Log file path for the lazily initialized log-tail subscription | | `UNRAID_MCP_ENABLE_RAW_SUBSCRIPTION_PROBE` | No | `false` | Debug-only raw upstream frame in `subscriptions/test_query`; data-sensitive, never for shared deployments | | `UNRAID_SUBSCRIPTION_MAX_CONNECTIONS` | No | `3` | Per-process concurrent subscription startup handshakes (1..32) | | `UNRAID_SUBSCRIPTION_STARTUP_STAGGER_SECONDS` | No | `0.05` | Delay between startup launches (0..10 seconds) | | `UNRAID_SUBSCRIPTION_COLLECT_MAX_EVENTS` | No | `100` | In-flight collection event ceiling (1..10000; `limit` may lower it) | | `UNRAID_SUBSCRIPTION_COLLECT_MAX_BYTES` | No | `1048576` | In-flight serialized collection byte ceiling; response budget may lower it | | `UNRAID_SUBSCRIPTION_COLLECT_MAX_SECONDS` | No | `30` | Maximum `collect_for` duration; configurable up to 300 seconds | | `UNRAID_SUBSCRIPTION_CACHE_MAX_AGE_SECONDS` | No | `300` | Maximum usable cache age in seconds; configurable up to 86400 | | `UNRAID_SUBSCRIPTION_TIMEOUT_MAX_SECONDS` | No | `60` | Maximum per-call WebSocket timeout; configurable up to 300 seconds | | `UNRAID_CREDENTIALS_DIR` | No | `~/.unraid-mcp` | Override credentials directory | | `DOCKER_NETWORK` | No | — | External Docker network to join; leave blank for default bridge | | `PGID` | No | `1000` | Container process GID | | `PUID` | No | `1000` | Container process UID | For the full reference, including OAuth persistence and `.env` loading order, see [docs/mcp/ENV.md](docs/mcp/ENV.md), [docs/CONFIG.md](docs/CONFIG.md), and [docs/AUTHENTICATION.md](docs/AUTHENTICATION.md). ### How to find UNRAID_API_KEY 1. Open the Unraid web UI. 2. Go to **Settings → Management Access → API Keys**. 3. Create a new key or copy an existing one. 4. Paste the value into `UNRAID_API_KEY`. ### UNRAID_API_KEY vs UNRAID_MCP_BEARER_TOKEN These are two separate credentials with different purposes: - `UNRAID_API_KEY` — authenticates the MCP server to the **Unraid GraphQL API**. Every GraphQL request carries this key as a header. Obtained from the Unraid web UI. - `UNRAID_MCP_BEARER_TOKEN` — authenticates **MCP clients** (Claude Code, Claude Desktop, etc.) to **this MCP server**. Clients must send `Authorization: Bearer <token>` on every HTTP request. Generate with `openssl rand -hex 32` or `just gen-token`. ### UNRAID_MCP_DISABLE_HTTP_AUTH Set this to `true` when a reverse proxy (nginx, Caddy, Traefik, SWAG) already handles authentication before requests reach the MCP server. Disabling the built-in check removes the Bearer token requirement at the MCP layer. Do not expose the server directly to untrusted networks with this flag enabled. If auth is disabled and `UNRAID_MCP_HOST` binds a non-loopback interface, the server also requires `UNRAID_MCP_TRUST_PROXY=true` as an explicit assertion that a trusted fronting gateway enforces authentication. ### Google OAuth for HTTP transports Set both `UNRAID_MCP_GOOGLE_CLIENT_ID` and `UNRAID_MCP_GOOGLE_CLIENT_SECRET` to replace static Bearer auth with Google OAuth. OAuth requires `UNRAID_MCP_GOOGLE_BASE_URL` and at least one authorization allowlist entry (`UNRAID_MCP_GOOGLE_ALLOWED_EMAILS` or `UNRAID_MCP_GOOGLE_ALLOWED_DOMAINS`) unless `UNRAID_MCP_GOOGLE_ALLOW_ANY_USER=true` is explicitly set. Google OAuth and `UNRAID_MCP_DISABLE_HTTP_AUTH=true` are mutually exclusive. ### Transport modes - `streamable-http` — default; exposes an HTTP endpoint, requires Bearer token unless auth is disabled - `stdio` — subprocess mode for Claude Code local plugin; no Bearer token needed - `sse` — legacy Server-Sent Events; deprecated, emits a warning, and will be removed in v3.0.0. Migrate to streamable HTTP or place a compatibility proxy in front of it. Credential files are loaded in p
What people ask about unraid-mcp
What is dinglebear-ai/unraid-mcp?
+
dinglebear-ai/unraid-mcp is mcp servers for the Claude AI ecosystem. Query, monitor, and manage Unraid servers via GraphQL API through MCP tools. Supports system info, Docker, VMs, array/parity, notifications, plugins, rclone, and live telemetry. It has 98 GitHub stars and was last updated today.
How do I install unraid-mcp?
+
You can install unraid-mcp by cloning the repository (https://github.com/dinglebear-ai/unraid-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is dinglebear-ai/unraid-mcp safe to use?
+
dinglebear-ai/unraid-mcp has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.
Who maintains dinglebear-ai/unraid-mcp?
+
dinglebear-ai/unraid-mcp is maintained by dinglebear-ai. The last recorded GitHub activity is from today, with 4 open issues.
Are there alternatives to unraid-mcp?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy unraid-mcp to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/dinglebear-ai-unraid-mcp)<a href="https://claudewave.com/repo/dinglebear-ai-unraid-mcp"><img src="https://claudewave.com/api/badge/dinglebear-ai-unraid-mcp" alt="Featured on ClaudeWave: dinglebear-ai/unraid-mcp" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface