Skip to main content
Glama
kwanLeeFrmVi

mcp-rag-server

by kwanLeeFrmVi
README.md
# mcp-rag-server

[![npm version](https://img.shields.io/npm/v/mcp-rag-server.svg)](https://www.npmjs.com/package/mcp-rag-server)  [![License](https://img.shields.io/npm/l/mcp-rag-server.svg)](LICENSE)  [![Node.js Version](https://img.shields.io/node/v/mcp-rag-server)](package.json)

A Model Context Protocol (MCP) server that enables Retrieval Augmented Generation (RAG). It indexes your documents and serves relevant context to Large Language Models via the MCP protocol.

## Integration Examples

### Generic MCP Client Configuration

```json
{
  "mcpServers": {
    "rag": {
      "command": "npx",
      "args": ["-y", "mcp-rag-server"],
      "env": {
        "BASE_LLM_API": "http://localhost:11434/v1",
        "EMBEDDING_MODEL": "nomic-embed-text",
        "VECTOR_STORE_PATH": "./vector_store",
        "CHUNK_SIZE": "500"
      }
    }
  }
}
```

### Example Interaction

```shell
# Index documents
>> tool:embedding_documents {"path":"./docs"}

# Check status
>> resource:embedding-status

<< rag://embedding/status
Current Path: ./docs/file1.md
Completed: 10
Failed: 0
Total chunks: 15
Failed Reason:
```

## Table of Contents

- [Integration Examples](#integration-examples)
- [Features](#features)
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Configuration](#configuration)
- [Usage](#usage)
  - [MCP Tools](#mcp-tools)
  - [MCP Resources](#mcp-resources)
- [How RAG Works](#how-rag-works)
- [Development](#development)
- [Contributing](#contributing)
- [License](#license)

## Features

- Index documents in `.txt`, `.md`, `.json`, `.jsonl`, and `.csv` formats
- Customizable chunk size for splitting text
- Local vector store powered by SQLite (via LangChain's LibSQLVectorStore)
- Supports multiple embedding providers (OpenAI, Ollama, Granite, Nomic)
- Exposes MCP tools and resources over stdio for seamless integration with MCP clients

## Installation

### From npm

```bash
npm install -g mcp-rag-server
```

### From Source

```bash
git clone https://github.com/kwanLeeFrmVi/mcp-rag-server.git
cd mcp-rag-server
npm install
npm run build
npm start
```

## Quick Start

```bash
export BASE_LLM_API=http://localhost:11434/v1
export EMBEDDING_MODEL=granite-embedding-278m-multilingual-Q6_K-1743674737397:latest
export VECTOR_STORE_PATH=./vector_store
export CHUNK_SIZE=500

# Run (global install)
mcp-rag-server

# Or via npx
npx mcp-rag-server
```
> 💡 **Tip:** We recommend using [Ollama](https://ollama.com) for embedding. Install and pull the `nomic-embed-text` model:
```bash
ollama pull nomic-embed-text
export EMBEDDING_MODEL=nomic-embed-text
```

## Configuration

| Variable            | Description                                      | Default                           |
| ------------------- | ------------------------------------------------ | --------------------------------- |
| `BASE_LLM_API`      | Base URL for embedding API                       | `http://localhost:11434/v1`       |
| `LLM_API_KEY`       | API key for your LLM provider                    | (empty)                           |
| `EMBEDDING_MODEL`   | Embedding model identifier                       | `nomic-embed-text`                |
| `VECTOR_STORE_PATH` | Directory for local vector store                 | `./vector_store`                  |
| `CHUNK_SIZE`        | Characters per text chunk (number)               | `500`                             |
> 💡 **Recommendation:** Use Ollama embedding models like `nomic-embed-text` for best performance.

## Usage

### MCP Tools

Once running, the server exposes these tools via MCP:

- `embedding_documents(path: string)`: Index documents under the given path
- `query_documents(query: string, k?: number)`: Retrieve top `k` chunks (default 15)
- `remove_document(path: string)`: Remove a specific document
- `remove_all_documents(confirm: boolean)`: Clear the entire index (`confirm=true`)
- `list_documents()`: List all indexed document paths

### MCP Resources

Clients can also read resources via URIs:

- `rag://documents` — List all document URIs
- `rag://document/{path}` — Fetch full content of a document
- `rag://query-document/{numberOfChunks}/{query}` — Query documents as a resource
- `rag://embedding/status` — Check current indexing status (completed, failed, total)

## How RAG Works

1. **Indexing**: Reads files, splits text into chunks based on `CHUNK_SIZE`, and queues them for embedding.
2. **Embedding**: Processes each chunk sequentially against the embedding API, storing vectors in SQLite.
3. **Querying**: Embeds the query and retrieves nearest text chunks from the vector store, returning them to the client.

## Development

```bash
npm install
npm run build      # Compile TypeScript
npm start          # Run server
npm run watch      # Watch for changes
```

## Contributing

Contributions are welcome! Please open issues or pull requests on [GitHub](https://github.com/kwanLeeFrmVi/mcp-rag-server).

## License

MIT 2025 Quan Le