
Rag
io.github.fieldcure由 GitHub 帳號 fieldcure 發布v2.5.1更新於 Oct 24, 2026
MCP RAG server with hybrid search, multi-KB support, and AI-powered chunk contextualization.
概覽
一個本機 MCP 伺服器,把文件資料夾索引成可搜尋的知識庫,讓助理對其做關鍵字與語意混合搜尋。
- 可以做什麼
- 列出知識庫及其檔案數、分塊數與索引狀態,檢視索引中繼資料、佇列狀態和上下文化健康狀況,或在不呼叫 API 的情況下試跑檔案系統變更掃描。以 BM25 加向量的混合方式搜尋文件,也可只用關鍵字或只用語意模式,並依 ID 取回某個分塊的完整內容。送出重建索引請求,支援範圍合併與強制、延遲標記,或取消尚未開始的佇列項目。索引本身由另一個命令列流程完成:從 DOCX、HWPX、PDF、Excel、PowerPoint、Markdown 和音訊中擷取文字,切成分塊,可選擇用大型模型補充上下文,再寫入 SQLite。
- 適用情境
- 適合本機存有一批文件、希望助理根據這些文件回答問題並定位到具體分塊的情境,尤其是韓文與英文資料或掃描版 PDF。也適合多個專案共用一個伺服器、需要同時服務多個知識庫的情況。
- 執行需求
- 以 .NET 8.0 或更新版本的 dotnet 工具在本機執行,透過 serve 命令和基礎路徑啟動。每個知識庫需要一份 config.json 指定來源資料夾。嵌入或上下文化提供者是選用的,未設定時仍可用純關鍵字搜尋。API 金鑰來自環境變數,例如 OPENAI_API_KEY、ANTHROPIC_API_KEY、GEMINI_API_KEY、GROQ_API_KEY 或 VOYAGE_API_KEY,也可透過 MCP 詢問取得。OCR 僅支援 Windows x64,音訊轉錄僅限 Windows。
安裝
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
來源:README.md,提交 ddfdb4f
工具
0版本歷史
1- v2.5.1最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分