LIMB
Вход Регистрация

тема

RLM MCP-сервер - индексатор кода для LLM-агентов

La_zet · · 7 ответов · 676 просмотров

Привет, MCP-сервер для структурной навигации по коду - спасает ваши токены в больших проектов.
Не реклама, не продажа - локальный инструмент для себя, делюсь подходом и личным опытом.
Первый и экслюзивный? пост для LIMB

Постановка проблемы:
когда проект перерастает ~50 файлов, AI-агент начинает терять контекст, стоимость и качество навигации растет .
Repo-map (tree-sitter карта) помогает, но это одноразовый снимок - сгенерировал, засунул в промпт, на следующую сессию забыл.

Что я сделал: 
MCP-сервер, который даёт агенту набор инструментов для точечного доступа к коду вместо заливки всего в контекст.
Вдохновлялся идеей RLM (Recursive Language Models).

Точечный доступ вместо контекстного окна
  • Основная идея RLM: агент не заливает весь код в промпт, а дёргает только то, что нужно прямо сейчас
  • На больших проектах это разница между "влезает в контекст" и "не влезает"

Экономия токенов (= денег)
  • Агент спрашивает symbols_find("handleAuth") → получает файл + строку + сигнатуру за 3 строки JSON, вместо того чтобы читать 500-строчный файл целиком, а потом ещё раз перечитывать при каждом повторном обращении
  • overview() даёт карту проекта (директории, количество файлов, экспорты) без чтения ни одного файла
  • deps("server.ts") → 22 зависимости за 1 запрос вместо rg "import" + ручной парсинг по всем файлам
  • На проекте 50+ файлов один запрос symbols_find экономит в разы меньше токенов на навигацию по проекту

Скорость ответов
  • Все запросы к индексу миллисекунды (0.1–0.5ms) - это SQLite с индексами, а не повторный парсинг AST
  • Инкрементальная переиндексация по хешу файла - при повторном index переиндексирует только изменённое

Что реализовано:

Персистентный индекс (SQLite) - символы, зависимости, описания модулей живут между сессиями
Граф зависимостей - deps("server.ts", direction="importers") → кто импортирует этот файл, с traversal до 3 уровней
Поиск символов- symbols_find("handleAuth")→ файл, строка, сигнатура, exported/internal
Symbol refs- symbol_refs("functionName") → все места вызова в проекте
Summaries - AI сам пишет краткие описания модулей, они сохраняются в БД и доступны в следующих сессиях
Overview - иерархический обзор проекта с экспортами по директориям, без чтения файлов
AST-поиск- через ast-grep, не regex а структурный паттерн
Инкрементальная индексация - по хешу файла, переиндексирует только изменённое

Чем отличается от обычного repo-map:

Repo-map - снимок.
Этот сервер - персистентная БД + граф, который обновляется инкрементально и доступен между сессиями через MCP-протокол.

Стек:

TypeScript, MCP SDK, better-sqlite3, ripgrep, ast-grep

Честные минусы:

TypeScript/JavaScript - полная поддержка (символы, deps, refs). Python - символы и deps работают, refs пока нет
Symbol refs - сырые, без полного cross-file linking через граф импортов (т.е. foo() найдёт, но не всегда свяжет с конкретным  export function foo из конкретного файла)
Индексацию нужно запускать вручную (нет file watcher)
Summaries генерирует AI по запросу - гибко, но требует промпт

Если кто-то делает что-то похожее или есть идеи по symbol linking - буду рад обсудить.

Спойлер: Что изучал / на что опирался:
RLM - 
Не удалось прогрузить медиа
Графы / нейро-подходы - 
Не удалось прогрузить медиа

Спойлер: скрины в работе с криптопроектом
Не удалось прогрузить медиа
Не удалось прогрузить медиа
👍61 ❤️11 🔥14 😁12 🤔7 💯14
ОтветLa_zet

Индексацию нужно запускать вручную (нет file watcher)

почему? логично держать процесс на ожидании изменений

почему именно MCP и под себя с нуля, и в единственном лице, когда есть аналоги уже в масс-маркете?
Сама по себе идея припрячь на отработку крипты ИИ - классная.  но на первый взгляд подход избыточный (имхо)
ОтветLa_zet

Summaries генерирует AI по запросу - гибко, но требует промпт

а что с валидацией цепочки последующих саммарис?
👍2
Ответr677

почему? логично держать процесс на ожидании изменений

Осознанное решение. RLM работает через MCP - агент вызывает index когда ему нужно, а не держит фоновый процесс. File watcher для MCP-сервера - это лишний процесс с fs.watch/chokidar, который жрёт ресурсы на каждый сейв автоформатирования, при этом индекс нужен только когда AI реально обращается к коду. Вызов index по запросу - это секунды, а watcher висит постоянно. Для проекта-учёбки и для реальной работы on-demand индексация - проще и чище.

«Почему MCP с нуля, а не готовый аналог?»
Потому что это pet-project для изучения MCP протокола, AST-парсинга и архитектуры инструментов для AI. Готовые аналоги (Sourcegraph, Cody, etc.) решают другую задачу - они mass-market products. Тут цель - понять как работает MCP-сервер изнутри, от stdio-транспорта до SQLite-индекса. «Зачем писать свой HTTP-сервер когда есть nginx?» - затем чтобы понять как работает HTTP.

«А что с валидацией цепочки саммарей?»
Вопрос нормальный. Summaries генерит AI по запросу и кеширует в SQLite. Валидация «цепочки» не нужна - каждый summary независим, это описание одного файла, а не цепочка зависимых состояний. Если файл изменился - при следующем summarize он перегенерится (есть force флаг). Это кеш, не блокчейн.
👍2
поясни, пожалуйста какая конкретно архитектура работала в этой связке?

Сейчас проблемы с MCP. Локально стоит qwen2.5. 14
👍1
Ответlisa99

поясни, пожалуйста какая конкретно архитектура работала в этой связке? Сейчас проблемы с MCP. Локально стоит qwen2.5. 14

Локальный mcp=node js скрипт, ллм вызывает его по заданому пути. Все очень просто на самом деле
👍2
ОтветLa_zet

Что я сделал:

упоминаю в статье для журнала - беру цитату.
может и расширится обсуждение))

Статью покажу в лс
👍1
Ответlisa99

упоминаю в статье для журнала - беру цитату. может и расширится обсуждение)) Статью покажу в лс

эта утилита-помогашка пишется за 2 дня :skull:
я просто показал, что это помогает в работе с агентами при минимальных усилиях
👍1
ОтветLa_zet

эта утилита-помогашка пишется за 2 дня :skull:

2.речь уже  не только об утилите, а о SAST вообще.

ОтветLa_zet

я просто показал, что это помогает в работе с агентами при минимальных усилиях

1. "Если кто-то делает что-то похожее или есть идеи по symbol linking - буду рад обсудить."

вот может кто и придет обсудить
👍2

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.