AI / GenAI·8 min·23 september 2026·Zo gebruik ik AI — Deel 7 van 8

Zo gebruik ik AI: mijn kelder is een MCP-server geworden

Mijn smaakprofiel staat in de cloud. Dat is een bewuste keuze: het is een stukje tekst over wat ik lekker vind, en de winst van een model dat het altijd bij zich heeft is groter dan het risico. Mijn voorraadlijst ligt anders. Daarin staat wat er bij mij thuis is, hoeveel, en ongeveer wat het waard is. Die wil ik nergens plakken.

Dat is precies het probleem dat MCP oplost. Het bestand blijft staan waar het staat, en het model mag het bevragen via een klein programma dat op mijn eigen machine draait.

De klus

Een server van één bestand, zonder afhankelijkheden, die drie dingen kan: de hele lijst geven, zoeken op een term, en tellen per stijl. Alleen lezen. Geen enkele mogelijkheid om iets te wijzigen, want dan is een verkeerd begrepen zin genoeg om je administratie te verbouwen.

Mijn echte prompt

Schrijf een MCP-server in één Node-bestand, zonder npm-pakketten,
die mijn kelder-CSV ontsluit.

Drie tools, allemaal alleen-lezen: hele lijst, zoeken op tekst,
tellen per stijl. Geen tool die schrijft, verwijdert of wijzigt.

Praat JSON-RPC over stdin en stdout: initialize, tools/list, tools/call.

Lees het CSV-bestand opnieuw bij elke aanroep, niet één keer bij het starten.

Als een zoekopdracht niets oplevert, geef dan een zin terug die expliciet
zegt dat er niets in de kelder staat dat erop lijkt.

Het volledige bestand staat op sparkone.nl/tools/kelder-mcp.mjs. Aanhaken in Claude Code gaat zo:

claude mcp add kelder -- node /pad/kelder-mcp.mjs /pad/kelder.csv

Daarna kun je vragen wat er open moet, en het model kijkt eerst in je bestand voordat het iets zegt.

Ontleed

Wat ik hiervan geleerd heb gaat over MCP in het algemeen, niet over wijn.

De toolbeschrijving is de prompt. Bij de eerste tool staat “gebruik dit voordat je iets aanbeveelt”. Dat is geen documentatie voor een mens, dat is de instructie waarop het model besluit of het de tool aanroept. Een vage beschrijving levert een model op dat de tool overslaat en uit zijn hoofd antwoordt, en dat is precies wat je met een eigen server probeert te voorkomen.

Het lege antwoord is de belangrijkste regel. Zoek je op iets dat er niet is, dan krijg je: er staat niets in de kelder dat hierop lijkt. Een lege lijst teruggeven is verleidelijker om te programmeren en gevaarlijker in gebruik, want een model dat niets terugkrijgt vult dat gat op met wat het over jouw kelder denkt te weten.

Alleen-lezen is een architectuurkeuze, geen instelling. Er is geen schrijftool, dus er is geen zin denkbaar die je bestand aanpast. Dat is sterker dan elke waarschuwing in een systeeminstructie.

Opnieuw lezen bij elke aanroep. Een server die zijn bestand bij het starten inleest, geeft na een verandering rustig het oude antwoord tot je hem herstart. Bij een lijst die je met de hand bijhoudt is dat het meest waarschijnlijke scenario van allemaal.

Wat brak

Het aanhaken zelf ging in één keer goed, en dat was verdacht. Dus heb ik hem getest door met de hand JSON-RPC naar binnen te duwen in plaats van via Claude, en toen kwamen de scherpe randen boven.

De telling per stijl gaf “rood zwaar: 1” terug. Dat is dezelfde fles die het drinkvenster-script een week eerder had afgekeurd, omdat die stijl daar niet in de lijst staat. Twee stukjes gereedschap op één bestand, met verschillende strengheid. De server telt wat er staat, het script weigert wat het niet kent, en die tegenspraak stond zonder waarschuwing in twee verschillende antwoorden. Ik heb de fles hernoemd, maar de les is breder: zodra twee tools hetzelfde bestand lezen, moet je weten welke de strengste is.

Verder had ik één tool te veel bedacht. Mijn eerste versie had ook een tool die adviseerde wat er open moest, met de drinkvensterlogica erin. Dat is precies het werk dat het model beter doet als het de gegevens heeft. Een MCP-server hoort saai te zijn: hij levert feiten, het oordeel gebeurt erboven.

Kanttekening

Dit is de kant van AI die ik het meest onderbelicht vind, en de reden dat ik het bouwde. Er is een verschil tussen data die je afstaat omdat je er iets voor terugkrijgt, en data die je afstaat omdat het de makkelijkste weg was. Een voorraadlijst hoort in de tweede categorie, en met honderd regels code hoeft dat niet meer.

Wees wel eerlijk over wat er nog steeds weggaat. Als het model je vraag beantwoordt met behulp van je kelder, gaat de uitkomst van de tool naar de dienst toe. Wat lokaal blijft is het bestand, niet het gesprek. Wil je ook dat laatste dicht, dan kom je uit bij een model dat op je eigen machine draait, en dan lever je flink wat kwaliteit in.

En de derde: alleen-lezen beschermt je bestand, niet je aandacht. Een model dat je voorraad kent, is een model dat makkelijker aanbeveelt om iets open te trekken. Ik heb er de regel bij gezet dat het eerst vraagt of ik vanavond eigenlijk wel wil drinken.

Pak ‘t zelf

Je hebt hier geen kelder voor nodig. Elke lijst die je met de hand bijhoudt werkt: boeken, gereedschap, planten, uitgaven.

Schrijf een MCP-server in één Node-bestand zonder npm-pakketten die
[mijn bestand] ontsluit.

Alleen-lezen tools: [drie dingen die je wilt kunnen vragen].
Geen tool die schrijft, verwijdert of wijzigt.

JSON-RPC over stdin en stdout: initialize, tools/list, tools/call.
Lees het bestand opnieuw bij elke aanroep.

Bij geen resultaat: geef een zin terug die expliciet zegt dat er niets is
dat erop lijkt.

Kleine oefening voor vandaag: test je server niet via een chatvenster maar met de hand, door drie regels JSON naar binnen te sturen. Wat een model ervan maakt zie je pas goed als je eerst hebt gezien wat er echt uitkomt.