cloud.redu/mcp
REMOTE · MCP.REDU.CLOUD · SCANNED SEP 20
Agent-native cloud, EU-hosted. Provision VMs, networks & databases on redu.cloud via MCP.
Available components
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 Usability61
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 27275 tokens (~336/item across 81 items; 81 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 Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage97
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 88% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety96
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 14 of 17 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 82 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
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'
{
"mcpServers": {
"cloud-redu-mcp": {
"url": "https://mcp.redu.cloud/mcp"
}
}
} {
"servers": {
"cloud-redu-mcp": {
"type": "http",
"url": "https://mcp.redu.cloud/mcp"
}
}
} [mcp_servers.cloud-redu-mcp] url = "https://mcp.redu.cloud/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cloud-redu-mcp": {
"type": "remote",
"url": "https://mcp.redu.cloud/mcp",
"enabled": true
}
}
} openclaw mcp add cloud-redu-mcp --url 'https://mcp.redu.cloud/mcp' --transport streamable-http
mcp_servers:
cloud-redu-mcp:
url: "https://mcp.redu.cloud/mcp" {
"McpServers": {
"cloud-redu-mcp": {
"Transport": "http",
"Url": "https://mcp.redu.cloud/mcp"
}
}
} assistant mcp add cloud-redu-mcp -t streamable-http -u 'https://mcp.redu.cloud/mcp'
{
"mcpServers": {
"cloud-redu-mcp": {
"type": "http",
"url": "https://mcp.redu.cloud/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
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.
- 16 Sept 26 0
- Stability: 0.97 → pass security
- 15 Sept 26 0
- Stability: pass → 0.97 functional
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Aug 26 +1
- Stability: 0.97 → pass security
- 24 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Aug 26 88
- Tool “plan_deploy” rewrote its description, which is the text the model reads security
- New tool “wait_for_deployment” functional
- “plan_deploy” added an optional parameter “source_token” cosmetic
- “get_deployment” reworded the description of “redu_md” cosmetic
- “plan_deploy” reworded the description of “redu_md” cosmetic
- 21 Aug 26 0
- New tool “verify_deployment” functional
- 19 Aug 26 0
- Tool “get_ssh_command” rewrote its description, which is the text the model reads security
- “get_ssh_command” reworded the description of “instance_id” 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 20 Sept 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 | 6 Aug 2026 | 4 Nov 2026 | ECDSA 384 | ECDSA-SHA384 | 606fedbc02b5d8b84f5612d390aeb9b8245 |
| 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"
Bearer resource_metadata="https://mcp.redu.cloud/.well-known/oauth-protected-resource", scope="openid" | 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 →
get_container_logs Application logs from a deployment's containers ~322
THE APPLICATION'S OWN LOGS - what `docker logs`/`podman logs` would show for each container in a deployment. This is the tool for 'it deployed fine but it does not work': a 500, a crash loop, a failed DB connection, a missing env var all announce themselves here and NOWHERE else. ⛔ DO NOT use get_instance_logs for this. That returns the VM's SERIAL CONSOLE (kernel messages and cloud-init), which answers a question nobody debugging an app has - and on this platform it goes permanently silent once the machine finishes booting. build_log does not contain runtime output either; it stops when the build does. Default depth answers instantly from the VM's last report; a bigger `tail` or any `since` asks the VM for a fresh pull and takes up to ~15s. Secret-shaped values (PASSWORD=, TOKEN=, API_KEY=) are redacted in transit.
| Name | Type | Req | Description |
|---|---|---|---|
| deployment_id | string | yes | A deployment's id, name, or instance_id - all three resolve. |
| service | string | – | Container/service name (substring matches). Omit for every container the VM reports. Get exact names from get_containers. |
| since | string | – | Only logs newer than this, e.g. '30m', '2h', '7d'. Always triggers a fresh pull from the VM. |
| tail | integer | – | Lines per container (default 120). Over 120 asks the VM for a fresh pull, which takes up to ~15s. |
| Name | Type | Req | Description |
|---|---|---|---|
| age_seconds | number | – | – |
| available_services | – | – | – |
| hint | string | – | – |
| logs | – | – | – |
| measured | boolean | – | – |
| message | string | – | – |
| reason | string | – | – |
| source | string | – | – |
No examples provided.
get_containers Containers running for a deployment ~253
WHAT IS ACTUALLY RUNNING on a deployment's VM: every container's name, image, state, health, restart count, exit code and published ports - including the ones that have CRASHED, which are the ones you need. Use this the moment a deployment says 'ready' but the URL misbehaves, and before you reach for SSH. get_deployment returns the deployment ROW (status, URL, build log); it cannot see inside the VM, so a stack where one of five services is restarting looks identical to a healthy one there. This is that missing view. It answers from the VM's own report (every 15s), so it costs no SSH round trip. If the VM has never reported, it SAYS SO rather than returning an empty list - 'no containers' and 'I cannot see' are different answers and only one of them means your app is broken. ⚠️ For a deployment that has been turned into a CLUSTER, this describes the original source VM only; autoscaled members are deliberately silent, so use list_clusters for member-level state.
| Name | Type | Req | Description |
|---|---|---|---|
| deployment_id | string | yes | A deployment's id, name, or instance_id - all three resolve. |
| Name | Type | Req | Description |
|---|---|---|---|
| age_seconds | number | – | – |
| containers | – | – | – |
| deployment | – | – | – |
| engine | string | – | – |
| hint | string | – | – |
| measured | boolean | – | – |
| message | string | – | – |
| reason | string | – | – |
| stale | boolean | – | – |
No examples provided.
get_deployment Get a deployment (status + build log + reality report) ~440
Fetches ONE deployment by its numeric id (from list_deployments). Returns its current status, the public access_point URL, the underlying VM id, AND the build_log - IN FULL when status is 'build_failed' or 'error', which is when it is the diagnosis and you should read it; otherwise the LAST 40 LINES only, with build_log_truncated:true and build_log_total_lines so you can tell a short build from a shortened log. A ready deployment's log is not worth the tokens and used to make this response exceed the caller's output limit. Also returns a reality report_markdown showing the REAL provisioned size + cost (the plan was only an estimate; the user may have up-sized).
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | Deployment id from list_deployments. |
| redu_md | string | – | ⭐ USUALLY UNNECESSARY NOW: if you POST your current redu.md to the `redu_md_post_url` this tool returns (`curl -fsS --data-binary @redu.md <url>`), redu merges against that and you never paste the fi… |
| Name | Type | Req | Description |
|---|---|---|---|
| build_log | string|null | – | – |
| build_log_total_lines | number | – | – |
| build_log_truncated | boolean | – | – |
| deployment | – | – | – |
| failure_analysis | – | – | – |
| mode | string | – | – |
| next | string | – | – |
| redu_md_bootstrap_markdown | string | – | – |
| redu_md_deploy_log_line | string | – | – |
| redu_md_filename | string | – | – |
| redu_md_last_deploy_block | string | – | – |
| redu_md_markdown | string | – | – |
| redu_md_merge_blocked | boolean | – | – |
| redu_md_merge_lost | array | – | – |
| redu_md_merge_mode | string | – | – |
| redu_md_merged_url | string | – | – |
| redu_md_omitted_bytes | number | – | – |
| redu_md_post_url | string | – | – |
| report_markdown | string | – | – |
No examples provided.
get_domain_verification Get domain verification TXT record ~57
Returns the DNS TXT record to add for custom domain ownership verification. Add the record to your DNS provider, then call verify_domain.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | The custom domain to verify ownership of (e.g. app.example.com). |
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | – |
No examples provided.
get_env_keys Environment variable NAMES on a deployment's VM ~222
WHICH ENVIRONMENT VARIABLES the deployment was actually given, BY NAME - the keys in the env files on the VM (/opt/app-src/.env and friends), never the values. Most of the time the real question is 'did DATABASE_URL get wired, or is the app reading a name I did not set', and the name answers it: you can confirm the DB was connected, spot a typo'd key, and see which of the app's documented variables are missing, without touching a secret. ⛔ VALUES ARE NOT AVAILABLE HERE AND WILL NOT BE. They never leave the VM. If you genuinely need one (a generated admin password, say), SSH in with get_ssh_command and read that single key: `sudo grep '^KEY=' /opt/app-src/.env`. The file is chmod 600 root:root, so it needs sudo. Also reports each file's permission mode, which is how you catch a world-readable env file.
| Name | Type | Req | Description |
|---|---|---|---|
| deployment_id | string | yes | A deployment's id, name, or instance_id - all three resolve. |
| Name | Type | Req | Description |
|---|---|---|---|
| age_seconds | number | – | – |
| env_files | – | – | – |
| measured | boolean | – | – |
| message | string | – | – |
| reason | string | – | – |
No examples provided.
get_instance_logs Get instance logs ~157
The VM's SERIAL CONSOLE: kernel messages and early-boot/cloud-init output. ⛔ THIS IS NOT YOUR APPLICATION'S LOGS. For a deployed app - a crash loop, a 500, a failed DB connection - use get_container_logs, which returns what the containers actually printed. Reach for this one only for boot-level questions: the machine never came up, the disk did not mount, cloud-init failed before the app existed. Note that on this platform the console goes silent once a machine is past early boot, so an empty result here says nothing about a running VM.
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | ID of the instance to fetch BOOT/console logs for. For app logs use get_container_logs instead. |
| Name | Type | Req | Description |
|---|---|---|---|
| logs | – | – | – |
| mode | string | – | – |
No examples provided.
get_resource_usage Memory, disk and CPU on a deployment's VM ~201
HOW MUCH ROOM IS LEFT on a deployment's VM: total/used/available memory, swap, disk free, load average, CPU count, and OOM kills in the last 24h - plus per-container memory and CPU. Use it to answer 'is this flavor big enough', to size the NEXT deploy of the same app honestly instead of guessing, and to explain a container that keeps dying (an OOM kill leaves no application log at all - the process is shot, so the only trace is the kernel's, and that is why oom_kills_24h is here). A full disk presents as a dozen unrelated failures and is the first thing to rule out. Every one of 34 measured deploy runs got these numbers by SSHing in and running free/df/docker stats; this is the same data with no round trip.
| Name | Type | Req | Description |
|---|---|---|---|
| deployment_id | string | yes | A deployment's id, name, or instance_id - all three resolve. |
| Name | Type | Req | Description |
|---|---|---|---|
| age_seconds | number | – | – |
| containers | – | – | – |
| host | – | – | – |
| measured | boolean | – | – |
| message | string | – | – |
| reason | string | – | – |
No examples provided.
get_ssh_command Get SSH command for instance ~392
Returns the SSH command to connect to an instance via the redu.cloud TCP proxy. ACCEPTS an instance id, a deployment's id / name / instance_id, OR a MANAGED DATASTORE's id / name / instance_id (Postgres, MySQL/MariaDB, ClickHouse, Redis) - it resolves all of them, so you do not have to work out which one you are holding (a deployment's instance_id is a placeholder until provisioning finishes, and passing it used to fail). ⭐ SSH TO THE DATASTORE VM IS HOW YOU REACH A PRIVATE-NETWORK-ONLY DATABASE BEFORE ANY APP VM EXISTS: the datastore's own VM is SSH-reachable and ships the client on PATH (psql at /usr/bin/psql), so you can apply a schema or rotate a seeded admin account without an app VM to tunnel through. For a DEPLOYMENT VM (created by deploy_app/deploy_compose) pass keypair_name — read it from get_deployment — so the command uses `-i ~/.ssh/<keypair_name>` and authenticates with the RIGHT key instead of your default identity (without it, SSH to a deploy VM usually fails). The tool also best-effort looks up the keypair from the deployment if you omit it. Example: ssh -i ~/.ssh/redu-deploy -o IdentitiesOnly=yes -p 22011 ubuntu@myinstance-abc12345.redu.cloud
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | An instance id, a deployment's id / name / instance_id, or a managed datastore's id / name / instance_id. All are resolved. |
| keypair_name | string | – | The SSH keypair the instance was created with (read it from get_deployment for a deploy VM). When given, the command uses `-i ~/.ssh/<keypair_name>` so it authenticates with the right key. |
| Name | Type | Req | Description |
|---|---|---|---|
| floating_ip | string | – | – |
| host | string | – | – |
| instance_name | string | – | – |
| instance_status | string | – | – |
| keypair_name | string | – | – |
| mode | string | – | – |
| port | string | – | – |
| ssh_command | string | – | – |
| user | string | – | – |
No examples provided.
import_keypair Import SSH keypair ~97
Registers an existing SSH public key on your account. Use this to import your own public key so you can SSH into instances. The private key never leaves your machine.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name for the keypair (e.g. 'my-laptop'). Must be unique on your account. |
| public_key | string | yes | SSH public key to import (the contents of your id_rsa.pub or id_ed25519.pub). |
| Name | Type | Req | Description |
|---|---|---|---|
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| validation | – | – | – |
No examples provided.
instance_action Instance action (start/stop/reboot) ~50
Start, stop, or reboot an instance. action must be START, STOP, REBOOT_SOFT, or REBOOT_HARD.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| instanceId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| validation | – | – | – |
No examples provided.
integrate_overview How to add a redu capability to an app you deployed (start here) ~121
Orientation for wiring a redu.cloud capability (backups, DNS, extra storage, a managed DB, ...) INTO an app already deployed on redu, e.g. 'add a backup feature to the Supabase I deployed on redu'. Explains the pattern: mint a LEAST-PRIVILEGE scoped API key (with the user's approval via create_api_key), inject it into the app, and call the redu API from the app. Call this when a user asks to add/integrate a redu feature into a running deployment and you are unsure how.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| next | string | – | – |
| pattern | array | – | – |
| recipes | – | – | – |
| scopes_hint | string | – | – |
No examples provided.
list_backups List backups ~14
Lists your volume backups.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| backups | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_clickhouse_databases List managed ClickHouse ~66
Lists your managed ClickHouse databases (OLAP / analytics — its own resource, not a relational DB). Once a row's status is 'ready' it carries the private-network connection details (private_ip, ClickHouse HTTP port 8123, db_name, db_user).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| clickhouse | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_clusters List clusters ~14
Lists your autoscaling clusters.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| clusters | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_databases List managed Postgres ~47
Lists your managed PostgreSQL databases. Once a row's status is 'ready', it carries the private-network connection details (private_ip, port 5432, db_name, db_user).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| databases | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_deployments List deployments ~62
Lists your app deployments. Each row carries status (provisioning/ready/build_failed/error), the current build phase while provisioning (installing/source/building/built/starting), the public access_point URL, port, repo, and build_log on failure.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| deployments | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_dns_entries List DNS entries ~15
Lists DNS proxy host entries.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| dns | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_domains List verified domains ~17
Lists custom domains you have verified ownership of.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| domains | array | – | – |
| mode | string | – | – |
| next | string | – | – |
No examples provided.
list_flavors List flavors ~14
Lists available instance sizes.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| mode | string | – | – |
| networks | array | – | – |
| next | string | – | – |
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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| mode | string | – | – |
| next | string | – | – |
| relational_databases | 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| mode | string | – | – |
| next | string | – | – |
| volumes | array | – | – |
No examples provided.
plan_deploy Plan an app deployment ~3,243
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 | – | guided (default) = ONE approval gate: the user approves the plan, then you proceed with the plan's defaults WITHOUT further sub-questions. yolo = auto-proceed end to end without stopping to ask, usin… |
| 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… |
| 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. |
| 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… |
| 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 |
|---|---|---|---|
| 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 | – | – |
| report_filename | string | – | – |
| report_markdown | string | – | – |
| source_files_error | string|null | – | – |
| source_files_read | – | – | – |
No examples provided.
plan_instance Plan instance (guided options) ~79
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 |
|---|---|---|---|
| osHint | string | – | – |
| sizeHint | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | – |
| options | – | – | – |
No examples provided.
plan_managed_datastore Plan managed datastore ~251
Plans a direct managed datastore create without provisioning anything. Use this before create_database, create_relational_database, create_redis, or create_clickhouse. For app deployments, prefer deploy_app database:'managed' so plan_deploy includes and wires the datastore automatically. 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… |
| sizeHint | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | – |
| next | string | – | – |
| notes | array | – | – |
| options | – | – | – |
| suggested | – | – | – |
No examples provided.
prepare_upload Prepare an upload-mode deploy (local tar + upload commands) ~192
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 (tar only tracked + non-ignored files). |
| project_dir | string | – | Path to the local app directory to upload (default current dir). |
| Name | Type | Req | Description |
|---|---|---|---|
| commands | array | – | – |
| endpoint | string | – | – |
| excludes | array | – | – |
| next | string | – | – |
No examples provided.
restore_backup Restore backup ~258
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. |
| 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 |
|---|---|---|---|
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| 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 |
|---|---|---|---|
| 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 |
|---|---|---|---|
| chosen | – | – | – |
| mode | string | – | – |
| next | string | – | – |
| ranked | array | – | – |
No examples provided.
set_cluster_domain Point a custom production domain at a cluster ~514
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. 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`). |
| Name | Type | Req | Description |
|---|---|---|---|
| access_point | string | – | – |
| 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 |
|---|---|---|---|
| error | boolean | – | – |
| mode | string | – | – |
| next | string | – | – |
| result | – | – | – |
No examples provided.
setup_agent_fleet Set up autocoding agent fleet (one shot) ~501
Complete one-shot setup: validates prerequisites, creates a controller VM + worker VMs, auto-creates a public HTTPS URL on port 7070, seeds a starter ROADMAP.md into the repo if absent, and returns the trigger token. Call this when a user says 'set up autocoding agents for my repo' or 'I want agents to work on my codebase'. HOW THE AGENT WORKS: each worker runs Claude Code inside the repo, implements one task, runs the test suite, and opens a pull request. It excels at focused, single-PR, testable units of work — add an endpoint, write tests for a module, fix a specific bug, add a UI page — and is poor at vague/large tasks, design decisions, or anything needing external credentials. TASK FORMAT (strict, one line each): `- [ ] **Title** — short description *(agent-ready)*` — the `- [ ]` checkbox, `**bold title**`, ` — ` separator, and `*(agent-ready)*` are ALL required; `##` headings and plain bullets are ignored. After this returns, the user needs to: (1) authorize the fleet by running the authorize.sh one-liner it returns (it runs `claude setup-token` for a long-lived token installed on the controller) — agents use the user's existing Claude Max/Pro subscription, NOT an API key. This is a shell command the USER runs in their own terminal; do NOT try to read or push the user's credentials yourself. The controller takes ~7 min to boot, so PREFER to poll get_agent_status until it reports the controller is reachable and present the authorize command only once it's ready — that way the user doesn't run it into a long wait. (The command also waits on its own, showing a live progress counter, so a user who runs it early is fine too.) (2) add well-scoped tasks in the format above to ROADMAP.md; (3) call trigger_agent_batch.
| Name | Type | Req | Description |
|---|---|---|---|
| github_pat | string | yes | GitHub Personal Access Token with repo + workflow scopes. Used to clone the repo and open PRs. |
| repo | string | yes | GitHub repo to run agents on, e.g. 'owner/my-app'. Must be accessible with the PAT. |
| worker_count | integer | – | Number of parallel worker VMs (default 3). Each works on a separate task simultaneously. |
| Name | Type | Req | Description |
|---|---|---|---|
| authorize_command | string | – | – |
| controller_host | string | – | – |
| controller_url | string | – | – |
| fleet_id | string | – | – |
| instance_id | string | – | – |
| log_token | string | – | – |
| mode | string | – | – |
| next_steps | array | – | – |
| repo | string | – | – |
| ssh_key_name | string | – | – |
| ssh_private_key | string | – | – |
| ssh_user | string | – | – |
| trigger_token | string | – | – |
| worker_ids | array | – | – |
No examples provided.
setup_agent_session Full guided agent setup ~92
One-shot tool that guides you through the complete agent setup: checks prerequisites, creates the controller VM, and returns next steps. Ideal for first-time setup. Call this when a user says 'set up autocoding agents for my repo'.
| Name | Type | Req | Description |
|---|---|---|---|
| github_pat | string | yes | GitHub Personal Access Token (repo + workflow scopes) |
| repo | string | yes | GitHub repo, e.g. 'owner/repo' |
| Name | Type | Req | Description |
|---|---|---|---|
| next_tool | string | – | – |
| ready | boolean | – | – |
| repo | string | – | – |
No examples provided.
trigger_agent_batch Trigger autocoding agent batch ~167
Starts the autonomous agent batch on your controller VM. Agents read agent-ready tasks from your ROADMAP.md, implement them in parallel, and open PRs. No VPN needed — runs over HTTPS; the controller stays running after you disconnect. Each ROADMAP task MUST be a single checkbox line `- [ ] **Title** — short description *(agent-ready)*` (the `- [ ]`, `**bold title**`, and `*(agent-ready)*` are all required; `##` headings and plain bullets are ignored). If this returns 'No agent-ready tasks', the tasks are mis-formatted — fix them to that exact format and retry.
| Name | Type | Req | Description |
|---|---|---|---|
| controller_url | string | yes | HTTPS URL of your controller VM |
| trigger_token | string | yes | Trigger token from the controller |
| Name | Type | Req | Description |
|---|---|---|---|
| finalize_note | string | – | – |
| fleet_id | string | – | – |
| message | string | – | – |
| ok | boolean | – | – |
| workers_ready | boolean | – | – |
No examples provided.
update_cluster Update a cluster to a new version (in place) ~393
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). Zero-downtime is measured, not aspirational: a full roll of every member of a 3-member cluster served 699/699 requests with no failures and never dropped below a majority. 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 |
|---|---|---|---|
| available_keypairs | array | – | – |
| duplicate | boolean | – | – |
| error | boolean | – | – |
| idempotency_key | string | – | – |
| invalid_keypair_name | boolean | – | – |
| mode | string | – | – |
| needs_keypair | boolean | – | – |
| needs_keypair_name | boolean | – | – |
| needs_plan | boolean | – | – |
| next | string | – | – |
| plan_tool | string | – | – |
| request | – | – | – |
| result | – | – | – |
| validation | – | – | – |
No examples provided.
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 90 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 81 tools: whoami, check_deploy_prerequisites, deploy_overview, create_api_key, integrate_overview, and 76 more. Their descriptions and schemas cost roughly 24,169 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 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.