repo-graph
repo-graph MCP server
AI 코딩 어시스턴트를 위한 구조 그래프 메모리. 코드베이스를 매핑하고, 구조로 탐색하며, 중요한 정보만 읽습니다.
repo-graph는 대규모 언어 모델(LLM)에게 코드베이스의 지도—엔티티(entities), 관계(relationships), 흐름(flows)—를 제공하여, 모든 것을 먼저 읽지 않고도 올바른 파일로 탐색할 수 있게 합니다.
전체 코드베이스로 LLM의 컨텍스트 윈도우(context window)를 채우거나 (혹은 모델이 정확히 추측하기를 바라는 대신), repo-graph는 존재하는 것, 사물들이 어떻게 연결되는지, 진입점(entry points)이 어디인지를 담은 가벼운 그래프를 구축합니다. LLM은 이 그래프에 쿼리하여 필요한 최소한의 파일 세트를 찾고, 오직 그 파일들만 읽습니다.
이 도구는 수동으로 처리하기 가장 어려운 곳에서 가장 큰 효과를 발휘합니다: 즉, 여러 언어에 걸친 대규모 저장소(large repos), 모노레포(monorepos), 그리고 기능의 경로가 파일, 스택, 서비스 경계를 가로지르는 다중 서비스 시스템입니다. 작고 단일 언어로 된 프로젝트에서는 모델이 단순히 파일을 읽을 수 있으므로, 실제 적합한 사용처는 Where it fits best를 참조하십시오.
원클릭 설치:
Install in VS Code
Install in VS Code Insiders
Add to Cursor
또는 터미널에서 단 하나의 명령어로 모든 에이전트를 연결할 수 있습니다: uvx mcp-repo-graph install (설치(Install) 참조).
0.5.4로 업그레이드하기
대부분의 사용자는 아무것도 할 필요가 없습니다. uvx와 pip install mcp-repo-graph를 사용하면 새로운 엔진(glia 0.5.7, 정확히 고정됨)이 로드됩니다. 각 저장소에서 처음 시작할 때 모든 것을 한 번 다시 구문 분석합니다. 여섯 가지 도구와 인수는 동일합니다.
다음 두 가지 경우에만 조치가 필요합니다:
.glia/overlay.toml에 수동으로 구절을 작성한 경우. 직접 작성한 모든 [[wrapper]], [constants], 및 [[route_prefix]] 구절에 origin = "human"을 추가해야 합니다. 표시되지 않은 구절은 이제 모델이 작성한 것으로 간주되며, 이 구절이 생성하는 링크는 휴리스틱(heuristic) 순위가 매겨집니다.
- 동일한 저장소에서 glia 자체의 CLI 훅을 실행하는 경우. CLI도
v0.5.7로 재설치해야 합니다. 그렇지 않으면 두 가지가 커밋할 때마다 서로의 캐시를 다시 빌드하게 됩니다.
개선된 점: MCP 서버(Python의 @mcp.tool(), TypeScript SDK의 McpServer)는 호스트로 읽히므로, 해당 도구 함수들은 데드 코드(dead code)가 아니라 진입점(entry point)이 됩니다. 선언된 모든 진입점(호스트 시작, 스크립트, __main__ 가드)은 이제 흐름을 시작합니다. Rails 중첩 리소스, C#의 [HttpX] + [Route] 액션, Angular 지연 로드 경로(lazy routes), 그리고 Solidity 이벤트가 올바르게 작동합니다. 테스트-코드 페어링과 Python 속성은 노이즈가 줄었습니다.
0.5.3으로 업그레이드하기
대부분의 사용자는 아무것도 할 필요가 없습니다. uvx와 pip install mcp-repo-graph를 사용하면 새로운 엔진(glia 0.5.6, 정확히 고정됨)이 로드됩니다. 각 저장소에서 처음 시작할 때 모든 것을 한 번 다시 구문 분석합니다.
알아차릴 수 있는 세 가지 변경 사항이 있습니다:
impact는 넓은 범위를 개요로 제공합니다. 허브 노드는 이전에 모든 행(대규모 저장소의 경우 수천 개)을 반환했습니다. 이제 상위 25개를 반환하고, 나머지 항목이 속하는 영역과 파일을 보여줍니다. scope=<area>로 세부 검색하거나, offset으로 페이지를 지정하거나, 이전처럼 모든 행을 얻으려면 full=true를 전달합니다. 스크립트가 repo-graph impact 출력을 구문 분석하고 모든 행이 필요한 경우 --full을 추가하세요.
- 스킬 이름이 변경되었습니다.
repo-graph-<동사>에서 glia-<동사>로 변경되었으며 (/repo-graph:glia-find). 이제 이들은 glia에 존재하며 glia CLI 명령도 표시합니다. 플러그인이 자동으로 업데이트해 줍니다.
– 부재 계층(Absence tiers)은 소문자입니다: No answer (no_match, fact)이며, FACT가 아닙니다.
만약 같은 저장소(repo)에서 **glia 자체의 CLI 훅(CLI hooks)**도 실행한다면, CLI를 v0.5.6 버전으로 재설치해야 합니다. 그렇지 않으면 두 도구가 커밋할 때마다 서로의 캐시를 다시 구축합니다.
개선된 점은 다음과 같습니다: 순위 지정 시 역사적으로 함께 변경되는 파일을 먼저 배치합니다 (다음 명령어를 실행한 후: uvx --from glia-cli glia history sync .). 모든 언어에서 가짜 엣지(phantom edges)가 훨씬 적고, 라우트에는 마운트 접두사(mount prefix)가 포함됩니다 (Django, Flask / FastAPI, Express / Koa / NestJS, gin groups). 그래프는 Dockerfile, compose service, Procfile 또는 systemd unit이 무엇을 시작하는지 알고 있으며, Lua를 구문 분석하고 파일 감시자(file watcher)가 재구축하는 대신 그래프를 제자리에서 업데이트합니다. 모든 도구가 셸 명령어(uvx mcp-repo-graph find checkout)로 작동하므로 서버가 필요하지 않습니다.
0.5.2로 업그레이드하기
대부분의 사용자는 아무것도 할 필요가 없습니다. uvx와 pip install mcp-repo-graph는 새로운 엔진(glia 0.5.1, 정확히 고정됨)을 가져옵니다. .glia/graph/에 캐시된 그래프는 새 형식이기 때문에 각 저장소에서 처음 시작할 때 한 번 재구축됩니다. 그 후에는 정상으로 돌아옵니다.
같은 저장소에서 glia 자체의 CLI 훅(glia install-hooks)도 실행하는 경우에만 조치를 취해야 합니다. CLI를 v0.5.1 태그로부터 재설치하세요. CLI와 서버가 다른 glia 버전에 있으면, 커밋할 때마다 서로의 캐시를 다시 구축합니다.
repo-graph의 pre-commit 훅으로 캐시를 커밋하는 팀에게도 마찬가지입니다: 다음 커밋에서 새 형식으로 한 번 다시 추가되며, 서버가 여전히 glia 0.5.0 엔진을 실행하는 사람은 업그레이드할 때까지(uv 도구로 설치한 경우 uv tool upgrade mcp-repo-graph) 로드할 때마다 이를 재구축합니다.
개선된 점은 다음과 같습니다: 더 풍부한 그래프(마운트된 Go 라우트는 접두사를 가지고, 프론트엔드 엔드포인트는 기본 URL을 통해 쌍을 이루며, 훨씬 더 많은 호출이 해결됨), read가 호스트에게 WebSocket / gRPC / GraphQL 클라이언트 다이얼 정보를 보여주며, 서버 메모리 사용량이 장시간 세션 동안 증가하지 않습니다.
⚠️ 0.5.0 버전 업그레이드
엔진 패키지가 repo-graph-py에서 glia-py로 이름이 변경되었습니다. 만약 uvx 또는 pip install mcp-repo-graph를 사용하여 설치하는 경우, 아무것도 할 필요가 없습니다. 새로운 엔진이 자동으로 불러와집니다.
직접 엔진을 임포트(import) 하는 경우에만 조치를 취해야 합니다:
- import repo_graph_py as rg
+ import glia_py as rg
같은 릴리스에서 변경된 세 가지 사항이 더 있습니다:
- 답변은 JSON 문자열이 아닌 Python 객체입니다.
find, resolve, blast_radius, cross_stack_trace 및 governing_docs는 {"results": [...], "absence": {...}} 형태의 딕셔너리(dict)를 반환합니다. 만약 결과에 대해 json.loads(...)를 수행했다면, 이 코드는 제거해야 합니다.
find_node와 find_nodes_by_qname이 사라졌습니다. 이제 두 기능을 모두 대체하는 하나의 find(query, top_k) 함수가 있습니다.
- 그래프 캐시 위치가 변경되었습니다. 이전에는
.ai/repo-graph/에 있었으나, 이제는 .glia/graph/로 이동했습니다. 자동으로 재구축되므로, 기존 디렉토리는 삭제해도 됩니다. 새 경로는 자신을 무시하며 git status에서 절대 나타나지 않습니다.
여섯 가지 MCP 도구(orient, find, impact, trace, read, refresh)는 변경되지 않았으므로, 에이전트 설정(agent config)에서 수정할 부분이 없습니다. 자세한 내용은 0.5.0 릴리스 노트를 참조하십시오.
데모 시연 (Demo)
같은 버그, 같은 모델, 같은 프롬프트 — 유일한 차이점은 repo-graph가 설치되었는지 여부입니다.
과제: Go + Angular 모노레포(monorepo)에서 역전 비교 연산자(reversed comparison operator)를 수정하는 것입니다.
(더 이전 엔진으로 기록된 내용이며, 당시에는 해당 레포지토리를 566개 노드 / 620개 엣지로 매핑했습니다. glia 0.5.1 엔진은 동일한 코드에서 훨씬 더 많은 정보(3,466개 노드 및 6,869개 엣지)를 추출합니다 (측정일: 2026-10-02). 따라서 오늘 모델이 받는 그래프는 비디오 속의 그래프보다 풍부합니다. 토큰 수와 시간은 기록된 실행을 기준으로 하므로 그대로 유지했습니다.)
| repo-graph 미사용 시 | repo-graph 사용 시 |
|---|
| 사용된 토큰 | 75,308 | 29,838 |
| ... | | |
| 토큰 사용량이 2.5배 적습니다. 속도는 약 9배 빠릅니다. 수정 결과는 동일하게 정확합니다. | | |
테스트 실행 방법 (How the test was run)
공정한 비교를 위해 두 실행 모두 동일한 조건을 사용했습니다:
- 동일 모델: Claude Opus, 100% (Haiku 라우팅 없음)
- 동일 프롬프트: "최근에 생성된 그룹이 닫힌 상태로 표시되고, 오래된 그룹은 열린 상태로 표시됩니다. 이는 역방향입니다 — 새 그룹은 멤버가 가입할 수 있도록 열려야 합니다. 버그를 찾아 수정하세요."
- 신선한 컨텍스트: 각 실행은 이전 대화 없이 /clear에서 시작했습니다.
- 다른 도구 없음: 두 실행 모두 CLAUDE.md, 플러그인, 훅 및 기타 모든 MCP 서버가 제거되었습니다 — 유일한 변수는 repo-graph 설치 여부였습니다.
- 힌트 없음: 프롬프트는 위치가 아닌 증상을 설명합니다 — Claude는 스스로
group_controller.go:57을 찾아내야 합니다.
repo-graph가 없을 경우, Claude는 키워드를 검색하고(greps), 파일을 읽고, 다시 검색하며, 더 많은 파일을 읽은 후 결국 버그를 좁혀 나갑니다. repo-graph가 있을 경우, Claude는 trace("groups")를 호출하여 정확한 핸들러 함수와 파일을 받고, 이를 읽은 후 수정합니다.
아무것도 설치할 필요 없이 검사해 볼 수 있는 실제 그래프 출력을 위해 [pre-generated examples]에서 [FastAPI], [Gin], [Hono], 및 [NestJS]를 확인하세요.
문제점 (The problem)
코드 작업을 하는 LLM은 방향 설정(orientation)에 가장 많은 컨텍스트를 낭비합니다:
- 관련 없는 파일 읽기
- 서로 다른 언어의 구성 요소 간 연결 누락
- 특정 기능이 어디서 시작하는지 또는 무엇을 건드리는지 알지 못함
- 필요한 것보다 많은 파일을 로딩 (예: 5개만 필요할 때 50개 로딩)
이는 비용이 많이 들고, 느리며, 코드베이스가 커질수록 악화됩니다.
repo-graph의 해결 방법 (How repo-graph solves it)
repo-graph는 코드베이스를 한 번 스캔하여 다음의 그래프를 구축합니다:
- 엔티티(Entities): 모듈, 패키지, 클래스, 함수, 라우트, 서비스, 구성 요소
- 관계(Relationships): 임포트, 호출, 처리(handles), 정의(defines), 포함(contains), 크로스 스택 HTTP
- 흐름(Flows): 진입점부터 데이터 레이어까지의 엔드투엔드 경로
그런 다음, LLM이 사용할 수 있도록 6개의 MCP 도구를 노출합니다:
- Orient — "이 저장소에는 어떤 언어가 있나요? 주요 기능은 무엇인가요? 그래프가 놓치고 있는 부분(blind)은 어디인가요?"
- Navigate — "라우트에서 데이터베이스까지의 로그인 흐름을 추적해 주세요." / "UserService와 payments API 사이의 최단 경로는 무엇인가요?"
- Scope — "이 버그에 어떤 노드들이 중요한가요?" / "이 수정에 필요한 파일만 주세요."
- Assess — "이 함수를 변경했을 때의 파급 효과(blast radius)는 무엇인가요?" / "여기에서 데드 코드(dead code)는 무엇인가요?"
LLM은 수천 줄을 읽는 대신 몇백 개의 토큰으로 구조적 컨텍스트를 얻습니다.
가장 적합한 사용 사례
repo-graph는 코드베이스가 모델이 한 번에 기억할 수 있는 용량보다 크거나 복잡하게 얽혀 있을 때 진가를 발휘합니다. 그 효과(payoff)는 세 가지 요소에 따라 증가합니다:
- 크기 (Size) — 관련 파일을 읽는 것만으로도 컨텍스트 예산(context budget)을 초과할 만큼 충분한 파일이 있는 경우.
- 복잡성 (Complexity) — 규칙, 간접 참조(indirection), 계층 구조 등으로 인해 단순히 "읽어라"는 지시가 작동하지 않는 경우.
- 경계 간 도달 범위 (Cross-boundary reach) — 텍스트 검색으로는 연결할 수 없는 파일, 언어 또는 서비스 전반에 걸쳐 답이 필요한 경우.
강력한 사용 사례:
- 모노레포 (Monorepos) — 언어 경계를 넘어 프론트엔드가 백엔드를 호출하는 경우. repo-graph는 HTTP 호출을 해당 라우트와 그 뒤의 핸들러에 연결합니다. 텍스트 검색은 두 측면이 공통 문자열을 공유하지 않기 때문에 이를 할 수 없습니다. 모노레포 루트에
--repo를 지정하면 단일 그래프가 모든 프로젝트에 걸쳐 확장됩니다. (위 데모는 정확히 이 경우입니다: 하나의 리포지토리에 Go + Angular.)
다른 도구들은 fetch/axios를 Express, Fastify 및 Koa 라우트에 연결합니다. 여기서 차이점은 범위(reach)입니다. 동일한 조합이 Go, Python, Java, C#, Rust, PHP, Ruby 등 그리고 그 외의 언어 전반에 걸쳐 단일 그래프로 실행되며, gRPC, GraphQL, WebSockets, 큐(queues), 이벤트까지 모두 동등하게 다룹니다. 이러한 광범위함은 다른 도구들과 비교하여 벤치마킹된 것이 아니므로, 측정된 승리라기보다는 설계상의 차이점으로 받아들이십시오.
- 다중 서비스/폴리레포 시스템 (Multi-service / polyrepo systems) — 서비스를 하나의 디렉터리에 두고 해당 위치에
--repo를 지정하면, 그래프가 단일 호출로 서비스 경계를 가로지르는 기능을 추적합니다.
- 대규모 단일 코드베이스 (Large single codebases) — 파일 수가 수천 개에 달하여, 방향성(orientation) 자체가 비용이 되는 경우.
- 생소하거나 레거시 코드 (Unfamiliar or legacy code) — 무엇이 무엇과 연결되어 있는지 아직 알지 못하는 경우.