# En verktøybutikk bygget direkte på Crystallize

> Tools Universe er en demo for verktøybransjen i Norden: seks produsenter, kjøp eller leie, firmakunder og privatkunder, fire språk. Alt er ren Crystallize: nettbutikken leser Discovery API og Shop API og ingenting annet.

- **416** produkter fra seks produsenter, 611 utgaver
- **~2 800** typede spesifikasjonsverdier, 106 komponenter med ETIM-kode
- **13** batteriplattformer
- **24** leiemaskiner, 75 enheter på fem depoter
- **4** språk og tre valutaer

## Slik henger det sammen

Én tenant, to API-er. Seeden skriver tenanten gjennom PIM-API-et; alt en besøkende, en assistent eller en crawler ser, leses tilbake gjennom Discovery og Shop API.

- **Produsentkilder:** Datablader, listepriser og bilder fra de seks merkenes egne nettsider. Ingen data fra forhandlere.
- **Seed:** `npm run seed`: ti idempotente steg, fra modell til kunder
- **PIM:** Shapes, typede pieces, topics, ETIM-klasser, vektorer
- **Discovery API:** Søk, fasetter, `rankBy` med kundens smak
- **Shop API:** Handlekurv, kasse, ordrer, tilbud, leiebookinger
- **Nettbutikk:** Next.js 16, mellomlagrede Discovery-kall, kundedata strømmes inn
- **Hvem leser den:** Kunder (Fire språk, mva.-bryter, kontovelger); Assistent på siden (Claude med katalogverktøyene); MCP-klienter (Claude, Claude Code, enhver MCP-vert); Crawlere og LLM-er (JSON-LD, llms.txt, .md-sider)

## Spesifikasjoner er typet, ikke tekst

Ingen egenskapstabeller. Hver spesifikasjon er sin egen komponent, så den kan filtreres, rangeres, oversettes og eksporteres uten parsing.

Et verktøy har to felles pieces, `power` (strømkilde, spenning, motor) og `physical` (vekt, mål, vibrasjon, støy), og én **spesifikasjonsfamilie** valgt per produkt: boring, betong, saging, sliping, trebearbeiding, festing, installasjon, måling, avsug, batteri og lading, byggeplass, oppbevaring, utendørs eller forbruk. Familien er et enkeltvalg, så en meiselhammer kan ikke få feltene til en sag.

Tall er numeriske komponenter med enhet (`230 Nm`, `18 V`, `5 Ah`), ja/nei er boolske, faste sett er valg. 106 komponenter har sin ETIM 10.0-egenskap, og de norske, svenske og nederlandske etikettene er ETIMs offisielle navn. Hvert produkt ligger i sin ETIM-klasse.

De samme typede verdiene styrer fasettene i kategoriene (intervallfiltre på slagenergi, bladdiameter …), spesifikasjonsarket, JSON-LD med UN/CEFACT-enhetskoder, og spesifikasjonsfiltrene til assistenten og MCP-serveren.

- **Slagenergi:** `specs.concrete.impactEnergy` · J (JOU) · EF002831
- **Verktøyfeste:** `specs.concrete.toolHolder` · SDS-max · EV005657
- **Vekt:** `physical.weight` · kg (KGM) · EF011121

## Taksonomi, merker og batteriplattformer

Elleve topic maps beskriver hvert produkt slik bransjen tenker, på fire språk.

Merke, batteriplattform, produkttype, fag, materiale, nivå, prisklasse, egenskap, tilgjengelighet, bildetype og ETIM-klasse: 188 topics. De styrer navigasjon, fasetter og smaksvektorer.

Merker, batteriplattformer og teknologier er dokumenter med egne sider. **Batteriplattformen** (Milwaukee M18, Makita LXT, Hilti Nuron …) er valget en fagperson allerede har tatt: den avgjør hvilke batterier som passer, og den er det sterkeste signalet i personaliseringen. Tilbehør, blader og batterier oppgir maskinene de passer til; maskinene har produsentens anbefalte tilbehør.

## Utleie med ekte booking

Tungt utstyr leies per dag, helg, uke eller fire uker, fra fem depoter i Oslo, Bergen, Stockholm, Göteborg og Rotterdam.

Hver leievare er et bookbart produkt med en pool av navngitte enheter, de fysiske maskinene. Nettbutikken viser ledighet per depot og periode fra Shop API, booker enheten i handlekurven og bekrefter bookingen i kassen, koblet til ordren.

Tre bookingregler gir ledetid og et **avbestillingsvindu** på 24 eller 48 timer: innenfor det kan en leie fortsatt fjernes fra handlekurven, og enheten frigjøres. Sertifikatkrav, depositum og levering til byggeplass er en del av leievaren.

## Fire språk, tre valutaer, mva. begge veier

Navn, tekster, topics, bildetekster og URL-stier er oversatt. Språket velger markedet.

Engelsk og nederlandsk selger i EUR (21 % mva.), norsk i NOK og svensk i SEK (25 %). Prisene lagres netto, per valuta, med mengderabatter. **Inkl./eks. mva.**-bryteren i toppen bytter hver pris på siden; firmakunder ser eks. mva. som standard.

Firmakunder får firmaets prisliste fra Crystallize-markeder: Discovery gir `nokPriceFor(marketIdentifiers)`, og handlekurven i Shop API bruker samme liste. Faktura med innkjøpsreferanse, tilbud i egen pipeline, og en kontoside med ordrer, leie og tilbud etter status.

## Rangert for hver kunde

Ingen egen anbefalingstjeneste. Én smaksvektor per kunde, og Discovery rangerer.

Topics blir tre vokabularer: **ecosystem** (merke og plattform), **work** (fag og materiale) og **gear** (produkttype, nivå, egenskaper). Hvert produkt har en vektor i hver. Kundens smaksvektor bygges fra ordrehistorikken i Shop API og sendes med hvert kall som `context.userTaste`, med en `rankBy`-regel som blander den med salg, margin og lager.

Bytt demokunde i toppen, så rangeres butikken på nytt: forsiden, rekkefølgen i kategoriene, bildene i megamenyen, tilbehør og alternativer. Sindre, en møbelsnekker som bare kjøper Festool, har den tydeligste vektoren; Lotte, helgesnekker med DeWalt, ser en helt annen butikk.

## Bare data fra produsentene

Ingenting kommer fra forhandlere.

Spesifikasjoner, listepriser og bilder kommer fra de seks produsentenes egne nettsider, samlet av research-agenter og normalisert inn i modellen med kilde per produkt. Produkttekstene er skrevet for demoen. Bosch, Festool og Hilti har listepriser; resten, og NOK og SEK, er estimert og avrundet til hyllepriser. Depoter, enheter, kunder og antall anmeldelser er fiktive.

## En idempotent seed

Tenanten er kode. Endre data eller modell, kjør et steg på nytt, og tenanten følger etter.

`npm run seed` kjører ti steg i rekkefølge: tenant-innstillinger, innholdsmodell, taksonomi, bilder, katalog, utleie, oversettelser, landingssider, vektorer, kunder. Hvert steg kan kjøres for seg; det oppdaterer det som finnes i stedet for å lage duplikater. Smaksvektorene beregnes til slutt, skrives som utkast, publiseres og indekseres.

Byggingen er tatt opp steg for steg for avspilling, og det Crystallize-skillsene burde ha fortalt oss, skrives ned underveis.

- **00–02:** Tenant, 29 pieces og 11 shapes, 11 topic maps
- **03–05:** 1 104 bilder, 416 produkter, 24 leievarer
- **06–07:** Norsk, svensk, nederlandsk; landingssider
- **08–09:** Vektorer og indeks; kunder og historikk

## En assistent på siden, og en MCP-server for alle agenter

Samme katalog, samme rangering, to veier inn.

**Spør**-knappen i toppen åpner en handleassistent som kjører på Claude med butikkens egne verktøy: søk med typede spesifikasjonsfiltre, produktdetaljer, plattformer, utleie og handlekurv.

Butikken er også en MCP-server. Legg den til i Claude som kobling, logg inn som demokunde og handle fra chatten: sammenlign verktøy på en plattform, book en leiemaskin, fyll handlekurven og gå til kassen i butikken. Hver side er også laget for å leses av søkemotorer og språkmodeller.

## Ting å prøve

1. Bytt kunde i toppen (prøv Sindre, så Lotte) og se forsiden og kategoriene rangeres på nytt.
2. Søk etter en spesifikasjon, ikke et navn. https://tools-universe.superfast.shop/no/search?q=sds%20max%20meiselhammer
3. Åpne en batteriplattform fra menyen og se hvert verktøy, batteri og lader på den.
4. Lei en meiselhammer for en helg: velg depot, se hvilke enheter som er ledige, book den i handlekurven.
5. Bytt inkl./eks. mva. i toppen, og bytt språk for å se NOK og SEK.
6. Spør assistenten: «Hvilke batterier passer verktøyene mine, og hvilket gir mest for pengene?»
7. Legg .md til en URL for å se hva en språkmodell leser.

[Koble Claude til butikken](https://tools-universe.superfast.shop/no/mcp.md): MCP-oppsett, demoinnlogging, og hvordan butikken er satt opp for AI-søk

---

Nettside: https://tools-universe.superfast.shop/no/about
Markdown-versjon av siden, for språkmodeller. Prisene er netto (eks. mva.) med mindre de er merket inkl. mva.
