catalog-mcp
catalog-mcp
MCP-сервер, который превращает любой JSON-каталог в инструменты запросов для AI-агентов.
Укажите URL или файл каталога — фид инвентаря, список товаров, catalog.json, который публикует feedmerge — и любой MCP-клиент (Claude Desktop, Claude Code, всё, что говорит по протоколу) получит структурированную фильтрацию, группировку, ранжирование и обнаружение схемы по вашим записям.
Node 18+. Две зависимости времени выполнения: MCP SDK и zod.
Зачем
Агенты плохо работают с большими JSON-файлами, но хорошо — с инструментами. Отдайте агенту каталог на 2 МБ — он урежет, пролистает или выдумает записи; дайте ему catalog_query с грамматикой фильтра — и он каждый раз правильно ответит «самая дешёвая запись до 30 000 $ с этими двумя характеристиками», читая только совпадающие записи.
Этот репозиторий — обобщённая версия MCP-сервера, который я запускаю в продакшене: AI-помощник торгового зала сотни раз в день запрашивает живой каталог товаров через именно эти инструменты (та же семантика фильтра, то же правило отсутствия цены, тот же TTL-кэш). Конвейер, в который он входит:
vendor feed -> feedmerge -> catalog.json -> catalog-mcp -> any agent
(guarded sync) (versioned) (query tools)Я запускаю это на своём публичном фиде инвентаря; пример ниже использует нейтральный каталог, чтобы репозиторий был самодостаточным.
Быстрый старт
git clone https://github.com/stevyf93II/catalog-mcp.git
cd catalog-mcp
npm install
npm test # engine, loader, and stdio end-to-end tests
# serve the example catalog
node src/server.js --file examples/telescopes.json --key skuПодключите его к Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"my-catalog": {
"command": "node",
"args": ["/path/to/catalog-mcp/src/server.js"],
"env": {
"CATALOG_URL": "https://example.com/catalog.json",
"CATALOG_KEY": "sku"
}
}
}
}Затем спрашивайте агента вроде «какие типы есть в каталоге и сколько стоит каждый по нижней границе?» и наблюдайте, как он сам составляет catalog_schema, catalog_count_by и catalog_top.
Инструменты
Инструмент | Что делает |
| Фильтровать, сортировать, разбивать на страницы и проецировать записи |
| Получить одну запись по её ключевому полю |
| Сгруппировать по полю и подсчитать (поля-массивы считают каждый элемент) |
| Top-N записей по числовому полю с опциональным фильтром |
| Уникальные значения поля с количеством — изучите словарь поля перед фильтрацией по нему |
| Схема, выведенная из записей: типы, покрытие, числовые диапазоны, примеры значений |
| Количество записей, источник, возраст кэша, опциональные числовые сводки |
Все инструменты — только для чтения, идемпотентны и сообщают об этом в своих MCP-аннотациях.
Грамматика фильтра
Одна небольшая спецификация, используемая query, count_by и top:
{
"eq": { "type": "reflector", "goto": true },
"min": { "aperture_mm": 150 },
"max": { "price": 1000 },
"has": { "features": ["Parabolic Mirror", "Cooling Fan"] },
"contains": { "name": "dobsonian" }
}eq— строгое равенство для любого значения, включая булевы иnull.min/max— числовые границы. Запись без действительного числа в ограниченном поле исключается. Это правило критически важно: в производственном каталоге отсутствующая цена означает «уточняйте цену», и «покажи единицы до 30 000 $» никогда не должна выдать единицу, чья цена неизвестна.has— принадлежность массиву; каждое перечисленное значение должно присутствовать.contains— регистронезависимая подстрока в строковом поле; поле"*"ищет по всем строковым полям записи.
Условия объединяются по И. Неизвестный ключ верхнего уровня — это ошибка, которая перечисляет допустимые ключи, потому что молча игнорируемый фильтр — это как агент уверенно сообщает неверные ответы.
Сортировка помещает записи без поля сортировки в конец в обоих направлениях — «сортировать по цене» сначала показывает записи с ценой, а не стену из null.
Конфигурация
Переменная окружения | Флаг | Значение | |
|
| каталог по HTTP(S) (ровно один из url/file) | |
|
| каталог на диске | |
|
| dot-путь к массиву записей, напр. | |
|
| поле ключа записи для | |
|
| TTL кэша загрузки в секундах (по умолч. |
Когда CATALOG_RECORDS_PATH не задан, загрузчик использует корень документа, если это массив, или единственный массив объектов верхнего уровня, если он ровно один ({ "meta": ..., "items": [...] } просто работает). Если документ неоднозначен, он отказывается и перечисляет возможные ключи.
При неудачном обновлении сервер отдаёт последние хорошие данные вместо ошибки — агенту, находящемуся в середине задачи, лучше работать с пятиминутными записями, чем с исключением — и catalog_stats сообщает возраст кэша, так что устаревание никогда не скрывается.
Нецели
Не база данных. Каталог доступен только для чтения и хранится в памяти; если ваши данные не помещаются комфортно в JSON-файл, вам нужна настоящая СУБД.
Нет записи. Ничто здесь не изменяет каталог — это задача конвейера синхронизации (см. feedmerge).
Нет языка запросов. Пять ключей фильтра покрывают то, что агенты действительно спрашивают; всё более сложное должно быть в коде, а не в схеме инструмента.
Лицензия
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/stevyf93II/catalog-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server