Skip to main content
Glama

MCP Local RAG

GitHub stars npm version License: MIT MCP Registry

Durchsuchen Sie private Dokumente über einen MCP-Client oder das Terminal, ohne sie an eine Embedding-API zu senden.

mcp-local-rag indexiert PDF-, DOCX-, Markdown- und Textdateien auf Ihrem Rechner. Die Suche kombiniert semantische Ähnlichkeit mit Stichwortübereinstimmung, sodass Abfragen sowohl die Absicht als auch exakte technische Begriffe wie API-Namen, Klassennamen und Fehlercodes abdecken.

Funktionen

  • Läuft lokal: Dokumentanalyse, Embeddings, Speicherung und Suche laufen auf Ihrem Rechner. Nach dem ersten Modell-Download funktionieren Texterfassung und Suche offline.

  • Hybride Suche: Semantische Abfrage findet verwandte Konzepte, während die Stichwortübereinstimmung exakte technische Begriffe hervorhebt.

  • Konfigurierbare Embeddings: Wählen Sie ein Hugging-Face-Embedding-Modell, das zur Sprache und Domäne Ihrer Dokumente passt.

  • Semantisches Chunking: Dokumente werden an Themenwechseln statt an festen Zeichenzahlen geteilt. Markdown-Codeblöcke bleiben intakt.

  • MCP und CLI: Verwenden Sie denselben Index aus einem KI-Codierungstool oder direkt vom Terminal aus.

Kein API-Schlüssel, kein Docker, kein Python und keine externe Datenbank erforderlich.

Related MCP server: rag-mcp

Schnellstart

Voraussetzungen

  • Node.js 22 oder neuer

  • Internetzugang beim ersten Gebrauch, um das npm-Paket und das Embedding-Modell herunterzuladen

  • Ein Verzeichnis mit den Dokumenten, die Sie durchsuchen möchten

Setzen Sie BASE_DIR auf dieses Verzeichnis. Es ist auch die Sicherheitsgrenze für Dateioperationen. Ersetzen Sie /absolute/path/to/your/documents unten durch den absoluten Pfad des Verzeichnisses.

mcp-local-rag verwendet das Standard-MCP-Protokoll über einen lokalen stdio-Server und funktioniert daher mit KI-Codierungstools und anderen MCP-Hosts, die lokale MCP-Server unterstützen.

Verwenden Sie eines der Beispiele unten oder registrieren Sie npx -y mcp-local-rag und setzen Sie BASE_DIR mit dem MCP-Konfigurationsformat Ihres Clients.

Für Claude Code: Führen Sie diesen Befehl aus:

claude mcp add local-rag --scope user --env BASE_DIR=/absolute/path/to/your/documents -- npx -y mcp-local-rag

Für Codex: Fügen Sie zu ~/.codex/config.toml hinzu:

[mcp_servers.local-rag]
command = "npx"
args = ["-y", "mcp-local-rag"]

[mcp_servers.local-rag.env]
BASE_DIR = "/absolute/path/to/your/documents"

Für OpenCode: Fügen Sie zu ~/.config/opencode/opencode.json (oder opencode.jsonc) hinzu:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "local-rag": {
      "type": "local",
      "command": ["npx", "-y", "mcp-local-rag"],
      "environment": {
        "BASE_DIR": "/absolute/path/to/your/documents"
      }
    }
  }
}

Für Cursor: Fügen Sie zu ~/.cursor/mcp.json hinzu:

{
  "mcpServers": {
    "local-rag": {
      "command": "npx",
      "args": ["-y", "mcp-local-rag"],
      "env": {
        "BASE_DIR": "/absolute/path/to/your/documents"
      }
    }
  }
}

Starten Sie den Client neu und bitten Sie ihn dann, den Index zu erstellen:

Sync all documents in the configured root and wait until it finishes.

Die erste Synchronisierung lädt das Standard-Embedding-Modell herunter (ca. 90 MB) und kann 1–2 Minuten dauern, bevor die Erfassung beginnt. Spätere Ausführungen verwenden den lokalen Cache.

Sobald die Synchronisierung abgeschlossen ist:

What does the API documentation say about authentication?

CLI-Schnellstart

Um die CLI ohne MCP-Client zu verwenden:

npx mcp-local-rag ingest ./docs/
npx mcp-local-rag query "authentication API"

Die CLI verwendet standardmäßig das aktuelle Verzeichnis als Dokumentstamm. Führen Sie beide Befehle aus demselben Verzeichnis aus, damit sie denselben Standardindex verwenden, oder setzen Sie BASE_DIR und DB_PATH explizit.

Warum es das gibt

Einige Dokumentbestände können aufgrund von Vertraulichkeit oder Organisationsrichtlinien nicht an einen gehosteten Embedding-Dienst gesendet werden. Wenn der Index lokal bleibt, werden sie durchsuchbar, ohne dass pro Abfrage API-Kosten entstehen.

Semantische Suche allein kann exakte Bezeichner übersehen, die in technischer Dokumentation wichtig sind. Stichwort-Reranking hält diese Begriffe sichtbar, ohne auf natürlichsprachliche Abfrage zu verzichten.

Unterstützte Inhalte

Eingabe

Wie zu erfassen

PDF, DOCX, TXT, Markdown

Dateierfassung oder Verzeichnissynchronisierung

HTML, das bereits vom Client abgerufen wurde

ingest_data; mit Readability bereinigt und in Markdown konvertiert

Klartext oder Markdown im Speicher

ingest_data mit einer stabilen Quellkennung

HTML-Abruf ist nicht in den Server integriert. Ein MCP-Client kann eine Seite abrufen und ihr HTML an ingest_data übergeben.

Excel, PowerPoint, eigenständige Bilder und Quellcode-Dateierweiterungen werden von der Dateierfassung nicht unterstützt. PDFs können optional ein lokales Vision-Modell verwenden, um Abbildungen zu beschreiben, aber das ist keine OCR oder Bildsuche.

MCP-Tools

Tool

Zweck

sync_start

Index mit allen konfigurierten Wurzeln oder einem Pfad abgleichen

sync_status

Laufenden Synchronisierungsjob abfragen

ingest_file

Eine Datei erfassen oder ersetzen

ingest_data

Text, Markdown oder HTML erfassen, das der Client bereits hat

query_documents

Suche mit semantischem Abgleich und Stichwortverstärkung

read_chunk_neighbors

Umgebende Chunks aus einem Suchergebnis lesen

list_files

Unterstützte Dateien und ihren Erfassungsstatus anzeigen

delete_file

Eine indexierte Datei oder ein ingest_data-Element löschen

status

Index- und Suchstatus anzeigen

Synchronisieren einer Dokumentwurzel

sync_start erfasst neue und geänderte Dateien, überspringt byteidentische Dateien und entfernt Indexeinträge für Dateien, die nicht mehr existieren:

Sync everything under the configured document roots and wait for completion.

Das Tool gibt sofort eine jobId zurück. Clients sollten sync_status abfragen, bis der Status succeeded oder failed wird. Die Synchronisierung erzeugt keine visuellen Bildunterschriften. Setzen Sie STORE_IMAGES=true in der MCP-Serverumgebung, um unterstützte PDF- und DOCX-Bilder für neue oder geänderte Dateien zu speichern, die von der Synchronisierung ausgewählt wurden; unveränderte Dateien bleiben übersprungen.

Nur ein Synchronisierungsjob wird vom Serverprozess aufbewahrt. Ein neuerer Job ersetzt einen abgeschlossenen Datensatz, und ein Neustart des Servers verwirft ihn.

Erfassen einer einzelnen Datei

ingest_file akzeptiert PDF, DOCX, TXT und Markdown. MCP-Dateipfade müssen absolut sein und innerhalb einer konfigurierten Dokumentwurzel liegen:

Ingest the document at /Users/me/docs/api-spec.pdf.

Das erneute Erfassen desselben Pfads ersetzt seine vorhandenen Chunks.

Suchen und mehr Kontext lesen

What does the API documentation say about authentication?
Find the documented behavior of ERR_CONNECTION_REFUSED.

Ergebnisse enthalten den Text, den Quellpfad, den Titel, den Chunk-Index, den Relevanzwert und alle auf diesem Chunk gespeicherten Bilder. MCP gibt jedes Bild als Bild-Content-Block gepaart mit seiner Ergebnisidentität zurück; die CLI-query enthält ein images-Array aus { imageIndex, mimeType, data } in jedem Ergebnis. Übergeben Sie den chunkIndex und entweder filePath oder source aus einem Ergebnis an read_chunk_neighbors, wenn die Antwort mehr Kontext benötigt:

Read the surrounding chunks for that authentication result.

Sowohl query_documents als auch list_files akzeptieren ein optionales absolutes scope-Pfadpräfix oder eine Liste von Präfixen. Ein Präfix stimmt mit dem exakten Pfad und seinen Unterelementen überein.

HTML erfassen

Verwenden Sie ingest_data, nachdem der MCP-Client eine Seite abgerufen hat:

Fetch https://example.com/docs and ingest the HTML.

Der Server extrahiert den Hauptartikel, konvertiert ihn in Markdown und speichert ihn unter der angegebenen Quellkennung. Die Wiederverwendung derselben Quelle aktualisiert den vorhandenen Inhalt.

Respektieren Sie die Bedingungen und Urheberrechte der Quellwebsite, wenn Sie externe Inhalte indexieren.

PDF-Visualunterschriften und gespeicherte Bilder

Der visuelle Modus fügt eine generierte Bildunterschrift für figurenreiche PDF-Seiten hinzu. Er ist optional und lädt während der normalen Erfassung kein Vision-Modell.

Ingest /Users/me/docs/research-paper.pdf with visual: true.
npx mcp-local-rag ingest ./docs/research-paper.pdf --visual

Die Bildspeicherung ist unabhängig von visuellen Bildunterschriften. Setzen Sie STORE_IMAGES=true für den MCP-Server oder übergeben Sie --images an CLI-Erfassung und -Synchronisierung:

npx mcp-local-rag ingest ./docs/research-paper.pdf --images
npx mcp-local-rag sync ./docs/ --images

Die PDF-Speicherung verwendet erkannte Abbildungs-/Tabellenbereiche. Die DOCX-Speicherung enthält nur PNG/JPEG-Bilder, die die vorhandene Mammoth-Konvertierung als <img> ausgibt; Diagramme, SmartArt und Formen werden nicht separat gerendert. Gespeicherte Bilder folgen ihrem umgebenden Text in den endgültigen semantischen Chunk und verändern weder Ranking, Bewertungen noch Ergebnisanzahl.

visual / --visual

STORE_IMAGES / --images

PDF-Verhalten

false

false

Nur Text; keine visuellen Bildunterschriften oder zurückgegebenen Bilder.

true

false

Generierte Bildunterschriften werden durchsuchbarer Text; keine Bilder werden gespeichert oder zurückgegeben.

true

true

Generierte Bildunterschriften werden durchsuchbarer Text, und Bilder aus übereinstimmenden Chunks werden inline zurückgegeben.

false

true

Bilder werden an nahegelegenen beibehaltenen PDF-Text angehängt und für übereinstimmende Chunks inline zurückgegeben; das VLM wird nicht importiert, geladen oder ausgeführt.

Profil

Modell-Cache

Verwendungszweck

fast (Standard)

ca. 250 MB

Leichte visuelle Indexierung

quality

ca. 2,9 GB

Abbildungen mit Beschriftungen, Anmerkungen oder anderem Text im Bild

Wählen Sie das größere Modell mit visualQuality: "quality" über MCP oder --visual-quality quality über CLI. Die gemessene CPU-Inferenz war etwa doppelt so langsam wie fast, obwohl die Ergebnisse von Hardware und Modellaktualisierungen abhängen.

Bildunterschriften sind Hilfstext, keine getreuen Transkriptionen. Behandeln Sie abgerufene Bildunterschriften und Dokumenttext als unvertrauenswürdige Eingabe und nicht als Anweisungen.

Bei hohen Limits können übereinstimmende Chunks und ihre Anhänge die Modell-/Client-Kontextgrenze erreichen; wählen Sie das Abfragelimit mit Blick auf den verfügbaren Kontext des aufrufenden Modells.

CLI

Die CLI verwendet denselben Parser, Embedder und Vektorspeicher ohne MCP-Client:

npx mcp-local-rag ingest ./docs/
npx mcp-local-rag sync ./docs/
npx mcp-local-rag query "authentication API"
npx mcp-local-rag query "auth" --scope /docs/api --scope /docs/guide
npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5
npx mcp-local-rag list
npx mcp-local-rag status
npx mcp-local-rag delete ./docs/old.pdf
npx mcp-local-rag delete --source "https://example.com/docs"

Globale Optionen wie --db-path, --cache-dir und --model-name stehen vor dem Unterbefehl. Unterbefehlsoptionen folgen danach:

npx mcp-local-rag --db-path ./my-db query "authentication"

Führen Sie npx mcp-local-rag --help für die vollständige Befehlsreferenz aus.

Die CLI liest keine MCP-Clientkonfiguration. Setzen Sie dieselben Umgebungsvariablen oder Flags, wenn beide Schnittstellen einen Index gemeinsam nutzen sollen. Insbesondere müssen MODEL_NAME und das CLI---model-name für eine gemeinsame Datenbank übereinstimmen.

Suchoptimierung

Die Stichwortverstärkung ist standardmäßig aktiviert. Relevanzlücken-Gruppierung sowie die Distanz- und Dateifilter sind optionale Steuerungen für Korpora, die eine engere Ergebnisauswahl benötigen.

Variable

Standard

Beschreibung

RAG_HYBRID_WEIGHT

0.6

Stichwortverstärkungsfaktor (0,0–1,0). 0 deaktiviert das Stichwort-Reranking; 1 wendet die maximale Verstärkung an.

RAG_GROUPING

(nicht gesetzt)

similar behält die erste Relevanzgruppe; related behält bis zu zwei, wobei signifikante Vektordistanzlücken als Grenzen dienen.

RAG_MAX_DISTANCE

(nicht gesetzt)

Ergebnisse mit geringer Relevanz herausfiltern (z. B. 0.5).

RAG_MAX_FILES

(nicht gesetzt)

Ergebnisse auf die Top-N-Dateien begrenzen (z. B. 1 für die beste einzelne Datei).

Für API-Spezifikationen und andere Dokumente mit vielen Bezeichnern kann eine stärkere Stichwortgewichtung das Ranking exakter Begriffe verbessern:

"env": {
  "RAG_HYBRID_WEIGHT": "0.7"
}
  • 0.7: etwas stärkeres Re-Ranking exakter Begriffe als der Standard

  • 1.0: maximale Keyword-Verstärkung

So funktioniert es

Bei der Aufnahme:

  1. Der Parser extrahiert Text für das Eingabeformat.

  2. Der semantische Chunker findet Themengrenzen und erhält Markdown-Codeblöcke.

  3. Transformers.js erstellt Embeddings lokal.

  4. LanceDB speichert die Chunks, Metadaten, Vektoren und den Volltextindex.

Bei der Suche:

  1. Die Abfrage wird mit demselben Modell eingebettet.

  2. Die Vektorsuche ruft semantisch verwandte Chunks ab.

  3. Optionale Distanz- und Relevanzgruppenfilter grenzen die Kandidaten ein, wenn sie konfiguriert sind.

  4. Volltextübereinstimmungen verstärken exakte Abfragebegriffe.

Agent Skills

Agent Skills bieten Abfrage- und Aufnahmehilfe für KI-Assistenten:

npx mcp-local-rag skills install --claude-code
npx mcp-local-rag skills install --claude-code --global
npx mcp-local-rag skills install --codex

Installierte Skills umfassen Abfrageformulierung, Ergebnisverfeinerung und HTML-Aufnahme. Bitten Sie den Assistenten, den Skill mcp-local-rag explizit zu verwenden, wenn er nicht automatisch aktiviert wird.

Konfiguration

Der MCP-Server liest Umgebungsvariablen. Die CLI akzeptiert die aufgeführten globalen Umgebungsvariablen und Flags; die Bildspeicherung bei CLI-Aufnahme und -Synchronisierung ist nur mit --images aktiviert.

Umgebungsvariable

CLI-Flag

Standard

Beschreibung

BASE_DIR

--base-dir

Aktuelles Verzeichnis

Ein Dokumentstamm; das CLI-Flag ist bei ingest, list und sync wiederholbar

BASE_DIRS

N/A

(nicht gesetzt)

JSON-Array von Dokumentstämmen; hat Vorrang vor BASE_DIR

DB_PATH

--db-path

./lancedb/

Speicherort der Vektordatenbank

CACHE_DIR

--cache-dir

./models/

Modell-Cache-Verzeichnis

MODEL_NAME

--model-name

Xenova/all-MiniLM-L6-v2

Hugging-Face-Embedding-Modell

MAX_FILE_SIZE

--max-file-size

104857600 (100MB)

Maximale Dateigröße in Bytes

CHUNK_MIN_LENGTH

--chunk-min-length

50

Minimale Chunk-Länge in Zeichen (1–10000)

STORE_IMAGES

N/A

false

Nur MCP-Server: unterstützte PDF/DOCX-Bilder speichern und mit passenden Chunks zurückgeben. CLI nutzt --images.

RAG_DEVICE

N/A

cpu

ONNX-Runtime-Ausführungsgerät

RAG_DTYPE

N/A

fp32

Embedding-Datentyp, der an das ausgewählte Modell übergeben wird

Dokumentstämme (BASE_DIR und BASE_DIRS)

mcp-local-rag erlaubt Dateioperationen nur innerhalb konfigurierter Stämme. Für mehrere Stämme muss BASE_DIRS ein JSON-Array aus nicht-leeren Pfaden sein:

export BASE_DIRS='["/Users/me/Documents/work","/Users/me/Projects/specs"]'

Die Stammkonfiguration wird in dieser Reihenfolge aufgelöst:

  1. CLI---base-dir <pfad>-Flags (wiederholbar bei ingest, list und sync)

  2. BASE_DIRS

  3. BASE_DIR

  4. Aktuelles Verzeichnis

Jede Quelle ersetzt die Quelle mit niedrigerer Priorität, anstatt mit ihr zusammengeführt zu werden. Eine ungültige BASE_DIRS-Konfiguration schlägt fehl, anstatt auf BASE_DIR oder das aktuelle Verzeichnis zurückzufallen. status bleibt in MCP verfügbar, damit der Client den Konfigurationsfehler melden kann.

npx mcp-local-rag ingest --base-dir /Users/me/work --base-dir /Users/me/specs /Users/me/work/readme.md
npx mcp-local-rag list --base-dir /Users/me/work --base-dir /Users/me/specs
npx mcp-local-rag sync --base-dir /Users/me/work --base-dir /Users/me/specs
BASE_DIRS='["/Users/me/work","/Users/me/specs"]' npx mcp-local-rag list

Speicherung und Modelle

DB_PATH und CACHE_DIR sind standardmäßig relativ zum Prozess-Arbeitsverzeichnis. Legen Sie absolute Pfade fest, wenn der MCP-Client den Server aus verschiedenen Projektverzeichnissen starten kann.

Setzen Sie MODEL_NAME oder übergeben Sie --model-name, um ein Hugging-Face-Embedding-Modell zu wählen, das zur Sprache und Domäne Ihrer Dokumente passt.

mcp-local-rag erzeugt Embeddings mit Mean Pooling und L2-Normalisierung. Prüfen Sie bei der Modellwahl, ob diese Einstellungen zur empfohlenen Inferenzkonfiguration des Modells passen, da die Pooling-Methode die Abfragequalität beeinflussen kann.

Eine Änderung von MODEL_NAME, RAG_DEVICE oder RAG_DTYPE kann bestehende Vektoren inkompatibel machen. Verwenden Sie nach einer Änderung der Embedding-Konfiguration einen neuen DB_PATH oder löschen Sie den bestehenden Index und nehmen Sie die Daten erneut auf.

Ein Beispielmodell für englische Dokumente ist Xenova/bge-small-en-v1.5.

Sicherheit und Betrieb

  • Der Dateizugriff ist auf BASE_DIR-, BASE_DIRS- oder CLI---base-dir-Stämme beschränkt.

  • Symlinks, die außerhalb jedes konfigurierten Stamms auflösen, werden abgelehnt.

  • Dokumentverarbeitung und Suche tätigen keine Netzwerkanfragen, nachdem die erforderlichen Modelle zwischengespeichert sind.

  • Der Server ist für einen einzelnen lokalen Benutzer ausgelegt und bietet keine Authentifizierung oder Zugriffskontrolle.

  • Führen Sie nicht mehrere CLI- oder MCP-Schreiber gegen denselben DB_PATH aus. Schreibgeschützte Abfragen können während einer aktiven Synchronisierung ausgeführt werden.

  • Sichern Sie einen Index, indem Sie sein DB_PATH-Verzeichnis kopieren, während kein Schreiber aktiv ist.

„Keine Ergebnisse gefunden"

Dokumente müssen zuerst aufgenommen werden. Führen Sie „Alle aufgenommenen Dateien auflisten" aus, um dies zu überprüfen.

Modell-Download fehlgeschlagen

Überprüfen Sie die Internetverbindung. Wenn Sie hinter einem Proxy sind, konfigurieren Sie die Netzwerkeinstellungen. Das Modell kann auch manuell heruntergeladen werden.

„Datei zu groß"

Das Standardlimit beträgt 100MB. Teilen Sie große Dateien auf oder erhöhen Sie MAX_FILE_SIZE.

Langsame Abfragen

Überprüfen Sie die Chunk-Anzahl mit status. Große Dokumente mit vielen Chunks können Abfragen verlangsamen. Erwägen Sie, sehr große Dateien aufzuteilen.

„Pfad außerhalb von BASE_DIR"

Stellen Sie sicher, dass Dateipfade innerhalb eines der konfigurierten Stämme liegen (BASE_DIR, ein beliebiger BASE_DIRS-Eintrag oder ein beliebiges CLI---base-dir). Verwenden Sie absolute Pfade.

„BASE_DIRS muss ein JSON-Array sein..."

BASE_DIRS akzeptiert ein JSON-Array aus einem oder mehreren nicht-leeren Pfadzeichenfolgen:

  • Gültig: BASE_DIRS='["/Users/me/work","/Users/me/specs"]'

  • Ungültig: BASE_DIRS=/a:/b (Trennzeichensyntax wird nicht unterstützt)

  • Ungültig: BASE_DIRS='[]' (leeres Array)

MCP-Client sieht keine Tools

  1. Überprüfen Sie die Syntax der Konfigurationsdatei

  2. Starten Sie den Client vollständig neu (Cmd+Q auf dem Mac für Cursor)

  3. Direkt testen: npx mcp-local-rag sollte ohne Fehler ausgeführt werden

Mitwirken

Beiträge sind willkommen! Siehe CONTRIBUTING.md für Einrichtung und Richtlinien.

Lizenz

MIT-Lizenz. Kostenlos für private und kommerzielle Nutzung.

Blogbeiträge

Danksagungen

Erstellt mit Model Context Protocol von Anthropic, LanceDB und Transformers.js.

Available Tools

9 tools
delete_fileA

Delete a previously ingested file or data from the vector database. Use filePath for files ingested via ingest_file, or source for data ingested via ingest_data. Either filePath or source must be provided. Returns deleted (operation succeeded), removedChunks, and existed (whether anything was actually present).

NameRequiredDescriptionDefault
sourceNoSource identifier used in ingest_data. Examples: "https://example.com/page", "clipboard://2024-12-30"
filePathNoAbsolute path to the file (for ingest_file). Example: "/Users/user/documents/manual.pdf"

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses return values (deleted, removedChunks, existed) and the conditional requirement, which goes beyond the schema. It does not explicitly state irreversibility, but the term 'delete' implies it, and chunk removal is mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the action, and every sentence adds value. It is concise without sacrificing important details like return values and parameter selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity of the tool, the description covers the essential decision (filePath vs source), the required parameter constraint, and the return values. It lacks edge-case details like what happens if both parameters are provided, but this is minor given the overall clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds critical semantic context by mapping parameters to ingestion methods and clarifying the 'either/or' requirement. This goes beyond the schema's examples and helps the agent choose correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool deletes a previously ingested file or data from the vector database, using specific verbs and resource. It distinguishes itself from sibling tools like ingest_file and query_documents, as deletion is a unique operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use each parameter: filePath for files ingested via ingest_file, source for data ingested via ingest_data. It also states that either must be provided, guiding the agent on parameter selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_dataA

Ingest in-memory content as a string (use ingest_file for files on disk). The source identifier enables re-ingestion to update existing content. Returns { filePath, chunkCount, timestamp, fileTitle }.

NameRequiredDescriptionDefault
contentYesThe content to ingest (text, HTML, or Markdown)
metadataYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It reveals a key behavioral trait—re-ingestion with the same source identifier updates existing content—and specifies the return shape. While it does not mention auth, permissions, or side effects, it covers the main behavioral consequences for the typical use case.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long and front-loaded with the tool's core purpose. It efficiently packs the alternative tool reference, the re-ingestion behavior, and the return value into a compact, well-structured format with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters (one nested), no annotations, and no output schema, the description provides a complete picture: what it does, when to use it, how the source identifier behaves, and what it returns. It lacks explicit error scenarios or prerequisites, but these are not critical for a simple ingestion tool. The return value statement covers the output side.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (content and format described in schema, metadata partially). The description adds significant value by explaining the 'source' identifier protocol with examples (e.g., 'clipboard://2024-12-30', 'chat://2024-12-30/project-discussion'), which is essential for correct invocation. This compensates well for the moderate schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Ingest' and clearly specifies the resource: 'in-memory content as a string'. It further distinguishes itself from a sibling tool by explicitly pointing to 'ingest_file' for disk files, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (in-memory string content) and when not to (files on disk, via 'use ingest_file for files on disk'). This provides clear alternatives and context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_fileA

Ingest a document file (PDF, DOCX, TXT, MD) into the vector database. Path must be absolute; re-ingesting the same path replaces its existing data. Returns { filePath, chunkCount, timestamp, fileTitle }.

NameRequiredDescriptionDefault
visualNoRun VLM captioning on figure pages (PDF only; default false).
filePathYesAbsolute path to the file to ingest. Example: "/Users/user/documents/manual.pdf"
visualQualityNoVLM profile when visual is true (default "fast"). "quality" is more accurate on figures with in-image text but much heavier and slower. Ignored when visual is false.fast

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of disclosing behavior. It explicitly states that re-ingesting replaces existing data, revealing a destructive side effect, and also specifies the return object structure. It does not cover other potential behaviors like long-running VLM processing, but the key destructive behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. First sentence front-loads action and resource, second sentence covers constraints and return value. Highly scannable and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description covers essential operational context: supported file types, absolute path requirement, replacement behavior, and return format. It lacks explicit separation from sibling ingest tools (ingest_data, ingest_directory) but otherwise provides a complete picture for a single-file ingestion tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by listing allowed file extensions (PDF, DOCX, TXT, MD) for filePath, which the schema does not specify. It also clarifies replacement semantics tied to the file path. It does not add extra detail for visual or visualQuality beyond what the schema provides, so a slight uplift is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb 'Ingest' and resource 'document file (PDF, DOCX, TXT, MD) into the vector database'. It implicitly distinguishes itself from sibling tools like ingest_directory by focusing on a single document file with an absolute path, and from ingest_data by specifying file formats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states clear context: use for ingesting a document file, path must be absolute, and re-ingesting the same path replaces existing data. It does not explicitly name alternatives or exclusions, but the singular 'file' and mention of supported extensions imply single-file use, differentiating from ingest_directory.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesA

List supported files (PDF, DOCX, TXT, MD) under the configured base directories and whether each is ingested. Returns { baseDirs, files, sources }; sources lists ingested items reported apart from the file scan, chiefly ingest_data content (web pages, clipboard, etc.).

NameRequiredDescriptionDefault
scopeNoOptional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. "/docs/api" matches "/docs/api/x.md" but not "/docs/apiv2". Must be absolute (server OS style); a relative prefix matches nothing. A prefix outside every base directory yields an empty files list, so compare it against the baseDirs in the response before concluding no files exist. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the return structure ({ baseDirs, files, sources }), explains that sources lists non-file ingested items, and the scope parameter details behavior for relative/out-of-base prefixes. It does not explicitly state read-only intent or mention recursion depth/sorting, but for a list tool the essentials are covered. Edge cases for scope are thoroughly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: first states the core function and return object, second clarifies what 'sources' contains. No filler, front-loaded with the verb 'List'. The parameter schema is detailed but that is separate. The main description earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with no output schema, the description explains the return object and the meaning of sources. The scope parameter covers traversal/filtering behavior. It could additionally disclose recursion depth or permission requirements, but these are less critical for a read-only list operation. Overall, sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single optional parameter 'scope', and its description is detailed (absolute path, prefix matching, union for arrays, behavior for relative/out-of-base). The tool description adds no extra parameter semantics beyond the schema. Per guidelines, high schema coverage yields a baseline of 3, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: 'List supported files (PDF, DOCX, TXT, MD) under the configured base directories and whether each is ingested.' This is a specific verb+resource combination with scope (supported extensions, base directories, ingestion status). It distinguishes from siblings: query_documents and status focus on querying, ingest_* on adding content, delete_file on removal. The tool is unambiguously the file-listing utility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this when you need to see files and their ingestion status, and it notes that sources include non-file ingest_data content (web pages, clipboard). The scope parameter description adds clear guidance about absolute path prefixes and how to interpret empty results (compare against baseDirs). However, it does not explicitly contrast with alternative tools such as query_documents or status, nor state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_documentsA

Search ingested documents with hybrid keyword + semantic matching. Use the returned order as the ranking; score may disagree with it. Each has filePath, chunkIndex, text, fileTitle, score (lower is closer), and source (for ingest_data items). Optional sourceContext provides heading paths and original line or physical PDF page ranges; multiple heading paths mean the chunk crosses sections.

NameRequiredDescriptionDefault
limitNoMax results (default 10, range 1-100). Lower favors precision, higher recall.
queryYesSearch query. Preserve specific user terms (for keyword match); add context when the query is vague (for semantic match).
scopeNoOptional absolute path prefix(es) — one string or a list (unioned) — restricting results to a filePath equal to or under a prefix. "/docs/api" matches "/docs/api/auth.md" but not "/docs/apiv2". Must be absolute (server OS style); a relative prefix matches nothing — derive one from a filePath returned by an earlier query, or omit scope.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose non-obvious behavior: result ordering is authoritative over score, score is lower-is-closer, source is only populated for ingest_data items, and multiple heading paths signal a cross-section chunk. It omits any statement of read-only safety, rate limits, or empty-result behavior, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then dense but load-bearing detail about result fields and sourceContext semantics. Every sentence carries information, though the back half packs several distinct facts into long clauses that could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates well by enumerating the return fields (filePath, chunkIndex, text, fileTitle, score, source) and explaining sourceContext. With no annotations, it should also cover the read-only nature and any scope-omission fallback, which it leaves implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents query, limit, and scope thoroughly (including the absolute-path prefix rule). The description's detail is almost entirely about returned fields, not input parameters, so it adds little beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search ingested documents') and specifies the retrieval mechanism ('hybrid keyword + semantic matching'), so the agent knows exactly what capability this is. It does not name or contrast any sibling (e.g. read_chunk_neighbors or list_files), so it falls short of the sibling-differentiating 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides real guidance on interpreting output ('use the returned order as the ranking; score may disagree with it') and on query construction, which implies the tool's role. However, it never says when to prefer this over siblings like read_chunk_neighbors or list_files, and gives no exclusions or prerequisites, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_chunk_neighborsA

Read the chunks immediately before and after a query_documents result, in the same document, for more surrounding context. Pass chunkIndex from the result plus exactly one of filePath (ingest_file) or source (ingest_data). Returns the target chunk (isTarget: true) and its neighbors, ascending by chunkIndex; an out-of-range chunkIndex returns []. Optional sourceContext provides heading paths and original line or physical PDF page ranges; multiple heading paths mean the chunk crosses sections. Defaults: before=2, after=2 (max 50 each).

NameRequiredDescriptionDefault
afterNoNumber of chunks to retrieve after the target (0–50, default 2).
beforeNoNumber of chunks to retrieve before the target (0–50, default 2).
sourceNoSource identifier (for ingest_data documents). Provide exactly one of filePath or source. Examples: "https://example.com/page", "clipboard://2024-12-30".
filePathNoAbsolute path to the file (for ingest_file documents). Provide exactly one of filePath or source. Example: "/Users/user/documents/manual.pdf".
chunkIndexYesZero-based target chunk index (non-negative integer).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and does so: it discloses the return shape (target chunk flagged isTarget: true plus neighbors, ascending by chunkIndex), the edge case (out-of-range chunkIndex returns []), and the defaults/limits (before=2, after=2, max 50 each). Optional sourceContext is explained, including that multiple heading paths signal a section-crossing chunk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then how to call it, then return behavior, then the optional sourceContext detail, then defaults. Every sentence contributes, though it is a dense single block rather than cleanly separated clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain returns, and it does (target + neighbors, ordering, empty result). Combined with the documented defaults, limits, and input constraints, an agent has everything needed to call this correctly against a 5-parameter schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so the baseline is 3. The description adds genuine meaning beyond the schema by stating that chunkIndex originates from a query_documents result and by restating the mutual-exclusion rule for filePath/source, plus the semantics of sourceContext's heading paths.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (read the chunks immediately before/after a query_documents result) and ties itself directly to the sibling query_documents, so an agent can distinguish it from a plain search. The scope constraint 'in the same document' further narrows what it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the triggering context clearly: use it after a query_documents result when you need more surrounding context, and it names the exact input to carry over (chunkIndex plus one of filePath/source). It gives no explicit 'when not to use it' or alternative (e.g., re-running query_documents with a wider window), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusA

Get index status: { documentCount, chunkCount, memoryUsage (MB), uptime (s), ftsIndexEnabled, searchMode }.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the burden of behavioral disclosure. It communicates the output fields and implies a read-only operation via 'Get', but it does not explicitly state safety, side effects, or any operational conditions. The field list adds context, but some behavioral aspects remain implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that immediately states the tool's purpose and then lists the output fields in a structured way. There is no redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple status tool with no parameters and no output schema, the description adequately covers the return values and purpose. It does not mention potential delays or whether the status is a snapshot, but for its simplicity, the information provided is sufficient for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters and an empty input schema, so parameter semantics are not needed. The description adds value by enumerating the output fields, which helps the agent understand what to expect, thus justifying a baseline score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Get) and resource (index status), and the listed field names specify exactly what the tool returns. This distinguishes it from sibling tools like query_documents or sync_status, which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as sync_status, which may also report on index state. There is no mention of exclusions or typical use cases, leaving the agent to infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_startA

Reconcile the index with the files on disk: ingest new and changed files, leave unchanged files alone, and remove index entries for files that are gone. Each changed PDF is re-ingested with the visual profile ("fast" or "quality") already recorded for it, so a PDF indexed with VLM captions keeps them; a PDF with no recorded profile stays text-only. There is no option to change a profile here — use the CLI (mcp-local-rag sync --visual) to set one, or ingest_file to replace the file, where a normal ingest clears the recorded profile. Stored images are unrelated: STORE_IMAGES applies to whatever this run re-ingests and never makes a file changed. Returns { jobId } without waiting for the run to finish; poll sync_status with that jobId for progress and the final outcome. Only one job is kept, and it is lost when the server process exits.

NameRequiredDescriptionDefault
pathNoOptional absolute path to a file or directory inside a configured base directory; list_files returns those directories as baseDirs. A file synchronizes only itself and a directory only its own subtree, leaving every path outside it untouched. Omit it to synchronize every configured base directory.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses side effects (index updates/removals), non-blocking execution, job retention, and process-exit loss. It also clarifies the behavior regarding visual profiles and STORE_IMAGES, ensuring the agent understands the tool's operational nuances.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is overly verbose and repetitive. Phrases like 'visual profile' and 'only one job is kept' are repeated, and the whole text could be condensed to a few sentences without losing meaning. The single-paragraph structure lacks scannable clarity, and the redundancy detracts from conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main operational aspects: return value, polling mechanism, job limitations, and process-exit behavior. It is slightly incomplete regarding error cases or permission requirements, but given the moderate complexity and the absence of an output schema, it provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description for 'path' is already highly detailed, covering optionality, file/directory semantics, baseDirs, and omission behavior. The tool description repeats this verbatim without adding new semantic information, so the value beyond the schema is minimal, resulting in the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Reconcile the index with the files on disk: ingest new and changed files, leave unchanged files alone, and remove index entries for files that are gone.' It also specifies the non-blocking return of a jobId, making the tool's primary function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions alternatives and complementary tools: 'use the CLI (mcp-local-rag sync --visual) to set one, or ingest_file to replace the file' and 'poll sync_status with that jobId'. Also clarifies scope behavior and omission of path to sync all base directories, providing clear guidance on when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_statusA

Get the current or latest sync job record: { jobId, state ("running" | "succeeded" | "failed"), total (null until scanning has counted the files on disk), completed (upserted + skipped + empty; pruned is counted separately), summary { upserted, skipped, empty, pruned }, warnings, error (null unless the job failed) }. An unknown jobId means the job was replaced by a newer one or lost with a previous server process.

NameRequiredDescriptionDefault
jobIdYesIdentifier returned by sync_start.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clearly states the return shape (jobId, state, total, completed, summary, warnings, error) and explains null/unknown meanings. It does not mention side effects, but 'Get' implies a read-only operation, and no side effects are likely. The level of detail is strong for a status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than a typical one-liner, but it is dense and structured with the return object in braces, using spaces and parentheses for clarity. Every sentence adds value, though it could be slightly trimmed without loss. It is front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter status tool with no output schema, the description is remarkably complete. It details all possible state values, null semantics, and the meaning of an unknown jobId. There is no obvious missing behavior; the tool's functionality is fully described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers jobId with 'Identifier returned by sync_start.' The description adds meaning by explaining that an unknown jobId indicates replacement/loss, and by showing jobId in the return structure. This goes beyond the schema's basic parameter comment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Get the current or latest sync job record' — a specific verb and resource. It clearly distinguishes itself from siblings like sync_start (which creates a job) and status (which likely relates to something else) by focusing on sync job state retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the intended context: to poll or inspect a previously started sync job. It does not explicitly name alternatives, but the mention of 'unknown jobId means the job was replaced by a newer one or lost with a previous server process' gives practical guidance on interpreting results, which helps decide when this tool is useful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.19.0
    • Changedquery_documents2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default 10, range 1-20). Lower favors precision, higher recall."New value: +"Max results (default 10, range 1-100). Lower favors precision, higher recall."
      • changedInput schema / properties / limit / maximum
        Previous value: -20New value: +100
  2. 3 tool updatesv0.17.3
    • Changedlist_files1 field changed
      • changedInput schema / properties / scope / description
        Previous value: -"Optional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. \"/docs/api\" matches \"/docs/api/x.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed."New value: +"Optional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. \"/docs/api\" matches \"/docs/api/x.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing. A prefix outside every base directory yields an empty files list, so compare it against the baseDirs in the response before concluding no files exist. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed."
    • Addedsync_start
    • Addedsync_status
  3. 1 tool updatev0.16.1
    • Changedlist_files1 field changed
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "Optional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. \"/docs/api\" matches \"/docs/api/x.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed.",
        +  "oneOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ]
        +}
  4. 4 tool updatesv0.15.3
    • Changedingest_data1 field changed
      • changedInput schema / properties / metadata / properties / format / description
        Previous value: -"Content format: \"text\", \"html\", or \"markdown\""New value: +"Content format: text (plain/copied text), html (fetched web pages), or markdown."
    • Changedingest_file2 fields changed
      • changedInput schema / properties / visual / description
        Previous value: -"If true and the file is a PDF, run VLM captioning on figure pages. No effect on non-PDF files."New value: +"Run VLM captioning on figure pages (PDF only; default false)."
      • changedInput schema / properties / visualQuality / description
        Previous value: -"VLM profile to use when visual is true. \"fast\" (default) is the lightweight SmolVLM-256M; \"quality\" is Qwen2.5-VL-3B-Instruct-ONNX with higher fidelity on figures with in-image text (~10x model-cache footprint, ~2x per-page inference). The server also accepts an empty string as a synonym for omitted (normalized to \"fast\"). Silently ignored when visual is false."New value: +"VLM profile when visual is true (default \"fast\"). \"quality\" is more accurate on figures with in-image text but much heavier and slower. Ignored when visual is false."
    • Changedquery_documents3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (default: 10, range: 1-20). Recommended: 5 for precision, 10 for balance, 20 for broad exploration."New value: +"Max results (default 10, range 1-20). Lower favors precision, higher recall."
      • changedInput schema / properties / query / description
        Previous value: -"Search query. Include specific terms and add context if needed."New value: +"Search query. Preserve specific user terms (for keyword match); add context when the query is vague (for semantic match)."
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "Optional absolute path prefix(es) — one string or a list (unioned) — restricting results to a filePath equal to or under a prefix. \"/docs/api\" matches \"/docs/api/auth.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing — derive one from a filePath returned by an earlier query, or omit scope.",
        +  "oneOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ]
        +}
    • Changedread_chunk_neighbors2 fields changed
      • changedInput schema / properties / filePath / description
        Previous value: -"Absolute path to the file (for documents ingested via ingest_file). Example: \"/Users/user/documents/manual.pdf\". Provide either filePath or source, not both."New value: +"Absolute path to the file (for ingest_file documents). Provide exactly one of filePath or source. Example: \"/Users/user/documents/manual.pdf\"."
      • changedInput schema / properties / source / description
        Previous value: -"Source identifier used in ingest_data (for data ingested via ingest_data). Examples: \"https://example.com/page\", \"clipboard://2024-12-30\". Provide either filePath or source, not both."New value: +"Source identifier (for ingest_data documents). Provide exactly one of filePath or source. Examples: \"https://example.com/page\", \"clipboard://2024-12-30\"."
  5. 1 tool updatev0.15.0
    • Changedquery_documents3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (default: 10). Recommended: 5 for precision, 10 for balance, 20 for broad exploration."New value: +"Maximum number of results to return (default: 10, range: 1-20). Recommended: 5 for precision, 10 for balance, 20 for broad exploration."
      • addedInput schema / properties / limit / maximum
        Added value: +20
      • addedInput schema / properties / limit / minimum
        Added value: +1
  6. 1 tool updatev0.14.1
    • Changedingest_file1 field changed
      • addedInput schema / properties / visualQuality
        Added value: +{
        +  "default": "fast",
        +  "description": "VLM profile to use when visual is true. \"fast\" (default) is the lightweight SmolVLM-256M; \"quality\" is Qwen2.5-VL-3B-Instruct-ONNX with higher fidelity on figures with in-image text (~10x model-cache footprint, ~2x per-page inference). The server also accepts an empty string as a synonym for omitted (normalized to \"fast\"). Silently ignored when visual is false.",
        +  "enum": [
        +    "fast",
        +    "quality"
        +  ],
        +  "type": "string"
        +}

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct purposes: ingest_file vs ingest_data split by source type, query_documents vs read_chunk_neighbors split by search vs context, and delete_file/list_files/sync_start are unique. The only mild overlap is status (index state) vs sync_status (sync job record), but descriptions disambiguate them well.

Naming Consistency4/5

Seven of nine tools follow a clean verb_noun pattern (query_documents, read_chunk_neighbors, delete_file, ingest_data, ingest_file, list_files, sync_start). The two noun-only names (status, sync_status) are minor deviations but still readable and consistent with each other.

Tool Count5/5

Nine tools is well-scoped for a local RAG server, with each tool earning its place across ingest, query, context, delete, list, sync, and status concerns. No redundant or filler tools.

Completeness4/5

The lifecycle is well covered: ingest (file/data), query, context retrieval, list, delete, sync, and status. The main gap is that changing a PDF's visual profile is only possible via the CLI, not through an MCP tool, though re-ingest provides a workaround.

Maintenance

ActivityActive
ResponsivenessUsually handled

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Local offline semantic search over documents (txt, md, pdf, docx, pptx, csv). Indexes folders into a LanceDB vector database with multilingual embeddings and supports hybrid vector + keyword search via Reciprocal Rank Fusion. No API keys, no cloud, no Docker required.
    4
    30
    AGPL 3.0
  • F
    license
    A
    quality
    D
    maintenance
    Enables indexing local documents (PDF, Markdown, text, code) into a knowledge base and querying them via semantic search using local embeddings, all running privately on your machine.
    4
    -