# Shopify Admin MCP (npm · mcp-shopify-admin)

MCP server for the Shopify Admin API: products, orders, customers, inventory, discounts.

- Trust score: 81/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `mcp-shopify-admin`: 81/100 (this document), [markdown](https://verifymcp.io/servers/a1-x-tech-mcp-shopify-admin/mcp-shopify-admin.md), [page](https://verifymcp.io/servers/a1-x-tech-mcp-shopify-admin/mcp-shopify-admin)

## Channel facts

- Registry: `npm`
- Package: `mcp-shopify-admin`
- Version: `1.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 96 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 28 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3746 tokens (~234/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 93/100
  - Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Shopify Admin MCP server?

Shopify Admin MCP runs locally as an npm package, launched with npx -y mcp-shopify-admin. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add a1-x-tech-mcp-shopify-admin -- npx -y mcp-shopify-admin
```

### Cursor

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-shopify-admin": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-shopify-admin"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "a1-x-tech-mcp-shopify-admin": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-shopify-admin"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add a1-x-tech-mcp-shopify-admin -- npx -y mcp-shopify-admin
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "a1-x-tech-mcp-shopify-admin": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-shopify-admin"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add a1-x-tech-mcp-shopify-admin --command npx --arg -y --arg mcp-shopify-admin
```

### Hermes

```yaml
mcp_servers:
  a1-x-tech-mcp-shopify-admin:
    command: "npx"
    args: ["-y", "mcp-shopify-admin"]
```

### Netclaw

```json
{
  "McpServers": {
    "a1-x-tech-mcp-shopify-admin": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-shopify-admin"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add a1-x-tech-mcp-shopify-admin -t stdio -c npx -a -y mcp-shopify-admin
```

### Other

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-shopify-admin": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-shopify-admin"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-18 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-12 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-08 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-06 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-03 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (16)

### `get_shop` (~143 tokens)

Данные магазина

Возвращает магазин, к которому привязан сервер: название, myshopifyDomain, основной домен витрины, валюту, тариф (plan), контактный email, часовой пояс, число товаров и список локаций (id локаций нужны инструменту set_inventory). Аргументов не принимает — магазин задан в SHOPIFY_STORE_DOMAIN и не выбирается для отдельного вызова. Как и у всех инструментов здесь, в ответе есть cost: состояние cost-бакета GraphQL (actualQueryCost — сколько стоил запрос, currentlyAvailable/maximumAvailable — остаток и размер бакета, restoreRate — восстановление в секунду).

### `list_products` (~237 tokens)

Список товаров

Возвращает страницу товаров магазина (id, название, handle, статус, вендор, тип, теги, общий остаток, до 5 вариантов с ценами) плюс count — число товаров под тем же фильтром. Пагинация курсорная: в ответе pageInfo-поля hasNextPage и endCursor, следующий вызов передаёт endCursor в after; параметра "номер страницы" у Shopify нет. query — строка поиска Shopify, например "status:active", "vendor:Nike created_at:>=2026-01-01", "title:*shirt*". Страница first до 250 за один вызов дешевле по cost-бакету, чем много мелких страниц.

Input parameters:

- `after` (string): endCursor предыдущей страницы — продолжить с него.
- `first` (integer): Размер страницы, 1..250. По умолчанию 20.
- `query` (string): Строка поиска Shopify, как есть: "status:active", "vendor:Nike", "tag:sale", "created_at:>=2026-01-01".

### `get_product` (~116 tokens)

Карточка товара

Возвращает один товар целиком: описание (HTML), опции, до 100 вариантов с ценами, остатками, SKU и id inventoryItem (этот id нужен инструменту set_inventory). Принимает числовой id или gid://shopify/Product/<id>. Несуществующий товар — это data: null, а не ошибка. Медиафайлы и метаполя не возвращает — за ними graphql_request.

Input parameters:

- `id` (string, required): Id товара: число или gid://shopify/Product/<id>.

### `create_product` (~273 tokens)

Создать товар

Создаёт товар и возвращает его с дефолтным вариантом, который Shopify добавляет сам. Товар НЕ появляется на витрине: созданные через API товары не опубликованы ни в одном канале продаж, и публикация делается отдельной операцией publishablePublish (её здесь нет — только через graphql_request). Статус по умолчанию — ACTIVE, но это не публикация: status: "DRAFT" дополнительно помечает товар черновиком. Цена задаётся следующим вызовом update_variant по id созданного дефолтного варианта (он есть в ответе). Варианты, изображения и остатки этот инструмент не создаёт. Повторный вызов создаст второй такой же товар. Провал приходит как ошибка с userErrors — HTTP-статус Shopify всегда 200.

Input parameters:

- `descriptionHtml` (string): Описание в HTML.
- `productType` (string): Тип товара в свободной форме.
- `status` (string): ACTIVE (по умолчанию; товар всё равно не опубликован в каналах продаж) | DRAFT (черновик) | ARCHIVED.
- `tags` (array): Теги.
- `title` (string, required): Название товара.
- `vendor` (string): Вендор/бренд.

### `update_product` (~211 tokens)

Изменить товар

Перезаписывает переданные поля товара (название, описание, вендор, тип, теги, статус) и не трогает остальные. tags замещают весь список тегов, а не добавляются к нему. Цены и остатки здесь не меняются — цены через update_variant, остатки через set_inventory. status: DRAFT снимает товар с витрины, ARCHIVED архивирует (обратимо — вернуть можно, снова передав ACTIVE). Провал приходит как ошибка с userErrors.

Input parameters:

- `descriptionHtml` (string): Новое описание в HTML.
- `id` (string, required): Id товара: число или gid://shopify/Product/<id>.
- `productType` (string): Новый тип.
- `status` (string): ACTIVE | DRAFT | ARCHIVED.
- `tags` (array): Полный новый список тегов (замещает старый).
- `title` (string): Новое название.
- `vendor` (string): Новый вендор.

### `update_variant` (~175 tokens)

Изменить цены варианта

Задаёт цену и/или зачёркнутую цену (compareAtPrice) вариантам одного товара — до 250 вариантов за вызов, каждый элемент variants несёт id варианта и новые значения. Суммы — десятичные строки в валюте магазина ("1999.00"); compareAtPrice: null убирает зачёркнутую цену. Больше ничего в варианте не меняет (SKU, штрихкод, опции — через graphql_request). Требуется id товара-родителя: он есть в ответах list_products и get_product. Провал приходит как ошибка с userErrors.

Input parameters:

- `productId` (string, required): Id товара-родителя: число или gid://shopify/Product/<id>.
- `variants` (array, required): Варианты одного товара с новыми ценами.

### `list_orders` (~216 tokens)

Список заказов

Возвращает страницу заказов, новые первыми (номер, дата, финансовый статус, статус выдачи, сумма, клиент) плюс count под тем же фильтром. Пагинация курсорная: hasNextPage/endCursor в ответе, следующий вызов передаёт endCursor в after. query — строка поиска Shopify: "financial_status:pending", "fulfillment_status:unfulfilled", "created_at:>=2026-08-01", "email:ivan@example.com". Нужен scope read_orders; заказы старше 60 дней требуют ещё read_all_orders — без него они просто не приходят.

Input parameters:

- `after` (string): endCursor предыдущей страницы — продолжить с него.
- `first` (integer): Размер страницы, 1..250. По умолчанию 20.
- `query` (string): Строка поиска Shopify: "financial_status:paid", "fulfillment_status:unfulfilled", "created_at:>=2026-08-01".

### `get_order` (~136 tokens)

Карточка заказа

Возвращает один заказ целиком: позиции (до 100), суммы (итог, доставка, возвраты), адрес доставки, заметку, теги, отгрузки с трек-номерами. Принимает числовой id или gid://shopify/Order/<id> — id, не «номер» вида #1001 (номер ищется через list_orders с query "name:#1001"). Несуществующий заказ — это data: null, а не ошибка.

Input parameters:

- `id` (string, required): Id заказа: число или gid://shopify/Order/<id> (не номер #1001).

### `cancel_order` (~278 tokens)

Отменить заказ

НЕОБРАТИМО отменяет заказ. Два решения обязательны и не имеют значений по умолчанию: refund — вернуть ли деньги покупателю, restock — вернуть ли позиции на склад. notifyCustomer управляет письмом покупателю. Отмена выполняется фоновой задачей: в ответе job, а не обновлённый заказ — итог стоит проверить через get_order. Уже выданный (fulfilled) заказ Shopify отменить не даст — это придёт ошибкой userErrors. Расформировать отмену нельзя; частичные возвраты этот инструмент не делает.

Input parameters:

- `notifyCustomer` (boolean): Отправить ли покупателю письмо об отмене.
- `orderId` (string, required): Id заказа: число или gid://shopify/Order/<id>.
- `reason` (string, required): Причина отмены: CUSTOMER (просьба покупателя), DECLINED (платёж отклонён), FRAUD, INVENTORY (нет товара), STAFF (ошибка персонала), OTHER.
- `refund` (boolean, required): Вернуть ли платёж покупателю. Обязательное решение.
- `restock` (boolean, required): Вернуть ли позиции заказа на склад. Обязательное решение.
- `staffNote` (string): Внутренняя заметка к отмене (покупателю не видна).

### `list_customers` (~217 tokens)

Список клиентов

Возвращает страницу клиентов (имя, email, телефон, число заказов, потраченная сумма, город) плюс count — число клиентов под тем же фильтром. Пагинация курсорная: hasNextPage/endCursor в ответе, следующий вызов передаёт endCursor в after. query — строка поиска Shopify: "email:ivan@example.com", "phone:+79001234567", "state:enabled", "created_at:>=2026-01-01". Клиентов не создаёт и не меняет — записи с персональными данными изменяются только через graphql_request. Нужен scope read_customers.

Input parameters:

- `after` (string): endCursor предыдущей страницы — продолжить с него.
- `first` (integer): Размер страницы, 1..250. По умолчанию 20.
- `query` (string): Строка поиска Shopify: "email:ivan@example.com", "state:enabled", "created_at:>=2026-01-01".

### `get_customer` (~106 tokens)

Карточка клиента

Возвращает одного клиента целиком: контакты, адреса, заметку, теги и его 10 последних заказов с суммами. Принимает числовой id или gid://shopify/Customer/<id>; клиент по email ищется через list_customers с query "email:...". Несуществующий клиент — это data: null, а не ошибка.

Input parameters:

- `id` (string, required): Id клиента: число или gid://shopify/Customer/<id>.

### `list_locations` (~96 tokens)

Список локаций

Возвращает локации магазина (склады и точки), включая неактивные: id, название, адрес, активность, выполняет ли онлайн-заказы. Именно id локации нужен инструменту set_inventory. У большинства магазинов локаций одна-две, так что страницы по умолчанию хватает.

Input parameters:

- `first` (integer): Размер страницы, 1..250. По умолчанию 20.

### `set_inventory` (~215 tokens)

Задать остатки

Устанавливает АБСОЛЮТНЫЙ доступный остаток (available) позиций на локациях — «стало N», не «изменить на N»: повторный вызов с теми же числами ничего не меняет. Каждый элемент quantities несёт inventoryItemId (id inventoryItem варианта — он в ответе get_product, это НЕ id варианта), locationId (из list_locations) и quantity >= 0. reason — из закрытого словаря Shopify, по умолчанию correction. Историю движений не пишет и резервы не трогает. Провал приходит как ошибка с userErrors — например, если позиция не отслеживается (inventory tracking выключен) или не привязана к локации.

Input parameters:

- `quantities` (array, required): Позиции и их новые абсолютные остатки.
- `reason` (string): Причина изменения из словаря Shopify (correction, received, damaged, restock, …). По умолчанию correction.

### `list_discounts` (~175 tokens)

Список скидок

Возвращает страницу скидок магазина — промокодных и автоматических: тип (__typename), название, статус, период действия, лимит использований, для кодовых — до 5 кодов и счётчик применений. Пагинация курсорная (hasNextPage/endCursor → after). query — строка поиска Shopify: "status:active", "type:code", "title:BLACKFRIDAY". Ничего не создаёт и не выключает.

Input parameters:

- `after` (string): endCursor предыдущей страницы — продолжить с него.
- `first` (integer): Размер страницы, 1..250. По умолчанию 20.
- `query` (string): Строка поиска Shopify: "status:active", "type:code", "title:BLACKFRIDAY".

### `create_basic_discount` (~363 tokens)

Создать промокод

Создаёт базовую промокодную скидку: один код, процент (percentage, доля 0..1: 0.2 = −20%) ИЛИ фиксированная сумма (amount в валюте магазина) — ровно одно из двух, для всех клиентов на все товары. startsAt по умолчанию — сейчас, то есть код начинает действовать немедленно; отложенный запуск задаётся явным startsAt. usageLimit — общий лимит применений, appliesOncePerCustomer — не больше раза на клиента. Скидки на отдельные коллекции/сегменты, BXGY и бесплатная доставка здесь не создаются (graphql_request), выключение скидки — тоже. Повторный вызов с тем же кодом провалится userErrors: код должен быть уникален.

Input parameters:

- `amount` (string): Фиксированная сумма скидки в валюте магазина, например "500.00".
- `appliesOncePerCustomer` (boolean): Не больше одного применения на клиента.
- `code` (string, required): Промокод, который вводит покупатель, например BLACKFRIDAY. Уникален в магазине.
- `endsAt` (string): Конец действия, ISO-8601. Без него скидка бессрочная.
- `percentage` (number): Доля скидки 0..1 (0.2 = −20%). Ровно одно из percentage/amount.
- `startsAt` (string): Начало действия, ISO-8601. По умолчанию — немедленно.
- `title` (string, required): Внутреннее название скидки (видно в админке).
- `usageLimit` (integer): Общий лимит применений кода.

### `graphql_request` (~305 tokens)

Произвольный GraphQL-запрос

Выполняет произвольный GraphQL-документ против Admin API магазина — для всего, чему нет отдельного инструмента (метаполя, медиа, коллекции, вебхуки, сегменты, bulk-операции). Токен, магазин и версию API подставляет сервер; переменные — через variables. Помечен destructive, потому что документ может быть мутацией; query безопасен. ВАЖНО: у мутаций Shopify HTTP 200 не значит успех — реальный вердикт в userErrors внутри data, и здесь он возвращается как есть, без интерпретации: поле userErrors нужно проверить самому. Ретраев для мутаций нет (повтор мог бы применить изменение дважды) — вид операции определяется разбором документа, поэтому мутация с фрагментом перед ней тоже не повторяется; THROTTLED повторяется сам после паузы. Стоимость запроса видна в cost ответа — глубокие вложенные выборки стоят дорого, а дороже 1000 очков запрос отклоняется валидатором Shopify.

Input parameters:

- `operationName` (string): Имя операции — обязательно, если документ содержит больше одной; без него сервер GraphQL не знает, какую выполнять.
- `query` (string, required): GraphQL-документ, например "query { shop { name } }" или мутация.
- `variables` (object): Переменные документа, объект JSON.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/a1-x-tech-mcp-shopify-admin/mcp-shopify-admin#diagnostics

## Score history

- 2026-09-20: 81
- 2026-09-19: 81
- 2026-09-18: 81
- 2026-09-17: 80
- 2026-09-16: 80
- 2026-09-15: 79
- 2026-09-14: 79
- 2026-09-13: 78
- 2026-09-12: 78
- 2026-09-11: 77
- 2026-09-10: 77
- 2026-09-09: 76
- 2026-09-08: 76
- 2026-09-07: 75
- 2026-09-06: 75
- 2026-09-05: 74
- 2026-09-04: 74
- 2026-09-03: 74
- 2026-09-02: 73
- 2026-09-01: 73
- 2026-08-31: 72
- 2026-08-30: 72
- 2026-08-29: 68
- 2026-08-28: 68
- 2026-08-27: 68
- 2026-08-26: 68
- 2026-08-25: 67
- 2026-08-24: 67
- 2026-08-23: 41

## Common questions

### What is the Shopify Admin MCP server?

Shopify Admin MCP is listed in the public MCP registry as io.github.A1-x-Tech/mcp-shopify-admin. MCP server for the Shopify Admin API: products, orders, customers, inventory, discounts. This page covers its npm package (mcp-shopify-admin).

### Is the Shopify Admin MCP server safe to use?

Shopify Admin MCP scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Shopify Admin MCP server expose?

Shopify Admin MCP exposes 16 tools: get_shop, list_products, get_product, create_product, update_product, and 11 more. Their descriptions and schemas cost roughly 3,262 tokens of context every time the server is loaded.

### Is the Shopify Admin MCP server still maintained?

Shopify Admin MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Shopify Admin MCP server under?

Shopify Admin MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/mcp-shopify-admin
- Socket report: https://socket.dev/npm/package/mcp-shopify-admin
- Repository: https://github.com/A1-x-Tech/mcp-shopify-admin
- Changelog RSS feed: https://verifymcp.io/servers/a1-x-tech-mcp-shopify-admin/mcp-shopify-admin.xml
- Changelog JSON feed: https://verifymcp.io/servers/a1-x-tech-mcp-shopify-admin/mcp-shopify-admin.json
- HTML version of this page: https://verifymcp.io/servers/a1-x-tech-mcp-shopify-admin/mcp-shopify-admin
