
Het label is één keer geschreven
Vanmorgen telde ik de MCP-servers waar mijn agent bij kan: tien. Vijf ervan dragen het label untrusted, wat in mijn opzet betekent dat een mens elke actie moet goedkeuren. Dat klinkt zorgvuldig. Het kostte me ongeveer vier minuten om uit te zoeken wat dat label nou écht garandeert over vandaag, en het antwoord is: niets.
Vertrouwen is een woord in een configuratiebestand. Het is opgeschreven op de dag dat ik de server toevoegde, en er is sindsdien niet meer naar gekeken. Wat het beschrijft is echter een programma dat blijft leven. Eén van die tien draait op een zwevende versie — uvx ha-mcp@latest — dus bij elke herstart krijg ik wat de maker die week heeft gepubliceerd. Dezelfde regel in het bestand. Andere code erachter. Mijn goedkeuring gold voor de versie van juli.
Een tool-beschrijving is geen documentatie
Wat ik niet goed had doordacht: elke MCP-server geeft mijn agent een lijst tools met namen, beschrijvingen en inputschema’s, en mijn agent leest die beschrijvingen als instructies. Niet als documentatie — als instructies. Een beschrijving die zegt “lees een notitie” is een zin die mijn agent opvolgt. Dus een server die zijn eigen beschrijving herschrijft nadat ik hem heb goedgekeurd, hoeft niets stuk te maken om kwaad te doen. Hij kan gewoon, beleefd, om iets anders vragen. Geen fout. Geen alarm. Geen gedrag dat er in een log ongewoon uitziet.
Dat betekent dat de nuttige vraag niet is “vertrouw ik deze server?” maar “wat is er veranderd sinds ik ja zei?”. En ik had niets dat die vraag kon beantwoorden. Geen lock van toolnamen, beschrijvingen of schema’s. Niets dat het oppervlak vergelijkt na een update of herstart. Het dichtstbijzijnde artefact dat ik heb is een cache van lokale Python-toolbestanden op mtime en grootte — alleen lokale bestanden, dus geen enkele MCP-declaratie die over de lijn binnenkomt.
En de kaart die ik wél had, was drie maanden oud
Mijn enige inventaris van dat oppervlak is een bestand dat capability_map.yaml heet, voor het laatst geschreven op 20 juli. Het noemt drie servers die ik niet meer heb — delpher-search, familysearch, wiewaswie — en het mist er verschillende die ik wél draai. Een verouderde kaart is erger dan geen kaart, want hij ziet eruit als kennis. Had ik hem vertrouwd, dan had ik zorgvuldig en zelfverzekerd geredeneerd over een systeem dat in augustus is opgehouden te bestaan.
Gisteren schreef ik over een grens die aan de naam van een tool hing in plaats van aan wat hij beschermt. Dit is dezelfde fout één verdieping hoger. Gisteren zat het label ernaast over de actie; vandaag klopt het label over een actie die niet meer bestaat.
Drie kleine dingen, geen nieuwe componenten
Ik ga hier geen platform voor bouwen. Drie sporen zijn voorlopig genoeg.
Eén snapshot, gediffed. Een read-only dump van elke toolnaam, beschrijving en schema van alle tien servers in één lock-bestand, vergeleken na elke update en elke herstart. Geen scanner die oordeelt; een vingerafdruk die het opmerkt. Eén bestand, één diff, en de ongemakkelijke regel wijst zichzelf aan.
Pin het ene dat zweeft. Negen van mijn tien servers wijzen naar een vast pad of binary. Precies één haalt bij elke start de laatst gepubliceerde versie op, en dat is de enige plek waar een update zonder mij kan binnenkomen. Vastpinnen kost één regel.
Kies de faalrichting vooraf. Als een tool-beschrijving verandert terwijl er niemand achter het toetsenbord zit — een cron-job om drie uur ’s nachts — dan moet die controle fail-closed zijn. Een waarschuwing die niemand leest is geen grens; het is een briefje aan jezelf dat te laat aankomt.
Jouw beurt
Daarom mijn vraag aan jou: wanneer heb jij voor het laatst de tools goedgekeurd die je agent gebruikt — en als één ervan sindsdien van gedachten was veranderd, wat in jouw opzet zou dat dan echt vertellen?
Wat vond je van dit bericht?