Infostart --- # code-index-mcp [![Релиз](https://img.shields.io/github/v/release/Regsorm/code-index-mcp)](https://github.com/Regsorm/code-index-mcp/releases/latest) [![npm](https://img.shields.io/npm/v/%40regsorm%2Fcode-index-mcp)](https://www.npmjs.com/package/@regsorm/code-index-mcp) [![Лицензия](https://img.shields.io/github/license/Regsorm/code-index-mcp)](LICENSE) **Поиск по коду для ИИ-агентов. Один бинарник, индекс в SQLite, ответ за миллисекунды. Разбирает выгрузки 1С:Предприятие 8.3 — и из Конфигуратора, и из 1С:EDT.** [Полное руководство](README_RU.md) · [English](README_EN.md) · [Документация](docs/) · [Журнал изменений](CHANGELOG.md) --- ## Установка ### Windows — одной командой ```powershell irm https://raw.githubusercontent.com/Regsorm/code-index-mcp/main/install.ps1 | iex ``` Скачивает последний выпуск в `C:\tools\code-index`, запоминает папку в переменной окружения, создаёт заготовку файла настроек и печатает готовый блок для `.mcp.json`. С параметрами — папка установки, папка с исходниками, автозапуск при входе в систему: ```powershell & ([scriptblock]::Create((irm https://raw.githubusercontent.com/Regsorm/code-index-mcp/main/install.ps1))) ` -InstallDir 'D:\code-index' -Repo 'main=D:\Repo1C' -RegisterAutostart ``` Автозапуск идёт через папку автозагрузки пользователя: прав администратора не требует, окон не показывает. Остальные параметры — `-Flavor core` для сборки без 1С, `-Version 1.0.0` для конкретного выпуска, `-Port` и `-DaemonPort`, если порты по умолчанию заняты. Полный список — `Get-Help .\install.ps1 -Detailed`. ### Windows — вручную, готовый архив из выпуска Скачивает последний выпуск, распаковывает в `C:\tools\code-index` и запоминает эту папку в переменной окружения: ```powershell $dst = 'C:\tools\code-index' New-Item -ItemType Directory -Force $dst | Out-Null $url = (Invoke-RestMethod https://api.github.com/repos/Regsorm/code-index-mcp/releases/latest).assets | Where-Object name -eq 'bsl-indexer-windows-x64.zip' | Select-Object -ExpandProperty browser_download_url Invoke-WebRequest $url -OutFile "$env:TEMP\code-index.zip" Expand-Archive "$env:TEMP\code-index.zip" -DestinationPath $dst -Force setx CODE_INDEX_HOME $dst ``` `bsl-indexer` — сборка с поддержкой 1С (42 инструмента). Нужна работа без 1С — возьмите `code-index-windows-x64.zip` (25 инструментов). Для Linux и macOS в том же выпуске лежат `*-linux-x64.tar.gz` и `*-macos-arm64.tar.gz`. Дальше — файл настроек, запуск, подключение клиента и автозапуск. Всё это без скриптов, по шагам: [установка вручную](docs/manual-install.md) ([English](docs/manual-install_EN.md)). ### npm ```bash npm install -g @regsorm/code-index-mcp npx @regsorm/code-index-mcp serve --path /путь/к/репозиторию ``` Шаг `postinstall` скачивает готовый бинарник под вашу платформу — ничего не компилируется. Пакет есть и в [реестре MCP](https://registry.modelcontextprotocol.io/) под именем `io.github.Regsorm/code-index`. В обёртке только сборка без 1С. Сервер `serve` только читает индекс, строит его фоновый индексатор. Поэтому должны быть запущены `npx @regsorm/code-index-mcp daemon run` и задана переменная `CODE_INDEX_HOME` — иначе инструменты отвечают `daemon_offline`. Настройка — в [полном руководстве](README_RU.md#настройка-фонового-демона-v05). ### Сборка из исходников ```bash git clone https://github.com/Regsorm/code-index-mcp.git cd code-index-mcp cargo build --release -p code-index # без 1С cargo build --release -p bsl-indexer --features enrichment # с поддержкой 1С ``` Нужен Rust 1.77+. ## Подключение к клиенту Общий процесс по HTTP — один индекс на все сессии и все проекты. HTTP-сервер встроен в программу, отдельный веб-сервер не нужен; по умолчанию он слушает только `127.0.0.1`: ```json { "mcpServers": { "code-index": { "type": "http", "url": "http://127.0.0.1:8011/mcp" } } } ``` Слушает только `127.0.0.1` и принимает только loopback-значения заголовка `Host`. Сервер в сети (`--host 0.0.0.0` или `[me].ip` в `serve.toml`) перечисляет имена клиентов в `[me].allowed_hosts` либо в `CODE_INDEX_ALLOWED_HOSTS` — иначе `/mcp` отвечает `403 Host header is not allowed`. Подробности — [полное руководство](README_RU.md#какие-значения-host-принимает-mcp-v186). Отдельный процесс на сессию (`stdio`) — клиент сам запускает сервер при открытии сессии, порт не нужен. Фоновый индексатор (`daemon run`) при этом тоже должен работать: сервер только читает индекс, а строит его индексатор. Без него инструменты отвечают `daemon_offline`: ```json { "mcpServers": { "code-index": { "command": "npx", "args": ["-y", "@regsorm/code-index-mcp", "serve", "--path", "."] } } } ``` Работает с Claude Code, Cursor, VS Code, LibreChat — с любым клиентом MCP. Настройка фонового демона, список репозиториев, тонкие параметры — [полное руководство](README_RU.md#настройка-фонового-демона-v05). ### Гард: чтение через индекс (необязательно) Правило «по индексированным каталогам читай через code-index» модель под нагрузкой забывает и уходит в обычное чтение файлов, которое в 3–10 раз дороже по токенам. `code-index-guard` — хук `PreToolUse` для Claude Code и Codex CLI: отклоняет обычное чтение, поиск и обход каталога только там, где индекс отдаёт тот же файл, и подсказывает нужный инструмент. Новый, ещё не проиндексированный или исключённый из индекса файл читается как обычно. Сборка и установка — [crates/code-index-guard](crates/code-index-guard/README.md). ### Копия проекта с готовым индексом `code-index-copy` делает копию проекта (файлы под контролем git или `git worktree` на новой ветке) и переносит в неё базу индекса, так что индекс копии не строится заново: демон копии при запуске только сверяет файлы с базой. Файлы исходника вне git из базы копии убираются, конфиги демона и сервера выдачи копии пишутся сразу. Подробности — [crates/code-index-copy](crates/code-index-copy/README.md). ## Зачем это нужно Языковая модель без индекса ищет по коду тем же способом, что и человек без среды разработки: перебором. Один вопрос «кто вызывает эту процедуру» превращается в десяток последовательных обходов файлов, каждый из которых читает тысячи файлов и возвращает в контекст модели куски текста — вместе с оплатой этих кусков. `code-index` делает работу заранее: разбирает исходники в синтаксическое дерево, складывает символы, тела, вызовы и метаданные в SQLite и отдаёт агенту готовый ответ по протоколу MCP. Модель получает три строки вместо трёх файлов. ## Цифры В среднем в 2,04 раза дешевле по токенам, в 1,78 раза быстрее, 51 % экономии за сеанс | Кодовая база | Файлов | Полная индексация | Запуск на готовом индексе | |---|---:|---:|---:| | 1С:Управление Торговлей | 57 072 | 2 мин 41 с | **2,3 с** | | 1С:Бухгалтерия предприятия | 88 284 | 5 мин 51 с | **5,3 с** | | сайт на PHP | 157 772 | 13 мин 1 с | **8,0 с** | **Полная индексация** — разбор всего с нуля, делается один раз. У Бухгалтерии эти 5 мин 51 с складываются так: 2 мин 38 с ядро (синтаксические деревья и запись), 1 мин 58 с надстройка 1С (метаданные, формы, права, граф вызовов), 56 с сброс базы на диск. Дальше правки подхватываются по одной, за миллисекунды. **Запуск на готовом индексе** сверяет время правки и размер каждого файла — ни одного чтения содержимого, ни одного хеша. | | | |---|---| | Ответ на запрос | около 10 мс по HTTP, повторный из кэша — доли миллисекунды | | Размер бинарника | 39 МБ без 1С, 41 МБ с 1С | | Функций в индексе Управления Торговлей | 261 548 | | Вызовов в графе там же | 1 962 941 | Замеры сделаны на одной машине под Windows с обычным жёстким диском, август 2026. ## Инструменты Каждый вызов принимает алиас репозитория, так что один сервер обслуживает несколько кодовых баз сразу — в том числе с других машин. **Поиск и навигация** | | | |---|---| | `search_function` `search_class` | полнотекстовый поиск по функциям и классам | | `get_function` `get_class` | точное имя → готовое тело; при промахе подсказывает похожие имена | | `find_symbol` | символ любого рода: функция, класс, переменная, импорт | | `get_imports` | импорты модуля или файла | | `get_file_summary` | карта файла без чтения исходника | **Граф вызовов** | | | |---|---| | `get_callers` `get_callees` | кто вызывает процедуру и кого вызывает она | | `find_path` | кратчайшая цепочка вызовов между двумя функциями | | `get_call_tree` | дерево вызовов вниз или вверх на заданную глубину | **Содержимое файлов** | | | |---|---| | `read_file` | чтение с диапазоном строк; содержимое кода лежит в индексе, сжатое zstd | | `list_files` `stat_file` | список файлов по маске и метаданные одного файла | | `grep_body` | подстрока или регулярное выражение в телах функций и классов | | `grep_code` `grep_text` | то же по всему тексту файлов кода и текстовых файлов | | `search_text` | полнотекстовый поиск по текстовым форматам | | `get_stats` `health` | состояние индекса и сервера | **Git** (включается `git = true` у записи `[[paths]]`; `git_path` — если репозиторий лежит выше индекса) | | | |---|---| | `git_log` | история коммитов ревизии или локальной даты с фильтром по пути | | `git_changed_files` | изменённые файлы между двумя снимками: статусы, переименования, бинарные | | `git_changes_by_object` | те же изменения, сгруппированные по объектам метаданных 1С | | `git_diff` | unified diff одного файла с контекстом и пределом длины | | `git_show_file` | историческое содержимое файла с диапазоном строк | Даты — `YYYY-MM-DD`, `YYYY-MM-DD HH:MM`, `YYYY-MM-DDTHH:MM`; зону можно задать параметром `tz` (`+03:00` или `UTC`), иначе берётся локальная зона исполняющей машины (в контейнере ноды это UTC, `timezone` есть в каждом ответе). Пути — от корня индекса (для подкаталога изменения вне его не видны; для bare — от корня репозитория). Shallow-клон отвергается с подсказкой `git fetch --unshallow`, сеть инструменты не используют, а правка `git`/`git_path` применяется без перезапуска. **Для конфигураций 1С** (сборка `bsl-indexer`, появляются сами при наличии репозитория с выгрузкой) | | | |---|---| | `get_object_structure` | реквизиты с типами и синонимами, табличные части, измерения и ресурсы, предопределённые элементы, свойства проведения | | `get_object_profile` | паспорт объекта одним вызовом: структура, формы, модули, связи | | `get_form_handlers` | обработчики событий управляемой формы, с привязкой к элементу | | `get_event_subscriptions` | подписки на события: явные источники, наборы и определяемые типы, менеджеры, расширения; способ совпадения и предупреждения о неполноте | | `get_data_links` `find_data_path` | граф связей данных: кто на кого ссылается и цепочка между двумя объектами | | `find_references` | карта влияния: ссылки из метаданных, обращения в коде, права ролей | | `get_register_writers` | регистраторы регистра и движения документа | | `find_path_bsl` | цепочка вызовов процедур по графу выгрузки | | `query_call_sites` | вызовы с контекстом места: в цикле, в `Попытке`, с глубиной вложенности | | `get_node_structure` | скелет процедуры: циклы, `Попытка` и ветки с номерами строк | | `get_line_context` | что находится на строке: процедура, содержащие её блоки, признаки | | `search_terms` | смысловой поиск процедур по именам, синонимам и комментариям | | `get_role_rights` | права ролей на объект и права одной роли | | `bsl_sql` | произвольный запрос на чтение к таблицам метаданных и графов | ## Что даёт поддержка 1С - Разбираются обе формы выгрузки: XML из Конфигуратора и `.mdo` из 1С:EDT. - Граф связей данных строится по ссылочным типам реквизитов, измерений и табличных частей: для Бухгалтерии предприятия это 65 421 ребро. - Из модулей извлекаются директивы компиляции (`&НаСервере`, `&НаКлиенте`) и аннотации расширений (`&Вместо`, `&После`, `&Перед`) вместе с именем переопределяемой процедуры. - Понимаются оба синтаксиса BSL — русский и английский. - Регистр имени объекта не важен: кириллические имена приводятся к записи из конфигурации, в ответе имя показывается канонически. Подробности — [docs/bsl-indexer.md](docs/bsl-indexer.md). ## Языки Полный разбор синтаксиса: Python, JavaScript, TypeScript, Java, Rust, Go, PHP, C, C++, C#, Ruby, Swift, 1С (BSL), HTML. Метаданные 1С — XML Конфигуратора и `.mdo` из EDT. Плюс полнотекстовая индексация 50+ текстовых форматов (`.md`, `.json`, `.yaml`, `.toml`, `.sql` и других). ## Дальше - [Полное руководство на русском](README_RU.md) — демон, конфигурация, CLI, архитектура - [docs/operations.md](docs/operations.md) — эксплуатация: перезапуск, добавление репозиториев, диагностика - [docs/bsl-indexer.md](docs/bsl-indexer.md) — сборка для 1С - [CHANGELOG.md](CHANGELOG.md) — журнал изменений ## Участие Ошибки и предложения — в [issues](https://github.com/Regsorm/code-index-mcp/issues), вопросы и обсуждения — в [Discussions](https://github.com/Regsorm/code-index-mcp/discussions). Как прислать правку — [CONTRIBUTING.md](CONTRIBUTING.md), об уязвимостях — [SECURITY.md](SECURITY.md). ## Лицензия MIT, см. [LICENSE](LICENSE). Проект стоит на [tree-sitter](https://tree-sitter.github.io/), [грамматике BSL от сообщества 1c-syntax](https://github.com/1c-syntax/tree-sitter-bsl), [rusqlite](https://github.com/rusqlite/rusqlite), [rayon](https://github.com/rayon-rs/rayon) и [Rust SDK для MCP](https://github.com/modelcontextprotocol/rust-sdk).