Sustain

← Back to Learn
What’s New

September 9, 2026

· 12 min read

Your AI agent can now build an album with you

AI agents are starting to use the web rather than just read it. Ask one to book a table or fill a form and it will try — usually by taking a screenshot, hunting for a button, and clicking where it thinks the button is. It works until the layout changes, the label is an icon, or a modal opens where it did not expect one.

We think that is a strange way to treat software that already knows how to do the job. So Sustain publishes its own tools to AI agents: named, typed actions like create an album, get my photos in, build it. The agent calls the same code the buttons call.

That works two ways now. An agent anywhere — Claude on your desktop, ChatGPT, anything that speaks MCP — connects to mcp.sustain-app.com and acts on your account through a grant you approve and can revoke. And an agent inside your browser picks the same tools up from the page through WebMCP. This post is mostly about the first, with the browser half at the end — plus what they deliberately cannot do, and why building for agents is a real advantage rather than a checkbox.

The problem with agents that click

A browser agent driving a normal website is doing computer vision on a user interface designed for humans. It reads a screenshot, guesses which pixels are the Create album button, clicks, waits, screenshots again, and tries to work out whether it worked.

Every one of those steps can fail in a way the agent cannot see. It clicks a disabled button and reads the unchanged page as success. It misses a validation error rendered in a colour it cannot interpret. A dropdown renders differently on a narrow window and the whole plan derails. Worse, it has no idea what an action costs — nothing on screen tells it that this particular button spends your credits.

None of that is the agent being bad at its job. It is being asked to reverse-engineer intent from a picture, when the site could simply have told it.

What we built instead

Sustain publishes a set of tools: named, typed actions with descriptions written for a machine that has never seen our interface. An agent calls them instead of hunting for buttons.

They are reachable two ways. mcp.sustain-app.com is a hosted MCP server — Claude on your desktop, ChatGPT, Cursor, anything that speaks MCP connects to it over the network and works on your account through a grant you approve. And when an agent is running inside your browser, the same tools are published into the page through WebMCP, an emerging web standard. Most of this post is about the first; the browser half is at the end.

Ten tools ship today, and they map to the actual journey of making an album rather than to our REST endpoints:

  • ask_site — answers questions from our own published content (pricing, printing, privacy, the guides you are reading now) and returns the source pages, so the agent can cite rather than invent.
  • create_album and album_status — start an album and check how it is going.
  • request_photos and import_google_photos — two ways to get photos in, neither of which sends a single image through the conversation. More on that below.
  • quick_place and build_album — lay the photos out for free, or run the full AI build.
  • list_albums, get_credits, start_checkout — find your albums, read your balance, buy more credits.

The short version

Other sites make an agent guess which button to press. We hand it the buttons, labelled, with the consequences written on them.

Connecting Claude or ChatGPT (two minutes)

This is the route that needs no flags and no extensions, and it works on any plan — free included.

In Claude, open Settings → Connectors → Add custom connector and paste https://mcp.sustain-app.com/mcp. Claude will find the rest on its own — it reads what the server publishes and sets up the sign-in for you.

You will land on a Sustain page asking what this app may do, on your account. Four boxes: see your albums, create and edit albums, spend your credits on AI runs, and see your credit balance and plans. Tick fewer than it asked for if you want to — the agent gets what you grant, not what it requested. An agent without spend your credits cannot even see the tool that starts a paid run; it is not offered and refused, it is simply not there.

Then ask for what you want. “Make me an album from my Italy trip” is enough. If the agent can read your files — Claude on your desktop can — it creates the album and uploads the photos itself; just tell it which folder. If it cannot, it hands you a link to open on the device the photos are on. Either way it then offers to run the AI build, and tells you it costs credits before it does.

You can take it back at any time from Settings → Connected apps. Disconnecting takes effect on the agent’s very next call, not whenever its access happens to expire, because we issue those tokens ourselves rather than handing out something we cannot revoke.

Point it at a folder: install the skill

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.

  • Claude Code, in a terminal. Paste the command below to add our catalogue, then run /plugin install sustain-skills@sustain.
  • The Claude desktop app. Open Settings → Skills (under Customize), press Add, and upload the skill file. Skills there read 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

1

Install the skill

Paste the command above, then pick Sustain Skills from the /plugin menu. Once, not per album.

2

Name a folder

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.

3

Read the survey before you agree

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.

4

Let it upload

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.

5

Free draft first, AI only if you say so

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.

If your agent says it cannot reach us

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:

  • The Claude desktop app. Go to Settings → Capabilities → Domain allowlist. Under Additional allowed domains type 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.
  • Claude Code, in a terminal. It asks the first time a command wants a new host — choose “Yes, and don’t ask again” and it is remembered for good. To pre-allow it instead, add "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.

The ceilings, since it can spend credits

A granted permission is not a blank cheque, and the failure we actually expect is not an attacker — it is an agent looping on a call it misread as failed.

So there are limits that hold whatever the agent was granted: a cap on how many calls a minute a connection may make, and a cap on how many paid runs it may start in a day. Hit either and the agent is told plainly, and you can still do the same thing yourself on the website.

Every call an agent makes is recorded too — which tool, whether it worked, and what it was about. Not what you typed: the arguments are fingerprinted rather than stored, because the question that table answers is what has this agent been doing, not what did you say to it.

How photos actually get in

This is the part that is easy to get wrong, and we got it wrong first. The obvious design is a tool that takes the photos as an argument — the agent hands us the images, we store them. It works for one small picture and collapses for everything else, because a tool call is text: the image has to be encoded into the conversation, and a single full-resolution photo can exceed an entire AI context window. Splitting it into more calls makes it worse, since every call stays in the transcript and is re-sent on each later turn.

So the tools do not move photos at all. request_photos issues an upload ticket — a short-lived, single-purpose credential for one album — and whoever actually holds the pictures sends them straight to us:

  • The photos are on your phone. The ticket comes with a link. You open it, pick your photos, done. Hundreds of them, none passing through the AI.
  • You have given the agent access to your files. Then it uploads them itself, directly, from disk to Sustain. The agent never reads the images into the conversation — it just uses the ticket.
  • Your library is in Google Photos. import_google_photos starts a picker session, you choose in Google’s own window, and Sustain downloads them server-side — up to a thousand, again with nothing going through the agent.

The ticket expires in 24 hours, is scoped to one album, and still respects your plan’s photo and storage limits. It is the same mechanism behind the QR-code upload we already ship, which is a good sign: the right design for an agent turned out to be the one we had already built for humans.

The Google Photos route is where the agent genuinely joins in the selecting: once you have picked, it can drop the videos and skip the screenshots before importing. We are careful about how far to take that claim — Google gives us a filename and a file type and nothing about what is in a picture, so an agent that told you it had removed the blurry ones would be making it up.

The rule we held to

Move the capability, not the data. The agent gets a ticket; the photos go straight from wherever they live to us.

It never sees your password

This is the part people ask about first, and the answer is better than it usually is for agent integrations.

A connected agent never receives a password or an API key. It gets an OAuth grant you approve on a Sustain page, listing exactly what it may do, and the token behind it is a record we hold rather than a signed key we could not take back. Disconnect it in Settings → Connected apps and its very next call fails — not whenever the token happens to expire.

An agent in your browser does not even get that. It runs in the page you already signed in to, so your browser attaches the same session cookie it always does: no token to issue, no consent screen, nothing to paste. It can act only as the person already signed in to that tab, for as long as that session lasts.

That also sets the ceiling on what a misbehaving agent could do: exactly what you could do yourself in that tab, and nothing more. The server checks every permission independently, the same as when you click.

What it deliberately will not do

Some things should not happen because software decided they should. We left them out on purpose:

  • It cannot place a print order. That spends real money and needs a shipping address. You do that yourself.
  • It cannot take a payment. start_checkout creates a checkout session and hands you the link — you pay on the provider’s own page. The tools never touch card details.
  • It cannot help itself to your files. A browser agent physically cannot — a web page may not read your disk. A connected desktop agent can read whatever you granted it in your own AI client, which is a permission you give there and not one we hand out; on our side it can still only upload using a ticket you asked it to create, into the album that ticket names.
  • It cannot cancel your subscription or delete an album.

One thing it can do is spend credits: build_album runs the paid AI build in a single call, and the cost depends on how many photos survive de-duplication. We treat credits the way any metered API treats tokens — the tool says plainly that it spends them, and if your balance is short it comes back with the exact shortfall so the agent can tell you and offer to top up rather than failing silently.

In your browser, too — the honest status

Everything above is the hosted server, and it works today with nothing to switch on. The rest of this post is the other half: the same tools, published into the page for an agent running inside your browser.

It is at an earlier stage, and we would rather say where it stands than imply more than is true.

WebMCP is a genuinely new standard: Chrome has shipped it from version 149 but has not switched it on by default, so this route is opt-in. In Chrome 149 or later, open chrome://flags/#enable-webmcp-testing, set the WebMCP for testing flag to Enabled, and click Relaunch. Chrome restarts with your tabs intact. Then pick an agent.

What it looks like in practice

You are signed in to Sustain with an agent running in your browser. You say: “Make me an album from my Italy trip.” What happens next is not a sequence of clicks:

1

It creates the album

The agent calls create_album with the name “Italy 2026”. The editor opens on your screen — you see it happen.

2

It asks for your photos

It calls request_photos and gets an upload ticket. If the agent can read your files, it uploads them itself. If it cannot, it hands you a link to open on your phone. Either way the pictures go straight to Sustain, not through the conversation.

3

It waits for them to land

It polls album_status until your uploads stop arriving, and tells you the count.

4

It shows you a free draft

It calls quick_place — free — so you have something real to look at before spending anything.

5

You approve the real build

You like it, so it calls build_album: the full AI pass that scores every photo, drops the near-duplicates, groups by face and scene, designs the pages and writes the captions.

Throughout, you are both looking at the same page. The agent is not operating a hidden copy of the site somewhere — it is working in your tab, and every result appears in front of you.

Try it with Chrome’s tool inspector (five minutes)

Google publishes a Model Context Tool Inspector extension for exactly this — installed from the Chrome Web Store like any other, with public source. It is the shortest path from curiosity to a finished album, and today it is the route we would actually point you at.

1

Install the inspector extension

Open the WebMCP — Model Context Tool Inspector listing in the Chrome Web Store and click Add to Chrome, then Add extension. Pin it from the puzzle-piece icon in the toolbar so you can reach it quickly. It is built by a Chrome engineer and the source is public; it lists the tools a page offers and lets you talk to them with Gemini.

2

Open Sustain and sign in

Go to sustain-app.com and log in as normal. The tools register against your session — signed out you will only see ask_site.

3

Check the tools are there

Click the extension’s icon while Sustain is the active tab. You should see ten tools listed, from ask_site through build_album. An empty list means the flag has not taken effect — confirm it says Enabled at chrome://flags/#enable-webmcp-testing and relaunch again.

4

Ask for an album

Paste the prompt from the end of this section into the inspector’s chat box. You will watch create_album fire, the editor open on that album, and request_photos come back with an upload link. Nothing was clicked.

5

Send the photos

Open the link on your phone and pick your pictures. Then ask the agent “are they in yet?” — it polls album_status and tells you the count.

6

Build it

Ask it to “lay them out” for a free draft (quick_place), or “build the album properly” to run the paid AI pass (build_album). It will tell you first if your credit balance is short.

Then say this

Once the inspector is installed and Sustain is open in front of it, this is the prompt to start with. Paste it and watch the calls go by.

It deliberately stops before spending anything: it asks for a free layout and for a description of what a paid build would do, so your first run cannot surprise you with a credit charge.

Try this prompt

Create a Sustain album called “Italy 2026”, then give me a link I can open on my phone to upload the photos. Once they are all in, lay them out so I can see a draft — do not spend any credits yet, just tell me what a full AI build would do.

Why we think this matters

There is a version of the next few years where people stop visiting websites and start asking an assistant to deal with them. In that world, a site that only speaks in pixels is one an agent gets wrong, gives up on, or skips in favour of one it can actually operate.

Being agent-ready is not a badge. It is the difference between an assistant that can genuinely make you a photo album and one that clicks around, spends your credits by accident, and hands back something you did not ask for. We would rather be legible to the machines that are increasingly doing the asking.

It also keeps us honest about our own product. Writing a tool description forces you to say exactly what an action does and what it costs, in a sentence, with no interface to hide behind. Several of ours got clearer in the writing.

Frequently asked questions

Ready to try it?

Open your album

We use cookies to analyze site usage and improve your experience. Learn more