You're viewing a demo portfolio

Join the waitlist
PRSM

deploy_app

Active

Tool of cloud.redu/mcp

declared in 2.0.0

Deploys an app to a VM and exposes it at a public https://<name>-<id>.redu.cloud URL (a random 8-char suffix is appended to <name> for uniqueness — a BARE custom `dname` like `myapp.redu.cloud` ALSO gets a suffix, so to PIN a known URL pass a dname that already includes an 8-char suffix like `myapp-7k2m9x4p.redu.cloud` and wire the app's own URL env to it; single-surface apps can instead just read the injected PUBLIC_URL/APP_URL). The container is built ON the VM — no local Docker/podman needed. PREREQS — run check_deploy_prerequisites first: it auto-selects your network_id + keypair_name (and returns a recipe to mint a keypair if you have none). Pass those two ids here. PORT: pass the port the app actually listens on (plan_deploy detects it / Dockerfile EXPOSE) — redu health-probes that exact port, so a wrong/omitted port (defaults to 3000) fails a non-3000 app (e.g. a static nginx app listens on 80 → pass 80). TWO source modes: (1) GIT — pass `repo` (public; private repos also need git_token). (2) UPLOAD — call prepare_upload first to tar + POST your LOCAL working dir, then pass the returned `source_token` (no git, no PAT; use this for uncommitted code, a fixed clone of a repo you don't own, or private code). The source needs a Containerfile/Dockerfile; redu auto-finds one in common subfolders (Docker/, scripts/, packaging/…) and builds with the repo root as context — for a repo with MULTIPLE Dockerfiles pass `dockerfile`+`context` to pick the right one. If it has NONE, pass dockerfile_content (the one plan_deploy generated) or include a Dockerfile in the uploaded tarball. To wire a DB, pass `database` (auto-injects the connection env + DATABASE_URL — zero setup): `database:'single_vm'` puts Postgres ON the app VM (cheapest; data dies if the VM is replaced); `database:'managed'` provisions a SEPARATE managed-DB VM on the same private network and wires it automatically (data PERSISTS across redeploys; reused on a same-name redeploy) — you do NOT call create_database/create_relational_database for this. Choose the engine with `db_engine` ('postgres' default → PG* env; 'mysql'/'mariadb' → MYSQL_* env + mysql:// URL, for WordPress/Matomo/LAMP apps; mysql/mariadb require database:'managed'). redu also injects APP_URL/PUBLIC_URL (= the app's public URL) into its env, so apps that need their own URL get it (map an app-specific var like BASE_URL to PUBLIC_URL if needed). Build+provision takes ~3-6 min (a bit longer for managed, which also brings up the DB VM); poll list_deployments or get_deployment until status='ready'. On 'build_failed'/'error', call get_deployment(id) to read build_log. ALWAYS run plan_deploy first and confirm the plan + cost with the user before deploying.

Parameters schema

{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name",
    "keypair_name"
  ],
  "properties": {
    "env": {
      "type": "object",
      "description": "Env vars injected into the container at deploy time (e.g. PGHOST/PGPORT/PGUSER/PGPASSWORD/PGDATABASE from a managed Postgres). Never baked into the image.",
      "additionalProperties": {
        "type": "string"
      }
    },
    "name": {
      "type": "string",
      "maxLength": 63,
      "minLength": 1,
      "description": "Name for the deployment / VM (lowercase letters, numbers, hyphens)."
    },
    "port": {
      "type": "integer",
      "default": 3000,
      "maximum": 65535,
      "minimum": 1,
      "description": "REQUIRED in practice: the port the app actually listens on inside the container — pass the port plan_deploy detected / the Dockerfile EXPOSE / the framework default. redu probes THIS port for health, so a wrong value fails the deploy. Defaults to 3000 only if omitted (e.g. a static nginx app listens on 80 — pass 80)."
    },
    "repo": {
      "type": "string",
      "format": "uri",
      "description": "GIT MODE: public git repo URL (https). For a PRIVATE repo also pass git_token. Omit when using source_token (upload mode)."
    },
    "db_id": {
      "type": "integer",
      "description": "Informational link to a managed Postgres (from create_database/list_databases).",
      "exclusiveMinimum": 0
    },
    "dname": {
      "type": "string",
      "description": "Custom *.redu.cloud subdomain. For a STABLE, KNOWN-AHEAD URL (needed when the app must be told its OWN url — OAuth callbacks, cookie domain, a frontend that calls its API), generate the FULL auto-gen form yourself: `<label>-<8 lowercase letters/digits>.redu.cloud` (e.g. `myapp-7k2m9x4p.redu.cloud`) — that exact form is used VERBATIM — and wire the app's own URL env to that SAME value. A BARE `<label>.redu.cloud` is NOT used as-is: redu appends a random 8-char suffix for uniqueness, so anything wired to the bare name will NOT match the real URL. Omit to auto-generate (then read the real URL from get_deployment)."
    },
    "redis": {
      "enum": [
        "none",
        "managed"
      ],
      "type": "string",
      "description": "Redis wiring (auto-injects REDIS_URL/REDIS_HOST/REDIS_PORT/REDIS_PASSWORD — zero setup): 'managed' = a SEPARATE managed Redis VM auto-provisioned + wired on the same private network (data persists across app redeploys; reused on a same-name redeploy). Omit (or 'none') for no Redis. With 'managed' you do NOT call create_redis — it's done for you. Use when the app needs Redis (REDIS_URL / bullmq / celery / sidekiq / cache)."
    },
    "subdir": {
      "type": "string",
      "description": "Build context within the source (e.g. 'demo-go') when the Containerfile/Dockerfile isn't at the root."
    },
    "context": {
      "type": "string",
      "description": "Build-context dir within the source (default: repo root, or `subdir`). Set when the Dockerfile lives in a subfolder but builds from the repo root."
    },
    "db_name": {
      "type": "string",
      "description": "DB name for single_vm/managed (default 'app')."
    },
    "db_user": {
      "type": "string",
      "description": "DB user for single_vm/managed (default 'appuser')."
    },
    "git_ref": {
      "type": "string",
      "description": "git mode only: branch/tag/commit to deploy (default: the repo's default branch)."
    },
    "runtime": {
      "type": "string",
      "description": "Informational: node/python/go/… (e.g. from plan_deploy)."
    },
    "database": {
      "enum": [
        "none",
        "single_vm",
        "managed"
      ],
      "type": "string",
      "description": "DB wiring (auto-injects the connection env + DATABASE_URL — zero setup): 'single_vm' = Postgres ON the app VM (cheapest, data dies when the VM is replaced; Postgres only); 'managed' = a SEPARATE managed-DB VM auto-provisioned + wired on the same private network (data PERSISTS across app redeploys; reused on a same-name redeploy). Omit (or 'none') for no DB. With 'managed' you do NOT call create_database/create_relational_database — it's done for you. Choose the engine with db_engine."
    },
    "db_engine": {
      "enum": [
        "postgres",
        "mysql",
        "mariadb"
      ],
      "type": "string",
      "description": "Managed-DB engine (default 'postgres'). 'mysql'/'mariadb' provision a managed MySQL/MariaDB VM and wire MYSQL_HOST/MYSQL_PORT/MYSQL_USER/MYSQL_PASSWORD/MYSQL_DATABASE + a mysql:// DATABASE_URL — use for WordPress/Matomo/NextCloud/most PHP-LAMP apps. Requires database:'managed' (single_vm is Postgres only)."
    },
    "flavor_id": {
      "type": "string",
      "default": "3",
      "minLength": 1,
      "description": "Instance size — from list_flavors. Default m1.medium (enough RAM to build on the VM)."
    },
    "git_token": {
      "type": "string",
      "description": "git mode only: token to clone a PRIVATE repo. Omit for public repos."
    },
    "db_version": {
      "type": "string",
      "description": "DB version for single_vm/managed. Postgres: '16'|'15'|'14' (default 16). MySQL: '8.0'. MariaDB: '11.4'|'10.11'. Defaults per engine if omitted."
    },
    "dockerfile": {
      "type": "string",
      "description": "Path within the source to the Dockerfile (e.g. 'scripts/Dockerfile') when it's NOT at the root. Pair with `context` when the Dockerfile is in a subfolder but COPYs from the repo root."
    },
    "network_id": {
      "type": "string",
      "minLength": 1,
      "description": "Existing private network id — from check_deploy_prerequisites (auto-selects your default) or list_private_networks. Optional: if omitted, redu auto-selects your default network."
    },
    "db_flavor_id": {
      "type": "string",
      "description": "managed only: VM size for the dedicated Postgres (from list_flavors). Defaults to the app flavor; m1.small is plenty for most. plan_deploy sizes this for you."
    },
    "db_superuser": {
      "type": "boolean",
      "description": "managed/single_vm Postgres only: grant the app DB user SUPERUSER (dedicated single-tenant DB VM, so safe). Use when the app's migrations create extensions/roles themselves."
    },
    "keypair_name": {
      "type": "string",
      "minLength": 1,
      "description": "REQUIRED. An EXISTING SSH keypair name — call list_keypairs and reuse one, or import_keypair first."
    },
    "source_token": {
      "type": "string",
      "minLength": 16,
      "description": "UPLOAD MODE: token from prepare_upload's curl step — deploys an uploaded tarball of your LOCAL working dir (no git, no PAT). Use this to deploy uncommitted code, a fixed clone of a repo you don't own, or private code. Omit `repo` when set."
    },
    "db_extensions": {
      "type": "array",
      "items": {
        "enum": [
          "vector",
          "pgvector",
          "postgis",
          "pgaudit",
          "pg_stat_statements",
          "hstore",
          "pg_trgm",
          "uuid-ossp",
          "citext",
          "pgcrypto",
          "ltree",
          "btree_gin",
          "btree_gist"
        ],
        "type": "string"
      },
      "description": "managed/single_vm Postgres only: extensions to pre-install (pgvector, postgis, pgaudit, pg_trgm, …). Pass when the app needs one — e.g. langfuse/lantern need pgvector — so you don't have to CREATE EXTENSION by hand."
    },
    "redis_version": {
      "enum": [
        "7",
        "6"
      ],
      "type": "string",
      "description": "managed Redis only: version (default '7')."
    },
    "redis_password": {
      "type": "string",
      "description": "managed Redis only: a specific password to set (otherwise auto-generated)."
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 8
    },
    "redis_flavor_id": {
      "type": "string",
      "description": "managed Redis only: the dedicated Redis VM size (from list_flavors). Defaults to the app flavor; m1.small is plenty for a cache."
    },
    "dockerfile_content": {
      "type": "string",
      "description": "A Dockerfile to write into the build dir before building — pass the Dockerfile that plan_deploy generated when the repo has none, or to override a broken one. (In upload mode you can instead just include the Dockerfile in the tarball.)"
    },
    "security_group_names": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": [
        "default"
      ]
    }
  },
  "additionalProperties": false
}

What this tool wraps· 0 endpoints

min confidence0.700.50

No endpoints wrapped at confidence ≥ 0.70.

Parent server

cloud.redu/mcp

1/7 registries
View full server →