npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

gentle-mcp

v0.1.0

Published

GENTLE - Game Engine Navigation Tool for Learning & Exploration. MCP server for Unreal Engine and PyQt6 documentation.

Readme

GENTLE

Game Engine Navigation Tool for Learning & Exploration

An MCP server providing instant semantic search across game development documentation. No more copy-pasting docs into your LLM - GENTLE gives your AI assistant direct access to Unreal Engine and PyQt6 documentation.

Overview

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1e40af', 'primaryTextColor': '#ffffff', 'primaryBorderColor': '#3b82f6', 'lineColor': '#3b82f6', 'secondaryColor': '#1e3a5f', 'tertiaryColor': '#0f172a', 'background': '#000000', 'subGraphLabelBgColor': '#1e40af', 'clusterBkg': '#0a0a0a', 'clusterBorder': '#3b82f6'}}}%%
graph LR
    subgraph "Your AI Assistant"
        LLM[Claude / GPT / etc]
    end

    subgraph "GENTLE MCP Server"
        MCP[MCP Protocol Handler]
        EMB[Embedder<br/>MiniLM-L6-v2]
        VS[Vector Store<br/>LanceDB]
    end

    LLM <-->|JSON-RPC| MCP
    MCP --> EMB
    EMB --> VS
    VS -->|Top K Results| MCP

Features

  • Semantic Search - Find relevant docs using natural language, not keyword matching
  • Fully Local - No API keys, no internet required at runtime
  • Fast - Sub-second queries against 68k+ documentation entries
  • Multi-Source - Unreal Python API, Console Commands, PyQt6 Reference & Tutorials

Documentation Sources

| Source | Entries | Description | |--------|--------:|-------------| | unreal-python | 60,563 | Classes, methods, properties, enums from UE5 Python API | | unreal-console | 8,055 | Console commands (stat, r., t.) and variables | | pyqt-reference | 36 | Official PyQt6 reference (signals, slots, properties) | | pyqt-tutorials | 53 | Practical PyQt6 tutorials with code examples | | Total | 68,707 | |

Tools

| Tool | Description | |------|-------------| | search_unreal_python | Search Unreal Engine Python API documentation | | search_unreal_console | Search console commands and variables | | search_pyqt_reference | Search PyQt6 official reference docs | | search_pyqt_tutorials | Search PyQt6 practical tutorials | | search_all | Search across all documentation sources | | list_sources | List available sources with entry counts |

Installation

No build steps required - embeddings are pre-built and included in the package.

Claude Desktop

Add to your config file:

  • Linux: ~/.config/Claude/claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "gentle": {
      "command": "npx",
      "args": ["gentle-mcp"]
    }
  }
}

Cursor

Add to .cursor/mcp.json in your project root (or global settings):

{
  "mcpServers": {
    "gentle": {
      "command": "npx",
      "args": ["gentle-mcp"]
    }
  }
}

Cline (VS Code Extension)

Open VS Code Settings → Cline → MCP Servers, then add:

{
  "gentle": {
    "command": "npx",
    "args": ["gentle-mcp"]
  }
}

Windsurf

Add to ~/.windsurf/mcp_config.json:

{
  "mcpServers": {
    "gentle": {
      "command": "npx",
      "args": ["gentle-mcp"]
    }
  }
}

Claude Code (CLI)

Add to ~/.claude/settings.json:

{
  "mcpServers": {
    "gentle": {
      "command": "npx",
      "args": ["gentle-mcp"]
    }
  }
}

Global Installation (Optional)

If you prefer a global install instead of npx:

npm install -g gentle-mcp

Then use "command": "gentle-mcp" with no args in your config.

Usage Examples

Once configured, ask your AI assistant questions like:

| Query | Best Tool | |-------|-----------| | "How do I spawn an actor at a location?" | search_unreal_python | | "What console command shows FPS?" | search_unreal_console | | "Create a button with click handler" | search_pyqt_tutorials | | "What signals does QLineEdit emit?" | search_pyqt_reference |

Architecture

Search Flow

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1e40af', 'primaryTextColor': '#ffffff', 'primaryBorderColor': '#3b82f6', 'lineColor': '#3b82f6', 'actorBkg': '#1e40af', 'actorTextColor': '#ffffff', 'actorBorder': '#3b82f6', 'signalColor': '#3b82f6', 'signalTextColor': '#ffffff', 'background': '#000000', 'sequenceNumberColor': '#ffffff'}}}%%
sequenceDiagram
    participant User
    participant LLM as AI Assistant
    participant MCP as GENTLE
    participant EMB as Embedder
    participant DB as LanceDB

    User->>LLM: "How do I spawn an actor?"
    LLM->>MCP: search_unreal_python({query: "spawn actor"})
    MCP->>EMB: embedText("spawn actor")
    EMB-->>MCP: [0.23, -0.41, ...] (384 dims)
    MCP->>DB: vectorSearch(embedding, limit=5)
    DB-->>MCP: Top 5 chunks by cosine similarity
    MCP-->>LLM: {results: [...], totalResults: 5}
    LLM->>User: "Use Actor.spawn() method..."

Data Pipeline

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1e40af', 'primaryTextColor': '#ffffff', 'primaryBorderColor': '#3b82f6', 'lineColor': '#3b82f6', 'secondaryColor': '#1e3a5f', 'tertiaryColor': '#0f172a', 'background': '#000000', 'subGraphLabelBgColor': '#1e40af', 'clusterBkg': '#0a0a0a', 'clusterBorder': '#3b82f6'}}}%%
flowchart TD
    subgraph Sources
        UP[Unreal Python API<br/>unreal.py]
        UC[Console Commands<br/>console-commands.md]
        PR[PyQt6 Reference<br/>reference.md]
        PT[PyQt6 Tutorials<br/>tutorials.md]
    end

    subgraph Parsing
        P1[parse-unreal-python.ts]
        P2[parse-unreal-console.ts]
        P3[parse-pyqt.ts]
    end

    subgraph "Embedding Pipeline"
        CHK[DocChunks<br/>68,707 entries]
        EMB[MiniLM-L6-v2<br/>384 dimensions]
        VEC[Vectors + Metadata]
    end

    subgraph Storage
        LDB[(LanceDB<br/>~100MB)]
    end

    UP --> P1
    UC --> P2
    PR --> P3
    PT --> P3

    P1 --> CHK
    P2 --> CHK
    P3 --> CHK

    CHK --> EMB
    EMB --> VEC
    VEC --> LDB

Chunk Structure

Each documentation entry is stored as a chunk:

interface DocChunk {
  id: string;           // "unreal-python:class:Actor"
  source: DocSource;    // "unreal-python" | "unreal-console" | ...
  type: DocType;        // "class" | "method" | "property" | ...
  name: string;         // "Actor"
  parentName?: string;  // "EditorUtilityLibrary"
  content: string;      // Full documentation text
  version?: string;     // "5.4"
  embedding: number[];  // 384-dim vector
}

Development

Setup

git clone https://github.com/yourusername/gentle-mcp
cd gentle-mcp
npm install

Scripts

| Script | Description | |--------|-------------| | npm run dev | Run development server with hot reload | | npm run build | Compile TypeScript to dist/ | | npm run fetch | Download source documentation | | npm run parse | Parse sources into chunks | | npm run embed | Generate embeddings and populate LanceDB | | npm run setup | Run fetch + parse + embed | | npm run check | Run typecheck and linting |

Project Structure

gentle-mcp/
├── src/
│   ├── index.ts          # MCP server entry point
│   ├── embedder.ts       # MiniLM embedding wrapper
│   ├── db/
│   │   └── vector-store.ts   # LanceDB interface
│   ├── tools/
│   │   └── search.ts     # Search tool implementations
│   └── types/
│       └── index.ts      # TypeScript type definitions
├── scripts/
│   ├── fetch-sources.ts  # Download documentation
│   ├── parse-all.ts      # Parse all sources
│   ├── embed-all.ts      # Generate embeddings
│   └── parsers/          # Source-specific parsers
├── sources/              # Raw documentation files
├── data/
│   ├── chunks/           # Parsed JSON chunks
│   └── lancedb/          # Vector database
└── dist/                 # Compiled output

Requirements

  • Node.js 24+
  • ~100MB disk space (embeddings + vector database)

How It Works

  1. Parsing: Documentation files are parsed into semantic chunks (classes, methods, etc.)
  2. Embedding: Each chunk is embedded using MiniLM-L6-v2 (local, ~30MB model)
  3. Storage: Embeddings + metadata stored in LanceDB (local, columnar, fast)
  4. Search: User queries are embedded and matched via cosine similarity
  5. Response: Top-K most relevant chunks returned to the LLM

Everything runs locally. No external API calls at runtime.

License

MIT