loading…
Search for a command to run...
loading…
Transforms codebases into a knowledge graph for AI agents, enabling semantic search, impact analysis, and persistent session memory with up to 94% token savings
Transforms codebases into a knowledge graph for AI agents, enabling semantic search, impact analysis, and persistent session memory with up to 94% token savings.
AI coding assistants lose context between sessions. They re-read the same files, re-learn your codebase, and burn tokens on questions they've already answered.
| Approach | Tokens Used | What Happens |
|---|---|---|
| Traditional | 9,216 |
grep → read 5 files → hope for the best |
| GraphHub | 507 |
get_context("functionName") → done ✓ |
94% fewer tokens. Same answer. Every time.
npm install graphhub
One command. GraphHub auto-detects every AI agent on your machine and writes to their global configs — no per-project setup, ever.
npx graphhub setup # auto-detect + install present clients
npx graphhub setup --force # install for all 5 clients regardless
npx graphhub setup --client claude-code,kilo-cli # pick specific clients
npx graphhub setup --dry-run # preview what would be installed
npx graphhub setup --list # list all supported clients
npx graphhub uninstall-all # remove from all clients
git clone https://github.com/slnquangtran/Graph-Hub.git
cd Graph-Hub && npm install
npm run index -- /path/to/your/project
npm run setup -- /path/to/your/project
Your Source Code
│
▼
┌─────────────────┐ ┌──────────────────┐
│ Tree-sitter │────▶│ KuzuDB Graph DB │
│ AST Parser │ │ │
│ TS · JS · PY │ │ File ──CONTAINS─▶ Symbol
└─────────────────┘ │ Symbol ──CALLS──▶ Symbol
│ │ File ──IMPORTS──▶ File
▼ │ Symbol ──INHERITS▶ Symbol
┌─────────────────┐ └────────┬─────────┘
│ Local Embeddings│ │
│ (MiniLM-L6-v2) │ ┌──────▼──────────┐
│ No API needed │ │ MCP Server │
└─────────────────┘ │ REST API :9000 │
│ Dashboard :5173│
└─────────────────┘
| Agent | Global Config | Status |
|---|---|---|
~/.claude/settings.json |
✅ Full support | |
~/.config/opencode/opencode.json |
✅ Full support | |
~/.gemini/settings.json |
✅ Full support | |
~/.antigravity/mcp.json |
✅ Full support | |
~/.config/kilo/kilo.json |
✅ Full support |
Real measurements on GraphHub's own codebase — not synthetic benchmarks.
| Task | Without GraphHub | With GraphHub | Savings |
|---|---|---|---|
| Find function callers | 9,216 | 507 | 🟢 94% |
| Impact analysis | 7,281 | 673 | 🟢 91% |
| List file symbols | 2,745 | 322 | 🟢 88% |
| Search code logic | 2,115 | 759 | 🟡 64% |
| Codebase overview | 2,381 | 1,389 | 🟡 42% |
| Total | 23,738 | 3,650 | 🚀 85% |
Result: 5× more tasks in the same context window.
GraphHub registers 27 MCP tools across 7 categories. Click each to expand.
// Natural language → code
semantic_search({ query: "authentication validation", mode: "hybrid" })
// Exact or fuzzy symbol name
search_by_name({ name: "validateToken" })
// Results grouped by file
search_grouped({ query: "error handling middleware" })
// Cosine-similar symbols
find_similar({ name: "parseRequest", top_k: 5 })
// Explain which strategy was chosen
explain_search({ query: "jwt token refresh" })
// Callers + callees of a symbol
get_context({ name: "validateToken" })
// Full blast radius before you edit
impact_analysis({ name: "handleRequest" })
// Callers/callees for many symbols at once
batch_context({ names: ["validateToken", "handleRequest", "parseBody"] })
// Symbols in git-changed files + risk buckets
changed_symbols({ diff: "staged" })
// Raw Cypher for power users
query_graph({ cypher: "MATCH (s:Symbol)-[:CALLS]->(t) RETURN s.name, t.name LIMIT 20" })
// All symbols in a file
get_file_symbols({ path: "src/services/auth/token.ts" })
// RAG search + context + impact + next steps in one call
debug_trace({ query: "null pointer in auth middleware", top_k: 3 })
// Find functions/classes nobody calls — safe to delete?
find_dead_code({ kinds: ["function", "method"] })
// Find near-duplicate implementations (uses stored embeddings, no API cost)
find_duplicates({ name: "validateToken", min_similarity: 0.85, cross_file_only: true })
// Detect circular import chains and mutual-recursion call cycles
find_cycles({ type: "both", max_length: 3 })
// Save a learning
remember({ content: "Auth uses JWT with 15m TTL", type: "learning", project: "myapp" })
// Retrieve by similarity
recall({ query: "how does auth work?" })
// Chronological view
timeline({ limit: 20, project: "myapp" })
// Update or delete
update_observation({ id: "abc-123", content: "Updated: now uses refresh tokens" })
forget({ project: "myapp", type: "learning" })
// Linked to specific symbols
related_observations({ symbol: "validateToken" })
// Store a bug fix pattern
remember_bugfix({
symptom: "TypeError: Cannot read property user of undefined",
root_cause: "req.session was null on the /guest route",
fix: "Added session guard at middleware entry",
})
// Recall by symptom similarity — even next week
recall_bugfix({ symptom: "undefined user property on guest route" })
// Cache which skill worked for a task
remember_skill_choice({
task_description: "rename a function safely across the repo",
skill_path: ".claude/skills/refactoring/SKILL.md",
outcome: "success",
})
// Route future similar tasks to the same skill
recall_skill_choice({ task_description: "rename a symbol in multiple files" })
🧩 Core Intelligence
|
🚀 Developer Experience
|
| Language | Support | Parser |
|---|---|---|
| TypeScript / TSX | ✅ Full | Tree-sitter AST |
| JavaScript / JSX | ✅ Full | Tree-sitter AST |
| Python | ✅ Full | Tree-sitter AST |
| Go · Rust · Java | ⚡ Partial | Text chunker |
| Markdown · Shell | ✅ Full | Text chunker |
npx graphhub setup
Auto-detects and writes to each agent's global config — no per-project setup needed.
| Client | Global Config File |
|---|---|
| Claude Code | ~/.claude/settings.json |
| OpenCode | ~/.config/opencode/opencode.json |
| Gemini CLI | ~/.gemini/settings.json |
| Antigravity | ~/.antigravity/mcp.json |
| Kilo CLI | ~/.config/kilo/kilo.json |
Existing keys are preserved — only the graphhub entry is added or updated. Use --force to install for agents that aren't yet present. A postinstall hook runs automatically after npm install graphhub; opt out with GRAPHHUB_NO_INSTALL=1, CI=1, or npm_config_global=true.
npm run install-claude
Adds PreToolUse/PostToolUse hooks and updates CLAUDE.md. The setup command above covers MCP config only.
{
"mcpServers": {
"graphhub": {
"command": "npx",
"args": ["tsx", "src/index.ts", "serve"],
"cwd": "/path/to/graphhub"
}
}
}
| Command | Description |
|---|---|
npm run index -- <dir> |
Index a directory into the knowledge graph |
npm run serve |
Start MCP server (stdio) |
npm run serve-api |
Start REST API on port 9000 |
npm run dashboard |
Start API + React dashboard |
npm run report |
Generate GRAPH_REPORT.md |
npm run visualize |
Export graph to Mermaid format |
npm run setup |
Configure all supported MCP clients |
npm run uninstall-all |
Remove GraphHub from all clients |
npm run install-claude |
Configure Claude Code hooks + CLAUDE.md (legacy) |
npm test |
Run 77-test suite |
| Component | Technology |
|---|---|
| Parser | web-tree-sitter (WASM) |
| Database | KuzuDB (embedded graph) |
| Embeddings | @xenova/transformers · all-MiniLM-L6-v2 |
| MCP | @modelcontextprotocol/sdk |
| API | Express.js |
| Dashboard | React + Vite + React Flow |
| Tests | Vitest · 77 tests |
debug_trace and bulk batch_context.gitignore support (cross-platform, including Windows path normalization)close() releases the file lock on MCP server, watch mode, and CLI exitComing next:
find_dead_code)find_duplicates)find_cycles)find_dead_code — Find functions, methods, and classes with zero callers. Common entry-point patterns (main, init, onX, handleX…) are filtered automatically; pass include_entry_points: true to see everything.find_duplicates — Find near-duplicate implementations of any symbol using stored cosine embeddings. No API cost — works offline. Supports min_similarity threshold and cross_file_only filter.find_cycles — Detect circular import chains and mutual-recursion call cycles up to length 3. Reports each cycle as an ordered list of file paths (import) or symbol names (call).~/.claude/, ~/.gemini/, etc.) so one npx graphhub setup --force covers every project without per-project setup~/.config/kilo/kilo.json)graphhubDir fix — npx graphhub setup now correctly resolves the package location from import.meta.url instead of process.cwd() (which pointed to the user's project, causing broken MCP server paths)<project>/.gemini/ instead of ~/.gemini/; fixed to use home dir.gitignore support — cross-platform path normalization (fixes Windows \ vs / mismatch)import { foo as bar } now stores foo as the specifier, fixing cross-file call graph edgestoLower(s.name) CONTAINS query)forget() safety — requires at least one filter; no longer silently deletes all observationsget_file_symbols — fixed: was returning an empty object (raw DB cursor)count() results coerced to Number; JSON.stringify no longer throws on statsContributions are welcome! Feel free to open an issue or submit a PR.
git clone https://github.com/slnquangtran/Graph-Hub.git
cd Graph-Hub && npm install
npm test # run 77 tests
npm run index -- ./src # index GraphHub itself
| 100% Local | All data stays in .graphhub/ in your project — nothing leaves your machine |
| No External APIs | Embeddings are generated locally with @xenova/transformers |
| No Telemetry | Zero network calls during indexing or querying |
ISC © 2024
If GraphHub saves you tokens, a ⭐ star helps others find it.
Run in your terminal:
claude mcp add graphhub -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.