Skip to main content
Glama
alifindrar

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.

Maintenance

ActivityInactive
ResponsivenessNo issues