Codebase Memory — Knowledge Graph Tools
Graph tools return precise structural results in ~500 tokens vs ~80K for grep.
Quick Decision Matrix
| Question |
Tool call |
| Who calls X? |
trace_path(direction="inbound") |
| What does X call? |
trace_path(direction="outbound") |
| Full call context |
trace_path(direction="both") |
| Find by name pattern |
search_graph(name_pattern="...") |
| Dead code |
search_graph(max_degree=0, exclude_entry_points=true) |
| Cross-service edges |
query_graph with Cypher |
| Impact of local changes |
detect_changes() |
| Risk-classified trace |
trace_path(risk_labels=true) |
| Text search |
search_code or Grep |
Exploration Workflow
list_projects — check if project is indexed
get_graph_schema — understand node/edge types
search_graph(label="Function", name_pattern=".*Pattern.*") — find code
get_code_snippet(qualified_name="project.path.FuncName") — read source
Tracing Workflow
search_graph(name_pattern=".*FuncName.*") — discover exact name
trace_path(function_name="FuncName", direction="both", depth=3) — trace
detect_changes() — map git diff to affected symbols
Evidence Tiers
- Scout (Tier 1): fast positive lookup with few graph calls and targeted source checks. Treat results as provisional; never make absence, exhaustive, dead-code, or complete-impact claims.
- Verify (Tier 2, default): task-directed searches, relevant trace directions, exact snippets for material claims, and all relevant result pages.
- Auditor (Tier 3): bounded-scope full verification with a current graph generation, complete relevant pagination, both call directions and broader relationships when material, plus explicit unresolved limitations.
- Every tier: after candidate paths are known, call
check_index_coverage once with every evidence path. For negative or exhaustive claims also include the relevant scopes. A clean result means no recorded gap, not proof of completeness. For partial, skipped, excluded, stale, pending, or unknown coverage, read/grep the reported ranges or scope before relying on the graph.
Sessions and Subagents
- At session start or after compaction, call
list_projects/index_status before structural exploration, then choose Scout, Verify, or Auditor for the task.
- Before delegating, query the graph and coverage in the parent. Pass the tier, exact project, generation/freshness, bounded scope, queries and pagination state, qualified symbols, paths, call-chain findings, coverage ranges/reasons, source fallback already performed, and unresolved questions to the child.
- Runtimes that isolate child context (subagents without a shared conversation) need the graph findings passed explicitly in the delegation payload; do not assume the child inherits MCP access or the parent's conversation.
- A child without MCP tools must not call or claim MCP access. It should work from the supplied evidence and use read/grep on exact source, especially every reported missed-coverage range.
Quality Analysis
- Dead code:
search_graph(max_degree=0, exclude_entry_points=true)
- High fan-out:
search_graph(min_degree=10, relationship="CALLS", direction="outbound")
- High fan-in:
search_graph(min_degree=10, relationship="CALLS", direction="inbound")
15 MCP Tools
index_repository, index_status, list_projects, delete_project,
search_graph, search_code, trace_path, detect_changes,
query_graph, get_graph_schema, get_code_snippet, get_architecture,
check_index_coverage, manage_adr, ingest_traces
Edge Types
CALLS, HTTP_CALLS, ASYNC_CALLS, DATA_FLOWS, IMPORTS, DEFINES, DEFINES_METHOD,
HANDLES, IMPLEMENTS, OVERRIDE, USAGE, CALL_REFERENCE, CONFIGURES, FILE_CHANGES_WITH,
SIMILAR_TO, SEMANTICALLY_RELATED, CONTAINS_FILE, CONTAINS_FOLDER,
CONTAINS_PACKAGE
Cypher Examples (for query_graph)
MATCH (a)-[r:HTTP_CALLS]->(b) RETURN a.name, b.name, r.url_path, r.confidence LIMIT 20
MATCH (f:Function) WHERE f.name =~ '.*Handler.*' RETURN f.name, f.file_path
MATCH (a)-[r:CALLS]->(b) WHERE a.name = 'main' RETURN b.name
Gotchas
search_graph(relationship="HTTP_CALLS") filters nodes by degree — use query_graph with Cypher to see actual edges.
query_graph has a 100k row ceiling — add a Cypher LIMIT for broad queries or use search_graph pagination.
trace_path needs exact names — use search_graph(name_pattern=...) first.
direction="outbound" misses cross-service callers — use direction="both".
search_graph results default to 50 per page — check has_more and use offset.
1---2name: codebase-memory3description: Use the codebase knowledge graph for structural code queries. Triggers on: explore the codebase, understand the architecture, what functions exist, show me the structure, who calls this function, what does X call, trace the call chain, find callers of, show dependencies, impact analysis, dead code, unused functions, high fan-out, refactor candidates, code quality audit, graph query syntax, Cypher query examples, edge types, how to use search_graph.4---56# Codebase Memory — Knowledge Graph Tools78Graph tools return precise structural results in ~500 tokens vs ~80K for grep.910## Quick Decision Matrix1112| Question | Tool call |13|----------|----------|14| Who calls X? | `trace_path(direction="inbound")` |15| What does X call? | `trace_path(direction="outbound")` |16| Full call context | `trace_path(direction="both")` |17| Find by name pattern | `search_graph(name_pattern="...")` |18| Dead code | `search_graph(max_degree=0, exclude_entry_points=true)` |19| Cross-service edges | `query_graph` with Cypher |20| Impact of local changes | `detect_changes()` |21| Risk-classified trace | `trace_path(risk_labels=true)` |22| Text search | `search_code` or Grep |2324## Exploration Workflow251. `list_projects` — check if project is indexed262. `get_graph_schema` — understand node/edge types273. `search_graph(label="Function", name_pattern=".*Pattern.*")` — find code284. `get_code_snippet(qualified_name="project.path.FuncName")` — read source2930## Tracing Workflow311. `search_graph(name_pattern=".*FuncName.*")` — discover exact name322. `trace_path(function_name="FuncName", direction="both", depth=3)` — trace333. `detect_changes()` — map git diff to affected symbols3435## Evidence Tiers36- **Scout (Tier 1):** fast positive lookup with few graph calls and targeted source checks. Treat results as provisional; never make absence, exhaustive, dead-code, or complete-impact claims.37- **Verify (Tier 2, default):** task-directed searches, relevant trace directions, exact snippets for material claims, and all relevant result pages.38- **Auditor (Tier 3):** bounded-scope full verification with a current graph generation, complete relevant pagination, both call directions and broader relationships when material, plus explicit unresolved limitations.39- **Every tier:** after candidate paths are known, call `check_index_coverage` once with every evidence path. For negative or exhaustive claims also include the relevant scopes. A clean result means no recorded gap, not proof of completeness. For partial, skipped, excluded, stale, pending, or unknown coverage, read/grep the reported ranges or scope before relying on the graph.4041## Sessions and Subagents42- At session start or after compaction, call `list_projects`/`index_status` before structural exploration, then choose Scout, Verify, or Auditor for the task.43- Before delegating, query the graph and coverage in the parent. Pass the tier, exact project, generation/freshness, bounded scope, queries and pagination state, qualified symbols, paths, call-chain findings, coverage ranges/reasons, source fallback already performed, and unresolved questions to the child.44- Runtimes that isolate child context (subagents without a shared conversation) need the graph findings passed explicitly in the delegation payload; do not assume the child inherits MCP access or the parent's conversation.45- A child without MCP tools must not call or claim MCP access. It should work from the supplied evidence and use read/grep on exact source, especially every reported missed-coverage range.4647## Quality Analysis48- Dead code: `search_graph(max_degree=0, exclude_entry_points=true)`49- High fan-out: `search_graph(min_degree=10, relationship="CALLS", direction="outbound")`50- High fan-in: `search_graph(min_degree=10, relationship="CALLS", direction="inbound")`5152## 15 MCP Tools53`index_repository`, `index_status`, `list_projects`, `delete_project`,54`search_graph`, `search_code`, `trace_path`, `detect_changes`,55`query_graph`, `get_graph_schema`, `get_code_snippet`, `get_architecture`,56`check_index_coverage`, `manage_adr`, `ingest_traces`5758## Edge Types59CALLS, HTTP_CALLS, ASYNC_CALLS, DATA_FLOWS, IMPORTS, DEFINES, DEFINES_METHOD,60HANDLES, IMPLEMENTS, OVERRIDE, USAGE, CALL_REFERENCE, CONFIGURES, FILE_CHANGES_WITH,61SIMILAR_TO, SEMANTICALLY_RELATED, CONTAINS_FILE, CONTAINS_FOLDER,62CONTAINS_PACKAGE6364## Cypher Examples (for query_graph)65```66MATCH (a)-[r:HTTP_CALLS]->(b) RETURN a.name, b.name, r.url_path, r.confidence LIMIT 2067MATCH (f:Function) WHERE f.name =~ '.*Handler.*' RETURN f.name, f.file_path68MATCH (a)-[r:CALLS]->(b) WHERE a.name = 'main' RETURN b.name69```7071## Gotchas721. `search_graph(relationship="HTTP_CALLS")` filters nodes by degree — use `query_graph` with Cypher to see actual edges.732. `query_graph` has a 100k row ceiling — add a Cypher `LIMIT` for broad queries or use `search_graph` pagination.743. `trace_path` needs exact names — use `search_graph(name_pattern=...)` first.754. `direction="outbound"` misses cross-service callers — use `direction="both"`.765. `search_graph` results default to 50 per page — check `has_more` and use `offset`.