코드베이스를 SQLite 속성 그래프로 인덱싱하여 LLM이 정적 및 동적 호출 추적과 심볼 검색을 수행할 수 있도록 합니다.
다른 이름 nithin554/code-crawler, code-crawler, @nithin554/code-crawler
- 스타
- 0
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- 0.1.90
- 마지막 커밋
- 2026년 11월 13일
- 라이선스
- MIT
Code Crawler MCP란?
Code Crawler은(는) MCP server입니다. 코드베이스를 SQLite 속성 그래프로 인덱싱하여 LLM이 정적 및 동적 호출 추적과 심볼 검색을 수행할 수 있도록 합니다.
프로젝트 README에서 생성된 요약
Code Crawler MCP server 정보
Code Crawler는 복잡한 코드베이스를 검색 가능한 속성 그래프로 인덱싱하여 LLM 클라이언트를 사용하는 개발자에게 강력한 기능을 제공합니다. 소스 코드를 SQLite 기반 그래프로 변환함으로써, AI 에이전트가 Java, Python, TypeScript, JavaScript 프로젝트 전반에 걸쳐 심층적인 정적 및 동적 분석을 수행할 수 있습니다. 이 MCP server는 클래스와 메서드부터 의존성 주입(Dependency Injection)이나 HTTP 라우팅과 같은 복잡한 프레임워크 연결까지 모든 요소를 매핑합니다.
사용자는 trace_path, get_callers, search_symbols와 같은 특화된 MCP 도구를 통해 코드베이스와 상호작용합니다. 가상 디스패치(Virtual Dispatch)와 관점 지향 프로그래밍(AOP)을 이해하므로, 단순한 텍스트 검색으로는 놓치기 쉬운 실행 경로를 추적할 수 있습니다. 시스템은 로컬 사용을 위해 설계되었으며, 데이터 충돌을 방지하기 위해 각 프로젝트 디렉토리 내에 전용 데이터베이스를 생성합니다. 또한 증분 인덱싱을 지원하여 실제로 변경된 파일만 다시 파싱하므로, 대규모 다중 언어 저장소에서도 효율적으로 작동합니다.
활용 사례
- 1전이적 함수 호출 추적특정 리포지토리 메서드를 최종적으로 호출하는 모든 함수를 AI에게 찾아달라고 요청합니다.
- 2프레임워크 의존성 주입 분석@Autowired 또는 FastAPI Depends와 같은 어노테이션을 통해 서로 다른 컴포넌트가 어떻게 연결되어 있는지 식별합니다.
- 3영향도 분석 수행코드 변경 사항의 연결 관계를 추적하여 잠재적인 영향 범위를 결정합니다.
- 4데드 코드 식별그래프 분석을 사용하여 대규모 프로젝트 내에서 사용되지 않는 심볼이나 메서드를 찾아냅니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
Code Crawler MCP 설치 방법
형식 확인: 2026년 11월 10일Claude Code에 Code Crawler MCP 설치
$ claude mcp add code-crawler -- npx -y @nithin554/code-crawlerCursor에 Code Crawler MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"code-crawler": {
"command": "npx",
"args": [
"-y",
"@nithin554/code-crawler"
]
}
}
}VS Code에 Code Crawler MCP 설치
.vscode/mcp.json
{
"servers": {
"code-crawler": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@nithin554/code-crawler"
]
}
}
}Claude Desktop에 Code Crawler MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"code-crawler": {
"command": "npx",
"args": [
"-y",
"@nithin554/code-crawler"
]
}
}
}Codex에 Code Crawler MCP 설치
~/.codex/config.toml
[mcp_servers.code-crawler] command = "npx" args = ["-y", "@nithin554/code-crawler"]
Gemini CLI에 Code Crawler MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"code-crawler": {
"command": "npx",
"args": [
"-y",
"@nithin554/code-crawler"
]
}
}
}구성
CODECRAWLER_BENCHCODECRAWLER_BENCH_LINESCODECRAWLER_DBPath to the SQLite graph database (default ~/.code-crawler/index.db)
CODECRAWLER_DEFAULT_LIMITDefault result cap for list queries (default 50)
CODECRAWLER_EXCLUDE_DIRSComma-separated directories to skip during crawl
CODECRAWLER_HELPFUL_ERRORSFuzzy suggestions on unknown symbols (default true)
CODECRAWLER_MAX_DEPTHTraversal depth cap (default 10)
| 이름 | 설명 | 유형 |
|---|---|---|
| CODECRAWLER_BENCH | — | |
| CODECRAWLER_BENCH_LINES | — | |
| CODECRAWLER_DB | Path to the SQLite graph database (default ~/.code-crawler/index.db) | |
| CODECRAWLER_DEFAULT_LIMIT | Default result cap for list queries (default 50) | |
| CODECRAWLER_EXCLUDE_DIRS | Comma-separated directories to skip during crawl | |
| CODECRAWLER_HELPFUL_ERRORS | Fuzzy suggestions on unknown symbols (default true) | |
| CODECRAWLER_MAX_DEPTH | Traversal depth cap (default 10) |
자동 검사
2026년 11월 14일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능nithin554/code-crawler is public and reachablegithub.com/nithin554/code-crawler ↗통과
- 패키지가 이 저장소를 소스로 지정@nithin554/code-crawler names nithin554/code-crawler as sourcenpmjs.com/package/@nithin554/code-crawler ↗통과
- 빌드 출처(Sigstore 증명)Sigstore attestation for @nithin554/code-crawlernpmjs.com/package/@nithin554/code-crawler/v/0.1.90#provenanc ↗통과
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-11github.com/nithin554/code-crawler ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음No popular package one edit away from @nithin554/code-crawler통과
- 패키지와 의존성에 심각한 보안 권고 없음the package checked; no critical advisoryosv.dev ↗통과
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 endpoint가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기Code-Crawler
Static + dynamic call tracing MCP server backed by a persistent property graph of your codebase.
Code-Crawler indexes a project into a SQLite-backed property graph — files, packages, modules, classes, interfaces, methods, fields, imports, annotations/decorators, call edges, virtual dispatch, aspect advice, and the wiring frameworks add (entry points, routes, injected dependencies, reflective lookups) — then exposes that graph to LLM clients as MCP tools: find callers, trace call paths, explore neighborhoods, follow runtime dispatch, and search symbols across the whole codebase.
Supports Java, Python, TypeScript, and JavaScript projects, and can index all of them into the same graph.
📖 Documentation site: https://nithin554.github.io/code-crawler/
📘 Task-oriented guide: USAGE.md
🗺️ Roadmap: ROADMAP.md
┌─────────────────────── MCP (stdio) ───────────────────────┐
│ crawl_project search_symbols get_callers get_callees │
│ trace_path trace_execution find_aspects get_decorators│
│ find_implementations find_hotspots find_dead_code ... │
└───────────────┬──────────────────────────────┬───────────────┘
│ │
┌──────▼───────┐ ┌────────▼────────┐
│ crawler │ │ graph queries │
│ parse+resolve│ │ recursive CTEs │
└──────┬───────┘ └────────┬────────┘
│ │
┌──────▼──────────────────────────────▼──────┐
│ SQLite property graph (WAL) │
│ nodes (kind, fqn, props) + edges (kind) │
└─────────────────────────────────────────────┘
Why a graph?
Plain-text grep can't answer questions like:
- "Who transitively calls
OrderRepository#create?" - "Is there a static path from
Main#maintoTracking#dispatch?" - "What is the impact radius of changing
OrderService#place?"
These need graph traversal. Code-Crawler builds the graph once (idempotently, file-by-file) and answers them with bounded recursive SQL queries.
Features
- Four languages, one graph: Java (
tree-sitter-java), Python (tree-sitter-python), TypeScript (tree-sitter-typescript,tree-sitter-tsx), and JavaScript (tree-sitter-javascript) — all WASM, no native build step. Language is detected per file, so a polyglot repo lands in a single graph. - Dynamic tracing on a static graph —
DYNAMIC_DISPATCHedges connect interface/base calls to every override in the project, andADVISESedges weave AspectJ/Spring AOP advice into execution traces (before,after,around,after-returning,after-throwing, named@Pointcutreferences,&&/||/!andexecution,within,@annotation,@within,target,this,argsprimitives). - Run-time indirection is named, not lost — Java reflection/
ServiceLoader, Pythongetattr/importlib, and JSrequire/dynamicimport()produceREFLECTSedges to the resolved symbol when the target is statically determinable, or to a__reflect__:marker when it is not. - Framework wiring — dependency injection (
@Autowired, NestJS constructor injection, FastAPIDepends) becomesINJECTSedges, and HTTP routes (@GetMapping,@RequestMapping, NestJS@Controller/@Get, FastAPI/Flask/Quart decorators, Expressapp.get) becomeROUTESedges to the handler, which is also marked as an entry point. - Control flow on call edges — every
CALLSedge records whether the call is conditional and the compact source text of its enclosing guards/loops, so an agent can tell a happy path from an error path without reading the file. - External dependencies are explicit — third-party imports and runtime globals
become package-level
external_symbolnodes withREFERENCESedges and afind_external_dependenciessummary, distinct from project code. - Annotations as first-class nodes —
@Transactional,@Cacheable,@Async,@Retryable, Python decorators, and TS decorators becomeannotationnodes withANNOTATED_WITHedges, so you can query decorators on types, methods, and fields. - Call resolution heuristics that go beyond naive string matching:
receiver types inferred from locals, parameters, fields,
new T()expressions,self/thisscoping, dotted paths (service.repo.find), loop-variable element types, bare/this/supercalls, static/qualified calls, and superclass chains. Unresolvable calls becomeunknown_symbolphantom nodes withresolved:falseedges, so the graph stays traversable. - Incremental, file-scoped indexing — each crawl records a per-file manifest
(
size, mtime, SHA-256) and replays the cached parse result for files whose content is unchanged, so a re-crawl re-parses only what actually changed. Changes are reported asfilesAdded/filesUpdated/filesUnchanged/filesRemoved. Derived dynamic edges and orphan pruning are rebuilt only when something changed. A full re-crawl still removes files that disappeared, without duplicating the graph, and scoped crawls (fileFilteror a forcedlanguage) never remove files outside their scope. When a checkout,rsync -t, an mtime-preserving unzip, or clock skew restores an edit with the old size and mtime, the shortcut misses it — passforce(--forceon the CLI) to re-parse everything. - FTS5-backed symbol search — symbol lookup runs against an external-content FTS5 index
with BM25 ranking and exact/prefix boosting, falling back to a
LIKEscan only when FTS finds nothing. Search does not degrade as the graph grows. - Versioned schema with automatic migration — the database carries a schema version and upgrades itself in place on open. A database written by a newer build is rejected with a clear message instead of being read as if the shape were known.
- A database per project — the index lives in
<project>/.code-crawler/index.db, so two repositories can never collide. Pointing a populated database at a different project fails with aclear_indexhint instead of silently wiping the first index. - Analytics — hotspots (fan-in/fan-out/advice counts) and dead-code candidates.
- Self-contained: single SQLite file, no external services.
- LLM-friendly: every tool returns structured JSON, unknown symbols come back with fuzzy search suggestions.
Install & build
Requires Node.js ≥ 22.12 (better-sqlite3@13 and the Vitest toolchain both need it).
npm install
npm run build # tsc → dist/
npm test # vitest (full suite; set CODECRAWLER_BENCH=1 for the scale test)
npm run lint # biome check (lint + format, fails CI)
npm run format # biome format --write
npm run coverage # vitest run --coverage (thresholds in vitest.config.ts)
npm run bench # crawl/query benchmark on a generated ~137k-line project
CLI
codecrawler crawl <path> # index a project
codecrawler crawl <path> --force # re-parse every file, ignoring cached metadata
codecrawler status # index summary
codecrawler query <symbol> # fuzzy-lookup a symbol
codecrawler serve # start the MCP server over stdio (default)
Environment variables:
| Variable | Default | Purpose |
|---|---|---|
CODECRAWLER_DB |
<project>/.code-crawler/index.db |
Database path. Resolved from the cwd upward, so each project gets its own file; falls back to ~/.code-crawler/index.db when no project encloses the cwd. The home directory is only that fallback, never an enclosing project |
CODECRAWLER_EXCLUDE_DIRS |
.git,node_modules,dist,build,target,... |
Dirs skipped during crawl |
CODECRAWLER_DEFAULT_LIMIT |
50 |
Default result cap |
CODECRAWLER_MAX_DEPTH |
10 |
Traversal depth cap (1–100) |
CODECRAWLER_MAX_FILE_BYTES |
1000000 |
Files larger than this are skipped, not parsed |
CODECRAWLER_RESPECT_GITIGNORE |
true |
Honor the project's .gitignore during discovery |
CODECRAWLER_HELPFUL_ERRORS |
true |
Fuzzy suggestions on symbol misses |
CODECRAWLER_PLUGIN |
unset | Plugin mode: resolve one database per project at call time instead of opening one file at startup |
CODECRAWLER_PLUGIN_ROOT |
unset | Plugin install directory, never indexed as a project |
CODECRAWLER_PLUGIN_DATA |
temp dir | Writable directory for the no-project fallback database |
Invalid values never crash the server: booleans fall back to their default and integers are clamped to their documented range, each with a one-line warning on stderr.
What gets indexed
crawl walks the project and skips .git, node_modules, build output, and
other CODECRAWLER_EXCLUDE_DIRS entries. On top of that:
-
the project's
.gitignoreis honored (disable withCODECRAWLER_RESPECT_GITIGNORE=false), -
an optional
.crawlerrcin the project root can narrow or widen discovery with gitignore-style globs, and relocate where module ids start:{ "include": ["src/", "packages/core/"], "exclude": ["**/generated/"], "moduleRoots": ["src"] }When
includeis non-empty, only matching files are indexed. A malformed.crawlerrcis ignored with a warning rather than failing the crawl.moduleRootsis opt-in: with["src"],src/orders/service.tsbecomes the moduleorders.serviceinstead ofsrc.orders.service, which is what abaseUrl-or-PYTHONPATHproject actually imports. It is never inferred, because inferring it would silently renumber an existing index. TypeScript and JavaScript projects also get path aliases for free:compilerOptions.pathsandbaseUrlare read fromtsconfig.json(orjsconfig.json), followingextendswithin the project, soimport { x } from "@app/orders/service"resolves to the real module instead of being recorded as external. Changing either setting re-parses cached files on the next crawl. -
files above
CODECRAWLER_MAX_FILE_BYTESand files that look binary are skipped;crawl_projectreports them inskippedFileswith a reason. -
per-file parse failures never abort the crawl; they are reported in
parseErrors.
Only the root .gitignore is read — nested .gitignore files are not yet
supported.
Incremental crawls
A crawl records a manifest row per file (size, mtime, SHA-256, language). On the
next crawl a file whose size and truncated mtime both match is served from a cached
parse result instead of being re-read and re-parsed; a file whose mtime changed but
whose hash did not is also replayed from cache. Resolution, phantom-node creation and
derived edges still run over the whole in-memory file set, so cross-file edges stay
correct — only I/O, parsing and database writes are skipped.
crawl_project reports the split:
| Field | Meaning |
|---|---|
filesAdded |
First seen by this crawl |
filesUpdated |
Content changed, re-parsed |
filesUnchanged |
Replayed from the parse cache |
filesRemoved |
Disappeared from disk and were pruned |
Known limitation: because an unchanged file's edges are not rewritten, a call that
becomes newly resolvable only because some other file changed (for example a method
gained an overload, or a class was introduced that a previously-ambiguous call could
now bind to) will not be upgraded in the untouched file. Touch that file, or run
clear_index, to force full resolution.
Benchmarks
npm run bench generates a synthetic TypeScript project (575 modules, ~137k lines,
~9.8k methods), crawls it, and reports crawl phases and query latency percentiles.
tests/perf.test.ts asserts the same budgets and is opt-in, because a realistic
corpus takes time to crawl:
npm run bench # human-readable report
CODECRAWLER_BENCH=1 npm test -- tests/perf.test.ts # enforce the budgets
CODECRAWLER_BENCH_LINES=20000 npm run bench # smaller corpus
Measured on a Windows dev laptop with a warm disk cache; absolute numbers vary, the ratios and the index usage are what matter:
| Phase | Duration | Added | Updated | Unchanged |
|---|---|---|---|---|
| Cold crawl | 22.5 s | 575 | 0 | 0 |
| Re-crawl, nothing changed | 0.91 s | 0 | 0 | 575 |
| Re-crawl after a one-file edit | 0.75 s | 0 | 1 | 574 |
| Query | p50 | p95 | Budget (p95) |
|---|---|---|---|
search_symbols (exact) |
0.69 ms | 1.96 ms | 50 ms |
search_symbols (prefix) |
1.60 ms | 4.09 ms | 50 ms |
get_callers (depth 2) |
0.16 ms | 0.21 ms | 50 ms |
get_callees (depth 2) |
0.11 ms | 0.15 ms | 50 ms |
get_subgraph (radius 2) |
0.16 ms | 0.27 ms | 50 ms |
find_entry_points |
0.12 ms | 0.29 ms | 50 ms |
find_hotspots |
145.5 ms | 181.4 ms | 1000 ms |
find_dead_code |
99.8 ms | 290.3 ms | 1000 ms |
The index is 66 MB for those 14.4k nodes / 38.8k edges. find_hotspots and
find_dead_code are whole-project aggregations over every edge and node, which is why
their band is an order of magnitude looser than the symbol lookups; both were profiled
with EXPLAIN QUERY PLAN and are served by idx_edges_target_kind.
Agent cost: graph versus grep-and-read
npm run bench:ergonomics measures ten structural questions (who calls this, what runs on
this endpoint, what breaks if I change this, what is dead) on the four pinned benchmark
projects, against the real MCP server and against a model of text search plus reading every
file a search hit. Across the ten, the graph answered in 12 tool calls / 22,907 tokens
where grep-and-read cost 120 calls / 105,758 tokens — and 8,553 tokens with
compact: true. Reads are capped at 20 files and the dead-code baseline is handed the
answer set for free, so the baseline is under-charged.
Where plain search wins is measured too: a question about template text or a config key has no graph answer, and a one-file lookup is cheaper as a search. Use the graph for structure, search for text. The full comparison, method and caveats are on the accuracy page.
CI & publishing
GitHub Actions runs on every pull request (pull-request.yml): npm ci →
typecheck → tests → build → smoke-test of the built CLI.
Merges to main trigger publish.yml, which re-runs the same checks and then,
if green, auto-releases:
- Reads the most recent
v*tag (orpackage.jsonversion on the first run), computes the next patch version, and pushes avX.Y.Ztag. - Creates a matching GitHub release.
- Publishes the package to the npm registry with provenance (OIDC trusted publishing) — no token or repository secret is needed. The step is idempotent and retries: it skips versions npm already has, and a transient transparency-log or registry failure no longer aborts the release.
- Publishes
server.jsonto the official MCP Registry asio.github.nithin554/code-crawlerfrom a separate, re-runnable job usingExaDev/mcp-registry-publish. The job runs inside themcp-registry-publishenvironment, whose deployment branch policy is limited tomain. It pinsserver.jsonto the release version, authenticates with GitHub OIDC, skips versions the registry already lists, and retries transient npm propagation or registry errors. Ownership is verified through themcpNamefield inpackage.json.
Using as an MCP server
Install as an agent plugin
The repository is also an agent plugin, so Claude Code and Copilot CLI can install the server and the skill together:
# Claude Code
/plugin marketplace add nithin554/code-crawler
/plugin install code-crawler@code-crawler
# Copilot CLI
copilot plugin marketplace add nithin554/code-crawler
copilot plugin install code-crawler@code-crawler
The plugin runs npx -y @nithin554/code-crawler serve. Agent Plugins clients start a
plugin's stdio servers inside the plugin directory, so the server does not treat that
directory as your checkout: it resolves a project from crawl_project, the client's
workspace roots, or the project this session already selected, and keeps that graph in
<project>/.code-crawler/index.db — one database per repository, the same layout the CLI
uses. CODECRAWLER_DB still pins a single file when you want one.
The same skill is published to ClawHub as code-crawler, and the
plugin is published there too:
- Skill —
clawhub install code-crawler. ClawHub assigns this version by bumping the patch digit of whatever it already published, so it advances one release at a time instead of copying the npm version; a release whose skill publish fails leaves the two numbers one apart until the next publish. - Plugin — published as the
code-crawlerbundle plugin, versioned from the release tag: releasev0.1.67publishes the bundle at0.1.67. The bundle's ownplugins/code-crawler/package.jsonis packaging metadata — ClawHub needs a package manifest to inspect the bundle and build its ClawPack artifact, and warns when one is missing — so the release workflow stamps the tag's version into it, packs the bundle, and publishes that tarball; the committedversionis only a placeholder.
The plugin publish runs the official clawhub CLI itself, under Node, rather than calling
upstream's reusable package-publish.yml. That workflow cannot publish this bundle: it
inspects the packed artifact with bun ... package validate, and the CLI refuses to run under
Bun ("Plugin validation requires Node.js 22.13+ (22.x) or 24+"). A ClawPack always contains
package/package.json and no input skips the step, so the call only ever succeeded while the
bundle had no manifest — the very thing ClawHub warns about.
Publishing is restricted to main. The publishing jobs deploy through the clawhub-publish
environment, whose deployment branch policy rejects any other ref, so a manual dispatch from
a feature branch stops before it can upload. CLAWHUB_TOKEN is a repository secret, not an
environment secret: the skill call hands it to upstream, which reads it as clawhub_token, and
a job that calls a reusable workflow cannot declare an environment. Forwarding the value
through a job output does not help either — GitHub refuses to emit a secret-valued output and
logs Skip output 'clawhub_token' since it may contain secret.
One command
add-mcp registers the server in whichever
client you name — Claude Code, Cursor, VS Code, Claude Desktop, Codex, OpenCode, Zed, and
more (npx add-mcp list-agents). Run it from inside the repository you want indexed:
npx add-mcp @nithin554/code-crawler --args serve -a cursor
That writes project-scoped config next to the code (.mcp.json, .cursor/mcp.json,
.vscode/mcp.json, …), so each repository carries its own registration and its own
.code-crawler/index.db. The server name code-crawler is derived from the package.
--env CODECRAWLER_DB is optional — add it only to put the database somewhere else:
--env CODECRAWLER_DB=/absolute/path/to/index.db. -g writes user-level config instead. Prefer that only for clients that launch the server
with your checkout as its working directory: with -g and an unrelated working directory
(Claude Desktop starts in its own install folder) the server falls back to
~/.code-crawler/index.db, and every repository then competes for that one file.
One server per project
Outside plugin mode a server process opens one database at startup and a database holds exactly one project, so the model is one registration per repository — which is what the per-project config above gives you. The plugin install instead resolves a database per project at call time, so one plugin serves every repository you open. Re-crawling a repository reuses its existing file and only re-parses what changed; two repositories never share a file, so they cannot clash. Only a few project databases stay open at once (idle ones are closed), and every handle is released when the client disconnects.
MCP Registry / npx
The server is listed in the MCP Registry as io.github.nithin554/code-crawler.
Any npx-capable client can run it without a local checkout:
{
"mcpServers": {
"code-crawler": {
"command": "npx",
"args": ["-y", "@nithin554/code-crawler", "serve"]
}
}
}
Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"code-crawler": {
"command": "node",
"args": ["/absolute/path/to/code-crawler/dist/index.js", "serve"],
"env": { "CODECRAWLER_DB": "/absolute/path/to/your/index.db" }
}
}
}
Cursor / other stdio MCP clients
Point the client at the same command. The typical flow for an LLM agent:
crawl_projectthe repo once.find_entry_pointsto see where execution actually starts (routes, listeners, mains).search_symbolsto locate the symbol of interest.get_callers/get_callees/trace_pathto reason about the call graph.trace_executionto follow runtime dispatch and aspect advice;find_aspects,get_decorators, andfind_annotatedto inspect behaviour-changing annotations.find_routes,find_injections,find_reflections, andfind_external_dependenciesto map framework wiring and third-party surface.
See USAGE.md for the full task-oriented walkthrough.
Code Crawler MCP 질문
Code Crawler MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add code-crawler -- npx -y @nithin554/code-crawler를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
Code Crawler MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
인덱스는 어디에 저장되나요?
<project>/.code-crawler/index.db 경로의 단일 SQLite 파일에 저장됩니다.