Supercharge Claude Code, Cursor, Codex, OpenCode, Hermes Agent, Gemini, Antigravity, and Kiro with Semantic Code Intelligence
~25% cheaper Β· ~62% fewer tool calls Β· 100% local
No Node.js required β one command grabs the right build for your OS:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iexAlready have Node? Use npm instead (works on any version):
npx @colbymchenry/codegraph # zero-install, or:
npm i -g @colbymchenry/codegraphCodeGraph bundles its own runtime β nothing to compile, no native build, works the same everywhere. The interactive installer auto-configures your agent(s) β Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, Kiro.
cd your-project
codegraph init -icodegraph init just creates the local .codegraph/ index directory; adding -i (--index) also builds the initial graph in the same step. Without -i, run codegraph index afterwards to populate it.
Changed your mind? One command removes CodeGraph from every agent it configured:
codegraph uninstallReverses the installer β strips CodeGraph's MCP server config, instructions, and permissions from each configured agent. Your project indexes (.codegraph/) are left untouched; remove those per-project with codegraph uninit. Use --target to remove from specific agents, or --yes to run non-interactively.
When Claude Code explores a codebase, it spawns Explore agents that scan files with grep, glob, and Read β consuming tokens on every tool call.
CodeGraph gives those agents a pre-indexed knowledge graph β symbol relationships, call graphs, and code structure. Agents query the graph instantly instead of scanning files.
Tested across 7 real-world open-source codebases spanning 7 languages, comparing an agent (Claude Code, headless) answering one architecture question with and without CodeGraph. Each cell is the savings at the median of 4 runs per arm. Re-validated on Opus 4.8 (2026-05-29), on the build with per-symbol adaptive codegraph_explore sizing.
Average: 25% cheaper Β· 57% fewer tokens Β· 23% faster Β· 62% fewer tool calls
| Codebase | Language | Cost | Tokens | Time | Tool calls |
|---|---|---|---|---|---|
| VS Code | TypeScript Β· ~10k files | 33% cheaper | 70% fewer | 27% faster | 80% fewer |
| Excalidraw | TypeScript Β· ~640 | 27% cheaper | 61% fewer | 26% faster | 70% fewer |
| Django | Python Β· ~3k | 23% cheaper | 70% fewer | 28% faster | 77% fewer |
| Tokio | Rust Β· ~790 | 35% cheaper | 70% fewer | 37% faster | 79% fewer |
| OkHttp | Java Β· ~645 | 11% cheaper | 48% fewer | 26% faster | 70% fewer |
| Gin | Go Β· ~110 | 15% cheaper | 35% fewer | 9% faster | 47% fewer |
| Alamofire | Swift Β· ~110 | 28% cheaper | 46% fewer | 7% faster | 13% fewer |
CodeGraph cuts cost, tokens, tool calls, and time on every repo β across small, medium, and large codebases β and answers most of them with zero file reads, while the no-CodeGraph agent spends its budget on grep/find/Read discovery. codegraph_explore shows the answer in full β the mechanism plus the exact methods you asked about, even when they're buried in a multi-thousand-line file β while collapsing redundant interchangeable implementations to signatures, so the response is sized to the answer rather than the file count. The cost margin is narrowest on the smallest repos, where a modern model's native search is already cheap, but it stays solidly positive across the board.
Per-repo breakdown β WITH vs WITHOUT (median of 4)
VS Code Β· ~10k files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 1m 37s | 2m 13s | 27% faster |
| File Reads | 0 | 9 | β9 |
| Grep/Bash | 0 | 11 | β11 |
| Tool calls | 4 | 21 | 80% fewer |
| Total tokens | 545k | 1.79M | 70% fewer |
| Cost | $0.55 | $0.83 | 33% cheaper |
Excalidraw Β· ~640 files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 1m 34s | 2m 6s | 26% faster |
| File Reads | 0 | 7 | β7 |
| Grep/Bash | 0 | 8 | β8 |
| Tool calls | 5 | 15 | 70% fewer |
| Total tokens | 651k | 1.69M | 61% fewer |
| Cost | $0.57 | $0.78 | 27% cheaper |
Django Β· ~3k files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 1m 25s | 1m 58s | 28% faster |
| File Reads | 0 | 9 | β9 |
| Grep/Bash | 0 | 5 | β5 |
| Tool calls | 3 | 13 | 77% fewer |
| Total tokens | 419k | 1.41M | 70% fewer |
| Cost | $0.48 | $0.62 | 23% cheaper |
Tokio Β· ~790 files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 1m 28s | 2m 20s | 37% faster |
| File Reads | 0 | 8 | β8 |
| Grep/Bash | 0 | 6 | β6 |
| Tool calls | 3 | 14 | 79% fewer |
| Total tokens | 522k | 1.73M | 70% fewer |
| Cost | $0.53 | $0.82 | 35% cheaper |
OkHttp Β· ~645 files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 1m 6s | 1m 29s | 26% faster |
| File Reads | 1 | 4 | β3 |
| Grep/Bash | 0 | 6 | β6 |
| Tool calls | 3 | 10 | 70% fewer |
| Total tokens | 572k | 1.10M | 48% fewer |
| Cost | $0.48 | $0.55 | 11% cheaper |
Gin Β· ~110 files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 1m 28s | 1m 37s | 9% faster |
| File Reads | 0 | 6 | β6 |
| Grep/Bash | 0 | 2 | β2 |
| Tool calls | 5 | 9 | 47% fewer |
| Total tokens | 552k | 847k | 35% fewer |
| Cost | $0.48 | $0.57 | 15% cheaper |
Alamofire Β· ~110 files
| Metric | WITH cg | WITHOUT cg | Ξ |
|---|---|---|---|
| Time | 2m 11s | 2m 21s | 7% faster |
| File Reads | 3 | 9 | β6 |
| Grep/Bash | 2 | 4 | β2 |
| Tool calls | 11 | 12 | 13% fewer |
| Total tokens | 1.13M | 2.10M | 46% fewer |
| Cost | $0.69 | $0.95 | 28% cheaper |
Full benchmark details
Methodology. Each arm is claude -p (Claude Opus 4.8) run headlessly against the repo with --strict-mcp-config: WITH = CodeGraph's MCP server enabled, WITHOUT = an empty MCP config. Built-in Read/Grep/Bash stay available to both. Same question per repo, 4 runs per arm, median reported. Cost = the run's total_cost_usd; Tokens = total tokens processed (input incl. cached + output); Time = wall-clock; Tool calls = every tool invocation, including those inside any sub-agents the model spawns. Repos cloned at --depth 1 and indexed by the same CodeGraph build that served them. Re-validated 2026-05-29 on the build with per-symbol adaptive codegraph_explore sizing. These numbers are lower than the prior Opus 4.7 validation β not a CodeGraph regression but a stronger native baseline: Opus 4.8 greps/reads efficiently on the main thread instead of fanning out into large Explore-subagent sweeps, so the no-CodeGraph arm is leaner than it used to be. Per-repo numbers move run-to-run with how hard the without-arm thrashes (the median-of-4 smooths it, but tails remain β e.g. Django's without-arm hit $2.71/14m one batch).
Queries:
| Codebase | Query |
|---|---|
| VS Code | "How does the extension host communicate with the main process?" |
| Excalidraw | "How does Excalidraw render and update canvas elements?" |
| Django | "How does Django's ORM build and execute a query from a QuerySet?" |
| Tokio | "How does tokio schedule and run async tasks on its runtime?" |
| OkHttp | "How does OkHttp process a request through its interceptor chain?" |
| Gin | "How does gin route requests through its middleware chain?" |
| Alamofire | "How does Alamofire build, send, and validate a request?" |
Why CodeGraph wins: with the index available, the agent answers directly β codegraph_context to map the area, then one codegraph_explore for the relevant source β and stops, usually with zero file reads. Without it, the agent spends most of its budget on discovery (find/ls/grep) before reading the right code. CodeGraph only helps when queried directly, so its instructions steer agents to answer directly rather than delegate exploration to file-reading sub-agents β otherwise a sub-agent reads files regardless and CodeGraph becomes overhead.
| Smart Context Building | One tool call returns entry points, related symbols, and code snippets β no expensive exploration agents |
| Full-Text Search | Find code by name instantly across your entire codebase, powered by FTS5 |
| Impact Analysis | Trace callers, callees, and the full impact radius of any symbol before making changes |
| Always Fresh | File watcher uses native OS events (FSEvents/inotify/ReadDirectoryChangesW) with debounced auto-sync β the graph stays current as you code, zero config |
| 20+ Languages | TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Objective-C, Swift, Kotlin, Dart, Lua, Luau, Svelte, Liquid, Pascal/Delphi |
| Framework-aware Routes | Recognizes web-framework routing files and links URL patterns to their handlers across 14 frameworks |
| Mixed iOS / React Native / Expo | Closes cross-language flows that static parsing misses: Swift β ObjC bridging, React Native legacy bridge + TurboModules + Fabric view components, native β JS event emitters, Expo Modules |
| 100% Local | No data leaves your machine. No API keys. No external services. SQLite database only |
How auto-syncing works β and why you don't need to run codegraph sync manually
When your agent (Claude Code, Cursor, Codex, opencode) launches codegraph serve --mcp, three layers keep the index in step with your code β and make sure the agent never gets a silent wrong answer in the brief window between an edit and the next sync:
-
File watcher with debounced auto-sync. A native FSEvents / inotify / ReadDirectoryChangesW watcher captures every source-file create / modify / delete and triggers a re-index after a debounce window (default
2000ms, tunable viaCODEGRAPH_WATCH_DEBOUNCE_MS, clamped to[100ms, 60s]). Bursts of edits collapse into a single sync. -
Per-file staleness banner. During the brief debounce window, MCP tool responses that would reference a still-pending file prepend a
β οΈbanner naming it and telling the agent toReadit directly. Pending files NOT referenced by the response surface as a small footer instead. Either way, the agent gets an explicit signal β validated with Claude Code, where the agent literally says "Reading the file directly for the live content" before opening it. -
Connect-time catch-up. When the MCP server (re)connects, codegraph runs a fast
(size, mtime)+ content-hash reconciliation against the working tree before answering the first query β so edits made while no MCP server was running (agit pullfrom the terminal, edits from another editor, a previous agent session that exited) get absorbed on the next session's first tool call.
agent writes src/Widget.ts
β watcher fires (<100ms)
β debounce (default 2s)
β sync; Widget.ts is in the index
β next agent query sees it
Verify any time with codegraph_status (via MCP) or codegraph status (CLI). If anything is pending, you'll see a ### Pending sync: section naming the files and their edit age.
The handful of cases where manual codegraph sync makes sense: the watcher is disabled (sandboxed environments, or CODEGRAPH_NO_DAEMON=1), or you're scripting against the index outside an agent session and want a pre-flight sync at the start of your script.
β Full deep-dive in Guides β Indexing a Project.
CodeGraph detects web-framework routing files and emits route nodes linked by references edges to their handler classes or functions. Querying callers of a view/controller now surfaces the URL pattern that binds it.
| Framework | Shapes recognized |
|---|---|
| Django | path(), re_path(), url(), include() in urls.py (CBV .as_view(), dotted paths) |
| Flask | @app.route('/path', methods=[...]), blueprint routes |
| FastAPI | @app.get(...), @router.post(...), all standard methods |
| Express | app.get(...), router.post(...) with middleware chains |
| NestJS | @Controller + @Get/@Post/..., GraphQL @Resolver + @Query/@Mutation, @MessagePattern/@EventPattern, @SubscribeMessage |
| Laravel | Route::get(), Route::resource(), Controller@action, tuple syntax |
| Drupal | *.routing.yml routes (_controller, _form, entity handlers); hook_* implementations in .module/.theme/.install/.inc |
| Rails | get '/x', to: 'users#index', hash-rocket => syntax |
| Spring | @GetMapping, @PostMapping, @RequestMapping on methods |
| Gin / chi / gorilla / mux | r.GET(...), router.HandleFunc(...) |
| Axum / actix / Rocket | .route("/x", get(handler)) |
| ASP.NET | [HttpGet("/x")] attributes on action methods |
| Vapor | app.get("x", use: handler) |
| React Router / SvelteKit | Route component nodes |
Real iOS and React Native codebases live across multiple languages β a Swift caller invokes an Objective-C selector that's been auto-bridged, a JS file calls into a native module via the React Native bridge, a JSX component delegates to a native view manager. Static tree-sitter extraction stops at each language boundary. CodeGraph bridges them so trace, callers, callees, and impact connect end-to-end across the gap.
| Boundary | JS / Swift side | Native side | How |
|---|---|---|---|
| Swift β ObjC | Swift obj.foo(bar:) |
ObjC selector -fooWithBar: |
@objc auto-bridging rules (including init/property/protocol forms) + Cocoa preposition prefixes (With/For/By/In/On/At/β¦) |
| ObjC β Swift | ObjC [obj fooWithBar:] |
Swift @objc func foo(bar:) |
Reverse-bridge name candidates; verifies @objc exposure from source |
| React Native legacy bridge | JS NativeModules.X.fn(...) |
ObjC RCT_EXPORT_METHOD / RCT_REMAP_METHOD Β· Java/Kotlin @ReactMethod |
Parses macro/annotation declarations to build a JS-name β native-method map |
| React Native TurboModules | JS import M from './NativeM'; M.fn(...) |
Native impl matching the Codegen spec | Treats the Native<X>.ts spec interface as ground truth |
| RN native β JS events | JS new NativeEventEmitter(...).addListener('e', cb) |
ObjC [self sendEventWithName:@"e" body:...] Β· Swift sendEvent(withName: "e", ...) Β· Java/Kotlin .emit("e", ...) |
Synthesized cross-language event channel keyed by literal event name |
| Expo Modules | JS requireNativeModule('X').fn(...) |
Swift / Kotlin Module { Name("X"); AsyncFunction("fn") { ... } } |
Parses the Expo DSL literals; synthetic method nodes resolve via existing name-match |
| Fabric view components | JSX <MyView prop={v}/> |
TS Codegen spec + native impl class | Spec β component node; convention-based name+suffix lookup (View/ComponentView/Manager/ViewManager) bridges to native |
| Legacy Paper view managers | JSX <MyView prop={v}/> |
ObjC RCT_EXPORT_VIEW_PROPERTY Β· Java/Kotlin @ReactProp |
Same as Fabric β Paper-era declarations also produce component + property nodes |
Validated on real codebases (small + medium + large for each bridge):
| Bridge | Small | Medium | Large |
|---|---|---|---|
| Swift β ObjC | Charts | realm-swift | Wikipedia-iOS |
| RN legacy bridge | AsyncStorage | react-native-svg | react-native-firebase |
| RN native β JS events | RNGeolocation | β | react-native-firebase |
| Expo Modules | expo-haptics | expo-camera | expo SDK sweep (7 packages) |
| Fabric / Paper views | react-native-segmented-control | react-native-screens | react-native-skia |
Each bridge emits edges tagged provenance:'heuristic' with metadata.synthesizedBy: set to a stable channel name (e.g. swift-objc-bridge, rn-event-channel, fabric-native-impl, expo-module-extract), so the agent can tell at a glance how a hop got into the graph.
npx @colbymchenry/codegraphThe installer will:
- Ask which agent(s) to configure β auto-detects installed ones from: Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, Kiro
- Prompt to install
codegraphon your PATH (so agents can launch the MCP server) - Ask whether configs apply to all your projects or just this one
- Write each chosen agent's MCP server config (the codegraph usage guide is delivered by the MCP server itself, so no instructions file is added to
CLAUDE.md/AGENTS.md/ etc.) - Set up auto-allow permissions when Claude Code is one of the targets
- Initialize your current project (local installs only)
Non-interactive (scripting / CI):
codegraph install --yes # auto-detect agents, install global
codegraph install --target=cursor,claude --yes # explicit target list
codegraph install --target=auto --location=local # detected agents, project-local
codegraph install --print-config codex # print snippet, no file writes| Flag | Values | Default |
|---|---|---|
--target |
auto, all, none, or csv (claude,cursor,...) |
prompt |
--location |
global, local |
prompt |
--yes |
(boolean) | prompt every step |
--no-permissions |
(boolean) skip Claude auto-allow list | permissions on |
--print-config <id> |
dump snippet for one agent and exit | β |
Restart your agent (Claude Code / Cursor / Codex CLI / opencode / Hermes Agent / Gemini CLI / Antigravity IDE / Kiro) for the MCP server to load.
cd your-project
codegraph init -iBuilds the per-project knowledge graph index. A single global codegraph install works in every project you open β no need to re-run the installer per project.
That's it β your agent will use CodeGraph tools automatically when a .codegraph/ directory exists.
Manual Setup (Alternative)
Install globally:
npm install -g @colbymchenry/codegraphAdd to ~/.claude.json:
{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}Add to ~/.claude/settings.json (optional, for auto-allow):
{
"permissions": {
"allow": [
"mcp__codegraph__codegraph_search",
"mcp__codegraph__codegraph_context",
"mcp__codegraph__codegraph_callers",
"mcp__codegraph__codegraph_callees",
"mcp__codegraph__codegraph_impact",
"mcp__codegraph__codegraph_node",
"mcp__codegraph__codegraph_status",
"mcp__codegraph__codegraph_files"
]
}
}Agent Tool Guidance
CodeGraph's MCP server delivers its usage guidance to your agent automatically, in the MCP initialize response β there's no instructions file to manage and nothing is added to your CLAUDE.md / AGENTS.md / GEMINI.md. In short, it tells the agent to:
- Answer structural questions directly with CodeGraph β it is the pre-built index, so a grep/read loop just repeats work it already did. Treat the returned source as already read.
- Pick the tool by intent:
codegraph_contextto map an area,codegraph_tracefor "how does X reach Y",codegraph_exploreto survey several symbols,codegraph_searchto find a symbol,codegraph_callers/codegraph_calleesto walk call flow,codegraph_impactbefore editing,codegraph_nodefor one symbol's source. - Trust the results β don't re-verify with grep, and check the staleness banner after edits.
- If
.codegraph/doesn't exist yet, offer to runcodegraph init -i.
The exact text is src/mcp/server-instructions.ts β the single source of truth.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Claude Code β
β β
β "How does a request reach the database?" β
β calls CodeGraph tools directly β no Explore sub-agent β
β β β
βββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CodeGraph MCP Server β
β β
β context Β· trace Β· explore Β· callers Β· callees Β· impact β
β β β
β βΌ β
β SQLite knowledge graph β
β symbols Β· edges Β· files Β· FTS5 full-text search β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-
Extraction β tree-sitter parses source code into ASTs. Language-specific queries extract nodes (functions, classes, methods) and edges (calls, imports, extends, implements).
-
Storage β Everything goes into a local SQLite database (
.codegraph/codegraph.db) with FTS5 full-text search. -
Resolution β After extraction, references are resolved: function calls β definitions, imports β source files, class inheritance, and framework-specific patterns.
-
Auto-Sync β The MCP server watches your project using native OS file events. Changes are debounced (2-second quiet window), filtered to source files only, and incrementally synced. The graph stays fresh as you code β no configuration needed.
codegraph # Run interactive installer
codegraph install # Run installer (explicit)
codegraph uninstall # Remove CodeGraph from your agents (inverse of install)
codegraph init [path] # Initialize in a project (--index to also index)
codegraph uninit [path] # Remove CodeGraph from a project (--force to skip prompt)
codegraph index [path] # Full index (--force to re-index, --quiet for less output)
codegraph sync [path] # Incremental update
codegraph status [path] # Show statistics
codegraph query <search> # Search symbols (--kind, --limit, --json)
codegraph files [path] # Show file structure (--format, --filter, --max-depth, --json)
codegraph context <task> # Build context for AI (--format, --max-nodes)
codegraph callers <symbol> # Find what calls a function/method (--limit, --json)
codegraph callees <symbol> # Find what a function/method calls (--limit, --json)
codegraph impact <symbol> # Analyze what code is affected by changing a symbol (--depth, --json)
codegraph affected [files...] # Find test files affected by changes (see below)
codegraph serve --mcp # Start MCP serverTraces import dependencies transitively to find which test files are affected by changed source files.
codegraph affected src/utils.ts src/api.ts # Pass files as arguments
git diff --name-only | codegraph affected --stdin # Pipe from git diff
codegraph affected src/auth.ts --filter "e2e/*" # Custom test file pattern| Option | Description | Default |
|---|---|---|
--stdin |
Read file list from stdin | false |
-d, --depth <n> |
Max dependency traversal depth | 5 |
-f, --filter <glob> |
Custom glob to identify test files | auto-detect |
-j, --json |
Output as JSON | false |
-q, --quiet |
Output file paths only | false |
CI/hook example:
#!/usr/bin/env bash
AFFECTED=$(git diff --name-only HEAD | codegraph affected --stdin --quiet)
if [ -n "$AFFECTED" ]; then
npx vitest run $AFFECTED
fiWhen running as an MCP server, CodeGraph exposes these tools to Claude Code:
| Tool | Purpose |
|---|---|
codegraph_search |
Find symbols by name across the codebase |
codegraph_context |
Build relevant code context for a task |
codegraph_trace |
Trace the call path between two symbols ("how does X reach Y") in one call β each hop with its body inline, following dynamic-dispatch hops (callbacks, React re-render, interfaceβimpl) that grep can't |
codegraph_callers |
Find what calls a function |
codegraph_callees |
Find what a function calls |
codegraph_impact |
Analyze what code is affected by changing a symbol |
codegraph_node |
Get details about a specific symbol (optionally with source code) |
codegraph_explore |
Return source for several related symbols grouped by file, plus a relationship map, in one call |
codegraph_files |
Get indexed file structure (faster than filesystem scanning) |
codegraph_status |
Check index health and statistics |
import CodeGraph from '@colbymchenry/codegraph';
const cg = await CodeGraph.init('/path/to/project');
// Or: const cg = await CodeGraph.open('/path/to/project');
await cg.indexAll({
onProgress: (p) => console.log(`${p.phase}: ${p.current}/${p.total}`)
});
const results = cg.searchNodes('UserService');
const callers = cg.getCallers(results[0].node.id);
const context = await cg.buildContext('fix login bug', { maxNodes: 20, includeCode: true, format: 'markdown' });
const impact = cg.getImpactRadius(results[0].node.id, 2);
cg.watch(); // auto-sync on file changes
cg.unwatch(); // stop watching
cg.close();There isn't any β CodeGraph is zero-config, with no config file to write or keep in sync. Language support is automatic from the file extension; there's nothing to wire up per language.
What it skips out of the box:
- Dependency, build, and cache directories β
node_modules,vendor,dist,build,target,.venv,Pods,.next, and the like across every supported stack β so the graph is your code, not third-party noise. This holds even with no.gitignore. - Anything in your
.gitignoreβ honored in git repos via git, and in non-git projects by reading.gitignoredirectly (root and nested). - Files larger than 1 MB β generated bundles, minified JS, vendored blobs.
To keep something else out, add it to .gitignore. To pull a default-excluded
directory back in (say you really do want a vendored dependency indexed),
add a negation β !vendor/. The defaults apply uniformly, so committing a
dependency or build directory doesn't force it into the graph; the .gitignore
negation is the explicit opt-in.
Every release ships a self-contained build (bundled Node runtime β nothing to compile) for all three desktop OSes, on both Intel/AMD (x64) and ARM (arm64):
| Platform | Architectures | Install |
|---|---|---|
| Windows | x64, arm64 | PowerShell installer or npm |
| macOS | x64, arm64 | shell installer or npm |
| Linux | x64, arm64 | shell installer or npm |
See Get Started for the one-line install commands.
The interactive installer auto-detects and configures each of these β wiring up the MCP server (which delivers its own usage guidance, so no instructions file is written):
- Claude Code
- Cursor
- Codex CLI
- opencode
- Hermes Agent
- Gemini CLI
- Antigravity IDE
- Kiro
| Language | Extension | Status |
|---|---|---|
| TypeScript | .ts, .tsx |
Full support |
| JavaScript | .js, .jsx, .mjs |
Full support |
| Python | .py |
Full support |
| Go | .go |
Full support |
| Rust | .rs |
Full support |
| Java | .java |
Full support |
| C# | .cs |
Full support |
| PHP | .php |
Full support |
| Ruby | .rb |
Full support |
| C | .c, .h |
Full support |
| C++ | .cpp, .hpp, .cc |
Full support |
| Objective-C | .m, .mm, .h |
Partial support (classes, protocols, methods, @property, #import, message sends; .mm ObjC++ may parse incompletely) |
| Swift | .swift |
Full support |
| Kotlin | .kt, .kts |
Full support |
| Scala | .scala, .sc |
Full support (classes, traits, methods, type aliases, Scala 3 enums) |
| Dart | .dart |
Full support |
| Svelte | .svelte |
Full support (script extraction, Svelte 5 runes, SvelteKit routes) |
| Vue | .vue |
Full support (script + script-setup extraction, Nuxt page/API/middleware routes) |
| Liquid | .liquid |
Full support |
| Pascal / Delphi | .pas, .dpr, .dpk, .lpr |
Full support (classes, records, interfaces, enums, DFM/FMX form files) |
| Lua | .lua |
Full support (functions, methods with receivers, local variables, require imports, call edges) |
| Luau | .luau |
Full support (everything in Lua, plus type/export type aliases, typed signatures, and Roblox instance-path require) |
"CodeGraph not initialized" β Run codegraph init in your project directory first.
Indexing is slow β Check that node_modules and other large directories are excluded. Use --quiet to reduce output overhead.
MCP hits database is locked β current builds shouldn't: CodeGraph bundles its own Node runtime and uses Node's built-in node:sqlite in WAL mode, where concurrent reads never block on a writer. If you still see it:
- You're on an old (pre-0.9) install. Reinstall to get the bundled runtime β
curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh(macOS/Linux),irm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iex(Windows), ornpm i -g @colbymchenry/codegraph@latest. codegraph statusshowsJournal:other thanwalβ WAL couldn't be enabled on this filesystem (common on network shares and WSL2/mnt), so reads can block on writes. Move the project (with its.codegraph/folder) onto a local disk.
MCP server not connecting β Ensure the project is initialized/indexed, verify the path in your MCP config, and check that codegraph serve --mcp works from the command line.
Missing symbols β The MCP server auto-syncs on save (wait a couple seconds). Run codegraph sync manually if needed. Check that the file's language is supported and isn't inside a .gitignored or default-excluded directory (e.g. node_modules, dist).
MIT
Made for AI coding agents β Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, and Kiro
