proxima-primitive - библиотека Astro-компонентов, которую я собрал за один день: 32 компонента, семь категорий, доки в стиле shadcn, где каждый пример не картинка, а живой рендер прямо на странице. Отдельно от сайта в репозитории лежит MCP-сервер: агент спрашивает его напрямую и получает пропсы, исходники и примеры без единого захода в файлы руками.

Стек без лишнего веса
Astro 7.2.9 и Tailwind v4, без React, Vue или любой другой библиотеки
рендеринга - все компоненты серверные, .astro. Из зависимостей, которые
реально видны в интерфейсе: shiki для подсветки кода в доках, astro-icon
для иконок, tw-glass и tw-shimmer - два Tailwind-плагина, вокруг которых
построены отдельные компоненты-витрины. zod валидирует входные данные MCP-
инструментов. Ничего лишнего сверху.
Компоненты, ради которых стоит зайти
Библиотека честно разбита на приземленные вещи вроде Button, Badge и
Breadcrumbs, но интереснее раздел motion.


tw-glass собирает эффект без единого JS: фильтр - это data:-URI со
встроенной SVG-картой смещений на CSS-переменной, backdrop-filter
дочитывает ее нативно. filterUnits="objectBoundingBox" означает, что
преломление масштабируется вместе с элементом, а не прибито к пикселям.






Локальный MCP-сервер
У репозитория есть .mcp.json в корне, и это не витрина, а рабочий сервер:
bun mcp/server.ts, JSON-RPC по stdio, без порта и без хостинга. Агент внутри
этого репозитория подхватывает его сам, агенту снаружи достаточно прописать
абсолютный путь до server.ts в конфиге клиента.
{
"mcpServers": {
"proxima-components": {
"command": "bun",
"args": ["mcp/server.ts"]
}
}
}Четыре инструмента:
| Инструмент | Что делает |
|---|---|
list_components |
все компоненты по категориям, с фильтром по одной |
get_component |
полная дока: описание, примеры разметки, пропсы |
get_component_source |
сырой исходник файла реализации |
search_components |
поиск по имени, описанию и тексту доки |
Каждый компонент дополнительно читается как ресурс на
proxima://components/{id}. Смысл не в том, чтобы агент не читал файлы
вообще, а в том, чтобы не гадать: спросить search_components с фразой
«gradient text» быстрее, чем перебирать src/components по именам.
Почему доки и MCP не могут разойтись
Сервер не хранит отдельную копию данных о компонентах. mcp/registry.ts
руками парсит src/content/components/*.mdx: фронтматтер, тело доки и
каждый ```astro блок по порядку. Тот же файл рендерит и страницу в
браузере. Один источник - значит, невозможна ситуация, когда дока говорит
одно, а MCP-инструмент отвечает другое.
Это же оформлено как жесткое правило в CLAUDE.md проекта: добавил компонент
или поменял пропсы - в этом же проходе поправь mcp/registry.ts и проверь
результат:
bun -e 'import { loadComponents } from "./mcp/registry.ts"; console.log(await loadComponents())'Второе правило рядом: новый компонент не готов, пока не появился в навигации
доков. Сайдбар в DocsLayout.astro строится из коллекции components,
сгруппированной по category из фронтматтера - валидной категории обычно
достаточно, но astro dev не всегда подхватывает новый файл коллекции на
лету, так что финальная проверка - это чистая сборка.