mcp-servers-nix

mcp-servers-nix

A Nix-based configuration framework for Model Control Protocol (MCP) servers with ready-to-use packages.

natsukium

Developer Tools
Visit Server

README

mcp-servers-nix

A Nix-based configuration framework for Model Control Protocol (MCP) servers with ready-to-use packages.

Overview

This repository provides both MCP server packages and a Nix framework for configuring and deploying MCP servers. It offers a modular approach to configuring various MCP servers with a consistent interface.

Features

  • Modular Configuration: Define and combine multiple MCP server configurations
  • Reproducible Builds: Leverage Nix for reproducible and declarative server setups
  • Pre-configured Modules: Ready-to-use configurations for popular MCP server types
  • Security-focused: Better handling credentials and sensitive information through envFile and passwordCommand, with pinned server versions

Getting Started

Quick Usage Without Installation

You can run MCP server packages directly without installing them:

# Using nix-shell
nix-shell -p "(import (builtins.fetchTarball \"https://github.com/natsukium/mcp-servers-nix/archive/main.tar.gz\") {}).mcp-server-fetch" --run mcp-server-fetch

# Using flakes
nix run github:natsukium/mcp-servers-nix#mcp-server-fetch

Installing Packages

There are several ways to install and use the packages provided by this repository:

Direct Package Installation

You can install individual MCP server packages directly with:

# Without flakes
nix-env -f https://github.com/natsukium/mcp-servers-nix/archive/main.tar.gz -iA mcp-server-fetch

# Using flakes
nix profile install github:natsukium/mcp-servers-nix#mcp-server-fetch

Using Overlays

You can use the provided overlays to add all MCP server packages to your pkgs:

# In your configuration.nix or home.nix
{
  nixpkgs.overlays = [
    # classic
    (import (builtins.fetchTarball "https://github.com/natsukium/mcp-servers-nix/archive/main.tar.gz")).overlays.default
    # or with flakes
    # mcp-servers-nix.overlays.default 
  ];

  # Then you can install packages through `pkgs`
  environment.systemPackages = with pkgs; [
    mcp-server-fetch
  ];
}

Module Usage

Classic approach without flakes

  1. Create a configuration file:
# config.nix
let
  pkgs = import (builtins.fetchTarball "https://github.com/NixOS/nixpkgs/archive/refs/heads/nixos-unstable.tar.gz") { };
  mcp-servers = import (builtins.fetchTarball "https://github.com/natsukium/mcp-servers-nix/archive/refs/heads/main.tar.gz") { inherit pkgs; };
in
mcp-servers.lib.mkConfig pkgs {
  programs = {
    filesystem.enable = true;
    fetch.enable = true;
    # Add more modules as needed
  };
}
  1. Build your configuration:
nix-build config.nix
// result
{
  "mcpServers": {
    "fetch": {
      "args": [],
      "command": "/nix/store/dbx03yjf6h14h5rvdppzj2fyhfjpx99g-mcp-server-fetch-2025.3.28/bin/mcp-server-fetch",
      "env": {}
    },
    "filesystem": {
      "args": [],
      "command": "/nix/store/i0v4ynavmz3iilr27c7iqg4dc3xxnygb-mcp-server-filesystem-2025.3.28/bin/mcp-server-filesystem",
      "env": {}
    }
  }
}

Using npins

npins is a simple dependency pinning tool that allows you to guarantee reproducible builds without using flakes:

  1. Initialize npins in your project:
npins init
  1. Add mcp-servers-nix as a dependency:
npins add github natsukium mcp-servers-nix -b main
  1. Create your configuration using the pinned version:
# config.nix
let
  sources = import ./npins;
  pkgs = import sources.nixpkgs {};
  mcp-servers = import sources.mcp-servers-nix {};
in
mcp-servers.lib.mkConfig pkgs {
  programs = {
    filesystem.enable = true;
    fetch.enable = true;
    # Add more modules as needed
  };
}
  1. Build your configuration:
nix-build config.nix

Using Flakes

  1. Create a configuration file:
# flake.nix
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    mcp-servers-nix.url = "github:natsukium/mcp-servers-nix";
  };

  outputs =
    {
      self,
      nixpkgs,
      mcp-servers-nix,
    }:
    {
      packages.x86_64-linux.default =
        let
          pkgs = import nixpkgs { system = "x86_64-linux"; };
        in
        mcp-servers-nix.lib.mkConfig pkgs {
          programs = {
            filesystem.enable = true;
            fetch.enable = true;
          };
        };
    };
}
  1. Build your configuration:
nix build

Examples

Check the examples directory for complete configuration examples:

Real World Examples

Check out GitHub search results for examples of how others are using mcp-servers-nix in their projects.

Configuration Options

Each module provides specific configuration options, but there are some common options available for all modules:

Global Options

  • format: Configuration file format (json or yaml, default: json)
  • flavor: Configuration file type (claude or vscode, default: claude)
  • fileName: Configuration file name (default: claude_desktop_config.json)
  • settings: Custom settings that will be merged with the generated configuration

Common Module Options

Each enabled module (using programs.<module>.enable = true;) provides the following options:

  • package: The package to use for this module
  • type: Server connection type (sse or stdio, default: null)
  • args: Array of arguments passed to the command (default: [])
  • env: Environment variables for the server (default: {})
  • url: URL of the server for "sse" connections (default: null)
  • envFile: Path to an .env file from which to load additional environment variables (default: null)
  • passwordCommand: Command to execute to retrieve secrets in the format "KEY=VALUE" which will be exported as environment variables, useful for integrating with password managers (default: null)

Security Note

For security reasons, do not hardcode authentication credentials in the env attribute. All files in /nix/store can be read by anyone with access to the store. Always use envFile or passwordCommand instead.

The system automatically wraps the package when either envFile or passwordCommand is set, which allows secure retrieval of credentials without exposing them in the Nix store.

Available Modules

The framework includes modules for the following MCP servers:

Adding Custom Servers

You can add your own custom MCP servers by configuring them directly in the settings.servers section. This is useful for integrating MCP servers that are not included in this repository.

Example: Adding Obsidian Integration

Here's an example of how to add the mcp-obsidian server to integrate with Obsidian:

mcp-servers.lib.mkConfig pkgs {
  format = "yaml";
  fileName = "config.yaml";
  
  # Configure built-in modules
  programs = {
    filesystem = {
      enable = true;
      args = [ "/path/to/files" ];
    };
  };
  
  # Add custom MCP servers
  settings.servers = {
    mcp-obsidian = {
      command = "${pkgs.lib.getExe' pkgs.nodejs "npx"}";
      args = [
        "-y"
        "mcp-obsidian"
        "/path/to/obsidian/vault"
      ];
    };
  };
}

This approach allows you to integrate any MCP-compatible server into your configuration without needing to create a dedicated module.

Refer to individual module source files in the modules/ directory for module-specific configuration options.

Adding New MCP Servers

You can extend mcp-servers-nix with new MCP servers by adding both package definitions and module configurations.

Package Structure

  1. Official packages go in pkgs/official/
  2. Reference implementations go in pkgs/reference/
  3. Community implementations go in pkgs/community/

Example: Adding a New Official Server Package

Create a new package definition in pkgs/official/new-mcp-server/default.nix:

{
  lib,
  fetchFromGitHub,
  buildNpmPackage,
}:

buildNpmPackage rec {
  pname = "new-mcp-server";
  version = "0.1.0";

  src = fetchFromGitHub {
    owner = "new-mcp-server";
    repo = "new-mcp-server";
    tag = "v${version}";
    hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
  };

  npmDepsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

  meta = {
    description = "New MCP server";
    homepage = "https://github.com/new-mcp-server/new-mcp-server";
    license = lib.licenses.asl20;
    maintainers = with lib.maintainers; [ username ];
    mainProgram = "new-mcp-server";
  };
}

Then register it in pkgs/default.nix:

{
  # ... existing packages ...
  
  # new server
  new-mcp-server = pkgs.callPackage ./official/new-mcp-server { };
}

Module Configuration

Create a new module in modules/new-mcp-server.nix:

{ mkServerModule, ... }:
{
  imports = [
    (mkServerModule {
      name = "new-mcp-server";
      packageName = "new-mcp-server";
    })
  ];
}

The mkServerModule function provides the framework for creating module configurations with consistent options. See its implementation for more details about available features.

Adding Custom Module Options

In addition to the common options provided by mkServerModule, you can define custom options for your module. This allows you to expose server-specific configuration that can be set by users.

{ config, pkgs, lib, mkServerModule, ... }:
let
  cfg = config.programs.new-mcp-server;
in
{
  imports = [
    (mkServerModule {
      name = "new-mcp-server";
      packageName = "new-mcp-server";
    })
  ];

  # Define custom options for this module
  options.programs.new-mcp-server = {
    customOption = lib.mkOption {
      type = lib.types.str;
      default = "default-value";
      description = ''
        Description of the custom option
      '';
    };
    
    binaryPath = lib.mkOption {
      type = lib.types.path;
      default = lib.getExe pkgs.some-package;
      description = ''
        Path to the binary required by the server
      '';
    };
  };

  # Use custom options to modify the server configuration
  config.settings.servers = lib.mkIf cfg.enable {
    new-mcp-server = {
      args = [
        "--option"
        cfg.customOption
        "--binary-path"
        cfg.binaryPath
      ];
    };
  };
}

For more complex servers, you can examine the existing implementations in the pkgs/ and modules/ directories as reference.

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
MCP Package Docs Server

MCP Package Docs Server

Facilitates LLMs to efficiently access and fetch structured documentation for packages in Go, Python, and NPM, enhancing software development with multi-language support and performance optimization.

Featured
Local
TypeScript
Claude Code MCP

Claude Code MCP

An implementation of Claude Code as a Model Context Protocol server that enables using Claude's software engineering capabilities (code generation, editing, reviewing, and file operations) through the standardized MCP interface.

Featured
Local
JavaScript
@kazuph/mcp-taskmanager

@kazuph/mcp-taskmanager

Model Context Protocol server for Task Management. This allows Claude Desktop (or any MCP client) to manage and execute tasks in a queue-based system.

Featured
Local
JavaScript
Linear MCP Server

Linear MCP Server

Enables interaction with Linear's API for managing issues, teams, and projects programmatically through the Model Context Protocol.

Featured
JavaScript
mermaid-mcp-server

mermaid-mcp-server

A Model Context Protocol (MCP) server that converts Mermaid diagrams to PNG images.

Featured
JavaScript
Jira-Context-MCP

Jira-Context-MCP

MCP server to provide Jira Tickets information to AI coding agents like Cursor

Featured
TypeScript
Linear MCP Server

Linear MCP Server

A Model Context Protocol server that integrates with Linear's issue tracking system, allowing LLMs to create, update, search, and comment on Linear issues through natural language interactions.

Featured
JavaScript
Sequential Thinking MCP Server

Sequential Thinking MCP Server

This server facilitates structured problem-solving by breaking down complex issues into sequential steps, supporting revisions, and enabling multiple solution paths through full MCP integration.

Featured
Python