Когда вы ставите в VS Code популярные агентные расширения (Cline, Roo Code, Kilo), быстро выясняется одна мерзкая вещь. Обычно начинаешь подключать к ним новые инструменты быстрее , чем LLM под их капотом способна их адекватно переварить.
Сначала все выглядит безобидно. Вы подключаете к редактору пару MCP-серверов: один для файлов, другой для поиска. Агент радуется, вы радуетесь, всё работает. Но потом начинается: «О, прикручу-ка я еще сервер для базы данных… и GitHub… и внутреннюю Jira… и вон тот OpenAPI-каталог».
В какой-то момент вы открываете свой mcp.json и видите там 25 серверов. А агент начинает творить дичь.
На практике этот «зоопарк» приводит к вполне конкретным болям:
-
Инструменты начинают конфликтовать именами (у вас три разных
search). -
Описания функций (description blobs) становятся настолько длинными, что занимают больше места, чем сам код, который вы просите написать.
-
Модель выжигает контекстное окно (и ваши деньги) просто на то, чтобы вспомнить, какие ручки у нее вообще есть.
-
Агент путается в монструозных JSON-схемах и начинает галлюцинировать аргументами.
В итоге вы платите космические счета за токены не за «интеллект» GPT или Claude, а за то, что каждый раз показываете им мусорную свалку из сырых API.
Я устал платить за этот мусор и написал toolc — прокси-шлюз на Go, который встает между агентом и зоопарком серверов, жестко фильтруя и сжимая всё, что видит модель.
Что я сделал
Было: десятки сырых MCP-серверов и OpenAPI-спецификаций, которые напрямую «орут» в контекст модели.
Стало: один компактный слой, который сам решает, что показать модели сразу, что раскрыть только по запросу, а что вообще спрятать от греха подальше (например, ручку DROP TABLE).
Я не стал писать «убийцу MCP» или очередной тяжелый фреймворк. toolc — это совместимый runtime-фасад. Для вашего VS Code он выглядит как обычный, но единственный MCP-сервер. Для поддерживаемых локальных MCP stdio серверов и скомпилированных OpenAPI-поверхностей он прячет зоопарк за одним MCP-сервером.
Как это выглядит на практике (Сценарий: VS Code + MCP)
Представьте, что у вас есть стандартный, раздутый конфиг от Cline или Roo Code. Вы просто скармливаете его моей утилите:
./toolc optimize-mcp \ -input .vscode/mcp.json \ -emit vscode \ -out-dir dist/mcp-optimized
Вопрос, где взять бинарник ?
У вас два пути. Либо забрать готовый бинарник из раздела Releases на GitHub (есть под Windows, Linux, Mac), либо собрать из исходников, если на машине стоит Go: go install github.com/aak204/Tool-Catalog-Compiler/cmd/toolc@v1.0.0
Далее утилита читает ваш конфиг, пингует все сервера, собирает их инструменты, выкидывает дубликаты, сжимает маркетинговую воду из описаний и генерирует один новый конфиг.
Вы скармливаете этот новый конфиг редактору, и запускаете шлюз:
./toolc mcp-serve -catalog dist/mcp-optimized/toolc.compiled.json
Всё. Агент больше не видит хаоса. Он видит один сервер toolc, который выдает ему аккуратное меню.
Под капотом: три режима жадности
Я перевожу все спецификации (OpenAPI, функции, MCP) в единое внутреннее представление (IR). А дальше компилятор применяет магию, которую я разделил на три режима:
-
direct(сырой режим): показываем всё как есть. Нужен только для дебага и бенчмарков, чтобы поплакать над тем, как всё было плохо. -
flat(мой фаворит): основной рабочий режим. Модель получает «плоский», сжатый и дедуплицированный список. Минимум токенов, максимум пользы, ноль лишних запросов. -
staged(параноидальный режим): сначала отдаем модели только короткие названия инструментов (discovery). Если агент решает что-то вызвать, он делает отдельный запрос за точной схемой аргументов. Добавляет задержку сети, но спасает, когда схемы очень сложные или рискованные.
Спойлер: flat оказался лучшим дефолтным режимом по соотношению стоимости и полезности, но не универсальным победителем в каждом сценарии.
Кстати, парсить гигантские спецификации оказалось тем еще квестом. Когда я попытался скормить компилятору официальную OpenAPI‑спеку Stripe (а это монстр на мегабайты YAML/JSON с кучей рекурсивных ссылок), мой парсер просто сожрал десятки гигабайт памяти и упал с Out of Memory (OOM). Пришлось писать жесткие depth guards (ограничители глубины), лимитировать экспансию нод и переиспользовать ссылки (shallow ref-shell reuse), чтобы компилятор не пытался развернуть бесконечную рекурсию. Теперь Stripe переваривается за миллисекунды и жрет всего ~48 МБ памяти.
Меньше слов, больше метрик (или почему я сэкономил 60% денег)
Я инженер, поэтому прогнал всё это через жесткие бенчмарки на реальных спецификациях (включая GitHub API на 1100 эндпоинтов и монструозный Stripe API). Использовал OpenRouter и четыре топовые модели (Qwen-3.6-plus, GLM-5.1, GPT-5.4, Claude Sonnet 4.6).
Самый приятный график — это стоимость на миллион вызовов.

Вот сухие цифры по экономии:
|
Модель |
Цена без шлюза (direct) |
Цена с toolc (flat) |
Сэкономили |
|
|
$1807.26 |
$1199.13 |
33.65% |
|
|
$3102.53 |
$1593.14 |
48.65% |
|
|
$8819.46 |
$4291.96 |
51.34% |
|
|
$10736.57 |
$4290.21 |
60.04% |
Я не сделал модели умнее. Я просто перестал заваливать их мусором в системном промпте. За счет режима flat объем контекста (token proxy) падает драматически, а Success Rate у сильных моделей часто остается высоким, но не является универсальными 100% на всех сценариях.
Галлюцинации и боль (Случай с GLM)
Я не буду врать, что «всё всегда работает идеально». У меня был интересный кейс с z-ai/glm-5.1.
На ранних прогонах эта модель вела себя как студент после бессонной ночи: обрывала ответы, уходила в «размышления» и забывала вернуть JSON, ломала контракты.
Я начал копать. Выяснилось, что:
-
Я сам косячил, скармливая ей один и тот же системный промпт для разных шагов оркестрации. Claude это прощал, а GLM сыпалась.
-
Ей тупо не хватало лимита токенов на завершение (
completion budget).
Я вынес это в отдельный изолированный эксперимент (dist/glm-controlled). Развел контракты промптов, поднял лимиты. В итоге Success Rate в режиме flat вырос с 0.78 до 0.92.
Вывод: компиляция каталогов спасает от шума, но если модель «капризная», ей все равно нужны индивидуальные профили (request shaping). Магии не бывает.
Что дальше? (И чего я НЕ обещаю)
Я не строю «Control Plane для всего AI». Это был бы буллшит.
Сегодня toolc отлично справляется с:
-
Локальными MCP-серверами через
stdio. -
Скомпилированными OpenAPI-поверхностями.
-
Защитой контекста редакторных агентов.
Чего я НЕ обещаю прямо сейчас:
-
Магической поддержки удаленных MCP-транспортов (пока только локалка).
-
Полноформатного рантайма для обычных функций (generic functions).
-
Production-ready шлюза для OpenAI-compatible форматов (это в планах).
Итог
Если ваш агент в VS Code захлебывается от количества подключенных серверов, а счета за API вызывают нервный тик — попробуйте поставить между ними мой шлюз. Вам не придется переписывать код или сносить инфраструктуру. Вы просто уменьшите уровень шума.
Исходники, графики и инструкция по установке — всё лежит на GitHub. Я выложил v1.0.0, который закрывает главную боль с локальными MCP и OpenAPI. Но архитектура позволяет сделать из этого ультимативный Control Plane для любых агентов. Если вы пишете на Go, страдаете от зоопарка тулзов и у вас есть идеи — залетайте в репозиторий. Буду рад любым PR, баг-репортам и просто критике кода. Давайте сделаем этот инструмент еще мощнее вместе!
ссылка на оригинал статьи https://habr.com/ru/articles/1022874/