MCP-серверыMCP-серверыShopify APIИнтернет-магазины

Shopify через API и MCP: 262 действия REST, один GraphQL и три пробела в открытой спецификации, которых там официально нет

Разбираем Admin API Shopify изнутри: 262 действия REST — товары, заказы, клиенты, склад, скидки, доставка, контент витрины — плюс произвольный GraphQL-запрос для всего остального. Почему у самой популярной e-commerce платформы мира нет официальной машиночитаемой спецификации REST, что в итоге упустил лучший открытый разбор документации (вариант товара, транзакции по заказу — целиком), и как всё это доступно через MCP-сервер Mira без единой строки кода.

3 сентября 2026 г.6 мин чтения

Обзор

Shopify — крупнейшая в мире платформа интернет-магазинов, и у неё, что удивительно для API такого масштаба, нет официальной машиночитаемой спецификации REST. Есть отличная документация для людей и полная схема для GraphQL — а вот Swagger или OpenAPI для REST Admin API Shopify не публикует вовсе, хотя сам REST объявлен «устаревшим» только с октября 2024 года и остаётся рабочим до сих пор.

Mira подключает Shopify — 262 действия REST Admin API (товары, заказы, клиенты, склад, скидки, доставка, метаполя, вебхуки, контент витрины и ещё две дюжины разделов) плюс одно действие graphql для всего, чего в REST нет, — и отдаёт это в Claude через MCP. Ниже — что там есть на самом деле и с чем пришлось разбираться отдельно.

Доступ без единой заявки

Владелец магазина заводит доступ сам: админка → Settings → Apps and sales channels → Develop apps → Create an app → выбрать нужные разделы (Admin API scopes) → Install app. На выходе — постоянный токен shpat_…, показанный один раз. Ни заявки, ни ожидания, ни похода к нам за OAuth-согласием.

У Shopify есть и второй способ — публичное OAuth-приложение для сторонних разработчиков из Shopify Partners, авторизующее ЛЮБОЙ магазин через страницу согласия. Он нужен, если ты строишь приложение для чужих магазинов и хочешь попасть в Shopify App Store. Mira читает данные ОДНОГО подключённого магазина — self-service токена для этого достаточно, и партнёрский поток остаётся зафиксированным долгом на случай, если это когда-нибудь изменится.

Спецификации нет — пришлось собирать вручную

Официального Swagger/OpenAPI для REST Admin API у Shopify нет. Лучшее, что нашлось в открытом доступе — сторонний проект, автоматически разобравший документацию shopify.dev в OpenAPI-формат для версий API с 2020 по «unstable». Это 970 путей — солидный охват, но не безупречный: скрейпер терял целые ресурсы между прогонами по разным версиям API, а три ресурса не появлялись НИ В ОДНОЙ версии вовсе.

Первым делом обнаружилось, что базовый список и создание заказов (GET/POST /orders.json) отсутствовали в спецификации начиная с версии 2020-07 — притом что в версиях 2020-01 и 2020-04 они ещё были. Заказы же не исчезают из REST API просто так: значит, скрейпер их потерял, а не Shopify их убрал. Решение — собрать снимок объединением путей ВСЕХ версий сразу, а не только последней: то, что пропало в поздних прогонах, восстанавливается из ранних.

Следующим пробелом оказался Product Variant — вариант товара (цена, sku, остаток), одна из самых используемых сущностей API вообще, — которого не было НИ В ОДНОЙ из версий скрейпленной спецификации. Транзакции по заказу (Transaction, оформление списания и возврата денег) — то же самое, целиком пропавший ресурс. Базовый CRUD правил скидок (PriceRule) — туда же: вложенные промокоды в спецификации были, самого правила — нет.

Все три пробела закрыты не по памяти, а сверкой с живыми страницами shopify.dev — с указанием конкретной страницы и даты сверки прямо в исходниках. Заодно нашлось, что путь снятия удержания с отгрузки (release_hold) в источнике устарел: спецификация показывала старую форму без идентификатора отгрузки в адресе, а актуальный REST требует именно его.

REST — таблицей, GraphQL — одним действием

262 действия REST описаны таблицей: адрес, метод, параметры, барьер записи — всё данными, а не рукописными обработчиками. Тело у Shopify почти всегда обёрнуто в один ключ ресурса — {"product": {...}}, {"order": {...}} — и таблица фиксирует именно этот ключ, а не поля внутри него. Ровно два действия нарушают этот шаблон: отмена заказа принимает плоские поля без обёртки, а изменение порядка товаров в «умной» коллекции — и вовсе query-параметрами при пустом теле.

GraphQL Admin API таблицей не покрыт — у него единая типовая схема в тысячи полей, а не набор REST-путей. Вместо этого — одно действие graphql, принимающее произвольный запрос: барьер записи срабатывает, если в тексте запроса встречается слово mutation. Консервативно — модель может прочитать данные без подтверждения, а написать без разрешения на запись у источника не сможет.

Где деньги двигаются, а где только выглядят так

Из 130 действий под барьером записи только два реально двигают деньги магазина. Оформление возврата (POST /orders/{id}/refunds.json) исполняется платёжным шлюзом НЕМЕДЛЕННО при создании — в отличие, например, от Модульбанка, где платёж сначала лежит черновиком и только отдельное подписание его проводит. А вот предпросчёт возврата (тот же ресурс, тот же метод POST) деньги не трогает вовсе — это просто расчёт суммы, который Shopify прямо документирует как предпросчёт без применения.

Второе денежное действие — проведение транзакции по заказу — устроено ещё интереснее: один и тот же вызов покрывает и списание денег с карты покупателя, и возврат, в зависимости от параметра kind в теле запроса. Различать это на уровне таблицы означало бы разбирать содержимое запроса как код, чего остальные коннекторы Mira не делают нигде, — поэтому барьер здесь намеренно консервативен: вызов помечен тратящим целиком.

Чего нет — и почему

Исключать из таблицы можно только по трём поводам: эндпоинт удалён или объявлен deprecated в выбранной версии, вызов требует OAuth-приложения (или конкретного тарифа) или он вовсе не выполним без multipart-запроса. Под это подпадают всего три группы, и у каждой — прямая цитата источника. Billing API (16 действий, выставление счёта владельцу магазина за подписку) физически недоступен custom app: Shopify отвечает на такой запрос отказом «Apps without a public distribution cannot use the Billing API» — это привилегия приложений из App Store. Устаревший Checkout API (10 действий) Shopify называет deprecated прямым текстом: «The REST Checkout API is deprecated as of version 2024-07». Директория сотрудников (Users, 3 действия) документирована как «available for … custom apps installed on Shopify Plus stores» — не коммерческие данные, а вдобавок требует тарифа, которого может не быть.

Всё, что раньше исключалось по мотиву «это работа сайтостроителя, а не коммерческие данные» — блоги и статьи, комментарии, темы оформления, Script Tags, редиректы, юридические страницы, сохранённые фильтры поиска клиентов, токены Storefront API, сводка по способам оплаты, самодиагностика приложения, — в таблицу вернулось: у shopify.dev нет отдельной цитаты, которая объявляла бы именно ЭТИ ресурсы устаревшими или недоступными custom app, а «не коммерческие данные» — не повод, который правило признаёт. Правка кода темы или Script Tag остаётся под тем же барьером записи, что и любое другое изменение, — но с явным примечанием: это код, видимый любому покупателю магазина сразу. Shopify Payments (отчётность встроенного платёжного шлюза, 6 действий) и Sales Channel Listing (публикация в сторонний канал продаж, 11 действий) тоже вернулись — у первого нет отдельной цитаты про custom app (только практическая оговорка: шлюз недоступен в большинстве стран мира, включая Россию, ровно как у раздела «Отчёты» про Shopify Plus), у второго веб-проверка не нашла отдельного заявления shopify.dev про deprecated или retired — есть только общая пометка REST как legacy, которая касается всего REST Admin API одинаково.

Живая проверка

Живых ключей от боевого магазина Shopify нет — раздел появится, когда владелец магазина их даст. Разбор адреса и тела, барьер записи, заголовок X-Shopify-Access-Token (Shopify не использует схему Bearer), разбор конверта отказа и обработка GraphQL — включая разницу между протокольными ошибками и business-ошибками мутации внутри data — проверены против собственного HTTP-сервера в тестах, тем же приёмом, что у остальных коннекторов Mira, а не против *.myshopify.com.

Новости в Telegram

Подпишитесь на каналы — новые статьи и обзоры каждый день.

Источники

Ещё по теме «MCP-серверы»

MCP-серверы

1С через OData: как достать данные учётной базы без единой строки кода на встроенном языке

Разбираем стандартный OData-интерфейс 1С:Предприятие: чем он отличается от API конкретного сервиса, как узнать, что вообще опубликовано на конкретной базе, как проводить и отменять проведение документов и как всё это работает через MCP-сервер Mira без единой строки кода на встроенном языке.

3 сентября 2026 г.
MCP-серверы

CloudPayments через API и MCP: 32 метода, конверт отказа, который не отличает 400 от отклонённой карты, и Public ID, который просят дважды

Разбираем API CloudPayments изнутри: платежи, выплаты, подписки и счета чужого магазина — не биллинг самой Миры, — почему списание по сохранённому токену считается расходом, а обычная оплата картой нет, зачем платёжной ссылке СБП собственный Public ID в теле запроса поверх Basic Auth, и как всё это доступно через MCP-сервер Mira без единой строки кода.

3 сентября 2026 г.
MCP-серверы

Финтабло через API и MCP: 112 методов финучёта, семь путей без объявленных параметров и почему тут нет отчётов

Разбираем API Финтабло изнутри: 112 методов финансового учёта — ДДС, счета, контрагенты, сделки, зарплата, имущество, ОПиУ, — где спецификация поставщика сама не дописывает параметры пути, почему у четырёх PUT-запросов id дублируется в теле и куда делись отчёты. Всё доступно через MCP-сервер Mira без единой строки кода.

3 сентября 2026 г.