The official Otwa Cloud Model Context Protocol server lets your AI assistant deploy, manage, and destroy cloud servers on your behalf — straight from a chat prompt. 30 tools, scope-aware authorization, three-layer safety on anything destructive.
The easiest path is the hosted endpoint — no install, no Node runtime, just a Bearer key on every request. The setup wizard in your dashboard generates per-client snippets, but here's the two-step version:
Go to Dashboard → API Access → Connect AI and click Generate MCP key. This creates a key with the recommended scopes (account:read,servers:read,servers:write,billing:read).
servers:destroy is off by default — the AI should never be one prompt away from terminating your VM. Enable it explicitly in the key creation form only if you need it.
For Claude Code:
claude mcp add --transport http otwa "https://mcp.otwa.cloud/mcp" \ --header "Authorization: Bearer YOUR_API_KEY"
For Cursor — add to ~/.cursor/mcp.json:
{
"mcpServers": {
"otwa": {
"url": "https://mcp.otwa.cloud/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}Snippets for Claude Desktop, Windsurf, VS Code, Zed, Continue, and OpenCode are generated in the dashboard.
30 tools across seven surfaces. The required scope on each tool is enforced server-side — a key without the scope gets a 403, the AI sees the error and tells you which scope is missing.
otwa_accountaccount:readCurrent account, balance, tier.
otwa_list_productsaccount:readAvailable plans with monthly prices and product IDs.
otwa_list_regionsaccount:readRegions where new servers can be deployed.
otwa_list_os_templatesaccount:readOS images for new servers and reinstalls.
otwa_list_serversservers:readEvery server on this account with status, region, primary IP.
otwa_get_serverservers:readFull detail incl. specs, networking, OS.
otwa_get_server_credentialsservers:readSSH credentials. The AI is instructed not to paste these into the chat.
otwa_get_server_statsservers:readLive CPU / RAM / disk / network metrics from vSphere.
otwa_create_serverservers:writeProvision a new VM. Auto-generates Idempotency-Key so retries never double-bill.
otwa_rename_serverservers:writeChange the dashboard label. Cosmetic only.
otwa_power_serverservers:writestart | stop | reboot. confirm:true required for stop/reboot.
otwa_reset_server_passwordservers:writeRotate root password via vSphere guest ops.
otwa_reinstall_serverservers:destroyWipe disk and rebuild from a new OS template. Requires confirm + iAcknowledgeDataLoss.
otwa_destroy_serverservers:destroyPermanently terminate. Requires confirm + iAcknowledgeDataLoss + expectedLabel typo-guard.
otwa_list_snapshotsservers:readList a server's point-in-time disk snapshots.
otwa_create_snapshotservers:writeCapture a disk snapshot as a restore point. Max 2 per server.
otwa_revert_snapshotservers:destroyRoll the disk back to a snapshot. Requires confirm + iAcknowledgeDataLoss + expectedLabel typo-guard.
otwa_delete_snapshotservers:writeRemove a snapshot. Non-destructive to live data.
otwa_get_dashboard_ssoservers:read5-minute SSO link to the dashboard — handoff to web UI when you need noVNC console.
otwa_list_server_ipsservers:readEvery IP attached to a server with PTR.
otwa_set_ptrservers:writeSet reverse DNS (PowerDNS-backed, propagates in seconds).
otwa_delete_ptrservers:writeClear reverse DNS.
otwa_list_invoicesbilling:readPaged invoice history.
otwa_get_invoicebilling:readSingle invoice with line items.
otwa_list_transactionsbilling:readTop-ups, charges, refunds.
otwa_get_wallet_balancebilling:readCrypto wallet addresses + balances. Read-only — does not create new addresses.
otwa_list_webhookswebhooks:readRegistered webhook subscriptions.
otwa_create_webhookwebhooks:writeRegister a new webhook — secret returned once.
otwa_delete_webhookwebhooks:writePermanently remove a webhook subscription.
otwa_get_reseller_stateaccount:readReseller program state: tier, discount, rolling 30-day GMV, next-tier progression. Helps the AI answer 'how close am I to the next tier?'
We assume the AI is well-intentioned but fallible, and we assume your key might be over-scoped or leak. Three independent layers of defence:
confirm: true and iAcknowledgeDataLoss: true — the AI cannot fire-and-forget; the call surfaces in the model's reasoning.otwa_destroy_server requires expectedLabel matching the server's current label. If labels differ — because the AI looked at the wrong server, or you renamed it mid-conversation — the call is rejected before reaching the API.servers:destroy scope is split from servers:write. A key without servers:destroy cannot terminate or reinstall — full stop, at the API. Tool guards can be bypassed by a misaligned model; this one can't.otwa_create_server and otwa_reinstall_server also auto-attach a fresh Idempotency-Key on every retry, so transient network blips never produce two servers or charge twice.
For AI clients that natively speak the MCP authorization spec — no key copy-paste, browser-approved access, revocable from the dashboard. Both Bearer API keys and OAuth tokens are accepted on the same endpoints — the choice is per-client.
GET https://mcp.otwa.cloud/.well-known/oauth-protected-resourceGET https://api.otwa.cloud/.well-known/oauth-authorization-serveropaque otwa_at_… 90-day TTLopaque otwa_rt_… 90-day TTL, single-usedevice_code · refresh_tokenPOST /api/oauth/register with {client_name, software_id, scope}. RFC 7591 Dynamic Client Registration — no auth, public clients only (no client secret).POST /api/oauth/device/code returns a user_code like XXXX-YYYY + verification_uri. Open the URI in a browser, sign in, approve the requested scopes.POST /api/oauth/token at the returned interval. Returns authorization_pending until approved, then {access_token, expires_in, scope}. Use the access token inAuthorization: Bearer otwa_at_….grant_type=refresh_token. Returns a fresh access + refresh pair. The old refresh token is single-use — replaying it fails with invalid_grant.POST /api/oauth/revoke accepts both access and refresh tokens.Today most AI clients still expect a pasted Bearer key. Use OAuth if your client supports it; the dashboard's Connect AI wizard still ships per-client key-paste snippets, which work alongside OAuth on the same endpoint.
If you'd rather not depend on mcp.otwa.cloud — offline work, auditable local execution, or air-gapped policy — install the npm package and let your AI client spawn it as a stdio child process:
npx -y @otwa/mcp-server
Same tool set, same safety guards. The only difference is the network path: stdio talks directly to api.otwa.cloud without going through us. Source is open and MIT-licensed on GitHub .
The dashboard generates per-client snippets pre-filled for you. Two clicks: generate key, copy snippet.
Open the setup wizard