Перейти к содержанию
Публикация AiManual

repopedia: локальный граф кода с MIT-лицензией и MCP-сервером для AI-агентов

repopedia строит граф кода локально в файле SQLite: парсинг через tree-sitter, MIT-лицензия, без облака, Docker и API-ключей. Разбираем MCP-сервер для AI-агенто

Коротко

Что будет в материале

  1. 01

    Что такое repopedia и зачем она нужна

  2. 02

    Как работает локальный граф кода

  3. 03

    MCP-сервер: точные ответы для AI-агентов за один вызов

  4. 04

    Практические сценарии: кто вызывает функцию и blast radius

repopedia - открытый инструмент, который строит граф кода прямо на вашей машине. Парсинг выполняет tree-sitter, результат ложится в обычный файл SQLite, а MCP-сервер отдаёт AI-агенту точный ответ с указанием file:line за один вызов. Ни облака, ни Docker, ни API-ключей. Лицензия MIT, текущая версия 0.2.1, поддержка Python и TypeScript.

Автор сделал инструмент под свою задачу: он работал с большой Python-кодовой базой и не мог надёжно определить, кто вызывает общую функцию, когда её пора менять. grep показывал все упоминания имени, включая комментарии, строки и одноимённые методы, и на этом поиск заканчивался. Граф вызовов отвечает на вопрос иначе: он хранит связи между сущностями кода, а не текстовые совпадения. Пост автора в r/LocalLLaMA описывает и саму проблему, и то, как она решается.

Инструмент распространяется под MIT, и это принципиальный момент: многие похожие проекты либо требуют загрузки репозитория в облако, либо разворачивают Docker-стек с векторной базой данных. Для рабочих проектов с закрытым кодом такой вариант часто неприемлем. repopedia оставляет весь анализ на локальном диске.

Что такое repopedia и зачем она нужна

repopedia решает задачу навигации по зависимостям в кодовой базе. Вы задаёте вопрос о вызовах функций и получаете структурированный ответ, а не список строк, где встречается нужное имя. Дальше этот ответ можно отдать AI-агенту через MCP, чтобы он не тратил раунды на текстовый поиск.

Проблема, которую решает repopedia

grep ищет подстроку. Если функция называется process, поиск вернёт и реальные вызовы, и упоминания в комментариях, и строковые литералы, и методы с тем же именем в совсем других классах. Разбирать этот список вручную в большом проекте дорого, а ошибиться легко: пропущенный вызывающий превращается в поломку на проде.

Отдельная сложность - транзитивные зависимости. Перед изменением общей функции полезно понимать не только прямых вызывающих, но и всех, кто вызывает их. Автор называет это blast radius и описывает именно такой сценарий из своей практики: изменение общей функции в большой Python-кодовой базе, где надёжно определить вызывающих через grep не получалось.

Ключевые особенности

  • Лицензия MIT, исходники открыты.
  • Полностью локальная работа: без сервера, без Docker, без API-ключей. Ничего не загружается на сторонние серверы, граф лежит файлом .db на диске.
  • Парсинг через tree-sitter, хранение в обычном SQLite.
  • MCP-сервер для AI-агентов: точный ответ с file:line за один вызов.
  • Установка через pip и запуск на репозитории.
  • Выгрузка wiki по кодовой базе (автор добавлял эту функцию в основном для собственных нужд).
  • Embedding-модели не используются: работает только граф связей.

Инструмент появился как альтернатива GitNexus, который автор хотел использовать, но отказался из-за лицензии PolyForm. Именно вопрос лицензии и полной локальности стал отправной точкой проекта.

Как работает локальный граф кода

Схема простая и не требует внешней инфраструктуры: парсер разбирает исходники, извлекает сущности и связи, а результат складывается в один файл базы данных.

Парсинг через tree-sitter

tree-sitter строит синтаксическое дерево файла, и уже по нему инструмент выделяет функции, классы и методы, а также связи вызовов между ними. Такой подход даёт структуру, привязанную к реальному синтаксису языка, а не к регулярным выражениям.

Обратная сторона - ограничение по языкам. В версии 0.2.1 поддерживаются только Python и TypeScript. Проект на Go, Java, C# или Rust с этим инструментом анализировать не получится, и это стоит проверить до установки.

Хранение в SQLite

Граф сохраняется в обычный файл SQLite. Его можно открыть любым клиентом, посмотреть таблицы и выполнить собственные запросы. Никаких внешних серверов, Docker-контейнеров и API-ключей не требуется: база лежит рядом с проектом, на том же диске.

Отсутствие embedding-модели означает, что поиск идёт по структуре кода, а не по семантической близости. Формулировка «найди код, который делает X» здесь не сработает так, как в RAG-системах с векторным индексом. Зато вопросы о связях получают однозначный и воспроизводимый ответ.

MCP-сервер: точные ответы для AI-агентов за один вызов

MCP-сервер - самая интересная часть проекта для тех, кто работает с кодинг-агентами. Вместо того чтобы самому разбираться с grep и регулярками, агент обращается к графу и получает готовый ответ.

Как MCP-сервер ускоряет работу агента

Обычный сценарий выглядит так: агент делает несколько раундов текстового поиска, уточняет запросы, отсеивает ложные совпадения и постепенно приближается к ответу. Каждый раунд съедает токены и место в контекстном окне, а результат всё равно может оказаться неполным.

С repopedia агент задаёт вопрос графу напрямую и получает точный ответ с указанием file:line за один вызов. Это меньше шагов, меньше токенов и меньше поводов ошибиться при сборке картины зависимостей.

Почему это особенно важно для локальных моделей

Автор прямо говорит, что MCP-сервер может быть ещё полезнее для локальных моделей, поскольку они не очень хорошо справляются с поиском. Модель, работающая на вашем железе, часто уступает облачным в многошаговых задачах навигации по репозиторию: ей сложнее удерживать состояние поиска и корректно обрабатывать длинные списки совпадений.

Граф снимает эту нагрузку. Вместо серии проб и уточнений локальная модель получает структурированный ответ, на который можно опереться при формулировке правки. Похожую логику разбирают в материале про TeaRAGs и локальный слой понимания кода, где граф вызовов тоже отдаётся агенту как готовое досье, а не как сырой список файлов.

Автор использует Claude Code как основной кодинг-агент, и обычно тот опирается на grep. Подключение MCP-сервера меняет источник данных: агент спрашивает граф, а не перебирает текст.

Практические сценарии: кто вызывает функцию и blast radius

Два вопроса, ради которых инструмент и создавался, звучат буднично, но закрывают частую боль при рефакторинге.

Поиск вызывающих

Запрос к графу возвращает список мест, где функция реально вызывается, с точной привязкой file:line. Комментарии, строки и одноимённые методы в него не попадают, потому что связи построены по синтаксису, а не по совпадению текста.

Оценка blast radius

Blast radius - это все транзитивные вызывающие: функции, которые вызывают изменяемую напрямую, и те, что зависят от них дальше по цепочке. Перед правкой общей функции такой список показывает реальный масштаб последствий и помогает не пропустить участок, который сломается.

Именно здесь текстовый поиск проигрывает сильнее всего. Чтобы собрать транзитивную цепочку вручную, нужно пройти по вызовам уровень за уровнем, и каждый шаг добавляет риск пропуска. Инструменты этого класса, включая CodeSlicer с проверяемым графом влияния, решают ту же задачу: дать разработчику и агенту проверяемую картину зависимостей вместо догадок.

Дополнительно repopedia умеет выгружать wiki по кодовой базе. Автор отмечает, что делал эту функцию в основном для себя, так что воспринимать её как полноценный генератор документации не стоит.

Ограничения и подводные камни версии 0.2.1

Номер версии говорит сам за себя: это ранняя стадия. Ниже перечислены ограничения, о которых автор предупреждает прямо, а не в мелком шрифте.

Поддерживаемые языки

Только Python и TypeScript. Если ваш стек другой, инструмент не подойдёт, и никакие настройки этого не изменят. Даже внутри поддерживаемых языков поведение зависит от качества разбора конкретных конструкций.

Проблема с self. и большими иерархиями классов

Вызовы методов через self. разрешаются сопоставлением по имени. Автор описывает это как «настолько ненадёжно, насколько звучит» для больших деревьев классов: если в иерархии есть методы с одинаковыми именами, граф может связать вызов не с тем методом. Для плоских модулей и утилитного кода риск невелик, для глубокого ООП-наследования он реален и требует проверки результатов вручную.

Ещё один момент: отсутствие embedding-модели означает, что семантический поиск недоступен в принципе. Инструмент отвечает на вопросы о структуре и связях, а не о смысле кода.

Автор также просит сообщать о случаях некорректной работы, то есть сам допускает, что инструмент может ошибаться. Независимых бенчмарков и сторонней проверки по этому проекту нет: все описанные возможности заявлены в исходном посте автора, и опираться стоит именно на этот статус данных.

Как установить и запустить repopedia

Порог входа низкий: пакет ставится через pip, после чего инструмент запускается на репозитории. Дальше он строит файл SQLite с графом кода, и этот файл можно исследовать запросами или отдать MCP-серверу.

  1. Установите пакет через pip.
  2. Запустите инструмент на корне нужного репозитория, чтобы он разобрал исходники и создал базу графа.
  3. Подключите MCP-сервер к вашему AI-агенту, чтобы он мог обращаться к графу напрямую.
  4. При необходимости выгрузите wiki по кодовой базе.

Точные имена пакета и параметров запуска в исходном описании не приводятся, поэтому перед установкой сверьтесь с репозиторием проекта. Это же касается формата подключения MCP-сервера к конкретному агенту: конфигурация отличается от клиента к клиенту.

Для сравнения: часть инструментов требует развернуть Docker-стек с векторной базой, прежде чем вы получите первый ответ. Здесь достаточно pip и локального SQLite. Если вы уже пробовали похожие решения, полезно посмотреть на Archex с детерминированным отбором контекста и на Agent DevTools, который хранит рабочий контекст агента в SQLite рядом с проектом: у них другой фокус, но требования к локальности совпадают.

Сравнение с альтернативами и контекст

Ключевое отличие repopedia от многих проектов того же класса лежит не в алгоритмах, а в условиях использования. Автор хотел взять GitNexus, но отказался из-за лицензии PolyForm. Многие инструменты графа кода требуют загрузить репозиторий в облако или поднять Docker-стек с векторной базой данных. На работе автора такой вариант не подходил.

repopedia закрывает эту нишу: MIT-лицензия, работа на локальной машине, один файл SQLite на выходе. Для команд, где код нельзя отправлять на сторонние серверы, это не удобство, а условие, без которого инструмент просто не может применяться.

КритерийrepopediaТипичный облачный анализатор
ЛицензияMITПроприетарная или ограниченная
Где обрабатывается кодЛокальноНа серверах вендора
Что нужно для запускаpip и репозиторийАккаунт, ключи, иногда Docker
Хранение графаФайл SQLite на дискеИндекс на стороне сервиса
Языки в версии 0.2.1Python, TypeScriptЗависит от сервиса

Обратная сторона свободы - зрелость. Облачные сервисы обычно дают более широкую поддержку языков и меньше сюрпризов при разборе сложных конструкций. repopedia на версии 0.2.1 предлагает узкий, но предсказуемый набор возможностей.

Кому подходит repopedia и стоит ли её использовать

Инструмент имеет смысл пробовать, если ваш проект написан на Python или TypeScript, а в работе вы используете кодинг-агента. Второе условие обязательно: без MCP-сервера вы получите только граф и запросы к нему, а основной выигрыш проявляется именно в связке с агентом.

Отдельная аудитория - пользователи локальных моделей. Когда модель работает на вашем железе и уступает облачным в навигации по репозиторию, структурированный ответ с file:line компенсирует часть этого разрыва и снижает число шагов, которые модели приходится делать самостоятельно.

Не подойдёт инструмент в трёх случаях. Первый: проект на языке за пределами Python и TypeScript. Второй: нужен семантический поиск по смыслу, а не по связям, ведь embedding-модели здесь не используются. Третий: кодовая база построена на глубокой иерархии классов с активным использованием self., где сопоставление методов по имени даёт ошибки.

Разумный способ проверить пользу - взять один модуль со сложными зависимостями и сравнить список вызывающих, собранный графом, с тем, что вы получите через grep. Разница в точности обычно видна сразу. Если результат совпадает с вашими ожиданиями, инструмент можно пробовать на всей кодовой базе; если нет, вы потеряете полчаса, а не неделю на интеграцию.

Подписаться на канал