Quill

Local MCP server that indexes compiled Java and Kotlin projects with their DI wiring and git history

By Dmitrii Tikhomirov (individual) Java Developer toolsGit and code hosting

17 popularity score ★ 17

What it does

Quill is a native binary that speaks MCP over stdio. It reads the bytecode your Maven or Gradle build already produced, adds CDI and Spring wiring plus the git log, and stores the result in SQLite under .quill/ in the project. Agents then ask it about usages, call hierarchies, beans, endpoints, hotspots or the tests a change is likely to touch, instead of grepping through source.

Version 0.5.0 exposes 60 tools, and every one of them is read only. The default full profile lists 58 of them. The router profile hides the catalog behind a search tool and an execute tool, and execute_tool refuses anything not marked read only in code. Kotlin semantic analysis runs in a child JVM using K2 compiler workers for Kotlin 2.1.20 or 2.4.21. Setup is now quill init --probe-mcp, which writes the client config and then launches the server once to check it answers. When that fails, quill doctor explains what is missing. Workspace mode spans several local repositories, and find_workspace_usages now accepts an exact member symbol_id (a method, constructor or field) as well as a class.

Up to four calls run at once, with 64 more allowed to queue per worker. Each call times out after 30 seconds by default. Replies are capped at 256 KiB, a limit you can lower to no less than 4 KiB.

What it needs

RuntimeA prebuilt binaryJava 17+

The quill native executable, from Homebrew (macOS Apple Silicon/Intel, Linux ARM64/x86-64) or a release archive (also Windows x86-64); Linux builds are tested on Ubuntu 24.04 and older glibc may not work. The project must be a Maven or Gradle build compiled beforehand with your own JDK, then indexed once with `quill init`. Kotlin semantic analysis needs a Java 17+ runtime on JAVA_HOME or PATH. Building Quill from source needs JDK 21 to 25 (GraalVM for the native binary).

Limits

Works from compiled bytecode, not source: it never runs a build, so structural answers go stale after source or build-file edits until you recompile (the build integration then refreshes the index). Only Maven and Gradle JVM projects are supported; uncompiled repositories are skipped. Configuration values and resource contents are not indexed. Responses are capped at 256 KiB and each tool call times out after 30 seconds by default (QUILL_MCP_MAX_RESPONSE_BYTES, QUILL_MCP_REQUEST_TIMEOUT). Up to four calls run at once. Unused-code and API-compatibility results are candidates, not proof. Up to five index generations are retained.

Who it suits

Suits developers using Claude Code, Codex or another MCP client on large Java or Kotlin codebases built with Maven or Gradle, especially Spring or CDI applications where wiring and blast radius are hard to see from source text. It runs entirely on your machine and its tools only read. Its own docs say plain text search plus reading a file is cheaper for exact literals or known paths. Not a fit for projects you cannot compile locally, non-JVM languages, or other build systems such as Bazel or sbt.

Tools 60

60 only read. A ? marks an optional parameter.

get_overview
Summary of the indexed project, or a paged map of projects in workspace modedetails?: booleanproject?: stringview?: enumlimit?: integeroffset?: integer
search_tools
Router profile: search the hidden full catalog by name, purpose or argumentquery: stringlimit?: integer
execute_tool
Router profile: run one read-only catalog tool by name with JSON argumentsname: stringarguments: object
search_classes
Find classes by wildcard pattern, pagedpattern: stringmodule?: stringsource_set?: stringlimit?: integeroffset?: integerproject?: string
resolve_entities
Resolve up to 20 class names, file names or paths, including deleted onestargets: arrayproject?: string
get_project_dependencies
List resolved Maven/Gradle artifacts visible to main or test codemodule?: stringsource_set?: stringquery?: stringdirectness?: stringgroup?: stringartifact?: stringscope?: stringlimit?: integeroffset?: integerproject?: string
list_project_tree
Browse the indexed file inventory with module and source-set contextpath?: stringdepth?: integerinclude_deleted?: booleanlimit?: integeroffset?: integerproject?: string
search_files
Search the indexed file inventorypattern: stringmodule?: stringkind?: stringdirectory?: stringextension?: stringinclude_deleted?: booleanlimit?: integeroffset?: integerproject?: string
get_file_problems
Build diagnostics from the last captured build for given source filespaths: arrayseverity?: stringlimit?: integeroffset?: integerproject?: string
get_worktree_status
Current branch, HEAD, indexed commit and paged dirty filesstatus?: stringlimit?: integeroffset?: integerproject?: string
get_symbol_at_position
Resolve the identifier at a Java/Kotlin line and column to its declarationpath: stringline: integercolumn: integerproject?: string
search_external_symbols
Search declarations indexed from dependency JARspattern: stringkind?: stringclass_name?: stringlibrary?: stringmatch_mode?: stringinclude_occurrences?: booleanlimit?: integeroffset?: integerproject?: string
get_external_symbol_details
Inspect one declaration from a dependency JARclass_name: stringlimit?: integeroffset?: integerproject?: string
search_symbols
Search classes, methods, fields, constructors and Kotlin properties by name or signaturepattern: stringkind?: enumlanguage?: enumlimit?: integeroffset?: integerproject?: string
get_call_hierarchy
Callers and callees of a method, direct or to a bounded depthtarget: stringmethod?: stringsignature?: stringdirection?: enumtransitive?: booleanmax_depth?: integerscope?: enumlimit?: integeroffset?: integerproject?: string
trace_state_lifecycle
Link constructor and field access to persistence, dispatch and serialization pointstarget: stringevidence_limit?: integerproject?: string
analyze_execution_order
Order of calls inside one method, separating proven from likely ordertarget: stringmethod?: stringsignature?: stringbefore_terms?: stringafter_terms?: stringproject?: string
compare_design_impact
Rank existing classes as places to host a change by risk and dependentscandidates: arraytest_depth?: integerproject?: string
find_method_overrides
Find overriding declarations of a method or overloadtarget: stringmethod?: stringsignature?: stringtransitive?: booleanlimit?: integeroffset?: integerproject?: string
find_unused_classes
Conservative list of classes nothing appears to usemodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: string
find_unused_methods
Private methods with no indexed callersmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: string
find_unused_fields
Private fields with no indexed readsmodule?: stringinclude_generated?: booleaninclude_tests?: booleaninclude_write_only?: booleanlimit?: integeroffset?: integerproject?: string
find_entry_points
Main methods, REST endpoints, observers, schedulers, consumers and service providerskind?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: string
get_module_graph
Dependencies between Maven/Gradle modules of the projectmodule?: stringdirection?: stringdepth?: integerlimit?: integeroffset?: integerproject?: string
find_architecture_violations
Check package or module boundaries against compiled dependenciesscope?: stringfrom: stringforbidden: arraykinds?: stringlimit?: integeroffset?: integerproject?: string
get_package_graph
Coupling between packages, aggregated from class dependenciespackage_name?: stringdirection?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: string
find_cycles
Dependency cycles between classes or modulesscope?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: string
compare_index
Differences between the current index and an earlier retained one, with an API reviewbaseline?: stringlimit?: integerproject?: string
get_build_status
Build integration state, index freshness and the next action neededproject?: string
get_build_problems
Errors captured from the last Maven or Gradle buildseverity?: stringmodule?: stringlimit?: integeroffset?: integerproject?: string
get_annotated_classes
Classes carrying a given annotation, directly or through meta-annotationsannotation: stringinclude_meta_annotations?: booleanlimit?: integeroffset?: integerproject?: string
find_annotated_symbols
Types, methods, fields, constructors and parameters carrying an annotationannotation: stringkind?: stringinclude_meta_annotations?: booleanlimit?: integeroffset?: integerproject?: string
find_framework_endpoints
Spring MVC and JAX-RS routes with HTTP methods and pathsframework?: stringhttp_method?: stringpath_prefix?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: string
find_configuration_references
Properties, YAML and persistence units and the code that reads them, without valueskey?: stringclass_name?: stringkind?: stringmodule?: stringlimit?: integeroffset?: integerproject?: string
find_resource_references
Classpath resources and the code that loads thempath: stringclass_name?: stringmodule?: stringlimit?: integeroffset?: integerproject?: string
inspect_service_descriptors
META-INF/services providers in order, with warningsservice?: stringproject?: string
find_implementations
Subclasses and implementors, direct or transitivetarget: stringtransitive?: booleanlimit?: integeroffset?: integerproject?: string
find_usages
Every indexed use of a class: calls, fields, types, injection, inheritancetarget: stringusage_kind?: stringmodule?: stringlimit?: integeroffset?: integerproject?: string
find_symbol_usages
Uses of one method, constructor, field or Kotlin propertytarget: stringname?: stringkind?: enumsignature?: stringaccess?: enumlimit?: integeroffset?: integerproject?: string
get_symbol_details
Hierarchy, annotations, members, DI context and metrics for one classtarget: stringinclude_members?: booleanmember_kind?: stringmember_limit?: integermember_offset?: integerproject?: string
get_context
Compact change card for up to ten classestargets: arrayinclude_members?: booleanlimit?: integerproject?: string
plan_change
Ordered plan for an intended change: files, tests to run, risktargets: arraychange: stringlimit?: integerproject?: string
verify_change
Readiness check from worktree, build diagnostics and affected tests; runs nothingtargets?: arraylimit?: integerproject?: string
change_session
Stateless snapshot of a change in progress with next actionstargets?: arraychange: stringdetail?: stringview?: stringlimit?: integerproject?: string
find_impacted_tests
Rank tests likely affected by changed classestargets: arraytransitive?: booleanmax_depth?: integerlimit?: integeroffset?: integerproject?: string
get_type_hierarchy
Ancestor and descendant paths of a type, pagedtarget: stringdirection?: stringmax_depth?: integerlimit?: integeroffset?: integerproject?: string
get_dependencies
Dependency metrics and graph for a class or filetarget: stringdirection?: stringdepth?: integerinclude_nodes?: booleanlimit?: integeroffset?: integercursor?: stringproject?: string
assess_change_risk
Risk of changing a class or file from coupling, churn and bus factortarget: stringproject?: string
list_beans
Filter CDI and Spring beans by scope, kind or qualifierclass_name?: stringscope?: stringkind?: stringprofile?: stringqualifier?: stringmodule?: stringsource_set?: stringorigin?: stringlimit?: integeroffset?: integerproject?: string
list_injection_points
How each injection point of a bean resolvestarget: stringproject?: string
find_git_hotspots
Most-changed files plus uncommitted changeslimit?: integersince?: stringinclude_historical?: booleanoffset?: integerproject?: string
get_file_history
Paged commit history of a class or filetarget: stringlimit?: integeroffset?: integerproject?: string
find_co_changed_files
Files that tend to change in the same commitstarget: stringlimit?: integerproject?: string
get_recent_changes
Recent commits and the files and classes they touchedcommits?: integerfile_limit?: integerfile_offset?: integerdetails?: booleanproject?: string
list_external_dependencies
Third-party libraries and how the code uses themtarget?: stringlibrary?: stringlimit?: integerproject?: string
list_workspace_repositories
Workspace mode: repositories found and whether they are indexedinclude_modules?: booleanlimit?: integeroffset?: integer
get_workspace_dependencies
Workspace mode: map declared dependencies to other local repositoriesrepository?: stringdirection?: stringcross_repository_only?: booleanlimit?: integeroffset?: integer
resolve_workspace_entity
Workspace mode: find a class across repositoriestarget: string
find_workspace_usages
Workspace mode: uses of a class, or of an exact method, constructor or field symbol_id, in other repositoriestarget: stringprovider_repository?: stringusage_kind?: stringlimit?: integerconsumer_limit?: integerconsumer_offset?: integeroffset?: integer
assess_workspace_change_risk
Workspace mode: change impact across repositoriestarget: stringprovider_repository?: stringmax_depth?: integer

Similar servers