VPSnet

管理您的VPSnet云:KVM和Firecracker VPS、应用程序、Functions、软件定义网络、DNS、域名和TLS证书。您可以选择权限以及连接可以访问哪些服务器。

托管 MCP 服务器

npx add-mcp 'https://mcp.vpsnet.com/mcp'

可安装到 Claude Code、Codex、Cursor 等客户端

文档

vpsnet-mcp

Model Context Protocol (MCP) server for managing VPSnet.com services. Gives AI assistants access to VPS lifecycle operations, managed applications, DNS zones, domain registration and contacts, billing, API-key metadata, SSH-key provisioning, and related account tooling through the VPSNet API.

Features

  • 280+ tools covering VPSNet service management, managed applications, free and paid TLS certificates, Automatic SSL subscriptions, DNS, domains, billing, API keys, and account operations
  • Account & profile management
  • VPS lifecycle (start, stop, restart, reinstall OS)
  • Plan changes (free upgrades/downgrades; KVM/Firecracker disks cannot shrink)
  • Service reverse DNS (rDNS/PTR records)
  • Forward DNS zones, records, DNSSEC, templates, import/export, and DDNS tokens
  • Domain availability, contacts, register/transfer/renew/restore quotes, and paid confirmations
  • Publication-gated managed applications with install, health, events, and typed lifecycle actions
  • SSH key management — deploy keys and gain direct server access
  • API-key metadata inspection (key creation, changes, and revocation remain session-only)
  • Backups, billing, invoices
  • Ordering new VPS instances
  • System status & pricing

Remote OAuth connector

The remote profile also includes scoped DNS, domain and certificate management, public SSH keys, server recovery and backup browsing. It uses the same customer APIs as the panel; permissions are enforced by the backend on every request.

The remote connector uses https://mcp.vpsnet.com/mcp and customer consent through VPSnet. See Remote AI connections for connection setup, permissions and supported operations.

The distributable plugin README, manifests and skills are in English. See directory readiness for package validation and publisher requirements, and supported use cases for server, application and networking scenarios. Directory publication and provider account availability are separate from installing this source code.

See AI client setup for Gemini CLI, Cursor, Kimi Code, Kiro, Cline and other remote OAuth clients. Their packages share the same VPSnet endpoint and task skills. The npm package supplies the local MCP server; installable plugin bundles also carry the AI application's manifest and skills.

Build all client bundles with python3 scripts/package-distribution.py. The output includes checksums and identifies each format. Public directory submission materials are in the catalog kit.

Ordering uses the existing VPSnet connection, with customer-controlled purchase permissions and spending limits. The AI shows the final price and asks for approval before charging the account balance. Availability follows the application’s distribution rules.

The instructions below describe the existing local stdio/API-key client.

Prerequisites

Before installing, ensure you have:

  1. Node.js 20 or newer

    • Check: node --version
    • Linux/macOS: nodejs.org or your package manager
    • Windows: winget install OpenJS.NodeJS.LTS or download from nodejs.org
    • After installing Node.js, restart your terminal/editor
  2. For Claude Code (CLI or VS Code extension) users:

    • Claude Code CLI installed globally: npm install -g @anthropic-ai/claude-code
    • Check: claude --version
  3. Active VPSnet.com account with an API key (see Getting an API key)

Credential configuration paths

VPSNET_API_KEY is the preferred per-launch credential and takes precedence over files. For file-based configuration, set VPSNET_CONFIG_DIR to the absolute directory containing .vpsnet-mcp-key or .mcp.json. The key file takes precedence over mcpServers.vpsnet.env.VPSNET_API_KEY in that JSON file. Alternatively, VPSNET_API_KEY_FILE selects one absolute key-file path; an unreadable or invalid explicit file fails startup instead of choosing another account.

Without VPSNET_CONFIG_DIR, files are read only from the process's launch directory (cwd). This is the same for node /path/to/vpsnet-mcp/build/index.js and npx vpsnet-mcp: the package installation/cache directory and parent directories are never searched. Set the directory explicitly when an editor or MCP client launches from a different working directory. Keep credential files out of version control. VPSNET_API_URL takes precedence over the URL in that same .mcp.json; the existing trusted-host and HTTPS checks apply to either source.

Managed applications

Managed Applications, manual SSH, DNS, APIs, and other deployment surfaces are peer capabilities. Their order in this document and in the tool list is not a recommendation. Choose the path that best matches the user's requested outcome, target support, existing state, and explicit constraints. A catalog entry is one available managed path, not a reason to override a valid manual or custom deployment request. Catalog applications run as Docker containers in the customer's server and use typed installation and lifecycle tools.

Application reads require applications:read. Installation and lifecycle changes require applications:manage and an idempotency key; ordinary application lifecycle changes are not paid API-key operations. CPU, RAM, and disk figures are sizing recommendations, not installation gates: a supported application remains selectable during ordering and installable below those figures. Product, OS, architecture, and runtime compatibility remain hard requirements. Changes are asynchronous, so verify them with get_application_installation and get_application_events. Use get_application_health for a fresh container-health inspection and get_application_logs for recent size-bounded troubleshooting logs, optionally limited to one exact Compose service. Log inspections accept at most 500 lines and 131,072 bytes. These two read-scoped inspections create short-lived inspection jobs, so the API key must permit POST requests.

Installation detail includes bounded application and per-container CPU, memory, network, restart, and storage history when the worker reports it. Containers are identified only by Compose service and ordinal. Use configure_application_resource_thresholds after explicit confirmation to replace optional display thresholds. Omitted values clear a threshold; the thresholds only highlight measurements and do not enforce resources, trigger server actions, or affect billing. Set email_enabled after explicit confirmation to send one account email when a threshold is reached and one when it recovers; repeated measurements above the same threshold do not resend.

Use configure_application_access to change how an installed application is reached. Read the installation first and pass its current revision with a new idempotency key. platform_https allocates an opaque VPSnet hostname with automatic DNS and HTTPS, private has no public listener, public_http uses the server's public IP over HTTP, and managed_https uses an eligible VPSnet-managed DNS zone. external_https records an existing customer-managed HTTPS address; VPSnet does not configure or validate its DNS, TLS certificate, or reverse proxy.

A managed_https access may also list additional_addresses (up to 4 per endpoint, 8 per application): other names in the customer's own VPSnet DNS zones, each with zone_id, name, action and approve_dns: true. An empty name or "@" is the zone's bare domain, so example.com can sit next to www.example.com. action is redirect (default; a 301 to the main address that keeps the path and query) or serve (opens the same application). Adding or removing an additional address never changes the main address. The list is the complete wanted set: an access change that omits additional_addresses removes the saved ones, so pass them again to keep them. Additional addresses are refused on every other access mode, and VPSnet charges nothing for them.

list_application_registry_credentials exposes only private registry credential metadata. Registry token creation and rotation are intentionally not MCP tools: use the VPSnet panel or direct REST API so a token never enters a model prompt or tool argument. Metadata can identify Docker Hub, GHCR, or an exact custom HTTPS registry hostname.

Customer recipes are customer-owned Compose definitions, separate from VPSnet catalog blueprints. They can be validated on the target worker, saved as immutable revisions, installed through the managed lifecycle, and exported without secret values. VPSnet catalog recipes are never exportable. Container discovery is bounded and read-only: it reports customer and managed containers without returning environment values or mounts, and it never adopts or modifies detected containers. Controlled adoption is a separate prepare, inspect, and explicit-confirm flow for an eligible Compose project. The initial takeover is one-time, but its exact external-volume binding remains signed into later lifecycle actions. Recovery restarts the source only after the managed replacement is conclusively contained; uncertain outcomes fail closed.

An immutable update is available only when get_application_installation returns an available_actions entry with type: "update". After explicit user confirmation, call update_application with the exact advertised expected_blueprint_version and expected_upstream_version, and a new idempotency key. Keys are client-global: reuse a key only to replay the exact same request, never for another service or operation. The backend selects and freezes the eligible published release; the caller does not submit an image, tag, or target version.

No separate application backup is created. On supported Firecracker services, list_application_restore_points returns opaque application-consistent nightly whole-VM points for the exact current installation revision. Viewing points is free, but API keys require applications:manage, paid operations enabled, applications:restore paid scope, and full access because the response includes the account balance. quote_application_data_restore freezes the exact charge without debiting the account. restore_application_data requires the returned quote token, the same idempotency key, and explicit confirmation of both payment and data replacement. Paid API keys also require applications:restore, paid operations enabled, and daily/monthly spend caps. It replaces only worker-derived declared application data, excludes secrets and unrelated Docker/server data, and requires rollback capacity. Poll get_application_data_restore; needs_attention remains locked and must not be treated as success. These tools never accept or expose PBS credentials, archive names, devices, or filesystem paths.

Installation list and detail responses carry a per-platform capabilities block — data_restore, console, compose_adoption, custom_projects and log_service_filter — plus a separate access.capabilities.can_configure flag. Treat those flags as the authority on what an installation supports rather than attempting an action and reading the failure.

Uninstall permanently deletes the managed containers, configuration, saved credentials, and application data; existing server backups are retained. The uninstall_application call requires acknowledge_data_loss=true, and it must only be set after explicit user confirmation.

The MCP surface is task-oriented rather than a one-to-one mirror of every REST route. Legacy SMS micro-payment and macro-payment callback integrations remain available through the documented REST API and control panel, but are intentionally not exposed as MCP tools. Public pre-login order and domain-search routes likewise have authenticated MCP equivalents where an account operation needs them.

TLS certificates and Automatic SSL

Certificate products are not limited to managed applications. Portable DV, OV, and EV orders can be installed on customer-controlled web servers, proxies, mail servers, load balancers, APIs, or other TLS-capable systems. Automatic SSL subscriptions instead connect a compatible ACME client on VPSnet or another provider and keep short-lived certificates current during the paid term.

Eligible accounts can also request no-cost portable DV certificates through get_free_certificate_eligibility → preflight_free_certificate → create_free_certificate. For API or assistant deployment, create a CSR on the destination and keep its private key there; MCP accepts only the public CSR and later returns only the public certificate chain. VPSnet-managed keys support unattended early renewal, but their export remains portal-only behind two-factor verification. Free certificates, paid certificate files, paid Automatic SSL, and application Managed HTTPS are separate products and lifecycle surfaces.

Use list_certificate_catalog to distinguish portable_certificate from acme_subscription offers. Automatic SSL follows quote_automatic_ssl_subscription → order_automatic_ssl_subscription, with the exact unchanged request, quote token, idempotency key, and explicit payment approval. Read state with list_automatic_ssl_subscriptions and get_automatic_ssl_subscription. Additional names use quote_automatic_ssl_domain → order_automatic_ssl_domain; the API prevents paying twice for names already covered by base/www or wildcard/base rules. During the final 30 days, an eligible next term uses quote_automatic_ssl_renewal → order_automatic_ssl_renewal and is prepaid from account balance only after the exact EUR total is approved. Cancellation, domain removal, and same-type correction use cancel_automatic_ssl_subscription, remove_automatic_ssl_domain, and replace_automatic_ssl_domain; ambiguous state is reconciled with refresh_automatic_ssl_subscription, never by inventing a second mutation. Private ACME server and EAB credentials stay in the two-factor-protected customer portal and are intentionally unavailable to API keys and MCP, so they cannot enter model context.

Restoring a whole service

request_restore is paid and destructive: it charges the restore price from the account balance and overwrites the whole service disk with the backup point, losing everything written since. It is a confirmation call, not a price enquiry — the API refuses a body that does not carry an explicit confirmation, and refuses the charge outright if the price has moved since it was disclosed.

There is no dialog on this surface to collect that confirmation, so the tool does not manufacture it. acknowledge_data_replacement and acknowledge_restore_charge must each be true, and are only to be set after the user has actually approved the disk replacement and the charge — the same rule as acknowledge_data_loss on uninstall_application. Omitting either is a schema error, so an unattended caller cannot fall through to a charge: nothing is even quoted.

expected_total_charged is the VAT-inclusive total_charged you read from get_restore_status and showed the user, passed back unchanged. Do not re-read it just before the call: it is meant to be the figure the customer agreed to, and a freshly fetched number would agree with whatever the price has become and defeat the check entirely. If the price has moved, the restore is refused as restoreQuoteChanged with the current total and nothing is charged; disclose the new figure, get approval again, and retry.

Browsing inside a backup

Looking inside a backup is free and completely separate from paying to restore one. list_restore_file_points, browse_restore_files and get_restore_file_browse only read a backup's directory listing: they never charge the account, never overwrite the disk, and never put a file back on the server. Initially supported on Firecracker VPS.

Browsing is asynchronous. browse_restore_files creates a persisted job and queues worker activity, so its MCP annotation is readOnlyHint: false even though the backup and running server are unchanged. It returns a browse id in a pending state; poll get_restore_file_browse until state is succeeded. Entries exist only in that state — a failed browse carries an errorCode and no listing, and must not be presented as an empty directory.

Directories can hold an enormous number of files, so the server selects pages of 200 or 1,000 entries according to the worker capability. When result.nextOffset is non-null, call again with the same sourceBrowseId and directoryEntryId and set offset to that cursor. Use result.pageSize rather than assuming 200 when moving backwards. Subdirectories are entered with the opaque id of a type: "directory" entry; filesystem paths are never accepted. Entry types are file, directory, symlink and unsupported.

Folder search (the filter argument) matches entry names in the one directory being listed — case-insensitive substring, never a path, never recursive. It depends on a worker capability that older nodes do not report, so list_restore_file_points returns searchAvailable. browse_restore_files checks that flag before sending a filter and fails with serviceFileBrowseSearchUnavailable when search is unsupported, rather than quietly returning an unfiltered listing that would be mistaken for search results. Plain browsing keeps working on those nodes.

Restoring selected files back onto the server is a paid operation and is deliberately not exposed here; use the VPSnet panel for it.

SSH access workflow

This MCP server manages your VPS infrastructure through the VPSnet.com API, including SSH key provisioning. Once an SSH key is deployed to a VPS, the AI assistant can connect directly using its environment's terminal (e.g. Claude Code's Bash tool, Cline's terminal).

Typical flow:

  1. AI reads the local machine's public key (~/.ssh/id_rsa.pub)
  2. Uploads it to VPSnet.com via create_ssh_key
  3. Deploys it to a VPS via deploy_ssh_key with explicit vm:exec permission for remote OAuth (or passes it when ordering with order_service)
  4. Connects directly: ssh root@<vps_ip>

Most AI coding environments (Claude Code, Cline, Cursor, Codex) have built-in terminal access, so the AI can SSH into your VPS immediately after deploying a key — no extra tools needed.

For environments without native SSH access, pair this with mcp-server-ssh for direct server connectivity via MCP tools.

Combined config:

{
  "mcpServers": {
    "vpsnet": {
      "command": "npx",
      "args": ["-y", "vpsnet-mcp"],
      "env": {
        "VPSNET_API_KEY": "your_api_key_here"
      }
    },
    "ssh": {
      "command": "npx",
      "args": ["-y", "mcp-server-ssh"]
    }
  }
}

Getting started

Choose your environment:

The standard config works across most MCP clients:

{
  "mcpServers": {
    "vpsnet": {
      "command": "npx",
      "args": ["-y", "vpsnet-mcp"],
      "env": {
        "VPSNET_API_KEY": "your_api_key_here",
        "VPSNET_API_TIMEOUT_MS": "45000"
      }
    }
  }
}
Claude Code
claude mcp add vpsnet -- npx -y vpsnet-mcp

Set the environment variable before running:

export VPSNET_API_KEY="your_api_key_here"
export VPSNET_API_TIMEOUT_MS="45000"
Claude Code for VS Code Extension

This section is for the Claude Code VS Code extension, not GitHub Copilot. If you use VS Code with GitHub Copilot, see the VS Code with GitHub Copilot section instead.

Step 1: Install Claude Code CLI globally (required for the extension):

npm install -g @anthropic-ai/claude-code

Step 2: Add the MCP server via CLI:

claude mcp add vpsnet -- npx -y vpsnet-mcp

Step 3: Add your API key. Edit ~/.claude.json (or C:\Users\<username>\.claude.json on Windows), find the vpsnet server section and add the env block:

"vpsnet": {
    "type": "stdio",
    "command": "npx",
    "args": ["-y", "vpsnet-mcp"],
    "env": {
        "VPSNET_API_KEY": "your_api_key_here",
        "VPSNET_API_URL": "https://api.vpsnet.com"
    }
}

Step 4: Restart VS Code completely (Ctrl+Shift+P > "Reload Window" or close and reopen).

Step 5: Verify by asking Claude: "Get my VPSnet account info"

Windows users: Use PowerShell or CMD (not Git Bash) when running claude mcp add commands.

The code --add-mcp command does NOT work with Claude Code extension — that's for VS Code Copilot only.

Claude Desktop

Follow the MCP install guide, use the standard config above.

Cline

Open Cline MCP settings and add to your cline_mcp_settings.json:

{
  "mcpServers": {
    "vpsnet": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "vpsnet-mcp"],
      "env": {
        "VPSNET_API_KEY": "your_api_key_here"
      },
      "disabled": false
    }
  }
}
Codex

Use the Codex CLI:

codex mcp add vpsnet --env VPSNET_API_KEY=your_api_key_here -- npx -y vpsnet-mcp

Or edit ~/.codex/config.toml:

[mcp_servers.vpsnet]
command = "npx"
args = ["-y", "vpsnet-mcp"]

[mcp_servers.vpsnet.env]
VPSNET_API_KEY = "your_api_key_here"

If your system's default Node.js is older than 20 (common with nvm — check with node --version), wrap the command so nvm loads the right version:

codex mcp add vpsnet --env VPSNET_API_KEY=your_api_key_here -- bash -lc 'source ~/.nvm/nvm.sh >/dev/null 2>&1 && nvm use --silent 20 && npx -y vpsnet-mcp'

Note: Codex requires network access to install packages via npx. If you run Codex in a restricted sandbox without network, npx installs will fail.

Cursor

Go to Cursor Settings > MCP > Add new MCP Server. Use command type with the command npx -y vpsnet-mcp. Or add manually to .cursor/mcp.json:

{
  "mcpServers": {
    "vpsnet": {
      "command": "npx",
      "args": ["-y", "vpsnet-mcp"],
      "env": {
        "VPSNET_API_KEY": "your_api_key_here"
      }
    }
  }
}
Roo Code

Open Roo Code MCP settings and add to roo_mcp_settings.json:

{
  "mcpServers": {
    "vpsnet": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "vpsnet-mcp"],
      "env": {
        "VPSNET_API_KEY": "your_api_key_here"
      },
      "disabled": false
    }
  }
}
VS Code with GitHub Copilot

Install using the VS Code CLI:

code --add-mcp '{"name":"vpsnet","command":"npx","args":["-y","vpsnet-mcp"],"env":{"VPSNET_API_KEY":"your_api_key_here"}}'

Or add to your VS Code MCP config manually using the standard config above.

This is for GitHub Copilot agent mode in VS Code. For the Claude Code extension, see the Claude Code for VS Code Extension section.

Windsurf

Follow the Windsurf MCP documentation. Use the standard config above.

Windows Users

  • Use PowerShell or CMD (not Git Bash) for claude mcp add commands
  • Config file location: C:\Users\<YourUsername>\.claude.json
  • Install Node.js: winget install OpenJS.NodeJS.LTS or download from nodejs.org
  • After installing Node.js, restart your terminal and VS Code
  • Environment variables in Claude Code extension must be in the env object within .claude.json, NOT system environment variables

Environment variables

VariableRequiredDescription
VPSNET_API_KEYYesYour VPSnet.com API key
VPSNET_API_URLNoAPI base URL (defaults to https://api.vpsnet.com); any https://*.vpsnet.com host configured for your deployment
VPSNET_AI_URLNoDelegated SSH runtime; production uses https://ai.vpsnet.com. Non-production requires the approved API origin followed by /ai-control.
VPSNET_AI_API_ORIGINNon-production SSH onlyOperator-approved HTTPS VPSnet API origin; must exactly match VPSNET_API_URL. Set both runtime variables privately for a non-production deployment.
VPSNET_API_TIMEOUT_MSNoPer-request timeout (default 45000)

Requests go out from the machine that runs this server, not from your browser. A deployment that restricts access by source address can answer a blocked request with an HTML 403 page from its web server; the tool result then says so (non_api_response: true, http_status: 403) instead of passing the page on. Every error result carries http_status; a 429 also carries retry_after.

Authentication, scopes and paid operations

Every request is sent with the X-API-KEY header (VPSNET_API_KEY).

  • Use a management key. Its access level is full (reads and changes) or read (GET only). An AI-scoped key is issued only for VPSnet AI assistant inference and is refused on every account route, so no tool here works with one; the error result carries auth_problem with the reason and the fix.
  • Granular scopes only narrow a key. A key with an empty scope list keeps everything its access level allows; listing scopes (for example dns:read, services:manage) restricts it. X:manage includes X:read. Networking is the exception: networking:read / networking:manage / networking:order are never implied by full or read and must be granted explicitly.
  • Paid operations are a separate gate. A tool marked Paid or Quote in the tables below needs a full-access key, paid_operations_enabled, the named paid scope (vps:order, vds:order, ds:order, fc:order, domains:order, domains:renew, domains:transfer, certificates:order, applications:restore, services:restore, fn:invoke, networking:order), configured daily and monthly spend caps, and a stable idempotencyKey (reuse the same key to replay an uncertain attempt, never a new one). Orders run quote, then confirm with the returned quoteToken; disclose the exact EUR total to the user before confirming. Use list_api_keys to see your key's scopes, paid scopes, caps and rate limit.
  • Rate limits. Requests are rate-limited per key (rate_limit in list_api_keys, requests per minute). On HTTP 429 back off and retry after retry_after seconds instead of retrying immediately.
  • API keys can never create, change or revoke API keys, and never receive admin access.

Tools

The tables below are generated: edit scripts/tool-scopes.json (or the tool registration) and run npm run docs:tools; npm test fails when they drift.

Scope is the granular API-key scope the tool needs (none = any management key; a + b = both; a or b = either, depending on the object). Paid: Paid: x spends account balance and needs the paid scope x plus the gates above; Quote: x creates a price quote without charging but is gated the same way; Paid alone charges the balance with a full-access key and no separate paid scope; Needs paid scope: x is a read that exposes balance or price data; Billed while kept means free for an initial window, then metered; free is everything else.

Account

ToolDescriptionScopePaid
get_accountGet account info (user ID, email, balance, VAT rate)nonefree
get_profileGet user profile details (name, address, company)account:readfree

Services

ToolDescriptionScopePaid
list_servicesList all active VPS servicesservices:readfree
get_serviceGet detailed info for a serviceservices:readfree
get_service_graphsGet one graph series: metric (cpu, ram, ssd, net, io, …) and period (5m … 1y)services:readfree
get_eventRead an async action's state by its event id or noty UUIDservices:read or account:readfree
wait_for_eventPoll an async action until completed or error (or a timeout)services:read or account:readfree
get_service_historyGet action history for a serviceservices:readfree

Managed Applications

ToolDescriptionScopePaid
list_application_catalogList published applications compatible with a serviceapplications:readfree
list_service_applicationsList installed applications and pending checkout selectionapplications:readfree
get_application_installationGet observed state, health, drift, endpoints, components, resource history, and thresholdsapplications:readfree
get_application_eventsGet bounded customer-safe installation eventsapplications:readfree
get_application_healthRun and poll a fresh container-health inspectionapplications:readfree
get_application_logsRun and poll a size-bounded recent-log inspectionapplications:readfree
get_application_inspectionPoll the exact persisted health or logs inspection returned by get_application_health or get_application_logs when it remains pending.applications:readfree
list_application_restore_pointsList eligible nightly points for the exact application revisionapplications:manageNeeds paid scope: applications:restore
quote_application_data_restoreFreeze the exact selective-restore balance charge without paymentapplications:manageQuote: applications:restore
restore_application_dataPay and queue confirmed selective replacement of declared application dataapplications:managePaid: applications:restore
get_application_data_restorePoll one tenant-bound selective data restoreapplications:readfree
list_application_registry_credentialsList non-secret private registry credential metadataapplications:readfree
validate_application_recipeValidate customer Compose against the target worker policyapplications:managefree
get_application_recipe_validationPoll the exact persisted customer recipe validation returned by validate_application_recipe or a pending recipe creation/revision.applications:readfree
list_application_recipesList customer-owned immutable recipe projectsapplications:readfree
list_application_recipe_revisionsList immutable revisions for a customer recipeapplications:readfree
create_application_recipeValidate and save a new customer recipe without installing itapplications:managefree
create_application_recipe_revisionValidate and save a later immutable customer recipe revisionapplications:managefree
export_application_recipeExport only a customer-owned recipe without secret valuesapplications:readfree
install_application_recipeInstall an exact validated customer recipe revisionapplications:managefree
discover_service_containersDiscover bounded read-only container metadataapplications:readfree
get_service_container_discoveryPoll the exact persisted service container discovery returned by discover_service_containers when it remains pending.applications:readfree
prepare_application_compose_adoptionPrepare and poll a scrubbed candidate for one discovered Compose projectapplications:managefree
get_application_compose_adoptionPoll one tenant-bound Compose adoption candidateapplications:readfree
confirm_application_compose_adoptionConfirm the exact source takeover after explicit approvalapplications:managefree
install_applicationQueue a confirmed, version-pinned managed installationapplications:managefree
configure_application_accessQueue a confirmed platform-hostname, private, public-IP, managed-HTTPS, or customer-managed external-HTTPS access changeapplications:managefree
configure_application_resource_thresholdsReplace confirmed non-enforcing application resource thresholds and reached/recovered email preferenceapplications:managefree
manage_applicationCompatibility tool for older clients; use the individual actions belowapplications:managefree
reconcile_applicationReconcile an application with its declared configurationapplications:managefree
repair_applicationRepair an application runtimeapplications:managefree
restart_applicationRestart an application after confirming interruptionapplications:managefree
start_applicationStart a stopped applicationapplications:managefree
stop_applicationStop an application after confirming interruptionapplications:managefree
uninstall_applicationDelete an application after explicit data-loss approvalapplications:managefree
update_applicationApply the eligible immutable update with exact version preconditionsapplications:managefree
rollback_applicationQueue the exact reverse transition advertised as type=rollback by get_application_installation.applications:managefree
cancel_application_actionCancel the exact latest queued action only while the backend advertises it as cancellableapplications:managefree

Service Actions

ToolDescriptionScopePaid
start_serviceStart a stopped VPSservices:managefree
stop_serviceStop a running VPSservices:managefree
restart_serviceRestart a VPSservices:managefree
console_serviceRequest an out-of-band console session for a running VPSservices:managefree
suspend_serviceSuspend a running Cloud VPSservices:managefree
resume_serviceResume a suspended Cloud VPSservices:managefree

Service Settings

ToolDescriptionScopePaid
get_hostnameGet current and automatic service hostname stateservices:readfree
get_guest_nameserversGet the server's saved guest DNS resolver configuration: nsData.type is own (VPSnet defaults) or custom, with ns1-ns4 resolver IP addresses.services:readfree
change_hostnameChange VPS hostnameservices:managefree
reset_hostnameRestore the VPSnet-managed automatic hostnameservices:managefree
set_guest_nameserversChange DNS resolvers inside a supported Linux server.services:managefree
change_root_passwordChange VPS root passwordservices:managefree
get_rdnsGet current rDNS recordsservices:readfree
change_rdnsChange reverse DNS (PTR) recordservices:managefree
clear_rdnsClear a PTR override and restore the automatic valueservices:managefree
flush_iptablesFlush iptables rules (useful when locked out)services:managefree
get_titleGet the current service display titleservices:readfree
change_titleChange service display titleservices:managefree
toggle_ipv6Enable or disable IPv6services:managefree
toggle_extra_settingsToggle ppp, fuse, tuntap, or nfsservices:managefree
deploy_ssh_keyDeploy an SSH key to a VPS; remote OAuth also requires vm:execservices:managefree

OS Reinstall

ToolDescriptionScopePaid
get_os_optionsGet available OS templatesservices:readfree
reinstall_osReinstall VPS OS (destroys existing data). Cloud/Firecracker VPS also delete existing snapshots and require explicit confirmSnapshotDelete when snapshots exist; those snapshots cannot provide rollback after reinstall. Returns a noty acceptance event; follow service history for completion.services:managefree

Plan Changes (free)

ToolDescriptionScopePaid
get_plan_optionsGet available plans for upgrade/downgrade; KVM/Firecracker targets that would shrink disk are unavailableservices:readfree
get_plan_resourcesGet configurable resources for a planservices:readfree
calculate_plan_changePreview a plan change: no payment, the remaining value is converted, so an upgrade moves the expiry earlierservices:readfree
change_planChange VPS planservices:managefree

Renewal & Billing

ToolDescriptionScopePaid
get_period_optionsGet billing period and auto-renewal optionsservices:readfree
set_auto_renewEnable or disable auto-renewalservices:managePaid (future renewals)
renew_serviceManually renew a serviceservices:managePaid
list_invoicesList invoicespayments:readfree
get_invoiceGet a specific invoicepayments:readfree
list_paymentsList payment historypayments:readfree
get_usage_statementsList itemized metered-usage statements separately from invoicespayments:readfree

Ordering

ToolDescriptionScopePaid
get_order_plansGet available plans for an explicitly selected service productnonefree
get_order_optionsGet configurable options for a plannonefree
order_serviceQuote a new VPS, then confirm the exact total and period after customer approval; optionally attach a private network with privateNetworkIdnonePaid: vps:order, vds:order, ds:order or fc:order (by product)

Backups

ToolDescriptionScopePaid
get_backup_statusGet backup status and configurationservices:readfree
get_firecracker_backup_statusGet nightly off-node backup status for a Firecracker VPS, including running count and the latest retained backup's consistency provenance.services:readfree
get_backup_historyGet backup historyservices:readfree
get_firecracker_backup_historyGet retained nightly Firecracker VPS backup history, including failed/running attempts and consistency provenance.services:readfree
create_backupRetrieve historical Container VPS backup content with explicit payment consent and a stable request keyservices:managePaid

Restore

ToolDescriptionScopePaid
get_restore_statusGet retention, restore price, and any restore in progressservices:readNeeds paid scope: services:restore
list_restore_pointsList whole-service restore pointsservices:readfree
request_restorePaid and destructive: restore the whole service disk from a pointservices:readPaid: services:restore
list_restore_file_pointsList browsable backup points and whether folder search is available (free)services:readfree
browse_restore_filesQueue a backup directory listing job without restoring filesservices:readfree
get_restore_file_browsePoll a queued backup directory listing (free, read-only)services:readfree

SSH Keys

ToolDescriptionScopePaid
list_ssh_keysList all SSH keysaccount:readfree
get_ssh_keyGet a specific SSH keyaccount:readfree
create_ssh_keyAdd a new SSH keyaccount:managefree
delete_ssh_keyDelete an SSH keyaccount:managefree

API Keys

ToolDescriptionScopePaid
list_api_keysShow the API key authenticating this MCP connectionnonefree
get_api_keyGet one active key's non-secret metadatanonefree
get_api_key_activityGet the calling key's bounded retained request activity and recorded totalsnonefree
get_api_key_inference_usageGet the calling inference key's exact paid VPSnet AI usage and cap statenonefree

API-key creation, changes, and revocation require a browser/session login. They cannot be performed by an MCP connection authenticated with an API key.

Free TLS certificates

ToolDescriptionScopePaid
get_free_certificate_eligibilityCheck account eligibility, quota, key modes, and currently ready public CAscertificates:readfree
preflight_free_certificatePlan exact names, validation, delivery, custody, and CA without issuingcertificates:readfree
list_free_certificatesList owned no-cost certificate requests and lifecycle statecertificates:readfree
get_free_certificateGet one owned request, renewal schedule, and safe timelinecertificates:readfree
get_free_certificate_instructionRead automatic-DNS status or every required external-DNS CNAMEcertificates:readfree
create_free_certificateCreate one explicitly approved, idempotent no-cost DV requestcertificates:managefree
download_free_certificateRetrieve only the issued public leaf and chain, never a private keycertificates:readfree
manage_free_certificateCompatibility tool for older clients; use the individual actions belowcertificates:managefree
renew_free_certificateRequest early renewal for the authorized certificate namescertificates:managefree
revoke_free_certificateRevoke an owned certificate after explicit approvalcertificates:managefree
recheck_free_certificateRecheck validation for a pending certificatecertificates:managefree
cancel_free_certificateCancel an eligible pending certificate requestcertificates:managefree

For portable API or assistant installation, use customer_csr and retain the private key where the CSR was generated. A managed request can renew unattended, but MCP cannot export its private key. Issuance is asynchronous and quota-bound: poll get_free_certificate, follow get_free_certificate_instruction, and do not treat a queued request as issued.

Automatic SSL subscriptions

ToolDescriptionScopePaid
list_automatic_ssl_subscriptionsList customer-owned Automatic SSL subscriptions without exposing ACME credentialscertificates:readfree
get_automatic_ssl_subscriptionGet one owned subscription, its domain set, renewal state, and readinesscertificates:readfree
quote_automatic_ssl_subscriptionQuote an exact domain set in EUR without chargingcertificates:readQuote: certificates:order
order_automatic_ssl_subscriptionConfirm and pay for the explicitly approved subscription quotecertificates:readPaid: certificates:order
list_automatic_ssl_actionsList customer-visible subscription and DNS-name changescertificates:readfree
refresh_automatic_ssl_subscriptionSchedule an authoritative read-only status refreshcertificates:managefree
quote_automatic_ssl_domainQuote one additional DNS name in EUR without chargingcertificates:readQuote: certificates:order
order_automatic_ssl_domainConfirm and pay for the explicitly approved DNS-name quotecertificates:readPaid: certificates:order
quote_automatic_ssl_renewalQuote the next eligible subscription term in EURcertificates:readQuote: certificates:order
order_automatic_ssl_renewalPrepay the explicitly approved next term from account balancecertificates:readPaid: certificates:order
manage_automatic_ssl_subscriptionCompatibility tool for older clients; use the individual actions belowcertificates:managefree
cancel_automatic_ssl_subscriptionCancel an owned Automatic SSL subscriptioncertificates:managefree
remove_automatic_ssl_domainRemove one eligible DNS name from a subscriptioncertificates:managefree
replace_automatic_ssl_domainCorrect an eligible DNS name within its correction windowcertificates:managefree

Automatic SSL is a portable paid ACME subscription. It works with a compatible client on VPSnet or another provider; it is not limited to managed applications. The private ACME server URL and EAB credentials are revealed only in the two-factor-protected customer portal. They are intentionally not an MCP tool or API-key response, so an assistant cannot copy them into model context.

Paid TLS certificates

ToolDescriptionScopePaid
list_certificate_catalogList published DV/OV/EV products and final customer offers in EURcertificates:readfree
get_certificate_catalog_productGet one published product, its capabilities, and current offerscertificates:readfree
list_certificatesList customer-owned paid certificate orders and issuance statecertificates:readfree
get_certificateGet one owned paid certificate ordercertificates:readfree
quote_certificateQuote an exact certificate or renewal without chargingcertificates:readQuote: certificates:order
order_certificateConfirm and pay for an explicitly approved certificate quotecertificates:readPaid: certificates:order
get_certificate_validationRead per-name validation state and an owner-visible pending challengecertificates:readfree
download_certificateDownload the issued public leaf and chain; private keys are never returnedcertificates:readfree
list_certificate_actionsList durable customer-visible management actionscertificates:readfree
refresh_certificateSchedule a read-only certificate-authority status reconciliationcertificates:managefree
manage_certificateCompatibility tool for older clients; use the individual actions belowcertificates:managefree
cancel_certificateCancel an eligible pending certificate ordercertificates:managefree
recheck_certificate_validationRecheck certificate validationcertificates:managefree
resend_certificate_validationResend a certificate validation message after approvalcertificates:managefree
change_certificate_validationChange the validation method for one certificate namecertificates:managefree
reissue_certificateRequest a same-name reissue with a new public CSRcertificates:managefree

Paid certificates are portable account products: customers may install them on Nginx, Apache, lighttpd, OpenLiteSpeed, HAProxy, Caddy, mail, API, load-balancer, or other TLS endpoints. They are separate from automatic HTTPS attached to a VPSnet-managed application. The MCP accepts only a public PKCS#10 CSR; the private key must remain under customer control and must never enter a tool argument or model context. Quote responses contain the final customer price in EUR, and ordering requires explicit approval plus the same idempotency key and short-lived quote token.

Domains

ToolDescriptionScopePaid
list_domainsList domains owned by the accountdomains:readfree
get_domainGet one owned domain and its pending actiondomains:readfree
list_domain_tldsList TLDs currently enabled for orderingdomains:readfree
check_domain_availabilityCheck domain availability without orderingdomains:readfree
get_domain_ordering_statusGet non-secret domain-ordering readinessdomains:readfree
set_domain_nameserversQueue a nameserver change for an owned domaindomains:managefree
list_domain_glue_recordsList same-domain nameserver address recordsdomains:readfree
create_domain_glue_recordQueue creation or update of a nameserver address recorddomains:managefree
delete_domain_glue_recordQueue deletion of a nameserver address recorddomains:managefree
get_domain_parent_dsList parent-zone DNSSEC DS recordsdomains:readfree
add_domain_parent_dsQueue addition of parent-zone DS recordsdomains:managefree
delete_domain_parent_dsQueue deletion of parent-zone DS recordsdomains:managefree
list_domain_contactsList domain contacts owned by the accountdomains:readfree
create_domain_contactCreate a domain contactdomains:managefree
update_domain_contactUpdate an existing domain contactdomains:managefree
delete_domain_contactDelete an unused domain contactdomains:managefree
quote_domain_registerQuote a domain registration without chargingdomains:readQuote: domains:order
confirm_domain_registerConfirm and pay for an exact registration quotedomains:managePaid: domains:order
quote_domain_transferQuote a domain transfer without chargingdomains:readQuote: domains:transfer
confirm_domain_transferConfirm and pay for an exact transfer quotedomains:managePaid: domains:transfer
quote_domain_renewQuote renewal of an owned domain without chargingdomains:readQuote: domains:renew
confirm_domain_renewConfirm and pay for an exact renewal quotedomains:managePaid: domains:renew
quote_domain_restoreQuote restoration of a domain in redemption without chargingdomains:readQuote: domains:renew
confirm_domain_restoreConfirm and pay for an exact restoration quotedomains:managePaid: domains:renew
set_domain_auto_renewEnable or disable automatic renewal for an owned domaindomains:managePaid (future renewals)
get_registrar_lockGet registrar transfer-lock state; changes remain panel-onlydomains:readfree

DNS

ToolDescriptionScopePaid
list_service_dns_optionsList owned zones and service addresses available for DNS attachmentdns:readfree
attach_service_dns_recordPoint an owned-zone name at one service addressdns:writefree
list_dns_zonesList forward DNS zones owned by the accountdns:readfree
create_dns_zoneCreate a native or secondary zone awaiting ownership TXT verificationdns:writefree
get_dns_zoneGet desired records with IDs and a recoverable ownership TXT valuedns:readfree
reapply_dns_zoneRetry publication of a published DNS zone whose apply_state is failed.dns:writefree
get_dns_zone_diagnosticsInspect delegation, SOA, DNSSEC, and record hygienedns:readfree
export_dns_zoneExport a native zone as a BIND-style zone filedns:readfree
import_dns_zoneImport bounded BIND-style records into a native zonedns:writefree
list_dns_templatesList backend-defined DNS record templatesdns:readfree
apply_dns_templatePreview or apply one DNS record templatedns:writefree
delete_dns_zoneDelete a forward DNS zonedns:writefree
verify_dns_zoneVerify ownership and publish a pending or verification-expired zonedns:writefree
reissue_dns_zone_verificationRotate ownership TXT for a pending or verification-expired zone after checking its recoverable valuedns:writefree
get_dnssecGet DNSSEC state and public DNSKEY/DS materialdns:readfree
set_dnssecEnable or safely disable DNSSEC signingdnssec:managefree
upsert_dns_recordAdd a name/type/content tuple; an identical tuple updates TTL/comment and re-enables the recorddns:writefree
update_dns_recordReplace one existing non-system DNS record's content by exact record IDdns:writefree
delete_dns_recordDelete one forward DNS desired-state recorddns:writefree
get_dns_service_statusGet managed DNS cluster status and published endpointsdns:readfree
get_dns_zone_historyGet recent zone and record change historydns:readfree
list_ddns_tokensList non-secret DDNS and ACME token metadatadns:readfree
create_ddns_tokenCreate a narrow DDNS or ACME updater tokendns:writefree
revoke_ddns_tokenRevoke a DDNS or ACME updater tokendns:writefree

Snapshots

ToolDescriptionScopePaid
list_snapshotsList Cloud VPS disk snapshots and billing policyservices:readfree
create_snapshotCreate a Cloud VPS disk snapshotservices:manageBilled while kept
rollback_snapshotDestructively roll a Cloud VPS back to a snapshotservices:managefree
delete_snapshotDelete a Cloud VPS disk snapshot and stop its keep billingservices:managefree
list_firecracker_snapshotsList temporary Firecracker VPS snapshots and expiryservices:readfree
create_firecracker_snapshotCreate a temporary Firecracker VPS snapshotservices:manageBilled while kept
rollback_firecracker_snapshotDestructively roll a Firecracker VPS back to a snapshotservices:managefree
delete_firecracker_snapshotDelete a Firecracker VPS snapshot and stop its keep billingservices:managefree

Service Rescue

ToolDescriptionScopePaid
get_service_rescueGet rescue capability and current durable rescue sessionservices:readfree
enter_service_rescueRestart an eligible service into an advertised rescue imageservices:rescuefree
exit_service_rescueRestore the exact pre-rescue boot configuration and stateservices:rescuefree

Firecracker Functions

ToolDescriptionScopePaid
list_functionsList usage-billed Firecracker Functionsservices:readfree
list_function_historyRead paginated account-wide Firecracker Function invocation history.services:readfree
get_functionGet one function, including integrity state and protected values when readableservices:readfree
create_functionCreate a Firecracker Functionservices:managefree
update_functionUpdate a function; unreadable protected values require explicit replacement approvalservices:managefree
delete_functionDelete a Firecracker Functionservices:managefree
invoke_functionInvoke a function with metered CPU and memory usage; one stable Idempotency-Key prevents exact retries from running or billing twiceservices:managePaid: fn:invoke
list_function_invocationsList a function's invocations, status, duration, and costservices:readfree
get_function_invocationGet one invocation's output, logs, and usage costservices:readfree

On-demand servers

ToolDescriptionScopePaid
get_temp_vm_optionsGet launch state, profiles, compatibility pricing inputs, and exact storage/network policyservices:readfree
quote_temp_vmInspect the disabled quote operation and its coming-soon responseservices:manageDisabled (coming soon)
list_temp_vmsList the account's on-demand server sessions and current optionsservices:readfree
create_temp_vmInspect the disabled create operation; no payment or allocation occurs while the product is coming soonservices:manageDisabled (coming soon)
get_temp_vmGet one tenant-owned on-demand server sessionservices:readfree
delete_temp_vmPermanently delete an on-demand server after explicit data-loss acknowledgement; no customer refund is initiatedservices:managefree

Customer ordering is disabled while the on-demand server lifecycle is being validated. Current options disclose that automatic backups and snapshots are not included and outbound connections to mail-delivery TCP ports 25, 2525, 465, and 587 are restricted. Existing sessions remain available through list/get/delete for cleanup. Fixed-TTL and prepaid fields in the disabled compatibility schema are not a launch promise; the flexible duration and metered-billing contract must be published consistently before ordering is enabled.

Guest Agent

ToolDescriptionScopePaid
get_guest_agent_statusCheck QEMU guest-agent availability on a Cloud VPSservices:readfree

History

ToolDescriptionScopePaid
get_login_historyGet account login historyaccount:readfree
get_management_historyGet management/activity historyaccount:readfree

Public

ToolDescriptionScopePaid
get_pricingGet public pricingnonefree
get_system_statusGet VPSnet.com system statusnonefree
get_faqGet frequently asked questionsnonefree

SDN networking

Networking permissions must be granted explicitly: networking:read or networking:manage; the ordinary full/read defaults do not include them. Start with capabilities, then read the exact owned resource and its generation. The backend enforces tenant ownership, availability and server 2FA locks. Accepted, paid, and ready are separate states; poll the matching operation or resource. DNS changes are polled through the network's settings.dns_change.

New private/public load balancers, VPNs and public addresses use an explicit quote → common checkout → order-status flow. Quote tools always send prepare_after_payment=true: no provisioning happens before payment. Show the quote's exact EUR gross_amount, obtain approval, and pass the same idempotencyKey, quote_id and quoteToken to order_network_product. API keys additionally need full access, enabled paid operations, networking:order, and spend limits. Read get_network_payment_methods and select system=balance; non-balance checkout is refused for API keys. If confirmation is uncertain, recover by the original quote ID and key. For an SDN order with status=paid_pending, billing_state=captured and reason_code=network_product_ip_inventory_wait, payment is retained while public IP inventory is unavailable. Poll get_network_product_order with the same order ID; the backend resumes automatically when inventory returns. Do not create another order, charge again or submit a manual retry. manual_review or network_product_stock_reconciliation_required instead requires operator review; it does not authorize an automatic retry.

Ordinary VPS orders expose this wait through get_service.stateProcess.waitingReason=public_ip_inventory (also mirrored in the legacy stateProccess field). Poll the same service without reordering. stateProcess.attention=true requires operator attention. A successful payment or accepted create does not establish that the server is ready.

Public load balancer tiers alb_proxy_3/alb_proxy_5 use request kind proxy_lb; private tier nlb uses private_lb. Availability and prices come from the live product catalog. A legacy unpaid appliance-create endpoint is not an alternative to checkout.

Device configuration pickup is a one-time management action, even though its HTTP method is GET. Generate the reveal key pair outside MCP, submit only the X25519 public key, save the returned sealed ciphertext, and decrypt it outside the conversation. Neither private keys nor plaintext WireGuard configuration are requested or decrypted by these tools. Never automatically repeat a pickup after an uncertain response.

The current backend has no customer network rename, existing-port fixed-IP edit, appliance retry, or native site-to-site API in this release. Fixed DHCP addresses are selected at attach; removing/recreating an attachment requires separate approval and is not represented as an in-place edit. Legacy unpaid LB/VPN create routes, legacy stock-before-payment purchases and enabling automatic renewal via API keys are deliberately not exposed. Existing public binding management remains available; new public addresses use account ownership and common checkout. A tool being listed does not enable a backend feature gate.

ToolDescriptionScopePaid
get_network_payment_methodsRead payment-method metadata without starting paymentnonefree
get_networking_capabilitiesRead account networking availability, quota, creation options and eligible order-time attachmentsnetworking:readfree
get_networking_featuresRead current networking feature gates, DNS options and supported contract extensions.networking:readfree
get_networking_overviewRead owned networks, quota and operation snapshotnetworking:readfree
get_networking_topologyRead the account topology with network-scoped identitiesnetworking:readfree
list_networking_operationsRead recent network operations and operations_has_morenetworking:readfree
get_networking_operationRead an accepted network or port operationnetworking:readfree
list_private_networksList owned private networks, including deletion awaiting verified cleanup.networking:readfree
get_private_networkRead one owned network including DHCP reservations, DNS change progress, generation and project_id.networking:readfree
create_private_networkCreate a private network intentnetworking:managefree
delete_private_networkRequest deletion of an empty networknetworking:managefree
retry_private_networkRetry the failed current network operation only; preserve its current generationnetworking:managefree
set_private_network_dnsChange DHCP DNS servers in placenetworking:managefree
set_private_network_namesReplace the complete internal DNS zone label and alias listnetworking:managefree
list_private_network_portsRead owned network ports, their fixed DHCP addresses, generations and attachment statesnetworking:readfree
list_service_private_portsRead private ports and order attachment recovery state for one owned service order number.networking:readfree
list_network_attachment_candidatesRead attachable services and each attachment_modenetworking:readfree
attach_private_network_portAttach an owned service; omit ipv4 for automatic allocation or pass a fixed usable addressnetworking:managefree
detach_private_network_portDetach the owned server portnetworking:managefree
retry_private_network_portRetry the failed current port operation with the PORT generation and any required restart approval.networking:managefree
get_network_vpn_summaryRead the network's VPN summary, including truthful absencenetworking:readfree
get_network_routed_egressRead this network's NAT/internet access, public address and qualification state.networking:readfree
set_network_routed_egressRequest the currently supported NAT transition for an owned network; the backend may refuse mode changesnetworking:managefree
get_security_group_capabilitiesRead security-group availability and whether the network default policy can be changed.networking:readfree
list_network_security_groupsList groups in the owned projectnetworking:readfree
create_network_security_groupCreate a named allow-rule setnetworking:managefree
update_network_security_groupReplace the complete group name and rule list at its expected revisionnetworking:managefree
delete_network_security_groupDelete an unreferenced customer group at its expected revision; referenced groups are refused.networking:managefree
clone_network_security_groupClone an owned group into a new name; use the source group's current revision.networking:managefree
get_network_security_policyRead default policy, assigned groups and policy application statenetworking:readfree
set_network_default_security_policyChange accept/deny for servers without custom groupsnetworking:managefree
set_private_port_security_groupsReplace the port's complete customer-group listnetworking:managefree
retry_network_security_policyRetry the failed network security policy using its current desired state.networking:managefree
retire_network_security_policyRetire the policy only after its server ports are gonenetworking:managefree
get_network_appliance_capabilitiesRead available load balancer providers/tiers, public qualification, VPN capabilities and quotanetworking:readfree
list_network_appliancesRead owned load balancers and VPN gateways with one stream cursor.networking:readfree
get_network_appliance_billingRead current customer-visible recurring appliance lines and currency.networking:readfree
get_network_appliance_operationPoll an accepted appliance operationnetworking:readfree
list_network_load_balancersList private and public load balancers and customer-safe health/qualification state.networking:readfree
get_network_load_balancerRead one owned load balancer, listeners, members, generation and healthnetworking:readfree
estimate_network_load_balancerRead a technical load balancer estimate for this exact configurationnetworking:readfree
delete_network_load_balancerRequest appliance teardown at its current generation; this is not a refund or paid-period cancellationnetworking:managefree
add_network_load_balancer_memberAdd an attached private server address to the selected listener; backend validates membership in this network.networking:managefree
remove_network_load_balancer_memberRemove a member from rotation using the load balancer generation.networking:managefree
add_network_load_balancer_listenerAdd a listener and optional initial members using currently offered protocol capabilitiesnetworking:managefree
remove_network_load_balancer_listenerRemove a listener and its members; deleting the last listener is refused.networking:managefree
list_network_vpn_gatewaysList owned VPN gateways, their device peers and safe statusnetworking:readfree
get_network_vpn_gatewayRead one owned VPN gateway, current generation, device peers, grant candidates and attachment capability.networking:readfree
delete_network_vpn_gatewayRequest teardown of an owned VPN gateway; all devices lose connectivitynetworking:managefree
attach_network_vpn_gatewayAttach or move an account VPN to an owned network only when standalone attachment is advertisednetworking:managefree
detach_network_vpn_gatewayDetach an account VPN from its network when supported; it keeps its paid period and devices but recreates the gatewaynetworking:managefree
set_vpn_server_accessChoose accept or groups_only for the VPN's access to attached servers when this capability is availablenetworking:managefree
create_network_vpn_peerAdd a device with an externally generated one-time PUBLIC reveal keynetworking:managefree
take_network_vpn_peer_configConsume the device's sealed configuration ONCEnetworking:managefree
revoke_network_vpn_peerRevoke one device using the VPN GATEWAY generationnetworking:managefree
set_network_vpn_peer_grantsReplace the device's complete reachable-server list when standalone VPN is availablenetworking:managefree
get_network_vpn_egress_optionsRead supported VPN Internet exits and qualificationnetworking:readfree
set_network_vpn_peer_egressSet a device's private-only, inherited NAT, or advertised chosen exit policynetworking:managefree
list_network_productsRead current paid products, live tier names, prices and purchase capability; public proxy load balancer 3/5-node offerings must come from this catalog.networking:readfree
list_network_product_periodsRead owned product periods, renewal availability and lifecycle facts.networking:readfree
quote_network_productCreate the network product's exact paid quote for COMMON CHECKOUTnetworking:manageQuote: networking:order
quote_account_vpnCreate an account VPN quote for common checkout when vpn_account_order is advertisednetworking:manageQuote: networking:order
order_network_productConfirm a common-checkout purchase from an approved exact quotenetworking:managePaid: networking:order
get_network_product_orderRead an owned common-checkout order's payment and fulfilment statenetworking:readfree
find_network_product_orderRecover an uncertain checkout by the ORIGINAL quote_id; order=null means no order was found, not proof to use a new payment key.networking:readfree
quote_network_product_renewalQuote one next paid month for a network product; no chargenetworking:manageQuote: networking:order
renew_network_productPay the exact previously disclosed renewal from account balancenetworking:managePaid: networking:order
disable_network_product_auto_renewDisable automatic renewalnetworking:managefree
quote_vpn_period_renewalQuote the VPN's next month on its actual paid scope; no chargenetworking:manageQuote: networking:order
renew_vpn_periodPay the VPN's approved next-month renewal from account balance using the exact quote and original key.networking:managePaid: networking:order
disable_vpn_auto_renewDisable the VPN's automatic renewal; the current paid period remainsnetworking:managefree
list_network_public_addressesRead owned paid public addresses, account limits, target support and purchase availability.networking:readfree
get_network_public_addressRead one owned public address, attachment and paid-period state.networking:readfree
quote_network_public_addressQuote a new paid public address for common checkout; no chargenetworking:manageQuote: networking:order
attach_public_address_to_networkAttach or move an already-paid address to an owned network's NATnetworking:managefree
attach_public_address_to_serverAttach or move an owned paid public address to an eligible zero-public-IP server's private portnetworking:managefree
detach_network_public_addressDetach an owned public address from its current target; it stays owned for the paid periodnetworking:managefree
quote_public_address_renewalQuote the address's next month without charging; use the returned quote and this key for confirmation.networking:manageQuote: networking:order
renew_network_public_addressPay the approved address renewal from balance with its exact quote ID/token and original key.networking:managePaid: networking:order
disable_public_address_auto_renewDisable address automatic renewal; ownership lasts until paid_untilnetworking:managefree
get_network_public_bindingRead one existing owned public binding's generation, state and assigned addressnetworking:readfree
bind_network_public_ipBind an already reserved floating public binding to an owned private port when supportednetworking:managefree
move_network_public_ipMove a prepared floating public binding to another owned private port; confirm interruption to the old target.networking:managefree
configure_network_public_forwardingConfigure an existing reserved forwarding binding's TCP/UDP listenersnetworking:managefree
delete_network_public_bindingRequest deletion of an existing binding using its generationnetworking:managefree

Worked examples

Each example is a request to your assistant and the tools it calls.

Order a VPS (quote, then confirm)

Order the cheapest Cloud VPS with Debian and my SSH key, paid from balance.

  1. get_order_plans for the product, then get_order_options for the chosen plan (OS, period, resource IDs) and list_ssh_keys for the key ID.
  2. order_service with plan, os, period, resources, sshKey (or rootPassword, not both), payment: { payment: 1, successUrl: '', cancelUrl: '' } and a stable idempotencyKey. The first call returns a quote without charging. The API key needs vps:order (or vds:order, ds:order, fc:order) and spend caps.
  3. Show the exact gross EUR total and billing period. After the customer's approval, repeat the unchanged order and key with the returned quoteToken, expected_total_eur and acknowledge_charge: true. Inspect the original attempt in the panel if its outcome is unknown; do not create another key to retry it.
  4. Poll get_service for the returned order number; payment accepted is not server ready.

Networking (quote, then order)

Add a private load balancer to my network and pay from balance.

  1. get_networking_capabilities, list_network_products and get_network_payment_methods (pick the system=balance method).
  2. quote_network_product with kind (private_lb, proxy_lb or vpn_gateway), tier and an idempotencyKey; show the quote's EUR gross_amount.
  3. After approval, order_network_product with the same idempotencyKey, quote_id, quoteToken, the balance payment and acknowledge_charge: true. If the result is uncertain, find_network_product_order by the original quote_id, then poll get_network_product_order. Never buy a second copy.

DNS record upsert

Point www.example.com at 203.0.113.10 with a 5 minute TTL.

  1. list_dns_zones to find the zone_id, then get_dns_zone to inspect the existing records and their IDs (needs dns:read).
  2. To add an A value, call upsert_dns_record with zone_id, name: "www", type: "A", content: "203.0.113.10", ttl: 300 (needs dns:write). Different content adds another record and keeps existing values. An identical name/type/content tuple updates its TTL/comment and re-enables it if disabled. To replace an existing value, use update_dns_record with its exact record_id and the desired name, type, content and TTL.
  3. get_dns_zone to read the desired records back, or get_dns_zone_history to see the change.

For a waiting zone whose ownership TXT value was lost, first read get_dns_zone.zone.verification.record.value. Use reissue_dns_zone_verification only if that value is null/unrecoverable or the customer requests rotation. It supports both pending_verification and verification_expired; the previous value stops being accepted. Update the TXT at the location given by zone.verification.next_step, then call verify_dns_zone. Reissuing alone does not verify the zone or reset its status.

Order a paid certificate

Buy a one-year DV certificate for example.com; I generated the CSR myself.

  1. list_certificate_catalog and get_certificate_catalog_product to choose a product and read its current EUR offer.
  2. quote_certificate with product_id, offer_id, offer_generation, common_name (plus any alternative_names), the public PKCS#10 csr, the owned contact IDs and an idempotencyKey (needs certificates:order, paid operations and caps). Never send a private key.
  3. After the user approves the exact total, order_certificate with the same request, the same idempotencyKey, the quote_token, the payment and acknowledge_exact_quote_and_payment: true.
  4. get_certificate_validation (publish the challenge, for example through upsert_dns_record), then download_certificate once it is issued.

Getting an API key

  1. Log in at vpsnet.com
  2. Go to Account > API Keys
  3. Click Create API Key
  4. Give it a name and copy the key

The key is shown only once — store it securely.

Troubleshooting

MCP tools not appearing in Claude Code VS Code extension

  1. Install Claude Code CLI: npm install -g @anthropic-ai/claude-code
  2. Verify: claude --version should show a version number
  3. Add server via CLI: claude mcp add vpsnet -- npx -y vpsnet-mcp
  4. Completely restart VS Code (not just reload window)
  5. Check ~/.claude.json for correct configuration

claude: command not found

Install the Claude Code CLI globally:

npm install -g @anthropic-ai/claude-code

Verify your PATH includes npm global packages. On Windows, restart your terminal after installing.

Environment variables not working

For Claude Code extension, environment variables must be in the env object within .claude.json, NOT system environment variables:

"vpsnet": {
    "type": "stdio",
    "command": "npx",
    "args": ["-y", "vpsnet-mcp"],
    "env": {
        "VPSNET_API_KEY": "your_actual_key_here"
    }
}

API key errors

This server needs a management API key. Every failure below is reported by the tools with an auth_problem object containing the cause and the fix, so read that rather than guessing from the HTTP status.

Tool failures carry isError: true while preserving the API error details and recovery guidance. Unknown mutation outcomes must be checked before another attempt. Service order numbers must be copied from list_services; ASCII letters, digits, and hyphens are supported, including multi-order suffixes. Malformed or oversized URL identifiers are rejected before an API request.

What you seeWhat it meansFix
aiScopedApiKeyCannotManageAccount (403)The key is an AI-scoped key. Those are issued only for VPSnet AI assistant inference and are deliberately refused on the entire account API. Granting scopes cannot change this — the restriction is on the key type.Create a separate key with scope full (or read for GET-only use) and use that here. Keep the AI-scoped key for inference.
apiKeyRejected (401)The key failed authentication outright. The API returns one identical 401 for every cause, so it is one of: unknown, revoked, expired, malformed, or your source IP is not on the key's IP allowlist.Check the key is active and copied whole, and that any IP allowlist includes the address this server calls from.
readOnlyApiKeyCannotWrite (401)A read-scoped key was used for a write; read keys are limited to GET.Use a full-scope key, or stay on read-only tools.
apiKeyScopeMissing (403)The key authenticated but lacks the granular scope named in requiredScope.Add that scope in Account > API Keys.
apiKeyForbidden (403)The endpoint refuses API keys entirely. API keys never grant admin access.Use the panel with a signed-in session.
  • Verify the key is correct (starts with vpsnet_ followed by 43 characters)
  • Keys are shown only once at creation — if lost, create a new one
  • Check that the key hasn't expired (Account > API Keys)

deploy_ssh_key succeeded but SSH still fails

  • All VPSnet.com servers use root as the SSH username
  • Key deployment is async — wait 15-30 seconds after deploying before attempting SSH

fetch is not defined or unexpected errors

This server requires Node.js 20+. If your default node is older (common with nvm setups), either:

  • Set Node 20+ as default: nvm alias default 20
  • Or use the nvm wrapper shown in the Codex section

License

MIT