Initial commit: MCP server packages for Nix
- Add flake structure with overlay and packages exports - Add manim-mcp-server as first packaged MCP server - Add README.org with usage instructions and package templates - Add packages/default.nix as package aggregator - Add overlays/default.nix for nixpkgs integration
This commit is contained in:
304
README.org
Normal file
304
README.org
Normal file
@@ -0,0 +1,304 @@
|
||||
#+TITLE: MCP Server Packages for Nix
|
||||
#+AUTHOR:
|
||||
#+DESCRIPTION: Nix derivations for Model Context Protocol (MCP) servers
|
||||
|
||||
* Overview
|
||||
|
||||
This repository provides Nix derivations for MCP (Model Context Protocol) servers that are not yet available in nixpkgs.
|
||||
|
||||
* Available Packages
|
||||
|
||||
| Package | Description | Language |
|
||||
|--------------------+------------------------------------------------------+----------|
|
||||
| manim-mcp-server | Execute Manim animation code and return videos | Python |
|
||||
|
||||
* Usage
|
||||
|
||||
** Using the Overlay (Recommended)
|
||||
|
||||
Add this flake to your inputs and apply the overlay:
|
||||
|
||||
#+begin_src nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
mcp.url = "github:YOUR-USERNAME/mcp"; # Update with your repo
|
||||
};
|
||||
|
||||
outputs = { nixpkgs, mcp, ... }: {
|
||||
# Apply the overlay to get packages in pkgs
|
||||
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
{
|
||||
nixpkgs.overlays = [ mcp.overlays.default ];
|
||||
}
|
||||
# Now you can use pkgs.manim-mcp-server
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** Using Packages Directly
|
||||
|
||||
Access packages without the overlay:
|
||||
|
||||
#+begin_src nix
|
||||
{
|
||||
inputs.mcp.url = "github:YOUR-USERNAME/mcp";
|
||||
|
||||
outputs = { mcp, ... }: {
|
||||
# Access directly
|
||||
myPackage = mcp.packages.x86_64-linux.manim-mcp-server;
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** In a Development Shell
|
||||
|
||||
#+begin_src nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
mcp.url = "github:YOUR-USERNAME/mcp";
|
||||
};
|
||||
|
||||
outputs = { nixpkgs, mcp, ... }:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ mcp.overlays.default ];
|
||||
};
|
||||
in {
|
||||
devShells.${system}.default = pkgs.mkShell {
|
||||
packages = [
|
||||
pkgs.manim-mcp-server
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
* Adding New Packages
|
||||
|
||||
** Directory Structure
|
||||
|
||||
#+begin_example
|
||||
packages/
|
||||
├── default.nix # Package aggregator
|
||||
└── <package-name>/
|
||||
└── package.nix # Package derivation
|
||||
#+end_example
|
||||
|
||||
** Step-by-Step Guide
|
||||
|
||||
1. *Create the package directory*
|
||||
#+begin_src bash
|
||||
mkdir -p packages/<package-name>
|
||||
#+end_src
|
||||
|
||||
2. *Create =package.nix=* using the appropriate builder for the language:
|
||||
|
||||
- Python (with pyproject.toml): =python3Packages.buildPythonApplication=
|
||||
- Python (script only): wrapper approach with =stdenv.mkDerivation=
|
||||
- Go: =buildGoModule=
|
||||
- Node.js: =buildNpmPackage=
|
||||
- Rust: =rustPlatform.buildRustPackage=
|
||||
|
||||
3. *Register in =packages/default.nix=*
|
||||
#+begin_src nix
|
||||
{ pkgs }:
|
||||
{
|
||||
manim-mcp-server = pkgs.callPackage ./manim-mcp-server/package.nix { };
|
||||
# Add your new package here:
|
||||
new-mcp-server = pkgs.callPackage ./new-mcp-server/package.nix { };
|
||||
}
|
||||
#+end_src
|
||||
|
||||
4. *Build and test*
|
||||
#+begin_src bash
|
||||
nix build .#<package-name>
|
||||
./result/bin/<package-name>
|
||||
#+end_src
|
||||
|
||||
** Package Templates
|
||||
|
||||
*** Python (with pyproject.toml)
|
||||
|
||||
#+begin_src nix
|
||||
{ lib, python3Packages, fetchFromGitHub }:
|
||||
|
||||
python3Packages.buildPythonApplication rec {
|
||||
pname = "example-mcp-server";
|
||||
version = "1.0.0";
|
||||
pyproject = true;
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "owner";
|
||||
repo = "repo";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-AAAA..."; # Use lib.fakeHash first, then update
|
||||
};
|
||||
|
||||
build-system = [ python3Packages.hatchling ];
|
||||
|
||||
dependencies = with python3Packages; [
|
||||
mcp
|
||||
fastmcp
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Description of the MCP server";
|
||||
homepage = "https://github.com/owner/repo";
|
||||
license = licenses.mit;
|
||||
mainProgram = "example-mcp-server";
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
*** Python (script only, like manim-mcp-server)
|
||||
|
||||
#+begin_src nix
|
||||
{ lib, stdenv, fetchFromGitHub, makeWrapper, python3 }:
|
||||
|
||||
let
|
||||
python = python3.withPackages (ps: with ps; [
|
||||
mcp
|
||||
fastmcp
|
||||
# other dependencies
|
||||
]);
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "example-mcp-server";
|
||||
version = "0.0.1-unstable";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "owner";
|
||||
repo = "repo";
|
||||
rev = "commit-hash";
|
||||
hash = "sha256-AAAA...";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
dontBuild = true;
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
mkdir -p $out/bin $out/lib/${pname}
|
||||
cp src/server.py $out/lib/${pname}/
|
||||
makeWrapper ${python}/bin/python $out/bin/${pname} \
|
||||
--add-flags "$out/lib/${pname}/server.py"
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Description";
|
||||
homepage = "https://github.com/owner/repo";
|
||||
license = licenses.mit;
|
||||
mainProgram = pname;
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
*** Go
|
||||
|
||||
#+begin_src nix
|
||||
{ lib, buildGoModule, fetchFromGitHub }:
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "example-mcp-server";
|
||||
version = "1.0.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "owner";
|
||||
repo = "repo";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-AAAA...";
|
||||
};
|
||||
|
||||
vendorHash = "sha256-BBBB..."; # Use lib.fakeHash first
|
||||
|
||||
ldflags = [
|
||||
"-s" "-w"
|
||||
"-X main.version=${version}"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Description";
|
||||
homepage = "https://github.com/owner/repo";
|
||||
license = licenses.mit;
|
||||
mainProgram = pname;
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
*** Node.js
|
||||
|
||||
#+begin_src nix
|
||||
{ lib, buildNpmPackage, fetchFromGitHub }:
|
||||
|
||||
buildNpmPackage rec {
|
||||
pname = "example-mcp-server";
|
||||
version = "1.0.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "owner";
|
||||
repo = "repo";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-AAAA...";
|
||||
};
|
||||
|
||||
npmDepsHash = "sha256-BBBB..."; # Use lib.fakeHash first
|
||||
|
||||
dontNpmBuild = true; # If pre-built or no build step needed
|
||||
|
||||
meta = with lib; {
|
||||
description = "Description";
|
||||
homepage = "https://github.com/owner/repo";
|
||||
license = licenses.mit;
|
||||
mainProgram = pname;
|
||||
};
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** Calculating Hashes
|
||||
|
||||
When adding a new package, use =lib.fakeHash= initially:
|
||||
|
||||
#+begin_src nix
|
||||
hash = lib.fakeHash;
|
||||
#+end_src
|
||||
|
||||
Then run =nix build= and copy the correct hash from the error message.
|
||||
|
||||
* Development
|
||||
|
||||
** Enter Development Shell
|
||||
|
||||
#+begin_src bash
|
||||
nix develop
|
||||
#+end_src
|
||||
|
||||
** Build a Specific Package
|
||||
|
||||
#+begin_src bash
|
||||
nix build .#manim-mcp-server
|
||||
#+end_src
|
||||
|
||||
** Build All Packages
|
||||
|
||||
#+begin_src bash
|
||||
nix build .#default
|
||||
#+end_src
|
||||
|
||||
** List Available Packages
|
||||
|
||||
#+begin_src bash
|
||||
nix flake show
|
||||
#+end_src
|
||||
|
||||
* License
|
||||
|
||||
Each packaged MCP server retains its original license. The Nix expressions in this repository are provided as-is.
|
||||
Reference in New Issue
Block a user