agent-setup

The response contract for agent-driven setup over MCP.

An agent in your repo calls an app's setup_* MCP tool, writes the env vars and code it gets back, then polls verify_setup until the first event arrives. You never open the dashboard.

Today every vendor ships its own onboarding skill because the setup response is untyped. agent-setup types it. One generic skill drives every conforming server, and a vendor implements two tools instead of writing prose.

The two tools

toolreturnsrule
setup_<kind>Setup idempotent: same input returns the existing resource with created: false
verify_setup({ id, since? })Verification waiting with a hint until the first event after since, then receiving

What setup_project returns

{
  "resource": {
    "kind": "project", "id": "p_8f3k2q", "name": "acme-api",
    "dashboard_url": "https://thermite.example.com/projects/p_8f3k2q"
  },
  "created": true,
  "env": [
    { "name": "SENTRY_DSN", "value": "https://4b1c@thermite.example.com/p_8f3k2q", "secret": false }
  ],
  "install": [
    { "target": "nextjs", "file_hint": "instrumentation.ts",
      "packages": ["@sentry/nextjs"], "code": "import * as Sentry from ..." }
  ],
  "compatible_with": ["sentry"],
  "human_steps": [
    { "why": "Add a payment method", "url": "https://thermite.example.com/billing", "blocking": false }
  ],
  "verify_with": "verify_setup"
}

For app vendors

Implement setup_<kind> and verify_setup on your MCP server and return these types.

cargo add agent-setup      # Rust: serde + schemars, no runtime
bun add agent-setup        # TypeScript: types + JSON Schemas

Host the vendor template at https://yourapp.com/SKILL.md with your server URL filled in. Your users then paste one sentence:

Read https://yourapp.com/SKILL.md and set up YourApp

For agents

The generic skill is at agent-setup.oxidt.com/SKILL.md. A vendor file points you there; nothing to install. It detects the stack, calls setup, writes env and code, hands human steps to the user, and polls verify with backoff.

Schemas

Use them as the tools' outputSchema. Each carries its URL as $id.