mcp-repo-graph
repo-graph
Memoria de grafo estructural para asistentes de programación por IA. Mapea tu base de código. Navega por estructura. Lee solo lo que importa.
repo-graph proporciona a los LLM un mapa de tu base de código —entidades, relaciones y flujos— para que puedan navegar a los archivos correctos sin tener que leer todo primero.
En lugar de inundar la ventana de contexto de un LLM con toda tu base de código (o esperar que adivine correctamente), repo-graph construye un grafo ligero de lo que existe, cómo se conectan las cosas y dónde están los puntos de entrada. El LLM consulta el grafo, encuentra el conjunto mínimo de archivos que necesita y lee solo esos.
Demo
https://github.com/user-attachments/assets/a1e4171b-b225-40d4-9210-39453e14b76a
https://github.com/user-attachments/assets/fc3191e5-fc35-4bd7-8372-72af55995883
Mismo error, mismo modelo, mismo prompt: la única diferencia es si repo-graph está instalado.
La tarea: corregir un operador de comparación invertido en un monorepo de Go + Angular (566 nodos, 620 aristas).
Sin repo-graph | Con repo-graph | |
Tokens usados | 75,308 | 29,838 |
Tiempo de corrección | 4m 36s | ~30s |
Archivos explorados | ~15 (grep, leer, grep, leer...) | 2 (búsqueda de flujo + archivo manejador) |
Resultado | Encontró y corrigió el error | Encontró y corrigió el error |
2.5 veces menos tokens. ~9 veces más rápido. La misma corrección correcta.
Cómo se ejecutó la prueba
Ambas ejecuciones utilizaron condiciones idénticas para mantener la comparación justa:
Mismo modelo: Claude Opus, 100% (sin enrutamiento Haiku)
Mismo prompt: "Los grupos que se crearon recientemente aparecen como cerrados, y los grupos antiguos aparecen como abiertos. Esto está al revés: los grupos nuevos deberían estar abiertos para que los miembros se unan. Encuentra y corrige el error."
Contexto nuevo: cada ejecución comenzó desde
/clearsin conversación previaSin otras herramientas: CLAUDE.md, plugins, hooks y todos los demás servidores MCP fueron eliminados para ambas ejecuciones; la única variable fue si repo-graph estaba instalado
Sin pistas: el prompt describe el síntoma, no la ubicación; Claude tiene que encontrar
group_controller.go:57por su cuenta
Sin repo-graph, Claude busca palabras clave con grep, lee archivos, vuelve a buscar, lee más archivos y finalmente reduce el alcance hasta el error. Con repo-graph, Claude llama a flow("groups"), obtiene exactamente la función manejadora y el archivo, lo lee y lo corrige.
Explora ejemplos pregenerados para FastAPI, Gin, Hono y NestJS: salida de grafo real que puedes inspeccionar sin instalar nada.
El problema
Los LLM que trabajan con código desperdician la mayor parte de su contexto en la orientación:
Leer archivos que resultan ser irrelevantes
Perder conexiones entre componentes en diferentes lenguajes
No saber dónde comienza una característica o qué toca
Cargar 50 archivos cuando 5 serían suficientes
Esto es costoso, lento y empeora a medida que crecen las bases de código.
Cómo lo resuelve repo-graph
repo-graph escanea tu base de código una vez y construye un grafo de:
Entidades: módulos, paquetes, clases, funciones, rutas, servicios, componentes
Relaciones: importaciones, llamadas, manejadores, definiciones, contenedores
Flujos: rutas de extremo a extremo desde el punto de entrada hasta la capa de datos
Luego expone 12 herramientas MCP que permiten al LLM:
Orientarse — "¿Qué lenguajes hay en este repositorio? ¿Cuáles son las características principales?"
Navegar — "Rastrea el flujo de inicio de sesión desde la ruta hasta la base de datos" / "¿Cuál es el camino más corto entre UserService y la API de pagos?"
Delimitar — "¿Cuántas líneas tendría que leer para entender esta característica?" / "Dame solo los archivos que necesito para esta corrección de error"
Evaluar — "¿Cuál es el radio de impacto de cambiar esta función?" / "¿Qué archivos representan los mayores riesgos de mantenimiento?"
El LLM obtiene contexto estructural en unos pocos cientos de tokens en lugar de leer miles de líneas.
Lenguajes soportados
Lenguaje | Detección | Qué extrae |
Go |
| Paquetes, funciones, rutas HTTP (gin/echo/chi/stdlib), importaciones |
Rust |
| Crates, módulos, structs, traits, funciones, rutas (Actix/Rocket/Axum) |
TypeScript |
| Módulos, clases, funciones, relaciones de importación |
React |
| Componentes, hooks, proveedores de contexto, rutas de React Router, llamadas fetch/axios, flujos |
Angular |
| Componentes, servicios, guards, inyección DI, llamadas HTTP, flujos de características |
Python |
| Paquetes, módulos, clases, funciones, rutas (Flask/FastAPI/Django) |
Java/Kotlin |
| Paquetes, clases, rutas (Spring/JAX-RS) |
C#/.NET |
| Namespaces, clases, rutas (ASP.NET/Minimal API) |
Ruby |
| Archivos, clases, módulos, rutas (Rails) |
PHP |
| Namespaces, clases, interfaces, rutas (Laravel/Symfony) |
Swift |
| Archivos, tipos (class/struct/enum/protocol/actor), rutas (Vapor) |
C/C++ |
| Fuentes, cabeceras, clases, structs, enums, namespaces, includes |
SCSS | Archivos | Análisis de peso a nivel de archivo (bloques de selector, tamaños) |
Se pueden combinar varios analizadores en un mismo repositorio (ej. backend en Go + frontend en Angular + SCSS). Cada uno contribuye con sus nodos y aristas a un único grafo unificado.
Instalación
pip install mcp-repo-graphRequiere Python 3.11+. Única dependencia de tiempo de ejecución: mcp[cli].
Inicio rápido
1. Generar el grafo
repo-graph-generate --repo /path/to/your/projectEsto escanea la base de código y escribe los datos del grafo en .ai/repo-graph/ dentro del repositorio objetivo.
2. Conectar a tu asistente de IA
Añade a tu configuración de MCP:
Claude Code (~/.claude/claude_code_config.json o .mcp.json del proyecto):
{
"mcpServers": {
"repo-graph": {
"command": "repo-graph",
"args": ["--repo", "/path/to/your/project"]
}
}
}Con variable de entorno:
{
"mcpServers": {
"repo-graph": {
"command": "repo-graph",
"env": { "REPO_GRAPH_REPO": "/path/to/your/project" }
}
}
}3. Usarlo
El asistente de IA ahora tiene acceso a las 12 herramientas. Ejemplos de consultas que puede responder:
"¿Qué hace esta base de código?" -> herramienta
status"Rastrea el flujo de pago" -> herramienta
flow"¿Qué se rompería si cambio UserService?" -> herramienta
impact"¿Qué archivos necesito para este error?" -> herramienta
minimal_read"Este archivo es demasiado grande, ¿cómo debería dividirlo?" -> herramienta
split_plan"Muéstrame el flujo de autenticación visualmente" -> herramienta
graph_view
4. Mantenerlo actualizado con un git hook (recomendado)
Añade repo-graph-generate a un hook de pre-commit para que el grafo se mantenga actualizado automáticamente; no se gasta contexto del LLM en la regeneración:
# .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-commitCada commit mantiene el grafo al día. El LLM siempre tiene un mapa fresco sin desperdiciar ni un solo token en generate.
Consejo: Si no quieres datos de grafo en el control de versiones, añade
.ai/repo-graph/a.gitignorey omite la líneagit add; el grafo simplemente vivirá localmente.
Referencia de herramientas MCP
Generación
Herramienta | Parámetros | Descripción |
| (ninguno) | Escanea la base de código desde cero, reconstruye el grafo y recarga |
| (ninguno) | Recarga los datos del grafo desde el disco (después de un |
Navegación
Herramienta | Parámetros | Descripción |
| (ninguno) | Resumen del repo: estado de git, lenguajes detectados, conteo de entidades, flujos disponibles |
|
| Flujo de extremo a extremo para una característica: desde el punto de entrada a través de la capa de servicio hasta los datos |
|
| Camino más corto entre dos nodos cualesquiera en el grafo |
|
| Expansión desde un nodo para ver qué afecta o de qué depende |
|
| Todas las conexiones directas hacia y desde un nodo |
Presupuesto de contexto
Herramienta | Parámetros | Descripción |
|
| Conteo total de líneas para todos los archivos en el flujo de una característica |
|
| Archivos clasificados por |
|
| Conjunto mínimo de archivos necesarios para una tarea específica dentro de una característica |
Análisis de salud
Herramienta | Parámetros | Descripción |
|
| Estructura interna de un archivo: funciones/métodos clasificados por tamaño, conteo de tipos |
|
| Sugerencias concretas para dividir un archivo sobredimensionado, agrupadas por responsabilidad |
|
| Mapa ASCII visual de un flujo de característica, vecindad de nodos o resumen completo del grafo |
Cómo funciona
Detectar —
scan_project_dirs()encuentra las raíces del proyecto (incluyendo diseños de monorepo comopackages/*,apps/*,services/*,src/*). Cada analizador busca sus archivos marcadores.Escanear — los analizadores coincidentes extraen entidades y relaciones usando heurísticas de expresiones regulares. Sin análisis AST, sin cadenas de herramientas externas, sin paso de compilación requerido.
Fusionar — todos los resultados de los analizadores se fusionan en un único grafo. Los nodos se desduplican por ID, las aristas por (desde, hacia, tipo).
Servir — el servidor MCP carga el grafo en memoria y expone herramientas de recorrido basadas en BFS.
Formato de datos del grafo
Los archivos generados viven en .ai/repo-graph/ dentro del repositorio objetivo:
nodes.json—[{id, type, name, file_path}, ...]edges.json—[{from, to, type}, ...]flows/*.yaml— flujos de características nombrados con secuencias de pasos ordenadasstate.md— instantánea legible por humanos para una orientación rápida
Tipos de aristas: imports, defines, contains, uses, calls, handles, handled_by, exports, includes.
Añadir un nuevo analizador
Crea repo_graph/analyzers/<lenguaje>.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
passRegístralo en analyzers/__init__.py añadiéndolo a _analyzer_classes().
Licencia
MIT
Soporte
Si repo-graph te ahorró tiempo, considera invitarme a un café.
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