NEWSupero Studio — generate, control, and deploy production apps.Start free →HIRINGSee the roles →

A field-service platform built from your AI editor over MCP

Point Claude Code, Cursor or Copilot at Supero and let it author, validate, gate and deploy the whole stack — inside your roles, against the live platform.

MCPBuild estimate 1 day11 min readAugust 25, 2026

An agent builds the whole work-order stack from your editor over MCP — and is not allowed to tell you it worked. It validates against the live platform, deploys to a throwaway URL, and must prove the running app loads before it takes a public address.

The brief

What we are building

A regional HVAC company dispatches thirty technicians. Office staff raise work orders, assign them to a technician and a time window, and track them to completion. Technicians work from a phone: today's jobs, directions, parts used, before-and-after photos, and a customer signature at the end. Supervisors approve anything over a cost threshold. Customers get an SMS when the technician is on the way.

We built it without opening the dashboard. That part is not the interesting one. The interesting one is that the agent doing the building was not allowed to tell us it worked: it validated the bundle against the live platform rather than against its own assumptions, deployed to a throwaway URL, and had to prove the running app loaded and read data before it could take a public address.

3
attempts a session may take before it converges
3
quality gates before anything goes public
~1 day
typical build, agent-driven
Setup

Connecting the editor — and what your key can do

Supero exposes an MCP server speaking JSON-RPC 2.0 over a single Streamable HTTP endpoint. Every initialize, tools/list and tools/call is a POST to the same path; there is no per-tool route and no domain segment in the URL, because scope comes entirely from the credential.

bash
# Claude Code — no config file to edit
claude mcp add --transport http supero \
  https://api.supero.dev/mcp/v1/messages \
  --header "X-API-Key: ak_..."

# then check /mcp inside Claude Code — "supero" should be listed as connected

Cursor takes the same URL and header in ~/.cursor/mcp.json; VS Code Copilot takes it in .vscode/mcp.json with "type": "http", then Agent mode. Any MCP client that speaks Streamable HTTP and JSON-RPC 2.0 works — those three simply have first-class instructions.

CredentialResolves toCan build into
Domain-admin keydomain_adminAny project in the domain — and can create new ones
Project-admin keyproject_adminThat one project only
Tenant-scoped keytenant_userRefused — cannot run build tools
Plain JWT sessionjwtRead-only calls; refused for publish, deploy, teardown

A project-admin key that targets a different project's project_uuid is refused with an explicit error rather than a bare permission failure — which is what you want when an agent is choosing arguments on your behalf. Replacing a project's entire app additionally requires a domain-admin key.

The mechanism

A build session, tool by tool

From "build me a work-order app" to a public URL
Youplain languageYour agentClaude CodeSupero MCP/mcp/v1/messagesPlatformschemas · servicesDeployed appsupero.liveORIENT1"a work-order app for HVAC technicians…"2build_whoami3role, domain, what you may do4build_get_skills · build_get_examples · build_planthe agent reads the real build spec instead of guessing the platform's shapeCHOOSE THE GROUND5build_create_project → schema_namespace6build_get_service_contract("booking", "approval")7real state machine, operations, default UI schemasAUTHOR, THEN CHECK8write schemas.py · config.py · setup.py · ui_schemas.py9build_validate {files}10AST-only findings — your code is never executed11build_doctor — preflight for silent deploy-killersSHIP IT, CAREFULLY12build_publish → version_uuid + download_url13build_deploy {target: cloud_ephemeral}14short-lived managed preview15build_smoke_test — does the URL load and read data?16build_e2e_test → _status (where enabled)17behavioural results against the deployed app18build_go_live → permanent public_urlbuild_teardown removes a deployment when you are done with it
Note the shape: author locally, validate remotely, gate before publishing, gate again after deploying. The agent is not trusted because it is clever — it is trusted because the claims that matter most are checked against the live platform rather than taken on its word.

The tool surface is bigger than one session needs. Grouped by what stage it belongs to:

GroupToolsFor
Docs & planningbuild_get_skills, build_get_examples, build_plan, build_get_service_contractThe build spec, a complete reference app, a checklist for an idea, and a service's real state machine
Projectbuild_whoami, build_list_projects, build_get_project, build_create_project, build_update_project, build_set_project_mode, build_replace_projectResolve scope, find or create the target, read its schema_namespace
Build lifecyclebuild_validate, build_publish, build_stage_bundle, build_get_bundle, build_deploy, build_deploy_status, build_logs, build_go_live, build_teardownValidate, version, deploy, watch, retire
Capabilitiesbuild_list_capabilities, build_recommend_integrations, build_configure_servicesThe live services catalog, tiered integration recommendations, sandbox keys
Quality gatesbuild_doctor, build_smoke_test, build_e2e_test, build_e2e_test_statusPreflight, does-it-actually-load, and (where enabled) the behavioural suite
Data sourcesbuild_list_data_sources, build_connect_data_source, build_discover_source, build_bind_data_source, build_run_data_source, build_list_bound_schemasConnect the customer's own database, API or warehouse
What gets authored

The app is a directory bundle with a fixed shape

The agent is not inventing a project layout. A Supero app has exact paths the CLI expects — it does not scan for scripts or infer structure. Knowing which files are yours and which are regenerated is the difference between a productive session and an afternoon of edits that silently vanish.

FileYours?Purpose
schemas.pyYesData model — exports ALL_SCHEMAS and PUBLIC_SCHEMAS
config.pyYesOne AppConfig dataclass: identity, tenants, users, services
setup.pyYesAppSetup(...).run() — registers, seeds, wires policies and workflows
ui_schemas.py or ui/app.jsYes — pick oneDeclarative UI grammar, or a hand-written front end. Never both.
__main__.py, requirements.txt, run.sh, .env.exampleYesEntry point, the supero dependency, launcher, config template
ui/index.html, ui/config.js, ui/server.py, ui/*.js runtimeNo — regenerated every runThe layered SDK UI runtime
Dockerfile, docker-compose.ymlNo — written once if missingA committed custom version is left alone
  • Bundle limits: 300 files, 2 MB per file, roughly 8 MB inline. Past that — or when your model's output cap truncates a large file — use build_stage_bundle for an out-of-band upload and pass the returned file_id as files_ref.
  • Put the same namespace literal on every schema dict; it must be a plain string, not a variable or an f-string.
  • In config.py, "workflows" must be the last entry in services if the list is non-empty.
  • Read appNamespace and publicSchemas from window.__SUPERO_CONFIG rather than hardcoding them — a hardcoded value diverges from schemas.py and the runtime cannot reconcile the two.
The application itself

What the agent actually assembles

Field service, mapped onto platform primitives
LIFECYCLETransactional servicesbookingticket / taskapprovalattachmentEDGESConfigured integrationspush_notificationsmsgoogle_calendaramazon_s3SURFACESWho uses itDispatch consoleTechnician mobileSupervisor approvalsCustomer SMS

Have the agent call build_get_service_contract for each of these before it writes any UI. It returns the real state machine, the operation names and the default UI schemas — which is precisely the information a model would otherwise hallucinate.

The job, as guarded transitions
WORK ORDER LIFECYCLErequestedraised by officeconfirmedslot bookedcompletedsigned off · terminalcancelledterminalno_showreserved · you set it
check_availability is an overlap check, not a hold — but book_slot does take a real lock, so two dispatchers picking the identical window are resolved safely and the loser is refused. Partially overlapping windows fall back to read-then-write, so handle a refusal as a normal race in the UI rather than an error toast. Remember the refusal arrives as HTTP 200 with success:false and status_code: 409 in the body.

The approval threshold is a workflow, not a code branch: bind @update:field:work_order, condition on the cost, and call approval when it exceeds the limit. The technician's photos go through the attachment service (which owns its own upload/scan/archive lifecycle) into your own S3 bucket. The "on my way" SMS is a service_call step.

The part that makes it trustworthy

Three gates, and what each one actually catches

An agent that writes code and declares victory is a liability. The gates exist so "it works" is a checked claim rather than an assertion.

GateWhenCatches
build_validateBefore publishBundle shape, schema validity and platform contract violations — AST-only, so your code is never executed
build_doctorBefore publishSilent deploy-killers: the things that pass validation and still produce a blank page
build_smoke_testAfter deployWhether the deployed URL actually loads and reads data — not whether it compiled. Pass the expected bundle hash and it also confirms the deploy really rolled, rather than serving a cached older app.

For a change request on an app you already published, have the agent start from build_get_bundle rather than re-authoring from scratch. That pulls the current published files — including any hand-tuned UI — so edits build on top of prior work instead of quietly discarding it.

Know the edges

What this build does not give you

  • Offline is yours to build. Technicians work in basements and dead zones, and nothing here queues a job update, a photo or a signature for later. The generated mobile app is online-first. If your engineers lose signal daily, that is the first thing you will add and it is not a small feature.
  • Agent-driven sessions are less predictable than the guided builder: one can converge in two hours or need three attempts. The gates are what stop an unlucky session from becoming a broken deploy — do not skip them to save time.
  • build_go_live needs a plan that includes cloud hosting; it refuses with a billing message otherwise.
  • The behavioural test gate is off unless your deployment enables it.
  • build_replace_project is destructive and needs a domain-admin key. Keep production in live mode so it is refused there.
Step by step

How to run the session

The loop
ONE SESSIONConnectscoped keyOrientwhoami · skillsAuthorbundle filesValidatevalidate · doctorPublishversion_uuidGatesmoke · e2eGo livesupero.live

Mint the narrowest key that will do the job

Use a project-admin key unless the agent genuinely needs to create projects. Keep it out of source control — Claude Code stores MCP config in local machine config; add project-level Cursor/Copilot config files to .gitignore. Rotate from the dashboard if it leaks.

⏱ ~5 minutes

Make the agent orient before it writes

Insist on build_whoami first, then build_get_skills and build_get_examples. A model that skips these will produce plausible-looking code against a platform shape it invented.

⏱ ~10 minutes

Pin the services before the UI

Call build_list_capabilities for what is actually available, build_recommend_integrations with the app description for a tiered suggestion, and build_get_service_contract per service. Then have the agent write schemas.py with extends pointing at the right bases.

⏱ ~30 minutes

Author, validate, repeat

This is the bulk of the session and it is genuinely iterative: author the bundle, run build_validate, fix, re-run. Because validation is AST-only against the live platform, the loop is fast and nothing runs your code to find out it was wrong.

⏱ ~3–4 hours

Deploy ephemeral, gate, then go live

Deploy with target: cloud_ephemeral for a short-lived managed preview and run the gates against it. Only when those pass should build_go_live mint the permanent URL — take the hostname from the public_url it returns rather than constructing one, and note that going live needs a plan that includes cloud hosting. Use build_logs when a gate fails and build_teardown when a preview has served its purpose.

⏱ ~1 hour

Connect the customer's existing systems

Field service rarely starts from nothing — parts and pricing usually live in an ERP. The same MCP session can connect it: build_connect_data_source → build_discover_source → build_bind_data_source, then choose live or synced reads per table.

⏱ ~1 hour

The economics

Time to deliver

PhaseAgent-driven on SuperoA field-service SaaS you configure, or build
Editor connected, scope resolved~10 minn/a
Data model + CRUD + admin screens~1 h (authored + validated)2–3 weeks
Scheduling, approvals, attachments0 — inherited via extends3–4 weeks
Push, SMS, calendar, object storage~45 min of configuration2–3 weeks
Mobile app for technicians (online-only)~half a day (Expo, same backend)4–6 weeks
Quality gates + deploy~1 h1–2 weeks of CI work
Total~1 day~3 months
The takeaway

What the gates cover, and what they never will

The gates are the whole argument, and they are also the part you can verify without trusting us: deliberately break a deploy and run build_smoke_test against it. Watch it refuse once, early, and the rest of the session becomes an ordinary engineering loop rather than an act of faith.

What no gate covers is judgement. Nothing here checks that the work-order model matches how your dispatchers actually work, and no smoke test was ever going to tell you the technicians needed offline capture. The agent removes the typing. The specification is still yours.

Delivery estimates in this guide are for the scope described, built by one experienced developer with any vendor sandbox credentials already in hand. Treat them as a realistic starting point, not a commitment — and check the documentation for the authoritative behaviour of any API named here.

Build this on Supero

Describe it and get schemas, APIs, SDKs and a governed multi-tenant backend — or point your own AI editor at Supero over MCP and build it there.