Java AST-level code indexer with SQLite storage, exposed as an MCP server for AI coding assistants.
1.8K
JVM AST-level code indexer (Java/Kotlin/Scala) with SQLite storage, exposed as an MCP server for AI coding assistants.
中文 | English
AI coding assistants exploring unfamiliar JVM projects 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) |
Find all @RestController classes | Search through entire codebase (~8k tokens) | find_by_annotation("RestController") (~200 tokens) |
| Understand interface implementations | Read multiple files (~5k tokens) | find_implementations("UserService") (~300 tokens) |
Find which controller handles /api/users/{id} | Search through all controllers (~5k tokens) | find_route("GET", "/api/users/123") (~200 tokens) |
| Understand Bean injection relationships | Read multiple @Autowired fields (~3k tokens) | get_bean_dependencies("OrderService") (~300 tokens) |
| Find related test classes | Search test directories (~2k tokens) | find_related_tests("UserService") (~200 tokens) |
| Language | Status | Parser |
|---|---|---|
| Java | ✅ Full support | JavaParser AST |
| Kotlin | ✅ Full support | KotlinParserAdapter (regex) |
| Scala | ✅ Full support | ScalaParserAdapter (regex) |
Supports 30+ annotations across major frameworks:
| Framework | Annotations |
|---|---|
| Spring Boot | @RestController, @Service, @Repository, @Component |
| Spring MVC | @RequestMapping, @GetMapping, @PostMapping, @DeleteMapping |
| JPA | @Entity, @Table, @Column, @Id, @GeneratedValue |
| Lombok | @Data, @Builder, @Getter, @Setter, @NoArgsConstructor |
| Validation | @NotNull, @Size, @Min, @Max, @Email |
| MyBatis | @Mapper, @Select, @Insert, @Update, @Delete |
| Swagger | @Api, @ApiOperation, @ApiParam |
| Security | @EnableWebSecurity, @PreAuthorize, @Secured |
| Cache | @EnableCaching, @Cacheable, @CacheEvict, @CachePut |
| Async | @EnableAsync, @Async |
| Scheduling | @EnableScheduling, @Scheduled |
| Feature | Description |
|---|---|
| API Route Mapping | Automatically extract @RequestMapping/@GetMapping etc., build URL → Controller method mapping |
| Type Hierarchy | Query complete class inheritance chains (parent/child relationships) |
| Bean Dependencies | Extract @Autowired/@Inject injection relationships |
| Test Coverage Mapping | Auto-associate test classes with source classes (e.g., UserServiceTest → UserService) |
Requires Java 21+ (JRE or JDK). Docker and Native Image options bundle the runtime.
Option 1: Download from GitHub Releases (recommended)
# Fat JAR (all platforms)
curl -LO https://github.com/Lincoln-cn/JCodeIndexer/releases/latest/download/java-code-indexer-1.5.1.jar
# Native Image (Linux)
curl -LO https://github.com/Lincoln-cn/JCodeIndexer/releases/latest/download/java-code-indexer-1.5.1-linux-amd64.tar.gz
# Native Image (macOS)
curl -LO https://github.com/Lincoln-cn/JCodeIndexer/releases/latest/download/java-code-indexer-1.5.1-darwin-arm64.tar.gz
# Native Image (Windows)
curl -LO https://github.com/Lincoln-cn/JCodeIndexer/releases/latest/download/java-code-indexer-1.5.1-windows-amd64.zip
Option 2: Build from source (requires Java 21+ and Maven 3.8+)
git clone https://github.com/Lincoln-cn/JCodeIndexer.git
cd JCodeIndexer
mvn package -q -DskipTests
# output: target/java-code-indexer-*-shaded.jar
Option 3: Docker
docker pull sodlinken/jcodeindexer:latest
# 1. Index your JVM project (Java/Kotlin/Scala)
java -jar java-code-indexer-1.5.1.jar --project-root /path/to/your/project --index
# 2. Start the MCP server (stdio, for Claude Code / Qwen Code / Cursor)
java -jar java-code-indexer-1.5.1.jar --project-root /path/to/your/project
That's it. Your AI assistant can now query your codebase structure instead of reading files.
java -jar java-code-indexer-VERSION.jar [options]
Options:
--project-root <path> JVM 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)
--status Show index statistics
--search <query> Search directly (no MCP server needed)
--export <file> Export index data to JSON file
--version Show version number
--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 (FTS5 full-text) |
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) |
health | Server health check with status and statistics |
list_projects | List indexed projects (multi-project mode only) |
search_all_projects | Search across all projects (multi-project mode) |
find_implementations | Find all classes implementing an interface |
find_overrides | Find all method overrides in subclasses |
find_usages | Find all usages of a field/variable |
find_annotations | Find all annotations on a symbol |
find_by_annotation | Find symbols with a specific annotation |
find_api_routes | Find API route mappings (URL → Controller method) |
find_route | Find Controller method by HTTP method + URL path |
get_type_hierarchy | Get complete class inheritance hierarchy |
get_bean_dependencies | Find Bean's dependencies (what it depends on) |
get_bean_dependents | Find Beans that depend on this Bean |
find_related_tests | Find test classes related to source code |
reindex | Manually trigger incremental re-indexing |
index_status | View index status and watcher state |
search_symbols | Enhanced symbol search with kind/annotation filters |
get_code_metrics | Get code metrics (lines, methods, complexity) |
Create .jindexer/config.yaml in your project root (optional):
# Data directory
data_dir: .jindexer
# Indexing settings
indexing:
threads: 4 # Indexing thread count
extract_javadoc: false # Extract Javadoc comments
follow_symlinks: false # Follow symbolic links
max_file_size_kb: 512 # Max file size (KB)
# Storage
storage:
db_name: index.db # Database file name
# Logging
log:
level: INFO # Log level (DEBUG/INFO/WARN/ERROR)
verbose: false # Verbose output
# File watching (auto-reindex on file changes)
watch:
enabled: true # Enable background file watcher
interval: 5 # Check interval (seconds)
exclude: # Directories to exclude
- "**/target/**"
- "**/build/**"
- "**/node_modules/**"
- "**/.git/**"
# Multi-project mode
projects:
- name: backend
root: /path/to/backend
- name: frontend
root: /path/to/frontend
| Variable | Description | Default |
|---|---|---|
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": "java",
"args": ["-jar", "/path/to/java-code-indexer-1.5.1.jar", "--project-root", "/path/to/project"]
}
}
}
{
"mcpServers": {
"java-code-indexer": {
"command": "docker",
"args": ["run", "--rm", "-i", "-v", "/path/to/project:/project", "sodlinken/jcodeindexer:latest", "--project-root", "/project"]
}
}
}
┌──────────────┐ MCP (stdio) ┌──────────────────────┐
│ AI Assistant │ ◄─────────────────► │ Java Code Indexer │
│ (Qwen/Claude)│ JSON-RPC │ │
└──────────────┘ │ ┌────────────────┐ │
│ │ Parsers: │ │
│ │ JavaParser │ │
│ │ KotlinParser │ │
│ │ ScalaParser │ │
│ └───────┬────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ SQLite (WAL) │ │
│ │ symbols │ │
│ │ references │ │
│ │ call_graphs │ │
│ │ annotations │ │
│ │ configs │ │
│ │ dependencies │ │
│ └────────────────┘ │
└──────────────────────┘
Eleven core tables:
symbols — classes, methods, fields with location and signaturesreferences — symbol usage locations across the codebasecalls — method call relationships (caller → callee)annotations — symbol annotations with attributeschunks — code slices at class/method granularityfile_meta — SHA-1 hashes for incremental indexingconfig_entries — YAML/Properties/.env key-value pairsdependencies — Maven/Gradle dependency declarationsapi_routes — Spring Boot API route mappings (URL → Controller)bean_dependencies — Spring Bean injection relationshipstest_mappings — Test class to source class associationsPlus FTS5 full-text search tables (symbols_fts, chunks_fts) with auto-sync triggers.
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 (including FTS5)
├── indexer/ # Incremental indexing engine
├── parser/ # Java, Kotlin, Scala, POM, Gradle, Config parsers
├── chunker/ # Code chunking (class/method slices)
├── search/ # Structured search (FTS5 full-text)
├── model/ # Data models (Symbol, Call, Chunk, Annotation, etc.)
└── util/ # SHA-1 hashing utility
Release workflow is automated via GitHub Actions:
| Artifact | Description |
|---|---|
java-code-indexer-VERSION.jar | Fat JAR, requires Java 21+ |
java-code-indexer-VERSION-linux-amd64.tar.gz | Linux amd64 Native Image |
java-code-indexer-VERSION-darwin-arm64.tar.gz | macOS arm64 Native Image |
java-code-indexer-VERSION-windows-amd64.zip | Windows amd64 Native Image |
docker-image-VERSION.tar.gz | Docker offline image |
checksums-VERSION.sha256 | SHA-256 checksums |
# Clone and build
git clone https://github.com/Lincoln-cn/JCodeIndexer.git
cd JCodeIndexer
mvn package -q -DskipTests
# Run tests
mvn test
# 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 .
GitHub Actions automated release process:
v* tag or manual trigger# Create release tag
git tag v1.5.1
git push origin v1.5.1
# Run all tests (384+ tests)
mvn test
# Run specific test class
mvn test -Dtest=JavaParserAdapterTest
# Run performance benchmarks
mvn test -Dtest=PerformanceBenchmarkTest
Content type
Image
Digest
sha256:ccb9264e9…
Size
93.8 MB
Last updated
29 days ago
docker pull sodlinken/jcodeindexer