Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

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

0 this week 90 Trust /100
Trust breakdown (7 categories)

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
Transport & Reachability100
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
Install

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

# add to Claude Code
claude mcp add --transport http cloud-redu-mcp 'https://mcp.redu.cloud/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cloud-redu-mcp": {
      "url": "https://mcp.redu.cloud/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cloud-redu-mcp": {
      "type": "http",
      "url": "https://mcp.redu.cloud/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cloud-redu-mcp]
url = "https://mcp.redu.cloud/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cloud-redu-mcp": {
      "type": "remote",
      "url": "https://mcp.redu.cloud/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cloud-redu-mcp --url 'https://mcp.redu.cloud/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cloud-redu-mcp:
    url: "https://mcp.redu.cloud/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cloud-redu-mcp": {
      "Transport": "http",
      "Url": "https://mcp.redu.cloud/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cloud-redu-mcp -t streamable-http -u 'https://mcp.redu.cloud/mcp'
// mcp.json
{
  "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.

Changelog

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
Diagnostics

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
MCP tools · 81 exposed · ~24,169 tokens

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 →

Tool Tokens
get_container_logs ~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.

NameTypeReqDescription
deployment_idstringyesA deployment's id, name, or instance_id - all three resolve.
servicestringContainer/service name (substring matches). Omit for every container the VM reports. Get exact names from get_containers.
sincestringOnly logs newer than this, e.g. '30m', '2h', '7d'. Always triggers a fresh pull from the VM.
tailintegerLines per container (default 120). Over 120 asks the VM for a fresh pull, which takes up to ~15s.
NameTypeReqDescription
age_secondsnumber
available_services
hintstring
logs
measuredboolean
messagestring
reasonstring
sourcestring

No examples provided.

get_containers ~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.

NameTypeReqDescription
deployment_idstringyesA deployment's id, name, or instance_id - all three resolve.
NameTypeReqDescription
age_secondsnumber
containers
deployment
enginestring
hintstring
measuredboolean
messagestring
reasonstring
staleboolean

No examples provided.

get_deployment ~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).

NameTypeReqDescription
idintegeryesDeployment id from list_deployments.
redu_mdstring⭐ 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…
NameTypeReqDescription
build_logstring|null
build_log_total_linesnumber
build_log_truncatedboolean
deployment
failure_analysis
modestring
nextstring
redu_md_bootstrap_markdownstring
redu_md_deploy_log_linestring
redu_md_filenamestring
redu_md_last_deploy_blockstring
redu_md_markdownstring
redu_md_merge_blockedboolean
redu_md_merge_lostarray
redu_md_merge_modestring
redu_md_merged_urlstring
redu_md_omitted_bytesnumber
redu_md_post_urlstring
report_markdownstring

No examples provided.

get_domain_verification ~57

Returns the DNS TXT record to add for custom domain ownership verification. Add the record to your DNS provider, then call verify_domain.

NameTypeReqDescription
domainstringyesThe custom domain to verify ownership of (e.g. app.example.com).
NameTypeReqDescription
modestring

No examples provided.

get_env_keys ~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.

NameTypeReqDescription
deployment_idstringyesA deployment's id, name, or instance_id - all three resolve.
NameTypeReqDescription
age_secondsnumber
env_files
measuredboolean
messagestring
reasonstring

No examples provided.

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.

NameTypeReqDescription
instance_idstringyesID of the instance to fetch BOOT/console logs for. For app logs use get_container_logs instead.
NameTypeReqDescription
logs
modestring

No examples provided.

get_resource_usage ~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.

NameTypeReqDescription
deployment_idstringyesA deployment's id, name, or instance_id - all three resolve.
NameTypeReqDescription
age_secondsnumber
containers
host
measuredboolean
messagestring
reasonstring

No examples provided.

get_ssh_command ~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

NameTypeReqDescription
instance_idstringyesAn instance id, a deployment's id / name / instance_id, or a managed datastore's id / name / instance_id. All are resolved.
keypair_namestringThe 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.
NameTypeReqDescription
floating_ipstring
hoststring
instance_namestring
instance_statusstring
keypair_namestring
modestring
portstring
ssh_commandstring
userstring

No examples provided.

import_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.

NameTypeReqDescription
namestringyesName for the keypair (e.g. 'my-laptop'). Must be unique on your account.
public_keystringyesSSH public key to import (the contents of your id_rsa.pub or id_ed25519.pub).
NameTypeReqDescription
available_keypairsarray
duplicateboolean
errorboolean
idempotency_keystring
invalid_keypair_nameboolean
modestring
needs_keypairboolean
needs_keypair_nameboolean
needs_planboolean
nextstring
plan_toolstring
request
result
validation

No examples provided.

instance_action ~50

Start, stop, or reboot an instance. action must be START, STOP, REBOOT_SOFT, or REBOOT_HARD.

NameTypeReqDescription
actionstringyes
instanceIdstringyes
NameTypeReqDescription
available_keypairsarray
duplicateboolean
errorboolean
idempotency_keystring
invalid_keypair_nameboolean
modestring
needs_keypairboolean
needs_keypair_nameboolean
needs_planboolean
nextstring
plan_toolstring
request
result
validation

No examples provided.

integrate_overview ~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.

NameTypeReqDescription
nextstring
patternarray
recipes
scopes_hintstring

No examples provided.

list_backups ~14

Lists your volume backups.

Input schema present but exposes no named parameters.

NameTypeReqDescription
backupsarray
modestring
nextstring

No examples provided.

list_clickhouse_databases ~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.

NameTypeReqDescription
clickhousearray
modestring
nextstring

No examples provided.

list_clusters ~14

Lists your autoscaling clusters.

Input schema present but exposes no named parameters.

NameTypeReqDescription
clustersarray
modestring
nextstring

No examples provided.

list_databases ~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.

NameTypeReqDescription
databasesarray
modestring
nextstring

No examples provided.

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.

NameTypeReqDescription
deploymentsarray
modestring
nextstring

No examples provided.

list_dns_entries ~15

Lists DNS proxy host entries.

Input schema present but exposes no named parameters.

NameTypeReqDescription
dnsarray
modestring
nextstring

No examples provided.

list_domains ~17

Lists custom domains you have verified ownership of.

Input schema present but exposes no named parameters.

NameTypeReqDescription
domainsarray
modestring
nextstring

No examples provided.

list_flavors ~14

Lists available instance sizes.

Input schema present but exposes no named parameters.

NameTypeReqDescription
flavorsarray
modestring
nextstring

No examples provided.

list_images ~13

Lists available OS images.

Input schema present but exposes no named parameters.

NameTypeReqDescription
imagesarray
modestring
nextstring

No examples provided.

list_instances ~13

Lists your compute instances.

Input schema present but exposes no named parameters.

NameTypeReqDescription
instancesarray
modestring
nextstring

No examples provided.

list_keypairs ~27

Lists your SSH keypairs. If empty, call import_keypair first before creating instances.

Input schema present but exposes no named parameters.

NameTypeReqDescription
keypairsarray
modestring
nextstring

No examples provided.

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.

NameTypeReqDescription
media_spacesarray
modestring
nextstring

No examples provided.

list_private_networks ~15

Lists your private networks.

Input schema present but exposes no named parameters.

NameTypeReqDescription
modestring
networksarray
nextstring

No examples provided.

list_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.

NameTypeReqDescription
modestring
nextstring
redisarray

No examples provided.

list_regions ~12

Lists available regions.

Input schema present but exposes no named parameters.

NameTypeReqDescription
modestring
nextstring
regionsarray

No examples provided.

list_relational_databases ~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.

NameTypeReqDescription
modestring
nextstring
relational_databasesarray

No examples provided.

list_security_groups ~14

Lists your security groups.

Input schema present but exposes no named parameters.

NameTypeReqDescription
modestring
nextstring
security_groupsarray

No examples provided.

list_snapshots ~14

Lists your instance snapshots.

Input schema present but exposes no named parameters.

NameTypeReqDescription
modestring
nextstring
snapshotsarray

No examples provided.

list_volumes ~15

Lists your block storage volumes.

Input schema present but exposes no named parameters.

NameTypeReqDescription
modestring
nextstring
volumesarray

No examples provided.

plan_deploy ~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…

NameTypeReqDescription
app_flavorstringPreferred app VM size (default m1.medium). Resolved against the real flavor list.
app_profilestringDetected 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_flavorstringPreferred 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_modestringFor 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_targetbooleanSet 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_yamlstringPASTE 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_…
containerizablebooleanWhether 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_spacebooleanFor 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_enginestringManaged DB engine to plan. For WordPress/WooCommerce clusters use mariadb or mysql.
db_flavorstringPreferred managed Postgres VM size (default m1.small). Resolved against the real flavor list.
deploy_modestringguided (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…
dockerfilestringPASTE 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_containerbooleanWhether the repo already has a Dockerfile / compose file.
heavy_buildbooleanSet 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_pathstringHost mount path on app members for the shared uploads filesystem. Redu mounts this into /var/www/html/wp-content/uploads.
media_origin_urlstringPublic 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_flavorstringPreferred media VM size when create_media_space:true. Resolved against list_flavors.
media_space_idintegerExisting 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_gbintegerSize of the media space data volume in GB when create_media_space:true.
memory_heavybooleanSet 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_clickhousebooleanApp 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_composebooleanSet 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_postgresbooleanApp uses Postgres (deps pg/prisma/sqlalchemy/drizzle or DATABASE_URL).
needs_redisbooleanApp uses Redis (deps redis/ioredis/bullmq/celery or REDIS_URL).
needs_vector_dbbooleanApp uses a vector DB (deps qdrant-client / langchain+embeddings or QDRANT_URL).
portintegerPort 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_mdstringPASTE 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…
runtimestringyesDetected app language/runtime (node, python, go, ruby, ...). Informational — the app deploys as a container, so the language does not gate the deploy.
serves_httpbooleanWhether 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_vmbooleanForce everything onto a single VM if the user prefers.
source_tokenstringThe `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…
startstringHow the app starts (package.json start script / Procfile / Dockerfile CMD).
vm_countintegerNumber of app VMs (microservices). v1: usually 1.
workerbooleanHEADLESS 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…
NameTypeReqDescription
deployableboolean
feasibleboolean
generated_dockerfilestring|null
memory_digeststring|null
memory_sourcestring|null
memory_usedboolean
modestring
nextstring
pin_dnamestring|null
plan
preflightarray
reasonstring
report_filenamestring
report_markdownstring
source_files_errorstring|null
source_files_read

No examples provided.

plan_instance ~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).

NameTypeReqDescription
osHintstring
sizeHintstring
NameTypeReqDescription
modestring
options

No examples provided.

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.

NameTypeReqDescription
enginestring
habooleanPlan 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…
sizeHintstring
NameTypeReqDescription
modestring
nextstring
notesarray
options
suggested

No examples provided.

prepare_upload ~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.

NameTypeReqDescription
is_git_repobooleanIf the dir is a git checkout, set true to honor .gitignore (tar only tracked + non-ignored files).
project_dirstringPath to the local app directory to upload (default current dir).
NameTypeReqDescription
commandsarray
endpointstring
excludesarray
nextstring

No examples provided.

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.

NameTypeReqDescription
backupIdstringyesID of the backup to restore (see list_backups).
instanceIdstringOptional: restore into this instance's volume (resolved automatically). The target volume must be available (detached), so stop the instance first.
volumeIdstringOptional: restore into this existing volume.
volumeNamestringOptional: name for a new volume to restore into. Omit volumeId and instanceId to restore into a new volume.
NameTypeReqDescription
available_keypairsarray
duplicateboolean
errorboolean
idempotency_keystring
invalid_keypair_nameboolean
modestring
needs_keypairboolean
needs_keypair_nameboolean
needs_planboolean
nextstring
plan_toolstring
request
result
validation

No examples provided.

scaffold_local ~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.

NameTypeReqDescription
has_containerbooleanRepo already has a Dockerfile/Containerfile (the compose builds it). If false, write the plan_deploy-generated Dockerfile to ./Dockerfile first.
needs_postgresbooleanInclude a local Postgres container + wire PG* env.
portintegerPort the app listens on.
runtimestringyesApp runtime (node/python/go/…) — from plan_deploy.
NameTypeReqDescription
caveatsarray
commandsarray
files
nextstring

No examples provided.

select_surface ~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.)

NameTypeReqDescription
modestringDrive mode; omit to use the session's sticky mode.
surfacesarrayyesEVERY 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.
NameTypeReqDescription
chosen
modestring
nextstring
rankedarray

No examples provided.

set_cluster_domain ~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.

NameTypeReqDescription
domainstringyesThe 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_idstringyesCluster id, from list_clusters (the row's `id`).
NameTypeReqDescription
access_pointstring
domainstring
errorboolean
matched_requestboolean
modestring
nextstring
requested_domainstring
result
validation

No examples provided.

set_managed_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).

NameTypeReqDescription
enabledbooleanyestrue = turn ON nightly AUTOMATED backups for this service; false = turn them off.
idyesNumeric id of the managed service (from list_databases / list_redis / list_relational_databases / etc.).
retentionintegerHow many days of nightly backups to keep (optional; keeps the current setting if omitted).
servicestringyesWhich 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.
NameTypeReqDescription
errorboolean
modestring
nextstring
result

No examples provided.

setup_agent_fleet ~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.

NameTypeReqDescription
github_patstringyesGitHub Personal Access Token with repo + workflow scopes. Used to clone the repo and open PRs.
repostringyesGitHub repo to run agents on, e.g. 'owner/my-app'. Must be accessible with the PAT.
worker_countintegerNumber of parallel worker VMs (default 3). Each works on a separate task simultaneously.
NameTypeReqDescription
authorize_commandstring
controller_hoststring
controller_urlstring
fleet_idstring
instance_idstring
log_tokenstring
modestring
next_stepsarray
repostring
ssh_key_namestring
ssh_private_keystring
ssh_userstring
trigger_tokenstring
worker_idsarray

No examples provided.

setup_agent_session ~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'.

NameTypeReqDescription
github_patstringyesGitHub Personal Access Token (repo + workflow scopes)
repostringyesGitHub repo, e.g. 'owner/repo'
NameTypeReqDescription
next_toolstring
readyboolean
repostring

No examples provided.

trigger_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.

NameTypeReqDescription
controller_urlstringyesHTTPS URL of your controller VM
trigger_tokenstringyesTrigger token from the controller
NameTypeReqDescription
finalize_notestring
fleet_idstring
messagestring
okboolean
workers_readyboolean

No examples provided.

update_cluster ~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.

NameTypeReqDescription
idempotency_keystring
instance_idstringyesThe '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_idstringyesCluster stack id, from list_clusters (id).
stack_namestringyesCluster stack name, from list_clusters (stack_name).
NameTypeReqDescription
available_keypairsarray
duplicateboolean
errorboolean
idempotency_keystring
invalid_keypair_nameboolean
modestring
needs_keypairboolean
needs_keypair_nameboolean
needs_planboolean
nextstring
plan_toolstring
request
result
validation

No examples provided.

Common questions

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.