Inspiration
Most websites were built for people clicking around. Agents are bad at that. They guess at buttons, and that’s a terrible idea when money is involved.
WebMCP is the right fix: the page exposes real tools. But the site has to add them. Shopify can. Almost nobody else will.
I wanted something in between. Paste a URL. Keep the original site. Agents still get tools.
What it does
Paste a public URL. WebMCPify crawls it, GPT-5.6 writes tools as recipes (click this, fill that — not page JavaScript), we run them on the live site, and a small script registers them with document.modelContext.registerTool.
You get an agent-ready URL (Cloudflare proxy, no change to the original site) or a one-line script for you to update it in code. Humans keep the same UI. Agents call named tools.
How I built it
- Playwright crawls the site (this runs on Render).
- GPT-5.6 writes the tools.
- We try them on the live site. If one fails, a second model (
gpt-5.6-terra) tries to fix it. - A Cloudflare Worker serves the page and injects the script. Or you drop in a script tag.
GPT never writes code that runs in the browser. If a tool would pay, order, delete, or send something, we mark it sensitive and show a confirm dialog. Results stay small so the agent doesn’t get a wall of HTML.
What I learned
Don’t let the model write page JavaScript. Recipes are boring and that’s the point. They’re easy to check and they can’t eval anything.
OpenAI structured outputs hate nested schemas. My first recipe format used a union type per step and the API just rejected it. I flattened the schema and generate started working.
ChatGPT only sees tools on the top-level page. A bookmarklet or an iframe doesn’t count. The proxy keeps the shop UI and the tools on one origin, which is what the in-app browser needs.
Netlify doesn’t have a real filesystem. Site state lives in Redis.
The dashboard is a WebMCP page too. You can ask it to analyze a site and hand back the agent-ready URL.
Challenges
Sites you don’t own. A script tag is clean, but most sites won’t add one. The Worker proxy injects the same bridge with no deploy on their side. I shipped both.
Same origin, or it doesn’t count. Tools have to sit on the top-level document. That’s a proxy problem, not a prompt problem — rewrite HTML, patch fetch/history, keep the UI.
Don’t trust the model with money. Pay / order / delete / send is marked sensitive in code and gets an on-page confirm. The agent can still call place_order. A human has to click Confirm.
Structured outputs. Nested step types died at the API. One flat step object, unused fields null, and the pipeline runs.
What’s next
Tighter locators on messy SPAs. Confirm as a hard rule in the interpreter, not only in the recipe. More navigation than fetch / history. Then more of the public web.
The web isn’t getting rebuilt. It can still grow an agent interface.
Built With
- chatgpt
- cloudflare
- netlify
- nextjs
- render
- webmcp
Log in or sign up for Devpost to join the conversation.