graphdb
Indexes Ruby on Rails codebases into a queryable graph, enabling AI agents to explore model associations, routes, callbacks, jobs, mailers, and more through graph-based queries.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@graphdbquery associations User"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
graphdb
A Kùzu-backed code-graph MCP plugin for Claude Code. Indexes Ruby on Rails codebases into a queryable graph of associations, routes, callbacks, jobs, and mailers — a token-efficient alternative to grep for navigating Rails code.
Why
Rails encodes most of its architecture in DSL declarations (has_many,
before_action, resources, include) rather than direct method calls. Grep
matches the strings but cannot turn them into relationships:
Question | Grep | graphdb |
"What models reference User?" | 200+ matches across |
|
"What routes hit | Scan 218-line |
|
"Who delivers |
|
|
"What jobs do | Multi-step grep + read |
|
Status
Proof of concept, validated against a real Rails 8 / Ruby 3.3 codebase
(smart-hub-backend, 494 indexed .rb files):
nodes: 2913 edges: 4731 index time: ~0.8s
60 models 63 controllers 25 concerns 121 services 67 serializers
7 mailers 6 jobs 109 migrations 230 routes 421 actionsValidation against grep ground truth on smart-hub-backend:
Pattern | Grep | Graph | |
| 52 | 52 | exact |
| 79 | 79 | exact |
| 15 | 15 | exact |
| 66 | 66 | exact |
| 11 | 11 | exact |
| 48 lines | 58 edges | each call's rules expand to one edge per rule |
| 46 lines | 377 edges | each filter × N actions in |
Quickstart
# Set up a venv with uv (sidesteps Homebrew's broken ensurepip on macOS)
uv venv .venv --python 3.13
uv pip install --python .venv/bin/python -e .
# Index a Rails project (writes to ~/.cache/graphdb/<repo>-<hash>.kuzu/;
# nothing is written to the target repo)
.venv/bin/graphdb --root /path/to/rails_app index /path/to/rails_app
# CLI queries
.venv/bin/graphdb --root /path/to/rails_app query def User
.venv/bin/graphdb --root /path/to/rails_app query associations User
.venv/bin/graphdb --root /path/to/rails_app query routes Api::V1::UsersController
.venv/bin/graphdb --root /path/to/rails_app query callers UserInviteMailer --depth 2
.venv/bin/graphdb --root /path/to/rails_app query impact ScheduleExecutionJob
.venv/bin/graphdb --root /path/to/rails_app query refs Account
.venv/bin/graphdb --root /path/to/rails_app statsMCP integration with Claude Code
Add to your Claude Code MCP config (~/.claude.json or project-level):
{
"mcpServers": {
"graphdb": {
"command": "/path/to/Graph_DB/.venv/bin/graphdb-mcp",
"env": { "GRAPHDB_ROOT": "/path/to/your/rails_app" }
}
}
}Tools exposed to Claude:
Tool | Answers |
| Where is |
| Who calls/enqueues/delivers |
| All inbound edges to |
| Transitive callers — predicted blast radius |
| File-level summary: exports, imports, hotspots |
| HTTP routes that hit a controller / action |
| All |
| Counts of nodes/edges by kind |
Graph schema
NODE KINDS
file, module, class, method, class_method,
model, controller, action, concern, service, serializer,
job, mailer, validator, helper, channel, error_class,
migration, route, external
EDGE KINDS
Generic Ruby: CONTAINS, CALLS, INHERITS, INCLUDES
Model DSL: HAS_MANY, BELONGS_TO, HAS_ONE, HABTM, VALIDATES, SCOPES
Controllers: BEFORE_ACTION, AFTER_ACTION, SKIP_BEFORE, RENDERS
Routes: HANDLES, MOUNTS
Async: ENQUEUES, DELIVERSHow it works
indexer.pyparses every.rbunderapp/,lib/,config/,db/migrate/with tree-sitter-ruby. Two passes:Pass 1: register every class/module/method as a node, build a qualname index used for resolution.
Pass 2: walk again, emit
INHERITS,INCLUDES,CALLS, and the Rails-specific edges (HAS_MANY,BEFORE_ACTION,ENQUEUES, etc.)Pass 3: a separate walker handles
config/routes.rb(DSL outside any class), producingRoutenodes withHANDLESedges to controller actions.
graph.pybuffers nodes/edges in memory and bulk-flushes via CypherUNWINDat end of indexing. Drops full-repo indexing from ~8 minutes (individual inserts) to ~0.8 seconds.queries.pyissues Cypher patterns likeMATCH (caller)-[:CALLS|ENQUEUES|DELIVERS*1..3]->(target)— the database does the BFS.mcp_server.pyexposes the queries as MCP tools for Claude Code.
Known PoC limitations
Static parsing only. Doesn't run Rails — no type inference, no resolution of
define_method/method_missing/ dynamicclass_eval.Relative imports / autoload constants: resolved by unique-name fallback; ambiguous names are skipped silently.
Custom DSLs (acts_as_paranoid, paper_trail's
has_paper_trail, amoeba): not yet specialized — they emit genericCALLSedges at class scope.Routes:
scope, member/collection custom routes,constraints,concerns(route concerns), nested resources past 1 level — partial or skipped. The 7 standard REST actions,namespace,mount,devise_for, andget/post/...withto:work fully.Reindex is one-shot. Edit a file, rerun
graphdb index. No file watcher.
Roadmap
Specialize the major Gemfile DSLs in smart-hub-backend (paper_trail, discard, amoeba, flipper).
Member / collection / nested resource routes.
Incremental reindex via file-watcher.
AI-generated per-method summaries stored on nodes (read summary first, file second).
Benchmark harness: grep-only vs graph-only Claude sessions on identical tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Samagra001/claude-code-graphdb'
If you have feedback or need assistance with the MCP directory API, please join our Discord server