mcp-repo-graph
repo-graph
AIコーディングアシスタントのための構造グラフメモリ。 コードベースをマッピングし、構造に基づいてナビゲートし、重要な部分だけを読み取ります。
repo-graphは、LLMにコードベースの地図(エンティティ、関係性、フロー)を提供します。これにより、LLMはすべてを先に読み込むことなく、適切なファイルへナビゲートできるようになります。
コードベース全体をLLMのコンテキストウィンドウに詰め込んだり(あるいは推測に頼ったり)する代わりに、repo-graphは何が存在し、どのように接続され、どこがエントリポイントなのかを示す軽量なグラフを構築します。LLMはグラフにクエリを投げ、必要な最小限のファイルセットを見つけ出し、それらのみを読み取ります。
デモ
https://github.com/user-attachments/assets/a1e4171b-b225-40d4-9210-39453e14b76a
https://github.com/user-attachments/assets/fc3191e5-fc35-4bd7-8372-72af55995883
同じバグ、同じモデル、同じプロンプトでも、repo-graphがインストールされているかどうかで結果が異なります。
タスク: Go + Angularのモノレポ(566ノード、620エッジ)における逆転した比較演算子の修正。
repo-graphなし | repo-graphあり | |
使用トークン数 | 75,308 | 29,838 |
修正までの時間 | 4分36秒 | 約30秒 |
探索ファイル数 | 約15(grep、読み込み、grep、読み込み...) | 2(フロー検索 + ハンドラーファイル) |
結果 | バグを発見し修正 | バグを発見し修正 |
トークン数は2.5倍削減。速度は約9倍向上。同じ正確な修正。
テストの実行方法
比較を公平に保つため、両方の実行で同一の条件を使用しました:
同じモデル: Claude Opus, 100% (Haikuルーティングなし)
同じプロンプト: "最近作成されたグループが「閉鎖」と表示され、古いグループが「オープン」と表示されています。これは逆です。新しいグループはメンバーが参加できるように「オープン」であるべきです。バグを見つけて修正してください。"
クリーンなコンテキスト: 各実行は、以前の会話がない
/clearから開始他のツールなし: 両方の実行でCLAUDE.md、プラグイン、フック、その他すべてのMCPサーバーを削除しました。唯一の変数はrepo-graphがインストールされているかどうかのみです
ヒントなし: プロンプトは症状を説明しているだけで場所は示していません。Claudeは自力で
group_controller.go:57を見つける必要があります
repo-graphなしでは、Claudeはキーワードをgrepし、ファイルを読み込み、再度grepし、さらにファイルを読み込み、最終的にバグを絞り込みます。repo-graphがあれば、Claudeは flow("groups") を呼び出し、正確なハンドラー関数とファイルを取得し、それを読み込んで修正します。
FastAPI, Gin, Hono, NestJS の 事前生成された例 を参照してください。インストール不要で実際のグラフ出力を確認できます。
問題点
コードを扱うLLMは、コンテキストの大部分を方向性の把握に浪費しています:
無関係と判明するファイルの読み込み
異なる言語間のコンポーネントの接続を見落とす
機能がどこから始まり、何に影響するのかが不明
5ファイルで済むはずの作業で50ファイルを読み込む
これはコストがかかり、低速であり、コードベースが成長するにつれて悪化します。
repo-graphによる解決策
repo-graphはコードベースを一度スキャンし、以下のグラフを構築します:
エンティティ: モジュール、パッケージ、クラス、関数、ルート、サービス、コンポーネント
関係性: インポート、呼び出し、ハンドリング、定義、包含
フロー: エントリポイントからデータ層までのエンドツーエンドのパス
そして、LLMが以下のことを行える12のMCPツールを提供します:
方向性の把握 — "このリポジトリにはどんな言語があるか?主な機能は何か?"
ナビゲーション — "ルートからデータベースまでのログインフローを追跡する" / "UserServiceと決済APIの最短パスは?"
スコープの特定 — "この機能を理解するには何行読む必要があるか?" / "このバグ修正に必要なファイルだけを教えて"
評価 — "この関数を変更した場合の影響範囲は?" / "どのファイルが最大のメンテナンスリスクか?"
LLMは数千行を読み込む代わりに、数百トークンで構造的なコンテキストを得ることができます。
対応言語
言語 | 検出方法 | 抽出内容 |
Go |
| パッケージ、関数、HTTPルート (gin/echo/chi/stdlib)、インポート |
Rust |
| クレート、モジュール、構造体、トレイト、関数、ルート (Actix/Rocket/Axum) |
TypeScript |
| モジュール、クラス、関数、インポート関係 |
React |
| コンポーネント、フック、コンテキストプロバイダー、React Routerルート、fetch/axios呼び出し、フロー |
Angular |
| コンポーネント、サービス、ガード、DIインジェクション、HTTP呼び出し、機能フロー |
Python |
| パッケージ、モジュール、クラス、関数、ルート (Flask/FastAPI/Django) |
Java/Kotlin |
| パッケージ、クラス、ルート (Spring/JAX-RS) |
C#/.NET |
| 名前空間、クラス、ルート (ASP.NET/Minimal API) |
Ruby |
| ファイル、クラス、モジュール、ルート (Rails) |
PHP |
| 名前空間、クラス、インターフェース、ルート (Laravel/Symfony) |
Swift |
| ファイル、型 (class/struct/enum/protocol/actor)、ルート (Vapor) |
C/C++ |
| ソース、ヘッダー、クラス、構造体、列挙型、名前空間、インクルード |
SCSS |
| ファイルレベルの肥大化分析 (セレクタブロック、サイズ) |
複数のアナライザーが1つのリポジトリに一致する場合があります(例:Goバックエンド + Angularフロントエンド + SCSS)。それぞれがノードとエッジを単一の統合グラフに提供します。
インストール
pip install mcp-repo-graphPython 3.11以上が必要です。唯一のランタイム依存関係は mcp[cli] です。
クイックスタート
1. グラフの生成
repo-graph-generate --repo /path/to/your/projectこれによりコードベースがスキャンされ、ターゲットリポジトリ内の .ai/repo-graph/ にグラフデータが書き込まれます。
2. AIアシスタントへの接続
MCP設定に追加します:
Claude Code (~/.claude/claude_code_config.json またはプロジェクトの .mcp.json):
{
"mcpServers": {
"repo-graph": {
"command": "repo-graph",
"args": ["--repo", "/path/to/your/project"]
}
}
}環境変数を使用する場合:
{
"mcpServers": {
"repo-graph": {
"command": "repo-graph",
"env": { "REPO_GRAPH_REPO": "/path/to/your/project" }
}
}
}3. 使用方法
AIアシスタントは12個すべてのツールにアクセスできるようになります。回答可能なクエリの例:
"このコードベースは何をするもの?" ->
statusツール"チェックアウトフローを追跡して" ->
flowツール"UserServiceを変更したら何が壊れる?" ->
impactツール"このバグに必要なファイルはどれ?" ->
minimal_readツール"このファイルは大きすぎる、どう分割すべき?" ->
split_planツール"認証フローを視覚的に見せて" ->
graph_viewツール
4. gitフックで最新の状態に保つ(推奨)
repo-graph-generate をプリコミットフックに追加して、グラフが自動的に最新の状態に保たれるようにします。再生成にLLMのコンテキストを消費することはありません:
# .git/hooks/pre-commit (or add to your existing hook)
#!/bin/sh
repo-graph-generate --repo .
git add .ai/repo-graph/chmod +x .git/hooks/pre-commitコミットするたびにグラフが最新になります。LLMは generate にトークンを無駄にすることなく、常に最新の地図を持つことができます。
ヒント: バージョン管理にグラフデータを含めたくない場合は、
.gitignoreに.ai/repo-graph/を追加し、git addの行をスキップしてください。グラフはローカルのみに存在します。
MCPツールリファレンス
生成
ツール | パラメータ | 説明 |
| (なし) | コードベースをゼロからスキャンし、グラフを再構築してリロード |
| (なし) | ディスクからグラフデータをリロード (外部の |
ナビゲーション
ツール | パラメータ | 説明 |
| (なし) | リポジトリの概要: git状態、検出された言語、エンティティ数、利用可能なフロー |
|
| 機能のエンドツーエンドフロー — エントリポイントからサービス層を経てデータ層まで |
|
| グラフ内の任意の2ノード間の最短パス |
|
| ノードから展開し、何に影響を与えるか、または何に依存しているかを確認 |
|
| ノードへのすべての直接的な接続 |
コンテキスト予算管理
ツール | パラメータ | 説明 |
|
| 機能フロー内の全ファイルの合計行数 |
|
|
|
|
| 機能内の特定のタスクに必要な最小限のファイルセット |
健康状態分析
ツール | パラメータ | 説明 |
|
| ファイルの内部構造: サイズでランク付けされた関数/メソッド、型数 |
|
| 肥大化したファイルを責任ごとにグループ化して分割するための具体的な提案 |
|
| 機能フロー、ノード近傍、またはグラフ全体の視覚的なASCIIマップ |
仕組み
検出 —
scan_project_dirs()がプロジェクトルート(packages/*,apps/*,services/*,src/*などのモノレポレイアウトを含む)を見つけます。各アナライザーがマーカーファイルを確認します。スキャン — 一致するアナライザーが正規表現ヒューリスティックを使用してエンティティと関係性を抽出します。AST解析や外部ツールチェーン、ビルドステップは不要です。
マージ — すべてのアナライザーの結果が単一のグラフにマージされます。ノードはIDで、エッジは (from, to, type) で重複排除されます。
提供 — MCPサーバーがグラフをメモリにロードし、BFSベースのトラバーサルツールを公開します。
グラフデータ形式
生成されたファイルはターゲットリポジトリ内の .ai/repo-graph/ に配置されます:
nodes.json—[{id, type, name, file_path}, ...]edges.json—[{from, to, type}, ...]flows/*.yaml— 順序付けられたステップシーケンスを持つ名前付き機能フローstate.md— 素早い把握のための人間が読めるスナップショット
エッジタイプ: imports, defines, contains, uses, calls, handles, handled_by, exports, includes。
新しいアナライザーの追加
repo_graph/analyzers/<language>.py を作成します:
from .base import AnalysisResult, Edge, LanguageAnalyzer, Node, scan_project_dirs, rel_path, read_safe
class MyLangAnalyzer(LanguageAnalyzer):
@staticmethod
def detect(repo_root):
# Check for language marker files
return any(
(d / "my-marker").exists()
for d in scan_project_dirs(repo_root)
)
def scan(self):
nodes, edges = [], []
# ... scan files, extract entities, build relationships ...
return AnalysisResult(
nodes=nodes,
edges=edges,
state_sections={"MyLang": f"{len(nodes)} entities\n"},
)
# Optional: file-level analysis for bloat_report / split_plan
def supported_extensions(self):
return {".mylang"}
def analyze_file(self, file_path):
# Return dict with function/method sizes, class counts, etc.
pass
def format_bloat_report(self, analysis):
# Format the analysis dict into a human-readable string
passanalyzers/__init__.py の _analyzer_classes() に追加して登録します。
ライセンス
MIT
サポート
repo-graphが時間の節約になった場合は、コーヒーを一杯おごることを検討してください。
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/James-Chahwan/repo-graph'
If you have feedback or need assistance with the MCP directory API, please join our Discord server