token-savior
⚔ token-savior
Хватит скармливать ИИ целые кодовые базы. Дайте ему скальпель.
MCP-сервер, который индексирует вашу кодовую базу структурно и предоставляет инструменты для хирургически точных запросов — чтобы ваш ИИ-агент читал 200 символов вместо 200 файлов.
find_symbol("send_message") → 67 chars (was: 41M chars of source)
get_change_impact("LLMClient") → 16K chars (154 direct + 492 transitive deps)
get_function_source("compile") → 4.5K chars (exact source, no grep, no cat)
analyze_config() → finds duplicates, secrets, orphan keysИзмерено на 782 реальных сессиях: сокращение потребления токенов на 99%.
Зачем это нужно
Каждая сессия программирования с ИИ начинается одинаково: агент использует cat или grep, читает десяток файлов, чтобы найти одну функцию, а затем перегружает свой контекст, пытаясь понять, что ещё может сломаться. В итоге половина бюджета токенов тратится ещё до первого изменения.
token-savior полностью меняет этот паттерн. Он один раз строит структурный индекс, автоматически синхронизирует его с git и отвечает на вопросы «где находится X», «что вызывает X» и «что сломается, если я изменю X» за доли миллисекунды — при этом объём ответов соответствует самому ответу, а не всей кодовой базе.
Цифры
Экономия токенов в реальных сессиях
Проект | Сессии | Запросы | Использовано символов | Символов (наивно) | Экономия |
project-alpha | 35 | 360 | 4,801,108 | 639,560,872 | 99% |
project-beta | 26 | 189 | 766,508 | 20,936,204 | 96% |
project-gamma | 30 | 232 | 410,816 | 3,679,868 | 89% |
ИТОГО | 92 | 782 | 5,981,476 | 664,229,092 | 99% |
«Символов (наивно)» = общий размер исходного кода всех файлов, которые агент прочитал бы с помощью
cat/grep. Эта экономия не зависит от модели — индекс снижает нагрузку на контекстное окно независимо от провайдера.
Время ответа на запрос (доли миллисекунды при 1.1 млн строк)
Запрос | RMLPlus | FastAPI | Django | CPython |
| 0.01мс | 0.01мс | 0.03мс | 0.08мс |
| 0.00мс | 0.00мс | 0.00мс | 0.01мс |
| 0.02мс | 0.00мс | 2.81мс | 0.45мс |
| 0.01мс | 0.02мс | 0.03мс | 0.10мс |
Производительность построения индекса
Проект | Файлы | Строки | Время индексации | Память |
Малый проект | 36 | 7,762 | 0.9с | 2.4 МБ |
FastAPI | 2,556 | 332,160 | 5.7с | 55 МБ |
Django | 3,714 | 707,493 | 36.2с | 126 МБ |
CPython | 2,464 | 1,115,334 | 55.9с | 197 МБ |
Благодаря постоянному кэшу последующие перезапуски пропускают полную сборку. CPython индексируется от 56с до менее чем 1с при попадании в кэш.
Что поддерживается
Язык / Формат | Файлы | Извлекаемые данные |
Python |
| Функции, классы, методы, импорты, граф зависимостей |
TypeScript / JS |
| Функции, стрелочные функции, классы, интерфейсы, псевдонимы типов |
Go |
| Функции, методы (receiver), структуры, интерфейсы, псевдонимы типов |
Rust |
| Функции, структуры, перечисления, трейты, блоки impl, macro_rules |
C# |
| Классы, интерфейсы, структуры, перечисления, методы, XML-комментарии |
Markdown / Текст |
| Секции через обнаружение заголовков |
JSON |
| Вложенная структура ключей до глубины 4, перекрестные ссылки |
YAML |
| Иерархия вложенных ключей, маркеры массивов, ограничение глубины 4 |
TOML |
| Таблицы, пары ключ-значение, вложенная структура |
INI / Properties |
| Секции, пары ключ-значение |
Environment |
| Имена переменных, значения (с маскированием секретов) |
XML / Plist / SVG |
| Иерархия элементов, атрибуты |
HCL / Terraform |
| Блоки, вложенные ресурсы, пары ключ-значение |
Conf |
| Пары ключ-значение, блочная структура |
Dockerfile |
| Инструкции, многоэтапные сборки, FROM/RUN/COPY/ENV |
Всё остальное |
| Подсчет строк (общий запасной вариант) |
51 инструмент
Навигация
Инструмент | Что делает |
| Где определен символ — файл, строка, тип, превью на 20 строк |
| Полный исходный код функции или метода |
| Полный исходный код класса |
| Все функции в файле или проекте |
| Все классы с методами и базовыми классами |
| Все импорты с модулем, именами, строкой |
| Краткий обзор структуры файла или проекта |
| Индексированные файлы с опциональным glob-фильтром |
| Количество файлов, пакеты, основные классы/функции |
| Поиск по регулярным выражениям во всех индексированных файлах |
| Принудительная полная переиндексация (редко требуется) |
Контекст и обнаружение
Инструмент | Что делает |
| Всё в одном: исходный код символа + зависимости + вызывающие стороны в одном вызове (экономит 3 вызова) |
| Найти все файлы, связанные с ключевым словом функции, затем транзитивно отследить импорты |
| Обнаружение API-маршрутов и страниц (Next.js App Router, Express, pages/api) |
| Обнаружение React-компонентов (функций, возвращающих JSX) в файлах |
| Найти все ссылки на переменную окружения во всей кодовой базе |
Анализ влияния
Инструмент | Что делает |
| Что вызывает/использует символ |
| Что вызывает/использует символ |
| Прямые + транзитивные зависимости в одном вызове |
| Кратчайший путь зависимости между двумя символами (BFS) |
| Файлы, импортируемые данным файлом |
| Файлы, которые импортируют из данного файла |
Git и diff-ы
Инструмент | Что делает |
| Ветка, опережение/отставание, staged, unstaged, неотслеживаемые файлы |
| Измененные файлы как сводки на уровне символов, а не diff-ы |
| Изменения на уровне символов с момента любого git-референса |
| Компактный обзор — символы вместо текстовых diff-ов |
| Компактная сводка коммита на основе измененных файлов |
Безопасное редактирование
Инструмент | Что делает |
| Заменить исходный код символа, не затрагивая остальную часть файла |
| Вставить контент до или после символа |
| Сделать снимок набора файлов перед редактированием |
| Восстановить из контрольной точки |
| Сравнение контрольной точки с текущим состоянием на уровне символов |
| Список доступных контрольных точек |
Тестирование и запуск
Инструмент | Что делает |
| Вывод вероятных затронутых pytest-файлов на основе измененных символов |
| Запуск только затронутых тестов — компактная сводка, а не сырые логи |
| Редактирование + запуск затронутых тестов в одном вызове |
| Редактирование + проверка + автоматический откат при сбое |
| Обнаружение команд тестирования/линта/сборки/запуска из файлов проекта |
| Выполнение обнаруженного действия с ограниченным выводом |
Анализ конфигурации
Инструмент | Что делает |
| Сканирование файлов конфигурации на наличие дубликатов, секретов, опечаток и «сиротских» ключей |
Выполняет три проверки (переключаются индивидуально через параметр checks):
Дубликаты — один и тот же ключ определен дважды в одном файле, плюс обнаружение опечаток на основе расстояния Левенштейна (например,
db_hsotпротивdb_host)Секреты — регулярные выражения для известных форматов секретов (API-ключи, токены, закрытые ключи) плюс анализ энтропии Шеннона для строк с высокой энтропией
Сироты — перекрестная проверка ключей конфигурации с фактическим использованием в коде. Обнаруживает ключи, которые ваш код никогда не читает, и переменные окружения, которые код ожидает, но они не установлены. Понимает
os.environ,process.env,os.Getenv,std::env::varи другие.
Поддерживаемые форматы: .yaml, .yml, .toml, .ini, .cfg, .properties, .env, .xml, .plist, .hcl, .tf, .conf, .json
Качество кода
Инструмент | Что делает |
| Поиск функций/классов с нулевым количеством вызовов (исключая точки входа, тесты, декорированные маршруты) |
| Ранжирование функций по сложности (строки, ветвления, вложенность, количество параметров) |
| Сравнение текущих сигнатур функций с git-референсом — помечает удаленные/переименованные параметры, измененные значения по умолчанию |
Docker
Инструмент | Что делает |
| Аудит Docker-файлов: базовые образы, открытые порты, перекрестные ссылки ENV/ARG, предупреждения о теге |
Мультипроектность
Инструмент | Что делает |
| Перекрестная проверка импортов между проектами для поиска общих зависимостей |
Статистика
Инструмент | Что делает |
| Совокупная экономия токенов на проект по сессиям |
vs LSP
LSP отвечает на вопрос «где это определено?» — token-savior отвечает на вопрос «что сломается, если я это изменю?»
LSP — это точечные запросы: один символ, один файл, одна позиция. Он может найти, где определен LLMClient и кто ссылается на него напрямую. Спросите «что сломается транзитивно, если я отрефакторя LLMClient?», и LSP ничего не ответит — ИИ пришлось бы рекурсивно вызывать десятки запросов поиска ссылок, читая файлы на каждом шагу.
get_change_impact("TestCase") в CPython находит 154 прямых зависимых элемента и 492 транзитивных за 0.45мс, возвращая 16К символов вместо чтения 41М. И в отличие от LSP, он не требует никаких языковых серверов — один бинарный файл «из коробки» покрывает Python + TS/JS + Go + Rust + C# + файлы конфигурации + Docker-файлы.
Установка
git clone https://github.com/Mibayy/token-savior
cd token-savior
python3 -m venv ~/.local/token-savior-venv
~/.local/token-savior-venv/bin/pip install -e ".[mcp]"Настройка
Claude Code / Cursor / Windsurf / Cline
Добавьте в .mcp.json в корне вашего проекта:
{
"mcpServers": {
"token-savior": {
"command": "/path/to/.local/token-savior-venv/bin/token-savior",
"env": {
"WORKSPACE_ROOTS": "/path/to/project1,/path/to/project2",
"TOKEN_SAVIOR_CLIENT": "claude-code"
}
}
}
}Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mibayy/token-savior'
If you have feedback or need assistance with the MCP directory API, please join our Discord server