Java AST-level code indexer with SQLite storage, exposed as an MCP server for AI coding assistants.
中文 | English
AI coding assistants exploring an unfamiliar Java project today:
| Task | Without Java Code Indexer | With Java Code Indexer |
|---|---|---|
Find where UserService is defined |
grep across 100+ files (~15k tokens) |
find_symbol("UserService") (~200 tokens) |
Understand all callers of saveOrder() |
Read files one by one (~8k tokens) | get_call_graph("saveOrder", "callers") (~500 tokens) |
| Find a config value in YAML/properties | find + cat multiple config files (~5k tokens) |
search_config("spring.datasource.url") (~200 tokens) |
| Locate all dependencies | Open pom.xml + transitive (~3k tokens) | find_dependencies("spring-boot-starter") (~300 tokens) |
Requires Java 21+ (JRE or JDK). Docker and Native Image options bundle the runtime.
Option 1: Download JAR (recommended)
# Download from GitHub Releases
curl -LO https://github.com/sodlinken/java-code-indexer/releases/latest/download/java-code-indexer-latest.jarOption 2: Build from source (requires Java 21+ and Maven 3.8+)
git clone https://github.com/sodlinken/java-code-indexer.git
cd java-code-indexer
mvn package -q -DskipTests
# output: target/java-code-indexer-*-shaded.jarOption 3: Native Image (GraalVM)
native-image -jar target/java-code-indexer-*-shaded.jar \
-o jindexer --no-fallbackOption 4: Docker
docker pull ghcr.io/sodlinken/java-code-indexer:latest# 1. Index your Java project
java -jar jindexer.jar --project-root /path/to/your/java-project --index
# 2. Start the MCP server (stdio, for Claude Code / Qwen Code / Cursor)
java -jar jindexer.jar --project-root /path/to/your/java-projectThat's it. Your AI assistant can now query your codebase structure instead of reading files.
java -jar jindexer.jar [options]
Options:
--project-root <path> Java project root directory (default: current dir)
--data-dir <path> Index data directory (default: .jindexer)
--init Initialize database schema only
--index Run indexer (extract symbols/references/calls)
--help, -h Show help
No flags → start MCP server over stdio.
When running as an MCP server, Java Code Indexer exposes these tools:
| Tool | Description |
|---|---|
find_symbol |
Find symbols (class/method/field) by name, * wildcard supported |
find_references |
Find all reference locations for a symbol |
get_call_graph |
Method call graph — callers, callees, or both |
search_code |
Search symbol names and code content |
get_file_info |
File details: symbols, code chunks, call relationships |
search_config |
Search config files (YAML / Properties / .env) |
find_dependencies |
Search project dependencies (Maven / Gradle) |
semantic_search |
Semantic search (requires Embedding config, not yet active) |
list_projects |
List indexed projects (multi-project mode only) |
Create .jindexer/config.yaml in your project root (optional):
project_root: /path/to/project
data_dir: .jindexer
threads: 4
embedding:
enabled: false| Variable | Description | Default |
|---|---|---|
INDEXER_EMBEDDING_ENABLED |
Enable embedding API | false |
INDEXER_EMBEDDING_BASE_URL |
Embedding API endpoint | — |
INDEXER_EMBEDDING_MODEL |
Embedding model name | — |
INDEXER_THREADS |
Indexing thread count | 4 |
INDEXER_LOG_LEVEL |
Log level | INFO |
Priority: CLI flags → environment variables → config file → defaults.
Add to your MCP configuration:
{
"mcpServers": {
"java-code-indexer": {
"command": "/path/to/jdk-21/bin/java",
"args": ["-jar", "/path/to/jindexer.jar", "--project-root", "/path/to/project"]
}
}
}Note:
commandmust point to a Java 21+ runtime. IfJAVA_HOMEis set to JDK 21, you can use"${JAVA_HOME}/bin/java"instead.
┌──────────────┐ MCP (stdio) ┌──────────────────────┐
│ AI Assistant │ ◄─────────────────► │ Java Code Indexer │
│ (Qwen/Claude)│ JSON-RPC │ │
└──────────────┘ │ ┌────────────────┐ │
│ │ JavaParser AST │ │
│ └───────┬────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ SQLite (WAL) │ │
│ │ symbols │ │
│ │ references │ │
│ │ call_graphs │ │
│ │ configs │ │
│ │ dependencies │ │
│ └────────────────┘ │
└──────────────────────┘
- Walk Java source files via filesystem traversal
- SHA-1 content hash skips unchanged files (incremental)
- JavaParser AST extracts symbols, references, and call relationships
- POM/Gradle parsers extract dependency information
- Config parsers extract YAML/Properties/.env entries
- All data upserted into embedded SQLite (WAL mode)
Five core tables:
symbols— classes, methods, fields with location and signaturesreferences— symbol usage locations across the codebasecalls— method call relationships (caller → callee)chunks— code slices at class/method granularityfile_hashes— SHA-1 hashes for incremental indexing
src/main/java/com/sodlinken/jindexer/
├── cli/ # CLI entry point
├── mcp/ # MCP server (JSON-RPC over stdio)
├── config/ # YAML config loader
├── storage/ # SQLite schema & StorageService
├── indexer/ # Incremental indexing engine
├── parser/ # Java, POM, Gradle, Config parsers
├── chunker/ # Code chunking (class/method slices)
├── search/ # Structured search provider
├── model/ # Data models (Symbol, Call, Chunk, etc.)
└── util/ # SHA-1 hashing utility
产物输出到 release/<version>/ 目录。
# 构建 Fat JAR + Native Image
./script/release.sh
# 指定版本号
./script/release.sh -v 1.0.0
# 跳过 Native Image
./script/release.sh -v 1.0.0 --skip-native构建产物位于 release/<version>/java-code-indexer-<version>.jar,需 Java 21+。
java -jar release/1.0.0/java-code-indexer-1.0.0.jar --project-root /path/to/project构建产物位于 release/<version>/jindexer,无需 JVM,启动即时。
./release/1.0.0/jindexer --project-root /path/to/project --index# 本地构建并运行
docker build -t java-code-indexer .
docker run --rm -v /path/to/project:/project java-code-indexer --project-root /project --index
# 推送到私有 registry
DOCKER_REGISTRY=your-registry.com ./script/release.sh --push-docker# Clone and build
git clone https://github.com/sodlinken/java-code-indexer.git
cd java-code-indexer
mvn package -q -DskipTests
# Index this project itself
java -jar target/java-code-indexer-*-shaded.jar \
--project-root . --index
# Start MCP server
java -jar target/java-code-indexer-*-shaded.jar --project-root .See CONTRIBUTING.md.
- Not a code execution sandbox
- Not a test runner or linter
- Not a replacement for LSP/IDE features
- Not AI-generated summaries (symbol extraction is deterministic)