코드베이스 전체를 미리 "지도"로 만들어 두면, AI 에이전트가 grep과 파일 읽기에 토큰을 낭비할 필요가 없다.
Explore 에이전트의 토큰 낭비 구조부터.
Claude Code 같은 AI 코딩 에이전트는 처음 보는 코드베이스를 만나면 일단 탐색(explore)부터 한다. grep으로 키워드를 훑고, glob으로 파일 목록을 뽑고, Read로 한 파일씩 열어본다. 작은 프로젝트라면 괜찮다. 그런데 VS Code나 Swift 컴파일러처럼 파일이 수만 개인 코드베이스가 되면 — 수십 번의 툴 호출과 수십만 토큰이 그 탐색에만 사라진다.
CodeGraph는 이걸 정공법으로 푼다. 코드를 미리 한 번 통째로 분석해서 "함수 A가 함수 B를 부른다" "클래스 X가 인터페이스 Y를 상속한다" 같은 관계망을 SQLite 파일 하나에 저장해 둔다. AI는 grep 대신 그 그래프에 SQL 질의하듯 묻는다. 결과는 평균 툴 호출 58% 감소, 응답 시간 22% 단축, 비용 16% 절감.
~/.claude.json에 등록된 MCP 서버에 stdio로 연결해서 도구를 호출한다. CodeGraph는 codegraph serve --mcp로 MCP 서버 모드를 켠다.function foo(a){return a+1}가 "FunctionDeclaration → Parameters → ReturnStatement → BinaryExpression"으로 분해된다. CodeGraph는 tree-sitter로 AST를 만든 다음, 거기서 노드(함수/클래스)와 엣지(호출/상속)를 추출한다.CREATE VIRTUAL TABLE ... USING fts5(...) 한 줄이면 ElasticSearch 같은 별도 서버 없이 LIKE보다 100배 빠른 키워드 검색이 가능. CodeGraph는 심볼 이름을 FTS5에 함께 색인한다.한 문장으로 줄이면.
CodeGraph는 코드베이스를 사전 분석해 함수/클래스를 노드로, 호출/상속/임포트 관계를 엣지로 표현한 그래프를 SQLite + FTS5에 저장한다. 그리고 Claude Code 같은 에이전트가 그 그래프를 MCP 서버로 질의할 수 있게 한다.
핵심 수치는 셋 — 평균 툴 호출 58% 감소, 응답 시간 22% 단축, 비용 16% 절감. 외부 API도 클라우드도 없다. npx 한 줄로 끝나는 인스톨러가 시스템 프롬프트 주입까지 자동 처리한다.
벤치마크 + 보안 + 경쟁 비교.
Claude Code는 코드를 탐색할 때 Explore 에이전트라는 보조 일꾼을 띄워서 grep, glob, Read로 파일을 일일이 읽는다. 큰 프로젝트일수록 이 과정에서 수십 번의 툴 호출과 수십만 토큰이 사라진다. CodeGraph는 이 탐색을 "미리 만들어둔 그래프 1회 질의"로 압축한다.
6개의 유명 오픈소스 프로젝트(VS Code, Excalidraw, Alamofire, Swift Compiler 등)에서 Explore 에이전트를 돌려보고 CodeGraph 유/무를 비교했다.
| 코드베이스 | CodeGraph 사용 | 미사용 | 개선폭 |
|---|---|---|---|
| VS Code (TS) | 3회 / 17초 | 52회 / 1분 37초 | 94% · 82% |
| Excalidraw (TS) | 3회 / 29초 | 47회 / 1분 45초 | 94% · 72% |
| Claude Code (Py+Rust) | 3회 / 39초 | 40회 / 1분 8초 | 93% · 43% |
| Alamofire (Swift) | 3회 / 22초 | 32회 / 1분 39초 | 91% · 78% |
| Swift Compiler (25,874 파일) | 6회 / 35초 | 37회 / 2분 8초 | 84% · 73% |
Swift Compiler처럼 2만 5천 개 파일의 거대 코드베이스를 4분 만에 인덱싱하고, 복잡한 cross-cutting 질문에도 단 6번의 호출과 0건의 파일 읽기로 답을 만들어냈다. "에이전트가 파일을 거의 안 읽는다"는 게 이 도구의 핵심 성과.
API 키도, 외부 클라우드도, 사내망 밖으로 나가는 데이터도 없다. .codegraph/codegraph.db SQLite 파일 하나가 전부다. 보안이 중요한 회사 코드를 다루는 환경에서 큰 차별점.
| 도구 | 접근 방식 | CodeGraph 대비 |
|---|---|---|
| Cursor / Copilot | 임베딩 기반 코드 검색 | 의미 검색은 가능하나 "함수 호출 관계" 같은 구조 정보가 약함. 클라우드 처리 필수. |
| Sourcegraph | 대규모 코드 검색 플랫폼 | 강력하지만 서버 구축이 필요. CodeGraph는 npx 한 줄. |
| LSP (Language Server) | IDE에 통합된 언어 분석 | 한 언어씩 처리. CodeGraph는 19개 언어를 한 그래프에 담음 (cross-language). |
런타임 · 파싱 · 저장 · 통신 · 빌드.
tsconfig.json으로 빌드"engines": "node >=20.0.0 <25.0.0" 최신 LTS만 지원| 라이브러리 | 역할 | 왜 이걸 썼을까 |
|---|---|---|
web-tree-sitter | 코드를 AST로 파싱 | 19개 언어를 한 라이브러리로 처리. WASM이라 OS 독립. |
tree-sitter-wasms | 언어별 파서(WASM) | 네이티브 빌드 없이 즉시 사용 가능. |
node:sqlite | SQLite (Node 내장) | 번들된 Node 런타임에 탑재, WAL+FTS5 지원, 플랫폼 무관 빌드 불필요. |
commander | CLI 명령어 파서 | codegraph init, codegraph index 같은 서브커맨드. |
@clack/prompts | 대화형 CLI UI | 인터랙티브 인스톨러의 "예/아니오" 프롬프트. |
picomatch | glob 패턴 매칭 | node_modules/** 같은 제외 규칙 처리. |
jsonc-parser | 주석 허용 JSON 파서 | VS Code 스타일의 .codegraph/config.json 처리. |
프로젝트 루트의 .codegraph/codegraph.db 파일 하나에 모든 노드/엣지/소스 스니펫이 저장된다. 별도 검색 서버 없이 키워드 검색까지 가능한 이유는 FTS5 가상 테이블을 함께 두기 때문.
Claude Code 호스트와 CodeGraph 서버는 표준 입출력(stdio)으로 JSON-RPC를 주고받는다. codegraph serve --mcp가 그 서버 모드. 호스트는 자식 프로세스로 CodeGraph를 띄우고, 표준 입력에 도구 호출 요청을 쓰면 표준 출력으로 결과가 돌아온다. 소켓도 포트도 필요 없다.
폴링이 아니라 네이티브 OS 이벤트를 쓴다 — macOS는 FSEvents, Linux는 inotify, Windows는 ReadDirectoryChangesW. 2초의 debounce(연속 저장을 한 번의 이벤트로 묶기) 후 변경 파일만 증분 재인덱싱한다.
__tests__/evaluation/에 벤치마크용 eval 스위트가 따로 있음전체 구조도 → 핵심 패턴 하나하나.
┌──────────────────────────────────────────────────────────────────┐
│ Claude Code (호스트) │
│ │
│ "Implement user authentication" 같은 사용자 요청 │
│ │ │
│ ▼ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Explore Agent │ ── │ Explore Agent │ (여러 서브에이전트) │
│ └───────┬───────┘ └───────┬───────┘ │
└──────────────┼─────────────────────┼──────────────────────────────┘
│ stdio (MCP 프로토콜) │
▼ ▼
┌──────────────────────────────────────────────────────────────────┐
│ CodeGraph MCP 서버 (TypeScript) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ search │ │ callers │ │ context │ │ impact │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ └─────────────┼─────────────┴─────────────┘ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ SQLite + FTS5 (codegraph.db) │ │
│ │ · nodes (함수/클래스/메서드) │ │
│ │ · edges (calls/extends/imports)│ │
│ │ · 풀텍스트 인덱스 │ │
│ └──────────────────────────────┘ │
│ ▲ │
│ │ 저장 │
│ ┌──────────────┴───────────────┐ │
│ │ tree-sitter WASM Parser │ (언어별 query 파일로 추출) │
│ └───────────────▲──────────────┘ │
│ │ 변경 감지 │
│ ┌───────────────┴──────────────┐ │
│ │ Native FS Watcher │ FSEvents/inotify/Windows │
│ └──────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
코드를 그래프로 만드는 핵심 흐름.
@Service 같은)까지 이때 푼다파일을 위에서 아래로 한 번에 다 풀려면, A.ts가 B.ts의 클래스를 상속하는 경우 B.ts를 먼저 알아야 한다. 모든 노드를 일단 다 모은 다음 두 번째로 훑으면 의존성 순서를 신경 쓸 필요가 없다. 전화번호부를 다 만들고 나서 친구 번호를 찾는 것과 같다.
전용 그래프 DB(Neo4j 같은 것) 없이도, SQLite의 두 테이블만으로 그래프를 표현한다.
-- 단순화한 스키마 CREATE TABLE nodes ( id TEXT PRIMARY KEY, name TEXT, kind TEXT, -- function/class/method/... file TEXT, line INTEGER ); CREATE TABLE edges ( src TEXT, -- FROM 노드 dst TEXT, -- TO 노드 kind TEXT -- calls/extends/imports/... ); CREATE VIRTUAL TABLE nodes_fts USING fts5(name, content=nodes);
파일이 저장될 때마다 전체를 다시 인덱싱하면 큰 프로젝트에선 비효율적이다. CodeGraph는 변경된 파일과 그 파일을 임포트하는 파일만 다시 처리하는 impact radius 알고리즘을 쓴다. 이건 codegraph_impact 툴로도 노출되어 있어서, "이 함수 바꾸면 뭐가 영향받지?"를 AI가 직접 물어볼 수 있다.
가장 영리한 부분은 코드가 아니라 ~/.claude/CLAUDE.md 주입이다. 인스톨러가 자동으로 다음 규칙을 추가한다.
좋은 도구를 만들어 둬도 AI는 학습 데이터에 익숙한 패턴 — grep, Read를 먼저 시도하는 — 으로 자꾸 돌아간다. 그러면 CodeGraph가 있어도 효과가 반감된다.
".codegraph/ 폴더가 보이면, 메인 세션은 절대 codegraph_explore를 직접 호출하지 말고 Explore 에이전트를 띄워서 호출하라. 그리고 그 결과는 신뢰하고 grep/Read를 추가로 하지 말라" — 이걸 시스템 프롬프트에 박아 컨벤션을 강제한다.
어디에 뭐가 있는지.
codegraph/ ├─ src/ # 실제 구현체 (TypeScript 94.8%) │ ├─ bin/ # CLI 엔트리포인트 (codegraph 명령) │ ├─ db/ │ │ └─ schema.sql # SQLite 스키마 정의 │ ├─ extraction/ │ │ └─ wasm/ # tree-sitter 언어별 WASM 파서들 │ ├─ mcp/ # MCP 서버 구현 (stdio 통신) │ └─ ... # search/callers/context 등 도구 로직 │ ├─ __tests__/ │ └─ evaluation/ # 벤치마크/eval 스위트 ├─ docs/ # 사용자 문서 ├─ scripts/ # 설치 후 헬퍼 스크립트 │ ├─ BUNDLING.md # 번들 런타임 배포 방식 설명 ├─ CHANGELOG.md # 버전별 변경 이력 ├─ CLAUDE.md # Claude Code에 주입되는 글로벌 지침 ├─ TELEMETRY.md # 텔레메트리 수집 정책 안내 ├─ install.sh / install.ps1 # curl/irm 원클릭 인스톨러 스크립트 ├─ package.json # "bin" 필드로 글로벌 명령 등록 └─ vitest.config.ts
CLAUDE.md — AI를 길들이는 시스템 프롬프트의 진수. 다른 MCP 서버 만들 때 그대로 참고할 모범 사례.
schema.sql — 그래프를 SQLite에 어떻게 모델링했는지 한 파일로 알 수 있음.
__tests__/evaluation/ — "벤치마크를 PR 문화로 끌어들이는 법"이 코드로 표현된 곳.
이 레포에서 가져갈 5가지 인사이트.
query.scm 파일에 S-expression으로 "이런 패턴을 잡아라"고 선언실습: 내 .ts 파일에서 export된 함수 이름만 추출하는 5줄짜리 tree-sitter 스크립트. 한 번 해보면 CodeGraph의 추출 로직이 단번에 이해됨.
src/mcp/ 폴더의 도구 정의(이름·입력 스키마·반환 형식) 살펴보기CREATE VIRTUAL TABLE ... USING fts5(...) 한 줄로 시작CLAUDE.md@clack/prompts + commander 조합은 모던 Node CLI의 표준 패턴codegraph init 같은 인터랙티브 플로우 구성 학습 (-i 플래그는 하위 호환용, 현재 표준은 인자 없이 실행)~/.claude.json 등록 → 권한 자동 허용까지 한 번에 처리최소 → 권장.
| 항목 | 최소 | 권장 |
|---|---|---|
| OS | Windows 10, macOS 12, Linux (커널 5+) | 최신 OS |
| Node.js | 20.0.0 | 20 LTS 또는 22 LTS (24까지) |
| RAM | 4GB | 8GB 이상 (대형 코드베이스) |
| 디스크 | 대상 코드의 약 5~10% | SSD 권장 (FTS5 가속) |
| 네트워크 | npm 설치 시에만 필요 | 이후 완전 오프라인 가능 |
| Claude Code | v2.x 이상 | 최신 빌드 (MCP stdio 지원 필수) |
npx @colbymchenry/codegraph — 인터랙티브 인스톨러가 글로벌 설치, ~/.claude.json 등록, 권한 자동 허용, CLAUDE.md 주입까지 한 번에 처리한다.
Node 24 미만이어야 하고, 네이티브 모듈 빌드 실패 시 자동으로 WASM 폴백이 동작한다. PowerShell에서 npm 글로벌 설치 권한 문제가 나면 npm config get prefix로 경로 확인 후 PATH에 추가해야 함.
난이도별 실습 — Easy → Hard.
1) npx @colbymchenry/codegraph 실행 2) codegraph init 완료 3) Claude Code 재시작 4) "이 프로젝트의 인증 흐름이 어떻게 동작하지?"를 질문 5) 응답에서 codegraph_explore 툴이 호출되면 성공
배우는 것: 인스톨러 동작, 시스템 프롬프트 주입, MCP 도구 호출 흐름
1) codegraph status로 인덱스 통계 확인 2) codegraph query "Auth"로 심볼 검색 3) codegraph affected src/api/login.ts로 영향 받는 파일 확인 4) 세 결과를 비교
배우는 것: CLI · MCP 동일 기능, FTS5 키워드 검색, impact radius 알고리즘
1) git diff --name-only | codegraph affected --stdin --quiet | xargs npx vitest run 한 줄을 .husky/pre-commit에 추가 2) 커밋 시 변경 파일과 관련된 테스트만 자동 실행 3) 전체 테스트 대비 시간 비교
배우는 것: 그래프 기반 affected-tests 패턴, 파이프 합성
1) import CodeGraph from '@colbymchenry/codegraph' 2) 내 프로젝트 인덱싱 3) "100줄 넘는 함수 + 호출자가 5명 이상"인 함수 추출 4) 리팩토링 후보 리스트 출력
배우는 것: 그래프 API 직접 사용, 노드·엣지 질의, 코드 메트릭 자동화
1) 현재 미지원 언어 선택(예: Elixir, Zig) 2) tree-sitter-elixir WASM 추가 3) 해당 언어 query.scm 작성 4) __tests__/에 fixture 추가 5) eval 통과 후 PR 제출
배우는 것: tree-sitter query 언어, eval 기반 검증, 오픈소스 기여 워크플로
주차별로 따라가면 CodeGraph 전체 스택 마스터.
Anthropic MCP 공식 문서 1회독 / 가장 간단한 MCP 서버(에코 서버) 직접 작성 / CodeGraph src/mcp/ 폴더 코드 리딩
tree-sitter query 언어 학습(S-expression 문법) / 한 언어의 query 파일을 처음부터 작성(Python 권장) / AST playground에서 실제 노드 트리 관찰
FTS5의 토크나이저·랭킹 옵션 학습 / 그래프를 SQLite에 모델링하는 패턴 비교(CodeGraph vs Datasette vs Recursive CTE) / WAL 모드, 인덱스 설계, EXPLAIN QUERY PLAN 튜닝
CLAUDE.md를 통한 행동 제어 패턴 정리 / 서브에이전트(Explore) 분기와 토큰 예산 설계 / 나만의 MCP 도구 만들어 붙이기(예: 회사 위키 검색 MCP)
"우리 팀 모노레포 전용 코드 어시스턴트" 설계. CodeGraph + 내부 API 문서 MCP + Jira 티켓 MCP를 함께 묶어, "이 티켓 관련 함수 찾고 → 영향 범위 분석 → 어떤 테스트 돌릴지" 한 번에 답하게 만들기
자주 마주칠 단어들.
function foo(a){return a+1}가 "FunctionDeclaration → Parameters → Return → BinaryExpression" 트리로 분해됨.공식 · 프로토콜 · 학습 리소스.
npx @colbymchenry/codegraph → codegraph init까지 끝낸 뒤 Claude Code 재시작. 인터랙티브 인스톨러가 어떻게 시스템 프롬프트까지 주입하는지 눈으로 확인.codegraph status로 인덱스 통계, codegraph query "Auth"로 심볼 검색, codegraph affected src/api/login.ts로 영향 받는 파일 확인. AI가 쓰는 도구를 사람이 먼저 써본다.codegraph_explore가 호출되는지, grep/Read는 얼마나 줄었는지 확인..codegraph/codegraph.db를 SQLite 클라이언트로 열어 nodes·edges·nodes_fts 테이블 살펴보기. "그래프 DB 없이도 그래프 표현이 가능하구나"를 손으로 확인.src/mcp/를 참고해, 회사 위키나 Jira 티켓 검색용 MCP 서버를 작성해 Claude Code에 붙여본다. CodeGraph의 진짜 가치는 "MCP 서버 모범 사례"임을 체감.