Install
$ agentstack add mcp-brainwires-project-rag ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Project RAG - MCP Server for Code Understanding
[](https://github.com/Brainwires/project-rag) [](https://github.com/Brainwires/project-rag) [](https://www.rust-lang.org/) [](https://crates.io/crates/project-rag) [](https://opensource.org/licenses/MIT)
A Rust-based Model Context Protocol (MCP) server that provides AI assistants with powerful RAG (Retrieval-Augmented Generation) capabilities for understanding massive codebases.
Overview
This MCP server enables AI assistants to efficiently search and understand large projects by:
- Creating semantic embeddings of code files
- Storing them in a local vector database
- Providing fast semantic search capabilities
- Supporting incremental updates for efficiency
Features
- Local-First: All processing happens locally using fastembed-rs (no API keys required)
- Hybrid Search: Combines vector similarity with BM25 keyword matching using Reciprocal Rank Fusion (RRF) for optimal results
- AST-Based Chunking: Uses Tree-sitter to extract semantic units (functions, classes, methods) for 12 languages
- Comprehensive File Support: Indexes 40+ file types including code, documentation (with PDF→Markdown conversion), and configuration files
- Git History Search: Search commit history with smart on-demand indexing (default: 10 commits, only indexes deeper as needed)
- Multi-Project Support: Index and query multiple codebases simultaneously with project filtering
- Smart Indexing: Automatically performs full indexing for new codebases or incremental updates for previously indexed ones
- Cross-Process Locking: Filesystem-based locks prevent multiple processes (e.g., multiple Claude Code sessions) from indexing the same codebase simultaneously
- Concurrent Access Protection: Safe lock management prevents index corruption when multiple agents try to index simultaneously
- Stable Embedded Database: LanceDB vector database (default, no external dependencies) with optional Qdrant support
- Language Detection: Automatic detection of 40+ file types (programming languages, documentation formats, and config files)
- Advanced Filtering: Search by file type, language, or path patterns
- Respects .gitignore: Automatically excludes ignored files during indexing
- Code Navigation: Find definitions, references, and call graphs (lightweight LSP-like features)
- Adaptive Search Thresholds: Automatically lowers similarity threshold when no results found (0.7 → 0.6 → 0.5 → 0.4 → 0.3)
- Slash Commands: 9 convenient slash commands via MCP Prompts
MCP Slash Commands
The server provides 9 slash commands for quick access in Claude Code:
/project:index- Index a codebase directory (automatically performs full or incremental)/project:query- Search the indexed codebase/project:stats- Get index statistics/project:clear- Clear all indexed data/project:search- Advanced search with filters/project:git-search- Search git commit history with on-demand indexing/project:definition- Find where a symbol is defined (LSP-like)/project:references- Find all references to a symbol/project:callgraph- Get call graph for a function (callers/callees)
See [slash-commands.md](docs/slash-commands.md) for detailed usage.
Supported File Types
Project RAG automatically indexes and searches 40+ file types across three categories:
Programming Languages (24 languages)
Supports AST-based semantic chunking for these languages:
- Rust (
.rs) - Python (
.py) - JavaScript (
.js,.mjs,.cjs), TypeScript (.ts), JSX (.jsx), TSX (.tsx) - Go (
.go) - Java (
.java) - C (
.c), C++ (.cpp,.cc,.cxx), C/C++ Headers (.h,.hpp) - C# (
.cs) - Swift (
.swift) - Kotlin (
.kt,.kts) - Scala (
.scala) - Ruby (
.rb) - PHP (
.php) - Shell (
.sh,.bash) - SQL (
.sql) - HTML (
.html,.htm) - CSS (
.css), SCSS (.scss,.sass)
Documentation Formats (8 formats)
With special handling for rich content:
- Markdown (
.md,.markdown) - PDF (
.pdf) - Automatically converted to Markdown with table preservation - reStructuredText (
.rst) - AsciiDoc (
.adoc,.asciidoc) - Org Mode (
.org) - Plain Text (
.txt) - Log Files (
.log)
PDF Conversion Features:
- Extracts text content using
pdf-extractlibrary - Converts to Markdown format automatically
- Preserves table structures (detects tab/space-separated columns)
- Detects and formats headings (ALL CAPS lines and section markers)
- Handles multi-column layouts intelligently
- Chunks like any other text file (50 lines per chunk by default)
Configuration Files (8 formats)
For complete project understanding:
- JSON (
.json) - YAML (
.yaml,.yml) - TOML (
.toml) - XML (
.xml) - INI (
.ini) - Config files (
.conf,.config,.cfg) - Properties (
.properties) - Environment (
.env)
Example Use Cases
# Index documentation PDFs in your project
query_codebase("API authentication flow") # Finds content in .pdf, .md, .rst files
# Search configuration files
query_codebase("database connection string") # Finds .yaml, .toml, .env, .conf files
# Find code implementations
search_by_filters(query="JWT validation", file_extensions=["rs", "go"])
MCP Tools
The server provides 9 tools that can be used directly:
- index_codebase - Smartly index a codebase directory
- Automatically performs full indexing for new codebases
- Automatically performs incremental updates for previously indexed codebases
- Respects .gitignore and exclude patterns
- Returns mode information (full or incremental)
- query_codebase - Hybrid semantic + keyword search across the indexed code
- Combines vector similarity with BM25 keyword matching (enabled by default)
- Returns relevant code chunks with both vector and keyword scores
- Configurable result limit and score threshold
- Optional project filtering for multi-project setups
- get_statistics - Get statistics about the indexed codebase
- File counts, chunk counts, embedding counts
- Language breakdown
- clear_index - Clear all indexed data
- Deletes the entire vector database collection
- Prepares for fresh indexing
- searchbyfilters - Advanced hybrid search with filters
- Always uses hybrid search for best results
- Filter by file extensions (e.g., ["rs", "toml"])
- Filter by programming languages
- Filter by path patterns
- Optional project filtering
- searchgithistory - Search git commit history using semantic search
- Automatically indexes commits on-demand (default: 10 commits, configurable)
- Searches commit messages, diffs, author info, and changed files
- Smart caching: only indexes new commits as needed
- Regex filtering by author name/email and file paths
- Date range filtering (ISO 8601 or Unix timestamp)
- Branch selection support
- find_definition - Find where a symbol is defined (LSP-like)
- Specify file path, line number, and column
- Returns definition location with symbol metadata
- Uses hybrid approach: high-precision stack-graphs (Python, TypeScript, Java, Ruby) or AST-based RepoMap fallback
- Reports precision level of results
- find_references - Find all references to a symbol
- Specify file path, line number, and column
- Returns all locations where the symbol is used
- Categorizes reference types: Call, Read, Write, Import, TypeReference, Inheritance, Instantiation
- Optional: include definition site in results
- getcallgraph - Get call graph for a function
- Specify file path, line number, and column for a function
- Returns callers (what calls this function) and callees (what this function calls)
- Configurable traversal depth (default: 1 level)
- Useful for understanding code flow and impact analysis
Prerequisites
- Rust: 1.88+ with Rust 2024 edition support
- protobuf-compiler: Required for building (install via
sudo apt-get install protobuf-compileron Ubuntu/Debian)
Vector Database Options
LanceDB (Default - Embedded, Stable)
No additional setup needed! LanceDB is an embedded vector database that runs directly in the application. It stores data in ./.lancedb directory by default.
Why LanceDB is the default:
- Embedded - No external dependencies or servers required
- Stable - Production-proven with ACID transactions
- Feature-rich - Full SQL-like filtering capabilities
- Hybrid search built-in - Tantivy BM25 + LanceDB vector with Reciprocal Rank Fusion
- Columnar storage - Efficient for large datasets with Apache Arrow
- Zero-copy - Memory-mapped files for fast queries
Qdrant (Optional - Server-Based)
To use Qdrant instead of LanceDB, build with the qdrant-backend feature:
cargo build --release --no-default-features --features qdrant-backend
Then start a Qdrant instance:
Using Docker (Recommended):
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_data:/qdrant/storage \
qdrant/qdrant
Using Docker Compose:
version: '3.8'
services:
qdrant:
image: qdrant/qdrant
ports:
- "6333:6333"
- "6334:6334"
volumes:
- ./qdrant_data:/qdrant/storage
Or download standalone: https://qdrant.tech/documentation/guides/installation/
Installation
# Navigate to the project
cd project-rag
# Install protobuf compiler (Ubuntu/Debian)
sudo apt-get install protobuf-compiler
# Build the release binary (with default LanceDB backend - stable and embedded!)
cargo build --release
# Or build with Qdrant backend (requires external server)
cargo build --release --no-default-features --features qdrant-backend
# The binary will be at target/release/project-rag
Usage
Running as MCP Server
The server communicates over stdio following the MCP protocol:
./target/release/project-rag
Configuring in Claude Code
Add the MCP server to Claude Code using the CLI:
# Navigate to the project directory first
cd /path/to/project-rag
# Add the MCP server to Claude Code
claude mcp add project --command "$(pwd)/target/release/project-rag"
# Or with logging enabled
claude mcp add project --command "$(pwd)/target/release/project-rag" --env RUST_LOG=info
After adding, restart Claude Code to load the server. The slash commands (/project:index, /project:query, etc.) will be available immediately.
Configuring in Claude Desktop
Add to your Claude Desktop config:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"project-rag": {
"command": "/absolute/path/to/project-rag/target/release/project-rag",
"env": {
"RUST_LOG": "info"
}
}
}
}
Note: Claude Code and Claude Desktop are different products with different configuration methods.
Example Tool Usage
Index a codebase:
{
"path": "/path/to/your/project",
"include_patterns": ["**/*.rs", "**/*.toml"],
"exclude_patterns": ["**/target/**", "**/node_modules/**"],
"max_file_size": 1048576
}
Query the codebase:
{
"query": "How does authentication work?",
"limit": 10,
"min_score": 0.7
}
Advanced filtered search:
{
"query": "database connection pool",
"limit": 5,
"min_score": 0.75,
"file_extensions": ["rs"],
"languages": ["Rust"],
"path_patterns": ["src/db"]
}
Index (or re-index) a codebase:
{
"path": "/path/to/your/project",
"include_patterns": [],
"exclude_patterns": []
}
Note: This automatically performs a full index for new codebases or an incremental update for previously indexed ones.
Find definition of a symbol:
{
"file_path": "/path/to/your/project/src/main.rs",
"line": 42,
"column": 10
}
Find all references to a symbol:
{
"file_path": "/path/to/your/project/src/lib.rs",
"line": 15,
"column": 8,
"include_definition": false
}
Get call graph for a function:
{
"file_path": "/path/to/your/project/src/api.rs",
"line": 100,
"column": 4,
"depth": 2
}
Architecture
project-rag/
├── src/
│ ├── bm25_search.rs # Tantivy BM25 keyword search with RRF fusion
│ ├── client/ # High-level client API
│ │ ├── mod.rs # RagClient - unified interface for all operations
│ │ └── indexing/ # Indexing pipeline with progress reporting
│ ├── embedding/ # FastEmbed integration for local embeddings
│ │ ├── mod.rs # EmbeddingProvider trait
│ │ └── fastembed_manager.rs # all-MiniLM-L6-v2 implementation
│ ├── vector_db/ # Vector database implementations
│ │ ├── mod.rs # VectorDatabase trait
│ │ ├── lance_client.rs # LanceDB + Tantivy hybrid search (default)
│ │ └── qdrant_client.rs # Qdrant implementation (optional)
│ ├── indexer/ # File walking and code chunking
│ │ ├── mod.rs # Module exports
│ │ ├── file_walker.rs # Directory traversal with .gitignore + 40+ file types
│ │ ├── chunker.rs # Chunking strategies (AST-based, fixed-lines, sliding window)
│ │ ├── ast_parser.rs # Tree-sitter AST parsing for 12 languages
│ │ └── pdf_extractor.rs # PDF to Markdown converter with table support
│ ├── relations/ # Code relationship analysis (LSP-like features)
│ │ ├── mod.rs # RelationsProvider trait, HybridRelationsProvider
│ │ ├── types.rs # SymbolId, Definition, Reference, CallEdge types
│ │ ├── repomap/ # AST-based symbol extraction (fallback provider)
│ │ │ ├── mod.rs # RepoMapProvider
│ │ │ ├── symbol_extractor.rs # Extract definitions from AST
│ │ │ └── reference_finder.rs # Find references via identifier matching
│ │ ├── storage/ # Relations storage layer
│ │ │ ├── mod.rs # RelationsStore trait
│ │ │ └── lance_store.rs # LanceDB storage (placeholder)
│ │ └── stack_graphs/ # Optional: High-precision name resolution
│ │ └── mod.rs # StackGraphsProvider (feature-gated)
│ ├── mcp_server.rs # MCP server with 9 tools
│ ├── types/ # Request/Response types with JSON schema
│ │ └── mod.rs # All MCP request/response types
│ ├── main.rs # Binary entry point with stdio transport
│ └── lib.rs # Library root
├── Cargo.toml # Rust 2024 edition with dependencies
├── README.md # This file
├── CONTRIBUTING.md # Contributor guidelines
├── TESTING.md # Testing guide
└── CLAUDE.md # AI assistant instructions
Configuration
Environment Variables
RUST_LOG- Set logging level (options:error,warn,info,debug,trace)- Example:
RUST_LOG=debug cargo run
Qdrant Configuration
- Currently hardcoded to
http://localhost:6334 - Future: Add configuration file support
Embedding Model
- Default:
all-MiniLM-L6-v2(384 dimensions) - First run downloads model (~50MB) to cache
Chunking Strategy
- Default: Hybrid AST-based with fallback to fixed-lines
- AST Parsing: Extracts semantic units (functions, classes, methods) for Rust, Python, JavaScript, TypeScript, Go, Java, Swift, C, C++, C#, Ruby, PHP
- Fallback: 50 lines per chunk for unsupported languages
- Alternative: Sliding window with configurable overlap
Technical Details
Embeddings
- Model: all-MiniLM-L6-v2 (Sentence Transformers)
- Dimensions: 384
- Library: fastembed-rs with ONNX
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Brainwires
- Source: Brainwires/project-rag
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.