asmy-mcp-server
Officialasmy-mcp-server
Servidor MCP para Asmy Digital Store. Expone el catálogo de productos, los códigos promocionales y las estadísticas de la tienda como herramientas MCP, consumibles por un agente (Junior.so, Claude Desktop, o cualquier cliente MCP).
Backend de datos: Firestore. Dos transportes: stdio y HTTP (SSE + Streamable HTTP).
Requisitos previos
Node >= 18 (Bun recomendado, los scripts npm lo usan)
Un proyecto Firebase con Firestore activado
Una clave de cuenta de servicio Firebase
Related MCP server: mcp-server-woocommerce
Instalación
bun install # ou npm install
cp .env.example .envConfiguración
Firebase
El servidor resuelve las credenciales en este orden (firebase-config.js):
FIREBASE_SERVICE_ACCOUNT— el JSON completo, en una línea o en base64FIREBASE_SERVICE_ACCOUNT_FILE— ruta al archivo./firebase-service-account.json— fallback, junto aindex.js
Si FIREBASE_SERVICE_ACCOUNT está presente pero es inválido, se hace fallback al archivo con un warning en stderr, no un crash.
En local: el archivo. En producción: la variable de entorno (base64 evita los problemas de escape en private_key).
El archivo firebase-service-account.json ya está en .gitignore. No hay ninguna razón para sacarlo de ahí.
Variables de entorno
Variable | Defecto | Rol |
|
| Puerto HTTP |
|
| Interfaz de escucha |
| — | Hosts permitidos, separados por comas. Requerido cuando se hace bind en |
| — | JSON de la cuenta de servicio (una línea o base64) |
| — | Ruta alternativa al JSON |
| — |
|
| — | Solo para clientes de prueba |
|
| Solo para clientes de prueba |
| — | Solo para |
localhost, 127.0.0.1, [::1] y RAILWAY_PUBLIC_DOMAIN (inyectado por Railway) se añaden automáticamente a la lista de hosts permitidos.
Nota: env.js es un parser .env propio, sin dependencias. Gestiona valores JSON multilínea (llaves) — útil para pegar una cuenta de servicio en bruto en el archivo. No gestiona mucho más: sin interpolación, sin escapes exóticos.
Ejecutar
bun start # HTTP sur $PORT
bun run dev # HTTP + watch
bun run start:stdio # transport stdioEl servidor elige stdio si se pasa --stdio como argumento o si MCP_STDIO=1. Si no, HTTP.
Endpoints HTTP
Ruta | Método | Descripción |
| GET | Health check, devuelve el nombre del servidor y la lista de endpoints |
| ALL | Streamable HTTP (spec 2025-11-25), sesiones mediante cabecera |
| GET | SSE legacy (spec 2024-11-05) — es lo que consume Junior.so |
| POST | Canal de retorno del transporte SSE, sesión mediante |
Los dos transportes coexisten. Una sesión abierta en SSE no puede reanudarse en /mcp (devuelve -32000).
Las sesiones se almacenan en memoria en un objeto local. Consecuencia: una sola instancia. Sin escalado horizontal sin sticky sessions o store compartido.
Herramientas expuestas
16 herramientas, todas definidas en index.js.
Productos (colección products)
Herramienta | Descripción |
| Catálogo con estado, precio, stock |
| Detalle por slug o id de Firestore |
| Creación. |
| Actualización parcial |
|
|
| Copia con nuevo nombre opcional |
| Eliminación definitiva |
| Búsqueda de icono sola, sin escribir en base |
Promociones (colección promotions)
Herramienta | Descripción |
| Todos los códigos |
| Búsqueda por código |
| Rechaza los duplicados de código |
| Código, descuento o expiración |
| Eliminación |
Varios
Herramienta | Descripción |
| Lee |
| Añade una entrada y recalcula los totales del mes |
| Fecha actual en |
get_current_date existe porque los LLM se equivocan de fecha y generan expiresAt en el pasado. Un agente que crea un código promocional debe llamarlo primero.
Convenciones
Los códigos promocionales se normalizan en mayúsculas,
expiresAten formatoYYYY-MM-DD,discountentre 1 y 100.El slug del producto se deriva del nombre (NFD, acentos eliminados, no alfanuméricos reemplazados por guiones).
Cada producto devuelto lleva una
urlconstruida sobrehttps://asmystore.shop/abonnements/{slug}.update_statshace push enhistory, luego recalculamonthTotalymonthOrdersfiltrando por el prefijoYYYY-MM. Escribir dos veces la misma entrada la cuenta dos veces — no hay deduplicación.
Búsqueda de imágenes
product-image.js resuelve un icono de producto en dos pasadas:
Clearbit (
logo.clearbit.com/{domaine}), con una tabla de correspondencia marca → dominio y un fallback{slug}.com/{slug}.ioDuckDuckGo Images
Cada candidato se valida con un HEAD (y luego un GET con Range si el HEAD no devuelve nada aprovechable) para verificar que el content-type sea efectivamente una imagen.
Dos reservas a tener en cuenta: el endpoint i.js de DuckDuckGo no es una API pública — primero hay que hacer scraping de un token vqd, y puede romperse sin previo aviso. Y los logos obtenidos pertenecen a las marcas correspondientes; tú debes verificar qué tienes derecho a mostrar en la tienda.
En caso de fallo, la herramienta devuelve un error explícito y el producto se crea sin icono.
Pruebas
Dos clientes de prueba, ambos conectados a OpenAI para hacer tool calling en lenguaje natural. Se requiere 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 ?"Sin argumentos, ambos entran en modo REPL. Máximo 10 turnos de llamadas a herramientas.
Despliegue (Railway)
Haz push del repo (privado) a GitHub
Railway → New Project → Deploy from GitHub
Variables:
FIREBASE_SERVICE_ACCOUNT(base64),PORTsi es necesarioRAILWAY_PUBLIC_DOMAINse inyecta automáticamente y se añade a los hosts permitidos — si no, rellenaALLOWED_HOSTSmanualmente
El servidor gestiona SIGINT / SIGTERM: los transportes abiertos se cierran antes del exit.
Conexión desde Junior.so
Dashboard → agente → Integrations → Create → Custom → MCP, y luego la URL SSE:
https://<ton-domaine>.up.railway.app/sseJunior habla la spec 2024-11-05, por lo tanto /sse y no /mcp. Las 16 herramientas se listan automáticamente tras la conexión.
Migración de promociones
migrate-promos.js es un script one-shot para repatriar los códigos promocionales del localStorage del front a Firestore.
En asmystore.shop, consola de desarrollo:
localStorage.getItem("asmy-admin-promos")Pega el JSON en la constante
PROMOS_JSONdel scriptbun migrate-promos.js
Atención: este script lee firebase-service-account.json en duro, no pasa por firebase-config.js. Las variables de entorno no funcionan aquí, se necesita el archivo. El script está pensado para ejecutarse una vez y luego olvidarse.
En el front, recuerda cambiar las lecturas/escrituras de promociones de localStorage a la colección promotions, si no las dos fuentes divergen.
Solución de problemas
Firebase no configurado al arrancar — no se ha encontrado ni FIREBASE_SERVICE_ACCOUNT, ni FIREBASE_SERVICE_ACCOUNT_FILE, ni el archivo por defecto.
JSON Firebase incompleto — el JSON se parsea pero falta type: "service_account" o private_key. Típicamente un copiar-pegar truncado o un base64 mal terminado.
Peticiones rechazadas en producción cuando funciona en local — protección contra DNS rebinding. El host no está en allowedHosts. Rellena ALLOWED_HOSTS.
Session not found en /messages — la sesión SSE ha expirado o el servidor se ha reiniciado. Las sesiones están en memoria, un redeploy las borra todas.
El cliente no ve ninguna herramienta — verifica que se está usando /sse (spec legacy) y no /mcp, y que GET / responde.
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