# CLAUDE.md - Project Context This file provides context for Claude when working on this project. ## Project Overview **LabMCP** is a collection of Model Context Protocol (MCP) servers written in Go, designed to extend Claude's capabilities with custom tools. The repository is structured to be generic and extensible, allowing multiple MCP servers to be added over time. ## MCP Servers ### Nixpkgs Search (`nixpkgs-search`) - **Primary** Combined search for NixOS options and Nix packages from nixpkgs. Provides two separate MCP servers: - **Options server**: Search NixOS configuration options (`nixpkgs-search options serve`) - **Packages server**: Search Nix packages (`nixpkgs-search packages serve`) ### NixOS Options (`nixos-options`) - Legacy Search and query NixOS configuration options. Uses nixpkgs as source. *Note: Prefer using `nixpkgs-search options` instead.* ### Home Manager Options (`hm-options`) Search and query Home Manager configuration options. Uses home-manager repository as source. All servers share the same architecture: - Full-text search across option/package names and descriptions - Query specific options/packages with full metadata - Index multiple revisions (by git hash or channel name) - Fetch module source files - PostgreSQL and SQLite backends ## Technology Stack - **Language**: Go 1.24+ - **Build System**: Nix flakes - **Databases**: PostgreSQL and SQLite (both fully supported) - **Protocol**: MCP (Model Context Protocol) - JSON-RPC over STDIO or HTTP/SSE - **Module Path**: `git.t-juice.club/torjus/labmcp` ## Project Status **Complete and maintained** - All core features implemented: - Full MCP servers with 6 tools each - PostgreSQL and SQLite backends with FTS - NixOS modules for deployment - CLI for manual operations - Comprehensive test suite ## Repository Structure ``` labmcp/ ├── cmd/ │ ├── nixpkgs-search/ │ │ └── main.go # Combined options+packages CLI (primary) │ ├── nixos-options/ │ │ └── main.go # NixOS options CLI (legacy) │ └── hm-options/ │ └── main.go # Home Manager options CLI ├── internal/ │ ├── database/ │ │ ├── interface.go # Store interface (options + packages) │ │ ├── schema.go # Schema versioning │ │ ├── postgres.go # PostgreSQL implementation │ │ ├── sqlite.go # SQLite implementation │ │ └── *_test.go # Database tests │ ├── mcp/ │ │ ├── server.go # MCP server core + ServerConfig + modes │ │ ├── handlers.go # Tool implementations (options + packages) │ │ ├── types.go # Protocol types │ │ ├── transport.go # Transport interface │ │ ├── transport_stdio.go # STDIO transport │ │ ├── transport_http.go # HTTP/SSE transport │ │ ├── session.go # HTTP session management │ │ └── *_test.go # MCP tests │ ├── options/ │ │ └── indexer.go # Shared Indexer interface │ ├── nixos/ │ │ ├── indexer.go # NixOS options indexing │ │ ├── parser.go # options.json parsing │ │ ├── types.go # Channel aliases, extensions │ │ └── *_test.go # Indexer tests │ ├── homemanager/ │ │ ├── indexer.go # Home Manager indexing │ │ ├── types.go # Channel aliases, extensions │ │ └── *_test.go # Indexer tests │ └── packages/ │ ├── indexer.go # Nix packages indexing │ ├── parser.go # nix-env JSON parsing │ ├── types.go # Package types, channel aliases │ └── *_test.go # Parser tests ├── nix/ │ ├── module.nix # NixOS module for nixos-options │ ├── hm-options-module.nix # NixOS module for hm-options │ └── package.nix # Parameterized Nix package ├── testdata/ │ └── options-sample.json # Test fixture ├── flake.nix ├── go.mod ├── .mcp.json # MCP client configuration ├── CLAUDE.md # This file ├── README.md └── TODO.md # Future improvements ``` ## MCP Tools ### Options Servers (nixpkgs-search options, nixos-options, hm-options) | Tool | Description | |------|-------------| | `search_options` | Full-text search across option names and descriptions | | `get_option` | Get full details for a specific option with children | | `get_file` | Fetch source file contents from indexed repository | | `index_revision` | Index a revision (by hash or channel name) | | `list_revisions` | List all indexed revisions | | `delete_revision` | Delete an indexed revision | ### Packages Server (nixpkgs-search packages) | Tool | Description | |------|-------------| | `search_packages` | Full-text search across package names and descriptions | | `get_package` | Get full details for a specific package by attr path | | `get_file` | Fetch source file contents from nixpkgs | | `list_revisions` | List all indexed revisions | | `delete_revision` | Delete an indexed revision | ## Key Implementation Details ### Database - Schema versioning with automatic recreation on version mismatch - Full-text search: SQLite FTS5, PostgreSQL tsvector/GIN - Path-based queries use LIKE for exact prefix matching - Batch operations for efficient indexing ### Indexing - Uses `nix-build` to evaluate options from any revision - File indexing downloads tarball and stores allowed extensions (.nix, .json, .md, etc.) - File indexing enabled by default (use `--no-files` to skip) - Skips already-indexed revisions (use `--force` to re-index) ### Transports - **STDIO**: Default transport, line-delimited JSON-RPC (for CLI/desktop MCP clients) - **HTTP**: Streamable HTTP transport with SSE (for web-based MCP clients) - Session management with cryptographically secure IDs - Configurable CORS (localhost-only by default) - Optional TLS support - SSE keepalive messages (15s default) ### Security - Revision parameter validated against strict regex to prevent Nix injection - Path traversal protection using `filepath.Clean()` and `filepath.IsAbs()` - NixOS module supports `connectionStringFile` for PostgreSQL secrets - Systemd service runs with extensive hardening options - HTTP transport hardening: - Request body size limit (1MB default) - Server timeouts (read: 30s, write: 30s, idle: 120s, header: 10s) - Maximum session limit (10,000 default) - Origin validation for CORS ## CLI Commands ### nixpkgs-search (Primary) ```bash # Options MCP Server nixpkgs-search options serve # Run options MCP server on STDIO nixpkgs-search options search # Search options nixpkgs-search options get