oskelly-mcp
MCP server for browsing the public oskelly.ru catalog using 14 anonymous read-only tools to search products, apply filters, explore categories/brands, and fetch product details.
README
oskelly-mcp
MCP-сервер для публичного каталога oskelly.ru. 14 инструментов, только анонимные read-only операции, все проверены на живом сайте.
Неофициальный проект, не аффилирован с Oskelly. Читает ровно то, что видит любой посетитель без регистрации. Товарные знаки принадлежат их владельцам.
License
Installation
Node.js 22+.
git clone https://github.com/ihavealotofguap/oskelly-mcp.git
cd oskelly-mcp
npm ci
npm run build
npm run verify
-
Claude Desktop —
claude_desktop_config.json(Settings → Developer → Edit Config), путь обязан быть абсолютным:{ "mcpServers": { "oskelly": { "command": "node", "args": ["/abs/path/oskelly-mcp/dist/index.js"] } } }spawn node ENOENTна Windows → замените"node"на выводwhere node, слэши экранируются.- После правки полностью перезапустите приложение, включая иконку в трее.
-
Claude Code —
claude mcp add oskelly -- node /abs/path/oskelly-mcp/dist/index.js -
Отладка —
npm run inspector
Tools
| Tool | Что делает |
|---|---|
oskelly_describe_filters |
Шпаргалка по модели фильтров: коды, форматы, чем резолвить имя в id |
oskelly_search_products |
Поиск: запрос, фасеты, цена, булевы теги, пагинация, сортировка |
oskelly_search_facets |
Тот же запрос, но отдаёт счётчик и доступные фасеты вместо товаров |
oskelly_filter_values |
Значения одного фасета с id (brand, category, size, condition, …) |
oskelly_search_suggestions |
Автокомплит запроса |
oskelly_category_tree |
Дерево категорий, обрезка по rootId / depth |
oskelly_list_brands |
Бренды с id, поиск по подстроке, пагинация |
oskelly_list_conditions |
Состояния товара с описаниями |
oskelly_list_attributes |
Словарь атрибутов (материал, цвет, …) |
oskelly_get_product |
Карточка по id или URL: описание, атрибуты, размеры, фото, продавец |
oskelly_seller_products |
Товары продавца |
oskelly_seller_filters |
Что реально есть в ассортименте продавца |
oskelly_home_banners |
Баннеры главной (FEMALE/MALE/KIDS/LIFESTYLE) |
oskelly_banner_catalog |
Разворачивает баннер-подборку в пресет фильтров + товары |
Поток: describe_filters → list_brands/category_tree/filter_values → search_products → get_product.
Scope
Нет и не может быть логина, кук, корзины, избранного, сообщений, заказов. Это свойство кода:
credentials: "omit", никакихAuthorization/Cookie.- POST разрешён только на три read-only search-эндпоинта — allow-list
assertReadOnlyPostвsrc/client.ts. - Все tools:
readOnlyHint: true,destructiveHint: false. - Smoke-тест проверяет, что в списке tools нет имён с
login/cart/favourite/order/checkout/message/account.
Notes
- Карточка товара парсится из
__NUXT_DATA__. Публичного JSON-эндпоинта для одного товара нет (GET /api/v2/products/{id}→ 404), страница рендерится Nuxt 3 на сервере. Payload декодируется официальным пакетомdevalue— той же библиотекой, которой Nuxt его и сериализует; кастомные типы подключены через штатные revivers (src/nuxt.ts). Не Playwright: ~150 МБ Chromium и 3–5 с против одного GET за ~150 мс. - Слаг в URL игнорируется — значение имеет только числовой id в конце, tool принимает и то и другое.
- Формат фильтров в теле
/products/search*: мульти-выбор — массив id ({"brand": [675]}), булев — голый boolean ({"sale": true}), цена — объект ({"price": {"lower": 50000}}).{"brand": "675"}и{"sale": [true]}молча игнорируются,{"price": [a, b]}даётsuccess: false. - Цена фильтруется по размеру-SKU, не по цене карточки — товар может попасть в выдачу с ценой
карточки ниже границы, поэтому каждый ответ несёт
sizePriceRange: {min, max}. - Счётчики апстрима переименованы:
totalAmount→totalMatches,itemsCount→itemsOnPage. - Сегменты (
baseCategory) — id узлов дерева: Женское=2, Мужское=105, Детское=188, Лайфстайл=366. - WAF: кириллица в query обязана быть percent-encoded, иначе 403.
- Контекст: сырые ответы огромные (дерево ~1 МБ, бренды ~750 КБ), поэтому по умолчанию отдаётся
компактная проекция;
verbose: trueвозвращает нетронутый ответ.
Testing
npm run verify # офлайн: сервер стартует, 14 tools, все read-only
node smoke-test.mjs # живой end-to-end по MCP против oskelly.ru
Smoke-тест поднимает скомпилированный сервер отдельным процессом по stdio и дёргает каждый tool
против живого сайта — без моков. Параметры выстроены в цепочку из предыдущих ответов
(бренд → поиск → productId → sellerId → баннер), и каждый вызов проходит содержательную проверку:
PRICE_DESC действительно даёт убывающие цены, conditionIds: [1] — действительно только состояние 1,
фильтры сужают выдачу монотонно. Последний прогон — SMOKE-TEST-OUTPUT.txt
(23 вызова, 14/14 tools, 0 падений).
CI собирает проект на Node 22/24/26 и гоняет npm run verify. Живой smoke-тест вынесен в ручной
запуск (Actions → CI → Run workflow → run_smoke_test), чтобы не долбить чужой сайт с раннеров.
Structure
src/client.ts HTTP-клиент, конверт, allow-list на POST
src/nuxt.ts извлечение и декодирование SSR-payload (devalue)
src/search.ts схема и сборка тела запроса для /products/search*
src/format.ts компактные проекции ответов
src/tools.ts определения 14 инструментов
src/index.ts точка входа, stdio-транспорт
scripts/verify-server.mjs офлайн-проверка поверхности tools (CI)
smoke-test.mjs живой end-to-end тест по протоколу MCP
Contributing
PR приветствуются. Перед отправкой — npm run build, npm run verify, node smoke-test.mjs.
Самые ломкие места, если oskelly обновится: формат __NUXT_DATA__ (упадёт с явной ошибкой,
указывающей добавить reviver в src/nuxt.ts), коды фасетов, id сегментов. Rate-limiting
не тестировался; таймаут 45 с, ретраев нет — сознательно.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。