Sustain
9 september 2026
· 12 min lezen
AI-agents beginnen het web te gebruiken in plaats van het alleen te lezen. Vraag er eentje om een tafel te reserveren of een formulier in te vullen en hij zal het proberen — meestal door een screenshot te nemen, op zoek te gaan naar een knop en te klikken waar hij denkt dat die knop zit. Het werkt tot de indeling verandert, het label een icoon is, of er een pop-up opent waar hij die niet verwachtte.
Wij vinden dat een vreemde manier om software te behandelen die al weet hoe het moet. Daarom publiceert Sustain nu zijn eigen tools aan elke AI-agent die in je browser actief is: benoemde, getypeerde acties zoals maak een album aan, haal mijn foto’s binnen, bouw het. De agent roept dezelfde code aan die de knoppen aanroepen. Deze post gaat over wat hij kan doen, wat hij bewust niet kan, en waarom bouwen voor agents een echt voordeel is in plaats van een vinkje op een lijstje.
Dat werkt nu op twee manieren. Een agent waar dan ook — Claude op de desktop, ChatGPT, alles wat MCP spreekt — maakt verbinding met mcp.sustain-app.com en werkt op je account via een toestemming die jij goedkeurt en kunt intrekken. En een agent in je browser pakt dezelfde tools op uit de pagina via WebMCP. Dit artikel gaat vooral over de eerste; de browserhelft staat achteraan.
Een browseragent die een normale website bestuurt, doet in feite computervisie op een gebruikersinterface die voor mensen is ontworpen. Hij leest een screenshot, gokt welke pixels de knop Album aanmaken zijn, klikt, wacht, maakt opnieuw een screenshot en probeert te achterhalen of het gelukt is.
Elk van die stappen kan mislukken op een manier die de agent niet kan zien. Hij klikt op een uitgeschakelde knop en leest de onveranderde pagina als succes. Hij mist een validatiefout die in een kleur wordt weergegeven die hij niet kan interpreteren. Een dropdown ziet er anders uit in een smal venster en het hele plan ontspoort. Erger nog: hij heeft geen idee wat een actie kost — niets op het scherm vertelt hem dat deze specifieke knop jouw credits opgebruikt.
Niets daarvan komt doordat de agent slecht is in zijn werk. Hem wordt gevraagd om intentie te reverse-engineeren uit een plaatje, terwijl de site het hem gewoon had kunnen vertellen.
Sustain publiceert een set tools: benoemde, getypeerde acties met beschrijvingen die geschreven zijn voor een machine die onze interface nooit heeft gezien. Een agent roept ze aan in plaats van naar knoppen te zoeken.
Ze zijn op twee manieren bereikbaar. mcp.sustain-app.com is een gehoste MCP-server — Claude op de desktop, ChatGPT, Cursor, alles wat MCP spreekt maakt er via het netwerk verbinding mee en werkt op je account via een toestemming die jij goedkeurt. En draait een agent in je browser, dan worden dezelfde tools via WebMCP in de pagina gepubliceerd, een opkomende webstandaard. Het grootste deel van dit artikel gaat over de eerste; de browserhelft staat achteraan.
Vandaag zijn er tien tools beschikbaar, en die volgen het werkelijke traject van het maken van een album in plaats van onze REST-endpoints:
ask_site — beantwoordt vragen op basis van onze eigen gepubliceerde content (prijzen, printen, privacy, de gidsen die je nu leest) en geeft de bronpagina’s terug, zodat de agent kan citeren in plaats van verzinnen.create_album en album_status — start een album en controleer hoe het ervoor staat.request_photos en import_google_photos — twee manieren om foto’s binnen te halen, waarvan geen enkele ook maar één afbeelding via het gesprek stuurt. Meer daarover verderop.quick_place en build_album — leg de foto’s gratis in, of voer de volledige AI-build uit.list_albums, get_credits, start_checkout — vind je albums, lees je saldo, koop meer credits.De korte versie
Andere sites laten een agent gokken welke knop hij moet indrukken. Wij geven hem de knoppen, met label erop, met de gevolgen erbij geschreven.
Dit is de route zonder vlaggen en zonder extensies, en hij werkt op elk abonnement — ook gratis.
Open in Claude Instellingen → Connectors → Aangepaste connector toevoegen en plak https://mcp.sustain-app.com/mcp. Claude zoekt de rest zelf uit.
Je komt op een Sustain-pagina die vraagt wat deze app op jouw account mag. Vier vinkjes: je albums bekijken, albums maken en bewerken, je credits uitgeven aan AI-runs en je creditsaldo en abonnementen bekijken. Je mag minder aanvinken dan gevraagd — de agent krijgt wat jij geeft. Een agent zonder credits uitgeven ziet de tool die een betaalde run start niet eens.
Vraag daarna gewoon wat je wilt. “Maak een album van mijn reis naar Italië” is genoeg. Kan de agent je bestanden lezen — Claude op de desktop kan dat — dan maakt hij het album en uploadt hij de foto’s zelf; zeg alleen welke map. Kan hij dat niet, dan geeft hij je een link om te openen op het apparaat waar de foto’s staan. Daarna biedt hij hoe dan ook de AI-build aan, en zegt vooraf dat die credits kost.
Je kunt het altijd intrekken via Instellingen → Verbonden apps. Loskoppelen werkt bij de eerstvolgende aanroep van de agent, omdat we die tokens zelf uitgeven in plaats van iets uit te delen dat we niet kunnen intrekken.
The connector hands an agent the tools. It does not tell it how to use them well, and uploading is where that gap shows. An upload ticket takes a whole batch of files per request and allows twenty requests an hour — plenty when the agent sends sixty photos at a time, useless when it sends one at a time, which is the shape an agent tends to improvise first. It works for nineteen photos and then stalls for an hour.
So we publish the arithmetic as a skill: a short recipe your agent installs once, which knows the batch sizes, the file types we accept, and what to do when something is refused. Install it whichever way matches the Claude you use.
/plugin install sustain-skills@sustain.SKILL.md from the top of the archive, which is exactly what that download is — the plugin archive the terminal uses is a different shape and will not work here.Both need the same thing underneath: an agent that can actually reach your disk and run a command. A Claude that only runs in the cloud cannot open ~/Pictures/Italy no matter which skill it has, and for that one the upload page is the right route.
Claude Code — paste this
/plugin marketplace add https://www.sustain-app.com/claude-plugin/marketplace.json
Paste the command above, then pick Sustain Skills from the /plugin menu. Once, not per album.
That is the whole instruction: “make a Sustain album from ~/Pictures/Italy”. You do not have to select the photos, sort them, or zip anything.
Nothing is created yet. It counts what it found, adds up the megabytes, and lists what it is going to leave behind — screenshots that are not photos, a stray .gif, an empty file. Then it asks. If the folder needs more than twenty requests it says so up front instead of stopping halfway.
It creates the album, takes a ticket, and sends the files in batches straight from your disk. Duplicates you already uploaded are recognised and skipped by the server, so pointing it at a folder twice does not double the album.
It lays the photos out immediately for nothing. The full AI pass — reading every photo, then curating and designing — spends credits, so it quotes you first and waits. Neither step needs you to open the site.
Your photos never enter the conversation
The files go from your disk to us. They are not read into the chat, not encoded into a tool call, and not passed through the model — which is what makes four hundred of them a non-event rather than an impossibility.
One failure is worth naming, because it looks like our fault and it is not. An agent that runs commands on your machine usually does so inside a sandbox with its own network allowlist, and until sustain-app.com is on that list the upload is refused before it ever leaves your laptop — a 403, with blocked-by-allowlist in the response if you look closely.
The tell is an odd asymmetry: the agent creates the album perfectly well and then cannot upload a single photo. That is the two paths differing. The tool calls travel from Claude to us and are never affected; the files leave from your own machine, through the sandbox. Only the second one is blocked. An agent describing this as a permissions problem with your folder has misread its own error.
Allow the domain wherever your agent runs:
sustain-app.com and press Add, then do the same for *.sustain-app.com. The allowlist ships set to Package managers only, which is exactly why we are blocked until you add us."allowedDomains": ["sustain-app.com", "*.sustain-app.com"] under sandbox.network in ~/.claude/settings.json, then start a fresh session; the sandbox reads its policy at startup.If you edit settings rather than using the app’s screen, use your user settings, not a repository’s — a project-level .claude/settings.json is ignored for this particular setting, so a rule that works in the terminal can quietly do nothing in the app.
There is always the other route
None of this is load-bearing. request_photos returns an upload page next to the machine endpoint, and it works from any browser on any device. A blocked agent should hand you that link — and if it does not, ask it for one.
Een gegeven toestemming is geen blanco cheque, en de fout die we echt verwachten is geen aanvaller — het is een agent die blijft hangen op een aanroep die hij verkeerd las.
Daarom gelden er grenzen hoe dan ook: een maximum aan aanroepen per minuut en een maximum aan betaalde runs per dag. Bij beide krijgt de agent een duidelijke melding, en jij kunt hetzelfde nog gewoon op de website doen.
Elke aanroep wordt ook vastgelegd: welke tool, of het werkte en waarover het ging. Niet wat je typte: de argumenten worden als vingerafdruk bewaard, niet als tekst.
Dit is het onderdeel dat makkelijk fout te doen is, en wij deden het eerst ook fout. Het voor de hand liggende ontwerp is een tool die de foto’s als argument aanneemt — de agent geeft ons de afbeeldingen, wij slaan ze op. Dat werkt voor één klein plaatje en stort in voor al de rest, omdat een tool-aanroep tekst is: de afbeelding moet worden gecodeerd in het gesprek, en één foto in volledige resolutie kan een heel AI-contextvenster overschrijden. Het opsplitsen in meer aanroepen maakt het erger, omdat elke aanroep in het transcript blijft staan en bij elke volgende beurt opnieuw wordt verstuurd.
Dus verplaatsen de tools helemaal geen foto’s. request_photos geeft een uploadticket uit — een kortstondige, eenmalige inloggegeven voor één album — en wie de foto’s daadwerkelijk in bezit heeft, stuurt ze rechtstreeks naar ons:
import_google_photos start een keuzesessie, jij kiest in Googles eigen venster, en Sustain downloadt ze server-side — tot duizend stuks, en ook hier gaat niets via de agent.Het ticket verloopt na 24 uur, is beperkt tot één album, en respecteert nog steeds de foto- en opslaglimieten van je abonnement. Het is hetzelfde mechanisme achter de QR-code-upload die we al aanbieden, wat een goed teken is: het juiste ontwerp voor een agent bleek hetzelfde te zijn als wat we al voor mensen hadden gebouwd.
De Google Photos-route is waar de agent echt meehelpt met selecteren: zodra je hebt gekozen, kan hij de video’s laten vallen en de screenshots overslaan vóór het importeren. We zijn voorzichtig met hoe ver we die claim doortrekken — Google geeft ons een bestandsnaam en een bestandstype en niets over wat er op een foto staat, dus een agent die je zou vertellen dat hij de wazige eruit heeft gehaald, zou dat verzinnen.
De regel waar we ons aan hielden
Verplaats de mogelijkheid, niet de data. De agent krijgt een ticket; de foto’s gaan rechtstreeks van waar ze zich bevinden naar ons.
Dit is het onderdeel waar mensen als eerste naar vragen, en het antwoord is beter dan het gewoonlijk is bij agent-integraties.
Een verbonden agent krijgt nooit een wachtwoord of API-sleutel. Hij krijgt een OAuth-toestemming die jij op een Sustain-pagina goedkeurt, met precies wat hij mag, en het token daarachter is een registratie van ons en geen ondertekende sleutel die we niet konden terughalen. Koppel hem los bij Instellingen → Verbonden apps en zijn eerstvolgende aanroep mislukt — niet pas als het token verloopt.
Een agent in je browser krijgt zelfs dat niet. Hij draait in de pagina waar je al bent ingelogd, dus je browser stuurt dezelfde sessiecookie mee als altijd: niets uit te geven, geen toestemmingsscherm, niets te plakken. Hij kan alleen handelen als de persoon die in dat tabblad is ingelogd, zolang die sessie duurt.
Dat bepaalt ook het plafond van wat een agent die zich misdraagt zou kunnen doen: precies wat jij zelf in dat tabblad zou kunnen doen, en niets meer. De server controleert elke rechtenmachtiging apart, net zoals wanneer jij klikt.
Sommige dingen zouden niet moeten gebeuren omdat software besliste dat ze zouden moeten. Die hebben we er bewust uitgelaten:
start_checkout maakt een checkoutsessie aan en geeft je de link — je betaalt op de eigen pagina van de betalingsprovider. De tools komen nooit in aanraking met kaartgegevens.Eén ding dat het wel kan doen is credits uitgeven: build_album voert de betaalde AI-build in één aanroep uit, en de kosten hangen af van hoeveel foto’s de deduplicatie overleven. We behandelen credits zoals elke gemeten API tokens behandelt — de tool zegt gewoon dat hij ze uitgeeft, en als je saldo te laag is, komt hij terug met het exacte tekort zodat de agent het je kan vertellen en kan aanbieden om aan te vullen in plaats van stilletjes te falen.
Alles hierboven is de gehoste server, en die werkt vandaag zonder dat je iets hoeft aan te zetten. De rest van dit artikel is de andere helft: dezelfde tools, gepubliceerd in de pagina voor een agent die in je browser draait.
Die is in een vroeger stadium, en we zeggen liever waar hij staat dan meer te suggereren dan waar is.
WebMCP is een echt nieuwe standaard: Chrome levert het vanaf versie 149 maar heeft het niet standaard aangezet, dus deze route is opt-in.
Je bent ingelogd bij Sustain met een agent die in je browser draait. Je zegt: “Maak een album van mijn Italië-reis.” Wat er daarna gebeurt, is geen reeks kliks:
De agent roept create_album aan met de naam “Italië 2026”. De editor opent op je scherm — je ziet het gebeuren.
Hij roept request_photos aan en krijgt een uploadticket. Als de agent je bestanden kan lezen, uploadt hij ze zelf. Zo niet, dan geeft hij je een link om op je telefoon te openen. Hoe dan ook gaan de foto’s rechtstreeks naar Sustain, niet via het gesprek.
Hij polt album_status tot je uploads stoppen met binnenkomen, en vertelt je het aantal.
Hij roept quick_place aan — gratis — zodat je iets echts hebt om naar te kijken voordat er iets wordt uitgegeven.
Je vindt het mooi, dus hij roept build_album aan: de volledige AI-doorgang die elke foto beoordeelt, bijna-duplicaten verwijdert, groepeert op gezicht en scène, de pagina’s ontwerpt en de bijschriften schrijft.
Ondertussen kijken jullie allebei naar dezelfde pagina. De agent bestuurt ergens geen verborgen kopie van de site — hij werkt in jouw tabblad, en elk resultaat verschijnt voor je ogen.
Google publiceert een Model Context Tool Inspector-extensie precies hiervoor — geïnstalleerd vanuit de Chrome Web Store zoals elke andere, met openbare broncode. Het is het kortste pad van nieuwsgierigheid naar een afgewerkt album, en vandaag is het de route waar we je daadwerkelijk naartoe zouden sturen.
Open de vermelding WebMCP — Model Context Tool Inspector in de Chrome Web Store en klik op Add to Chrome, daarna Add extension. Zet hem vast met het puzzelstukje-icoon in de werkbalk zodat je hem snel kunt bereiken. Hij is gebouwd door een Chrome-engineer en de broncode is openbaar; hij toont welke tools een pagina aanbiedt en laat je ermee praten via Gemini.
Ga naar sustain-app.com en log in zoals gewoonlijk. De tools registreren zich tegen je sessie — uitgelogd zie je alleen ask_site.
Klik op het icoon van de extensie terwijl Sustain het actieve tabblad is. Je zou tien tools moeten zien, van ask_site tot build_album. Een lege lijst betekent dat de vlag geen effect heeft gehad — bevestig dat er Enabled staat bij chrome://flags/#enable-webmcp-testing en herstart opnieuw.
Plak de prompt aan het einde van dit gedeelte in het chatvak van de inspector. Je ziet create_album afgaan, de editor openen op dat album, en request_photos terugkomen met een uploadlink. Er is niets aangeklikt.
Open de link op je telefoon en kies je foto’s. Vraag de agent dan “zijn ze al binnen?” — hij polt album_status en vertelt je het aantal.
Vraag hem om ze “in te delen” voor een gratis concept (quick_place), of “het album goed te bouwen” om de betaalde AI-doorgang uit te voeren (build_album). Hij vertelt je eerst als je creditsaldo te laag is.
Zodra de inspector is geïnstalleerd en Sustain ervoor open staat, is dit de prompt om mee te beginnen. Plak hem en kijk hoe de aanroepen voorbijkomen.
Hij stopt bewust voordat er iets wordt uitgegeven: hij vraagt om een gratis indeling en om een beschrijving van wat een betaalde build zou doen, zodat je eerste run je niet kan verrassen met een creditafschrijving.
Probeer deze prompt
Maak een Sustain-album aan met de naam “Italië 2026”, en geef me dan een link die ik op mijn telefoon kan openen om de foto’s te uploaden. Zodra ze allemaal binnen zijn, leg ze in zodat ik een concept kan zien — geef nog geen credits uit, vertel me alleen wat een volledige AI-build zou doen.
Er is een versie van de komende paar jaar waarin mensen stoppen met websites bezoeken en in plaats daarvan een assistent vragen om ermee om te gaan. In die wereld is een site die alleen in pixels spreekt, eentje die een agent verkeerd begrijpt, waar hij het bij opgeeft, of die hij overslaat ten gunste van eentje die hij wél kan bedienen.
Agent-ready zijn is geen badge. Het is het verschil tussen een assistent die je écht een fotoalbum kan maken en eentje die maar wat aanklikt, per ongeluk je credits uitgeeft, en iets teruggeeft waar je niet om vroeg. Wij zijn liever leesbaar voor de machines die in toenemende mate het vragen doen.
Het houdt ons ook eerlijk over ons eigen product. Een tool-beschrijving schrijven dwingt je om in één zin precies te zeggen wat een actie doet en wat hij kost, zonder interface om je achter te verschuilen. Verschillende van de onze werden duidelijker tijdens het schrijven.
Klaar om het te proberen?
Open je albumAls je onze chat vraagt om “de foto’s van Omri lachend op het strand”, wordt er stilletjes een tweede AI-agent wakker, die in zijn eigen werkruimte het graafwerk doet en alleen het antwoord teruggeeft. Waarom dat ontwerp uitmaakt.
De snelste manier om je album te veranderen is het te vragen. Zo formuleer je verzoeken zodat de AI Album Designer ze meteen goed doet.
Stop met jagen door honderden miniaturen. Beschrijf de foto die je zoekt — de assistent vindt hem en laat hem zien, klaar om in je album te zetten.