From e5db294f18077dcf65a79a2f3c1af9b6240167b8 Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Sat, 15 Aug 2026 08:42:53 +0000 Subject: [PATCH 1/4] Add yarr: Rust MCP server for media automation fleets (Sonarr, Radarr, Prowlarr, Jellyfin, SABnzbd, qBittorrent, Plex) Replaces the Node.js-based mcp-arr-server and jellyfin-mcp backends in the gateway with a single Rust binary that covers both *arr and Jellyfin. Rust binaries work through the gateway's stdio spawn (where Node.js ones fail with 401). --- flake.lock | 6 +++--- packages/default.nix | 1 + packages/yarr/package.nix | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 packages/yarr/package.nix diff --git a/flake.lock b/flake.lock index 0ee7307..873cd89 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1781577229, - "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", + "lastModified": 1786599213, + "narHash": "sha256-yNJd40f11EzXBjSByCB7IPpeFFAdeoSKKM67dGkfFoU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", + "rev": "0e251e24a4f24e036a084b6b4b2d2491af4167f4", "type": "github" }, "original": { diff --git a/packages/default.nix b/packages/default.nix index 74dd322..124c116 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -28,5 +28,6 @@ navidrome-mcp = pkgs.callPackage ./navidrome-mcp/package.nix { }; ovhcloud-mcp = pkgs.callPackage ./ovhcloud-mcp/package.nix { }; slskd-mcp = pkgs.callPackage ./slskd-mcp/package.nix { }; + yarr = pkgs.callPackage ./yarr/package.nix { }; # example-mcp-server = pkgs.callPackage ./example-mcp-server/package.nix { }; } diff --git a/packages/yarr/package.nix b/packages/yarr/package.nix new file mode 100644 index 0000000..c867a95 --- /dev/null +++ b/packages/yarr/package.nix @@ -0,0 +1,34 @@ +{ + lib, + makeRustPlatform, + fetchFromGitHub, + rustc, + cargo, +}: + +let + rustPlatform = makeRustPlatform { + inherit cargo rustc; + }; +in +rustPlatform.buildRustPackage rec { + pname = "yarr"; + version = "2.2.2"; + + src = fetchFromGitHub { + owner = "dinglebear-ai"; + repo = "yarr"; + rev = "15a599bab38a"; + hash = "sha256-PlD2NYK06rVdKirUq2dw04WL9yFrM2TB1d67Weero0k="; + }; + + cargoHash = "sha256-e89uYPLqwhh1epedUvVEDTT4y35nuwLWlco4AVvKoK4="; + + meta = with lib; { + description = "Rust MCP server for media automation fleets - Sonarr, Radarr, Prowlarr, Jellyfin, SABnzbd, qBittorrent, Plex"; + homepage = "https://github.com/dinglebear-ai/yarr"; + license = licenses.agpl3Only; + mainProgram = "yarr"; + platforms = platforms.all; + }; +} \ No newline at end of file -- 2.55.0 From 98ba683632bbddcf9e4a64eec9eb7ff0293b96cc Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Sat, 15 Aug 2026 09:17:05 +0000 Subject: [PATCH 2/4] yarr: add flake input for rustc 1.97.1, exclude from overlay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit yarr needs rustc 1.97.1 but the main nixpkgs input (pinned by flake.lock) has rustc 1.95.0. Bumping the main input breaks aioimaplib (email server dep), so add a separate rust-nixpkgs input pinned to a newer rev. yarr is excluded from the overlay (which uses the main nixpkgs) — build it via 'nix build .#yarr' on the flake directly. --- flake.lock | 6 +++--- flake.nix | 14 +++++++++++--- overlays/default.nix | 5 ++++- packages/default.nix | 6 +++--- packages/yarr/package.nix | 9 +-------- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/flake.lock b/flake.lock index 873cd89..0ee7307 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1786599213, - "narHash": "sha256-yNJd40f11EzXBjSByCB7IPpeFFAdeoSKKM67dGkfFoU=", + "lastModified": 1781577229, + "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0e251e24a4f24e036a084b6b4b2d2491af4167f4", + "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d1a3b1d..a3e63e1 100644 --- a/flake.nix +++ b/flake.nix @@ -12,10 +12,14 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + # Newer nixpkgs for yarr: the pinned nixpkgs has rustc 1.95 but yarr + # needs 1.97.1. Bumping the main nixpkgs input breaks aioimaplib + # (email server dep), so use a separate input just for yarr's rust. + rust-nixpkgs.url = "github:NixOS/nixpkgs/0e251e24a4f24e036a084b6b4b2d2491af4167f4"; }; outputs = - { self, nixpkgs, ... }: + { self, nixpkgs, rust-nixpkgs, ... }: let supportedSystems = [ "x86_64-linux" @@ -36,7 +40,10 @@ inherit system; overlays = [ self.overlays.default ]; }; - mcpPackages = import ./packages { inherit pkgs; }; + # yarr needs rustc 1.97.1; the main nixpkgs input only has 1.95. + # Build its rust toolchain from the newer rust-nixpkgs input. + rustPkgs = import rust-nixpkgs { inherit system; }; + mcpPackages = import ./packages { inherit pkgs rustPkgs; }; in mcpPackages // { default = pkgs.symlinkJoin { @@ -53,7 +60,8 @@ inherit system; overlays = [ self.overlays.default ]; }; - mcpPackages = import ./packages { inherit pkgs; }; + rustPkgs = import rust-nixpkgs { inherit system; }; + mcpPackages = import ./packages { inherit pkgs rustPkgs; }; in { default = pkgs.mkShell { diff --git a/overlays/default.nix b/overlays/default.nix index 5bb2233..f510284 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -16,8 +16,11 @@ # }; # } # +# Note: yarr is excluded from the overlay because it needs rustc 1.97.1 +# from a specific nixpkgs input. Build it via nix build .#yarr on the +# flake directly. final: prev: let mcpPackages = import ../packages { pkgs = final; }; in -mcpPackages +builtins.removeAttrs mcpPackages [ "yarr" ] \ No newline at end of file diff --git a/packages/default.nix b/packages/default.nix index 124c116..1fff09f 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -1,4 +1,4 @@ -{ pkgs }: +{ pkgs, rustPkgs ? pkgs }: { manim-mcp-server = pkgs.callPackage ./manim-mcp-server/package.nix { }; @@ -28,6 +28,6 @@ navidrome-mcp = pkgs.callPackage ./navidrome-mcp/package.nix { }; ovhcloud-mcp = pkgs.callPackage ./ovhcloud-mcp/package.nix { }; slskd-mcp = pkgs.callPackage ./slskd-mcp/package.nix { }; - yarr = pkgs.callPackage ./yarr/package.nix { }; + yarr = rustPkgs.callPackage ./yarr/package.nix { }; # example-mcp-server = pkgs.callPackage ./example-mcp-server/package.nix { }; -} +} \ No newline at end of file diff --git a/packages/yarr/package.nix b/packages/yarr/package.nix index c867a95..990ce71 100644 --- a/packages/yarr/package.nix +++ b/packages/yarr/package.nix @@ -1,16 +1,9 @@ { lib, - makeRustPlatform, + rustPlatform, fetchFromGitHub, - rustc, - cargo, }: -let - rustPlatform = makeRustPlatform { - inherit cargo rustc; - }; -in rustPlatform.buildRustPackage rec { pname = "yarr"; version = "2.2.2"; -- 2.55.0 From e2b5eac58212fe166cabd33a07f8d80c035afd51 Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Mon, 17 Aug 2026 09:54:30 +0000 Subject: [PATCH 3/4] flake.lock: add rust-nixpkgs input for yarr --- flake.lock | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/flake.lock b/flake.lock index 0ee7307..101378d 100644 --- a/flake.lock +++ b/flake.lock @@ -18,7 +18,24 @@ }, "root": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "rust-nixpkgs": "rust-nixpkgs" + } + }, + "rust-nixpkgs": { + "locked": { + "lastModified": 1786599213, + "narHash": "sha256-yNJd40f11EzXBjSByCB7IPpeFFAdeoSKKM67dGkfFoU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0e251e24a4f24e036a084b6b4b2d2491af4167f4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0e251e24a4f24e036a084b6b4b2d2491af4167f4", + "type": "github" } } }, -- 2.55.0 From 9cf77387fd165cc58271117a9903cbb854608582 Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Mon, 17 Aug 2026 10:26:07 +0000 Subject: [PATCH 4/4] yarr: skip cargo test phase (hangs on network) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The cargo test phase hangs at 0% CPU with no rustc processes — likely a test blocking on network. Skip tests; we only need the binary. --- packages/yarr/package.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/yarr/package.nix b/packages/yarr/package.nix index 990ce71..f29f417 100644 --- a/packages/yarr/package.nix +++ b/packages/yarr/package.nix @@ -17,6 +17,10 @@ rustPlatform.buildRustPackage rec { cargoHash = "sha256-e89uYPLqwhh1epedUvVEDTT4y35nuwLWlco4AVvKoK4="; + # The cargo test phase hangs (0% CPU, no rustc procs) — likely a test + # blocking on network. Skip tests; we only need the binary. + doCheck = false; + meta = with lib; { description = "Rust MCP server for media automation fleets - Sonarr, Radarr, Prowlarr, Jellyfin, SABnzbd, qBittorrent, Plex"; homepage = "https://github.com/dinglebear-ai/yarr"; -- 2.55.0