
Rag
io.github.fieldcurePublished by GitHub account fieldcurev2.5.1Updated Oct 24, 2026
MCP RAG server with hybrid search, multi-KB support, and AI-powered chunk contextualization.
Overview
A local MCP server that indexes your document folders into searchable knowledge bases and lets an assistant run hybrid keyword and semantic search over them.
- What you can do
- List knowledge bases with file and chunk counts and indexing status, and inspect index metadata, queue state and contextualization health, or dry-run a filesystem scan for changes without API calls. Search documents with hybrid BM25 plus vector retrieval, keyword-only or semantic-only modes, and fetch the full text of a specific chunk by ID. Queue a reindex request with scope merging and force or deferred flags, or cancel a pending queue entry. Indexing itself runs through a separate command-line pipeline that extracts text from DOCX, HWPX, PDF, Excel, PowerPoint, Markdown and audio, chunks it, optionally enriches chunks with an LLM and embeds them into SQLite.
- When to use it
- Useful when you keep a local collection of documents and want an assistant to answer questions from them with citations to specific chunks, especially for Korean and English material or scanned PDFs. It suits multi-project setups where one server should serve several knowledge bases.
- Requirements
- Runs locally as a .NET 8.0 or later tool installed via dotnet tool, started with the serve command and a base path. Each knowledge base needs a config.json with source folders. An embedding or contextualization provider is optional; without one, keyword-only search works. API keys come from environment variables such as OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, GROQ_API_KEY or VOYAGE_API_KEY, or from an MCP elicitation prompt. OCR is Windows x64 only; audio transcription is Windows-only
Installation
In SourceWeft
- Open Rag in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
FieldCure MCP RAG Server
A Model Context Protocol (MCP) server for indexing and searching local document collections. Supports DOCX, HWPX, PDF (with OCR), Excel, PowerPoint, and audio (Whisper transcription, Windows-only), with hybrid keyword + semantic search optimized for Korean and English.
Built with C# and the official MCP C# SDK.
Commands
- serve — read-only MCP server serving all knowledge bases under the base path. Single process handles multiple KBs via
kb_idparameter. Can run while exec is indexing (SQLite WAL). - exec — scans source folders, chunks documents, contextualizes with AI, embeds, stores in SQLite.
--partialre-runs only downstream stages when models change, preserving OCR output. - exec-queue — sequential orchestrator consuming a deferred indexing queue. One entry at a time, no GPU contention.
--sweep-allprocesses deferred entries too (used at app shutdown). - prune-orphans — deletes orphan KB folders (GUID-named, no config.json). Protected folders (
.,_prefix,-backup-) are never touched. - smoke-ocr — diagnostic mode. Loads a scanned PDF through the OCR fallback parser, prints recognized text to stdout, and exits
0on a non-empty result. SurfacesDllNotFoundException/BadImageFormatExceptiondistinctly so a missing or arch-mismatched native is immediately visible. Useful for verifying that the OCR native path is wired correctly on a given host (notably win-arm64 dnx installs).
Features
Search
- Hybrid BM25 + vector search with Reciprocal Rank Fusion (RRF)
- BM25-only fallback when no embedding provider is configured
- Korean-optimized chunking (sentence boundary, decimal protection, parenthesis-aware)
- SIMD-accelerated cosine similarity via
System.Numerics.Vector - FTS5 trigram index for substring and CJK-friendly keyword matching
Indexing
- Incremental indexing with SHA256 change detection
- AI-powered chunk contextualization with bilingual keyword enrichment (see Chunk Contextualization)
- 2-commit pipeline preserves expensive upstream work across embedding failures (see How Indexing Works)
- Math equation extraction from DOCX/HWPX as
[math: LaTeX]blocks - PDF with OCR fallback (Tesseract eng+kor) for scanned pages
- Audio transcription (
.mp3,.wav,.m4a,.ogg,.flac,.webm) via Whisper.net — Windows-only. Model size (Tiny→Large) is auto-selected from detected GPU/RAM/cores at startup; each transcript chunk recordsaudio.model_sizeandaudio.transcribed_atfor future reindex auditing - Cross-process indexing lock with stale PID auto-cleanup
- Orphan cleanup for deleted files
Queue Orchestrator
- All indexing requests flow through
start_reindexMCP tool — no direct exec spawn - Scope merge rules: full ⊃ contextualization ⊃ embedding (duplicate requests upgrade, not duplicate)
- PID-based orchestrator lock with reuse defense (
orchestrator.lock) - Logical KB deletion (config.json removal) +
prune-orphansphysical cleanup - Deferred indexing for app-shutdown batch processing (
--sweep-all)
Operations
- Multi-KB serve: single process serves all knowledge bases under a base path, lazy-loaded per KB
- SQLite WAL mode allows search during indexing
- Graceful shutdown via
cancelfile - Per-KB
config.jsonwith provider configuration
Integration
- Ollama native — embedding via
/api/embed, contextualization via/api/chatwithkeep_aliveandnum_ctxsupport. Requires Ollama 0.4.0+. - OpenAI-compatible — embedding via
/v1/embeddings, contextualization via/v1/chat/completions. Works with OpenAI, Azure OpenAI, Groq, LM Studio, Together AI. - Gemini native — embedding via
/v1beta/models/{model}:embedContentwithtask_typeasymmetric retrieval (RETRIEVAL_DOCUMENT/RETRIEVAL_QUERY) and Matryoshka dimension truncation (768 / 1536 / 3072).gemini-embedding-2, multilingual, 8k token input. - Anthropic — contextualization via
/v1/messages. - API keys via environment variables —
OPENAI_API_KEY,ANTHROPIC_API_KEY, etc. Batch indexing commands (exec,exec-queue) are env-var-only. Interactive MCP search can fall back to MCP elicitation when the client supports it. - Standard MCP stdio transport (JSON-RPC over stdin/stdout)
Chunk Contextualization
Standard RAG chunking loses context — a sentence about "the protocol" becomes ambiguous when ripped from its surrounding paragraphs. This server addresses that with Unified Chunk Contextualization: a single LLM call per chunk that produces both contextual framing and bilingual (Korean + English) keywords in one pass.
The result is stored alongside the original chunk text:
- Original text is preserved for accurate retrieval display
- Contextualized text is what gets embedded and indexed in BM25
- Bilingual keywords enable cross-lingual search — a Korean query can retrieve English documents and vice versa
This is enabled by setting contextualizer in config.json. It can be disabled (set provider/model to empty) if you prefer raw chunk indexing.
How Indexing Works
The exec command runs a 5-stage pipeline per file:
- Extract — text from document (DOCX, PDF OCR, audio transcription, etc.)
- Chunk — split into ~1000 char windows
- Contextualize — LLM enrichment (optional, see above)
- Embed — vector embedding via API
- Persist — save to SQLite
For large files, Stage 1 alone can take 20+ minutes — OCR on a 596-page scanned PDF, or Whisper transcription of a multi-hour audio recording. The first audio file in any KB also pays a one-time ggml model download (cached under {UserProfile}/.fieldcure/whisper-models/). To prevent expensive upstream work from being lost when later stages fail, the pipeline uses a 2-commit model:
Why this matters: A 25-minute OCR result is persisted on disk before any embedding API call. If Stage 4 fails (network error, rate limit, token limit, process crash, even power loss), the chunks survive. The next exec hash-skips the file (no OCR re-run) and the deferred retry pass attempts only Stage 4.
Per-Chunk Failure Isolation (Binary Split)
If a single chunk in a file exceeds the embedding model's token limit (e.g., a math-dense page in a textbook), the binary split algorithm isolates that one chunk:
Result: 1249 chunks indexed, only chunk 846 marked Failed. The file's status becomes Degraded — partially searchable instead of completely missing.
Deferred Retry Pass
Each exec ends with a retry pass over any chunks left in PendingEmbedding state from previous runs:
- Reads enriched text from DB — no OCR or contextualization re-run
- Calls the embedding API only — typically seconds, not minutes
- Up to 3 retries per chunk; on exhaustion, the chunk is marked
Failed - Auth errors (401/403) flag the provider as unavailable and skip the rest of the pass
File States
Schema Versioning
Each KB DB carries a PRAGMA user_version tag. The exec command migrates older schemas automatically as part of InitializeSchema(). The serve command opens DBs read-only and never triggers migration — older-schema KBs continue to serve search queries correctly while their new-feature columns remain unused.
Installation
dotnet tool (recommended)
From source
Requirements
- .NET 8.0 Runtime or later
- OCR: Windows x64 only — Tesseract OCR for scanned PDFs loads lazily on first use (Windows only). On other platforms, PDFs with embedded text work normally; scanned pages without a text layer are silently skipped.
- An embedding provider (Ollama, OpenAI, etc.) — optional, BM25 search works without it
- Ollama 0.4.0 or later (if using Ollama for embedding or contextualization)
Quick Start
Index a folder and search it without any embedding setup (BM25 only):
For full retrieval quality with semantic search and contextualization, add embedding and contextualizer blocks to config.json — see Usage below.
Usage
1. Create a knowledge base folder
API keys are resolved from environment variables: apiKeyPreset: "OpenAI" → OPENAI_API_KEY, "Claude" → ANTHROPIC_API_KEY, "Gemini" (or "Google") → GEMINI_API_KEY.
Gemini embedding example — asymmetric retrieval with 1536-dim Matryoshka truncation (50% storage of full 3072 with identical MTEB score):
2. Index documents
3. Start MCP search server
A single serve process handles all knowledge bases under the base path. Tools accept a kb_id parameter to target a specific KB.
Claude Desktop
Add to claude_desktop_config.json:
config.json Reference
Tools
All tools (except list_knowledge_bases) require a kb_id parameter to specify the target knowledge base.
Search Modes
Supported Formats
Document formats are provided by FieldCure.DocumentParsers:
- DOCX — Microsoft Word (with math equation extraction)
- HWPX — Korean standard document (OWPML, with math equation extraction)
- XLSX — Excel spreadsheets
- PPTX — PowerPoint presentations
- PDF — PDF text extraction with
## Page Nheaders; OCR fallback for scanned pages (Tesseract, eng+kor) - TXT, MD — Plain text / Markdown
Project Structure
Data Storage
Knowledge base data is stored at %LOCALAPPDATA%\FieldCure\Mcp.Rag\{kb-id}\:
config.json— knowledge base configurationrag.db— SQLite database (chunks, embeddings, FTS5 index, file hashes, indexing lock)
Queue and lock files at %LOCALAPPDATA%\FieldCure\Mcp.Rag\:
.deferred-queue.json— pending indexing requestsorchestrator.lock— PID lock for the queue orchestrator
Development
See Also
Part of the AssistStudio ecosystem.
License
Source: README.md at commit ddfdb4f
Tools
0Version history
1- v2.5.1LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts