UNPKG

run402-mcp

Version:

MCP server for Run402 — full-stack backend infrastructure for AI agents: Postgres, auth, storage, serverless functions and atomic deploys. Paid with x402/MPP. Includes $0.03 image generation.

360 lines (359 loc) • 9.21 kB
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://run402.com/schemas/run402-app.v1.schema.json", "title": "Run402AppSpec", "description": "Canonical run402.json app installation manifest consumed by run402 up.", "type": "object", "additionalProperties": false, "required": ["$schema", "spec_version", "app", "project", "release"], "properties": { "$schema": { "const": "https://run402.com/schemas/run402-app.v1.schema.json" }, "spec_version": { "const": 1 }, "app": { "type": "object", "additionalProperties": false, "required": ["id"], "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_-]{0,63}$" }, "display_name": { "type": "string" }, "description": { "type": "string" } } }, "project": { "type": "object", "additionalProperties": false, "properties": { "name": { "type": "string", "minLength": 1 }, "id": { "type": "string", "minLength": 1 }, "origin": { "type": "object", "additionalProperties": false, "properties": { "subdomain": { "type": "string", "minLength": 1 } } } } }, "resources": { "type": "object", "additionalProperties": false, "properties": { "mailboxes": { "type": "object", "additionalProperties": { "$ref": "#/$defs/mailbox" }, "propertyNames": { "$ref": "#/$defs/logicalName" } }, "webhooks": { "type": "object", "additionalProperties": { "$ref": "#/$defs/webhook" }, "propertyNames": { "$ref": "#/$defs/logicalName" } } } }, "secrets": { "type": "object", "additionalProperties": { "$ref": "#/$defs/userSecret" }, "propertyNames": { "type": "string", "pattern": "^(?!RUN402_)[A-Z_][A-Z0-9_]{0,127}$" } }, "build": { "type": "object", "additionalProperties": false, "properties": { "mode": { "enum": ["local", "remote", "sandbox"] }, "commands": { "type": "array", "items": { "$ref": "#/$defs/buildCommand" } } } }, "release": { "description": "Release node content. Project selection, build, resources, secret source metadata, lifecycle, and verify stay in the app install graph.", "type": "object", "additionalProperties": false, "properties": { "base": true, "database": { "$ref": "#/$defs/releaseDatabase" }, "secrets": true, "functions": true, "site": true, "subdomains": true, "routes": true, "checks": true, "assets": true, "i18n": true }, "not": { "anyOf": [ { "required": ["project"] }, { "required": ["idempotency_key"] }, { "required": ["build"] }, { "required": ["resources"] }, { "required": ["lifecycle"] }, { "required": ["verify"] } ] } }, "lifecycle": { "type": "object", "additionalProperties": false, "properties": { "project": { "enum": ["per_app", "shared"] }, "prune": { "enum": ["approval_required", "disabled"] } } }, "verify": { "type": "object", "additionalProperties": false, "properties": { "http": { "type": "array", "items": { "$ref": "#/$defs/httpVerify" } } } } }, "$defs": { "logicalName": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "mailbox": { "type": "object", "additionalProperties": false, "properties": { "slug": { "type": "string" }, "roles": { "type": "array", "items": { "enum": ["default_outbound", "auth_sender"] }, "uniqueItems": true }, "description": { "type": "string" } } }, "webhook": { "type": "object", "additionalProperties": false, "required": ["mailbox", "url", "events"], "properties": { "mailbox": { "$ref": "#/$defs/logicalName" }, "url": { "type": "string", "minLength": 1 }, "events": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1, "uniqueItems": true }, "enabled": { "type": "boolean" }, "signing": { "type": "object", "additionalProperties": false, "properties": { "required": { "type": "boolean" } } } } }, "userSecret": { "type": "object", "additionalProperties": false, "properties": { "required": { "type": "boolean" }, "source_env": { "type": "string", "pattern": "^(?!RUN402_)[A-Z_][A-Z0-9_]{0,127}$" }, "description": { "type": "string" } } }, "buildCommand": { "type": "object", "additionalProperties": false, "required": ["id"], "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_-]{0,63}$" }, "argv": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }, "shell": { "type": "string", "minLength": 1 }, "cwd": { "type": "string", "minLength": 1 } }, "oneOf": [ { "required": ["argv"] }, { "required": ["shell"] } ] }, "releaseDatabase": { "type": "object", "additionalProperties": false, "properties": { "migrations": { "type": "array", "items": { "$ref": "#/$defs/migration" } }, "expose": true, "zero_downtime": { "type": "boolean" } } }, "migration": { "type": "object", "additionalProperties": false, "properties": { "id": { "type": "string", "description": "Versioned immutable migration id, e.g. 001_init. Same id plus same checksum noops; same id plus different SQL is MIGRATION_CHECKSUM_MISMATCH. Use name instead for generated/idempotent SQL whose identity should track content changes." }, "name": { "type": "string", "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", "description": "Content-tracked migration name for generated/idempotent SQL. The SDK compiles this to <name>_<sha256(sql)[0:16]>; changed content applies once under a new id and identical re-deploys noop. SQL declared with name MUST be idempotent because it re-runs whenever content changes against a database where prior versions may already exist." }, "checksum": { "type": "string" }, "sql": { "type": "string" }, "sql_ref": { "$ref": "#/$defs/contentRef" }, "sql_path": { "type": "string" }, "sql_file": { "type": "string" }, "transaction": { "enum": ["required", "none"] } }, "oneOf": [ { "required": ["id"], "not": { "required": ["name"] } }, { "required": ["name"], "not": { "required": ["id"] } } ] }, "contentRef": { "type": "object", "additionalProperties": false, "required": ["sha256", "size"], "properties": { "sha256": { "type": "string" }, "size": { "type": "integer", "minimum": 0 }, "contentType": { "type": "string" }, "integrity": { "type": "string" } } }, "httpVerify": { "type": "object", "additionalProperties": false, "required": ["id", "expect"], "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_-]{0,63}$" }, "path": { "type": "string", "pattern": "^/" }, "url": { "type": "string", "minLength": 1 }, "expect": { "type": "object", "additionalProperties": false, "required": ["status"], "properties": { "status": { "type": "integer", "minimum": 100, "maximum": 599 } } }, "retries": { "type": "integer", "minimum": 0 } }, "oneOf": [ { "required": ["path"] }, { "required": ["url"] } ] } } }