Skip to main content
Glama
tvergilio

NRTSearch MCP Server

by tvergilio
README.md

# NRTSearch MCP Server

**Production-ready Model Context Protocol (MCP) server for Lucene/NRTSearch, with first-class support for AI assistants like GitHub Copilot and Claude.**

---

## Features

- Exposes NRTSearch/Lucene search as a robust MCP server for AI tools
- Accepts any Lucene query (Boolean, phrase, range, wildcard, fuzzy, etc.)
- Structured logging, retries, and highlight support
- Pure unit-testable search logic with full test coverage
- Easy integration with GitHub Copilot, Claude Desktop, and other MCP clients
- Modern Python packaging and configuration (Pydantic, pyproject.toml)

---

## Quick Start

```bash
git clone https://github.com/tvergilio/nrtsearch-mcp-server.git
cd nrtsearch-mcp-server
./quickstart.sh
```

This will:
- Install all dependencies (including MCP SDK)
- Start the server on the configured port

---


## Usage

### CLI / Manual


After installation, you can start the server with either:

```bash

# Using the Python module
python -m nrtsearch_mcp.server

# Or, if installed via pip/pipx, use the CLI entrypoint:
nrtsearch-mcp
```

### With GitHub Copilot (VS Code)
1. Install VS Code and GitHub Copilot
2. Add `nrtsearch-mcp` as a Model Context Provider in VS Code settings (see `.vscode/settings.json`)
3. Start the server (`./quickstart.sh` or `nrtsearch-mcp`)
4. Use Copilot Chat to query your Lucene indexes in natural language

---

## Configuration

The server is configured via environment variables and/or a JSON config file. By default, it looks for:
- `NRTSEARCH_MCP_CONFIG` env var (path to config)
- `./config.json` in the current directory
- `~/nrtsearch-mcp-config.json` in your home directory

Example config:
```json
{
  "nrtsearch_connection": {
    "host": "localhost",
    "port": 8000,
    "use_https": false
  },
  "log_level": "INFO"
}
```

Key environment variables:
- `LOG_LEVEL` (default: INFO)
- `NRTSEARCH_MCP_CONFIG` (optional config path)

---

## API: Search Tool

The main tool is `nrtsearch/search`:

**Parameters:**
- `index` (str): Index name (e.g. `yelp_reviews_staging`)
- `queryText` (str): Full Lucene query (e.g. `text:(irish AND pub AND (texas OR tx))`)
- `topHits` (int, default 10): Number of results (1-100)
- `retrieveFields` (list, optional): Fields to return (default: `["text", "stars"]`)
- `highlight` (bool, optional): Highlight matches

**Returns:**
- List of hits: `{score, stars, text}`

**Lucene Query Examples:**
- `text:(irish AND pub AND (texas OR tx))`
- `text:"great coffee"`
- `stars:[4 TO 5] AND text:(vegan AND brunch)`

---

## Testing

Run all tests (unit, no server needed):

```bash
pytest -v
```

Tests cover:
- Success, empty, and multiple hits
- Error handling (HTTP, network, malformed, missing fields)
- Retry logic
- Highlight and custom fields
- Input validation

---


## Project Structure

```
nrtsearch-mcp-server/
├── nrtsearch_mcp/
│   ├── server.py         # Main MCP server and search logic
│   ├── settings.py       # Pydantic config
│   └── ...
├── tests/               # Unit tests 
├── quickstart.sh        # One-step install & run
├── requirements.txt     # Python dependencies
├── pyproject.toml       # Packaging/metadata
└── ...
```

---



## License

Apache License 2.0. See [LICENSE](LICENSE).