Skip to main content
Glama

quillrag

Eine Datei. Null Abhängigkeiten. Bereit, bevor dein Editor fertig geladen hat.

Eine lokale RAG-Engine in einer einzigen statischen Binärdatei – MiniLM-Embeddings einkompiliert, hybrides Dense- + BM25-Retrieval, MCP-nativ. Kein Node, kein Python, kein Modell-Download bei der ersten Abfrage.

release platforms license


Warum quillrag

~20 ms bis bereit

Der MCP-Handshake ist abgeschlossen, bevor das Modell überhaupt lädt

Keine Laufzeitabhängigkeiten

kein Node, kein Python, kein pip/npm, keine Modell-Downloads – niemals

Hybrid-Retrieval

Dense-Cosine ⊕ BM25, fusioniert mit Reciprocal Rank Fusion

Privat durch Konstruktion

kein Netzwerk-Codepfad nach der Installation

Eine Datei, drei Betriebssysteme

~105 MB (das Modell lebt darin), CI-gebaut für linux/macOS/Windows

Related MCP server: mcp-fts5-starter

Schnellstart

# 1. grab a prebuilt binary (or cargo install --path .)
gh release download --repo Ayush-yadav11/quillrag -p '*linux*'
tar xzf quillrag-x86_64-linux.tar.gz && chmod +x quillrag

# 2. point it at any folder of notes/docs/code
./quillrag index ~/notes          # incremental walk

# 3. ask it something
./quillrag search "how does backpropagation work"

Oder binde es direkt in Claude Desktop / Cursor ein und lass die KI deine Notizen mitten im Gespräch durchsuchen – Konfiguration unten.

$ ./quillrag serve --data-dir ~/.local/share/quillrag
2026-08-26 INFO quillrag 0.1.2 ready in 41ms      <- handshake-ready before the model loads

Warum es schnell ist

Phase

Aufwand

Binärstart + MCP-Initialisierung

~20 ms (gemessen: nur Store-Öffnung + Tool-Registrierung)

Erster rag_search / rag_index-Aufruf

+~300 ms einmalig (mmap safetensors, BERT-Graph aufbauen)

Nachfolgende Suchen

~25 ms pro Abfrage (2-Kern-CPU, kleiner Korpus)

Neuindizierung unveränderten Korpus

nahezu null (Überspringen per FNV-Inhaltshash)

Das Embedding-Modell ist lazy: Der MCP-Handshake und rag_status berühren es nie, daher sehen Editoren einen sofort bereiten Server.

Installation

Lade ein vorgefertigtes Archiv aus dem neuesten Release herunter – Windows x86_64, macOS Apple Silicon und Linux x86_64 werden von CI bei jedem Versions-Tag gebaut:

# linux/macOS example: fetch + extract the latest release
gh release download --repo Ayush-yadav11/quillrag -p '*linux*' | tar xz
chmod +x quillrag && ./quillrag --version

Oder aus dem Quellcode bauen:

cargo install --path .

Von CI verwendete Cross-Compile-Ziele: x86_64-unknown-linux-gnu, aarch64-apple-darwin, x86_64-pc-windows-msvc.

In deinen Editor einbinden

Claude Desktop / Cursor / jeder MCP-Client:

{
  "mcpServers": {
    "quillrag": {
      "command": "/usr/local/bin/quillrag",
      "args": ["serve"],
      "env": { "QUILLRAG_DATA": "~/.local/share/quillrag" }
    }
  }
}

Oder führe einfach ./quillrag serve aus und richte einen beliebigen stdio-Client darauf aus.

Tools

Tool

Funktion

rag_index

Indiziert inkrementell ein Verzeichnis/eine Datei. Überspringt unveränderte Dateien, entfernt gelöschte, bettet nur Änderungen neu ein.

rag_search

Hybride Suche: Dense-MiniLM-Cosine + BM25-Keywords, fusioniert mit Reciprocal Rank Fusion. Liefert gerankte Chunks mit Quellpfaden.

rag_status

Dokument-/Chunk-Anzahl, indizierte Bytes, Dateityp-Aufschlüsselung.

rag_clear

Alles löschen.

CLI-Äquivalente (gleiche Engine):

quillrag index ~/notes              # incremental walk
quillrag search "auth flow" -k 5    # one-shot search
quillrag status                     # stats
quillrag clear                      # wipe

Design

  • Embeddings: candle (reines Rust) mit sentence-transformers/all-MiniLM-L6-v2 – maskiertes Mean-Pooling + L2-Norm, numerisch übereinstimmend mit sentence-transformers auf der CPU. Die Gewichte werden per include_bytes! in die Binärdatei eingebettet und beim ersten Laden aus einem materialisierten Cache gemappt (mmap).

  • Speicher: eine einzige redb-Datei – Chunk-Text, rohe f32-Vektoren, Dokument-Metadaten. Atomare Commits; absturzsicher.

  • Keywords: tantivy BM25-Sidecar-Index, der bei jedem Indizierungslauf neu aufgebaut wird (günstig bei kleinen Datenmengen).

  • Fusion: Reciprocal Rank Fusion (Σ 1/(60+rank)) – keine Score-Skalierungs-Anpassung, robust gegenüber heterogenen Rankings.

  • Chunking: absatzbasiert mit 1000-Zeichen-Limit und 120-Zeichen-Überlappung; überlange Absätze werden an Satzgrenzen hart geteilt.

Standardmäßig indizierte Dateitypen

md markdown txt rst json yaml yml toml csv tsv html htm xml log rs py js jsx ts tsx go c h cpp hpp java rb sh bash zsh sql proto graphql dockerfile makefile ini cfg conf env – erweitern mit -e ext1,ext2 / "extensions": [...].

Ignorierte Verzeichnisse: jedes Dot-Verzeichnis (.git .obsidian .vscode …) sowie node_modules target dist build venv __pycache__ vendor.

Datenschutz & Ressourcenbedarf

Alles läuft lokal: Embeddings, Speicher, Suche. Nichts verlässt die Maschine – es gibt nach der Installation überhaupt keinen Netzwerk-Codepfad.

Binärdatei ≈ 105 MB (das Modell lebt darin). RAM ≈ 120 MB resident im Leerlauf, mit Spitzen von ~250 MB während des Batch-Embeddings.

Skalierung & Grenzen

quillrag speichert alles in einer einzigen redb-Datei und führt das Dense-Retrieval als exakten, single-threaded linearen Scan über alle Vektoren aus – noch kein ANN-Index. Dadurch ist die relevante Grenze Abfragelatenz, nicht Speicher. Der Speicher skaliert auf Millionen von Chunks; die Abrufgeschwindigkeit ist O(N) pro Abfrage.

Korpus

Vektoren

Ca. RAM (f32)

Abfrage im Dauerbetrieb

1K Chunks

1K

~1.5 MB

~25 ms (gemessen)

10K Chunks

10K

~15 MB

~250 ms (hochgerechnet)

100K Chunks

100K

~154 MB

~2–5 s (hochgerechnet)

1M Chunks

1M

~1.5 GB

20–60 s (hochgerechnet — ohne ANN nicht praktikabel)

Verifiziert an einem Korpus von 1K Chunks (5/5 Tests inklusive echtem JSON-RPC-over-stdio-E2E); Werte über 1K sind aus den O(N)-Kosten des Dense-Scans hochgerechnet, nicht gemessen. Eine synthetische Skalierungssonde (src/bin/quillbench.rs) existiert, um die Kurve auf deiner eigenen Hardware zu messen – führe cargo build --release && ./target/release/quillbench aus.

Was das in der Praxis bedeutet:

  • Sehr gut geeignet: persönliche/lokale Wissensdatenbanken, Projektdokumentationen, Notizen, Code – bis zu einigen Zehntausend Chunks, wo Latenzen von unter einer Sekunde bis interaktiv gelten.

  • Außerhalb des Optimalbereichs: Korpora mit mehreren hunderttausend Chunks und mehr, wo du interaktive (<200 ms) Suche benötigst – dann brauchst du einen ANN-Index (siehe Roadmap).

So schneidet es im Vergleich zu gängigen Alternativen auf der Relevanz-Achse ab:

  • Nur-Embedding (z. B. rohes FAISS-Flat / einfacher Vektor-Store): gleiche all-MiniLM-L6-v2-Obergrenze wie quillrags Dense-Pfad, aber quillrag fügt BM25 + RRF-Fusion hinzu, die bei keyword-lastigen Abfragen (Fehlercodes, IDs, exakte Tokens) gewinnt. quillrag hat keinen Reranker und keine Metadatenfilterung, die llama-index zusätzlich bietet.

  • llama-index lokale Backends: funktional ähnliches Hybrid-Retrieval (BM25 + Vektor + RRF). quillrag tauscht llama-index' umfangreiches Reranking/Parent-Child-Chunking/Query-Expansion gegen eine einzige Binärdatei ohne Abhängigkeiten und sofortigen Start. Die Relevanz auf einem Standarddatensatz (BEIR/MS MARCO) ist noch nicht benchmarkt – siehe das offene Issue, das ANN + eine Relevanz-Baseline verfolgt.

Roadmap

quillrag ist heute bewusst minimal. Der große Durchbruch ist ein Approximate-Nearest-Neighbor-Index:

  • ANN (HNSW / IVF) über die Dense-Vektoren – verwandelt den O(N)-Scan in eine ANN-Suche im Sub-Millisekundenbereich und hebt die interaktive Grenze von ~10K auf Millionen von Chunks auf einer einzigen Maschine.

  • Quantisierung (PQ / SQ) – reduziert den Vektor-RAM von 4 Bytes/Dim auf ~1 Byte/Dim, sodass 1M Chunks ≈ 380 MB statt 1,5 GB benötigen.

  • Multithreaded-Scan – parallelisiert den aktuellen exakten Pfad als Übergangslösung.

  • Reranker-Hook – optionales Cross-Encoder-Reranking der fusionierten Top-k.

  • Relevanz-Benchmark – BEIR / MS MARCO nDCG@10 vs. llama-index-Baselines.

Verfolge die ANN-Arbeit hier: issue #1 — "ANN index for <1M chunks."

FAQ

Ist es wirklich eine Datei? Ja. Die MiniLM-Gewichte + Tokenizer sind per include_bytes! einkompiliert. Kein npm install, kein Python, kein Modell-Download bei der ersten Abfrage. Die Binärdatei ist ~105 MB groß, weil das Modell darin lebt.

Warum ist der Start so schnell? Das Embedding-Modell ist lazy. Der MCP-Handshake und rag_status berühren es nie – Editoren sehen einen bereiten Server in ~20 ms. Das Modell lädt nur beim ersten rag_search / rag_index (~300 ms einmalig).

Was ist der größte Korpus, den es verarbeitet? Verifiziert bei 1K Chunks (~25 ms/Abfrage). Die Architektur skaliert auf Millionen gespeicherter Chunks; interaktive Suche gilt heute bis zu einigen Zehntausend, und ein ANN-Index (Roadmap) erweitert das auf 1M+.

Wie unterscheidet sich das von llama-index? Ähnliche Qualität der hybriden Suche, aber quillrag ist eine einzige statische Binärdatei ohne Laufzeit-/Abhängigkeits-Fußabdruck und mit sofortigem Start. llama-index bietet Reranker, ausgefeiltes Chunking und Query-Expansion, die quillrag noch nicht hat.

Welche Dateitypen werden indiziert? md markdown txt rst json yaml yml toml csv tsv html htm xml log rs py js jsx ts tsx go c h cpp hpp java rb sh bash zsh sql proto graphql dockerfile makefile ini cfg conf env – erweitern mit -e.

Sendet es Daten nach Hause? Nein. Es gibt nach der Installation keinen Netzwerk-Codepfad.

Changelog

  • v0.1.3 – MCP-Toolbeschreibungen für Klarheit, Parametersemantik und Verhaltenstransparenz neu geschrieben (Read-only/destruktive Flags, Nutzungshinweise); server.json im Repo für die MCP-Registry-Veröffentlichung enthalten.

  • v0.1.2 – überspringt beim Indizieren alle Dot-Verzeichnisse (.obsidian-Plugin-Konfigurationen verschmutzen die Ergebnisse nicht mehr); erstes vollautomatisiertes CI-Release für 3 Plattformen. Hinweis zum Upgrade: quillrag clear einmal ausführen und neu indizieren.

  • v0.1.1 – CI-gebauten Release-Artefakte für linux/macos/windows mit Prüfsummen.

  • v0.1.0 – erste öffentliche Veröffentlichung; umbenannt von pocketrag.

Entwicklung

cargo test                    # unit + end-to-end (spawns real stdio servers)
cargo run -- serve            # dev server
RUST_LOG=debug cargo run ...  # verbose logs (stderr only)

Lizenz: MIT

A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
4Releases (12mo)
Commit activity

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Local-first RAG indexing and semantic search MCP server. Enables document retrieval and context-aware queries using local embedding models.
    3
    14
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Drop-in MCP server template with SQLite FTS5 search backend. ~300 lines, no vector DB, no embedding API, runs on a Pi.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for local RAG over personal notes, PDFs, and documents, enabling plain-English querying and hybrid search with multi-hop context expansion.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for a self-hosted RAG system that enables AI tools to search and retrieve grounded answers from locally ingested documents via MCP tools, with local embeddings and no API key required.
    MIT

View all related MCP servers

Related MCP Connectors

  • Remote ChromaDB vector database MCP server with streamable HTTP transport

  • Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

  • Hosted MCP memory: save sessions/decisions once, search from Claude, Cursor, ChatGPT. EU-hosted FTS.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ayush-yadav11/quillrag'

If you have feedback or need assistance with the MCP directory API, please join our Discord server