yampi-mcp
MCP-сервер, который позволяет общаться с вашим магазином Yampi через Claude — просматривать заказы, создавать товары, корректировать остатки, создавать купоны и предложения.
Каждый продавец размещает собственную копию на Cloudflare. Это не сервис: никто, кроме вас, не держит ваши учётные данные. Неофициальный проект, не связан с Yampi.
Как это работает
Учётные данные Yampi принадлежат пользователю, а не магазину: если под одним логином работают четыре магазина, отображаются все четыре. Вы подключаетесь один раз и выбираете магазин в каждой команде.
Related MCP server: MCP Shopify
Настройка
Вам понадобится аккаунт Cloudflare (бесплатного тарифа достаточно) и установленный Node.
git clone https://github.com/Eduardo-Orsi/yampi-mcp && cd yampi-mcp
npm install
cp wrangler.example.jsonc wrangler.jsonc
npx wrangler kv namespace create OAUTH_KV # paste the returned id into wrangler.jsonc
npx wrangler deployВ вашем клиенте Claude (claude.ai, Desktop или Code) добавьте пользовательский коннектор, указав
https://yampi-mcp.<ваш-поддомен>.workers.dev/mcp.
При подключении на экране появится запрос на ввод User-Token и User-Secret-Key. Вы найдёте их в панели Yampi в разделе Perfil › Credenciais de API (Профиль › Учётные данные API). Вот и всё — создавать пароль не нужно.
Использование
После подключения это просто разговор:
«Сколько оплаченных заказов получил магазин X с 1 по 15 июня?» «Создай товар Black T-Shirt, бренд Acme, SKU TS-BLACK-M, 79,90 R$, 20 в наличии.» «У SKU TS-BLACK-M неправильная цена — измени её на 89,90 R$ и уменьши остаток до 5.» «Какие корзины были брошены на этой неделе и на какую сумму?» «Создай купон на 15% со сроком действия до конца месяца, минимальная сумма 100 R$, 50 использований.»
Если в аккаунте несколько магазинов, укажите, какой именно — инструменты требуют этого явно, чтобы ничего не записалось не в тот магазин.
Что он умеет
Инструмент | Что делает |
| Магазины, статусы заказов, категории и бренды — карта, чтобы модель перестала угадывать id |
| Заказы с фильтром по статусу, периоду и свободному тексту |
| Один заказ с товарами, покупателем, платежами, адресом и историей |
| Каталог с SKU, ценами и изображениями |
| Один товар с вариациями, остатками, брендом и категориями |
| Покупатели и адреса |
| Покупатель и все его заказы |
| Корзины, которые так и не стали заказами |
| Создаёт товар с его SKU |
| Редактирует поля товара |
| Создаёт SKU или обновляет цену и остаток |
| Купон на скидку |
| Переводит заказ в другой статус |
| Внутренняя заметка на заказе |
| Кэшбэк, допродажа при заказе, апселл и бесплатный подарок |
⚠️ Не проверено на живом API. Остальные тринадцать были прогнаны от начала до конца на реальном магазине — создание товара, изменение цены, запись остатка, выпуск купона — и названия полей были исправлены по итогам этого процесса. Этим двум нужен существующий заказ, а в тестовом магазине их не было. Эндпоинты верны; тело запроса взято из документации, которая, как выяснилось, пропускает как минимум одно обязательное поле в каждой из остальных пяти операций записи. Ожидайте 422 при первом вызове — в сообщении будет указано недостающее поле.
Что он намеренно не делает
Он не отменяет заказы, не возвращает платежи и не переключает платёжные шлюзы. Это не функция, спрятанная за переменной окружения: такого кода просто нет. Это необратимые операции в API, и ни Claude Desktop, ни claude.ai не поддерживают elicitation — то есть у сервера нет способа по-настоящему запросить подтверждение. Отсутствие — единственная гарантия, которая не зависит от чьего-то внимания.
Запрет реализован в двух местах, оба покрыты тестами: на алиасе статуса
(tools/write.ts) и на стыке, через который проходит каждый запрос
(yampi.ts). Обоснование в docs/adr/0002.
Отслеживание заказов тоже исключено: Yampi ограничивает этот маршрут 3 запросами в час, что делает инструмент бесполезным на практике — два вызова, и агент застрял на 20 минут.
Ваши учётные данные
Хранятся в зашифрованном виде (AES-GCM) в свойствах OAuth-гранта, внутри вашего KV.
Ключ, шифрующий их, обёрнут ключом, производным от токена доступа, а в KV хранится только хэш токена. Утечка KV сама по себе не открывает учётные данные.
Claude их никогда не получает: он видит только непрозрачный токен.
Отзыв означает удаление гранта — остальные подключения продолжают работать.
/authorize публичен и проверяет учётные данные, что технически делает его оракулом для проверки украденных ключей. Отсюда ограничение в 5 попыток с одного IP в минуту.
Чтобы ограничить экземпляр конкретными магазинами:
npx wrangler secret put ALLOWED_STORES # e.g. my-store,other-storeЛимиты API
Yampi ограничивает каждый маршрут в минуту: 30 запросов/мин по товарам и SKU, 120 по чтению заказов, 30 по записи, 60 в целом. Сервер использует include=, чтобы подтягивать связи одним вызовом вместо N+1, читает X-RateLimit-Remaining из каждого ответа и предупреждает модель, когда квота заканчивается — вместо того чтобы она узнала об этом через 429.
Когда что-то идёт не так
403 на всё, включая чтение. Магазин имеет active: false в панели Yampi.
Неактивные магазины отклоняют все маршруты. Реактивируйте его, затем переподключите коннектор.
422 при записи. В сообщении указано точное поле, которое отклонил Yampi — сервер пересылает весь объект errors. Обычно Claude исправляется при следующей попытке.
«Grant without credential» (Грант без учётных данных). Грант потерял свои свойства. Удалите коннектор и добавьте его заново.
Смена учётных данных. Просто переподключитесь: новый грант заменяет старый. Чтобы отозвать доступ без переподключения, удалите пространство имён KV.
Магазин отсутствует в списке. Либо он неактивен, либо учётные данные до него не достают.
Запустите describe_store, чтобы увидеть, что видит сервер.
Причуды API Yampi
Обнаружены при тестировании на живом API. Все они могут сжечь часы, и ни одна не очевидна из документации:
Фильтры требуют синтаксис массива.
?status_id=4молча игнорируется и возвращает весь набор данных;?status_id[]=4фильтрует. То же самое сactive[]. Фильтр, который не фильтрует, хуже, чем отсутствие фильтра: агент обобщает 55 000 заказов, полагая, что видел июльские.Даты используют особый формат:
?date=created_at:2026-06-01|2026-06-30. Всё остальное возвращает 500 или игнорируется.filters[...]не фильтрует. Он лишь переключает ответ на пагинацию черезscroll_id./auth/me— это POST, а не GET, и возвращает все магазины по учётным данным — потому что учётные данные принадлежат пользователю, а не магазину.У
includeдля заказов закрытый перечень:items,customer,marketplace,status,statuses,shipping_address,promocode,transactions,comments,files,discounts,seller,labels.paymentsтам нет.GET-ответы кэшируются на 30 минут на стороне Yampi. В контексте агента это ложь: создайте товар, попросите прочитать его — и получите прежнее состояние. Этот сервер отправляет
?skipCache=trueпри каждом чтении.Остаток — это не поле SKU.
quantityу SKU всегда null — включая реальные SKU живого магазина. Остаток живёт в/logistics/stocks(складская позиция), присоединённый к SKU через/catalog/skus/{id}/stocks. Аstock_id— это не id из/logistics/warehouses, это совершенно другой ресурс.discount_typeкупона принимает толькоpилиv, а неpercentage/fixed.Даты купона требуют формат
Y-m-d H:i:s. Только дата возвращает 422.PUT /catalog/skus/{id}требуетproduct_idиprice_costдаже для частичного обновления.Создание товара требует
simple,brand_idиskus.*.blocked_sale— ни одно из них не очевидно.Магазин с
active: falseвозвращает 403 на всё, включая чтение. Этот сервер отфильтровывает такие магазины при подключении, поэтому модель никогда не получает вариант, который может только провалиться.Ответы 422 содержат объект
errors, указывающий точное поле, которое не прошло. Его стоит пересылать модели вместо показа только кода статуса — именно это позволяет ей исправиться.
Разработка
npm test # 32 unit tests, no network
npm run typecheck
npm run dev # wrangler devТестирование на собственном магазине
Модульный набор тестов использует фейковый fetch и доказывает логику сервера. Он не может заметить, что Yampi изменил эндпоинт, имя поля или синтаксис фильтра — а это происходило неоднократно при создании проекта. Вторую половину покрывает интеграционный набор тестов, который обращается к живому API, только на чтение, ничего не создавая и не меняя:
cp .env.example .env # fill in the alias and credentials of YOUR store
npm run test:integrationОн проверяет, что обнаружение магазинов работает, что алиасы статусов существуют, что фильтрация по статусу действительно фильтрует, что формат даты принимается, что include разворачивает связи и что заголовки квоты приходят. Если один тест падает — API изменился, и сервер начнёт врать раньше, чем ломаться.
В архитектуре одно правило: ни один инструмент не говорит по HTTP. Всё проходит через
src/yampi.ts. Именно это делает обещание «не обращается к запрещённым маршрутам» проверяемым — вся поверхность умещается в одном файле.
Словарь проекта в CONTEXT.md. Решения в docs/adr/.
Известные ограничения
Нет отслеживания заказов (лимит Yampi в 3 запроса/ч делает его непригодным).
Нет баннеров, правил бесплатной доставки, прогрессивных скидок или комбо.
advance_order_statusиadd_order_commentникогда не запускались на живом API.Остаток записывается в первую зарегистрированную складскую позицию магазина. Тем, кто использует несколько позиций, нужно поправить
defaultStockId()вsrc/tools/write.ts.
Участие в разработке
Pull request'ы приветствуются. Сделайте форк, откройте PR в main, и CI прогонит проверку типов и
модульные тесты. Для чего-то большего, чем исправление бага, сначала откройте issue.
Одно не будет влито независимо от качества патча: всё, что отменяет заказ, возвращает платёж или переключает платёжный шлюз, включая косвенные пути. Это отсутствие и есть смысл проекта — обоснование в ADR 0002.
Подробности в CONTRIBUTING.md. Нашли проблему безопасности? Не открывайте публичный issue — см. SECURITY.md.
Лицензия
MIT — см. LICENSE.
Логотип Yampi в assets/ является товарным знаком Yampi и используется здесь только для идентификации платформы, с которой взаимодействует этот сервер. Он не подпадает под лицензию MIT, и данный проект не аффилирован с Yampi и не одобрен ею.
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 Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP Server that provides access to the Jumpseller e-commerce platform API, allowing users to interact with Jumpseller's functionality through natural language commands.
- AlicenseNot gradedqualityFmaintenanceA comprehensive MCP server for Shopify Admin API integration, enabling AI assistants to manage products, orders, customers, inventory, analytics, and more through natural language.3418MIT
- FlicenseNot gradedqualityFmaintenanceAn MCP server that integrates with the FacturaScripts ERP system, providing resources and tools to manage clients, products, invoices, accounting entries, and business analytics through natural language.10
- AlicenseBqualityAmaintenanceServidor MCP para integrar la plataforma CLI MARKET con asistentes de IA. Permite gestionar productos, pedidos, clientes e inventario de tu tienda marketplace mediante lenguaje natural.321MIT
Related MCP Connectors
Hosted Argentine commerce MCP: real AFIP invoicing, MercadoPago, logistics, catalog & WhatsApp.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
MCP server for generating rough-draft project plans from natural-language prompts.
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/Eduardo-Orsi/yampi-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server