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" } } }, 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 74dd322..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,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 = 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 new file mode 100644 index 0000000..f29f417 --- /dev/null +++ b/packages/yarr/package.nix @@ -0,0 +1,31 @@ +{ + lib, + rustPlatform, + fetchFromGitHub, +}: + +rustPlatform.buildRustPackage rec { + pname = "yarr"; + version = "2.2.2"; + + src = fetchFromGitHub { + owner = "dinglebear-ai"; + repo = "yarr"; + rev = "15a599bab38a"; + hash = "sha256-PlD2NYK06rVdKirUq2dw04WL9yFrM2TB1d67Weero0k="; + }; + + 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"; + license = licenses.agpl3Only; + mainProgram = "yarr"; + platforms = platforms.all; + }; +} \ No newline at end of file