28.07.2026 04.09.2026 offerhopper.ai team 19

Persönlicher AI-Einkaufsassistent mit Claude, ChatGPT oder OpenClaw

Persönlicher AI-Einkaufsassistent mit Claude, ChatGPT oder OpenClaw
Persönlichen AI-Einkaufsassistenten mit offerhopper.ai über MCP aufbauen — KI-generiert (offerhopper.ai)

Irgendwo da draußen hat jemand offerhopper.ai fest in seinen Morgen integriert. Jeden Montag gegen acht Uhr, bevor jemand ans Einkaufen denkt, trifft eine Anfrage von einem geplanten Agenten ein und prüft, ob sich heute eine Fahrt lohnt.


So sieht ein fertiges Setup aus. An einem Samstag diesen Monat hat der Assistent für einen Haushalt bei Trier eine Woche Abendessen bepreist, das Menü um das Schweinehackfleisch und den Lachs herum gebaut, die in dieser Woche tatsächlich reduziert waren, und die finale Liste für eine echte Route durchgerechnet: drei Stopps, 40,67 € insgesamt. Auf die Frage, ob das besser sei, als einfach in einen einzigen Laden zu fahren, erzwang er einen Einzel-Laden-Preis für denselben Korb, kam auf 53,18 € und meldete die Fahrt als 12,51 € wert in dieser Woche. Als mitten in der Woche ein Gast mit Zöliakie auftauchte, löste er die zweite Wochenhälfte in Tacos und einen Thunfischsalat auf Maistortillas um, ohne die Tage anzurühren, die schon funktionierten. Der Rest dieser Seite zeigt, wie man das baut.

Ich habe offerhopper.ai ursprünglich als Webanwendung gebaut — lies die Geschichte, warum offerhopper.ai existiert, um die Entscheidungsmüdigkeit im Supermarkt zu beenden. Du öffnest die App, wenn du bereits einkaufen willst, tippst deine Liste ein und die App berechnet den optimalen Weg und ob sich die Fahrt rechnet. Das war das Erste, was existierte, und für eine Website hält es sich gut.

Der MCP-Server entstand, weil KI-Agenten ohne reale Daten beim Thema Preise und Wege halluzinieren. Ein Sprachmodell, das gefragt wird "Lohnt sich die Fahrt zu Aldi heute?", erfindet eine plausibel klingende Antwort ohne Route, ohne Live-Preise und ohne tatsächliche Arithmetik dahinter. offerhopper.ai übernimmt die Arithmetik. Über das Model Context Protocol (MCP) erhält der Agent eine echte Multi-Store-Kostenberechnung statt einer als Berechnung getarnten Schätzung. Und sobald der Agent die Anfragen stellt statt du selbst, wartet das Tool nicht mehr darauf, dass du an es denkst: der Agent kennt bereits Dinge über deinen Haushalt, die die Website niemals wissen wird.

Dieser Leitfaden dreht sich darum, daraus einen persönlichen Assistenten in Claude, ChatGPT oder selbstgehosteten Agenten wie OpenClaw zu machen. Es geht um die Einrichtung, nicht um das Wire-Format: Verbindungsdetails, die vollständige Parameterliste und die Response-Struktur stehen im MCP Entwickler-Guide. Jedes durchgerechnete Beispiel unten ist reales Ergebnis aus einem deutschen Haushalt, inklusive der Läufe, die schiefgingen. Wenn du es nicht von Hand einrichten möchtest, springe direkt zum Agentic Setup Flow und übergib diese Seite deinem Agenten.

Wichtig vorab: offerhopper.ai beantwortet "Wohin muss ich für diese Liste fahren und lohnt sich die Fahrt?". Es beantwortet nicht "Was ist in meiner Nähe im Angebot?". Du bringst die Liste; das Tool übernimmt das Routing und die Arithmetik.


Schnellstart

Server verbinden, dem Assistenten etwas Kontext geben, eine Anfrage ausführen.

1. Server verbinden

Parameter Wert
MCP Server URL https://mcp.offerhopper.ai/mcp
Authentifizierung Keine (öffentlicher Endpunkt)
Tool-Name plan_optimal_shopping_route
Unterstützte Assistenten Claude (Web, Mobile, Desktop), ChatGPT (Developer Mode), OpenClaw

In Claude Web und Mobil öffnest du Einstellungen, dann Connectors, dann Custom Connector hinzufügen und gibst die URL ohne Authentifizierung ein. Füge sie auf Account-Ebene hinzu, nicht in einem einzelnen Projekt, sonst sehen spätere geplante Tasks sie nicht. In ChatGPT (Plus, Team oder Enterprise) öffnest du Einstellungen, dann Apps, aktivierst den Developer Mode, erstellst eine App und gibst dieselbe URL ein. In OpenClaw installierst du aus der ClawHub-Registry:

openclaw plugins install clawhub:offerhopper.ai

Screenshots, die Claude-Desktop-Bridge-Konfiguration und den vollständigen Walkthrough findest du im MCP Developer Setup Guide.

2. Dem Assistenten Kontext geben

Füge deinen stehenden Kontext als Skill ein (siehe Das Skill und seine Einrichtung), oder, falls du wirklich nur chatten möchtest, trage die fünf Werte inline ein, die das Skill auflistet: deine PLZ, Haushaltsgröße, Transportmittel, deinen Stundensatz und deine zwei Einkaufslisten auf Deutsch.

3. Eine Anfrage ausführen

Prüfe meinen Frischekorb. Lohnt sich heute ein Einkauf?

Das ist die ganze Anfrage. Standort, Transportmittel, Haushaltsgröße und Ausgabeformat stammen komplett aus dem Kontext, den du installiert hast. Wenn du Schritt 2 übersprungen hast, musst du diese Werte jedes Mal manuell angeben. Für den Haushalt aus diesem Beispiel ergab eine Version dieses Korbs mit vier Artikeln einen Stopp in einem 643m entfernten REWE: 10,06 € insgesamt, 7% Fahrtkosten-Anteil, Urteil: lohnt sich.

Bevor du dieser Summe vertraust, lies selected_product in jeder Zeile. Warum das zählt und wie du den Rest der Antwort liest, ist ein eigener Abschnitt weiter unten. Oder überspringe die manuelle Einrichtung ganz und übergib diese Seite deinem Agenten.


Das Skill und seine Einrichtung

Dein Assistent ist der Ort, an den dieser Kontext gehört. offerhopper.ai speichert zwischen den Aufrufen nichts über dich, also leben die stehenden Fakten bei dir und werden nur übergeben, wenn eine Anfrage sie braucht. Leg sie in ein Skill statt in lose Anweisungen: geplante Läufe sind separate Sitzungen, die ein Skill laden können, aber möglicherweise nicht die Custom Instructions eines Projekts erben, also ist ein Skill das eine Zuhause, aus dem sowohl deine Chats als auch dein Montagslauf lesen.

Wenn du nur chatten möchtest, kann der Block stattdessen in den Custom Instructions deines Assistenten leben: Project- oder Global-Custom-Instructions in Claude, gespeicherte Erinnerung in ChatGPT, MEMORY.md in OpenClaw. Wenn du irgendetwas automatisieren willst, nimm eine Skill-Datei (grocery-offerhopper/SKILL.md), denn das ist die eine Quelle, aus der sowohl eine Chat-Sitzung als auch ein unbeaufsichtigter Lauf lesen. Diese Wahl entscheidet, ob deine Automatisierung später funktioniert, also triff sie jetzt.

Beachte das Frontmatter. Ein geplanter Task, der seine Konfiguration nicht findet, ist fast immer ein Skill mit fehlendem oder fehlerhaftem name / description:

---
name: grocery-offerhopper
description: >
  Stehender Kontext für die Lebensmittel- und Drogerieplanung über
  offerhopper.ai. Für den Wocheneinkauf, den Frischekorb, den Vorrats-Check,
  die Menüplanung und jede "Lohnt sich die Fahrt"-Frage in Deutschland.
---

Verlasse dich für Echtzeitpreise und genaues, einkaufsspezifisches Routing auf
plan_optimal_shopping_route. Wann immer die Antwort von realen Preisen oder
Entfernungen in meiner Nähe abhängt, hat es Vorrang vor jeder Zahl aus dem
Gedächtnis oder dem Web.

# Haushaltsfakten  (von dir auszufüllen)
- Standort: [PLZ oder Ort]. Für jede Anfrage genutzt, außer ich sage etwas anderes.
- Haushaltsgröße: [z.B. 2 Erwachsene]. Bemisst nicht angegebene Mengen.
- Transportmittel: [Auto, oder Fahrrad / E-Scooter, oder Zu Fuß].
- Zeitwert: [EUR pro Stunde]. Wird als hour_cost übergeben.
- Streckenkosten: [EUR pro km, nur Auto]. Wird als km_cost übergeben.
- Zeit im Laden: [Minuten pro Stopp]. Wird als shopping_time_per_store übergeben.
- Ernährung: [z.B. Milch laktosefrei; sonst nichts].
- Einkaufsrhythmus: [alle paar Tage, oder ein Wocheneinkauf].

# Körbe  (von dir auszufüllen, auf Deutsch)
- Frischekorb: [Grundnahrungsmittel, auf Deutsch], bemessen für [N] Tage.
- Vorratsliste: [haltbare Artikel, auf Deutsch].

# Regeln  (die Meinung des Produkts, so lassen, wie sie stehen)
1. Artikelnamen auf Deutsch. Nenne die konkrete Absicht, wenn mir wichtig ist,
   welches Produkt ankommt (Kopfsalat statt Salat, Gouda am Stück 400g statt
   Käse). Lass ein Wort allgemein, wenn es mir wirklich egal ist (Obst).
2. Nicht angegebene Mengen für den Haushalt bemessen. Zu Einheiten siehe Mengen
   unten.
3. Urteil, Fahrkosten-Anteil in Prozent, Korbsumme und Laden-Zeitaufwand
   getrennt von der Hauptsumme ausweisen.
4. Jedes selected_product nennen, das nicht dem entspricht, wonach ich gefragt
   habe, und jeden Artikel über seinem market_average. Relevanz sagt, wie gut
   der Treffer zu meiner Absicht passt, nicht wie der Preis ist. Ein niedrigerer
   Wert bedeutet meist, dass ein lockererer Treffer genommen wurde, weil er
   deutlich günstiger war, also lies das alternatives-Array des Artikels, nenne
   die Exakt-Treffer-Option und den Preisunterschied und lass mich den Handel
   beurteilen. Ein allgemeines Wort, das zu einem guten Preis aufgelöst wurde,
   oder eine Packungsgröße, die die von mir gezählte Einheit schlägt, ist kein
   Fehler. Wenn der Treffer wirklich falsch ist, war die Anfrage mehrdeutig und
   braucht ein präziseres Wort.
5. Vorrats-Alerts nur, wenn ein Artikel mehr als 25% reduziert ist und das
   Urteil worth_it ist. Sonst sagen, dass sich nichts lohnt.
6. Wenn ich erwähne, dass ich irgendwohin fahre, übergib es als end_location,
   sodass der Umweg berechnet wird, keine Rundfahrt.
7. Keine zusätzlichen Stopps vorschlagen, die das Tool nicht geroutet hat.
   Vertraue seiner Stopp-Anzahl.

# Mengen  (die Einheit wählen, die die Menge festnagelt)
Wo die Menge von Größe oder Gewicht abhängt (Fleisch, Fisch, Käse, das meiste
Gemüse), immer Gramm oder Liter, nie eine Stückzahl: ein Stück ist ein
unvorhersehbares Durchschnittsgewicht, sodass 3 Stück etwa 300g ergeben können,
wenn du 600g wolltest. Stück nur für abzählbare Einheiten, die man wirklich zählt
(Eier, eine Gurke, eine Dose, eine benannte Packung). Bei in Packungen verkauften
Artikeln kann sich eine bloße Zahl an die Packungszahl binden und den Einkauf
aufblähen (8 Wraps als 8 Packungen gelesen), also auch dort Gramm oder eine
explizite Packungszahl. Kommt eine Menge falsch skaliert zurück, führe diese eine
Zeile erneut in Gramm aus und ersetze sie in der finalen Liste, statt sie nur zu
markieren; die Liste, mit der ich einkaufe, muss stimmen.

# Reporting  (unaufgefordert, in der ersten Zusammenfassung)
Nenne zwei Dinge in der ersten Zusammenfassung ungefragt. Erstens jedes
selected_product unter Relevanz 1.0, mit Namen: wenn die Engine einen
günstigeren Ersatz genommen hat, gib die Exakt-Treffer-Alternative und den
Preisunterschied an, damit ich beurteilen kann, ob der engere Treffer es wert
ist; sonst markiere es als im Laden zu prüfen. Zweitens jede Zeile mit 25%
Rabatt oder mehr, mit Namen, Preis und Prozent. Ist eine Zeile zugleich ein Deal
und ein Ersatz, sag beides, damit keins das andere verdeckt.

# Workflows  (Mehrfach-Aufruf-Abläufe, die Meinung des Produkts, so lassen)

## Wochenmenü aus Preissignalen
1. Sondieren. Zwei breite Abfragen, gebündelt: Proteine, dann Kohlenhydrate +
   Gemüse. Übergib hour_cost=0 und km_cost=0 bei der Sondierung, damit die Engine
   den echten günstigsten Preis pro Artikel zurückgibt und nicht durch
   Fahrt-Reibung zu einem näheren Laden verschoben wird. Du liest den Markt,
   routest noch nicht.
2. Bewerten. Berechne für jeden Artikel 1 - (price / market_average). >= 0,25
   stark, 0,10 bis 0,25 moderat, < 0,10 schwach. Absteigend sortieren.
3. Zusammenstellen. Bau die Woche auf den starken Artikeln auf, nutze moderate
   als Beilage, lass die schwachen Proteine weg. Eine Ausnahme wie Lachs nur,
   wenn sein eigener Rabatt es rechtfertigt.
4. Mengen vor dem Bepreisen abgleichen. Zähle jede Zutat über alle Abendessen
   zusammen und übergib die summierte Menge, nicht eine Packung pro Name
   (Einheiten wie in Regel 2). Sag "frisch", wenn ich frisch meine.
5. Validieren. Führe die abgeglichene Liste einmal für die echte Route aus, mit
   meinem normalen hour_cost und km_cost aus den Haushaltsfakten.
6. Die echte Ersparnis messen. Führe dieselbe Liste erneut mit max_stores=1 aus
   und zieh die Summen gegen die Mehrstopp-Route ab. Diese Differenz ist der
   wahre Wert der Fahrt, nicht die eigene Ersparnis-Zahl des Tools.

Rate-Limit: 3 Aufrufe pro 30-Sekunden-Fenster; ein vierter löst eine
60-Sekunden-Sperre aus. Die Sondierung (2) plus Validierung (1) verbraucht das
Budget, also lass das Fenster ablaufen, bevor ein Korrektur-Re-Run kommt.

## Einen laufenden Plan ändern  (Gast, Ernährungswechsel, halber Kühlschrank schon gekauft)
Behalte die Tage, die schon funktioniert haben, und löse nur die geänderten neu.
Bevorzuge eine Küche, die die Einschränkung erfüllt, statt gegen sie
anzukämpfen (Mexikanisch für glutenfrei setzt auf Mais und Reis). Nur die
betroffenen Artikel neu bepreisen.

## Einen Artikel auf einer laufenden Route tauschen
Manchmal will der Nutzer eine einzelne Zeile auf einer schon berechneten Route
ändern. Ein abgelehnter Treffer, eine Marken-, Diät- oder Packungsvorliebe, oder
„lieber X", wobei X schon als Alternative gelistet ist. Dafür ruf `swap_route_item`
auf. Plane nicht die ganze Liste neu.

Tausch nicht einfach, um eine günstigere oder höher bewertete Option zu greifen. Die
Engine hat Preis, Relevanz und Fahrt schon abgewogen. Erklär zuerst den aktuellen
Treffer. Tausch nur, wenn der Nutzer wirklich etwas anderes will.

Übergib die `share_url` der Route (oder ihre 8-stellige ID) als `share`. Dann zwei
IDs, direkt aus der letzten Antwort kopiert: `offer_id` ist die Zeile aktuell auf der
Route, `alt_id` ist die einzuwechselnde. Nimm `alt_id` aus den `alternatives` des
Artikels (selber Laden) oder aus `cross_store_alternatives` (ein Laden, der schon auf
der Route liegt). Baue oder rate nie eine ID.

Ein Tausch kann die Menge ändern, nicht nur den Preis. buy_count wird neu berechnet,
um die angefragte Menge weiter zu decken. In einem Lauf kam ein ganzes Brathähnchen,
gegen Schenkel getauscht, mit 2 Packungen statt 1 zurück, zu einer höheren
Zeilensumme. Nenn das, nicht nur den neuen Stückpreis.

Ein Tausch verschiebt einen Artikel zwischen Stopps, die es schon gibt. Er kann keinen
Stopp hinzufügen. Für ein besseres Angebot bei einem Laden, der nicht auf der Route
ist, braucht es einen neuen Plan. Ein Cross-Store-Tausch kann einen leeren Stopp
streichen, das ändert die Fahrt-Rechnung. Lies trip_verdict auf der zurückgegebenen
Route also neu. Nimm nicht an, es sei gleich geblieben. Berichte den Tausch wie jedes
Ergebnis: das neue selected_product, seine Relevanz und den Rabatt, und die neue
Korbsumme. Zählt als ein Aufruf gegen das 3-pro-30s-Limit.

## Einzelartikel, lohnt sich eine Extra-Fahrt
Frag nach dem einen Produkt. Lies candidate_store_routes und den
single_item_comparison-Hinweis. Das günstigste Regal ist oft nicht der
empfohlene Stopp, sobald die Fahrt berechnet ist; nenne beide und die Differenz.

Warum die Zahlen zählen

Die Haushaltsgröße verändert die Bedeutung eines einzelnen Wortes. Joghurt ohne Mengenangabe verwendet standardmäßig einen 150g-Becher; für eine Drei-Personen-Woche ist es ein 1kg-Eimer, wodurch das System Großpackungen korrekt mit Kleinpackungen vergleichen kann (mehr dazu unter welche Packung ist wirklich günstiger).

Der Zeitwert wirkt in beide Richtungen, und der Standard liegt bei 12,00 €/Stunde. Über dem Standard fallen knappe Stopps weg: bei 25 €/Stunde kostet ein 15-minütiger Umweg 6,25 €, sodass eine Ersparnis von 1,00 € bei Kaffee ein klarer Verlust ist und das Tool dir das sagt. Unter dem Standard werden sie attraktiv: bei 6,00 €/Stunde kostet derselbe Umweg 1,50 €, und ein Haushalt bei diesem Satz hatte Zwei-Laden-Routen, die ihre erzwungenen Einzel-Laden-Äquivalente um 1,25 € und 4,28 € bei zwei verschiedenen Menüs schlugen. Dass sich das Aufteilen auf zwei Läden selten lohnt, folgt aus dem Standard-Stundensatz und ist kein Gesetz des deutschen Einzelhandels. Setze deinen ehrlich an und die Empfehlungen passen sich an.

Trage die Fakten und Körbe jetzt ein; lass die Korb-Formulierung grob. Der nächste Abschnitt zeigt, wie man Listenpunkte schreibt, die der Matcher so auflöst, wie du es meintest, und du kommst zurück und schärfst dieses Skill nach, sobald du deine eigenen Ergebnisse gesehen hast.


Gute Ergebnisse erzielen

Zwei Fähigkeiten zählen: Listenpunkte so zu formulieren, dass der Matcher sie meint wie du, und die Antwort auf der Ebene zu lesen, auf der du entscheidest. (Die Feld-für-Feld-Referenz der Antwort steht im Entwickler-Guide; hier bleiben wir dabei, was du damit machst.)

Einkaufslisten richtig formulieren

offerhopper.ai führt keinen sturen Textvergleich gegen Produktnamen durch. Es löst deine Worte zur plausibelsten Kaufabsicht auf und sucht dann Produkte für diese Absicht. Meistens ist das genau das, was du willst: "Hackfleisch" findet Hackfleisch, ohne dass du Marke, Packungsgröße oder Fettgehalt angeben musst. Das Problem ist subtiler, als dass vage Worte fehlschlagen. Ein Wort kann mehr als eine sinnvolle Absicht tragen, und der Matcher wählt eine davon aus.

Zwei reale Auflösungen aus einem Lauf mit einer allgemeinen Standardliste:

Angefragt Gematcht auf
Salat Cherry Romatomaten 250g
Käse Exquisa Frischkäse Fitline Kräuter 200g

Beides ist nicht absurd. Aus Cherrytomaten kann man Salat machen, und Frischkäse ist Käse. Es sind vertretbare Lesarten eines mehrdeutigen Wortes, sie waren nur nicht das, was der Einkäufer meinte, und die Gesamtsumme wurde darauf basierend berechnet. Die Lösung besteht darin, die konkrete Absicht statt der Kategorie zu nennen:

Statt Schreibe
Salat Kopfsalat, oder Salatmischung, oder Cherry Tomaten
Käse Gouda am Stück 400g, oder Emmentaler Scheiben 200g

Nicht jedes allgemeine Wort muss verengt werden. Obst liefert eine sinnvolle Frucht nach dem Preis-Leistungs-Verhältnis zurück, was richtig ist, wenn du "irgendein Obst, was diese Woche gut ist" meintest. Du hast die Wahl delegiert und das System hat sie nach Preis getroffen. Lass ein Wort allgemein, wenn dir wirklich egal ist, was ankommt, und verenge es, wenn es dir wichtig ist.

Mengen werden nach Nutzen verglichen, nicht nach deiner Einheit. Eine Anfrage nach 10 Rollen Toilettenpapier kam mit einer 8-Rollen-Packung zurück. Das sieht nach einem Fehler aus, ist aber keiner. Rollen sind eine schlechte Einheit für Toilettenpapier, da die Blattanzahl variiert (wir rechnen das in Welche Packung ist wirklich günstiger? vor), sodass acht Rollen mit je 220 Blatt zehn kürzere Rollen sowohl bei Menge als auch Preis schlagen können. Ein 1kg-Becher Joghurt gewinnt genauso gegen sechs 150g-Becher. Das zu korrigieren würde dich Geld kosten.

Deutsche Substantive sind die zuverlässigste Eingabe, weil die Suche gegen deutsche Einzelhandelsdaten läuft. Englisch funktioniert, und auf unserer Seite findet einiges an Normalisierung von Sprache und Einheiten statt, damit das so ist, aber nicht in jedem Fall. Einer, der durchgerutscht ist: ein Menüplanungs-Lauf fragte nach 1 bag mixed salad, fand kein Katalog-Match und fiel auf einen synthetisch angenommenen Preis mit is_synthetic: true zurück. Der Lauf mit 1 bag Salatmischung matchte ein reales Produkt für 1,98 €. Eine synthetische Zeile ist das stärkste Signal, dass deine Formulierung Überarbeitung braucht. Sprich mit deinem Agenten in welcher Sprache du möchtest, und lass ihn die Artikelliste auf Deutsch schreiben, wo er kann.

Präzision wird belohnt, wenn dir das Produkt wirklich wichtig ist. Swirl Müllbeutel 35L matchte exakt: Swirl Reißfest und Dicht Tragegriff 35l, 15 Stück. Marke plus Volumen plus Absicht lässt nichts mehr aufzulösen. Und schlechte Auflösungen werden mit der Zeit korrigiert, also lohnt sich ein erneuter Lauf, wenn ein Ergebnis falsch aussieht, bevor du annimmst, dass das Produkt nicht existiert.

Die Antwort lesen

Drei unabhängige Fragen kommen zurück, und sie zu vermischen ist der häufigste Denkfehler: ob die Fahrt lohnenswert ist, ob es ein gutes Angebot ist und wie gut der Treffer passt.

Das Urteil ist kein einfaches Ja/Nein. Die Engine gibt einen von vier Headline-Zuständen zurück, und jeder verweist auf eine andere Lösung:

Headline Bedeutung Was zu tun ist
worth_it Fahrt- und Zeitaufwand sind beide in Ordnung. Losfahren.
not_worth_travel Die Fahrt steht in keinem Verhältnis zum Korb. Näheren Laden vorschlagen, leichteres Transportmittel, oder nur mitnehmen, wenn ohnehin unterwegs.
not_worth_time Der Laden ist nah, aber der Korb zu klein für einen vollen Stopp. Die Fahrt ist nicht das Problem. In einen größeren Einkauf integrieren oder Artikel hinzufügen.
not_worth_both Beide Achsen sind schlecht. Auslassen oder in eine größere Fahrt bündeln.

Die zwei anderen Fragen stehen daneben: ob es ein gutes Angebot ist (die Ersparnis, unabhängig vom Fahrt-Urteil) und wie gut der Treffer passt. Letzteres ist der Confidence- oder Relevanz-Score: das Vertrauen der Engine, dass sie das richtige Produkt für deine Absicht gefunden hat, keine Aussage über den Preis. Sie trifft deine Absicht so genau sie kann, aber sie fällt auch eine Entscheidung: wenn ein lockererer Treffer deutlich günstiger ist, nimmt sie ihn. Ein hoher Wert heißt also, der Treffer passt zu deiner Anfrage; ein niedrigerer Wert heißt meist, sie hat einen günstigeren Ersatz akzeptiert, der weniger genau passt. Das ist ein Handel zum Prüfen, kein Fehler zum Rückgängigmachen. Öffne die Alternativen des Artikels, wo der Exakt-Treffer mit seinem Preis steht, und entscheide, ob der engere Treffer die Differenz wert ist. Nur wenn der Treffer wirklich falsch für dich ist, ist es ein Formulierungsproblem: ein mehrdeutiges Wort wie Salat bekommt einen sicheren Treffer auf Cherrytomaten, und die Lösung ist ein präziseres Wort, dann ein Neustart.

Zwei Dinge auf Entscheidungsebene. Die Hauptsumme lässt die Zeit im Laden weg, also lass den Agenten sie beim Vergleich von Mehrstopp-Optionen wieder addieren, bevor er sie rankt. Und die Abdeckung ist asymmetrisch: Sonderangebote in allen großen deutschen Supermärkten und Drogerien, aber Live-Regalpreise nur für Aldi, REWE, dm, Rossmann und Müller. Das prägt das Routing stärker als jeder einzelne Preis, denn ein Laden, bei dem wir nur die Aktionen sehen, hat alles andere geschätzt, und ein Haufen Schätzungen gewinnt selten einen Gesamtkorb-Vergleich, selbst wenn er den einzeln günstigsten Artikel deiner Liste hält. Das Tool wählt ein Ziel für deine gesamte Liste, keinen Gewinner pro Artikel.

Sobald du gelernt hast, wie deine Listen sich auflösen, komm zurück und aktualisiere den Korb-Abschnitt des Skills mit der Formulierung, die funktioniert hat.


Erweiterte Anwendungen

Das Skill oben trägt die Abläufe. Dieser Abschnitt zeigt, wie sie auf einer echten Woche aussehen, inklusive der Teile, die schiefgingen, damit du sie wiedererkennst, wenn sie dir passieren.

Preissignal-Planung, ein durchgerechneter Lauf

Die meiste Menüplanung läuft rückwärts: entscheiden, was gekocht wird, und dann herausfinden, ob die Zutaten bezahlbar sind. Der Preissignal-Ablauf des Skills dreht das um, und hier ist eine echte Woche bei Trier. Weil die Sondierung mit ausgeschalteter Fahrt-Reibung läuft, zeigen die zwei breiten Abfragen den echten günstigsten Preis pro Artikel statt eines, der zu einem näheren Laden hin verschoben wurde. Das Signal kam klar zurück: Schweinehackfleisch und Schweinehüftsteaks deutlich unter ihren lokalen Durchschnitten, Lachs 25% reduziert bei Netto, Tofu das günstigste Protein auf dem Brett mit 0,95 €, und Reis, Nudeln, Kartoffeln und Zwiebeln alle reduziert. Vom Lachs abgesehen waren die günstigen Proteine Schwein und Tofu, also stützte sich die Woche darauf.

Dann der Teil, den der erste Entwurf immer falsch macht: die Mengen. Ein Menü ist keine flache Einkaufsliste. Zutaten wiederholen sich über die Abendessen, sodass eine Packung pro Name systematisch zu wenig einkauft. Brokkoli, Kartoffeln und Nudeln tauchten je in zwei Abendessen auf und Paprika in dreien; eine naive Liste bestellte eins von jedem und wäre um die Hälfte zu kurz gekommen. Lachs war die schärfere Variante desselben Fehlers: auf "Lachs x4 (2 Packungen)" jagte der Matcher ein Gramm-Ziel und kaufte neun Packungen, 900g für 13,41 € gegen einen Bedarf von 450g. Die Lösung ist, jede Zutat über alle Abendessen zusammenzuzählen und das summierte Gewicht zu übergeben, und Fisch nach Gewicht anzugeben ("450g Lachsfilet") statt nach Packung. Sag auch "frischer Brokkoli", sonst nimmt die Engine stillschweigend eine günstigere Tiefkühlpackung. Zahlen haben die Kehrseite: "8 Tortilla Wraps" kann die 8 an die Packungszahl binden und acht Packungen kaufen, vierzig und mehr Wraps. Gib bei in Packungen verkauften Artikeln Gramm oder ein explizites "1 Packung" an, und wenn eine Zeile trotzdem zu groß zurückkommt, führe diese eine Zeile erneut in Gramm aus, damit die Liste, mit der du wirklich einkaufst, korrigiert ist und nicht nur markiert.

Validiert kam die abgeglichene Liste auf drei Stopps, 40,67 € insgesamt. Um die Ersparnis zu bekommen, die wirklich zählt, erzwang der Agent denselben Korb auf einen einzigen Laden und zog die Summen voneinander ab: 53,18 € in einem Laden gegen 40,67 € über drei, also war die Fahrt in dieser Woche 12,51 € wert. Dieser Einzel-Laden-Preis ist, wofür max_stores=1 als Messwerkzeug gut ist, und der einzige ehrliche Grund, diesen Parameter anzufassen.

Einen Plan ändern, wenn sich das Leben ändert

Die Pläne, die den Kontakt mit dem echten Leben überstehen, sind die, die du anpasst, wenn sich etwas ändert, nicht die von Grund auf gebauten. Ein Gast kommt, ein Gelüst schlägt zu, der halbe Kühlschrank ist schon gekauft. Der Assistent erledigt die Anpassung, ohne die Preisarbeit darunter wegzuwerfen.

Ein durchgespielter Fall: ein Gast mit Zöliakie ab Donnerstag. Die Anweisung war, die drei Abende zu behalten, die schon funktionierten, ab Donnerstag alles glutenfrei zu machen und zwei Abende gegen etwas zu tauschen, das sich für einen Besuch lohnt. Der Zug, der am meisten bewirkt, ist die Wahl einer Küche, die die Einschränkung erfüllt, statt gegen sie anzukämpfen. Zwei Abende auf mexikanisch umzustellen löste das Glutenproblem größtenteils von selbst, weil das Essen auf Mais und Reis statt Weizen setzt: die gefüllten Paprika vom Donnerstag wurden mexikanisch gewürzt über Reis, der Weizennudel-Thunfischsalat vom Freitag wurde ein Limetten-Thunfischsalat auf Maistortillas, und die Weizennudeln verließen die Liste ganz. Das erneute Durchrechnen der Woche brachte die übliche Textur eines echten Laufs zutage. Das Maismehl hatte kein Katalog-Match und kam synthetisch zurück, und "Mais" löste sich zu Maiskolben auf statt der Dosenkörner, die der Salat wollte. Beides sind Formulierungskorrekturen, und keine davon ist sichtbar, wenn du nur die Hauptsumme liest.

Einzelartikel, Personas, Regal-Reihenfolge

Nicht jede Frage ist ein Korb. "Ist die Butter beim Netto wirklich günstiger, wenn ich die Fahrt mitrechne?" ist eine Einzelartikel-Frage, und die Antwort ist dafür gebaut: frag nach einem Produkt und die Engine rankt jeden Laden in Reichweite nach effektiver Gesamtsumme und nennt den empfohlenen Stopp, der oft nicht das günstigste Regal ist, sobald die Fahrt berechnet ist. Greif dazu, wenn du entscheidest, ob ein Rabatt eine Extra-Fahrt wert ist.

Zwei kleinere Hebel gibt es gratis. Die Engine liefert drei Aufwand-gegen-Preis-Presets (saver, smart, fast) und löst sich zu smart auf, sofern nichts anderes gesagt wird, also setzt du selten eines von Hand; es lohnt sich, deinen Agenten resource://config/defaults für die aktuellen Zahlen lesen zu lassen, statt einer Zahl aus einem Blogpost zu vertrauen. Und jeder Artikel kommt mit einem Ladenbereich getaggt zurück, sodass ein Agent deine gedruckte Liste in Regal-Reihenfolge sortieren kann und du den Laden einmal abläufst statt zurückzugehen.


Wochen-Checks mit geplanten Tasks automatisieren

Deutsche Angebotszyklen laufen wöchentlich, beginnend montags oder donnerstags je nach Kette. Ein täglicher Check führt identische Prospektdaten erneut aus und verbrennt unnötig Tokens. Montag um 08:00 Uhr ist das richtige Zeitfenster.

Wo Automatisierung lebt

Plattform Wo Ausführung
Claude Cowork, auf der Scheduled-Seite. Nur kostenpflichtige Tarife. Remote. Läuft während dein Rechner schläft, außer der Task weist auf einen lokalen Ordner.
OpenClaw Natürliche Sprache, in jeder Sitzung. Läuft über dein Gateway.
ChatGPT Keine native Hintergrundausführung für benutzerdefinierte MCP-Connectoren. Nur manueller Auslöser.

Automatisierung ist nichts, was du in einem normalen Claude-Chat anforderst. Es ist ein Cowork-Feature mit eigener Seite, also legt eine normale Chat-Sitzung keinen wiederkehrenden Task an.

Einrichtung in Claude

Klicke in der linken Seitenleiste auf Scheduled, dann auf New task. "Create with Claude" öffnet eine Sitzung, die dich befragt und den Task vorschlägt; "Set up manually" gibt dir die Felder direkt: Name, Prompt, Approval Mode, Frequenz, Modell und optional ein Arbeitsordner.

Zwei Einstellungen entscheiden darüber, ob es unbeaufsichtigt funktioniert. Lass das Ordner-Feld leer, denn das Verweisen auf einen lokalen Ordner erzwingt eine rein lokale Ausführung, die dann nur läuft, wenn dein Rechner wach ist. Und prüfe den Approval Mode, denn ein Task, der auf Erlaubnis wartet, ist nicht gelaufen, sondern blockiert. Löse einen Lauf manuell aus, bevor du dem Zeitplan vertraust.

Einrichtung in OpenClaw

Kein JSON, kein Crontab:

Hi, kannst du jeden Montagmorgen um 8:00 Uhr einen wöchentlichen Vorrats-Check für mich machen?

Der Agent bestätigt den Zeitplan und die Zeitzone.

Einem Task ein Gedächtnis geben

Jeder geplante Lauf ist eine frische Sitzung ohne Erinnerung an letzte Woche, also meldet er sich selbst überlassen drei Montage hintereinander dasselbe Angebot. Wenn dich das stört, gib ihm eine kleine State-Datei in deinem Account: eine kurze Tabelle des niedrigsten Preises, den du je pro Artikel gesehen hast, und wann du zuletzt gekauft hast, zu Beginn des Laufs gelesen und am Ende ergänzt. Das verwandelt "mehr als 25% reduziert" in "auf oder unter dem niedrigsten, den wir erfasst haben", was die Frage ist, die du eigentlich hattest. Das vollständige Muster, mit Start-Datei und Task-Prompt, findest du im Muster für geplante Tasks weiter unten.

Das vollständige State-Datei-Muster

Löse das Gedächtnisproblem mit drei Schichten statt mit einem längeren Prompt.

Die dauerhafte Konfiguration gehört in ein Skill. Standort, Haushaltsgröße, Stundensatz, Transportregeln und die Listen selbst ändern sich nicht von Woche zu Woche, und geplante Tasks können Skills laden.

Der Lauf-Status gehört in eine Datei in deinem Claude-Account, nicht in einen Ordner auf deinem Computer. Der Task liest sie zu Beginn und ergänzt sie am Ende.

Der Task-Prompt enthält nur den Auslöser und die Berichtsregeln, kurz genug, um auf einen Bildschirm zu passen.

Der offensichtliche Nutzen des Status ist Deduplizierung. Der wertvollere ist Kalibrierung. discount_pct wird gegen den eigenen regular_price des Ladens berechnet, sodass ein 51%-Rabatt von einer Basis gemessen wird, die der Händler setzt. Nach acht Wochen erfasster Preise wird deine Schwelle von "mehr als 25% reduziert" zu "auf oder unter dem niedrigsten, den wir gesehen haben", was die Frage ist, die du eigentlich hattest. Der dritte Nutzen ist das Nachbestell-Timing: fünfzehn Müllbeutel halten etwa sechs Wochen, und ein Alert zwölf Tage nach dem Kauf ist Rauschen.

Eine Start-State-Datei. Halte sie klein, da sie bei jedem Lauf in den Kontext gelesen wird:

# Vorrats-Status

## Beobachtete Tiefstpreise
| Artikel | Niedrigster Preis | Laden | Datum | Regalpreis |
|---|---|---|---|---|
| Dr. Oetker Tradizionale Salame 385g | 1.79 | REWE | 2026-07-28 | 3.69 |
| Swirl Müllbeutel 35L, 15 Stück | 2.59 | REWE | 2026-07-28 | 2.59 |

## Einkäufe
| Datum | Artikel | Menge | Bezahlt | Nachbestellen ab |
|---|---|---|---|---|
| 2026-07-28 | Swirl Müllbeutel 35L | 15 Beutel | 2.59 | 2026-09-08 |

## Gesendete Alerts
| Datum | Artikel | Preis | Gekauft? |
|---|---|---|---|
| 2026-07-28 | Dr. Oetker Tradizionale | 1.79 | ja |

Und der Task-Prompt:

Führe meinen wöchentlichen Vorrats-Check aus.

1. Lies stock-up-state.md.
2. Führe die Vorratsliste über offerhopper.ai mit meiner Konfiguration aus.
3. Vergleiche jeden Preis mit dem niedrigsten Preis aus der State-Datei,
   nicht mit dem vom Laden gemeldeten Regalpreis.
4. Benachrichtige mich nur, wenn ein Artikel auf oder unter seinem Tiefstpreis
   liegt UND das Urteil worth_it ist UND das Nachbestelldatum erreicht ist.
   Sonst antworte "Diese Woche lohnt sich nichts."
5. Ergänze die Preise dieses Laufs in der Tabelle. Protokolliere gesendete
   Alerts. Lass die Gekauft?-Spalte für mich zum Ausfüllen.

Dein erster Montag wird gesprächig, weil eine leere State-Datei jeden Preis wie einen Tiefstpreis aussehen lässt. Es beruhigt sich, sobald das Protokoll sich füllt.


Den gesamten Setup-Flow dem Agenten übergeben

Alles Obenstehende kann von Hand gemacht werden. Es muss aber nicht. Wenn dein Assistent eine URL lesen und das Tool aufrufen kann, gib ihm diese Seite und lass ihn die Einrichtung durchführen und dich nach allem Nötigen befragen. Das erzeugt eine Konfiguration aus deinen echten Ergebnissen statt aus den Beispielen.

Verbinde zuerst den MCP-Server und füge dann dies ein:

Lies https://offerhopper.ai/blog/de/ai-grocery-shopping-assistant und richte
meine Einkaufs-Automatisierung komplett ein.

Gehe in dieser Reihenfolge vor und überspringe nichts:

1. Bestätige, dass du das offerhopper.ai Tool siehst. Falls nicht, stoppe und
   sage mir, wie ich es verbinde, bevor du irgendetwas anderes tust.

2. Befrage mich zu allem, was der Kontext-Block des Leitfadens braucht und ich
   dir noch nicht gesagt habe: PLZ oder Ort, Haushaltsgröße, Transportmittel,
   Stundensatz, Ernährungsregeln, wie oft ich einkaufe, ob Drogerieartikel im
   Scope sind, und meine zwei Listen. Frage in kleinen Blöcken. Wenn ein Wert
   von mir vom Standard des Leitfadens abweicht, sag mir, was das an der
   Empfehlung ändert. Erwähne die Extras, die du anbieten kannst: die finale
   Liste in Regal-Reihenfolge sortieren, und eine saver/smart/fast-Persona,
   falls ich die Abwägung Preis gegen Aufwand beeinflussen will, wobei smart
   eine sinnvolle Vorgabe ist.

3. Entwirf meinen Frischekorb und meine Vorratsliste auf Deutsch mit konkreten
   Produktbegriffen statt Kategorien, wie der Leitfaden beschreibt. Zeige mir
   beide Listen und lass mich sie korrigieren, bevor du etwas ausführst.

4. Führe den Frischekorb einmal aus. Berichte Urteil, Fahrtkosten-Anteil,
   Hauptsumme und Laden-Zeitaufwand als separate Zahl.

5. Auditiere diesen Lauf so, wie es der Abschnitt "Gute Ergebnisse erzielen"
   beschreibt: vergleiche für jeden Artikel selected_product mit dem
   Geforderten, und markiere Absicht-Abweichungen, synthetische Preise und
   alles über market_average. Markiere kein allgemeines Wort, das zu einem
   guten Preis aufgelöst wurde, und keine Packungsgröße, die die gezählte
   Einheit schlägt; beides ist korrekt. Schlage bessere Formulierungen vor und
   führe einen Re-Run durch. Überspringe diesen Schritt nicht, weil der
   Confidence-Score gut aussieht.

6. Schreibe meinen finalen Kontext-Block mit den bestätigten Werten. Sag mir,
   wohin damit: Custom Instructions, wenn ich nur chatte, ein Skill, wenn ich
   automatisiere.

7. Erkläre mir exakt, wie ich den wöchentlichen Vorrats-Task auf meiner
   Plattform erstelle, und gib mir den Task-Prompt sowie die Start-State-Datei
   dazu. Behaupte nicht, etwas geplant zu haben, das du von dort aus nicht
   wirklich planen kannst.

Frag mich, wenn du unsicher bist, statt zu raten. Ich beantworte lieber drei
Fragen als einen falschen Korb zu korrigieren.

Schritt 2 sollte sich wie ein kurzes Interview anfühlen, nicht wie ein Formular. Schritt 5 ist der, der übersprungen wird, und der, der sich auszahlt: ein Erstentwurf enthält fast immer einen Artikel, den der Matcher anders gelesen hat als du, also lass deinen Agenten jedes selected_product explizit auflisten, wenn er einen sauberen Lauf ohne Markierungen meldet. Und Schritt 7 ist der, bei dem Agenten sich überschätzen: ein Agent, der sagt, er habe etwas geplant, obwohl er nur einen Prompt geschrieben hat, hat dir eine Automatisierung hinterlassen, die nie auslöst.


Häufig gestellte Fragen

Wie verbinde ich offerhopper.ai mit meinem KI-Assistenten?

Server-URL https://mcp.offerhopper.ai/mcp, keine Authentifizierung, in Claude oder ChatGPT eintragen. In OpenClaw openclaw plugins install clawhub:offerhopper.ai. Vollständiger Walkthrough im MCP Entwickler-Guide.

Speichert offerhopper.ai meinen Standort oder meine Gewohnheiten?

Nein. Keine Konten, keine gespeicherten Standorte, Suchen werden gelöscht. Dein Kontext bleibt bei dir.

Kann es mit bestimmten Marken umgehen?

Ja. Swirl Müllbeutel 35L matchte exakt. Je präziser die Eingabe, desto weniger muss geraten werden.

Was ist bei Einkäufen alle paar Tage?

Teile die Körbe auf. Frischekorb manuell für 2-3 Tage, Vorrats-Check wöchentlich.

Funktioniert es außerhalb Deutschlands?

Nein. Nur deutsche Märkte mit deutscher 5-stelliger PLZ oder Ort.

Kann ich Google Gemini nutzen?

Gemini beschränkt benutzerdefiniertes MCP aktuell auf Vertex AI und Spark Accounts in ausgewählten Regionen. Für Verbraucher in Europa sind Claude, ChatGPT und OpenClaw die funktionierenden Optionen.

offerhopper.ai

About offerhopper.ai

The AI-driven shopping route planner for expats and locals in Germany.