SRC (Structured Repo Context)
SRC (Structured Repo Context)
Transform your codebase into AI-ready context ā MCP server + CLI for semantic code search that makes your code truly understandable for AI assistants
SRC is both:
š An MCP Server ā Integrates with Claude Desktop, Cursor, and any MCP-compatible AI assistant
š» A Standalone CLI ā Use directly from your terminal for indexing and searching
Table of Contents
Overview
The Problem
AI assistants struggle to understand your entire codebase:
They only see small snippets of code at a time
Manual copy-pasting of context is tedious and error-prone
Keyword search misses semantic relationships between code
Code changes get lost in conversation history
The Solution
SRC indexes your codebase into semantic, searchable chunks that LLMs actually understand:
Feature | Description |
Hybrid Search | Vector + BM25 + RRF fusion for optimal results |
Call Graph | Shows who calls what and what calls who |
Cross-file Context | Resolves imports and path aliases automatically |
Incremental Updates | SHA-256 hash detection for fast updates |
50+ Languages | 18 with full AST support via Tree-sitter |
Use Cases
Scenario | Example Query |
Code Review | "Show me all error handling in the payment module" |
Debugging | "Find where user sessions are created" |
Documentation | "Explain the authentication flow" |
Refactoring | "List all deprecated API usages" |
Onboarding | "How does the routing system work?" |
Security Audit | "Find all database query locations" |
Quick Start
1. Install Ollama
SRC requires Ollama for embeddings:
# Install from https://ollama.com, then:
ollama pull nomic-embed-text2. Install SRC
Global installation:
npm install -g src-mcpOr use npx:
npx -y src-mcp serve3. Use as MCP Server (with AI Assistants)
Add to your MCP client configuration (e.g., Claude Desktop):
With global installation:
{
"mcpServers": {
"src-mcp": {
"command": "src-mcp",
"args": ["serve"]
}
}
}With npx:
{
"mcpServers": {
"src-mcp": {
"command": "npx",
"args": ["-y", "src-mcp", "serve"]
}
}
}The server automatically indexes the current directory if no index exists, and watches for file changes.
Then in your AI assistant:
"Search for authentication logic"
"Find error handling code with limit 20"
"Search for UserService in fts mode"4. Use as CLI (Standalone)
# Start server (auto-indexes if needed)
src-mcp serve
# Search for code
src-mcp search_code --query "authentication"
src-mcp search_code --query "error handling" --limit 20
src-mcp search_code --query "UserService" --mode fts
# Check index status
src-mcp get_index_statusKey Arguments
Tool | Argument | Default | Description |
|
| 10 | Max results |
|
| hybrid |
|
|
| 4 | Parallel workers |
|
| false | Re-index if exists |
Installation
Global Installation
npm install -g src-mcpThen use directly:
src-mcp serve
src-mcp search_code --query "authentication"
src-mcp helpnpx (No Installation)
npx -y src-mcp serve
npx -y src-mcp search_code --query "authentication"Local Development
git clone https://github.com/kvnpetit/structured-repo-context-mcp.git
cd structured-repo-context-mcp
npm install
npm run devMCP Tools Reference
SRC exposes 5 MCP tools that AI assistants can call:
index_codebase
Index a directory with semantic chunking, AST enrichment, and embeddings.
Parameter | Type | Required | Default | Description |
| string | No |
| Path to directory to index |
| boolean | No |
| Force re-indexing if index exists |
| string[] | No |
| Additional glob patterns to exclude |
| number | No |
| Parallel file processing workers |
Example:
"Index the project at /home/user/myapp with concurrency 8"Returns:
{
"filesIndexed": 150,
"chunksCreated": 892,
"languages": { "typescript": 500, "javascript": 200, "json": 192 }
}search_code
Hybrid search with vector similarity, BM25 keyword matching, and RRF fusion.
Parameter | Type | Required | Default | Description |
| string | Yes | ā | Natural language search query |
| string | No |
| Path to indexed directory |
| number | No |
| Maximum results to return |
| number | No | ā | Distance threshold (0-2, vector mode only) |
| enum | No |
| Search mode: |
| boolean | No |
| Include caller/callee information |
Search Modes:
Mode | Description | Best For |
| Vector + BM25 + RRF fusion | General queries (default) |
| Semantic similarity only | Conceptual searches |
| Full-text keyword only | Exact identifiers |
Example:
"Search for 'user authentication' with limit 20"Returns:
{
"results": [
{
"content": "export async function authenticateUser(credentials)...",
"filePath": "src/auth/login.ts",
"startLine": 45,
"endLine": 78,
"symbolName": "authenticateUser",
"symbolType": "function",
"score": 0.92,
"callers": [{ "name": "handleLogin", "filePath": "src/routes/auth.ts", "line": 23 }],
"callees": [{ "name": "validatePassword", "filePath": "src/auth/crypto.ts", "line": 12 }]
}
]
}update_index
Incrementally update the index by detecting changed files via SHA-256 hash comparison.
Parameter | Type | Required | Default | Description |
| string | No |
| Path to indexed directory |
| boolean | No |
| Preview changes without updating |
| boolean | No |
| Force re-index all files |
Example:
"Update the index with dry run to see what changed"Returns:
{
"added": ["src/new-file.ts"],
"modified": ["src/auth/login.ts"],
"deleted": ["src/old-file.ts"],
"unchanged": 148
}get_index_status
Get status of the embedding index for a directory.
Parameter | Type | Required | Default | Description |
| string | No |
| Path to directory |
Example:
"Get the index status for current directory"Returns:
{
"exists": true,
"indexPath": "/home/user/myapp/.src-index",
"totalFiles": 150,
"totalChunks": 892,
"languages": { "typescript": 500, "javascript": 200 }
}get_server_info
Get server version, capabilities, and configuration.
Parameter | Type | Required | Default | Description |
| enum | No |
| Output format: |
Returns:
{
"name": "src-mcp",
"version": "1.0.0",
"capabilities": ["indexing", "search", "incremental-update"]
}CLI Reference
Every MCP tool is also a CLI command. You can use SRC from your terminal without any AI assistant.
General Usage
src-mcp <command> [options]
src-mcp help # Show all commands
src-mcp <command> --help # Show command optionsOr with npx:
npx -y src-mcp <command> [options]Commands
# Start MCP server (auto-indexes if needed, watches for changes)
src-mcp serve
src-mcp serve --no-watch # Disable file watcher
# Index a codebase manually
src-mcp index_codebase
src-mcp index_codebase --concurrency 8
src-mcp index_codebase --force # Re-index even if index exists
# Search indexed code
src-mcp search_code --query "authentication"
src-mcp search_code --query "error handling" --limit 20 --mode hybrid
src-mcp search_code --query "UserService" --mode fts # Exact keyword search
# Update index incrementally
src-mcp update_index
src-mcp update_index --dryRun # Preview changes only
# Check index status
src-mcp get_index_status
# Server information
src-mcp get_server_info --format jsonConfiguration
Environment Variables
All settings can be configured via environment variables:
Variable | Description | Default |
| Ollama API endpoint |
|
| Model for embeddings |
|
| Vector dimensions |
|
| Characters per chunk |
|
| Overlap between chunks |
|
| Batch size for embedding |
|
| Log verbosity |
|
Example:
OLLAMA_BASE_URL=http://192.168.1.100:11434 src-mcp serveMCP Client Configuration
Claude Desktop (claude_desktop_config.json):
With global installation:
{
"mcpServers": {
"src-mcp": {
"command": "src-mcp",
"args": ["serve"]
}
}
}With npx:
{
"mcpServers": {
"src-mcp": {
"command": "npx",
"args": ["-y", "src-mcp", "serve"]
}
}
}With environment variables:
{
"mcpServers": {
"src-mcp": {
"command": "src-mcp",
"args": ["serve"],
"env": {
"OLLAMA_BASE_URL": "http://192.168.1.100:11434"
}
}
}
}Index Storage
Indexes are stored in .src-index/ directory within each indexed project:
my-project/
āāā src/
āāā .src-index/ # Created by SRC
ā āāā lancedb/ # Vector database
ā āāā callgraph.json # Call graph cache
ā āāā .src-index-hashes.json # File hash cache
āāā ...Add .src-index/ to your .gitignore:
.src-index/Supported Languages
Full AST Support (18 languages)
These languages have complete support: symbol extraction, semantic chunking at function/class boundaries, call graph analysis, and import resolution.
Category | Language | Extensions |
Web | JavaScript |
|
TypeScript |
| |
TSX |
| |
HTML |
| |
Svelte |
| |
Systems | C |
|
C++ |
| |
Rust |
| |
Go |
| |
Enterprise | Java |
|
C# |
| |
Kotlin |
| |
Scala |
| |
Scripting | Python |
|
Ruby |
| |
PHP |
| |
Functional | OCaml |
|
Swift |
|
LangChain Fallback (16 languages)
These languages use intelligent text splitting with language-aware rules:
Language | Extensions |
Markdown |
|
LaTeX |
|
reStructuredText |
|
Solidity |
|
Protocol Buffers |
|
Lua |
|
Haskell |
|
Elixir |
|
PowerShell |
|
Perl |
|
Cobol |
|
Visual Basic |
|
FORTRAN |
|
Assembly |
|
Generic Support (30+ file types)
All other text files use configurable chunking:
Category | Extensions |
Config |
|
Shell |
|
Styles |
|
Data |
|
DevOps |
|
Other |
|
Auto-excluded Files
Binary files and lock files are automatically excluded:
Binaries:
.exe.dll.so.png.jpg.mp3.zip.wasmLock files:
package-lock.jsonyarn.lockpnpm-lock.yamlBuild outputs:
.pyc.class.odist/node_modules/
How It Works
Indexing Pipeline
Source Files ā Semantic Chunking ā AST Enrichment ā Cross-file Context ā Embeddings ā LanceDB
ā ā ā ā
Split at symbol Extract symbols Resolve imports nomic-embed-text
boundaries and metadata and aliases 768 dimensionsSteps:
Scan ā Find all supported files (respects
.gitignore)Chunk ā Split code at function/class boundaries (1000 chars, 200 overlap)
Enrich ā Add AST metadata (symbols, imports, exports)
Resolve ā Resolve cross-file imports and TypeScript path aliases
Embed ā Generate vectors via Ollama (nomic-embed-text)
Store ā Save to LanceDB with vector and full-text indices
Cache ā Store file hashes for incremental updates
Search Pipeline
Query ā Embed Query ā Vector Search āā
āā RRF Fusion ā Add Call Context ā Results
Query ā Tokenize āāāā BM25 Search āāāāSteps:
Embed ā Convert query to vector using same model
Vector Search ā Find semantically similar chunks (cosine similarity)
BM25 Search ā Find keyword matches (term frequency)
RRF Fusion ā Combine rankings with Reciprocal Rank Fusion (k=60)
Call Context ā Add caller/callee information from call graph
Return ā Ranked results with full context
Technical Specifications
Component | Specification |
Embedding Model | nomic-embed-text (137M params) |
Vector Dimensions | 768 |
Chunk Size | 1000 characters |
Chunk Overlap | 200 characters |
Batch Size | 10 embeddings per request |
RRF Constant | k=60 |
Vector Database | LanceDB (embedded) |
Comparison
SRC vs Basic Code Search MCPs
Feature | SRC | Basic MCPs |
Search Method | Hybrid (Vector + BM25 + RRF) | Keyword only or basic embedding |
Call Graph | Full caller/callee context | None |
Cross-file Context | Resolves imports & path aliases | None |
Incremental Updates | SHA-256 hash detection | Full re-index required |
AST Languages | 18 with Tree-sitter WASM | Few or none |
Total Languages | 50+ | Limited |
Key Advantages
Hybrid Search ā Combines semantic understanding with keyword precision
Call Graph ā Understand code relationships, not just content
Cross-file Resolution ā Follows imports to provide complete context
Incremental Updates ā Only re-index what changed
Semantic Chunking ā Splits at symbol boundaries, not arbitrary lines
Troubleshooting
Ollama Connection Failed
Error: Ollama is not availableSolution:
Ensure Ollama is running:
ollama serveCheck the URL:
curl http://localhost:11434/api/tagsIf using remote Ollama: set
OLLAMA_BASE_URL
Model Not Found
Error: model 'nomic-embed-text' not foundSolution:
ollama pull nomic-embed-textIndex Already Exists
Error: Index already exists. Use force=true to re-index.Solution:
Use
force: trueparameter to re-indexOr use
update_indexfor incremental updates
No Results Found
Possible causes:
Query too specific ā try broader terms
Wrong directory ā check
directoryparameterFiles excluded ā check
.gitignorepatterns
Slow Indexing
Solutions:
Increase concurrency:
--concurrency 8Exclude large directories:
--exclude node_modules --exclude distUse faster storage (SSD)
Links
Project
External
License
MIT Ā© 2026 kvnpetit
Ready to supercharge your AI coding experience?
npm install -g src-mcp && src-mcp serve
# or
npx -y src-mcp serveLatest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kvnpetit/structured-repo-context-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server