cloud.redu/mcp
REMOTE · MCP.REDU.CLOUD
Agent-native cloud, EU-hosted. Provision VMs, networks & databases on redu.cloud via MCP.
Available components
Last scanned (14 hours ago)
Scores higher than 96% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Cloud Infrastructure
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability58
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 34394 tokens (~321/item across 107 items; 107 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management92
- Stability check failed: schema churn in the 30 days we've observed: 6 tool removals, 1 breaking changes, 0 auth/transport breaks, 32 additions. See how to fix → Fail
Tool Coverage93
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 77% of tool parameters carry a description.Partial
- Structured output schemas are declared (98% of tools); any adoption earns full credit.Pass
Tool Safety97
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 24 of 27 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "check_deploy_prerequisites" implies "deploy" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
- An AI judge read all 108 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- New tool “delete_private_network”, which the server declares destructive security
- New tool “end_run”, which the server declares destructive security
- New tool “create_private_network” functional
- New tool “create_run” functional
- New tool “get_run” functional
- New tool “list_runs” functional
- “create_instance” added an optional parameter “run_id” cosmetic
- “create_volume” added an optional parameter “run_id” cosmetic
- 2 Nov 26 0
- Tool “create_free_postgres” rewrote its description, which is the text the model reads security
- Tool “exec_free_resource” rewrote its description, which is the text the model reads security
- New tool “get_free_resource_telemetry” functional
- 1 Nov 26 0
- New tool “delete_free_resource”, which the server declares destructive security
- New tool “exec_free_resource”, which the server declares destructive security
- New tool “create_free_website” functional
- New tool “create_free_postgres” functional
- New tool “get_billing_account” functional
- New tool “get_free_resource_action” functional
- New tool “get_free_resources” functional
- New tool “get_free_website_ssh” functional
- New tool “publish_free_website” functional
- “create_backup” added an optional parameter “provisioning_mode” cosmetic
- “create_clickhouse” added an optional parameter “provisioning_mode” cosmetic
- “create_database” added an optional parameter “image_role” cosmetic
- “create_database” added an optional parameter “provisioning_mode” cosmetic
- “create_database” added an optional parameter “required_disk_gb” cosmetic
- “create_database” added an optional parameter “required_memory_mb” cosmetic
- “create_instance” added an optional parameter “image_role” cosmetic
- “create_instance” added an optional parameter “provisioning_mode” cosmetic
- “create_instance” added an optional parameter “required_disk_gb” cosmetic
- “create_instance” added an optional parameter “required_memory_mb” cosmetic
- “create_media_space” added an optional parameter “provisioning_mode” cosmetic
- “create_redis” added an optional parameter “provisioning_mode” cosmetic
- “create_relational_database” added an optional parameter “provisioning_mode” cosmetic
- “create_snapshot” added an optional parameter “provisioning_mode” cosmetic
- “create_volume” added an optional parameter “provisioning_mode” cosmetic
- “deploy_app” added an optional parameter “image_role” cosmetic
- “deploy_app” added an optional parameter “provisioning_mode” cosmetic
- “deploy_app” added an optional parameter “required_disk_gb” cosmetic
- “deploy_app” added an optional parameter “required_memory_mb” cosmetic
- “deploy_compose” added an optional parameter “image_role” cosmetic
- “deploy_compose” added an optional parameter “provisioning_mode” cosmetic
- “deploy_compose” added an optional parameter “required_disk_gb” cosmetic
- “deploy_compose” added an optional parameter “required_memory_mb” cosmetic
- “plan_deploy” added an optional parameter “image_role” cosmetic
- “plan_deploy” added an optional parameter “provisioning_mode” cosmetic
- “plan_deploy” added an optional parameter “required_disk_gb” cosmetic
- “plan_deploy” added an optional parameter “required_memory_mb” cosmetic
- “plan_instance” added an optional parameter “image_role” cosmetic
- “plan_instance” added an optional parameter “provisioning_mode” cosmetic
- “plan_instance” added an optional parameter “required_disk_gb” cosmetic
- “plan_instance” added an optional parameter “required_memory_mb” cosmetic
- “plan_managed_datastore” added an optional parameter “image_role” cosmetic
- “plan_managed_datastore” added an optional parameter “provisioning_mode” cosmetic
- “plan_managed_datastore” added an optional parameter “required_disk_gb” cosmetic
- “plan_managed_datastore” added an optional parameter “required_memory_mb” cosmetic
- “restore_backup” added an optional parameter “provisioning_mode” cosmetic
- “upgrade_to_cluster” added an optional parameter “provisioning_mode” cosmetic
- “upgrade_to_ha” added an optional parameter “provisioning_mode” cosmetic
- “create_database” made “flavor_id” optional cosmetic
- “create_instance” made “flavor_id” optional cosmetic
- “create_instance” made “image_id” optional cosmetic
- 27 Oct 26 −2
- A breaking change shipped without a version bump: still 2.0.0 ▼ security
- Tool “check_agent_prerequisites” was removed ▼ security
- Tool “create_controller” was removed ▼ security
- Tool “get_agent_status” was removed ▼ security
- Tool “setup_agent_fleet” was removed ▼ security
- Tool “setup_agent_session” was removed ▼ security
- Tool “trigger_agent_batch” was removed ▼ security
- New tool “postgres_data_change”, which the server declares destructive security
- Tool coverage: 85% → 77% ▼ functional
- New tool “postgres_data_read” functional
- 26 Oct 26 0
- New tool “delete_private_vps”, which the server declares destructive security
- New tool “exec_private_vps”, which the server declares destructive security
- Tool “create_private_vps” rewrote its description, which is the text the model reads security
- New tool “get_private_vps_action” functional
- New tool “get_private_vps_ssh” functional
- New tool “publish_private_vps” functional
- 25 Oct 26 0
- New tool “create_private_vps” functional
- New tool “get_private_vps_pilot” functional
- 20 Oct 26 0
- Tool “delete_deployment” rewrote its description, which is the text the model reads security
- “deploy_app” added an optional parameter “data_paths” cosmetic
- “deploy_compose” added an optional parameter “data_paths” cosmetic
- 19 Oct 26 0
- New tool “delete_dns_entry”, which the server declares destructive security
- New tool “release_domain”, which the server declares destructive security
- Tool “deploy_app” rewrote its description, which is the text the model reads security
- Tool “deploy_compose” rewrote its description, which is the text the model reads security
- Tool “get_domain_verification” rewrote its description, which is the text the model reads security
- Tool “list_dns_entries” rewrote its description, which is the text the model reads security
- Tool “list_domains” rewrote its description, which is the text the model reads security
- Tool “plan_deploy” rewrote its description, which is the text the model reads security
- Tool “verify_domain” rewrote its description, which is the text the model reads security
- “deploy_compose” reworded the description of “port” cosmetic
- Tool “list_domains” changed its title: List verified domains → List custom domains cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://mcp.redu.cloud/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=*.redu.cloud | CN=YE2,O=Let's Encrypt,C=US | 5 Oct 2026 | 3 Jan 2027 | ECDSA 384 | ECDSA-SHA384 | 6a2e5fb02aa36a64e1e166e9271cabdce7d |
| SANs: *.redu.cloud, redu.cloud | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.redu.cloud. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| cloud. | present | 7041 | 13 | Verified |
| redu.cloud. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://mcp.redu.cloud/.well-known/oauth-protected-resource", scope="openid profile email offline_access"
Bearer resource_metadata="https://mcp.redu.cloud/.well-known/oauth-protected-resource", scope="openid profile email offline_access" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; preload |
Protected resource metadata
| Document | https://mcp.redu.cloud/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://mcp.redu.cloud |
| Authorisation server | https://login.redu.cloud/realms/eu-central-1 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.redu.cloud/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.redu.cloud/mcp | HTTPS enforced | 301 | https://mcp.redu.cloud/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
list_flavors List flavors ~14
Lists available instance sizes.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| flavors | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_images List images ~13
Lists available OS images.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| images | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_instances List instances ~13
Lists your compute instances.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| instances | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_keypairs List keypairs ~27
Lists your SSH keypairs. If empty, call import_keypair first before creating instances.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| keypairs | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_media_spaces List media spaces ~70
Lists Redu media spaces: private NFS media VMs backed by persistent volumes. For WordPress/WooCommerce clusters, reuse one on the app's private network for wp-content/uploads, or pass create_media_space:true to deploy_app/deploy_compose/upgrade_to_cluster so Redu creates one.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| media_spaces | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_private_networks List private networks ~15
Lists your private networks.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| networks | array | – | – |
| next | string | – | – |
No examples provided.
list_qdrant List managed Qdrant ~63
Lists your managed Qdrant vector databases (create_qdrant, or started for a deploy). Once a row's status is 'ready' it carries private_ip (REST port 6333, gRPC 6334); the API key is never listed.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| qdrant | array | – | – |
No examples provided.
list_redis List managed Redis ~69
Lists your managed Redis instances. Once a row's status is 'ready' it carries the private-network connection details (private_ip, port 6379) - connect from another instance on the same private network with redis-cli -h <private_ip> -p 6379 -a <password>.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| redis | array | – | – |
No examples provided.
list_regions List regions ~12
Lists available regions.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| regions | array | – | – |
No examples provided.
list_relational_databases List managed MySQL/MariaDB ~68
Lists your managed MySQL/MariaDB databases (the relational-database resource). Each row carries its engine ('mysql'|'mariadb'); once status is 'ready' it has the private-network connection details (private_ip, port 3306, db_name, db_user).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| relational_databases | array | – | – |
No examples provided.
list_runs List runs ~38
Lists your runs, newest first: id, name, status (running, ending, ended, end_failed) and how many resources each still holds.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| runs | array | – | – |
No examples provided.
list_security_groups List security groups ~14
Lists your security groups.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| security_groups | array | – | – |
No examples provided.
list_snapshots List snapshots ~14
Lists your instance snapshots.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| snapshots | array | – | – |
No examples provided.
list_volumes List volumes ~15
Lists your block storage volumes.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| mode | string | – | – |
| next | string | – | – |
| volumes | array | – | – |
No examples provided.
plan_deploy Plan an app deployment ~3,581
Turns YOUR repo classification (you scan the repo and pass what you found) into a complete, approvable deploy plan WITHOUT creating anything. ⚡ REDU NEEDS THREE FILES IF THEY EXIST - redu.md, the compose file, the Dockerfile - and there are two ways to give them. ⭐ BEST, for an upload-mode deploy: run prepare_upload FIRST and pass its `source_token`; redu reads all three straight out of the upload you already made, the upload stays deployable, and you emit nothing. Pasting the same files costs you 20-29 KB of output for bytes the server already has. Otherwise (git mode) paste `redu_md` (cat redu.md), `compose_yaml`, `dockerfile`. Either way you do NOT read or interpret them; redu parses them SERVER-SIDE and returns (a) a short digest, (b) `pin_dname` so a redeploy keeps the SAME public URL, and (c) `preflight` - preemptive fixes for known failure patterns found in YOUR repo, each learned from a real failed build. Giving redu these files is the single highest-value thing you can do for a first deploy. picks the VM + managed-Postgres sizes, prices them at the real pricing_rules rates, and checks they FIT your quota - so a plan that can't provision is caught HERE, before any spend. You pass what you detected in the repo (runtime, port, needs_postgres/redis/clickhouse/vector_db); it returns resources + £/hr + £/mo + a feasibility verdict + a checkpoint summary to confirm with the user. Defaults: app VM m1.medium, managed Postgres m1.small, managed ClickHouse m1.medium; pass single_vm to collapse the app + Postgres onto one VM. SET needs_clickhouse:true FOR ANY ANALYTICS-SHAPED APP (Plausible, PostHog, Langfuse, Matomo, SigNoz, or anything with a clickhouse image / CLICKHOUSE_* env / a ClickHouse client dep): those products keep config in Postgres and EVERY EVENT in ClickHouse, so the events tier is a second VM with a second line on the bill: measured 2026-08-07, omitting it quoted GBP 53.29/mo for a GBP 65.99/mo deployment. It is sized, quota-checked and priced here; u…
| Name | Type | Req | Description |
|---|---|---|---|
| app_flavor | string | – | Preferred app VM size (default m1.medium). Resolved against the real flavor list. |
| app_profile | string | – | Detected app profile. Set wordpress/woocommerce when source inspection finds wp-config.php, wp-content, WordPress/WooCommerce packages/plugins, or wordpress/woocommerce compose images. This is used f… |
| clickhouse_flavor | string | – | Preferred managed ClickHouse VM size (default m1.medium, a tier above the other datastores, which is what plan_managed_datastore also picks for ClickHouse). Resolved against the real flavor list. |
| cluster_media_mode | string | – | For WordPress/WooCommerce cluster_target:true, use media_space as the default real fix: Redu creates/reuses an NFS media VM backed by a volume and mounts it at wp-content/uploads. central_media_origi… |
| cluster_target | boolean | – | Set TRUE when the user asked to deploy this app as an autoscaling cluster. For WordPress/WooCommerce this requires managed MySQL/MariaDB plus a Redu media space mounted at wp-content/uploads (or an e… |
| compose_yaml | string | – | PASTE the raw contents of the repo's docker-compose.yml / compose.yaml if it has one. redu scans it server-side for known deploy-breaking patterns (Docker-only `local` log driver, depends_on:service_… |
| containerizable | boolean | – | Whether the app can run in a container. Almost always true (a container is the delivery unit); set false ONLY if the app fundamentally can't be containerized - then redu can't deploy it yet. |
| create_media_space | boolean | – | For WordPress/WooCommerce cluster_target:true: set TRUE when no suitable media space exists. The plan will include a small media VM + attached volume and deploy_app/deploy_compose will create it. |
| db_engine | string | – | Managed DB engine to plan. For WordPress/WooCommerce clusters use mariadb or mysql. |
| db_flavor | string | – | Preferred managed Postgres VM size (default m1.small). Resolved against the real flavor list. |
| deploy_mode | string | – | OMIT by default: deploy end to end with no questions asked. 'guided' ONLY when the user explicitly said they want to approve or to be specific about something: the user approves the plan, then you pr… |
| dockerfile | string | – | PASTE the raw contents of the repo's Dockerfile if it has one. redu scans it server-side for BuildKit heredocs, empty `EXPOSE ${ARG}`, and source-build fetches (go/cargo/npm/pip/apt) that are known t… |
| has_container | boolean | – | Whether the repo already has a Dockerfile / compose file. |
| heavy_build | boolean | – | Set TRUE when the BUILD (not the running app) is resource-heavy - the container is built ON the VM today, so a build that needs more RAM/CPU than the idle app must be sized up or it OOMs mid-build. S… |
| image_role | string | – | Free hosting runtime role; the backend resolves the private image. Not an image ID. |
| media_mount_path | string | – | Host mount path on app members for the shared uploads filesystem. Redu mounts this into /var/www/html/wp-content/uploads. |
| media_origin_url | string | – | Public base URL where WordPress wp-content/uploads is served when cluster_media_mode:'central_media_origin'. Do not use the DB VM as this origin. |
| media_space_flavor | string | – | Preferred media VM size when create_media_space:true. Resolved against list_flavors. |
| media_space_id | integer | – | Existing Redu media space id to reuse for WordPress/WooCommerce cluster uploads. Get it from list_media_spaces. Omit when create_media_space:true. |
| media_space_size_gb | integer | – | Size of the media space data volume in GB when create_media_space:true. |
| memory_heavy | boolean | – | Set TRUE for a RAM-forward RUNNING app whose persistent state lives in a MANAGED DB / external store (NOT on the VM's local disk) - so it needs lots of memory but only a lean disk. Sizes onto a memor… |
| needs_clickhouse | boolean | – | App uses ClickHouse: the ANALYTICS / EVENTS store, a separate tier from the app's Postgres/MySQL. Set TRUE on ANY signal: a clickhouse/clickhouse-server image in the compose, a CLICKHOUSE_* / CLICKHO… |
| needs_compose | boolean | – | Set TRUE when the repo ships a docker-compose.yml / compose.yaml that runs MULTIPLE services (app + its own db/redis/worker containers) as a stack - then deploy with deploy_compose (podman-compose on… |
| needs_postgres | boolean | – | App uses Postgres (deps pg/prisma/sqlalchemy/drizzle or DATABASE_URL). |
| needs_redis | boolean | – | App uses Redis (deps redis/ioredis/bullmq/celery or REDIS_URL). |
| needs_vector_db | boolean | – | App uses a vector DB (deps qdrant-client / langchain+embeddings or QDRANT_URL). |
| port | integer | – | Port the app's HTTP server listens on (PORT env / framework default / Dockerfile EXPOSE of a real app port - NOT a debug/IPC port). Omit if the repo has no HTTP server. |
| provisioning_mode | string | – | Explicit hosting choice. Free uses the account entitlement and server-owned image/size; it never falls back to paid. Omit to keep paid hosting. |
| redu_md | string | – | PASTE the raw contents of `redu.md` from the repo root if the file exists (just `cat redu.md`). ⚠️ Only needed when you have NO source_token (a git-mode deploy): with a token, redu reads this file ou… |
| required_disk_gb | number | – | Minimum root disk required by the app. Free hosting never grows the disk or silently charges for a larger size. |
| required_memory_mb | integer | – | Minimum memory required by the app, including builds; free hosting refuses requirements beyond its fixed size. |
| runtime | string | yes | Detected app language/runtime (node, python, go, ruby, ...). Informational - the app deploys as a container, so the language does not gate the deploy. |
| serves_http | boolean | – | Whether the repo actually RUNS an HTTP server that listens on a port. Set FALSE for a library, CLI tool, or language runtime that has no web server (e.g. a package you `import`, or a `bun`/`node`-sty… |
| single_vm | boolean | – | Force everything onto a single VM if the user prefers. |
| source_token | string | – | The `source_token` returned by your prepare_upload upload. ⚡ PREFER THIS over pasting: redu reads redu.md, the compose file and the Dockerfile straight out of the upload you ALREADY made, so you do n… |
| start | string | – | How the app starts (package.json start script / Procfile / Dockerfile CMD). |
| vm_count | integer | – | Number of app VMs (microservices). v1: usually 1. |
| worker | boolean | – | HEADLESS WORKER / daemon: the repo runs a long-lived process with NO HTTP server (a chaos-monkey, a background/queue worker, an on-infra agent runner). Set TRUE to plan a WORKER deploy - a private VM… |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| account_policy | – | – | – |
| deployable | boolean | – | – |
| feasible | boolean | – | – |
| generated_dockerfile | string|null | – | – |
| memory_digest | string|null | – | – |
| memory_source | string|null | – | – |
| memory_used | boolean | – | – |
| mode | string | – | – |
| next | string | – | – |
| pin_dname | string|null | – | – |
| plan | – | – | – |
| preflight | array | – | – |
| reason | string | – | – |
| recommended_compose_file | string|null | – | – |
| recommended_image | string|null | – | – |
| recommended_port | – | – | – |
| recommended_route | string | – | – |
| recommended_service | string|null | – | – |
| report_filename | string | – | – |
| report_markdown | string | – | – |
| route_next | string|null | – | – |
| route_reason | string|null | – | – |
| source_files_error | string|null | – | – |
| source_files_read | – | – | – |
No examples provided.
plan_instance Plan instance (guided options) ~198
Aggregates images/flavors/keypairs/networks/security groups into human-friendly choices. Does not create anything. Happy path: import_keypair → plan_instance → create_instance → get_ssh_command. Call this second (after import_keypair, if you have no keypairs).
| Name | Type | Req | Description |
|---|---|---|---|
| image_role | string | – | Free hosting runtime role; the backend resolves the private image. Not an image ID. |
| osHint | string | – | – |
| provisioning_mode | string | – | Explicit hosting choice. Free uses the account entitlement and server-owned image/size; it never falls back to paid. Omit to keep paid hosting. |
| required_disk_gb | number | – | Minimum root disk required by the app. Free hosting never grows the disk or silently charges for a larger size. |
| required_memory_mb | integer | – | Minimum memory required by the app, including builds; free hosting refuses requirements beyond its fixed size. |
| sizeHint | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| account_policy | – | – | – |
| mode | string | – | – |
| options | – | – | – |
No examples provided.
plan_managed_datastore Plan managed datastore ~395
Plans a direct managed datastore create without provisioning anything. Use this before create_database, create_relational_database, create_redis, create_clickhouse or create_qdrant (engine 'qdrant', the vector database). For app deployments you need none of these: datastores are managed by default, so the ones you report in send_signals are started and wired for you. Pass ha:true to plan a highly available datastore (postgres or clickhouse): three machines instead of one, surviving the loss of a machine without manual failover, at roughly 3x the hourly rate. The returned plan carries the machine count so you can show the user the cost before anything is created.
| Name | Type | Req | Description |
|---|---|---|---|
| engine | string | – | – |
| ha | boolean | – | Plan a highly available datastore (three machines on three different physical hosts behind a load balancer, surviving the loss of a machine with no manual failover) instead of the default single mach… |
| image_role | string | – | Free hosting runtime role; the backend resolves the private image. Not an image ID. |
| provisioning_mode | string | – | Explicit hosting choice. Free uses the account entitlement and server-owned image/size; it never falls back to paid. Omit to keep paid hosting. |
| required_disk_gb | number | – | Minimum root disk required by the app. Free hosting never grows the disk or silently charges for a larger size. |
| required_memory_mb | integer | – | Minimum memory required by the app, including builds; free hosting refuses requirements beyond its fixed size. |
| sizeHint | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| account_policy | – | – | – |
| mode | string | – | – |
| next | string | – | – |
| notes | array | – | – |
| options | – | – | – |
| suggested | – | – | – |
No examples provided.
postgres_data_change Change Postgres data ~233
Changes the data INSIDE a managed Postgres database, as the console does: rows, tables and columns, a SQL write, a CSV import, saved queries, the editing lock. Each write is sent once. Deleting, dropping, renaming, a SQL write and unlocking need confirm: true, set only after the user said yes. Call postgres_data_read action help first for the arguments.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| changes | array | – | – |
| column | string | – | – |
| column_spec | – | – | – |
| columns | array | – | – |
| confirm | boolean | – | Only after the user said yes. |
| create | – | – | – |
| csv | string | – | – |
| database_id | integer | – | – |
| delimiter | string | – | – |
| id | integer | – | – |
| key | – | – | – |
| keys | array | – | – |
| name | string | – | – |
| rows | array | – | – |
| sql | string | – | – |
| table | string | – | – |
| to | string | – | – |
| trash_name | string | – | – |
| write_ref | string | – | – |
No output schema declared.
No examples provided.
postgres_data_read Read Postgres data ~181
Reads the data INSIDE a managed Postgres database, as the console's data view does: tables, rows (sorted, found), a table's info, one cell, a related row, one read-only SQL query, CSV export, saved queries. Changes nothing. Action help lists every action's arguments and the rules, for this tool and postgres_data_change.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| column | string | – | – |
| columns | array | – | – |
| database_id | integer | – | – |
| dir | string | – | – |
| find | object | – | – |
| key | array | – | – |
| limit | integer | – | – |
| offset | integer | – | – |
| schema | string | – | – |
| sort | string | – | – |
| sql | string | – | – |
| table | string | – | – |
| values | array | – | – |
No output schema declared.
No examples provided.
prepare_upload Prepare an upload-mode deploy (local tar + upload commands) ~216
Returns the LOCAL shell commands to package your working directory and upload it for an upload-mode deploy (no git, no PAT). Run them in the user's terminal, capture `source_token` from the upload's JSON response, then call deploy_app with that source_token (omit repo). The upload authenticates AUTOMATICALLY with a short-lived ticket minted from your MCP credential - NO API key needed in the command and nothing secret is printed (it falls back to needing $REDU_API_KEY only if minting is unavailable). Excludes node_modules/.git/.venv/build output and .env by default; honors .gitignore when is_git_repo=true.
| Name | Type | Req | Description |
|---|---|---|---|
| is_git_repo | boolean | – | If the dir is a git checkout, set true to honor .gitignore (tracked files plus untracked, non-ignored ones). Either way a TRACKED file is never dropped, also one under vendor/, dist/, build/ or targe… |
| project_dir | string | – | Path to the local app directory to upload (default current dir). |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| commands | array | – | – |
| endpoint | string | – | – |
| excludes | array | – | – |
| next | string | – | – |
No examples provided.
publish_free_website ~220
Publish the included website's working HTTP application at its generated HTTPS hostname or one exact custom hostname the owner has verified with verify_domain. Point the custom hostname at the generated free-<operation ID without hyphens>.redu.cloud name using CNAME (or the same public edge address for an apex). Only one hostname is served: a custom hostname replaces the generated hostname, not an additional alias. Omit domain to keep the current hostname; pass null to restore the generated one. Verify application readiness and authentication first. All public website HTTP/HTTPS response bodies share 5 GB per UTC month, including multiple routes. Incoming uploads, VM downloads, SSH and private SQL are excluded. No direct public IP is assigned. Database publication and WebSocket upgrades are unavailable. Give the returned URL only after the action completes.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| operation_id | string | yes | – |
| port | integer | yes | – |
| request_key | string | yes | Stable request key. Reuse it after a timeout; never repeat an unknown command with a new key. |
| Name | Type | Req | Description |
|---|---|---|---|
| failure | – | – | – |
| result | – | – | – |
No examples provided.
publish_private_vps Publish a pilot application over HTTPS ~182
Publish a user-requested HTTP application from either pilot, including the smaller pilot on its own, at a generated public HTTPS URL. First install and start the application, enable its production authentication and verify its local HTTP port. This publishes the app only; it does not assign a public VM IP or expose database/SSH ports. Responses consume the existing shared 5 GB outgoing account budget. No paid VM is created. Inspect get_private_vps_action until complete and give the returned URL to the user together with their separately obtained SSH command. If installation fails, preserve the VM and give SSH access; do not claim a working URL. Reuse request_key after a timeout. One fixed application port per pilot lifetime; deleting the pilot removes its route.
| Name | Type | Req | Description |
|---|---|---|---|
| operation_id | string | yes | – |
| port | integer | yes | – |
| request_key | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| action | – | – | – |
| failure | – | – | – |
No examples provided.
release_domain Release a custom domain (needs approval) ~188
Removes a custom domain from this account: a verified domain is no longer verified for it (using it again needs a new TXT check), and a pending claim is cancelled. The first call releases nothing: it shows the domain for the user to approve; call again with confirm:true only after their yes. The second call reports the platform's answer: released, or refused. A refusal because public names still use the domain (DOMAIN_IN_USE) lists those names, each with its id: remove each with delete_dns_entry (it asks for the user's yes first), then call this again. Releasing a domain deletes no deployment, instance or cluster.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Set true ONLY after the user has explicitly approved releasing this domain (see the confirmation the first call returns). Do NOT set it yourself. |
| domain | string | yes | The custom domain to release, as list_domains shows it. |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| claim | – | – | – |
| domain | string | – | – |
| error | boolean | – | – |
| matches | array | – | – |
| mode | string | – | – |
| names | array | – | – |
| needs_confirmation | boolean | – | – |
| next | string | – | – |
| released | boolean | – | – |
| validation | – | – | – |
No examples provided.
restore_backup Restore backup ~281
Restores a backup into an existing volume (volumeId), an instance's volume (instanceId), or a new one (volumeName). Poll list_volumes for the restored volume. DISASTER RECOVERY (the original VM is gone, so its volume died with it): restore with volumeName to rebuild the data as a NEW volume. To bring the MACHINE back, pass that volume as create_instance's boot_volume_id - it boots from the restored disk, so the VM returns with its filesystem intact and nothing to mount. Use attach_volume instead only when you want the data as an EXTRA disk on an existing machine (then get_ssh_command -> lsblk -> mount). A restored volume is inert until it is booted from or attached.
| Name | Type | Req | Description |
|---|---|---|---|
| backupId | string | yes | ID of the backup to restore (see list_backups). |
| instanceId | string | – | Optional: restore into this instance's volume (resolved automatically). The target volume must be available (detached), so stop the instance first. |
| provisioning_mode | string | – | This operation is not included in the free resource entitlement. Review paid pricing first. |
| volumeId | string | – | Optional: restore into this existing volume. |
| volumeName | string | – | Optional: name for a new volume to restore into. Omit volumeId and instanceId to restore into a new volume. |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| machine | – | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| source_mismatch | boolean | – | – |
| validation | – | – | – |
No examples provided.
scaffold_local Scaffold a local run (optional preflight) ~202
OPTIONAL preflight: returns a podman-compose.yml + .env so the user can run the app (and a throwaway local Postgres) on THEIR machine before deploying to redu - to see it run / sanity-check the container. Requires local podman/podman-compose. It's a suggestion, not a gate - skip it and go straight to deploy_app any time. Honest caveat: the local Postgres is NOT the managed Postgres, so a green local run does not prove the prod DB wiring.
| Name | Type | Req | Description |
|---|---|---|---|
| has_container | boolean | – | Repo already has a Dockerfile/Containerfile (the compose builds it). If false, write the plan_deploy-generated Dockerfile to ./Dockerfile first. |
| needs_postgres | boolean | – | Include a local Postgres container + wire PG* env. |
| port | integer | – | Port the app listens on. |
| runtime | string | yes | App runtime (node/python/go/…) - from plan_deploy. |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| caveats | array | – | – |
| commands | array | – | – |
| files | – | – | – |
| next | string | – | – |
No examples provided.
select_surface Rank a repo's deployable surfaces and pick the right one (deterministic) ~219
For a repo with SEVERAL runnable parts, call this BEFORE plan_deploy. You enumerate the candidate surfaces (find every Dockerfile/Containerfile, OPEN each, classify by its EXPOSE + CMD - never by directory name) and pass them in; redu RANKS them with fixed rules (a standalone browser desktop/noVNC > a self-contained web app > a keys-required playground > an API > a headless worker > docs/examples). GUIDED: returns the ranked list to present to the user, who picks. YOLO: auto-selects the TOP-ranked surface. Then run plan_deploy on the chosen surface's path + http_port. (A single-surface repo doesn't need this.)
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | Drive mode; omit to use the session's sticky mode. |
| surfaces | array | yes | EVERY runnable surface you found (run `find . -name Dockerfile -o -name Containerfile`, open each). Be exhaustive - a missed browser-desktop subdir is the #1 cause of a wrong pick. |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| chosen | – | – | – |
| mode | string | – | – |
| next | string | – | – |
| ranked | array | – | – |
No examples provided.
set_cluster_domain Point a custom production domain at a cluster ~542
Changes the PUBLIC HOSTNAME a cluster serves on, so the user can put THEIR OWN production domain (shop.acme.com, app.theircompany.com) in front of it instead of the auto-generated redu.cloud URL. That is what this tool is for: a real product on a real brand. The cluster itself is untouched - same members, same load balancer, same data - only the name in front of it changes. Pass stack_name + stack_id from list_clusters. TWO RULES, and getting either wrong wastes a call: (1) A CUSTOM DOMAIN MUST BE VERIFIED FIRST. Call get_domain_verification for the TXT record, have the user add it at their DNS provider, then call verify_domain until it reports verified (list_domains shows what is already verified). Binding an unverified domain is refused, on purpose: without proof of ownership anyone could bind, and obtain a certificate for, a hostname that is not theirs. Also make sure the domain's own DNS actually points at this cluster, or it will verify and still not serve. (2) A redu.cloud NAME CANNOT BE FREELY CHOSEN. The redu.cloud base domain is shared by every customer, so names under it always keep a short-id suffix - the real form is `<label>-<8chars>.redu.cloud`. Ask for a bare `myapp.redu.cloud` and you will NOT get it: the server normalises it and binds something else. If the first caller could pick any name under the shared domain, the good ones would all be gone. SO: the response carries `access_point`, the hostname the server ACTUALLY bound, which may differ from what you asked for. Report that value to the user and use it everywhere afterwards - never repeat your requested label back as if it were the URL. Finally, changing the hostname changes the URL: anything wired to the old one (OAuth callbacks, cookie domains, webhooks, an app told its own address) breaks until it is updated, so say so before you call this.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | The hostname to bind. Either your OWN production domain (e.g. shop.acme.com) - which must be verified FIRST, see the tool description - or a .redu.cloud label. A .redu.cloud value is NOT taken litera… |
| stack_id | string | yes | Cluster id, from list_clusters (the row's `id`). |
| stack_name | string | yes | Cluster stack name, from list_clusters (stack_name). |
| Name | Type | Req | Description |
|---|---|---|---|
| access_point | string | – | – |
| account_notices | array | – | – |
| domain | string | – | – |
| error | boolean | – | – |
| matched_request | boolean | – | – |
| mode | string | – | – |
| next | string | – | – |
| requested_domain | string | – | – |
| result | – | – | – |
| validation | – | – | – |
No examples provided.
set_managed_backups Enable/disable automated backups ~274
Turns nightly AUTOMATED (scheduled) backups ON or OFF for a MANAGED data service - the toggle that create_backup (a one-off volume snapshot) is NOT. Once enabled, redu's nightly job backs the service up on its own and prunes to the retention window; see them with list_backups and recover with the service's restore. Works for managed Postgres/MySQL/MariaDB/Redis/Qdrant/ClickHouse and can be flipped ANY time after provisioning, not only at create. Requires a card (automated backups are a paid feature; no-card trials cannot enable them). Pass the service type + its numeric id, enabled, and optional retention (days).
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | true = turn ON nightly AUTOMATED backups for this service; false = turn them off. |
| id | – | yes | Numeric id of the managed service (from list_databases / list_redis / list_relational_databases / etc.). |
| retention | integer | – | How many days of nightly backups to keep (optional; keeps the current setting if omitted). |
| service | string | yes | Which managed data-service type the id belongs to. A managed Postgres from create_database/list_databases is 'postgres'; MySQL/MariaDB from create_relational_database; plus redis/qdrant/clickhouse. |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| error | boolean | – | – |
| mode | string | – | – |
| next | string | – | – |
| result | – | – | – |
No examples provided.
update_cluster Update a cluster to a new version (in place) ~404
Updates a running autoscaling cluster to a new app version IN PLACE, with NO URL change: snapshots the 'hero' VM (the source/master VM you SSH into and change - it is also the always-on baseline member that serves traffic), then redu rolling-updates the autoscaled extra members to that snapshot ONE AT A TIME and refreshes the image the group boots future members from - the SAME load balancer and SAME *.redu.cloud URL are kept, and the service stays up during the roll. This is the ONLY way to update a cluster: you do NOT edit live members (they are disposable clones); you change the hero VM (SSH into it, deploy the new version), then update_cluster snapshots it and spreads it to the fleet (the hero already runs your change; this propagates it to the autoscaled members). It is low-disruption, not zero-downtime: measured, a rolling update failed about 2% of requests, in one short burst at each member swap, and never dropped below a majority of members. Never promise the user zero downtime. That holds ONLY if the app starts on every boot - a member whose app is launched by a first-boot-only script returns empty after replacement, never rejoins the pool, and the roll silently drains the cluster. The snapshot upload can take several minutes on a large disk; poll list_clusters until the stack status is UPDATE_COMPLETE.
| Name | Type | Req | Description |
|---|---|---|---|
| idempotency_key | string | – | – |
| instance_id | string | yes | The 'hero' VM to snapshot and roll to every extra member: the source/master VM you upgraded to a cluster and SSH into to make changes. It is your cluster's always-on baseline member. Its CURRENT disk… |
| stack_id | string | yes | Cluster stack id, from list_clusters (id). |
| stack_name | string | yes | Cluster stack name, from list_clusters (stack_name). |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| machine | – | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| source_mismatch | boolean | – | – |
| validation | – | – | – |
No examples provided.
upgrade_to_cluster Upgrade an instance to an autoscaling cluster ~2,818
THE WAY TO MAKE AN EXISTING APP HIGHLY AVAILABLE. If the user asks for high availability, redundancy, no single point of failure, surviving a host or VM failure, or 'stay up if a machine dies', this is the tool: point it at their running VM and pass high_availability:true. It needs no rebuild and no redeploy, and the URL does not change. Turns a single running instance into a horizontally-autoscaling cluster: snapshots the instance and puts your SOURCE VM behind a load balancer as its ALWAYS-ON BASELINE MEMBER, then an autoscaling group adds EXTRA members (booted from that snapshot) on CPU load and scales them back down to zero. FLAVOR - LEAD WITH A MEMORY-OPTIMIZED SMALL-DISK FLAVOR (m1.mem16/m1.mem32) for the cluster, and ideally have the SOURCE VM on one too: clustering snapshots the source VM's FULL disk, so DISK size (not RAM) drives how long the cluster takes to build and to add each member under load - a 40 GB mem flavor is several times faster to snapshot and scale than a 160 GB standard flavor (m1.xlarge) and costs less for the same RAM. If the source VM is on a big-disk flavor, RECOMMEND migrating the app onto a mem-flavor VM first (a root disk cannot be shrunk in place), even though it is extra work - it pays off on every scale-out, and a clustered app is stateless anyway (state in the managed DB) so the lean disk fits. Expect a DRASTICALLY better clustering experience on a mem flavor: far faster cluster-create, snapshots, and every scale-out. The user can override with any flavor. At rest ONLY your source VM serves - there is NO idle extra VM to pay for (the source VM is the cluster's minimum, so the floor is 0 extra members). Use it to LOAD-SCALE a stateless app tier while managed services hold state: it becomes highly-available UNDER LOAD (multiple members behind the LB), but at rest a SINGLE source VM serves - and that source VM is a plain VM, not an autoscaled member, so it is NOT auto-replaced if it fails while idle (only the autoscaled extra membe…
| Name | Type | Req | Description |
|---|---|---|---|
| app_profile | string | – | Set wordpress/woocommerce when upgrading an older deployment or raw VM that the backend has not profiled. WordPress/WooCommerce clusters require managed MySQL/MariaDB plus a media_space or explicitly… |
| auto_restructure | boolean | – | Instead of just refusing a stateful VM, have redu get its co-located database OFF the VM first, then cluster. For a single_vm Postgres (redu deployed it) the FULLY AUTOMATIC move is SWITCHED OFF by t… |
| cluster_media_mode | string | – | For WordPress/WooCommerce, use media_space as the default real cluster fix. local_uploads is refused because wp-content/uploads would diverge across members. |
| confirm_stateless | boolean | – | Override the stateful-VM safety refusal. redu REFUSES to cluster a VM that holds its own data (deployed with database:'single_vm' or a compose 'db' service) - a cluster clones the VM into members, so… |
| create_media_space | boolean | – | Set TRUE when upgrading a WordPress/WooCommerce deployment that has no media_space_id yet. Redu creates a small NFS media VM + volume, records it, and mounts it on all members. |
| dname | string | – | Optional public DNS name for the cluster's load-balancer access point (a .redu.cloud name is auto-generated if omitted). |
| flavor_id | string | yes | Member VM size - from list_flavors. Every autoscaling member uses this flavor. STRONGLY prefer m1.mem16/m1.mem32 (memory-optimized, 40 GB disk): clustering snapshots the source disk, so a lean disk m… |
| high_availability | boolean | – | Set TRUE whenever the user asks for HIGH AVAILABILITY, redundancy, 'no single point of failure', 'survive a host/node failure', or 'stay up if a VM dies'. This is the ONLY way to get an HA cluster an… |
| idempotency_key | string | – | – |
| instance_id | string | yes | The instance to turn into a cluster (from list_instances, or the VM of a deploy_app/deploy_compose deployment). It is snapshotted, and the autoscaling members are booted from that snapshot. |
| keypair_name | string | yes | SSH keypair name - from list_keypairs. |
| max_size | integer | – | Peak member count under load (default 5). In the default mode this is EXTRA members added on top of your always-on source VM, and the floor is 0 extra. With high_availability:true the group runs betw… |
| media_mount_path | string | – | Host mount path on cluster members. Redu mounts this into /var/www/html/wp-content/uploads for WordPress/WooCommerce. |
| media_origin_url | string | – | Public base URL where WordPress wp-content/uploads is served from the central media origin. This should be a separate media origin, not the DB VM. |
| media_space_flavor_id | string | – | Flavor id for the media VM when create_media_space:true. Defaults to the cluster member flavor. |
| media_space_id | integer | – | Existing Redu media space id to mount on every WordPress/WooCommerce cluster member. |
| media_space_name | string | – | Optional name for the media space when create_media_space:true. Defaults to <cluster-name>-media. |
| media_space_size_gb | integer | – | Media space data volume size in GB when create_media_space:true (default 20). |
| name | string | yes | Name for the cluster (lowercase letters, numbers, hyphens). |
| network_id | string | yes | Private network id - from list_private_networks. Use the SAME network the app's managed DB / other services are on, so members can reach them by private IP. |
| port | integer | – | Port the app listens on / the load balancer forwards to (default 80). Your source VM must actually serve on this port - the load balancer health-checks it. |
| provisioning_mode | string | – | This operation is not included in the free resource entitlement. Review paid pricing first. |
| restructure_db_flavor_id | string | – | Optional VM size for the provisioned managed database (from list_flavors). Defaults to the member flavor; pick a smaller one (e.g. m1.small) if the DB is light. |
| restructure_engine | string | – | For the ASSISTED path (a compose-stack database), which managed engine to provision. WordPress/WooCommerce = 'mysql' (or 'mariadb'). Required when auto_restructure is set and the DB runs inside the c… |
| scale_in_threshold | number | – | Average CPU fraction (0-1) below which a member is removed (default 0.2). |
| scale_out_threshold | number | – | Average CPU fraction (0-1) above which a member is added (default 0.7). |
| startup_command | string | – | Single-line shell command to (re)start the app on each fresh member if the snapshot's own services do not auto-start it. For a podman-compose app: 'cd /opt/app && podman-compose up -d'. Omit to rely… |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| machine | – | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| source_mismatch | boolean | – | – |
| validation | – | – | – |
No examples provided.
upgrade_to_ha Make an existing database highly available ~874
Turns an EXISTING, running single-machine managed Postgres or ClickHouse into a THREE-machine highly available cluster, in place, keeping the data and the same username, password and database name. Use this when the user has a live database and wants it to survive a machine or host failure: they do NOT have to create a new one and migrate by hand. How it works: a full backup is taken first (a safety copy while the upgrade runs, deleted when it ends: the old machine is never touched and stays the restore point), the cluster is built alongside, the data is copied in and verified by counting both sides, and only then does the database's address move to the load balancer. The original machine is left running and untouched throughout, so a failure changes nothing and the user is never without a database. SAY THREE THINGS TO THE USER AND GET A YES BEFORE CALLING: (1) COST, it becomes three machines behind a load balancer instead of one, so roughly 3x the hourly rate, and the old single machine keeps billing for 3 days, until it is removed automatically; (2) WRITE LOSS, anything written to the old machine during the copy is not carried over (see acknowledge_write_loss); (3) THEY MUST REPOINT THE APP afterwards, the connection address changes and nothing redeploys their app for them. Takes about 20 minutes and returns immediately; poll list_databases / list_clickhouse_databases until the address changes. Requires a payment method: high availability is not available on the no-card trial. ⛔ CLICKHOUSE ONLY, a FOURTH thing to say: after the upgrade every table has to use a REPLICATED engine. The existing tables are converted for them as part of the copy, but any NEW `CREATE TABLE ... ENGINE = MergeTree` is refused from then on (ClickHouse error 56) and has to be written `ENGINE = ReplicatedMergeTree`. It is refused rather than accepted because a plain MergeTree on three machines replicates its schema and not its rows, which would leave two of the three answering with an empty…
| Name | Type | Req | Description |
|---|---|---|---|
| acknowledge_write_loss | boolean | – | REQUIRED, and you must tell the user this in your own words and get a yes BEFORE you set it true. The upgrade copies the data while the old machine is still serving, so anything the application write… |
| flavor_id | string | – | Only needed for an old database whose build settings were not recorded; the API says so if it is missing. Otherwise the cluster reuses the machine size the database already has. |
| id | – | yes | Numeric id of the EXISTING single-machine database (from list_databases / list_clickhouse_databases). It must be status='ready'. |
| keypair_name | string | – | Only needed for an old database whose build settings were not recorded. |
| network_id | string | – | Only needed for an old database whose build settings were not recorded. Otherwise the cluster joins the same private network. |
| provisioning_mode | string | – | This operation is not included in the free resource entitlement. Review paid pricing first. |
| service | string | yes | Which managed database type the id belongs to. 'postgres' for one from create_database/list_databases; 'clickhouse' for one from create_clickhouse/list_clickhouse_databases. MySQL, MariaDB, Redis and… |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| error | boolean | – | – |
| mode | string | – | – |
| next | string | – | – |
| result | – | – | – |
No examples provided.
verify_deployment Re-check a deployment and update its status ~198
Asks redu to re-probe a deployment's public URL and update its status from what it actually observes. USE THIS AFTER YOU HAVE FIXED A FAILED DEPLOY - a deployment that ended 'error' or 'build_failed' but is now serving becomes 'ready' again, and you do NOT need to redeploy it to get a green status. Redeploying working infrastructure to clear a red flag wastes the user's money and throws away the fix. You cannot set the status yourself: this tool triggers a check, and the probe decides. Readiness means the URL answers with a non-5xx (401/403/404 count - they prove the app is answering), the same rule the deploy's own health gate uses. A deployment with no public URL (a headless worker) cannot be verified this way; use get_containers for its container state instead.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | Deployment id from list_deployments. |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| changed | boolean | – | – |
| id | number | – | – |
| message | string | – | – |
| next | string | – | – |
| previous_status | string | – | – |
| probe | – | – | – |
| ready_at | string | – | – |
| ready_signal | string | – | – |
| status | string | – | – |
No examples provided.
verify_domain Verify custom domain ~181
Checks the DNS TXT ownership record of a custom domain and, when it matches, marks the domain verified for this account. Call get_domain_verification first for the record, have the user add it at their DNS provider, then call this until it reports verified (a new record can take minutes, sometimes hours, to show). A verified domain can be bound: dname on deploy_app/deploy_compose, dns_entries on create_instance, or set_cluster_domain. A pending claim's TXT value can change (values are specific to each account), so add exactly the value get_domain_verification returns now, never one saved earlier or seen on another account; if verify_domain keeps failing, call get_domain_verification again and update the record when the value differs.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | The custom domain to verify ownership of (e.g. app.example.com). |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| domain | string | – | – |
| mode | string | – | – |
| next | string | – | – |
| result | – | – | – |
| status | string | – | – |
| verified | boolean | – | – |
| verified_at | string|null | – | – |
No examples provided.
wait_for_deployment Wait for a deployment to finish, and get the evidence in one answer ~309
⭐ CALL THIS INSTEAD OF POLLING. Waits up to 50 seconds per call (an MCP client cuts a call at about 60 s) for the deployment to reach a TERMINAL state (ready, build_failed, error or vm_missing) and returns, in ONE response, everything you would otherwise fetch afterwards: the HTTP status of the PUBLIC url (not the VM's private interface, which can answer 401 while the public path still 502s), the container table with health and restarts, the host's memory/disk/load, and the .env KEY NAMES. Do NOT loop on get_deployment: that is 8-9 round trips per deploy that learn nothing, and then three more asking for what this already returned. ⚠️ A TIMEOUT IS NOT A FAILURE: if it returns timed_out:true the build is simply still running, so call it again (a typical deploy takes 2 to 5 calls). Only status decides success. On build_failed or error, call get_deployment(id) for the full build_log, which is the diagnosis.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | Deployment id, from the deploy call or list_deployments. |
| timeout_s | integer | – | Seconds to wait in this call before returning timed_out:true: at most 50 (the default); a larger value waits 50, because an MCP client cuts a call at about 60 s (ROADMAP 7). Call again until it is te… |
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| deployment | – | – | – |
| evidence | – | – | – |
| next | string | – | – |
| note | string | – | – |
| terminal | boolean | – | – |
| timed_out | boolean | – | – |
| waited_seconds | number | – | – |
No examples provided.
whoami Who am I ~54
Verifies your redu.cloud credential with a REAL server round-trip and returns your identity + live quota. A green result means the key actually works - not merely that one is configured. Use this first if anything is 401ing.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| account_notices | array | – | – |
| auth_type | string | – | – |
| next | string | – | – |
| quota | – | – | – |
| user | – | – | – |
| verified | boolean | – | – |
No examples provided.
How do I install the cloud.redu/mcp server?
cloud.redu/mcp is a hosted endpoint at https://mcp.redu.cloud/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.redu.cloud
claude mcp add --transport http cloud-redu-mcp 'https://mcp.redu.cloud/mcp'
What is the cloud.redu/mcp server?
cloud.redu/mcp is listed in the public MCP registry as cloud.redu/mcp. Agent-native cloud, EU-hosted. Provision VMs, networks & databases on redu.cloud via MCP. This page covers its hosted endpoint (https://mcp.redu.cloud/mcp).
Is the cloud.redu/mcp server safe to use?
cloud.redu/mcp scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the cloud.redu/mcp server expose?
cloud.redu/mcp exposes 107 tools: get_private_vps_pilot, create_private_vps, delete_private_vps, exec_private_vps, get_private_vps_ssh, and 102 more. Their descriptions and schemas cost roughly 31,257 tokens of context every time the server is loaded.
Does the cloud.redu/mcp server require authentication?
Yes. cloud.redu/mcp asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the cloud.redu/mcp server still maintained?
cloud.redu/mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.