ToolsUniverse

Agents, assistants and answer engines

Shop Tools Universe from Claude

The store is also an MCP server: Claude can search the catalogue, compare tools on a battery platform, book a rental machine and fill a basket, with the same Crystallize data and the same personal ranking as the website. And every page is written to be read by machines: structured data, typed specs with unit and ETIM codes, and plain-text versions for language models.

MCP server (Streamable HTTP)

https://tools-universe.superfast.shop/api/mcp

Part A

Set up the MCP server

Five minutes in Claude, one line in Claude Code. The public tools work without an account; sign in as a demo customer for prices, history and recommendations of your own.

A1

Add the store to Claude

claude.ai, Claude Desktop and the mobile apps share connectors. Interactive product cards need a host that supports MCP Apps; the tools themselves work everywhere.

Claude (web and desktop)

  1. 1
    Open Settings → Connectors and choose Add custom connector.
  2. 2
    Name it “Tools Universe” and paste the server URL above.
  3. 3
    Leave authentication on Sign in when needed: the server answers without a token on purpose, and only the personal tools ask you to sign in.
  4. 4
    If asked for an OAuth client, let Claude register itself. Leave request headers empty.
  5. 5
    Start a new chat, open + → Connectors and switch Tools Universe on.

Claude Code

claude mcp add --transport http tools-universe https://tools-universe.superfast.shop/api/mcp
claude "I’m on Milwaukee M18. Which SDS-plus hammers can I run on the batteries I already have?"

Run /mcp in a session to sign in when a personal tool asks for it.

Any other MCP host

Streamable HTTP, stateless, OAuth 2.1 with PKCE and discovery at /.well-known/oauth-protected-resource. VS Code, Cursor, ChatGPT and the MCP Inspector connect the same way.
A2

Sign in as a demo customer

There are no passwords. Ask something personal and Claude shows a Connect button; the store opens a page where you pick one of the demo customers, the same people as the account switcher in the header.

Each customer has a real order history in the Shop API, a company with trade or contract prices, and a market. Sindre, the Festool-only cabinetmaker, has the clearest taste; Martin cuts concrete on Hilti Nuron; Lotte is a weekend woodworker on DeWalt XR.

Prices and market

Prices follow the customer’s market (EUR, NOK or SEK) and their price list: trade customers see their company’s trade or contract price, excl. VAT.

Personal ranking

Every list is ranked with the taste vector built from their orders: the battery platform they own, their trade, the gear they buy.

Their own records

Orders, rental bookings and quotes are read from the Shop API. Baskets and bookings are made for that customer.

Demo customers

  • Sindre AasCabinetmaker, Festool only · Aas Møbelsnekkeri ASb2b · no
  • Kari NilsenCarpentry contractor, Makita LXT · Fjordbygg ASb2b · no
  • Ola BergCarpenter, Makita LXT · Fjordbygg ASb2b · no
  • Ingrid HaugenElectricians, Milwaukee M12/M18 · Nordlys Elektro ASb2b · no
  • Martin SolbergConcrete cutting and demolition, Hilti Nuron · Betongteknikk Øst ASb2b · no
  • Johan LindqvistPlumbing and heating, Milwaukee M18 · Stockholm Rör & VVS ABb2b · se
  • Daan MulderInterior fit-out, Festool · Mulder Interieurbouw B.V.b2b · nl
  • Erik JohansenRenovating a 1950s house, Bosch 18Vb2c · no
  • Emma SvenssonGarden and summer house, Makita LXTb2c · se
  • Lotte JansenWeekend woodworker, DeWalt XRb2c · nl
A3

What Claude can do

The tools mirror what the storefront does. Search and product tools return cards with packshots, price and stock; every answer links back to the same page in the store.

Catalogue

search_products
Free text plus filters: category, brand, platform, trade, typed specs (concrete.impactEnergy ≥ 8), price and stock.
get_product
Everything about one tool: specs with units and ETIM codes, versions and kits with what is in the box, price, stock.
similar_products
Alternatives by product type, platform and specs.
show_products
Cards for a shortlist Claude picked itself.
list_categories
The departments and product types.
list_brands
The six manufacturers.

Battery platforms

battery_platforms
Every platform with voltage and brand; with a platform, the tools on it and the batteries and chargers that fit; with a SKU, what fits that tool.

Rental

search_rentals
Machines for rent, with day, weekend, week and 4-week prices.
rental_availability
Free units per depot and period.

Basket and checkout

add_to_cart
Add a version by SKU; returns a basket you keep adding to.
view_cart
Lines, totals incl. and excl. VAT.
update_cart_line
Change a quantity or remove a line.
suggest_add_ons
Accessories, batteries and storage that go with what is in the basket.
checkout
A link that opens the basket in the store’s checkout.

Signed inAsk you to sign in

book_rental
Reserve a machine into the basket; confirmed at checkout.
whoami
Who you are to the store: company, market, price list and taste.
my_orders
Orders, rentals and quotes, with their stage.
recommendations
Picks ranked with your taste vector.
A4

Things to try

Vague on purpose is fine: the search suggests what you probably meant.
  • Open“I’m on Milwaukee M18. Which SDS-plus hammers can I run on the batteries I already have?”
  • Open“Compare the 18V impact drivers with at least 200 Nm, cheapest first, only what is in stock.”
  • Open“Which battery and charger should I buy for a Makita LXT circular saw? Put them in a basket.”
  • Open“I need to break up a concrete floor next weekend in Oslo. What can I rent, and what does it cost?”
  • Open“Hva er forskjellen på Hilti Nuron og Milwaukee MX FUEL for riving?”
  • Open“A diamond core drill for 150 mm holes: buy or rent for a week?”
  • Signed in“What would you recommend for me, and why?”
  • Signed in“What have I ordered before? Which batteries fit the tools I own?”
  • Signed in“Book the jackhammer from my nearest depot for Friday to Monday.”
  • Signed in“Show my open quotes and rentals.”

Part B

Built to be found by search engines and language models

Being connectable is half of it. The other half is being read correctly when someone asks an AI assistant for a cordless breaker or a 5 Ah battery. Everything below is generated from the same Crystallize data as the pages, in four languages.

B1

A JSON-LD graph on every page

schema.org in <script type="application/ld+json">, linked by @id so the product, its brand page and its battery platform page describe one graph.

The organisation and website (with a search action) on the front page; Product or ProductGroup with a Product per version on product pages; leased Products on rental pages; CollectionPage with an ItemList on categories, brands and platforms; BreadcrumbList everywhere.

ProductGroup / Product
versions (bare tool, kits) with SKU, GTIN and their own Offer
Offer
price incl. and excl. VAT, volume prices, stock as availability and inventoryLevel, what is in the box, warranty
category
product type path and the ETIM class as a CategoryCode
isAccessoryOrSparePartFor · isConsumableFor
the machines a battery, charger, blade or bit is made for
DefinedTerm
the battery platform, defined on its own page and referenced from every product on it
Offer on rentals
LeaseOut, lease length in hours, the depots as places with address and coordinates

Live excerpt from this product’s page (trimmed)

{
  "@type": "Product",
  "name": "Milwaukee M18 HB5 HIGH OUTPUT 5.0 Ah Battery",
  "sku": "4932499042",
  "brand": {
    "@type": "Brand",
    "@id": "https://tools-universe.superfast.shop/en/brands/milwaukee#brand",
    "name": "Milwaukee",
    "url": "https://tools-universe.superfast.shop/en/brands/milwaukee"
  },
  "category": [
    "Batteries & chargers > Battery",
    {
      "@type": "CategoryCode",
      "codeValue": "EC001199",
      "name": "Battery for electric tools",
      "inCodeSet": {
        "@type": "CategoryCodeSet",
        "name": "ETIM International classification",
        "url": "https://www.etim-international.com/"
      }
    }
  ],
  "weight": {
    "@type": "QuantitativeValue",
    "value": 0.78,
    "unitText": "kg",
    "unitCode": "KGM"
  },
  "additionalProperty": [
    {
      "@type": "PropertyValue",
      "name": "Capacity",
      "propertyID": "EF001985",
      "value": 5,
      "unitText": "Ah",
      "unitCode": "AMH"
    },
    {
      "@type": "PropertyValue",
      "name": "Power source",
      "propertyID": "EF000145",
      "value": "Cordless (battery)",
      "valueReference": [
        {
          "@type": "DefinedTerm",
          "name": "Cordless (battery)",
          "termCode": "cordless",
          "identifier": {
            "@type": "PropertyValue",
            "propertyID": "ETIM",
            "value": "EV000449"
          }
        }
      ]
    },
    {
      "@type": "PropertyValue",
      "name": "Voltage",
      "propertyID": "EF000002",
      "value": 18,
      "unitText": "V",
      "unitCode": "VLT"
    },
    {
      "@type": "PropertyValue",
      "name": "Battery platform",
      "value": "Milwaukee M18",
      "valueReference": {
        "@type": "DefinedTerm",
        "@id": "https://tools-universe.superfast.shop/en/battery-platforms/milwaukee-m18#platform",
        "name": "Milwaukee M18",
        "url": "https://tools-universe.superfast.shop/en/battery-platforms/milwaukee-m18",
        "inDefinedTermSet": {
          "@type": "DefinedTermSet",
          "name": "Battery platforms"
        }
      }
    }
  ],
  "isRelatedTo": [
    {
      "@type": "Product",
      "@id": "https://tools-universe.superfast.shop/en/batteries-and-chargers/milwaukee-m18-dfc-dual-bay-rapid-charger#product",
      "name": "Milwaukee M18 DFC Dual Bay Rapid Charger",
      "url": "https://tools-universe.superfast.shop/en/batteries-and-chargers/milwaukee-m18-dfc-dual-bay-rapid-charger"
    },
    "…"
  ],
  "offers": {
    "@type": "Offer",
    "sku": "4932499042",
    "price": 149,
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock",
    "inventoryLevel": {
      "@type": "QuantitativeValue",
      "value": 20,
      "unitCode": "C62"
    },
    "itemCondition": "https://schema.org/NewCondition",
    "warranty": [
      {
        "@type": "WarrantyPromise",
        "durationOfWarranty": {
          "@type": "QuantitativeValue",
          "value": 1,
          "unitCode": "ANN",
          "unitText": "years"
        }
      },
      {
        "@type": "WarrantyPromise",
        "durationOfWarranty": {
          "@type": "QuantitativeValue",
          "value": 3,
          "unitCode": "ANN",
          "unitText": "years"
        },
        "description": "3 years when you register"
      }
    ]
  }
}

/en/batteries-and-chargers/milwaukee-m18-hb5-high-output-50-ah-battery .md

B2

Typed facts, not text

Specs are typed components in Crystallize, so they arrive as numbers with units, true/false and option keys. The JSON-LD keeps them that way.

Each spec is a PropertyValue with the ETIM feature as propertyID, a numeric value, unitText and the UN/CEFACT unitCode, and maxValue or minValue when the field is a bound. Selections carry the option key and the ETIM value code. The same codes are in the Markdown pages and in llms-full.txt.

SpecValueunitCodeETIM
Voltage18 VVLTEF000002
Capacity5 AhAMHEF001985
Torque, hard joint230 NmNUEF002842
No-load speed3,400 1/minRPMEF011125
Weight without battery2.2 kgKGMEF011121
Tool holderSDS-max–EF002843 · EV005657
B3

Plain text for language models

Agents that don’t run JavaScript, or prefer text, get the same catalogue without markup.

llms.txt and llms-full.txt

A Markdown map of the store (markets, categories, platforms, brands, rental) per llmstxt.org, and the full catalogue in one file with prices in three currencies, stock, product type, ETIM class and every typed spec with its codes./llms.txt /llms-full.txt

A Markdown version of every page

Append .md to any URL, or send Accept: text/markdown. Product pages list specs with unit and ETIM codes, versions, what is in the box, fits and pairings; each page links to the others. Announced in <head> with rel="alternate" type="text/markdown"./en.md /en/batteries-and-chargers.md
B4

Crawlers, maps and languages

The basics done properly, so a crawler finds every page once and in the right language.

robots.txt with named AI crawlers

GPTBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended and others are allowed by name, with a Content-Signal: search=yes, ai-input=yes. Basket, account, API and OAuth routes are kept out./robots.txt

Sitemap with hreflang

Every category, product, rental, brand, platform and technology page in four languages, each with its translated alternates and the last change from Crystallize./sitemap.xml

Canonicals and hreflang

Paths are translated per language, so alternates are looked up by item id. Filtered category views point their canonical at the clean category; search results are noindex.

Metadata in the HTML for bots

Next.js streams metadata after the first byte. For crawlers that read HTML without running JavaScript (search engines and AI agents alike) htmlLimitedBots puts title, description, canonical and hreflang in <head>.

Check it yourself: paste a product URL into Claude with web access and ask for its voltage, weight and price incl. VAT, or open the page’s .md version.

How the demo is built →← Back to the store