Skip to main content
Glama
arbaz-builds

RAG MCP Server

by arbaz-builds
README.md
# RAG MCP Server

[![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org/)
[![FastMCP](https://img.shields.io/badge/MCP-FastMCP-green)](https://github.com/jlowin/fastmcp)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

A [FastMCP](https://github.com/jlowin/fastmcp) server that exposes a Retrieval-Augmented Generation (RAG) pipeline as MCP tools — so any MCP-compatible client (Claude, IDEs, agent frameworks) can index documents and answer questions over them through a standard protocol.

## Stack

- **MCP framework:** FastMCP
- **RAG orchestration:** LlamaIndex
- **Vector store:** Qdrant
- **Embeddings + LLM:** NVIDIA NIM (`nv-embedqa-e5-v5`, `llama-3.1-8b-instruct`)

## How it works

```
Document ──▶ chunk (SentenceSplitter) ──▶ embed (NVIDIA) ──▶ upsert ──▶ Qdrant
                                                                            │
User question ──▶ embed ──▶ similarity search ─────────────────────────────┘
                                       │
                                       ▼
                            top-k chunks ──▶ LLM synthesis ──▶ answer
```

The server keeps an in-memory reference to the last-built index so repeated queries don't require re-embedding, while still supporting a fresh load from Qdrant if the process restarts.

## Tools

| Tool | Description |
|---|---|
| `index_document(file_path)` | Loads a document, chunks it, embeds it, and upserts it into Qdrant. |
| `query_documents(question)` | Retrieves the most relevant chunks and synthesizes an answer via the LLM. |

## Setup

1. Clone the repo and install dependencies:
   ```bash
   git clone https://github.com/arbaz-builds/rag-mcp-server.git
   cd rag-mcp-server
   pip install -r requirements.txt
   ```

2. Copy `.env.example` to `.env` and fill in your credentials:
   ```bash
   cp .env.example .env
   ```

3. Run the server:
   ```bash
   python main.py
   ```

The server starts over HTTP transport on `0.0.0.0:$PORT` (default `8000`) — ready to deploy on Render, Railway, or any container platform.

## Example usage (via an MCP client)

```
> index_document("./handbook.pdf")
Indexed './handbook.pdf' successfully (42 chunks).

> query_documents("What is the refund policy?")
Refunds are processed within 5–7 business days for requests made within 30 days of purchase.
```

## Environment Variables

| Variable | Required | Description |
|---|---|---|
| `NVIDIA_API_KEY` | Yes | API key for NVIDIA embeddings + LLM |
| `QDRANT_URL` | Yes | Qdrant cluster URL |
| `QDRANT_API_KEY` | Yes | Qdrant API key |
| `QDRANT_COLLECTION_NAME` | Yes | Collection name in Qdrant — must match an existing collection, no default is applied |
| `PORT` | No (default: `8000`) | HTTP server port |

## Deployment

Deployed with HTTP transport (`host=0.0.0.0`), making it compatible out of the box with Render, Railway, and other container-based hosts that inject a `PORT` environment variable.

## License

MIT