scholar-rag-mcp
scholar-rag-mcp
Status: Vorabversion (v0.1.0). Schnittstellen und Speicherlayout können sich in zukünftigen Versionen ändern.
scholar-rag-mcp ist ein veröffentlichbares MCP-Tool für eine Wissensdatenbank akademischer Paper. Weisen Sie es auf einen Ordner mit PDFs hin, und es verarbeitet jedes Paper durch eine echte Parsing-Pipeline (MinerU), normalisiert Metadaten, annotiert die Abschnittsstruktur, chunked und embeddet den Text und speichert alles in Qdrant – danach kann ein Agent (oder Sie) semantisch nach Chunks suchen, PubMed-artige Dokumentabfragen ausführen, Volltexte Abschnitt für Abschnitt lesen, einzelne Paper hinzufügen/entfernen und Wissensdatenbanken verwalten – alles über 11 MCP-Tools über stdio. Embedding, Annotation und Re-Ranking laufen über OpenAI-kompatible Modelldienste (vLLM) mit In-Process-Fallbacks.
Funktionen
Echte Verarbeitungspipeline: MinerU-PDF-Parsing (python/cli/api-Backends) -> Metadatenextraktion (lokale Heuristiken, CrossRef, optional GROBID) -> Bereinigung -> Abschnittsannotation -> deterministisches Chunking (konfigurierbar 300/1500/100 Zeichen) -> Embedding.
Schnelle Abfrage bei Skalierung: Embedding-First-Pass + Cross-Encoder-Re-Rank, optionale Metadatenfilter (
doc_id,section,year,journal, ...), die innerhalb des Qdrant-Index ausgewertet werden. 100k-Chunk-p95-Abfragelatenz < 1s (siehedocs/perf-report.md).Asynchrone Jobs:
create_kb/add_documentsind Hintergrundjobs, deren Fortschritt überget_jobabgefragt werden kann; sicher neu startbar (unterbrochene Jobs werden wiederhergestellt und beim erneuten Ausführen übersprungen).Kontextsicheres Lesen: paginiertes
get_document_textmit harten Größenobergrenzen; erst die Gliederung, dann Seiten bei Bedarf.11 MCP-Tools über stdio:
list_kbs,create_kb,delete_kb(zweiphasig),add_document,remove_document,get_document,get_document_text,list_documents,search_documents,search_chunks,get_job.In sich geschlossener Speicher: Wissensdatenbanken liegen unter einem einzigen Datenverzeichnis (
~/.scholar-rag); Qdrant wird entweder automatisch gestartet (einzelne Binärdatei, versionsgepinnt) oder mit einer externen Instanz verbunden.
Related MCP server: Athena
Installation
Erfordert pixi. Vom Repository-Root aus:
pixi install # installs the default environmentDas Projekt definiert drei pixi-Umgebungen, die jeweils einem anderen Zweck dienen:
Umgebung | Zweck |
| Kernlaufzeit + Entwicklungs-Tooling (pytest/ruff/mypy). MCP-Server und alle Skripte hier ausführen. |
| Fügt MinerU ( |
| Fügt torch/transformers für In-Process-lokale Modell-Backends hinzu (lädt beim ersten Gebrauch Modellgewichte herunter). |
Überprüfen Sie Ihre Umgebung mit dem eingebauten Doctor:
pixi run python scripts/doctor.pyModellbereitstellung
Die Umgebung ('chat', 'embed' und 'rerank'-Clients) erwartet OpenAI-kompatible HTTP-Endpunkte.
scripts/serve_models.sh startet drei vLLM-Instanzen für den Referenzmodellsatz:
Dienst | Modell | Port |
chat | Qwen3.5-0.8B | 8101 |
embed | jina-embeddings-v5-text-small | 8102 |
rerank | jina-reranker-v3.5 | 8103 |
# point *_MODEL at your local model directories, then:
bash scripts/serve_models.shSCHOLAR_RAG_CHAT_MODEL, SCHOLAR_RAG_EMBED_MODEL und SCHOLAR_RAG_RERANK_MODEL sind
erforderlich – das Skript beendet sich mit einer Meldung, die sie auflistet, wenn eine nicht gesetzt ist. Jeder Wert muss
ein absoluter Pfad zu einem lokalen HuggingFace-Modellverzeichnis sein; vLLM bedient jedes Modell unter einem
Kurznamen, der dem Verzeichnis-Basename entspricht, daher müssen die Client-Einstellungen diesen Kurznamen verwenden
(der bediente Name entspricht nicht mehr dem vollständigen Pfad). Ersetzen Sie die /path/to/...-Platzhalter in
.env.example entsprechend. Ports (CHAT_PORT/EMBED_PORT/RERANK_PORT) und GPU-IDs bleiben
optional mit funktionierenden Standardwerten.
Das Skript pinnt die genauen vLLM-Flags, die für diese Modelle verifiziert wurden (das Jina-Embed-Modell benötigt
--trust-remote-code für seinen benutzerdefinierten Code; der Reranker läuft mit seiner Standardaufgabe, keine
zusätzlichen Flags). Das Laden der Modelle dauert mehrere Minuten; das Skript pollt die Gesundheit, bis alle drei antworten.
Minimale Umgebung
Beginnen Sie mit .env.example und setzen Sie mindestens die Modell-Endpunkte (verwenden Sie die Kurznamen, die das
Serve-Skript bereitstellt, gleich dem Basename jedes Modellverzeichnisses):
SCHOLAR_RAG_DATA_DIR=~/.scholar-rag
SCHOLAR_RAG_QDRANT_STORAGE_DIR=~/.local/share/scholar-rag/qdrant
SCHOLAR_RAG_CHAT_BASE_URL=http://127.0.0.1:8101/v1
SCHOLAR_RAG_CHAT_MODEL=Qwen3.5-0.8B
SCHOLAR_RAG_EMBED_BASE_URL=http://127.0.0.1:8102/v1
SCHOLAR_RAG_EMBED_MODEL=jina-embeddings-v5-text-small
SCHOLAR_RAG_RERANK_BASE_URL=http://127.0.0.1:8103/v1
SCHOLAR_RAG_RERANK_MODEL=jina-reranker-v3.5Die Embed-Modell-Dimension wird bei der KB-Erstellung in kb_meta.json aufgezeichnet, sodass ein späterer Wechsel des
Embedding-Modells eine neue KB erfordert.
MCP-Client-Einrichtung
Starten Sie den Server-Einstiegspunkt direkt, um sicherzustellen, dass er läuft:
pixi run scholar-rag-mcpClaude (Claude Desktop / claude CLI)
{
"mcpServers": {
"scholar-rag-mcp": {
"command": "pixi",
"args": ["run", "scholar-rag-mcp"]
}
}
}opencode
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"scholar-rag-mcp": {
"type": "local",
"command": ["pixi", "run", "scholar-rag-mcp"]
}
}
}Tools
Tool | Zweck |
| Wissensdatenbanken mit Dokument-/Chunk-Anzahl und Status auflisten. |
| Asynchron jedes PDF in einem Ordner in eine neue KB aufnehmen (gibt |
| Zweiphasige KB-Löschung (siehe unten). |
| Asynchron ein einzelnes PDF in eine bestehende KB aufnehmen (gibt |
| Synchron ein Dokument löschen (Qdrant-Punkte + Katalog + Dateien). |
| Dokumentübersicht: Metadaten, Abstract, Abschnittsgliederung, Gesamtgröße. |
| Paginiertes Volltextlesen eines Dokuments oder eines einzelnen Abschnitts. |
| Paginiertes Durchsuchen von Dokumenten in einer KB. |
| PubMed-artige Dokumentebene-Suche (FTS + Titel/Autoren/Journal/Jahr). |
| Semantische Chunk-Suche mit Metadatenfiltern und Embed+Re-Rank-Scores. |
| Status/Fortschritt/Ergebnis/verstrichene Zeit eines Hintergrundjobs abfragen. |
Datenlayout
<data_dir>/ # SCHOLAR_RAG_DATA_DIR, default ~/.scholar-rag
├── kbs/<kb_name>/
│ ├── kb_meta.json # dimension, chunk config, schema version
│ ├── catalog.sqlite3 # documents / authors / keywords / chunks + FTS5
│ └── documents/<doc_id>/ # source.pdf, full_text.md, sections.json
├── cache/parse/ # MinerU markdown cache, keyed by content hash
├── cache/resolver/ # annotation resolver cache, keyed by content hash
├── jobs.sqlite3 # async job history
└── bin/ # auto-downloaded Qdrant binary (v1.12.5)Qdrant-Speicher liegt außerhalb von data_dir unter QDRANT_STORAGE_DIR (Standard
~/.local/share/scholar-rag/qdrant) – er muss auf einem lokalen Dateisystem liegen, nicht auf einem 9p/Netzwerk-Mount.
Zweiphasige KB-Löschung
delete_kb löscht beim ersten Aufruf mit falschen Argumenten nie versehentlich:
Rufen Sie
delete_kb(kb="...")auf – gibt KB-Statistiken plus ein 10-minütigesconfirm_tokenzurück.Rufen Sie
delete_kb(kb="...", confirm_token="<token>")auf, um tatsächlich die Qdrant-Sammlung, das KB-Verzeichnis und dessen Job-Verlauf zu löschen.
Entwicklung
pixi run lint # ruff check src tests
pixi run typecheck # mypy src
pixi run test # pytest (unit + integration, no e2e/perf)
pixi run -e mineru pytest tests/e2e/smoke.py -v -m e2e # real end-to-end smoke
python tests/perf/bench_query.py # query latency benchmark (writes docs/perf-report.md)Versionshinweise
Für bekannte Einschränkungen und Upgrade-Anleitung siehe
docs/handoffs/release-notes-v0.1.0.md.
Bekannte Einschränkungen, die es wert sind, wiederholt zu werden:
Qdrant ist auf v1.12.5 gepinnt – es ist die höchste Version, die auf glibc 2.35 läuft; Auto-Start lädt es beim ersten Gebrauch herunter. Auf glibc >= 2.38 können Sie eine neuere Version ausführen, aber das Datenformat ist nicht vorwärtskompatibel mit älteren KBs in dieser Version.
MinerU läuft in seiner eigenen pixi-Umgebung, weil seine transformers-Version sich gegenseitig mit der vLLM-Version ausschließt. PDF-Parsing bevorzugt daher
pixi run -e mineru.MinerU-Gewichte (~3,2 GB) werden beim ersten Parsen in
~/.cache/modelscope/heruntergeladen.Metadaten-Titel-Heuristik: Titel werden nur lokal ausgewählt, wenn das MinerU-Markdown mit einer
#/##-Überschrift beginnt, sodass ein führendes## Abstract(usw.) als Titel fehlinterpretiert werden kann. Dies betrifft nur die lokale Heuristik-Metadatenstufe; die CrossRef-Stufe (verwendet, wenn eine DOI gefunden wird) korrigiert dies normalerweise.Tool-Dispatch: Unbekannte zusätzliche Argumente für ein Tool werden stillschweigend ignoriert statt abgelehnt.
9p-Speicherlimit: Qdrant-Speicher muss auf einem lokalen Dateisystem liegen.
Maintenance
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceTransforms PDF collections into a searchable knowledge base using TF-IDF indexing and proximity matching. It enables users to search documents, retrieve specific page content, and manage document libraries through natural language via MCP clients.5
- FlicenseNot gradedqualityBmaintenanceA local academic research assistant that indexes PDFs into a searchable vector library and exposes MCP tools for semantic search, claim extraction, contradiction detection, and multi-step research synthesis.
- FlicenseNot gradedqualityCmaintenanceIndexes PDF documents into Qdrant and exposes semantic search as MCP tools, enabling RAG-based interactions with your documents.
- FlicenseNot gradedqualityCmaintenanceProvides RAG-based knowledge retrieval and document management as MCP tools, supporting hybrid search, reranking, and retrieval process visualization.
Related MCP Connectors
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/notwhiteblank/scholar-rag-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server