AGO Apps is enabled per workspace. Contact AGO to turn it on. For now, only staff members of the workspace can open an app in their browser.
What you can build
- An internal web page. It is served at
https://<app>.<workspace>.agoapps.com. Only members of your workspace can open it, after signing in with their AGO account. - An API for your agents. An HTTP Request Tool or an API Data Source that calls the app is authenticated automatically, and the app knows which user the agent is acting for.
fetch function that receives a request and returns a response. It has no database and no secrets. Each request may use up to 30 seconds of CPU and call 1,000 other URLs. That covers calculators, formatters, lookups over external APIs, forms, dashboards that combine several APIs, document generation, and glue between your agents and the services they need.
Create an app
From Claude or any MCP client
- Connect your MCP client to AGO and grant the Apps Write scope.
- Ask, for example: “Create an AGO app called
price-checkthat returns the price including VAT for an amount and a country.”
From Claude Code, Codex or git
Get the remote and a token withget_app_git_credentials, then work like with any repository:
What a new app contains
Keep
AGENTS.md in the repository: it is what makes the coding agent write code that runs here.
What happens when you commit
Every commit onmain goes through these steps, usually in under a minute:
- The commit is checked out in an isolated build container. It has no AGO or Cloudflare credentials.
- If
package.jsonexists, the dependencies are installed, without running install scripts (postinstalland others). With a committedpackage-lock.json, the exact versions it lists are installed; without one, the newest versions thatpackage.jsonallows. src/index.ts, orsrc/index.js, is bundled with esbuild into a single file, with every npm dependency included.- If
package.jsonhas atestscript,npm testruns. - The bundle goes live, but only if its commit is still the latest one on
main. It gets the next version number: 1, 2, 3…
main; other branches are stored but not deployed.
Check which version is live
Every deployed app answersGET /_ago/version, before your own code runs:
get_app returns the same information as live, and Admin › Developer › Apps marks the deployment the app is serving. A change is live once the commit served equals the commit you made. Right after a deployment, some requests can still reach the previous version for a few seconds.
How a request reaches your app
Every request first goes through AGO’s gateway, which:- Checks who is calling. A browser needs an AGO session for this app; an agent call needs a token signed by AGO for this app.
- Removes the
Authorizationheader, AGO’s session cookie and anyX-Ago-*header sent by the client. - Adds the headers below, then passes the request to your code.
Because AGO already authenticated the request, your app must not ask for a password, check a token, or store credentials. Trust these headers: a client cannot forge them.
The first time someone opens the app, the browser goes to your AGO workspace and comes back signed in, without a consent screen. The session lasts one hour. After that, opening a page signs the user in again, usually without them noticing, while a
fetch from the page receives 401 with {"error": "login_required"}: reload the page when that happens.
Code reference
The contract
fetch method that returns a Response. Route on new URL(request.url).pathname and request.method.
What is available
- Web-standard APIs:
fetch,Request,Response,Headers,URL,URLSearchParams,crypto.subtle,crypto.randomUUID,TextEncoder,TextDecoder,atob,btoa. - npm packages that only use those APIs, for example
zodordate-fns.
What is not available
- Node.js built-ins:
fs,path,Buffer,process,child_process,net. Packages that need them fail at build or at run time. - A filesystem, a database or any storage. Global variables may survive between requests but can be reset at any time: never use them to keep data.
- Environment variables and secrets: there are none. An API key in the code would be readable by anyone who can read the repository; keep secrets in AGO instead and let your agent tool pass the data the app needs.
Limits
Browser rules
POST,PUT,DELETEand WebSocket requests must come from the app’s own pages. A request sent from another site, including another app, gets403with{"error": "cross_origin_request"}.- Cookies set by the app must be host-only. A
Set-Cookieheader with aDomainattribute is removed.
Examples
A JSON API with validation
GET /vat?amount=100&country=FR returns {"amount":100,"rate":0.2,"total":120}.
A page that posts to its own API
fetch comes from the app’s own page, so the gateway accepts the POST. The app has no storage: to keep notes, send them to a service that stores them, as in the next example.
Calling an external API
fetch counts toward the 1,000 calls per request. Only call APIs that need no secret.
Using an npm package
List the package inpackage.json; the build installs it.
zod into the app.
To run tests at build time, add a test script and its dev dependencies to package.json.
Calling your app from an agent
- Open Admin › Developer › Apps and copy the app’s API endpoint, for example
https://api.agoapps.com/acme/price-check. - Create an HTTP Request Tool whose URL is that endpoint followed by a path, such as
https://api.agoapps.com/acme/price-check/vat, or use it in an API Data Source. - Leave the authentication empty. AGO signs each call with a token valid 60 seconds for this app only, and adds
X-Ago-User-Emailwhen the agent acts for a user.
Monitor and troubleshoot
Admin › Developer › Apps lists every app with its web URL, its API endpoint and its last deployment. Open an app to see its deployment history, build errors and logs, and its source code. The same information is available to Claude throughget_app.
Security model
- Each app runs isolated from every other app, and the build container never holds credentials.
- The workspace an app belongs to comes from AGO’s authentication, never from the request or the code.
- Users sign in through AGO; agent calls carry a token signed by AGO and valid 60 seconds for a single app. The app’s code never sees either.
- AGO can turn AGO Apps off for a workspace at any time; the apps then stop answering.
