Lumenco Catalog MCP Server
Lumenco Catalog (Phase 1 scraper + Phase 2 MCP)
Dieses Repository hat zwei Ebenen:
Phase 1 extrahiert Daten von
https://en.staging.lumenco.ca/in PostgreSQL.Phase 2 stellt diesen Katalog über einen schreibgeschützten Model Context Protocol Server bereit, sodass Claude Produkte, Spezifikationen, Listeneinträge und Empfehlungs-Kandidaten abrufen kann, ohne auf Lumenco zu browsen.
CLAUDE
│ MCP / HTTPS
▼
Lumenco Product Database (Streamable HTTP)
│ tools → services → repositories
▼
PostgreSQL (Phase 1 catalog)Phase 1 extrahiert. Phase 2 stellt bereit. Claude denkt.
Der MCP-Server extrahiert niemals Lumenco, lädt niemals Spezifikations-PDFs herunter, ruft niemals ein LLM auf und schreibt niemals in die Datenbank.
Wie die Website aussieht
Lumenco-Staging ist ein Magento-2-Shopfrontend.
Bereich | Verhalten |
Marken |
|
Markenlistings |
|
Produkte | Kanonische URLs wie |
Spezifikationsblätter | Normalerweise Same-Origin-PDFs unter |
Sitemap |
|
GraphQL |
|
Abrufen | Produktseiten werden serverseitig gerendert. Scraplings HTTP- |
Der Crawler bleibt auf /de.staging.lumenco.ca. Externe Spezifikations-PDFs können als Produktdokumente heruntergeladen werden. Anzeigen, Analysen, ID, Checkout und Social-Media-URLs werden ignoriert.
robots.txt ist für öffentliche Suchmaschinen ( User-Agent: * verbietet sehen Sie die meisten Pfade außer /brand und einigen CMS-Seiten). Dieser Scraper ist ein genehmigter Ingest für das Staging; daher ist ROBOTS_TXT_OBEY standardmäßig false. Setzen Sie auf true, wenn Scrapling diese Datei berücksichtigen soll.
Related MCP server: Catalog Services MCP Server
Projektstruktur
scraper/ Phase 1 Scrapling crawler
config.py
spider.py
discovery.py
fetcher.py
cli.py
selectors/
parsers/
pipelines/
database/ shared SQLAlchemy models + repositories
utils/
app/ Phase 2 read-only MCP server
server.py Streamable HTTP + /health
config.py
auth/middleware.py bearer token (replaceable with OAuth)
tools/ MCP tool layer
services/ catalog / product / search / recommendations
repositories/ read-only queries over Phase 1 tables
schemas/
database/session.py pooled, read-only sessions
alembic/ PostgreSQL migrations
tests/
scripts/create_readonly_user.sql1. Abhängigkeiten installieren
Python 3.10+ ist erforderlich.
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate
pip install -r requirements.txtDie HTTP-/Browser-Erweiterungen von Scrapling sind in scrapling[fetchers] enthalten. Falls Sie einen Browser-Fallback (DynamicFetcher) benötigen, installieren Sie die Browser-Binaries:
scrapling installOptionale OCR für gescannte / bildbasierte PDFs:
pip install pytesseract Pillow
# plus a Tesseract OCR engine on the hostOCR ist standardmäßig deaktiviert (ENABLE_OCR=false). Bildbasierte PDFs werden gespeichert und als ocr_required markiert, nicht als leerer Text gespeichert.
2. PostgreSQL konfigurieren
Der schnellste lokale Weg:
docker compose up -d postgresDas startet PostgreSQL 16 mit:
Benutzer:
lumenPasswort:
lumenDatenbank:
lumenHost-Port:
5433(Container-Port bleibt5432; 5433 vermeidet eine Windows- PostgreSQL-Installation, die bereits 5432 nutzt).
Kopieren Sie die Umgebungskonfiguration:
copy .env.example .env # Windows
cp .env.example .env # macOS / LinuxStandardverbindungszeichenfolge:
DATABASE_URL=postgresql+psycopg2://lumenco:lumenco@127.0.0.1:5433/lumenco
LUMENCO_BASE_URL=https://en.staging.lumenco.ca/Erstellen Sie die Tabellen (beide Wege funktionieren):
python -m scraper init-db
python -m alembic upgrade head3. Test-Crawl mit 5 Produktionen
python -m scraper crawl --limit 5Das findet Produkte auf der Live-Seite, verarbeitet nur die ersten 5, lädt die zugehörigen Speicblätter herunter, speichert in PostgreSQL und druckt einen Crawl-Bericht.
Sie können auch eine Marke festlegen:
python -m scraper crawl --limit 5 --url https://en.staging.lumenco.ca/brand/aaledOder ein einzelnes Produkt:
python -m scraper crawl --url https://en.staging.lumenco.ca/aaled-aa-900018-1x4-bl.html4. Den vollständigen Crawl ausführen
python -m scraper crawlDas durchläuft alle Marken (und Kategorien), folgt jeder Seitenzahl-Seite und extrahiert alle erreichbaren Produkte. Verwechseln Sie --limit nicht mit einer Obergrenze für den Produktionskatalog – --limit ist nur für die Entwicklung.
Beschränkung ist integriert: concurrency, limit, Befehl, ... Drosselung, Wiederholungen mittels exponentiellem Backoff und optional AutoThrottle. Passen Sie sie in .env an:
MAX_CONCURRENCY=5
CONCURRENT_REQUESTS_PER_DOMAIN=3
DOWNLOAD_DELAY=0.5
RETRY_COUNT=3
AUTOTHROTTLE_ENABLED=true5. Einen Crawl fortsetzen
Scrapling Checkpointing wird über CRAWL_DIR aktiviert (Standard ./data/crawl). Drücken Sie einmal Ctrl+C, um sauber zu pausieren. Verwenden Sie es erneut mit:
python -m scraper crawl --resumeFortsetzungsverhalten:
Scrapling stellt ausstehende Anfragen aus
CRAWL_DIRwiederher.Produkte bereits mit einer
Steur;scrape_status=successwerden übersprungen, sofern nicht--forcegesetzt ist.Fehlgeschlagene Produkte werden erinnert.
Spezifikations-PDFs werden nicht erneut extrahiert, wenn der Dokument-Hash unverändert ist.
6. Datenbank inspizieren
python -m scraper stats
python -m scraper validate
python -m scraper product --sku aa-900018-1x4-blOder mit psql:
psql postgresql://lumenco:lumenco@127.0.0.1:5433/lumencoNützliche Datenbankabfragen:
SELECT count(*) FROM products;
SELECT sku, product_name, price, brand FROM products ORDER BY last_scraped_at DESC LIMIT 20;
SELECT p.sku, d.filename, d.extraction_status, left(d.extracted_text, 200)
FROM specification_documents d
JOIN products p ON p.id = d.product_id
WHERE d.extraction_status = 'extracted'
LIMIT 10;7. Wie Spezifikationsblätter verarbeitet werden
Für jede Produktseite sucht der Parser:
a.document-item-link(Lumenco’s „Specification Sheet“-Steuerelement)Äquivalente Bezeichnungen: Specification Formula, Defekt Sheet, Specifications, Technical Data, PDF, Fiche technique usw.
Dann funktioniert die Pipeline:
Speichern Sie die Dokument-URL.
Download der Datei mit
httpx(nicht mit einem Browser).Validierung der PDF-Magic-Bytes (
%PDF).Speichern eine definierte Kopie:
data/specifications/{per_sku}_{hash16}.pdf.Extrakt mit dem PyMuPDF.
Einrücken von Leerzeichen bei Seiten-/Abschnittswechseln. (nicht genau)
Bereinigen von Leerzeichen, Seiten-/Abschnitten bleiben erhalten.
Auszug (gefüllt) für Text, SHA-256-Hash, Methode und Status.
Parse
Label: Valueund ohne Feld zu erfinden.Spezifikationen aus PDF und Produktseite zusammenführen, Quelle spiegelt sich:
{
"Voltage": {
"value": "120-277V",
"source": "product_page",
"raw": "120-277V",
"normalized": {"min": 120, "max": 277, "unit": "V"}
}
}Wenn ein PDF nur sehr wenig Text enthält, ist der Status ocr_required (oder OCR wird bei ENABLE_OCR=true versucht). Leere erfolgreiche Extraktionen werden nicht gespeichert.
Unveränderte PDFs werden bei späteren Crawls über den Inhalt-Hash übersprungen.
8. Fehlerbehebung bei fehlerhaften Produkten
Symptom | Mögliche Maßnahme |
| Lesen Sie die JSON- |
Produkt HTTP 5xx / Timeout | Führen Sie |
Fehlendes Spezifikationsblatt | Bei einigen SKUs erwartet: Status ist |
PDF hat | Aktivieren Sie OCR oder prüfen Sie die Datei unter |
PDF mit | Verlinktes Datei ist nicht |
Duplikate | Sollte nicht vorkommen: eindeutige |
Markenseiten scheinen leer | Sicherstellen, dass Sie auf |
DynamicFetcher-Fehler | Führen Sie |
Datenverbindungsfehler | Prüfen Sie |
Strukturprotokolle sehen wie folgt aus:
[INFO] PRODUCT_FETCH url=https://en.staging.lumenco.ca/aaled-aa-900018-1x4-bl.html sku=aa-900018-1x4-bl status=success
[INFO] SPEC_SHEET sku=aa-900018-1x4-bl status=extracted duration=0.84s
[ERROR] SPEC_SHEET sku=... status=failed error=...Tests
pytestDie Coverage beinhaltet generierte URL, Produkt-/SKU-, Parsee-, Spezifikations-Erkennung, PDF-Extraktion, Datenbank-Upsert / Duplikate, Mitgliedschafts-Reihenfolgen, Scoring und MCP-Tool-Integ.
CLI-Refling
python -m scraper crawl --limit 100
python -m scraper crawl --mode development --limit 100 --url https://en.staging.lumenco.ca/brand/aaled
python -m scraper crawl --resume
python -m scraper reprocess-specs
python -m scraper embeddings --limit 100
python -m scraper embedding-stats
python -m scraper recommend --sku ABC123 --type related --limit 5
python -m scraper recommendation-eval
python -m scraper validate
python -m scraper stats
python -m scraper sample
python -m scraper product --sku ABC123
python -m scraper init-db
python -m app.serverStandardmodus ist Entscheid: Durchschnittlich 100 erfolgreich abgerufene Produkte, nur Marken (keine Kategorie-Lauf). Ein voller Katalog-Crawl wird verweigert, Unless --mode full --limit N oder --mode full --confirm- übergeben wird.
Phase 2.5 – Datenqualität für 100 Produkt
Dieses Projekt zielt auf einen kontrollierten Lumenco-Datensatz von ~100 Produkten ab. Der Live-Katalog hat über 30.000 SKU; vollständiges Katalog-Crawlen ist bewusst ausgeschlossen.
Pipeline
Scrapling → ExtractionProduct → PDF-Download → PDF-Guid → Normierung → PostgreSQL → Read-only MCP-Modell.
PDF-Größe wäre zuerst. OCR (Tesseract via pytesseract) greift nur bei kein Text. Set ENABLE_OCR=true und install T. Plus pip install pytesseract Pillow.
Normalisierte Spezifikationen behalten Quelle und Ausgleich. Rohermerkungen sind in spec_ AllDocs.extract1. MCP get_product liefert kompakte Strukturen; get_product_specifications kann rohen Text mit Rücksicht.
Französische Magento––– Kategorie URLs (z.B. /eclairageintérieur – electricité) werden in der Header des English-Host mitgefürt, funktionieren dort aber mit 404. Der Crawler fügt diese Pfade nicht ein. Neue Crawls verwenden zudem isolierte Checkpoint (data/crawl/run-<id>), um eine Pause-Datei zu verhindern. Verwenden Sie --resume nur für den gemeinsamen Checkpoint in data/crawl.
Französische, auf Englisch umgeschriebene Kategorie URLs werden als expected 4 gekappt und gelten nicht als Fehler.
Nach einem Crawl:
python -m scraper stats
python -m scraper validate
python -m scraper sample
python -m scraper product --sku L0110TUT8002020Phase 3A – Vektorsuche + Produkt-Embeddings
Phase 3A fügt semantikt PostgreSQL + pgvector hinzu. Keine Implementierung von Related/Upsell/Cross-sell, das ist Phase 3B.
Architecture
~100 product dataset
↓
Canonical product text (cleaned, no HTML)
↓
EmbeddingService (OpenAI-compatible API)
↓
product_embeddings (pgvector)
↓
VectorSearchService
↓
MCP tool: search_similar_productsSetup
Verwenden Sie ein PostgreSQL mit pgvector (
Docker–compose–pgvector/pgvector:pg16).Vektor-Umgebungsvariablen in
.env(Kopiere aus .env--example).Migrieren:
python -m alembic upgrade headErzeugen Sie die Embeddings für den DevCatalog:
python -m scraper embeddings --limit 100
python -m scraper embedding-statsUnveränderte Produkte jeweils über content_hash überflogen. Alleinkraft mit — Wiederherstellen.
Index strategy
HNSW über Kosinus-Distanz (vector ops``, m=16, ef_construction=64) – ideal für das ~100‑Produkte. IVFFlat nur zwei schlicht.
MCP
Neue Methode search_similar_products – Liest ausschließlich Vektoren, ruft keine Embed API auf, keine Weiten Scrabe. Existing Recommendation tools unchanged.
Phase 3B – Hybridrous Empfehlungsengine
Recommendations combine pgvector similarity and structured rules. Vector similarity alone is insufficient: an 18W e.g. Example two lighting, m.d. (model) and 30W T8 are related but semantically different, but they map differently to Related, Upsell, Cross-sell.
Product → vector candidates + structured neighbors
↓
hard exclusions
↓
Related / Upsell / Cross-sell scorers
↓
scores + confidence + reasons → MCPCategory | Meaning |
Related | Similar usage / category / specs |
Upsell | Same family and measurable improvement (not just price) |
Cross-sell | Complementary (driver, casing, bracket, fitting/replacement) |
No LLM is used in ranking. As MCP tools find_related_products, find_upsell_products and find_cross_sell_products check RecommendationService (read.
CLI
python -m scraper recommend --sku L0110TUT8002020 --type related --limit 5
python -m scraper recommend --sku L0110TUT8002020 --type upsell --limit 5 --debug
python -m scraper recommend --sku L0110TUT8002020 --type cross-sell --limit 5
python -m scraper recommendation-eval --sample-size 10 --limit 3Weights are configures via env RELATED_VECTOR_WEIGHT, UPSELL_TECHNICAL_WEIGHT, CROSS_SELL_COMPATIBILITY_WEIGHT (see .env.example).
Phase 3C – Claude + MCP Workflow
User → Claude → MCP (/mcp) → PostgreSQL + pgvector + RecommendationService → Claude → UserResponsibilisierung.
Ebene | Funktion |
Scrapling | Crawlen / Speichern |
PostgreSQL + pgvector | Maßgebliche Datenquelle + Vektoren |
RecommendationService | Deterministisches Related-/Upsell-/Cross-sell-Ranking |
MCP | Nur-Lese-Abruf (kein Scraping, keine Schreibzugriffe, kein LLM) |
Claude | Konversation, Tool-Auswahl, Erläuterung |
Claude-Skill
Projekt-Skill: .cursor/skills/lumenco-product-mcp/SKILL.md
End-to-End-Prompts
Siehe docs/claude-e2e-tests.md.
Claude / Inspector verbinden
docker compose up -d postgrespython -m app.serverRichten Sie den Client auf
http://localhost:8000/mcpaus (Streamable HTTP).Optional:
MCP_AUTH_TOKEN+Authorization: Bearer …
Für die spätere Remote-Bereitstellung: nur den MCP-HTTPS-Endpunkt freigeben; PostgreSQL privat halten.
Entwicklungsdatensatz
Aktueller Katalog: ~100 Produkte. Der vollständige Lumenco-Katalog (30k+) ist bewusst ausgeklammert.
Phase 2 — Lumenco Product Database MCP
Schreibgeschützter Streamable-HTTP-MCP-Server namens Lumenco Product Database.
Architektur
Claude
│ MCP / Streamable HTTP
▼
Lumenco MCP Server (/mcp, /health)
│
▼
MCP Tool Layer
│
▼
Service Layer catalog / product / search / similarity / recommendation
│
▼
Repository Layer SQLAlchemy, no raw SQL in tools
│
▼
PostgreSQL + pgvector products, specs, listings, product_embeddingsLokale Einrichtung
Schließen Sie die Phase-1-Einrichtung ab (PostgreSQL +
.env+python -m alembic upgrade head).Führen Sie einen Crawl aus, damit der Katalog befüllt wird.
Installieren Sie die MCP-Extras, falls sie nicht bereits in
requirements.txtenthalten sind:
pip install -r requirements.txtLegen Sie die MCP-Variablen in
.envfest:GXP32
Für die Produktion erzeugen Sie eine Rolle mit ausschließlich SELEC-Berechtigung:GXP33
Richten Sie DATABASE_URL anschließend auf lumenco_mcp aus.
Ausführung
python -m app.serverOder:
uvicorn app.server:app --host 0.0.0.0 --port 8000Docker:
docker compose up --build mcpMCP-Endpunkt
http://localhost:8000/mcp
Health
GET http://localhost:8000/health
{
"status": "ok",
"service": "lumenco-product-mcp",
"database": "connected"
}MCP Inspector
npx -y @modelcontextprotocol/inspectorVerbinden Sie sich über den Transport Streamable HTTP mit http://localhost:8000/mcp. Wenn MCP_AUTH_TOKEN gesetzt ist, fügen Sie Folgendes hinzu:
Authorization: Bearer <token>Bestätigen Sie, dass alle acht Tools aufgelistet und ausführbar sind.
Verfügbare Tools
Alle Tools lesen ausschließlich aus PostgreSQL. Keines ruft Lumenco-URLs ab.
get_catalog_status
Kataloggröße und Aktualität des letzten Crawls. Keine Eingabe.
get_listing_products
Produkte auf einer Marken-/Kategorie-Listing-URL in der ursprünglichen Listenposition.
Eingabe | Erforderlich | Hinweise |
| ja | Normalisiert und als Datenbankschlüssel verwendet |
| nein | Standard 20, maximal 100 |
| nein | Standard 0 |
get_product
Vollständiger Produktdatensatz per product_id und/oder sku.
get_product_specifications
Strukturierte Spezifikationen plus gespeicherter Text des Spezifikationsblatts. Es lädt keine PDFs herunter.
search_products
Lokale Katalogsuche (SKU, Name, Marke, Kategorie, Beschreibung, Spezifikationen).
Optionale Filter: brand, category, subcategory, sku, min_price, max_price.
search_similar_products
Semantische Nachbarn aus gespeicherten pgvector-Embeddings (Kosinus-Distanz). Es erzeugt keine Embeddings und ruft kein LLM auf.
Optionale Filter: brand, category, subcategory, min_price, max_price.
find_related_products
Hybride Related-Kandidaten (Vektor + Kategorie/Anwendung/Spezifikationen). Enthält match_score, confidence, score_breakdown und match_reasons. Optional debug=true.
find_upsell_products
Hybride Upsell-Kandidaten. Bedingung ist eine messbare Verbesserung (nicht nur der Preis). Gründe in upgrade_reasons.
find_cross_sell_products
Hybride Cross-sell-Kandidaten. Die Kompatibilität dominiert; Alternativen aus derselben Familie ausgeschlossen.
Die Empfehlungstools schließen das Quellprodukt aus und entfernen Duplikate. Claude soll einen Kandidatenpool anfordern und dann die endgültigen 3 Related / 4 Upsell / 7 Cross-sell selbst wählen.
Beispielbezogener Ablauf
Benutzer: Analysiere die ersten 10 Produkte von https://en.staging.lumenco.ca/brand/aaled und gib je 3 Related, 4 Upsell, 7 Cross-sell zurück.
get_listing_products(listing_url=..., limit=10)get_product(product_id=...)für jedes Quellproduktfind_related_products/find_upsell_products/find_cross_sell_productsmitlimit=10Claude wählt die endgültige Auswahl aus den Kandidatenpools.
Produktionsbereitstellung
Nur den MCP-HTTPS-Endpunkt freigeben; PostgreSQL privat lassen.
Internet → HTTPS → MCP server → private PostgreSQLGeeignete Hosts: Geeignete Hosts: Railway, Render, Google Cloud Run, AWS, Cloudflare.
Anforderungen:
HTTPS-Implementierung vor
uvicorn/ dem Docker-ImageMCP_AUTH_TOKENgesetzt (Bearer-Middleware ist so isoliert, dass später OAuth sie ersetzen kann)schreibgeschützte
DATABASE_URLHealth-Check unter
/health
Port 5432 nicht veröffentlichen.
Claude-Custom-Connector
Nachdem der Server über eine öffentliche HTTPS-URL erreichbar ist:
Fügen Sie in Claude einen Custom-Connector hinzu.
MCP-URL:
https://your-host/mcpDer Servername sollte als Lumenco Product Database erscheinen.
Konfigurieren Sie die Bearer-Authentifizierung mit
MCP_AUTH_TOKENoder OAuth, wenn Sie die Middleware ersetzen.Fragen Sie: „Wie viele Produkte sind derzeit in der Lumenco-Datenbank?“ Claude sollte
get_catalog_statusaufrufen.
Temporäres öffentliches HTTPS für lokale Tests: Cloudflare Tunnel, ngrok oder Ähnliches vor localhost:8000.
Sicherheit
Keine
execute_sql--,fetch_url--,run_command--- oder Crawl-ToolsNur SQLAlchemy parametrisierte Abfragen
Sternenbegrenzung
Sitzungen abgeschlossen
SET TRANSACTION READ ONLYauf PostgreSQLGeheimnisse werden nicht in Tool-Fehlern zurückgegeben
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 gradedqualityCmaintenanceEnables searching and retrieving product information from DigiKey's API, including part lookup, keyword search, product details, and pricing.
- FlicenseAqualityDmaintenanceEnables interaction with Adobe Commerce Catalog Services to retrieve product variants, price overrides, category permissions, and environment details via MCP.7
- FlicenseAqualityCmaintenanceExposes marketing catalogs (offers, assets, campaigns, and computed metrics) to MCP clients, enabling natural language queries and AI-driven marketing analysis.8
- AlicenseAqualityBmaintenanceEnables read-only discovery and verification of products across droplinked's KYB-attested merchant network via tools for inventory, merchant, and brand attestation lookups.7MIT
Related MCP Connectors
Federated commerce search across independent WooCommerce merchants. Keyless, read-only MCP server.
Agent-native product catalog for AI shopping agents. 296M+ products, 28 countries.
Manage products, EU Digital Product Passports, operator parties, and GS1 EPCIS supply-chain events.
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/ai-code-co/Claude_MCP_Lumenco'
If you have feedback or need assistance with the MCP directory API, please join our Discord server