{ description = "Flake that contains an overlay with some mcp servers"; inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; treefmt-nix.url = "github:numtide/treefmt-nix"; pyproject-nix.url = "github:pyproject-nix/pyproject.nix"; pyproject-nix.inputs.nixpkgs.follows = "nixpkgs"; uv2nix = { url = "github:pyproject-nix/uv2nix"; inputs.pyproject-nix.follows = "pyproject-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; pyproject-build-systems = { url = "github:pyproject-nix/build-system-pkgs"; inputs.pyproject-nix.follows = "pyproject-nix"; inputs.uv2nix.follows = "uv2nix"; inputs.nixpkgs.follows = "nixpkgs"; }; # Uncomment and set correct URL when available # mcp-servers = { # url = "github:your-org/mcp-servers"; # flake = false; # }; }; outputs = { self, nixpkgs, ... }@inputs: let supportedSystems = [ "x86_64-linux" ]; pkgsFor = system: nixpkgs.legacyPackages.${system}.extend ( nixpkgs.lib.composeManyExtensions ([ ] ++ builtins.attrValues self.overlays) ); eachSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f (pkgsFor system)); buildUvServers = ( pkgs: let inherit (pkgs.callPackage inputs.pyproject-nix.build.util { }) mkApplication; workspace = inputs.uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; }; overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; }; python = pkgs.python313; pyprojectOverrides = final: prev: { sgmllib3k = prev.sgmllib3k.overrideAttrs (old: { nativeBuildInputs = old.nativeBuildInputs or [ ] ++ (final.resolveBuildSystem { setuptools-scm = [ ]; setuptools = [ ]; }); }); }; pythonSet = (pkgs.callPackage inputs.pyproject-nix.build.packages { inherit python; }).overrideScope ( nixpkgs.lib.composeManyExtensions [ inputs.pyproject-build-systems.overlays.default overlay pyprojectOverrides ] ); venv = (pythonSet.mkVirtualEnv "uv-mcp-envs" workspace.deps.default).overrideAttrs (_old: { venvIgnoreCollisions = [ "*" ]; }); in { arxiv-mcp-server = mkApplication { inherit venv; package = pythonSet.arxiv-mcp-server; }; basic-memory-server = mkApplication { inherit venv; package = pythonSet.basic-memory; }; mcp-text-editor = mkApplication { inherit venv; package = pythonSet.mcp-text-editor; }; } ); # Build function for MCP servers treefmtEval = eachSystem (pkgs: inputs.treefmt-nix.lib.evalModule pkgs ./treefmt.nix); in { # Formatting # formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.nixpkgs-fmt); formatter = eachSystem (pkgs: treefmtEval.${pkgs.system}.config.build.wrapper); # for `nix flake check` checks = eachSystem (pkgs: { formatting = treefmtEval.${pkgs.system}.config.build.check self; }); # Overlays overlays.default = _final: prev: { custom-servers = buildUvServers prev; }; # Packages # packages = forAllSystems (system: # let # pkgs = pkgsFor system; # in buildUvServers { # pkgs = pkgs; # } #); # Development shell devShells = eachSystem ( pkgs: let uv-servers = buildUvServers pkgs; in { default = pkgs.mkShell { packages = [ pkgs.python313 pkgs.uv pkgs.nodejs pkgs.node2nix uv-servers.arxiv-mcp-server uv-servers.mcp-text-editor uv-servers.basic-memory-server ]; }; } ); }; }