Files
claude_mcp_bundle/flake.nix
2025-03-15 18:09:26 -05:00

153 lines
3.7 KiB
Nix

{
description = "Flake that contains an overlay with some mcp servers";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
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";
};
arxiv-mcp-server = {
url = "github:blazickjp/arxiv-mcp-server/main";
flake = false;
};
basic-memory-mcp = {
url = "github:basicmachines-co/basic-memory/main";
flake = false;
};
# 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" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
pkgsFor = system: nixpkgs.legacyPackages.${system}.extend(
nixpkgs.lib.composeManyExtensions (
[] ++ builtins.attrValues self.overlays
)
);
buildUvServer = { src, pkgs, venvName }:
let
workspace = inputs.uv2nix.lib.workspace.loadWorkspace { workspaceRoot = "${src}/"; };
overlay = workspace.mkPyprojectOverlay {
sourcePreference = "wheel";
};
python = pkgs.python312;
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
]
);
in
pythonSet.mkVirtualEnv venvName workspace.deps.default;
# Build function for MCP servers
buildMcpServer = { pkgs }:
pkgs.stdenv.mkDerivation {
pname = "mcp-servers";
version = "0.1.0";
src = inputs.mcp-servers;
nativeBuildInputs = [ pkgs.nodejs pkgs.makeWrapper ];
buildPhase = ''
export HOME=$(mktemp -d)
ls -alhR
echo "starting to build..."
npm ci --no-audit --no-fund --loglevel verbose
'';
installPhase = ''
mkdir -p $out/lib $out/bin
cp -r . $out/lib
cp -r node_modules/bin $out/bin
'';
};
custom-serversFor = { pkgs }: {
arxiv-mcp-server = buildUvServer {
pkgs = pkgs;
src = inputs.arxiv-mcp-server;
venvName = "arxiv-mcp-env";
};
basic-memory-mcp = buildUvServer {
pkgs = pkgs;
src = inputs.basic-memory-mcp;
venvName = "basic-memory-mcp-env";
};
};
in {
# Formatting
formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.nixpkgs-fmt);
# Overlays
overlays.default = final: prev: {
custom-servers = custom-serversFor {
pkgs = prev;
};
};
# Packages
packages = forAllSystems (system:
let
pkgs = pkgsFor system;
in custom-serversFor {
pkgs = pkgs;
}
);
# Development shell
devShells = forAllSystems (system:
let pkgs = pkgsFor system;
custom-servers = custom-serversFor { inherit pkgs; };
in {
default = pkgs.mkShell {
packages = [
# pkgs.uv
# pkgs.nodejs
custom-servers.arxiv-mcp-server
custom-servers.basic-memory-mcp
];
};
}
);
};
}