asmy-mcp-server
Officialasmy-mcp-server
Serveur MCP pour Asmy Digital Store. Expose le catalogue produits, les codes promo et les stats de la boutique sous forme d'outils MCP, consommables par un agent (Junior.so, Claude Desktop, ou n'importe quel client MCP).
Backend de données : Firestore. Deux transports : stdio et HTTP (SSE + Streamable HTTP).
Prérequis
Node >= 18 (Bun recommandé, les scripts npm l'utilisent)
Un projet Firebase avec Firestore activé
Une clé de compte de service Firebase
Related MCP server: mcp-server-woocommerce
Installation
bun install # ou npm install
cp .env.example .envConfiguration
Firebase
Le serveur résout les credentials dans cet ordre (firebase-config.js) :
FIREBASE_SERVICE_ACCOUNT— le JSON complet, sur une ligne ou en base64FIREBASE_SERVICE_ACCOUNT_FILE— chemin vers le fichier./firebase-service-account.json— fallback, à côté deindex.js
Si FIREBASE_SERVICE_ACCOUNT est présent mais invalide, il y a fallback sur le
fichier avec un warning sur stderr, pas un crash.
En local : le fichier. En prod : la variable d'env (base64 évite les galères
d'échappement sur private_key).
Le fichier firebase-service-account.json est déjà dans .gitignore. Il n'y a
aucune raison de l'en sortir.
Variables d'environnement
Variable | Défaut | Rôle |
|
| Port HTTP |
|
| Interface d'écoute |
| — | Hôtes autorisés, séparés par des virgules. Requis quand on bind sur |
| — | JSON du service account (une ligne ou base64) |
| — | Chemin alternatif vers le JSON |
| — |
|
| — | Clients de test uniquement |
|
| Clients de test uniquement |
| — |
|
localhost, 127.0.0.1, [::1] et RAILWAY_PUBLIC_DOMAIN (injecté par Railway)
sont ajoutés automatiquement à la liste des hôtes autorisés.
Note : env.js est un parseur .env maison, sans dépendance. Il gère les valeurs
JSON multi-lignes (accolades) — utile pour coller un service account brut dans le
fichier. Il ne gère pas grand-chose d'autre : pas d'interpolation, pas
d'échappements exotiques.
Lancer
bun start # HTTP sur $PORT
bun run dev # HTTP + watch
bun run start:stdio # transport stdioLe serveur choisit stdio si --stdio est passé en argument ou si MCP_STDIO=1.
Sinon, HTTP.
Endpoints HTTP
Route | Méthode | Description |
| GET | Health check, renvoie le nom du serveur et la liste des endpoints |
| ALL | Streamable HTTP (spec 2025-11-25), sessions via header |
| GET | SSE legacy (spec 2024-11-05) — c'est ce que consomme Junior.so |
| POST | Canal retour du transport SSE, session via |
Les deux transports coexistent. Une session ouverte en SSE ne peut pas être
reprise sur /mcp (retour -32000).
Les sessions sont stockées en mémoire dans un objet local. Conséquence : une seule instance. Pas de scaling horizontal sans sticky sessions ou store partagé.
Outils exposés
16 outils, tous définis dans index.js.
Produits (collection products)
Outil | Description |
| Catalogue avec statut, prix, stock |
| Détail par slug ou id Firestore |
| Création. |
| Mise à jour partielle |
|
|
| Copie avec nouveau nom optionnel |
| Suppression définitive |
| Recherche d'icône seule, sans écrire en base |
Promotions (collection promotions)
Outil | Description |
| Tous les codes |
| Recherche par code |
| Refuse les doublons de code |
| Code, réduction ou expiration |
| Suppression |
Divers
Outil | Description |
| Lit |
| Ajoute une entrée et recalcule les totaux du mois |
| Date courante en |
get_current_date existe parce que les LLM se trompent de date et génèrent des
expiresAt dans le passé. Un agent qui crée un code promo doit l'appeler d'abord.
Conventions
Les codes promo sont normalisés en majuscules,
expiresAtau formatYYYY-MM-DD,discountentre 1 et 100.Le slug produit est dérivé du nom (NFD, accents retirés, non-alphanumériques remplacés par des tirets).
Chaque produit renvoyé porte une
urlconstruite surhttps://asmystore.shop/abonnements/{slug}.update_statspush danshistory, puis recalculemonthTotaletmonthOrdersen filtrant sur le préfixeYYYY-MM. Écrire deux fois la même entrée la compte deux fois — il n'y a pas de déduplication.
Recherche d'images
product-image.js résout une icône produit en deux passes :
Clearbit (
logo.clearbit.com/{domaine}), avec une table de correspondance marque → domaine et un fallback{slug}.com/{slug}.ioDuckDuckGo Images
Chaque candidat est validé par un HEAD (puis un GET avec Range si le HEAD
ne renvoie rien d'exploitable) pour vérifier que le content-type est bien une
image.
Deux réserves à garder en tête : l'endpoint i.js de DuckDuckGo n'est pas une API
publique — il faut d'abord scraper un token vqd, et ça peut casser sans préavis.
Et les logos récupérés appartiennent aux marques concernées ; à toi de vérifier ce
que tu as le droit d'afficher sur la boutique.
En cas d'échec, l'outil renvoie une erreur explicite et le produit est créé sans icône.
Tests
Deux clients de test, tous les deux branchés sur OpenAI pour faire du tool calling
en langage naturel. OPENAI_API_KEY requise.
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 ?"Sans argument, les deux entrent en mode REPL. Max 10 tours d'appels d'outils.
Déploiement (Railway)
Push le repo (privé) sur GitHub
Railway → New Project → Deploy from GitHub
Variables :
FIREBASE_SERVICE_ACCOUNT(base64),PORTsi besoinRAILWAY_PUBLIC_DOMAINest injecté automatiquement et ajouté aux hôtes autorisés — sinon, renseignerALLOWED_HOSTSà la main
Le serveur gère SIGINT / SIGTERM : les transports ouverts sont fermés avant
l'exit.
Connexion depuis Junior.so
Dashboard → agent → Integrations → Create → Custom → MCP, puis l'URL SSE :
https://<ton-domaine>.up.railway.app/sseJunior parle la spec 2024-11-05, donc /sse et pas /mcp. Les 16 outils sont
listés automatiquement après connexion.
Migration des promos
migrate-promos.js est un script one-shot pour rapatrier les codes promo du
localStorage du front vers Firestore.
Sur asmystore.shop, console dev :
localStorage.getItem("asmy-admin-promos")Coller le JSON dans la constante
PROMOS_JSONdu scriptbun migrate-promos.js
Attention : ce script lit firebase-service-account.json en dur, il ne passe pas
par firebase-config.js. Les variables d'env ne fonctionnent pas ici, il faut le
fichier. Le script est destiné à être lancé une fois puis oublié.
Côté front, penser à basculer les lectures/écritures promo de localStorage vers
la collection promotions, sinon les deux sources divergent.
Dépannage
Firebase non configuré au démarrage — ni FIREBASE_SERVICE_ACCOUNT, ni
FIREBASE_SERVICE_ACCOUNT_FILE, ni le fichier par défaut n'ont été trouvés.
JSON Firebase incomplet — le JSON est parsé mais il manque type: "service_account" ou private_key. Typiquement un copier-coller tronqué ou un
base64 mal terminé.
Requêtes rejetées en prod alors que ça marche en local — protection contre le
DNS rebinding. Le host n'est pas dans allowedHosts. Renseigner ALLOWED_HOSTS.
Session not found sur /messages — la session SSE a expiré ou le serveur a
redémarré. Les sessions sont en mémoire, un redéploiement les efface toutes.
Le client ne voit aucun outil — vérifier qu'on tape bien /sse (spec legacy)
et pas /mcp, et que GET / répond.
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