Shopify MCP Server
Хостинговый сервер Model Context Protocol (MCP), который предоставляет Claude, Cursor, Windsurf и любому другому MCP-клиенту два инструмента Shopify только для чтения. Получайте каталог товаров любого публичного магазина Shopify по его URL, включая варианты, SKU и цены, а также просматривайте коллекции, в которых сгруппированы товары. Результаты представлены в виде структурированного JSON. Устанавливать приложение или получать токен продавца не нужно.
Сервер считывает каталог, доступный посетителю без входа в аккаунт, в любом классическом магазине Shopify — как на адресе myshopify.com, так и на собственном домене. Если магазин работает в режиме headless, запросы к нему обрабатываются на домене myshopify.com.
1 000 бесплатных кредитов каждый месяц, банковская карта не требуется — этого хватит на 200 вызовов Shopify по 5 кредитов за вызов.
https://mcp.hasdata.com/mcp?apis=shopify
Содержание
-
Что понадобится
-
Быстрый старт
-
Примеры запросов
-
Инструменты
-
Ошибки и возможные сбои
-
Цены, бесплатный тариф и ограничения
-
Выбор инструмента
-
Сравнение с другими решениями
-
FAQ
-
Ссылки HasData
-
Разработка
-
Участие в разработке
-
Лицензия
Что понадобится
MCP-клиент и API-ключ HasData, который можно бесплатно создать в панели управления; банковская карта не требуется. Бесплатного тарифа хватит примерно на 200 вызовов в месяц при стоимости 5 кредитов за вызов. Это удалённый сервер, поэтому для подключения достаточно URL и заголовка x-api-key — запускать контейнер не нужно. Если клиент поддерживает только stdio, подключиться к серверу можно через лёгкий лаунчер. Он опубликован в npm как @hasdata/shopify-mcp, а в PyPI — как hasdata-shopify-mcp. Примеры приведены ниже.
Быстрый старт
URL сервера одинаков для всех клиентов. Мы проверили подключение в Claude Code и Claude Desktop. Примеры для остальных клиентов соответствуют их документированному формату настройки удалённых серверов.
| Поле | Значение |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=shopify |
| Транспорт | HTTP, потоковый |
| Заголовок авторизации | x-api-key: HASDATA_API_KEY |
Клиенты с поддержкой OAuth могут добавить этот же URL в качестве коннектора и войти в систему, не указывая ключ в конфигурационном файле.
Claude Code
claude mcp add --transport http shopify "https://mcp.hasdata.com/mcp?apis=shopify" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Откройте Settings, затем Connectors, выберите Add custom connector, вставьте https://mcp.hasdata.com/mcp?apis=shopify и войдите в систему.
Если вы настраиваете подключение через файл конфигурации, учтите: Claude Desktop загружает только локальные серверы (stdio), поэтому для доступа к удалённому серверу потребуется stdio-лаунчер. Эту роль выполняет пакет @hasdata/shopify-mcp; он считывает ключ из переменной окружения. Добавьте следующий блок в claude_desktop_config.json:
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": ["-y", "@hasdata/shopify-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Если вместо Node вы используете Python, замените лаунчер на пакет из PyPI. Его можно запустить через uvx без предварительной установки:
{
"mcpServers": {
"shopify": {
"command": "uvx",
"args": ["hasdata-shopify-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
Используйте ~/.cursor/mcp.json, чтобы настроить подключение для всех проектов, или .cursor/mcp.json — только для одного проекта:
{
"mcpServers": {
"shopify": {
"url": "https://mcp.hasdata.com/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
Файл конфигурации находится по пути ~/.codeium/windsurf/mcp_config.json. В Windsurf поле называется serverUrl, а не url:
{
"mcpServers": {
"shopify": {
"serverUrl": "https://mcp.hasdata.com/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
Добавьте конфигурацию в файл .vscode/mcp.json в рабочей области:
{
"servers": {
"shopify": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Примеры запросов
Каждый из этих запросов обращается к одному инструменту. Если для второго инструмента нужны данные, полученные первым, используются два последовательных вызова.
-
Перечисли коллекции на allbirds.com и укажи, в каких из них больше всего товаров.
-
Получи первые 250 товаров этого магазина и сгруппируй их по
product_type. -
У каких вариантов этого магазина сейчас нет товара в наличии?
-
Найди все товары со скидкой, сравнив
priceиcompare_at_price. -
Просмотри страницы коллекции обуви в этом магазине и укажи диапазон цен для каждого размера.
-
Сравни цены на носки в этих двух магазинах Shopify.
Если в запросе указана категория, а не handle, потребуются два вызова: сначала нужно получить список коллекций, затем — товары из коллекции с подходящим handle. Инструмент для работы с коллекциями возвращает handle; это значение можно напрямую передать в аргумент collection инструмента для получения товаров.
Инструменты
| Инструмент | Что возвращает |
|---|---|
hasdata_shopify_collections_getCollections | Для каждой коллекции возвращает id, title, handle, описание body_html, изображение и временные метки. 5 кредитов за вызов |
hasdata_shopify_products_getProducts | Возвращает id, title, handle, vendor, product_type, tags, body_html, изображения, варианты с ценами, SKU и статусом наличия, а также временные метки. 5 кредитов за вызов |
Доступны два инструмента; успешный вызов каждого стоит 5 кредитов. Оба принимают URL магазина и позволяют постранично получать результаты с помощью параметров limit и page. Для limit можно задать значение до 250.
Получение товаров магазина Shopify
hasdata_shopify_products_getProducts
Возвращает страницу товаров одного магазина.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
url | string | да | URL магазина, например https://www.allbirds.com |
limit | number | Количество товаров на странице: от 1 до 250 | |
page | number | Номер страницы, начиная с 1 | |
collection | string | Ограничивает результаты одной коллекцией по её handle |
Результат содержит массив products. Каждый товар включает id, title, handle, body_html, vendor, product_type, tags, published_at, created_at, updated_at, массив options с названиями характеристик, по которым различаются варианты, массив images и массив variants.
Цена указывается для варианта, а не для товара. Каждый вариант содержит id, title, sku, price, compare_at_price, available, grams, position, requires_shipping, taxable, значения option1–option3 и собственные временные метки.
{
"id": 6889962537040,
"title": "Anytime Ankle Sock - Basin Blue",
"handle": "anytime-ankle-sock-basin-blue",
"vendor": "Allbirds",
"product_type": "Socks",
"updated_at": "2026-09-09T05:25:09-07:00",
"options": [{ "name": "Size", "position": 1, "values": ["S (W5-7)", "M (W8-10 / M8)", "L (W11 / M9-12)", "XL (M13-14)"] }],
"variants": [
{
"id": 40356485202000,
"title": "S (W5-7)",
"sku": "A10842U001",
"price": "16.00",
"compare_at_price": null,
"available": false,
"grams": 59,
"position": 1
}
],
"images": [
{
"id": 36355227844688,
"position": 1,
"src": "https://cdn.shopify.com/s/files/1/1104/4168/files/A10842_S24Q1_Anytime_Ankle_Sock_Basin_Blue_A-1400x1400.png?v=1776183348",
"width": 1400,
"height": 1400
}
]
}
Получение коллекций магазина Shopify
hasdata_shopify_collections_getCollections
Возвращает коллекции, в которых сгруппированы товары одного магазина.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
url | string | да | URL магазина, например https://www.allbirds.com |
limit | number | Количество коллекций на странице: от 1 до 250 | |
page | number | Номер страницы, начиная с 1 |
Результат содержит массив collections. Для каждой коллекции возвращаются id, title, handle, description, image, products_count, published_at и updated_at.
Это структура категорий, которую сам магазин использует для представления ассортимента. Поэтому инструмент позволяет с минимальными затратами увидеть, как конкурент группирует товары, прежде чем запрашивать каталог. Значение handle используется для связи коллекции с инструментом получения товаров.
{
"id": 135995326544,
"title": "Accessories",
"handle": "womens-accessories",
"description": "You know what they say: It's all in the details. Customize your look with planet-friendly face masks, hats, and more. ",
"published_at": "2019-08-05T14:01:17-07:00",
"updated_at": "2026-07-08T13:39:17-07:00",
"image": null,
"products_count": 28
}
Ошибки и нестандартные ситуации
Учитывайте возможные ошибки, а не рассчитывайте только на успешный сценарий.
price и compare_at_price — строки, а не числа. Они приходят в виде "16.00", именно так, как их публикует витрина. Преобразуйте значения перед сравнением или сложением: при сравнении строк "9.00" окажется больше "16.00".
У товара нет собственной цены. Все данные о стоимости нужно получать из массива variants. У товара с вариантами размера или цвета обычно несколько цен. Самая частая ошибка — прочитать первый вариант и считать его цену ценой товара.
Если скидки нет, compare_at_price равен null. Поэтому сначала проверьте значение на null и только потом сравнивайте цены.
Параметр available относится к отдельному варианту и отражает состояние на момент вызова. Товар не бывает «нет в наличии» — таким может быть конкретный вариант, и запасы меняются. Два вызова с разницей в несколько минут могут вернуть разные значения: это нормально при мониторинге, но может стать проблемой при сравнении каталогов.
Значение products_count у коллекции может быть равно нулю. Магазины оставляют опубликованными пустые, подготовительные и сезонные коллекции, поэтому пустая коллекция — обычная ситуация, а не ошибка вызова.
В магазинах публикуют товары, которые не продаются. Во многих каталогах есть внутренние, снятые с продажи и тестовые товары. Иногда это указано в названии, иногда — нет. Фильтруйте результаты по нужным условиям, а не считайте, что каждая запись — это товар, доступный для покупки.
tags — это произвольный текст, добавленный продавцом. Одни магазины используют теги как обычные ключевые слова, другие добавляют туда строки метаполей с пространствами имён. Считайте массив произвольным текстом.
body_html содержит HTML. Удалите HTML перед индексацией или встраиванием описания.
Значение collection.image часто равно null, как и featured_image у варианта. В таких случаях используйте массив images товара.
Даже если URL ведёт не на классическую витрину Shopify, сервер вернёт статус 200 и спишет оплату. В ответе не будет массива products, вместо него будет строка error, а requestMetadata.status останется равным ok. Перед чтением данных проверьте наличие массива: меняется структура ответа, а не его статус.
В headless-магазине Shopify запрос к собственному домену завершится ошибкой, а к домену myshopify.com — сработает. Headless-магазины обслуживают витрину через собственный интерфейс, поэтому каталог не опубликован на публичном домене. Если для магазина, который, как вы знаете, работает на Shopify, вернулась строка error, повторите запрос, используя https://.myshopify.com.
В ответах с данными также есть requestMetadata.id — указывайте его при обращении в поддержку.
Стоимость, бесплатный тариф и лимиты
Каждый инструмент Shopify стоит 5 кредитов за успешный вызов. Размер ответа на стоимость не влияет: страница с 250 товарами и страница с 3 товарами обходятся одинаково. Поэтому получить каталог целиком дешевле всего, запросив страницы максимального размера.
Бесплатный тариф включает 1 000 кредитов в месяц, банковская карта не требуется. По базовой ставке этого хватит на 200 вызовов Shopify. Кредиты обновляются в начале расчётного периода, поэтому агент с небольшим объёмом запросов может пользоваться бесплатным тарифом неограниченно долго.
Платные тарифы начинаются от $59 в месяц за 200 000 кредитов — этого хватит на 40 000 вызовов. При большем объёме стоимость единицы снижается: от $1.48 за 1 000 вызовов на начальном тарифе до $0.60 на Basic и $0.41 на тарифах Growth. Актуальные цены смотрите на странице с тарифами.
Тариф также определяет количество одновременных запросов. На бесплатном тарифе разрешён 1 запрос за раз, на Startup — 5, на Basic — 15, а на тарифах Growth — от 50 до 500. Для автоматических запросов при ответе 429 используйте повторные попытки с увеличивающимися интервалами: агент, который отправляет запросы сразу в несколько магазинов, упрётся в лимит раньше, чем вы успеете отреагировать.
Неуспешный запрос с ответом, отличным от 200, не тарифицируется. Успешный вызов, который ничего не нашёл, всё равно считается вызовом.
Выбор инструмента
Отталкивайтесь от того, что указано в запросе. Если вопрос касается самого каталога, используйте инструмент для товаров. Если нужно узнать, как организован магазин, или в запросе названа категория так, как её видят покупатели, сначала используйте инструмент для коллекций.
Затем выберите размер страницы. Оба инструмента принимают параметр limit до 250, и стоимость вызова при этом не меняется. Поэтому для получения каталога из 900 товаров потребуется четыре вызова, а не девяносто. Оставлять limit по умолчанию — одна из самых затратных привычек при работе с этим сервером.
По возможности фильтруйте данные на сервере. Если передать параметр collection инструменту для товаров, на получение нужной выборки потребуется один вызов. Если сначала загрузить весь каталог и фильтровать его локально, придётся запрашивать каждую страницу с данными, которые вам не нужны.
Сравнение с другими решениями
Shopify Admin API — официальный способ получить доступ к каталогу магазина, но он решает другую задачу.
| Shopify Admin API | Этот сервер | |
|---|---|---|
| Доступные магазины | Те, которыми вы владеете или к которым вам предоставили доступ | Любая публичная витрина |
| Настройка | Создание приложения, запрос разрешений, хранение токена для каждого магазина | Один заголовок |
| Учётные данные для каждого магазина | Да | Нет |
| Уровни запасов | Точные значения | Флаг available для каждого варианта |
| Черновики и скрытые товары | Доступны | Недоступны, поскольку не опубликованы |
| Заказы и клиенты | Доступны | Недоступны |
| Стоимость | Бесплатно в пределах лимитов запросов | После бесплатного тарифа — платно, 5 кредитов за вызов |
Главное различие — доступные магазины. Admin API предназначен для продавца, который работает со своим магазином, и требует токен, который может выдать только этот продавец. Поэтому этот API не подойдёт, если нужно сравнить свой магазин с десятью конкурентами. Если магазин принадлежит вам, Admin API предоставляет больше возможностей и доступен бесплатно — используйте его.
Часто задаваемые вопросы
Есть ли у Shopify собственный MCP-сервер?
Да, но он предназначен для других задач. У каждой подходящей витрины есть собственный MCP-сервер на её домене, а его инструменты рассчитаны на агента, который совершает покупки: например, ищет товары, собирает корзину и оформляет заказ. Такой сервер привязан к конкретному магазину, поэтому агенту, который сравнивает тридцать магазинов, понадобятся тридцать подключений. Этот сервер предназначен для массового чтения каталогов разных магазинов, поэтому задачи этих серверов не пересекаются. Если ваш агент покупает товары в одном магазине, используйте сервер Shopify.
Что такое Shopify MCP-сервер?
MCP-сервер предоставляет инструменты, которые может вызывать AI-клиент. Этот сервер преобразует публичный каталог любой витрины Shopify в JSON, с которым агент может работать без браузера и библиотек для скрейпинга в вашем стеке.
Нужны ли мне аккаунт Shopify, приложение или токен продавца?
Нет. Единственные учётные данные, которые понадобятся, — ваш ключ HasData.
Работает ли сервер с собственными доменами?
Для классической витрины — да: магазин на собственном домене работает так же, как магазин на myshopify.com. Исключение — headless-магазины. Их интерфейс обслуживается не Shopify, поэтому каталог не опубликован на собственном домене и запрос вернёт пустой результат. Для таких магазинов повторите запрос, используя https://.myshopify.com.
Как узнать, работает ли сайт на Shopify?
Вызовите инструмент для товаров и проверьте структуру ответа, а не его статус. Классическая витрина Shopify вернёт массив products. В остальных случаях сервер ответит статусом 200, строкой error и без массива. Такой ответ тарифицируется как любой другой успешный вызов.
Можно ли получить точное количество товаров в наличии?
Нет, доступен только флаг available, который публикуется для каждого варианта. Точные сведения об остатках не являются общедоступными: их можно получить через Admin API магазина, которым вы управляете.
Как загрузить каталог целиком?
Запрашивайте страницы с limit, равным 250, и увеличивайте page, пока не получите страницу с меньшим количеством результатов или пустую страницу. Стоимость зависит от количества страниц, а не товаров, поэтому максимальный размер страницы всегда позволяет получить каталог дешевле всего.
Можно ли использовать этот сервер вместе с другими API HasData?
Да. Один ключ подходит для всех API, а один эндпоинт обслуживает их через параметр apis. Укажите для клиента ?apis=shopify,amazon, чтобы подключить оба набора инструментов, или используйте mcp.hasdata.com/api/mcp, чтобы получить доступ ко всему каталогу.
Связана ли HasData с Shopify?
Нет. HasData — независимый сервис, не связанный с Shopify и не одобренный и не спонсируемый этой компанией. Shopify — товарный знак соответствующего владельца. Инструменты работают только с общедоступными данными. Вы несёте ответственность за использование полученных данных в соответствии с условиями магазинов, к которым обращаетесь, и применимым законодательством.
Соблюдение требований и персональные данные
Каталог товаров содержит коммерческие данные, а эти инструменты не возвращают сведения о клиентах, заказах или контактную информацию. В небольшом магазине поле vendor может содержать имя индивидуального предпринимателя — это единственное место, где могут встречаться сведения о человеке. Сохранение каталога конкурента — коммерческое, а не связанное с конфиденциальностью решение. Ознакомьтесь с условиями магазина, данные которого загружаете, и проверьте, какие обязательства лежат на вас.
Ссылки HasData
-
Shopify Scraper API — REST-эндпоинты, на которых основаны эти инструменты
Другие MCP-серверы HasData: Google Search, Google Maps, Google Trends, Google Flights, DuckDuckGo, YouTube, TikTok, Instagram, Amazon, Yelp, Zillow, Airbnb, Booking.com, Indeed.
Разработка
Запускатель — это простой мост stdio к удалённому серверу, поэтому сборка не требуется.
npm install
HASDATA_API_KEY=your_key_here npm test
Тесты в test/ проверяют контракт инструментов — ту часть, которая может сломаться без изменений в этом репозитории. Они проверяют, что ?apis=shopify возвращает ожидаемое количество инструментов, названия инструментов не изменились, для каждого инструмента указаны обязательные параметры и описание, а используемый API-ключ действительно принимается. Последняя проверка выполняет реальный вызов инструмента и стоит 5 кредитов — такова цена контрольного запроса, который может завершиться ошибкой по ожидаемой причине.
Набор тестов контракта также запускается еженедельно по расписанию: список инструментов на стороне сервиса может измениться, даже если никто не вносит изменений в этот репозиторий.
Участие в разработке
Если таблица инструментов, пример ответа или описанное поведение не соответствуют действительности, создайте issue — для этого есть специальный шаблон. Pull request’ы с такими исправлениями, а также с изменениями в запускателе, приветствуются.
Лицензия
MIT. См. LICENSE.