{
  "markdown": "# Unraid\n\n<!-- mcp-name: tv.tootie/unraid-mcp -->\n\n[![PyPI](https://img.shields.io/pypi/v/unraid-mcp)](https://pypi.org/project/unraid-mcp/) [![ghcr.io](https://img.shields.io/badge/ghcr.io-dinglebear--ai%2Funraid--mcp-blue?logo=docker)](https://github.com/dinglebear-ai/unraid/pkgs/container/unraid-mcp)\n\nA monorepo of Unraid tooling: two MCP servers (Python and Rust) and three Unraid\nOS plugins, plus the Claude/Codex agent integrations that surface them.\n\n> **Repo name.** This repo was renamed `unraid-mcp` → `unraid` on 2026-07-27, and\n> the former standalone `runraid` and `incus-unraid` repos were merged in here. The\n> old GitHub name still redirects, so existing plugin install/update URLs keep\n> working. The **PyPI package, the container image, the Claude plugin, and the\n> Unraid `.plg`** are all still named `unraid-mcp` — only the repo changed.\n\n## Components\n\n| Path | What it is | Toolchain | Build / test |\n|------|-----------|-----------|--------------|\n| [`unraid-py/`](unraid-py/) | **unraid-mcp** — Python MCP server (GraphQL), the flagship. Published to PyPI as `unraid-mcp`. | Python / uv / hatchling | `cd unraid-py && uv run pytest && uv build --wheel` |\n| [`unraid-rs/`](unraid-rs/) | **runraid** — Rust MCP server + CLI (single static binary). Crate `unraid-rmcp` on crates.io, plus a legacy npm wrapper of the same name. | Rust / cargo | `cd unraid-rs && cargo fmt --check && cargo clippy --all-targets --features test-support -- -D warnings && cargo test` |\n| [`plugins/mcp/`](plugins/mcp/) | Unraid OS plugin that ships the Rust `runraid` MCP server onto an Unraid box. | shell `.plg` + Rust + Vue | `bash plugins/mcp/scripts/build-txz.sh <ver> <runraid-binary>` |\n| [`plugins/incus/`](plugins/incus/) | Unraid OS plugin running Incus system containers (\"dev containers\") firewalled off the LAN. Includes a NestJS/GraphQL `unraid-api` backend. | shell `.plg` + NestJS/Vue | `cd plugins/incus && ./scripts/verify-classic-package.sh && ./tests/classic-contract.sh` |\n| [`plugins/codex/`](plugins/codex/) | Unraid OS plugin embedding a Codex chathead app-server. | shell `.plg` + React | `cd plugins/codex && ./tests/contract.sh` |\n| [`agents/unraid-py/`](agents/unraid-py/) | Claude Code / Codex plugin (`name: unraid-mcp`) for the Python server. | — | — |\n| [`agents/unraid-rs/`](agents/unraid-rs/) | Claude Code / Codex plugin (`name: runraid`) for the Rust server. | — | — |\n\n## Install the agent plugins (one marketplace command, two manifests)\n\n```text\n/plugin marketplace add dinglebear-ai/unraid\n/plugin install unraid-mcp@unraid-mcp   # Python server\n/plugin install runraid@unraid-mcp      # Rust server\n```\n\nThe `@unraid-mcp` suffix is the **marketplace name** declared in\n`.claude-plugin/marketplace.json`, not the repo name — it stays `unraid-mcp` even\nthough the repo is now `dinglebear-ai/unraid`.\n\nBoth plugins are published from a single repo. Claude reads\n`.claude-plugin/marketplace.json`; Codex reads `.agents/plugins/marketplace.json`.\n`meta-ci.yml` asserts the two list the same plugin set, so they cannot drift.\n\n`marketplace add` accepts the `owner/repo` shorthand (or a full git URL / local\npath). After install, Claude Code prompts for the connection settings (the\nplugin's `userConfig`).\n\n### Plugin credentials need no manual step\n\nThe agent plugins ship **no Claude Code hooks**, and none are needed: both\n`.mcp.json` files map your plugin settings into the server environment directly\nvia `${user_config.*}`. `agents/unraid-rs` wires 10 keys (endpoint, API key, TLS\nskip, bearer token, four OAuth vars); `agents/unraid-py` wires `UNRAID_API_URL`\nand `UNRAID_API_KEY`. Set them in plugin settings and the server picks them up on\nnext launch.\n\nOptional, for **non-plugin** installs (systemd, Docker) that want `~/.unraid/.env`\nwritten to disk:\n\n```bash\nrunraid setup plugin-hook          # or: npx -y @dinglebear/unraid setup plugin-hook\n```\n\n## unraid-py quickstart (Python MCP server)\n\nThe Python server is the flagship. Full documentation — installation, Claude\nCode / Codex / Gemini setup, configuration, authentication, guardrails, and the\ntool surface — lives in **[`unraid-py/README.md`](unraid-py/README.md)** and\n[`unraid-py/docs/`](unraid-py/docs/). It publishes to PyPI as `unraid-mcp` (import\npackage `unraid_mcp`) and launches with `uvx unraid-mcp`.\n\n## unraid-rs quickstart (Rust MCP server + CLI)\n\n```bash\ncd unraid-rs && cargo build --release      # → target/release/runraid\nrunraid setup plugin-hook                  # writes ~/.unraid/.env\nrunraid array                              # CLI\nrunraid serve mcp                          # MCP over HTTP on :40010\n```\n\n| Env var | Purpose |\n|---|---|\n| `UNRAID_API_URL` | Unraid GraphQL endpoint (required) |\n| `UNRAID_API_KEY` | `x-api-key` for the Unraid API (required) |\n| `UNRAID_API_SKIP_TLS_VERIFY` | Accept a self-signed Unraid cert (default `false`) |\n| `UNRAID_RMCP_HOST` / `UNRAID_RMCP_PORT` | MCP bind address (default `0.0.0.0:40010`) |\n| `UNRAID_RMCP_TOKEN` | Static bearer token for `/mcp` |\n| `UNRAID_RMCP_AUTH_MODE` | `bearer` (default) or `oauth` |\n\nFull list and the OAuth variables: [`unraid-rs/CLAUDE.md`](unraid-rs/CLAUDE.md).\n\n**Not read-only.** The Rust server exposes both queries and mutations. Read actions\nneed the `unraid:read` scope; mutating actions (VM and Docker lifecycle, array\nstart/stop, notification writes) need `unraid:admin`.\n\n## Releases\n\nThere are two release lanes. **release-please manages only `unraid-py` and\n`unraid-rs`** — the Python server keeps unprefixed `vX.Y.Z` tags (the existing\naudience's scheme) and Rust uses `unraid-rs-vX.Y.Z`. The **Incus and Codex plugins\ndo not use release-please**: they are versioned by\n`.github/scripts/plugin_calver.py` with fixed-width `YYYYMMDD.NNN` versions and\n`incus-v*` / `codex-v*` tags (Unraid compares plugin versions as raw strings, so the\nfixed width is mandatory).\n\nThe native MCP plugin is built from the matching `unraid-rs-vX.Y.Z` tag, and Community Applications reads its rolling manifest from the `unraid-plugin-latest` release. Plugin `.txz` payloads ship as GitHub **release assets**, never tracked in git.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n",
  "bytes": 6170,
  "sha": "83e36bf6c82fe314d8c1826e57c5da362d9d23b24da65ba0bdbacbda348b0b77",
  "repo_slug": "dinglebear-ai/unraid",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ai_dinglebear_unraid_47255cb2/readme"
}