asmy-mcp-server
Officialasmy-mcp-server
Сервер MCP для Asmy Digital Store. Предоставляет каталог продуктов, промокоды и статистику магазина в виде инструментов MCP, доступных для агента (Junior.so, Claude Desktop или любого MCP-клиента).
Бэкенд данных: Firestore. Два транспорта: stdio и HTTP (SSE + Streamable HTTP).
Предварительные требования
Node >= 18 (рекомендуется Bun, npm-скрипты его используют)
Проект Firebase с включённым Firestore
Ключ сервисного аккаунта Firebase
Related MCP server: mcp-server-woocommerce
Установка
bun install # ou npm install
cp .env.example .envКонфигурация
Firebase
Сервер разрешает учётные данные в следующем порядке (firebase-config.js):
FIREBASE_SERVICE_ACCOUNT— полный JSON, в одну строку или в base64FIREBASE_SERVICE_ACCOUNT_FILE— путь к файлу./firebase-service-account.json— запасной вариант, рядом сindex.js
Если FIREBASE_SERVICE_ACCOUNT присутствует, но недействителен, происходит
переход на файл с предупреждением в stderr, а не сбой.
Локально: файл. В продакшене: переменная окружения (base64 избегает проблем
с экранированием private_key).
Файл firebase-service-account.json уже находится в .gitignore. Нет
причин выносить его оттуда.
Переменные окружения
Переменная | По умолчанию | Роль |
|
| HTTP-порт |
|
| Интерфейс прослушивания |
| — | Разрешённые хосты, разделённые запятыми. Требуется при привязке к |
| — | JSON сервисного аккаунта (одна строка или base64) |
| — | Альтернативный путь к JSON |
| — |
|
| — | Только для тестовых клиентов |
|
| Только для тестовых клиентов |
| — | Только для |
localhost, 127.0.0.1, [::1] и RAILWAY_PUBLIC_DOMAIN (внедряется Railway)
автоматически добавляются в список разрешённых хостов.
Примечание: env.js — это самодельный парсер .env без зависимостей. Он
обрабатывает многострочные JSON-значения (фигурные скобки) — полезно для
вставки сырого сервисного аккаунта в файл. Больше он почти ничего не умеет:
без интерполяции, без экзотических экранирований.
Запуск
bun start # HTTP sur $PORT
bun run dev # HTTP + watch
bun run start:stdio # transport stdioСервер выбирает stdio, если передан аргумент --stdio или установлен MCP_STDIO=1.
В противном случае — HTTP.
HTTP-эндпоинты
Маршрут | Метод | Описание |
| GET | Проверка здоровья, возвращает имя сервера и список эндпоинтов |
| ALL | Streamable HTTP (спецификация 2025-11-25), сессии через заголовок |
| GET | SSE legacy (спецификация 2024-11-05) — именно это использует Junior.so |
| POST | Обратный канал транспорта SSE, сессия через |
Оба транспорта сосуществуют. Сессию, открытую через SSE, нельзя возобновить
на /mcp (возвращается -32000).
Сессии хранятся в памяти в локальном объекте. Следствие: один экземпляр. Нет горизонтального масштабирования без sticky sessions или общего хранилища.
Предоставляемые инструменты
16 инструментов, все определены в index.js.
Продукты (коллекция products)
Инструмент | Описание |
| Каталог со статусом, ценой, остатком |
| Детали по slug или id Firestore |
| Создание. |
| Частичное обновление |
|
|
| Копия с новым необязательным именем |
| Полное удаление |
| Поиск иконки отдельно, без записи в базу |
Промоакции (коллекция promotions)
Инструмент | Описание |
| Все коды |
| Поиск по коду |
| Отклоняет дубликаты кодов |
| Код, скидка или срок действия |
| Удаление |
Разное
Инструмент | Описание |
| Читает |
| Добавляет запись и пересчитывает итоги месяца |
| Текущая дата в |
get_current_date существует, потому что LLM ошибаются с датой и генерируют
expiresAt в прошлом. Агент, создающий промокод, должен сначала вызвать его.
Соглашения
Промокоды нормализуются в верхний регистр,
expiresAtв форматеYYYY-MM-DD,discountот 1 до 100.Slug продукта выводится из названия (NFD, удаление диакритики, неалфавитно- цифровые символы заменяются дефисами).
Каждый возвращаемый продукт содержит
url, построенный наhttps://asmystore.shop/abonnements/{slug}.update_statsдобавляет запись вhistory, затем пересчитываетmonthTotalиmonthOrders, фильтруя по префиксуYYYY-MM. Запись одной и той же записи дважды учитывается дважды — дедупликации нет.
Поиск изображений
product-image.js находит иконку продукта в два прохода:
Clearbit (
logo.clearbit.com/{домен}), с таблицей соответствия бренд → домен и запасным вариантом{slug}.com/{slug}.ioDuckDuckGo Images
Каждый кандидат проверяется через HEAD (а затем GET с Range, если HEAD
не возвращает ничего полезного), чтобы убедиться, что content-type — это
действительно изображение.
Два замечания, которые стоит иметь в виду: эндпоинт i.js DuckDuckGo не является
публичным API — сначала нужно получить токен vqd, и это может сломаться без
предупреждения. А полученные логотипы принадлежат соответствующим брендам;
вам нужно проверить, что вы имеете право отображать их в магазине.
В случае неудачи инструмент возвращает явную ошибку, и продукт создаётся без иконки.
Тесты
Два тестовых клиента, оба подключены к OpenAI для вызова инструментов
на естественном языке. Требуется OPENAI_API_KEY.
bun run test:mcp # spawn le serveur en stdio
bun run test:mcp "Liste les produits actifs"
MCP_SERVER_URL=https://xxx.up.railway.app bun run test:mcp:url
bun test-mcp-url.js https://xxx.up.railway.app "Quelle est la date ?"Без аргументов оба входят в режим REPL. Максимум 10 раундов вызовов инструментов.
Развёртывание (Railway)
Запушьте репозиторий (приватный) на GitHub
Railway → New Project → Deploy from GitHub
Переменные:
FIREBASE_SERVICE_ACCOUNT(base64),PORTпри необходимостиRAILWAY_PUBLIC_DOMAINвнедряется автоматически и добавляется в разрешённые хосты — в противном случае укажитеALLOWED_HOSTSвручную
Сервер обрабатывает SIGINT / SIGTERM: открытые транспорты закрываются перед
выходом.
Подключение из Junior.so
Dashboard → agent → Integrations → Create → Custom → MCP, затем URL SSE:
https://<ton-domaine>.up.railway.app/sseJunior использует спецификацию 2024-11-05, поэтому /sse, а не /mcp. Все 16
инструментов автоматически перечисляются после подключения.
Миграция промоакций
migrate-promos.js — одноразовый скрипт для переноса промокодов из
localStorage фронтенда в Firestore.
На asmystore.shop, консоль разработчика:
localStorage.getItem("asmy-admin-promos")Вставьте JSON в константу
PROMOS_JSONскриптаbun migrate-promos.js
Внимание: этот скрипт жёстко читает firebase-service-account.json, он не
использует firebase-config.js. Переменные окружения здесь не работают, нужен
файл. Скрипт предназначен для однократного запуска, после чего о нём можно забыть.
На стороне фронтенда не забудьте переключить чтение/запись промоакций с
localStorage на коллекцию promotions, иначе два источника разойдутся.
Устранение неполадок
Firebase не настроен при запуске — не найдены ни FIREBASE_SERVICE_ACCOUNT,
ни FIREBASE_SERVICE_ACCOUNT_FILE, ни файл по умолчанию.
Неполный JSON Firebase — JSON распарсен, но отсутствует type: "service_account" или private_key. Обычно это обрезанное копирование или
неправильно завершённый base64.
Запросы отклоняются в продакшене, хотя локально всё работает — защита от
DNS rebinding. Хост не входит в allowedHosts. Укажите ALLOWED_HOSTS.
Session not found на /messages — сессия SSE истекла или сервер
перезапустился. Сессии хранятся в памяти, повторное развёртывание стирает их все.
Клиент не видит ни одного инструмента — проверьте, что вы обращаетесь к /sse
(legacy-спецификация), а не к /mcp, и что GET / отвечает.
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
- AlicenseNot gradedqualityBmaintenanceA production-grade MCP server and CLI tool that enables AI agents to manage Shopify stores through 49 built-in tools across products, orders, inventory, and analytics. It supports natural language workflows for tasks like inventory tracking, customer support, and sales reporting.5218MIT
- AlicenseAqualityCmaintenanceMCP server for managing WooCommerce stores through AI assistants like Claude. Provides 101 tools covering products, orders, customers, coupons, shipping, taxes, webhooks, settings, reports, and more.1001001MIT
- AlicenseCqualityCmaintenanceAn MCP server providing AI agents with full access to the Shopify Admin API via 136 tools for managing products, orders, customers, collections, and more.10012MIT
- FlicenseNot gradedqualityDmaintenanceProvides access to the Shopify Storefront API via MCP, enabling AI assistants to query and interact with Shopify store data such as products, collections, carts, and customer information.
Related MCP Connectors
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Manage your NanoCart store from any AI agent: products, orders, coupons, subscribers, reports.
Agent Commerce MCP — agent-native A2A storefront. Discovery, Stripe checkout, affiliate program.
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/asmydev/mcp-server-asmyAgent'
If you have feedback or need assistance with the MCP directory API, please join our Discord server