Skip to content

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:

TypeScript
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.

CheckIdKindPasses when
Template chosenbuilding-templateregistryThe Startup names its Startup Template, and every inherited default resolves.
Problem statedbuilding-problemregistryThe Startup states the problem, the workarounds Customers use today, and why now.
Brand namedbuilding-brandregistryThe Brand has a name, a voice, a logo, and a theme.
Products declaredbuilding-productsregistryEvery Product names its kind: data, software, agent, or service.
Three slots at Commitmentbuilding-slotsgradeThe 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.

CheckIdKindApplies toPasses when
Offers publishedlive-offersregistryEvery StartupAt least one Offer is published with a price and terms; launch refuses a Startup without one.
Work definedlive-workregistryEvery StartupEvery published Offer has a workflow that delivers it, with each step assigned to software, an Agent, or a person.
People assignedlive-peopleregistryEvery StartupEvery role the workflows need is held by an Agent or a person, with instructions and limits.
Site publishedlive-siteuiEvery StartupThe site serves home, pricing, terms, and privacy pages under the Brand, readable by people and agents.
Test run passedlive-test-runtranscriptEvery StartupA sample Customer completes every published Offer end to end in test, with no real charge or message.
Portal readylive-portaluiEvery StartupThe customer portal on the site shows each Customer their orders, deliveries, invoices, and messages.
Agent API openlive-agent-apicontractEvery StartupThe API, MCP server, OpenAPI document, llms.txt, and agents.json serve every published Offer and pass conformance.
Payouts connectedlive-payoutscontractEvery StartupStripe takes payments for the Startup and pays out to its bank account.
Address resolveslive-addresscontractEvery StartupThe 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 Commitmentlive-slotsgradeEvery StartupAll five Founding Hypothesis slots hold Commitment Evidence from outside people. Slots customer, problem, approach, switch, differentiation at Commitment or stronger, outside Evidence only.
Evals passinglive-evalstranscriptAgent as a ServiceThe Agent passes its evaluation suite on every task type its Offers sell.
SLA publishedlive-slaregistryServices-as-Software, E2E managed serviceEvery service Offer states its outcome, its SLA, and the remedy when the SLA is missed.

Steps

Terminal11 steps
  1. To learn every operation it may call, fetch the types:

    JSON
    { "name": "fetch", "arguments": { "id": "/$.d.ts" } }
  2. 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.

  3. 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.

  4. 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',
    })
  5. 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.claimed fires.

  6. 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.

  7. 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 outside flag, so no agent grades its own.

  8. 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.

  9. To pass the test run, have a sample party accept the Offer:

    TypeScript
    return await $.Offer.accept({ offer: 'offer_1', party: 'Sample Freelancer' })
  10. 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.

  11. 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.

GuideStart a business
You sayStart a business that tracks lease renewals for small property managers, $29 a month, Make me a business for landlords who keep missing renewal dates, Turn my idea into a business: renewal reminders for managers with up to 200 units
CallsStartup.create, Startup.build
NeedsNothing
Approvalnone
Statuslive
Text
Start a business that tracks lease renewals for small property managers, $29 a month

Then 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