asmy-mcp-server
Officialasmy-mcp-server
MCP-Server für Asmy Digital Store. Stellt den Produktkatalog, die Promo-Codes und die Shop-Statistiken als MCP-Tools bereit, die von einem Agenten (Junior.so, Claude Desktop oder einem beliebigen MCP-Client) konsumiert werden können.
Datenspeicher: Firestore. Zwei Transports: stdio und HTTP (SSE + Streamable HTTP).
Voraussetzungen
Node >= 18 (Bun empfohlen, die npm-Skripte verwenden es)
Ein Firebase-Projekt mit aktiviertem Firestore
Ein Firebase-Dienstkonto-Schlüssel
Related MCP server: mcp-server-woocommerce
Installation
bun install # ou npm install
cp .env.example .envKonfiguration
Firebase
Der Server löst die Anmeldedaten in dieser Reihenfolge auf (firebase-config.js):
FIREBASE_SERVICE_ACCOUNT— das vollständige JSON, einzeilig oder als base64FIREBASE_SERVICE_ACCOUNT_FILE— Pfad zur Datei./firebase-service-account.json— Fallback, nebenindex.js
Wenn FIREBASE_SERVICE_ACCOUNT vorhanden, aber ungültig ist, erfolgt ein Fallback auf die
Datei mit einer Warnung auf stderr, kein Absturz.
Lokal: die Datei. In Produktion: die Umgebungsvariable (base64 vermeidet Probleme
mit dem Escaping von private_key).
Die Datei firebase-service-account.json steht bereits in .gitignore. Es gibt
keinen Grund, sie daraus zu entfernen.
Umgebungsvariablen
Variable | Standard | Rolle |
|
| HTTP-Port |
|
| Abhörschnittstelle |
| — | Erlaubte Hosts, durch Kommas getrennt. Erforderlich, wenn auf |
| — | JSON des Dienstkontos (einzeilig oder base64) |
| — | Alternativer Pfad zum JSON |
| — |
|
| — | Nur für Test-Clients |
|
| Nur für Test-Clients |
| — | Nur für |
localhost, 127.0.0.1, [::1] und RAILWAY_PUBLIC_DOMAIN (von Railway injiziert)
werden automatisch zur Liste der erlaubten Hosts hinzugefügt.
Hinweis: env.js ist ein eigener .env-Parser ohne Abhängigkeiten. Er verarbeitet
mehrzeilige JSON-Werte (geschweifte Klammern) — nützlich, um ein rohes Dienstkonto in die
Datei einzufügen. Viel mehr kann er nicht: keine Interpolation, keine
exotischen Escape-Sequenzen.
Starten
bun start # HTTP sur $PORT
bun run dev # HTTP + watch
bun run start:stdio # transport stdioDer Server wählt stdio, wenn --stdio als Argument übergeben wird oder MCP_STDIO=1 gesetzt ist.
Andernfalls HTTP.
HTTP-Endpunkte
Route | Methode | Beschreibung |
| GET | Health-Check, gibt den Servernamen und die Liste der Endpunkte zurück |
| ALL | Streamable HTTP (Spec 2025-11-25), Sitzungen über Header |
| GET | SSE-Legacy (Spec 2024-11-05) — das nutzt Junior.so |
| POST | Rückkanal des SSE-Transports, Sitzung über |
Beide Transports koexistieren. Eine im SSE geöffnete Sitzung kann nicht auf
/mcp fortgesetzt werden (Rückgabe -32000).
Die Sitzungen werden im Speicher in einem lokalen Objekt gehalten. Konsequenz: nur eine einzige Instanz. Keine horizontale Skalierung ohne Sticky Sessions oder gemeinsamen Speicher.
Verfügbare Tools
16 Tools, alle in index.js definiert.
Produkte (Sammlung products)
Tool | Beschreibung |
| Katalog mit Status, Preis, Lagerbestand |
| Details nach Slug oder Firestore-ID |
| Erstellung. |
| Teilweise Aktualisierung |
|
|
| Kopie mit optionalem neuem Namen |
| Endgültiges Löschen |
| Nur Symbolsuche, ohne in die Datenbank zu schreiben |
Promotionen (Sammlung promotions)
Tool | Beschreibung |
| Alle Codes |
| Suche nach Code |
| Lehnt doppelte Codes ab |
| Code, Rabatt oder Ablaufdatum |
| Löschen |
Sonstiges
Tool | Beschreibung |
| Liest |
| Fügt einen Eintrag hinzu und berechnet die Monatssummen neu |
| Aktuelles Datum in |
get_current_date existiert, weil LLMs sich beim Datum irren und expiresAt in der
Vergangenheit erzeugen. Ein Agent, der einen Promo-Code erstellt, sollte es zuerst aufrufen.
Konventionen
Promo-Codes werden in Großbuchstaben normalisiert,
expiresAtim FormatYYYY-MM-DD,discountzwischen 1 und 100.Der Produkt-Slug wird vom Namen abgeleitet (NFD, Akzente entfernt, Nicht-Alphanumerisches durch Bindestriche ersetzt).
Jedes zurückgegebene Produkt trägt eine
url, die aufhttps://asmystore.shop/abonnements/{slug}aufbaut.update_statspusht inhistoryund berechnet dannmonthTotalundmonthOrdersneu, indem es auf das PräfixYYYY-MMfiltert. Denselben Eintrag zweimal zu schreiben, zählt ihn doppelt — es gibt keine Deduplizierung.
Bildersuche
product-image.js löst ein Produktsymbol in zwei Durchgängen auf:
Clearbit (
logo.clearbit.com/{domaine}), mit einer Zuordnungstabelle Marke → Domain und einem Fallback{slug}.com/{slug}.ioDuckDuckGo Images
Jeder Kandidat wird durch einen HEAD-Request validiert (und dann ein GET mit Range, wenn der HEAD
nichts Brauchbares zurückgibt), um zu prüfen, ob der content-type wirklich ein Bild ist.
Zwei Vorbehalte sollte man im Hinterkopf behalten: Der i.js-Endpunkt von DuckDuckGo ist keine öffentliche
API — man muss zuerst ein vqd-Token scrapen, und das kann ohne Vorwarnung brechen.
Und die abgerufenen Logos gehören den jeweiligen Marken; du musst selbst prüfen, was du
im Shop anzeigen darfst.
Im Fehlerfall gibt das Tool eine explizite Fehlermeldung zurück und das Produkt wird ohne Symbol erstellt.
Tests
Zwei Test-Clients, beide an OpenAI angebunden für Tool-Calling in natürlicher Sprache. OPENAI_API_KEY erforderlich.
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 ?"Ohne Argument gehen beide in den REPL-Modus. Maximal 10 Runden Tool-Aufrufe.
Bereitstellung (Railway)
Repo (privat) auf GitHub pushen
Railway → New Project → Deploy from GitHub
Variablen:
FIREBASE_SERVICE_ACCOUNT(base64),PORTfalls nötigRAILWAY_PUBLIC_DOMAINwird automatisch injiziert und zu den erlaubten Hosts hinzugefügt — andernfallsALLOWED_HOSTSmanuell ausfüllen
Der Server behandelt SIGINT / SIGTERM: offene Transports werden vor dem
Exit geschlossen.
Verbindung von Junior.so
Dashboard → Agent → Integrations → Create → Custom → MCP, dann die SSE-URL:
https://<ton-domaine>.up.railway.app/sseJunior spricht die Spec 2024-11-05, also /sse und nicht /mcp. Die 16 Tools werden
nach der Verbindung automatisch aufgelistet.
Migration der Promos
migrate-promos.js ist ein Einmal-Skript, um die Promo-Codes aus dem
localStorage des Frontends nach Firestore zu übernehmen.
Auf asmystore.shop, Dev-Konsole:
localStorage.getItem("asmy-admin-promos")Das JSON in die Konstante
PROMOS_JSONdes Skripts einfügenbun migrate-promos.js
Achtung: Dieses Skript liest firebase-service-account.json fest verdrahtet, es geht nicht
über firebase-config.js. Umgebungsvariablen funktionieren hier nicht, es braucht die
Datei. Das Skript ist dafür gedacht, einmal ausgeführt und dann vergessen zu werden.
Auf der Frontend-Seite daran denken, die Promo-Lese-/Schreibvorgänge von localStorage auf
die Sammlung promotions umzustellen, sonst divergieren die beiden Quellen.
Fehlerbehebung
Firebase nicht konfiguriert beim Start — weder FIREBASE_SERVICE_ACCOUNT, noch
FIREBASE_SERVICE_ACCOUNT_FILE, noch die Standarddatei wurden gefunden.
JSON Firebase unvollständig — das JSON wird geparst, aber es fehlt type: "service_account" oder private_key. Typischerweise ein abgeschnittenes Kopieren-Einfügen oder ein
fehlerhaft beendetes base64.
Anfragen in Produktion abgelehnt, obwohl es lokal funktioniert — Schutz gegen
DNS-Rebinding. Der Host ist nicht in allowedHosts. ALLOWED_HOSTS ausfüllen.
Session not found auf /messages — die SSE-Sitzung ist abgelaufen oder der Server wurde
neu gestartet. Sitzungen sind im Speicher, ein erneutes Bereitstellen löscht sie alle.
Der Client sieht keine Tools — prüfen, ob wirklich /sse (Legacy-Spec)
und nicht /mcp aufgerufen wird, und dass GET / antwortet.
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