Three real questions a coding agent gets all the time on a mid-size repo — find the entry points, find the callers, estimate the blast radius — run twice against expressjs/express. Once as a naïve agent (Glob → Read → Grep). Once with @colbymchenry/codegraph indexed and wired into Claude Code over MCP. Tool calls, context tokens and turn time all collapse.
codegraph_search + codegraph_exploreGlob + multiple Read to survey.
Demonstrated in T1 · T3
Grep "name(" + Read.
Demonstrated in T2
lib/**/*.jslist every file in lib/ to pick what to readlib/express.jsthe package entry — looking for the request pathlib/application.jswhere handle() actually dispatcheslib/request.jsto confirm the IncomingMessage augmentationlib/response.jsto confirm the ServerResponse augmentationhandle( in lib/to nail down the dispatcher signature"…HTTP entry points…"returns the entry-point symbols + the right lib/application.js:152 snippetResponse#send— “who actually calls this thing inside express?”
4 → 1 calls
6,615 → 109 tok
16.0s → 4.9s
\.send( in lib/noisy: 100+ hits, most of them send() the module, send() the option, etc.lib/response.jswhole file (~970 lines) to filter the false positives by eyethis.send( in lib/narrow to in-class callersres.send( in lib/re-narrow to method-style callerssendone call returns the caller trail — exactly 5 callers: json · jsonp · sendStatus · sendFile · render (plus its callees and the disambiguation note for the homonym at response.js:31)Response#send— “if I touch this signature, what breaks?”
5 → 1 calls
9,884 → 129 tok
20.0s → 4.9s
lib/**survey lib/ before fanning outlib/response.jsto map the method itself + its in-file dependents\.send( in lib/candidate dependentssend\. in lib/disambiguate from the send npm moduletest/res.send.jssanity-check that the test names match the dependents"…if I change Response.send signature, what breaks?"one call returns the affected surface — entry symbol send + related downstream symbols (json · jsonp · sendStatus · status · set) grouped by file, with the "small project, no follow-up explore needed" hintThe pattern is obvious: the harder the question is to phrase as a substring (“who calls this?”, “what does this touch?”), the more grep-and-read the naïve agent burns through — and the bigger codegraph’s win. Entry-point and impact-analysis questions collapse from 5–6 tool calls to one; the context the model has to chew on shrinks from tens of thousands of tokens to a few hundred.
Translation: faster turns, cheaper turns, and the model spends its attention on the answer, not on filtering grep noise.
Take the course →