Grep умер. Да здравствует граф
Пытаться найти в кодовой базе на 500 000 строк нужную функцию через grep — это как искать черную кошку в темной комнате, особенно если кошки там нет. Вы забиваете консоль regex-ами, пролистываете сотни совпадений, а потом выясняете, что искали не то.
Теперь представьте, что так же тупит ваш AI-агент. Только он ещё и сжирает тысячи токенов на каждый пустой запрос. Знакомо? В прошлых статьях мы уже разбирали SocratiCode — MCP-сервер с семантическим поиском. Сегодня на сцену выходит CodeGraph — инструмент, который не просто ищет, а строит настоящий граф зависимостей вашего кода.
Суть CodeGraph: MCP-сервер, который индексирует код через tree-sitter (разбирает AST), записывает символы (функции, классы, переменные) и их связи в SQLite, а затем по запросу из Claude Code мгновенно отвечает на вопросы вроде «где определена эта функция?» или «кто вызывает этот метод?». Никакой векторной базы, никаких внешних моделей — только чистый граф.
Архитектура: tree-sitter vs семантические чернила
Ключевое отличие CodeGraph от SocratiCode — в подходе к индексации. SocratiCode, как мы помним, режет код на AST-чанки, векторизует их локальной моделью (например, bge-m3) и отправляет в Qdrant. Это даёт семантический поиск — вы можете спросить «функция, которая парсит конфиг», и получите нужный чанк, даже если точное имя не помните.
CodeGraph идёт другим путём. Он использует tree-sitter для построения синтаксического дерева каждого файла, извлекает все значимые символы: определения классов, методов, функций, переменных, импорты. Затем для каждого символа вычисляет его FQN (fully qualified name) и связи: вызовы, наследование, вхождения. Всё это складывается в обычную SQLite-базу. Никаких нейросетей, никаких эмбеддингов — только жёсткая логика парсера.
На выходе — не векторное пространство, а граф. Вы можете спросить: «покажи всех, кто вызывает send_email()» — и получите точный список мест с указанием строки, файла и контекста. Никаких ложных срабатываний, никакого шума.
| Характеристика | SocratiCode | CodeGraph |
|---|---|---|
| Метод индексации | AST-чанкинг + эмбеддинги (Ollama) | Tree-sitter AST + граф символов в SQLite |
| Хранилище | Qdrant (векторная БД) | SQLite (реляционная БД) |
| Поиск | Семантический + BM25 гибрид | Точный по FQN, ссылкам, наследованию |
| Зависимости | Ollama, Qdrant | Только tree-sitter, sqlite3 |
| Точность на тесте навигации | ~71% | ~92% |
Важно: 92% точности CodeGraph — на задачах навигации (где определён символ, кто вызывает). Для семантических запросов («найти похожую функцию») SocratiCode всё ещё лучше. Но для быстрой ориентации в чужом коде графовый подход убивает grep наголову.
Бенчмарки: 92% vs 71% — что за цифры?
Автор CodeGraph провёл тестирование на реальных проектах (Django, React, Rust-библиотеки). Задача: агент должен ответить на вопросы о коде: «из какого класса наследуется AdminController?», «найди строку, где вызывается validate с аргументом strict=True». CodeGraph дал правильный ответ в 92% случаев. SocratiCode — в 71%. Причина проста: эмбеддинги иногда смазывают смысл, особенно когда названия функций короткие («do», «run»). Tree-sitter же видит AST — ошибки быть не может.
Но есть нюанс: SocratiCode не предназначен для такого навигационного поиска. Его сила — семантический поиск по смыслу. Если попросить «найти функцию, которая обрабатывает файлы с расширением .csv», SocratiCode справится лучше, потому что CodeGraph ищет только по точным именам. То есть эти инструменты не конкуренты, а комплементарны.
Как выглядит работа с CodeGraph в Claude Code
Допустим, вы пишете в Claude Code задачу на рефакторинг легаси. Без MCP-сервера Claude придётся либо читать весь проект (дорого), либо полагаться на контекст (ненадёжно). С CodeGraph вы просто подключаете MCP-сервер:
{
"mcpServers": {
"codegraph": {
"command": "npx",
"args": ["-y", "@codegraph/cli", "--db-path", "./codegraph.db"]
}
}
}Claude Code автоматически использует инструменты CodeGraph: find_definition, find_callers, get_symbol_info. Вот пример диалога:
Вы: «Покажи, откуда вызывается функция
processOrderв модуле orders»Claude (через CodeGraph):
Найдено 14 вызовов.
•orders/api.py:45—processOrder(request.data)
•orders/tasks.py:102—processOrder(order_id, apply_discount=True)
•tests/test_orders.py:33—processOrder(mock_order)
Никакого лишнего шума, никаких лишних токенов в контексте. Claude Code получает только то, что нужно. Выгода — до 70% экономии токенов на типичных задачах навигации, как мы разбирали в статье CodeGraphContext.
Неочевидный совет: не выбирайте, комбинируйте
SocratiCode и CodeGraph — не конкуренты, а два слоя одного бутерброда. Если вы работаете с большим легаси-проектом, где нужно часто искать по смыслу (например, «функции, связанные с платежами»), SocratiCode незаменим. Если вам нужно быстро понять архитектуру — кто кого вызывает, откуда импортируется класс — CodeGraph выигрывает за счёт точности и отсутствия внешних зависимостей.
Мой прогноз: в 2027 году ни один уважающий себя AI-агент не будет работать без обоих MCP-серверов. А пока — ставьте CodeGraph для навигации, SocratiCode для семантики. И вы забудете про grep навсегда.