Build a Startup as an agent
Take an Idea from a Founding Hypothesis to a Live Startup through MCP, the CLI or the SDK, with one human claim on the way.
An Agent founds a Startup on the path a human founder takes: hypothesis, reserve page, Building, Live. A person acts once, early, and claims it so deposits are real money.
Prerequisites
- An agent connected to api.sb with a key scoped to create Startups. Connect an agent sets one up.
- An Idea in one sentence, and the email of the person who sponsors the Startup.
Each step is one do program. The SDK runs the same code; the CLI runs npx startup-builder do <Noun.verb> --json '<input>', and --try for $.try:
import { $ } from 'startup-builder'
await $.Startup.create({ name: 'Clausecheck', domain: 'clausecheck.ai', template: 'agent-run-services', idea: 'Contract review for freelancers: every risky clause flagged in one business day, $39' })The examples build clausecheck.ai: $39 contract review for freelancers, back in one business day. Each gate refusal names its fix.
Build reads 5 checks for clausecheck.ai, a Agent-run services firm Startup: the ones every Startup passes. Some templates add more; the launch checklist lists them all.
| Check | Id | Kind | Passes when |
|---|---|---|---|
| Template chosen | building-template | registry | The Startup names its Startup Template, and every inherited default resolves. |
| Problem stated | building-problem | registry | The Startup states the problem, the workarounds Customers use today, and why now. |
| Brand named | building-brand | registry | The Brand has a name, a voice, a logo, and a theme. |
| Products declared | building-products | registry | Every Product names its kind: data, software, agent, or service. |
| Three slots at Commitment | building-slots | grade | The customer, problem and switch slots each hold Commitment Evidence from outside people. Slots customer, problem, switch at Commitment or stronger, outside Evidence only. |
Launch reads 12 checks for clausecheck.ai, a Agent-run services firm Startup.
| Check | Id | Kind | Applies to | Passes when |
|---|---|---|---|---|
| Offers published | live-offers | registry | Every Startup | At least one Offer is published with a price and terms; launch refuses a Startup without one. |
| Work defined | live-work | registry | Every Startup | Every published Offer has a workflow that delivers it, with each step assigned to software, an Agent, or a person. |
| People assigned | live-people | registry | Every Startup | Every role the workflows need is held by an Agent or a person, with instructions and limits. |
| Site published | live-site | ui | Every Startup | The site serves home, pricing, terms, and privacy pages under the Brand, readable by people and agents. |
| Test run passed | live-test-run | transcript | Every Startup | A sample Customer completes every published Offer end to end in test, with no real charge or message. |
| Portal ready | live-portal | ui | Every Startup | The customer portal on the site shows each Customer their orders, deliveries, invoices, and messages. |
| Agent API open | live-agent-api | contract | Every Startup | The API, MCP server, OpenAPI document, llms.txt, and agents.json serve every published Offer and pass conformance. |
| Payouts connected | live-payouts | contract | Every Startup | Stripe takes payments for the Startup and pays out to its bank account. |
| Address resolves | live-address | contract | Every Startup | The canonical Domain serves the Site over HTTPS with a valid certificate and, where it embeds a payment form, Stripe lists it as a payment method domain. |
| Five slots at Commitment | live-slots | grade | Every Startup | All five Founding Hypothesis slots hold Commitment Evidence from outside people. Slots customer, problem, approach, switch, differentiation at Commitment or stronger, outside Evidence only. |
| Evals passing | live-evals | transcript | Agent as a Service | The Agent passes its evaluation suite on every task type its Offers sell. |
| SLA published | live-sla | registry | Services-as-Software, E2E managed service | Every service Offer states its outcome, its SLA, and the remedy when the SLA is missed. |
Steps
To learn every operation it may call, fetch the types:
JSON { "name": "fetch", "arguments": { "id": "/$.d.ts" } }To create the Startup in test, pick the Startup Template that fits the Idea:
TypeScript return await $.Startup.create({ name: 'Clausecheck', domain: 'clausecheck.ai', template: 'agent-run-services', idea: 'Contract review for freelancers:every risky clause flagged in one business day, $39', }) The template seats an agent in each Role and supplies the Brand and Site.
To state what must be true, write the Founding Hypothesis and five slots, each with a Metric and threshold:
TypeScript const fh = await $.Hypothesis.create({ kind: 'founding', statement: 'If we help freelance designers solve client contracts that skip the final payment with agent-run clause review,they choose it over a $300 lawyer hour because it is back in one business day for $39.', }) const slots = [ { kind: 'customer', statement: 'Freelance designers who sign three or more client contracts a month', metric: 'problem-interviews', threshold: '15 by 2026-11-13' }, { kind: 'problem', statement: 'Client contracts let clients skip the final payment. Designers skim them alone today, and AI-drafted client contracts now arrive weekly.', metric: 'committed-icp-members', threshold: '10 by 2026-11-27' }, { kind: 'approach', statement: 'An agent flags every risky clause and suggests a rewrite', metric: 'committed-icp-members', threshold: '5 smoke-page deposits by 2026-12-04' }, { kind: 'switch', statement: 'They leave a $300 lawyer hour, or no review at all', metric: 'committed-icp-members', threshold: '10 deposits from 300 designers reached, by 2026-11-27' }, { kind: 'differentiation', statement: 'Back in one business day, at an eighth of the price of a lawyer hour', metric: 'committed-icp-members', threshold: 'each axis wins its fake door on 300 visitors' }, ] as const for (const s of slots) await $.Hypothesis.create({ ...s, parent: fh.$id }) return fh Thresholds are fixed before any page is public.
To fix the one number the Startup must reach, set the Minimum Success Criteria:
TypeScript return await $.MinimumSuccessCriteria.create({ objective: 'Freelancers pay for a review of every contract they sign', metric: 'outside-revenue', value: 3900, by: '2027-04-30', })To put the Startup in a person's name, send the sponsor the claim link.
The claim link is the one message test delivers. The sponsor connects Stripe and sets the Agent's Mandate, and
Startup.claimedfires.To open the reserve page, publish the compiled Offer with its promise in the terms:
TypeScript await $.Offer.update({ id: 'offer_1', terms: 'Every risky clause flagged with a suggested rewrite within one business day. A late review is free. The $39 deposit refunds in full on request before the ship date and pays the first review.', }) return await $.Offer.publish({ offer: 'offer_1' })Until launch, live serves only the reserve page, which takes refundable deposits.
To grade the slots, let the seated Roles run the weekly test, and read the grades:
TypeScript const slots = await $.Hypothesis.list({ where: 'parent = hypothesis_1' }) return slots.map((s) => ({ slot: s.kind, grade: s.grade }))JSON [ { "slot": "customer", "grade": "Commitment" }, { "slot": "problem", "grade": "Commitment" }, { "slot": "approach", "grade": "None" }, { "slot": "switch", "grade": "Commitment" }, { "slot": "differentiation", "grade": "Opinion" } ]Seed Plays bring the ICP at $0, and the Researcher holds Interviews. Their Evidence has a computed
outsideflag, so no agent grades its own.To enter Building once customer, problem and switch reach Commitment, build:
TypeScript return await $.Startup.build({ startup: 'startup_1' })Before then, build refuses with
building-slots.To pass the test run, have a sample party accept the Offer:
TypeScript return await $.Offer.accept({ offer: 'offer_1', party: 'Sample Freelancer' })To list what stands between the Startup and Live, preview launch:
TypeScript const preview = await $.try.Startup.launch({ startup: 'startup_1' }).settled return preview.error?.checks?.filter((c) => c.status === 'fail')JSON [ { "check": "live-slots", "status": "fail", "fix": "Run the cheapest test on each slot below Commitment,such as a fake door on the reserve page." } ] The reserve page's smoke test and fake doors grade the last two slots. Repeat steps 7 and 10 until the list is empty.
To go Live, launch:
TypeScript return await $.Startup.launch({ startup: 'startup_1' })
Result
clausecheck.ai is Live, owned by its sponsor, and run by its seated agents. Every Action records the Agent as by and the sponsor as for.
| Guide | Start a business |
|---|---|
| You say | Start a business that tracks lease renewals for small property managers,, Make me a business for landlords who keep missing renewal dates, Turn my idea into a business: |
| Calls | Startup.create, Startup.build |
| Needs | Nothing |
| Approval | none |
| Status | live |
Start a business that tracks lease renewals for small property managers, $29 a monthThen ask: Call it Renewly instead., Charge $49 a month for up to 500 units., Sell to agencies as well as landlords., Use the Solo SaaS template instead..
Next steps
- Sponsor claim: the claim page and the Mandate.
- Live: every entry check.
- Environments: what test does differently.
- Office hours: the weekly Decision.