indxr
A fast codebase indexer and MCP server for AI coding agents.
AI coding agents waste thousands of tokens reading entire source files just to understand what's in them. indxr gives agents a structural map of your codebase — declarations, imports, relationships, and dependency graphs — so they can query for exactly what they need at a fraction of the token cost.
Features
- 27 languages — tree-sitter AST parsing for 8 languages, regex extraction for 19 more
- 18-tool MCP server — live codebase queries over JSON-RPC: symbol lookup, file summaries, caller tracing, signature search, and more
- Token-aware — progressive truncation to fit context windows, ~5x reduction vs reading full files
- Git structural diffing — declaration-level diffs (
+added,-removed,~changed) against any git ref - Dependency graphs — file and symbol dependency visualization as DOT, Mermaid, or JSON
- File watching — continuous re-indexing as you edit, via
indxr watchorindxr serve --watch - One-command agent setup —
indxr initconfigures Claude Code, Cursor, and Windsurf with MCP, instruction files, and hooks - Incremental caching — mtime + xxh3 content hashing, sub-20ms indexing for most projects
- Composable filters — by path, kind, symbol name, visibility, and language
- Three output formats — Markdown (default), JSON, YAML at three detail levels
Install
Or build from source:
&&
Usage
Agent Setup
| Agent | Files Created |
|---|---|
| Claude Code | .mcp.json, CLAUDE.md, .claude/settings.json (PreToolUse hooks) |
| Cursor | .cursor/mcp.json, .cursorrules |
| Windsurf | .windsurf/mcp.json, .windsurfrules |
| All | .gitignore entry, INDEX.md (static index) |
Agents don't always pick MCP tools over file reads on their own. indxr init sets up reinforcement — PreToolUse hooks intercept Read/Bash calls and instruction files teach the exploration workflow.
MCP Server
JSON-RPC 2.0 over stdin/stdout, 18 tools:
| Tool | Description |
|---|---|
search_relevant |
Multi-signal relevance search across paths, names, signatures, and docs |
lookup_symbol |
Find declarations by name (case-insensitive substring) |
explain_symbol |
Signature, doc comment, relationships, metadata — no body |
get_file_summary |
Complete file overview without reading it |
batch_file_summaries |
Summarize multiple files in one call |
get_file_context |
File summary + reverse dependencies + related files |
get_public_api |
Public declarations with signatures for a file or directory |
get_callers |
Find who references a symbol across all files |
get_related_tests |
Find test functions by naming convention |
list_declarations |
List declarations in a file with optional filters |
search_signatures |
Search functions by signature pattern |
read_source |
Read source by symbol name or line range |
get_token_estimate |
Estimate tokens before reading |
get_tree |
Directory/file tree |
get_imports |
Import statements for a file |
get_stats |
File count, line count, language breakdown |
get_diff_summary |
Structural changes since a git ref |
regenerate_index |
Re-index and update INDEX.md |
List tools support compact mode for ~30% token savings. See MCP Server docs for full parameter details.
Output
Default format is Markdown at signatures detail level:
src/
main.rs
parser/
| Detail Level | Content |
|---|---|
summary |
Directory tree + file list |
signatures (default) |
+ declarations, imports |
full |
+ doc comments, line numbers, body counts, metadata, relationships |
Filtering
All filters compose. --kind accepts: function, struct, class, trait, enum, interface, module, method, constant, impl, type, namespace, macro, and more.
Git Structural Diffing
## Modified Files
### src/parser/mod.rs
+ `pub fn new_parser() -> Parser`
- `fn old_helper()`
~ `fn process(x: i32)` → `fn process(x: i32, y: i32)`
Markers: + added, - removed, ~ signature changed.
Dependency Graph
| Level | Description |
|---|---|
file (default) |
File-to-file import relationships |
symbol |
Symbol-to-symbol relationships (trait impls, method calls) |
Token Budget
Truncation order: doc comments → private declarations → children → least-important files. Directory tree and public API surface are preserved first.
Languages
8 tree-sitter (full AST) + 19 regex (structural extraction):
| Parser | Languages |
|---|---|
| tree-sitter | Rust, Python, TypeScript/TSX, JavaScript/JSX, Go, Java, C, C++ |
| regex | Shell, TOML, YAML, JSON, SQL, Markdown, Protobuf, GraphQL, Ruby, Kotlin, Swift, C#, Objective-C, XML, HTML, CSS, Gradle, CMake, Properties |
Detection is by file extension. Full details: docs/languages.md
Performance
Parallel parsing via rayon. Incremental caching via mtime + xxh3.
| Codebase | Files | Lines | Cold | Cached |
|---|---|---|---|---|
| Small (indxr) | 47 | 19K | 17ms | 5ms |
| Medium (atuin) | 132 | 22K | 20ms | 6ms |
| Large (cloud-hypervisor) | 243 | 124K | 73ms | ~10ms |
Documentation
| Document | Description |
|---|---|
| CLI Reference | Complete flag and option reference |
| Languages | Per-language extraction details |
| Output Formats | Format and detail level reference |
| Filtering | Path, kind, symbol, visibility filters |
| Dependency Graph | File and symbol dependency visualization |
| Git Diffing | Structural diff since any git ref |
| Token Budget | Truncation strategy and scoring |
| Caching | Cache format and invalidation |
| MCP Server | MCP tools, protocol, and client setup |
| Agent Integration | Usage with Claude, Codex, Cursor, Copilot, etc. |
Contributing
Contributions welcome — feel free to open an issue or submit a PR.