WebCodex
Self-hosted runtime that gives remote AI clients coding tools on repositories kept on your own machines
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
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.
| Runtime | A 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).
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.
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.
60 only read. A ? marks an optional parameter.
get_overviewdetails?: booleanproject?: stringview?: enumlimit?: integeroffset?: integersearch_toolsquery: stringlimit?: integerexecute_toolname: stringarguments: objectsearch_classespattern: stringmodule?: stringsource_set?: stringlimit?: integeroffset?: integerproject?: stringresolve_entitiestargets: arrayproject?: stringget_project_dependenciesmodule?: stringsource_set?: stringquery?: stringdirectness?: stringgroup?: stringartifact?: stringscope?: stringlimit?: integeroffset?: integerproject?: stringlist_project_treepath?: stringdepth?: integerinclude_deleted?: booleanlimit?: integeroffset?: integerproject?: stringsearch_filespattern: stringmodule?: stringkind?: stringdirectory?: stringextension?: stringinclude_deleted?: booleanlimit?: integeroffset?: integerproject?: stringget_file_problemspaths: arrayseverity?: stringlimit?: integeroffset?: integerproject?: stringget_worktree_statusstatus?: stringlimit?: integeroffset?: integerproject?: stringget_symbol_at_positionpath: stringline: integercolumn: integerproject?: stringsearch_external_symbolspattern: stringkind?: stringclass_name?: stringlibrary?: stringmatch_mode?: stringinclude_occurrences?: booleanlimit?: integeroffset?: integerproject?: stringget_external_symbol_detailsclass_name: stringlimit?: integeroffset?: integerproject?: stringsearch_symbolspattern: stringkind?: enumlanguage?: enumlimit?: integeroffset?: integerproject?: stringget_call_hierarchytarget: stringmethod?: stringsignature?: stringdirection?: enumtransitive?: booleanmax_depth?: integerscope?: enumlimit?: integeroffset?: integerproject?: stringtrace_state_lifecycletarget: stringevidence_limit?: integerproject?: stringanalyze_execution_ordertarget: stringmethod?: stringsignature?: stringbefore_terms?: stringafter_terms?: stringproject?: stringcompare_design_impactcandidates: arraytest_depth?: integerproject?: stringfind_method_overridestarget: stringmethod?: stringsignature?: stringtransitive?: booleanlimit?: integeroffset?: integerproject?: stringfind_unused_classesmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: stringfind_unused_methodsmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: stringfind_unused_fieldsmodule?: stringinclude_generated?: booleaninclude_tests?: booleaninclude_write_only?: booleanlimit?: integeroffset?: integerproject?: stringfind_entry_pointskind?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: stringget_module_graphmodule?: stringdirection?: stringdepth?: integerlimit?: integeroffset?: integerproject?: stringfind_architecture_violationsscope?: stringfrom: stringforbidden: arraykinds?: stringlimit?: integeroffset?: integerproject?: stringget_package_graphpackage_name?: stringdirection?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: stringfind_cyclesscope?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: stringcompare_indexbaseline?: stringlimit?: integerproject?: stringget_build_statusproject?: stringget_build_problemsseverity?: stringmodule?: stringlimit?: integeroffset?: integerproject?: stringget_annotated_classesannotation: stringinclude_meta_annotations?: booleanlimit?: integeroffset?: integerproject?: stringfind_annotated_symbolsannotation: stringkind?: stringinclude_meta_annotations?: booleanlimit?: integeroffset?: integerproject?: stringfind_framework_endpointsframework?: stringhttp_method?: stringpath_prefix?: stringmodule?: stringinclude_generated?: booleaninclude_tests?: booleanlimit?: integeroffset?: integerproject?: stringfind_configuration_referenceskey?: stringclass_name?: stringkind?: stringmodule?: stringlimit?: integeroffset?: integerproject?: stringfind_resource_referencespath: stringclass_name?: stringmodule?: stringlimit?: integeroffset?: integerproject?: stringinspect_service_descriptorsservice?: stringproject?: stringfind_implementationstarget: stringtransitive?: booleanlimit?: integeroffset?: integerproject?: stringfind_usagestarget: stringusage_kind?: stringmodule?: stringlimit?: integeroffset?: integerproject?: stringfind_symbol_usagestarget: stringname?: stringkind?: enumsignature?: stringaccess?: enumlimit?: integeroffset?: integerproject?: stringget_symbol_detailstarget: stringinclude_members?: booleanmember_kind?: stringmember_limit?: integermember_offset?: integerproject?: stringget_contexttargets: arrayinclude_members?: booleanlimit?: integerproject?: stringplan_changetargets: arraychange: stringlimit?: integerproject?: stringverify_changetargets?: arraylimit?: integerproject?: stringchange_sessiontargets?: arraychange: stringdetail?: stringview?: stringlimit?: integerproject?: stringfind_impacted_teststargets: arraytransitive?: booleanmax_depth?: integerlimit?: integeroffset?: integerproject?: stringget_type_hierarchytarget: stringdirection?: stringmax_depth?: integerlimit?: integeroffset?: integerproject?: stringget_dependenciestarget: stringdirection?: stringdepth?: integerinclude_nodes?: booleanlimit?: integeroffset?: integercursor?: stringproject?: stringassess_change_risktarget: stringproject?: stringlist_beansclass_name?: stringscope?: stringkind?: stringprofile?: stringqualifier?: stringmodule?: stringsource_set?: stringorigin?: stringlimit?: integeroffset?: integerproject?: stringlist_injection_pointstarget: stringproject?: stringfind_git_hotspotslimit?: integersince?: stringinclude_historical?: booleanoffset?: integerproject?: stringget_file_historytarget: stringlimit?: integeroffset?: integerproject?: stringfind_co_changed_filestarget: stringlimit?: integerproject?: stringget_recent_changescommits?: integerfile_limit?: integerfile_offset?: integerdetails?: booleanproject?: stringlist_external_dependenciestarget?: stringlibrary?: stringlimit?: integerproject?: stringlist_workspace_repositoriesinclude_modules?: booleanlimit?: integeroffset?: integerget_workspace_dependenciesrepository?: stringdirection?: stringcross_repository_only?: booleanlimit?: integeroffset?: integerresolve_workspace_entitytarget: stringfind_workspace_usagestarget: stringprovider_repository?: stringusage_kind?: stringlimit?: integerconsumer_limit?: integerconsumer_offset?: integeroffset?: integerassess_workspace_change_risktarget: stringprovider_repository?: stringmax_depth?: integer