cloud.redu/mcp
REMOTE · MCP.REDU.CLOUD · SCANNED AUG 3
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 →
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 Usability24
- AI-judged instruction clarity (poor).Fail
- Context-footprint check failed: tool/resource definitions use about 21109 tokens (~289/item across 73 items; 73 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 Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage96
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 87% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · mcp.redu.cloud
claude mcp add --transport http cloud-redu-mcp 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": {
"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.
- 3 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +8
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 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
- 29 Jul 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “update_cluster” rewrote its description, which is the text the model reads security
- Tool “upgrade_to_cluster” rewrote its description, which is the text the model reads security
- “upgrade_to_cluster” added an optional parameter “high_availability” cosmetic
- “upgrade_to_cluster” reworded the description of “max_size” cosmetic
- 28 Jul 26 0
- New tool “delete_volume”, which the server declares destructive security
- Tool “restore_backup” rewrote its description, which is the text the model reads security
- “create_instance” added an optional parameter “boot_volume_id” cosmetic
- 27 Jul 26 +2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 59
First indexed and scored.
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 3 Aug 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 | 7 Jun 2026 | 5 Sept 2026 | ECDSA 384 | ECDSA-SHA384 | 53c6e6799a05b45d592175b4714fc4cc8ac |
| 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 |
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 |
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.
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_instance_logs Get instance logs ~35
Returns the console log output from an instance.
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | ID of the instance to fetch console logs for. |
| Name | Type | Req | Description |
|---|---|---|---|
| logs | — | — | — |
| mode | string | — | — |
No examples provided.
get_ssh_command Get SSH command for instance ~217
Returns the SSH command to connect to an instance via the redu.cloud TCP proxy. 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 [email protected]
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | ID of the instance to get the SSH command for. |
| 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 ~2,188
Turns YOUR repo classification (you scan the repo and pass what you found) into a complete, approvable deploy plan WITHOUT creating anything: 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/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; pass single_vm to collapse onto one VM. Only Postgres is auto-provisionable today — Redis / vector-DB needs are flagged, not provisioned. Any containerizable app works (node, python, go, ...) — it deploys as a container, so the language doesn't gate it. Set serves_http:false for a non-web repo (a library, CLI, or language runtime with no HTTP server) and it returns a clean not-a-web-service verdict instead of a costed VM plan. Set heavy_build:true for resource-heavy builds (compiled-from-source native code, a monorepo/turborepo build, a large Node heap) and it raises the app VM to a build-capable floor so the on-VM build doesn't get OOM-killed. Set memory_heavy:true for a RAM-forward app whose persistent state lives in a MANAGED DB / external store (Next.js like cal.com/cal.diy, Rails, Django, JVM/Java apps) — it sizes onto a memory-optimized SMALL-DISK flavor (m1.mem16/m1.mem32: full RAM, a lean 40 GB disk instead of 160 GB) that costs less and snapshots/clusters far faster; do NOT set it if the app keeps lots of data on local disk. Also returns a brand-named markdown report (Mermaid diagram + cost) to save as redu-deploy-plan.md and show the user. Every deploy leaves TWO MANDATORY files at the repo root with DIFFERENT purposes: redu-deploy-plan.md = THIS run's plan/estimate, and redu.md = the DURABLE deploy memory the NEXT deploy reads. If a redu.md exists, READ it FIRST and reuse its known-good pla…
| 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… |
| 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… |
| 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… |
| 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_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. |
| 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. |
| 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 | — | — |
| mode | string | — | — |
| next | string | — | — |
| plan | — | — | — |
| reason | string | — | — |
| report_filename | string | — | — |
| report_markdown | string | — | — |
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 ~78
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.
| Name | Type | Req | Description |
|---|---|---|---|
| engine | string | — | — |
| sizeHint | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | — | — |
| next | string | — | — |
| 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_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) ~399
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 Heat 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 (Heat stack) id — from list_clusters (id). |
| stack_name | string | yes | Cluster (Heat 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.
upgrade_to_cluster Upgrade an instance to an autoscaling cluster ~2,707
THE WAY TO MAKE AN EXISTING APP HIGHLY AVAILABLE. If the user asks for high availability, redundancy, no single point of failure, surviving a host or VM failure, or 'stay up if a machine dies', this is the tool: point it at their running VM and pass high_availability:true. It needs no rebuild and no redeploy, and the URL does not change. Turns a single running instance into a horizontally-autoscaling cluster: snapshots the instance and puts your SOURCE VM behind an Octavia load balancer as its ALWAYS-ON BASELINE MEMBER, then an autoscaling group adds EXTRA members (booted from that snapshot) on CPU load and scales them back down to zero. FLAVOR — LEAD WITH A MEMORY-OPTIMIZED SMALL-DISK FLAVOR (m1.mem16/m1.mem32) for the cluster, and ideally have the SOURCE VM on one too: clustering snapshots the source VM's FULL disk, so DISK size (not RAM) drives how long the cluster takes to build and to add each member under load — a 40 GB mem flavor is several times faster to snapshot and scale than a 160 GB standard flavor (m1.xlarge) and costs less for the same RAM. If the source VM is on a big-disk flavor, RECOMMEND migrating the app onto a mem-flavor VM first (a root disk cannot be shrunk in place), even though it is extra work — it pays off on every scale-out, and a clustered app is stateless anyway (state in the managed DB) so the lean disk fits. Expect a DRASTICALLY better clustering experience on a mem flavor: far faster cluster-create, snapshots, and every scale-out. The user can override with any flavor. At rest ONLY your source VM serves — there is NO idle extra VM to pay for (the source VM is the cluster's minimum, so the floor is 0 extra members). Use it to LOAD-SCALE a stateless app tier while managed services hold state: it becomes highly-available UNDER LOAD (multiple members behind the LB), but at rest a SINGLE source VM serves — and that source VM is a plain Nova server, not an autoscaled member, so it is NOT auto-replaced if it fails while idle (only the auto…
| Name | Type | Req | Description |
|---|---|---|---|
| app_profile | string | — | Set wordpress/woocommerce when upgrading an older deployment or raw VM that the backend has not profiled. WordPress/WooCommerce clusters require managed MySQL/MariaDB plus a media_space or explicitly… |
| auto_restructure | boolean | — | Instead of just refusing a stateful VM, have redu get its co-located database OFF the VM first, then cluster. FULLY AUTO for a single_vm Postgres (redu deployed it): redu provisions a managed Postgre… |
| cluster_media_mode | string | — | For WordPress/WooCommerce, use media_space as the default real cluster fix. local_uploads is refused because wp-content/uploads would diverge across members. |
| confirm_stateless | boolean | — | Override the stateful-VM safety refusal. redu REFUSES to cluster a VM that holds its own data (deployed with database:'single_vm' or a compose 'db' service) - a cluster clones the VM into members, so… |
| create_media_space | boolean | — | Set TRUE when upgrading a WordPress/WooCommerce deployment that has no media_space_id yet. Redu creates a small NFS media VM + volume, records it, and mounts it on all members. |
| dname | string | — | Optional public DNS name for the cluster's load-balancer access point (a .redu.cloud name is auto-generated if omitted). |
| flavor_id | string | yes | Member VM size — from list_flavors. Every autoscaling member uses this flavor. STRONGLY prefer m1.mem16/m1.mem32 (memory-optimized, 40 GB disk): clustering snapshots the source disk, so a lean disk m… |
| high_availability | boolean | — | Set TRUE whenever the user asks for HIGH AVAILABILITY, redundancy, 'no single point of failure', 'survive a host/node failure', or 'stay up if a VM dies'. This is the ONLY way to get an HA cluster an… |
| idempotency_key | string | — | — |
| instance_id | string | yes | The instance to turn into a cluster (from list_instances, or the VM of a deploy_app/deploy_compose deployment). It is snapshotted, and the autoscaling members are booted from that snapshot. |
| keypair_name | string | yes | SSH keypair name — from list_keypairs. |
| max_size | integer | — | Peak member count under load (default 5). In the default mode this is EXTRA members added on top of your always-on source VM, and the floor is 0 extra. With high_availability:true the group runs betw… |
| media_mount_path | string | — | Host mount path on cluster members. Redu mounts this into /var/www/html/wp-content/uploads for WordPress/WooCommerce. |
| media_origin_url | string | — | Public base URL where WordPress wp-content/uploads is served from the central media origin. This should be a separate media origin, not the DB VM. |
| media_space_flavor_id | string | — | Flavor id for the media VM when create_media_space:true. Defaults to the cluster member flavor. |
| media_space_id | integer | — | Existing Redu media space id to mount on every WordPress/WooCommerce cluster member. |
| media_space_name | string | — | Optional name for the media space when create_media_space:true. Defaults to <cluster-name>-media. |
| media_space_size_gb | integer | — | Media space data volume size in GB when create_media_space:true (default 20). |
| name | string | yes | Name for the cluster (lowercase letters, numbers, hyphens). |
| network_id | string | yes | Private network id — from list_private_networks. Use the SAME network the app's managed DB / other services are on, so members can reach them by private IP. |
| port | integer | — | Port the app listens on / the load balancer forwards to (default 80). Your source VM must actually serve on this port — the load balancer health-checks it. |
| restructure_db_flavor_id | string | — | Optional VM size for the provisioned managed database (from list_flavors). Defaults to the member flavor; pick a smaller one (e.g. m1.small) if the DB is light. |
| restructure_engine | string | — | For the ASSISTED path (a compose-stack database), which managed engine to provision. WordPress/WooCommerce = 'mysql' (or 'mariadb'). Required when auto_restructure is set and the DB runs inside the c… |
| scale_in_threshold | number | — | Average CPU fraction (0-1) below which a member is removed (default 0.2). |
| scale_out_threshold | number | — | Average CPU fraction (0-1) above which a member is added (default 0.7). |
| startup_command | string | — | Single-line shell command to (re)start the app on each fresh member if the snapshot's own services do not auto-start it. For a podman-compose app: 'cd /opt/app && podman-compose up -d'. Omit to rely… |
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
verify_domain Verify custom domain ~73
Checks the DNS TXT ownership record for a custom domain and marks it verified when the record is present. Call get_domain_verification first, add the TXT record at your DNS provider, then call this until status is verified.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | The custom domain to verify ownership of (e.g. app.example.com). |
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | — | — |
| mode | string | — | — |
| next | string | — | — |
| result | — | — | — |
| status | string | — | — |
| verified_at | string|null | — | — |
No examples provided.
whoami Who am I ~54
Verifies your redu.cloud credential with a REAL server round-trip and returns your identity + live quota. A green result means the key actually works — not merely that one is configured. Use this first if anything is 401ing.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_type | string | — | — |
| next | string | — | — |
| quota | — | — | — |
| user | — | — | — |
| verified | boolean | — | — |
No examples provided.