Reference

Tool reference

All 22 MCP tools with their arguments, response shape, and a working call. Every tool returns structured JSON.

Before you start

Conventions

Symbol ids

Most tools accept either an id or a qualified name. Resolve names with search_symbols first. Ids follow a fixed scheme: pkg.Type, Type#method, Type#<init>, Type$field, @Annotation.

Line numbers

Stored 0-based internally, but every tool response reports 1-based lines. Use them directly against an editor or a diff.

Limits and depth

List tools default to 50 results. Traversals are bounded by max_depth and limit; both are validated against a hard maximum so a query cannot run away.

Unknown symbols

A miss returns error, fuzzy suggestions, and a hint instead of failing the call — so an assistant can recover without guessing.

Group 1

Index & schema

crawl_project core

Index a project directory into the graph. Idempotent: refreshes changed files and removes vanished ones.

ArgumentTypeRequiredDescription
pathstringyesAbsolute path to the project root.
languagestringnoForce a parser language, e.g. "java". Defaults to extension detection.
fileFilterstringnoOnly index files whose path contains this substring.

Returns projectPath, filesScanned, filesParsed, filesRemoved, nodes, edges, resolvedCalls, unresolvedCalls, dynamicDispatchEdges, adviceEdges, aspects, decorators, languages, durationMs.

crawl_project({ path: "C:/work/shop-service" })
index_status core

Current node/edge/file counts and the last crawl timestamp.

No arguments. Returns nodes, edges, files, lastCrawl, projectPath.

index_status({})
get_schema core

The live graph model: node kinds, edge kinds, id scheme, and dynamic-model semantics.

No arguments. Use it when an assistant needs to reason about which edge kind expresses a relationship before querying.

get_schema({})
clear_index destructive

Wipe the graph database. You must crawl again afterwards.

No arguments. Returns { ok: true, cleared: true }.

clear_index({})
Group 2

Symbol lookup

search_symbols core

Fuzzy lookup by name or FQN across types, methods, fields, and files.

ArgumentTypeRequiredDescription
querystringyesPartial name or FQN, e.g. "OrderService" or "place".
kindenumnoRestrict to a node kind: class, interface, enum, method, constructor, field, ...
limitnumbernoMax results, 1–200. Default 50.

Returns query, count, and results[] with id, qualifiedName, name, kind, filePath.

search_symbols({ query: "OrderService", kind: "class" })
get_node core

Metadata and source location for a single symbol.

ArgumentTypeRequiredDescription
qualified_namestringyesSymbol id or qualified name.

Returns id, kind, qualifiedName, filePath, and properties (signature, modifiers, annotations, startLine, endLine, ...).

get_node({ qualified_name: "com.acme.OrderService#place" })
Group 3

Call graph

get_callers core

Every symbol that calls the target, directly or transitively.

ArgumentTypeRequiredDescription
symbolstringyesMethod or constructor id/qualified name.
transitivebooleannoInclude transitive callers. Default true.
include_dynamicbooleannoAlso follow DYNAMIC_DISPATCH edges.
include_advicebooleannoAlso follow ADVISES edges.
max_depthnumbernoTraversal depth cap, 1–50.
limitnumbernoMax callers, 1–500.

Returns target and callers[] with caller, depth, callSiteLine, edgeKind.

get_callers({
  symbol: "com.acme.OrderRepository#create",
  transitive: true,
  include_dynamic: true
})
get_callees core

Every symbol the target calls, directly or transitively.

ArgumentTypeRequiredDescription
symbolstringyesMethod or constructor id/qualified name.
transitivebooleannoInclude transitive callees. Default true.
include_dynamicbooleannoFollow virtual/interface dispatch targets.
include_advicebooleannoFollow advice edges.
max_depthnumbernoTraversal depth cap, 1–50.
limitnumbernoMax callees, 1–500.

Returns source and callees[] with callee, depth, callSiteLine, edgeKind.

get_callees({ symbol: "com.acme.Checkout#checkout", max_depth: 4 })
trace_path core

Find call paths between two symbols. Static by default; optionally route through dispatch and advice.

ArgumentTypeRequiredDescription
sourcestringyesStarting symbol id or qualified name.
targetstringyesDestination symbol id or qualified name.
include_dynamicbooleannoAlso traverse DYNAMIC_DISPATCH edges.
include_advicebooleannoAlso traverse ADVISES edges.
max_depthnumbernoMaximum path length, 1–50.
limitnumbernoMax paths, 1–100. Default 10.

Returns pathCount and paths[], each with length, a symbol-id path array, and edges[] carrying kind and callSiteLine.

trace_path({
  source: "com.acme.Main#main",
  target: "com.acme.Gateway#authorize",
  include_dynamic: true,
  max_depth: 12
})
get_subgraph core

Neighborhood around a symbol across any edge kinds — for visualization and local shape.

ArgumentTypeRequiredDescription
symbolstringyesCenter symbol id or qualified name.
radiusnumbernoHop radius, 1–6. Default 2.
edge_kindsenum[]noRestrict which edge kinds to follow.
limitnumbernoMax nodes, 1–2000.

Returns center, nodeCount, nodes[], edges[].

get_subgraph({
  symbol: "com.acme.Payment",
  radius: 2,
  edge_kinds: ["CALLS", "DYNAMIC_DISPATCH", "ADVISES"]
})
Group 4

Dynamic behaviour

trace_execution dynamic

Execution trace from a symbol: static calls, virtual dispatch, and woven advice as INTERCEPT hops.

ArgumentTypeRequiredDescription
symbolstringyesStarting method or constructor id/qualified name.
include_dynamicbooleannoFollow dispatch edges. Default true.
include_advicebooleannoWeave aspect advice. Default true.
max_depthnumbernoDepth cap, 1–50.
limitnumbernoMax steps, 1–1000.

Returns root, stepCount, and steps[] with symbol, depth, via (CALLS, DYNAMIC_DISPATCH, ADVISES, or INTERCEPT), and callSiteLine.

trace_execution({
  symbol: "com.acme.Checkout#checkout",
  include_advice: true,
  max_depth: 6
})
find_implementations dynamic

Every class/interface that implements or extends a type, directly or transitively.

ArgumentTypeRequiredDescription
symbolstringyesInterface or superclass id/qualified name.
max_depthnumbernoHierarchy depth cap, 1–20.
limitnumbernoMax implementations, 1–500.

Returns target, implementationCount, and implementations[] with type, depth, via (IMPLEMENTS or EXTENDS).

find_implementations({ symbol: "com.acme.Payment" })
find_aspects dynamic

Aspects with their advice methods, pointcuts, and the methods each advice intercepts.

ArgumentTypeRequiredDescription
limitnumbernoMax aspects, 1–200.

Returns aspectCount and aspects[], each with aspect and advice[] carrying method, adviceKind, pointcut, and advised[].

find_aspects({ limit: 20 })
get_decorators dynamic

Annotations applied to a symbol, optionally including its members.

ArgumentTypeRequiredDescription
symbolstringyesSymbol id or qualified name.
include_membersbooleannoAlso list decorators on declared methods, constructors, and fields.

Returns symbol, decorators[] (name, fqn, decorator, line, arguments), and members[] when requested.

get_decorators({
  symbol: "com.acme.DecoratedService",
  include_members: true
})
find_annotated dynamic

Every symbol carrying a given annotation — simple name, @name, or FQN.

ArgumentTypeRequiredDescription
annotationstringyesAnnotation name, e.g. "Transactional", "@Aspect", or an FQN.
kindenumnoRestrict to a node kind.
limitnumbernoMax symbols, 1–500.

Returns annotation, count, and results[] with symbol, annotation, line, arguments.

find_annotated({ annotation: "Cacheable", kind: "method" })
Group 5

Run-time wiring

The things a call graph cannot see: what a framework invokes, what a container injects, what reflects at run time, and where your code stops and third-party code starts. All five work across Java, Python, TypeScript and JavaScript.

find_entry_points dynamic

Methods a framework or runtime invokes, with no in-project caller.

ArgumentTypeRequiredDescription
kindstringnoFilter by entry-point kind, e.g. "route", "main", "test".
languagestringnoRestrict to java, python, typescript, or javascript.
limitnumbernoMax entries, 1–500.

Returns count and entryPoints[] with symbol, kind, detail, framework, and line. Recognised: Spring MVC mappings, @Scheduled/@EventListener, tests, main, FastAPI/Flask decorators, if __name__ == "__main__", NestJS controllers, Express handlers, and Jest/pytest tests.

find_entry_points({ kind: "route", limit: 50 })
find_routes dynamic

HTTP route → handler mappings, across frameworks.

ArgumentTypeRequiredDescription
methodstringnoHTTP verb filter, e.g. "GET", "POST".
pathstringnoSubstring match on the route path.
frameworkstringnoe.g. "fastapi", "nestjs", "express", "spring".
limitnumbernoMax routes, 1–500.

Each route carries httpMethod, path, handler, framework, and a ROUTES edge. Inline Express handlers get a synthetic node (module:src.routes#<anonymous@7>) so their body is still traceable.

find_routes({ method: "POST", framework: "nestjs" })
find_injections dynamic

Dependencies supplied by a DI container, as INJECTS edges.

ArgumentTypeRequiredDescription
frameworkstringnoe.g. "spring", "nestjs", "fastapi", "dependency-injector".
targetstringnoOnly injections into this symbol.
limitnumbernoMax entries, 1–500.

Detected from @Autowired members, NestJS constructor parameters, FastAPI Depends(...), @injectable constructor parameters, and project-class constructor parameters. Primitive and structural parameter types are counted but produce no edge, so @Body() body: { id: string } does not pollute the graph.

find_injections({ framework: "nestjs" })
find_reflections dynamic

Run-time lookups that bypass the static call graph.

ArgumentTypeRequiredDescription
mechanismstringnoe.g. "class.forName", "getattr", "importlib", "import()", "require".
resolved_onlybooleannoExclude targets that landed on a __reflect__: marker.
limitnumbernoMax entries, 1–500.

Returns count and reflections[] with source, target, mechanism, resolved, and line. When the target is statically determinable — a literal, or a literal prefix plus a variable — the edge points at the real symbol; otherwise it points at a __reflect__: marker holding the expression.

find_reflections({ resolved_only: true })
find_external_dependencies dynamic

Third-party packages referenced by the crawled code.

ArgumentTypeRequiredDescription
limitnumbernoMax packages, 1–500.

Returns count and dependencies[] with package, references, and files. Packages are normalised to the import root — ext:fastapi, @nestjs/common, express. Project-internal namespaces are never reported as external.

find_external_dependencies({ limit: 100 })
Group 6

Analytics

find_hotspots analytics

Rank callables by fan-in, fan-out, and advice interceptions.

ArgumentTypeRequiredDescription
limitnumbernoMax hotspots, 1–200.
min_fan_innumbernoMinimum incoming call count.
include_dynamicbooleannoCount dispatch callers too. Default true.

Returns count and hotspots[] with symbol, fanIn, fanOut, adviceCount.

find_hotspots({ min_fan_in: 3, limit: 25 })
find_dead_code analytics

Callables with no incoming calls, dispatch, or advice edges.

ArgumentTypeRequiredDescription
limitnumbernoMax symbols, 1–500.
include_constructorsbooleannoInclude constructors. Default false.
include_testsbooleannoInclude test sources. Default false.
include_dynamicbooleannoTreat dispatch edges as callers. Default true.

Returns count and unused[] with symbol and reason. main is excluded as an entry point.

find_dead_code({ limit: 100, include_constructors: false })

Dead-code output is a candidate list. Framework-invoked code — controllers, listeners, scheduled methods, serialization hooks, reflection targets — has no in-project caller and will be reported as unused.

Appendix

Graph types

Node kinds

file package module class interface enum method constructor field import external_symbol aspect annotation_type annotation unknown_symbol

Edge kinds

KindFrom → toMeaning
CALLScallable → callableResolved or unresolved call site.
DECLARED_INsymbol → typeOwning type of a member.
CONTAINSfile/type → symbolLexical containment.
IMPLEMENTSclass → interfaceInterface implementation.
EXTENDStype → typeSuperclass relation.
IMPORTSfile → importImport declaration.
REFERENCESsymbol → symbolNon-call reference.
DYNAMIC_DISPATCHcallable → overrideRuntime target of a virtual call.
ADVISESadvice → advisedAspect advice intercepting a method.
ANNOTATED_WITHsymbol → annotationAnnotation usage with arguments.
REFLECTSsymbol → symbol / markerRun-time lookup (Class.forName, getattr, import()).
INJECTStype → typeDependency supplied by a DI container.
ROUTESroute → handlerHTTP route registration.

Id scheme

SymbolId
Typecom.acme.OrderService
Methodcom.acme.OrderService#place
Constructorcom.acme.OrderService#<init>
Fieldcom.acme.OrderService$repo
Modulemodule:app.service
Module functionmodule:app.api#read_order
Module fieldmodule:app.service$AUDIT_LOG
Inline arrow handlermodule:src.routes#<anonymous@7>
Annotation@Transactional
Import__import__:java.util.List
External packageext:fastapi
Unresolved call__unknown__:System.out.println
Reflective marker__reflect__:./plugins/${name}
Injection marker__inject__:Repo

Ready to index?

Install, crawl a project, and register the server with your MCP client.

Quickstart →