Legal Document RAG MCP Server
by alifindrar
README.md
# Legal Document RAG — MCP Server
Fully local, offline RAG system for legal documents (Indonesian + English).
Built on **MCP SDK**, **ChromaDB**, **SQLite FTS5**, and **multilingual-e5-large**.
---
## Requirements
- Python ≥ 3.11
- Tesseract OCR with Indonesian language pack:
```bash
# Ubuntu / Debian
sudo apt install tesseract-ocr tesseract-ocr-ind
# macOS
brew install tesseract
brew install tesseract-lang # includes ind
```
---
## Setup
```bash
# 1. Clone / copy the project
cd legal_rag_mcp
# 2. Create virtual environment
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 3. Install dependencies
pip install -r requirements.txt
# 4. (First run) The multilingual-e5-large model (~2.2 GB) will be
# downloaded automatically to ~/.cache/huggingface/hub
# All subsequent runs are fully offline.
```
---
## Usage
### Drop documents in the watch folder
```
legal_rag_mcp/raw_legal_docs/
├── kontrak_jual_beli.pdf
├── perjanjian_kerjasama.docx
├── schedule_of_fees.xlsx
└── scanned_addendum.png
```
### Launch the MCP server
```bash
# Development mode (with MCP Inspector UI)
mcp dev mcp_server/server.py
# Production mode (stdio, for Claude Desktop or any MCP client)
python mcp_server/server.py
```
### Claude Desktop configuration (`claude_desktop_config.json`)
```json
{
"mcpServers": {
"legal-rag": {
"command": "python",
"args": ["/absolute/path/to/legal_rag_mcp/mcp_server/server.py"]
}
}
}
```
---
## Tools Exposed
| Tool | Purpose |
|---|---|
| `search_clauses` | Hybrid semantic + keyword search |
| `find_conflicts` | Cross-document conflict detection (two-zone thresholds) |
| `get_document_overview` | Document metadata + clause outline |
| `retrieve_context` | Read a clause in full surrounding context |
| `list_documents` | Inventory of all ingested files |
---
## Conflict Detection Thresholds
| Zone | Cosine Similarity | Interpretation |
|---|---|---|
| Near-duplicate | > 0.88 | Same clause — skip |
| **HIGH suspicion** | 0.75 – 0.88 | Same topic, different obligations |
| **MODERATE suspicion** | 0.60 – 0.75 | Related topic, may diverge |
| Unrelated | < 0.60 | Different provisions |
Thresholds are configurable in `config.py`.
---
## Re-ingestion (Diff-Based)
When a file in `raw_legal_docs/` is modified:
1. File-level SHA-256 hash is compared against the stored hash.
2. If unchanged → skip entirely.
3. If changed → re-chunk the document, compute per-chunk hashes.
4. Only **changed or new chunks** are re-embedded and upserted.
5. **Orphaned chunks** (present in old version, absent in new) are deleted.
6. Full re-embedding is never triggered by a partial change.
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues