vpsnet-mcp 2.1.0 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Features
6
6
 
7
- - **190+ tools** covering VPSNet service management, managed applications, free and paid TLS certificates, Automatic SSL subscriptions, DNS, domains, billing, API keys, and account operations
7
+ - **280+ tools** covering VPSNet service management, managed applications, free and paid TLS certificates, Automatic SSL subscriptions, DNS, domains, billing, API keys, and account operations
8
8
  - Account & profile management
9
9
  - VPS lifecycle (start, stop, restart, reinstall OS)
10
10
  - Plan changes (free upgrades/downgrades; KVM/Firecracker disks cannot shrink)
@@ -18,6 +18,33 @@
18
18
  - Ordering new VPS instances
19
19
  - System status & pricing
20
20
 
21
+ ## Remote OAuth connector
22
+
23
+ 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.
24
+
25
+ The remote connector uses `https://mcp.vpsnet.com/mcp` and customer consent through
26
+ VPSnet. See [Remote AI connections](docs/REMOTE_MCP.md) for connection setup,
27
+ permissions and supported operations.
28
+
29
+ The distributable [plugin README](plugin/README.md), manifests and skills are in English.
30
+ See [directory readiness](docs/DIRECTORY_READINESS.md) for package validation and
31
+ publisher requirements, and [supported use cases](plugin/skills/vpsnet-operations/references/use-cases.md)
32
+ for server, application and networking scenarios. Directory publication and
33
+ provider account availability are separate from installing this source code.
34
+
35
+ See [AI client setup](docs/CLIENTS.md) for Gemini CLI, Cursor, Kimi Code, Kiro,
36
+ Cline and other remote OAuth clients. Their packages share the same VPSnet
37
+ endpoint and task skills. The npm package supplies the local MCP server;
38
+ installable plugin bundles also carry the AI application's manifest and skills.
39
+
40
+ Build all client bundles with `python3 scripts/package-distribution.py`.
41
+ The output includes checksums and identifies each format. Public directory
42
+ submission materials are in [the catalog kit](distribution/catalogs/README.md).
43
+
44
+ [Ordering](docs/ORDERS.md) 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.
45
+
46
+ The instructions below describe the existing local stdio/API-key client.
47
+
21
48
  ## Prerequisites
22
49
 
23
50
  Before installing, ensure you have:
@@ -94,6 +121,18 @@ VPSnet-managed DNS zone. `external_https` records an existing customer-managed
94
121
  HTTPS address; VPSnet does not configure or validate its DNS, TLS certificate,
95
122
  or reverse proxy.
96
123
 
124
+ A `managed_https` access may also list `additional_addresses` (up to 4 per
125
+ endpoint, 8 per application): other names in the customer's own VPSnet DNS
126
+ zones, each with `zone_id`, `name`, `action` and `approve_dns: true`. An empty
127
+ `name` or `"@"` is the zone's bare domain, so `example.com` can sit next to
128
+ `www.example.com`. `action` is `redirect` (default; a 301 to the main address
129
+ that keeps the path and query) or `serve` (opens the same application). Adding
130
+ or removing an additional address never changes the main address. The list is
131
+ the complete wanted set: an access change that omits `additional_addresses`
132
+ removes the saved ones, so pass them again to keep them. Additional
133
+ addresses are refused on every other access mode, and VPSnet charges nothing
134
+ for them.
135
+
97
136
  `list_application_registry_credentials` exposes only private registry credential
98
137
  metadata. Registry token creation and rotation are intentionally not MCP tools:
99
138
  use the VPSnet panel or direct REST API so a token never enters a model prompt or
@@ -507,6 +546,8 @@ Follow the [Windsurf MCP documentation](https://docs.windsurf.com/windsurf/mcp).
507
546
  |----------|----------|-------------|
508
547
  | `VPSNET_API_KEY` | Yes | Your VPSnet.com API key |
509
548
  | `VPSNET_API_URL` | No | API base URL (defaults to `https://api.vpsnet.com`); any `https://*.vpsnet.com` host, e.g. a staging API |
549
+ | `VPSNET_AI_URL` | No | Delegated SSH runtime; production uses `https://ai.vpsnet.com`. Non-production requires the approved API origin followed by `/ai-control`. |
550
+ | `VPSNET_AI_API_ORIGIN` | Non-production SSH only | Operator-approved HTTPS VPSnet API origin; must exactly match `VPSNET_API_URL`. Set both runtime variables privately for a non-production deployment. |
510
551
  | `VPSNET_API_TIMEOUT_MS` | No | Per-request timeout (default 45000) |
511
552
 
512
553
  Requests go out from the machine that runs this server, not from your browser. A
@@ -515,161 +556,203 @@ request with an HTML `403` page from its web server; the tool result then says
515
556
  so (`non_api_response: true`, `http_status: 403`) instead of passing the page on.
516
557
  Every error result carries `http_status`; a `429` also carries `retry_after`.
517
558
 
559
+ ## Authentication, scopes and paid operations
560
+
561
+ Every request is sent with the `X-API-KEY` header (`VPSNET_API_KEY`).
562
+
563
+ - **Use a management key.** Its access level is `full` (reads and changes) or
564
+ `read` (GET only). An **AI-scoped key** is issued only for VPSnet AI assistant
565
+ inference and is refused on every account route, so no tool here works with one;
566
+ the error result carries `auth_problem` with the reason and the fix.
567
+ - **Granular scopes only narrow a key.** A key with an empty scope list keeps
568
+ everything its access level allows; listing scopes (for example `dns:read`,
569
+ `services:manage`) restricts it. `X:manage` includes `X:read`. Networking is the
570
+ exception: `networking:read` / `networking:manage` / `networking:order` are never
571
+ implied by `full` or `read` and must be granted explicitly.
572
+ - **Paid operations are a separate gate.** A tool marked `Paid` or `Quote` in the
573
+ tables below needs a `full`-access key, `paid_operations_enabled`, the named paid
574
+ scope (`vps:order`, `vds:order`, `ds:order`, `fc:order`, `domains:order`,
575
+ `domains:renew`, `domains:transfer`, `certificates:order`, `applications:restore`,
576
+ `services:restore`, `fn:invoke`, `networking:order`), configured daily and
577
+ monthly spend caps, and a stable `idempotencyKey` (reuse the same key to replay
578
+ an uncertain attempt, never a new one). Orders run quote, then confirm with the
579
+ returned `quoteToken`; disclose the exact EUR total to the user before confirming.
580
+ Use `list_api_keys` to see your key's scopes, paid scopes, caps and rate limit.
581
+ - **Rate limits.** Requests are rate-limited per key (`rate_limit` in
582
+ `list_api_keys`, requests per minute). On HTTP `429` back off and retry after
583
+ `retry_after` seconds instead of retrying immediately.
584
+ - API keys can never create, change or revoke API keys, and never receive admin
585
+ access.
586
+
518
587
  ## Tools
519
588
 
589
+ The tables below are generated: edit `scripts/tool-scopes.json` (or the tool
590
+ registration) and run `npm run docs:tools`; `npm test` fails when they drift.
591
+
592
+ **Scope** is the granular API-key scope the tool needs (`none` = any management
593
+ key; `a + b` = both; `a or b` = either, depending on the object). **Paid**:
594
+ `Paid: x` spends account balance and needs the paid scope `x` plus the gates
595
+ above; `Quote: x` creates a price quote without charging but is gated the same
596
+ way; `Paid` alone charges the balance with a `full`-access key and no separate
597
+ paid scope; `Needs paid scope: x` is a read that exposes balance or price data;
598
+ `Billed while kept` means free for an initial window, then metered; `free` is
599
+ everything else.
600
+
601
+ <!-- tool-reference:start -->
602
+
520
603
  ### Account
521
- | Tool | Description |
522
- |------|-------------|
523
- | `get_account` | Get account info (user ID, email, balance, VAT rate) |
524
- | `get_profile` | Get user profile details (name, address, company) |
604
+ | Tool | Description | Scope | Paid |
605
+ |------|-------------|-------|------|
606
+ | `get_account` | Get account info (user ID, email, balance, VAT rate) | none | free |
607
+ | `get_profile` | Get user profile details (name, address, company) | `account:read` | free |
525
608
 
526
609
  ### Services
527
- | Tool | Description |
528
- |------|-------------|
529
- | `list_services` | List all active VPS services |
530
- | `get_service` | Get detailed info for a service |
531
- | `get_service_graphs` | Get one graph series: metric (cpu, ram, ssd, net, io, …) and period (5m … 1y) |
532
- | `get_event` | Read an async action's state by its `event` id or `noty` UUID |
533
- | `wait_for_event` | Poll an async action until completed or error (or a timeout) |
534
- | `get_service_history` | Get action history for a service |
610
+ | Tool | Description | Scope | Paid |
611
+ |------|-------------|-------|------|
612
+ | `list_services` | List all active VPS services | `services:read` | free |
613
+ | `get_service` | Get detailed info for a service | `services:read` | free |
614
+ | `get_service_graphs` | Get one graph series: metric (cpu, ram, ssd, net, io, …) and period (5m … 1y) | `services:read` | free |
615
+ | `get_event` | Read an async action's state by its `event` id or `noty` UUID | `services:read` or `account:read` | free |
616
+ | `wait_for_event` | Poll an async action until completed or error (or a timeout) | `services:read` or `account:read` | free |
617
+ | `get_service_history` | Get action history for a service | `services:read` | free |
535
618
 
536
619
  ### Managed Applications
537
- | Tool | Description |
538
- |------|-------------|
539
- | `list_application_catalog` | List published applications compatible with a service |
540
- | `list_service_applications` | List installed applications and pending checkout selection |
541
- | `get_application_installation` | Get observed state, health, drift, endpoints, components, resource history, and thresholds |
542
- | `get_application_events` | Get bounded customer-safe installation events |
543
- | `get_application_health` | Run and poll a fresh container-health inspection |
544
- | `get_application_logs` | Run and poll a size-bounded recent-log inspection |
545
- | `list_application_restore_points` | List eligible nightly points for the exact application revision |
546
- | `quote_application_data_restore` | Freeze the exact selective-restore balance charge without payment |
547
- | `restore_application_data` | Pay and queue confirmed selective replacement of declared application data |
548
- | `get_application_data_restore` | Poll one tenant-bound selective data restore |
549
- | `list_application_registry_credentials` | List non-secret private registry credential metadata |
550
- | `validate_application_recipe` | Validate customer Compose against the target worker policy |
551
- | `list_application_recipes` | List customer-owned immutable recipe projects |
552
- | `list_application_recipe_revisions` | List immutable revisions for a customer recipe |
553
- | `create_application_recipe` | Validate and save a new customer recipe without installing it |
554
- | `create_application_recipe_revision` | Validate and save a later immutable customer recipe revision |
555
- | `export_application_recipe` | Export only a customer-owned recipe without secret values |
556
- | `install_application_recipe` | Install an exact validated customer recipe revision |
557
- | `discover_service_containers` | Discover bounded read-only container metadata |
558
- | `prepare_application_compose_adoption` | Prepare and poll a scrubbed candidate for one discovered Compose project |
559
- | `get_application_compose_adoption` | Poll one tenant-bound Compose adoption candidate |
560
- | `confirm_application_compose_adoption` | Confirm the exact source takeover after explicit approval |
561
- | `install_application` | Queue a confirmed, version-pinned managed installation |
562
- | `configure_application_access` | Queue a confirmed platform-hostname, private, public-IP, managed-HTTPS, or customer-managed external-HTTPS access change |
563
- | `configure_application_resource_thresholds` | Replace confirmed non-enforcing application resource thresholds and reached/recovered email preference |
564
- | `manage_application` | Queue a confirmed lifecycle action, including an eligible immutable update; uninstall also requires explicit data-loss acknowledgement |
565
- | `cancel_application_action` | Cancel the exact latest queued action only while the backend advertises it as cancellable |
620
+ | Tool | Description | Scope | Paid |
621
+ |------|-------------|-------|------|
622
+ | `list_application_catalog` | List published applications compatible with a service | `applications:read` | free |
623
+ | `list_service_applications` | List installed applications and pending checkout selection | `applications:read` | free |
624
+ | `get_application_installation` | Get observed state, health, drift, endpoints, components, resource history, and thresholds | `applications:read` | free |
625
+ | `get_application_events` | Get bounded customer-safe installation events | `applications:read` | free |
626
+ | `get_application_health` | Run and poll a fresh container-health inspection | `applications:read` | free |
627
+ | `get_application_logs` | Run and poll a size-bounded recent-log inspection | `applications:read` | free |
628
+ | `list_application_restore_points` | List eligible nightly points for the exact application revision | `applications:manage` | Needs paid scope: `applications:restore` |
629
+ | `quote_application_data_restore` | Freeze the exact selective-restore balance charge without payment | `applications:manage` | Quote: `applications:restore` |
630
+ | `restore_application_data` | Pay and queue confirmed selective replacement of declared application data | `applications:manage` | Paid: `applications:restore` |
631
+ | `get_application_data_restore` | Poll one tenant-bound selective data restore | `applications:read` | free |
632
+ | `list_application_registry_credentials` | List non-secret private registry credential metadata | `applications:read` | free |
633
+ | `validate_application_recipe` | Validate customer Compose against the target worker policy | `applications:manage` | free |
634
+ | `list_application_recipes` | List customer-owned immutable recipe projects | `applications:read` | free |
635
+ | `list_application_recipe_revisions` | List immutable revisions for a customer recipe | `applications:read` | free |
636
+ | `create_application_recipe` | Validate and save a new customer recipe without installing it | `applications:manage` | free |
637
+ | `create_application_recipe_revision` | Validate and save a later immutable customer recipe revision | `applications:manage` | free |
638
+ | `export_application_recipe` | Export only a customer-owned recipe without secret values | `applications:read` | free |
639
+ | `install_application_recipe` | Install an exact validated customer recipe revision | `applications:manage` | free |
640
+ | `discover_service_containers` | Discover bounded read-only container metadata | `applications:read` | free |
641
+ | `prepare_application_compose_adoption` | Prepare and poll a scrubbed candidate for one discovered Compose project | `applications:manage` | free |
642
+ | `get_application_compose_adoption` | Poll one tenant-bound Compose adoption candidate | `applications:read` | free |
643
+ | `confirm_application_compose_adoption` | Confirm the exact source takeover after explicit approval | `applications:manage` | free |
644
+ | `install_application` | Queue a confirmed, version-pinned managed installation | `applications:manage` | free |
645
+ | `configure_application_access` | Queue a confirmed platform-hostname, private, public-IP, managed-HTTPS, or customer-managed external-HTTPS access change | `applications:manage` | free |
646
+ | `configure_application_resource_thresholds` | Replace confirmed non-enforcing application resource thresholds and reached/recovered email preference | `applications:manage` | free |
647
+ | `manage_application` | Queue a confirmed lifecycle action, including an eligible immutable update; uninstall also requires explicit data-loss acknowledgement | `applications:manage` | free |
648
+ | `cancel_application_action` | Cancel the exact latest queued action only while the backend advertises it as cancellable | `applications:manage` | free |
566
649
 
567
650
  ### Service Actions
568
- | Tool | Description |
569
- |------|-------------|
570
- | `start_service` | Start a stopped VPS |
571
- | `stop_service` | Stop a running VPS |
572
- | `restart_service` | Restart a VPS |
573
- | `console_service` | Request an out-of-band console session for a running VPS |
574
- | `suspend_service` | Suspend a running Cloud VPS |
575
- | `resume_service` | Resume a suspended Cloud VPS |
651
+ | Tool | Description | Scope | Paid |
652
+ |------|-------------|-------|------|
653
+ | `start_service` | Start a stopped VPS | `services:manage` | free |
654
+ | `stop_service` | Stop a running VPS | `services:manage` | free |
655
+ | `restart_service` | Restart a VPS | `services:manage` | free |
656
+ | `console_service` | Request an out-of-band console session for a running VPS | `services:manage` | free |
657
+ | `suspend_service` | Suspend a running Cloud VPS | `services:manage` | free |
658
+ | `resume_service` | Resume a suspended Cloud VPS | `services:manage` | free |
576
659
 
577
660
  ### Service Settings
578
- | Tool | Description |
579
- |------|-------------|
580
- | `get_hostname` | Get current and automatic service hostname state |
581
- | `change_hostname` | Change VPS hostname |
582
- | `reset_hostname` | Restore the VPSnet-managed automatic hostname |
583
- | `change_root_password` | Change VPS root password |
584
- | `get_rdns` | Get current rDNS records |
585
- | `change_rdns` | Change reverse DNS (PTR) record |
586
- | `clear_rdns` | Clear a PTR override and restore the automatic value |
587
- | `flush_iptables` | Flush iptables rules (useful when locked out) |
588
- | `get_title` | Get the current service display title |
589
- | `change_title` | Change service display title |
590
- | `toggle_ipv6` | Enable or disable IPv6 |
591
- | `toggle_extra_settings` | Toggle ppp, fuse, tuntap, or nfs |
592
- | `deploy_ssh_key` | Deploy an SSH key to a VPS |
661
+ | Tool | Description | Scope | Paid |
662
+ |------|-------------|-------|------|
663
+ | `get_hostname` | Get current and automatic service hostname state | `services:read` | free |
664
+ | `change_hostname` | Change VPS hostname | `services:manage` | free |
665
+ | `reset_hostname` | Restore the VPSnet-managed automatic hostname | `services:manage` | free |
666
+ | `change_root_password` | Change VPS root password | `services:manage` | free |
667
+ | `get_rdns` | Get current rDNS records | `services:read` | free |
668
+ | `change_rdns` | Change reverse DNS (PTR) record | `services:manage` | free |
669
+ | `clear_rdns` | Clear a PTR override and restore the automatic value | `services:manage` | free |
670
+ | `flush_iptables` | Flush iptables rules (useful when locked out) | `services:manage` | free |
671
+ | `get_title` | Get the current service display title | `services:read` | free |
672
+ | `change_title` | Change service display title | `services:manage` | free |
673
+ | `toggle_ipv6` | Enable or disable IPv6 | `services:manage` | free |
674
+ | `toggle_extra_settings` | Toggle ppp, fuse, tuntap, or nfs | `services:manage` | free |
675
+ | `deploy_ssh_key` | Deploy an SSH key to a VPS | `services:manage` | free |
593
676
 
594
677
  ### OS Reinstall
595
- | Tool | Description |
596
- |------|-------------|
597
- | `get_os_options` | Get available OS templates |
598
- | `reinstall_os` | Reinstall OS (destroys all data) |
678
+ | Tool | Description | Scope | Paid |
679
+ |------|-------------|-------|------|
680
+ | `get_os_options` | Get available OS templates | `services:read` | free |
681
+ | `reinstall_os` | Reinstall 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:manage` | free |
599
682
 
600
683
  ### Plan Changes (free)
601
- | Tool | Description |
602
- |------|-------------|
603
- | `get_plan_options` | Get available plans for upgrade/downgrade; KVM/Firecracker targets that would shrink disk are unavailable |
604
- | `get_plan_resources` | Get configurable resources for a plan |
605
- | `calculate_plan_change` | Preview a plan change: no payment, the remaining value is converted, so an upgrade moves the expiry earlier |
606
- | `change_plan` | Change VPS plan |
684
+ | Tool | Description | Scope | Paid |
685
+ |------|-------------|-------|------|
686
+ | `get_plan_options` | Get available plans for upgrade/downgrade; KVM/Firecracker targets that would shrink disk are unavailable | `services:read` | free |
687
+ | `get_plan_resources` | Get configurable resources for a plan | `services:read` | free |
688
+ | `calculate_plan_change` | Preview a plan change: no payment, the remaining value is converted, so an upgrade moves the expiry earlier | `services:read` | free |
689
+ | `change_plan` | Change VPS plan | `services:manage` | free |
607
690
 
608
691
  ### Renewal & Billing
609
- | Tool | Description |
610
- |------|-------------|
611
- | `get_period_options` | Get billing period and auto-renewal options |
612
- | `set_auto_renew` | Enable or disable auto-renewal |
613
- | `renew_service` | Manually renew a service |
614
- | `list_invoices` | List invoices |
615
- | `get_invoice` | Get a specific invoice |
616
- | `list_payments` | List payment history |
617
- | `get_usage_statements` | List itemized metered-usage statements separately from invoices |
692
+ | Tool | Description | Scope | Paid |
693
+ |------|-------------|-------|------|
694
+ | `get_period_options` | Get billing period and auto-renewal options | `services:read` | free |
695
+ | `set_auto_renew` | Enable or disable auto-renewal | `services:manage` | Paid (future renewals) |
696
+ | `renew_service` | Manually renew a service | `services:manage` | Paid |
697
+ | `list_invoices` | List invoices | `payments:read` | free |
698
+ | `get_invoice` | Get a specific invoice | `payments:read` | free |
699
+ | `list_payments` | List payment history | `payments:read` | free |
700
+ | `get_usage_statements` | List itemized metered-usage statements separately from invoices | `payments:read` | free |
618
701
 
619
702
  ### Ordering
620
- | Tool | Description |
621
- |------|-------------|
622
- | `get_order_plans` | Get available plans for an explicitly selected service product |
623
- | `get_order_options` | Get configurable options for a plan |
624
- | `order_service` | Order a new VPS |
703
+ | Tool | Description | Scope | Paid |
704
+ |------|-------------|-------|------|
705
+ | `get_order_plans` | Get available plans for an explicitly selected service product | none | free |
706
+ | `get_order_options` | Get configurable options for a plan | none | free |
707
+ | `order_service` | Order a new VPS (optionally attached to one of your private networks with `privateNetworkId`) | none | Paid: `vps:order`, `vds:order`, `ds:order` or `fc:order` (by product) |
625
708
 
626
709
  ### Backups
627
- | Tool | Description |
628
- |------|-------------|
629
- | `get_backup_status` | Get backup status and configuration |
630
- | `get_backup_history` | Get backup history |
631
- | `create_backup` | Create a new backup (paid) |
710
+ | Tool | Description | Scope | Paid |
711
+ |------|-------------|-------|------|
712
+ | `get_backup_status` | Get backup status and configuration | `services:read` | free |
713
+ | `get_backup_history` | Get backup history | `services:read` | free |
714
+ | `create_backup` | Create a new backup (paid) | `services:manage` | Paid |
632
715
 
633
716
  ### Restore
634
- | Tool | Description |
635
- |------|-------------|
636
- | `get_restore_status` | Get retention, restore price, and any restore in progress |
637
- | `list_restore_points` | List whole-service restore points |
638
- | `request_restore` | **Paid and destructive:** restore the whole service disk from a point |
639
- | `list_restore_file_points` | List browsable backup points and whether folder search is available (free) |
640
- | `browse_restore_files` | Queue a listing of one directory inside a backup (free, read-only) |
641
- | `get_restore_file_browse` | Poll a queued backup directory listing (free, read-only) |
717
+ | Tool | Description | Scope | Paid |
718
+ |------|-------------|-------|------|
719
+ | `get_restore_status` | Get retention, restore price, and any restore in progress | `services:read` | Needs paid scope: `services:restore` |
720
+ | `list_restore_points` | List whole-service restore points | `services:read` | free |
721
+ | `request_restore` | **Paid and destructive:** restore the whole service disk from a point | `services:read` | Paid: `services:restore` |
722
+ | `list_restore_file_points` | List browsable backup points and whether folder search is available (free) | `services:read` | free |
723
+ | `browse_restore_files` | Queue a listing of one directory inside a backup (free, read-only) | `services:read` | free |
724
+ | `get_restore_file_browse` | Poll a queued backup directory listing (free, read-only) | `services:read` | free |
642
725
 
643
726
  ### SSH Keys
644
- | Tool | Description |
645
- |------|-------------|
646
- | `list_ssh_keys` | List all SSH keys |
647
- | `get_ssh_key` | Get a specific SSH key |
648
- | `create_ssh_key` | Add a new SSH key |
649
- | `delete_ssh_key` | Delete an SSH key |
727
+ | Tool | Description | Scope | Paid |
728
+ |------|-------------|-------|------|
729
+ | `list_ssh_keys` | List all SSH keys | `account:read` | free |
730
+ | `get_ssh_key` | Get a specific SSH key | `account:read` | free |
731
+ | `create_ssh_key` | Add a new SSH key | `account:manage` | free |
732
+ | `delete_ssh_key` | Delete an SSH key | `account:manage` | free |
650
733
 
651
734
  ### API Keys
652
- | Tool | Description |
653
- |------|-------------|
654
- | `list_api_keys` | Show the API key authenticating this MCP connection |
655
- | `get_api_key` | Get one active key's non-secret metadata |
656
- | `get_api_key_activity` | Get the calling key's bounded retained request activity and recorded totals |
657
- | `get_api_key_inference_usage` | Get the calling inference key's exact paid VPSnet AI usage and cap state |
735
+ | Tool | Description | Scope | Paid |
736
+ |------|-------------|-------|------|
737
+ | `list_api_keys` | Show the API key authenticating this MCP connection | none | free |
738
+ | `get_api_key` | Get one active key's non-secret metadata | none | free |
739
+ | `get_api_key_activity` | Get the calling key's bounded retained request activity and recorded totals | none | free |
740
+ | `get_api_key_inference_usage` | Get the calling inference key's exact paid VPSnet AI usage and cap state | none | free |
658
741
 
659
742
  API-key creation, changes, and revocation require a browser/session login. They
660
743
  cannot be performed by an MCP connection authenticated with an API key.
661
744
 
662
745
  ### Free TLS certificates
663
- | Tool | Description |
664
- |------|-------------|
665
- | `get_free_certificate_eligibility` | Check account eligibility, quota, key modes, and currently ready public CAs |
666
- | `preflight_free_certificate` | Plan exact names, validation, delivery, custody, and CA without issuing |
667
- | `list_free_certificates` | List owned no-cost certificate requests and lifecycle state |
668
- | `get_free_certificate` | Get one owned request, renewal schedule, and safe timeline |
669
- | `get_free_certificate_instruction` | Read automatic-DNS status or every required external-DNS CNAME |
670
- | `create_free_certificate` | Create one explicitly approved, idempotent no-cost DV request |
671
- | `download_free_certificate` | Retrieve only the issued public leaf and chain, never a private key |
672
- | `manage_free_certificate` | Renew, revoke, recheck, or cancel an eligible request |
746
+ | Tool | Description | Scope | Paid |
747
+ |------|-------------|-------|------|
748
+ | `get_free_certificate_eligibility` | Check account eligibility, quota, key modes, and currently ready public CAs | `certificates:read` | free |
749
+ | `preflight_free_certificate` | Plan exact names, validation, delivery, custody, and CA without issuing | `certificates:read` | free |
750
+ | `list_free_certificates` | List owned no-cost certificate requests and lifecycle state | `certificates:read` | free |
751
+ | `get_free_certificate` | Get one owned request, renewal schedule, and safe timeline | `certificates:read` | free |
752
+ | `get_free_certificate_instruction` | Read automatic-DNS status or every required external-DNS CNAME | `certificates:read` | free |
753
+ | `create_free_certificate` | Create one explicitly approved, idempotent no-cost DV request | `certificates:manage` | free |
754
+ | `download_free_certificate` | Retrieve only the issued public leaf and chain, never a private key | `certificates:read` | free |
755
+ | `manage_free_certificate` | Renew, revoke, recheck, or cancel an eligible request | `certificates:manage` | free |
673
756
 
674
757
  For portable API or assistant installation, use `customer_csr` and retain the
675
758
  private key where the CSR was generated. A managed request can renew unattended,
@@ -678,19 +761,19 @@ poll `get_free_certificate`, follow `get_free_certificate_instruction`, and do
678
761
  not treat a queued request as issued.
679
762
 
680
763
  ### Automatic SSL subscriptions
681
- | Tool | Description |
682
- |------|-------------|
683
- | `list_automatic_ssl_subscriptions` | List customer-owned Automatic SSL subscriptions without exposing ACME credentials |
684
- | `get_automatic_ssl_subscription` | Get one owned subscription, its domain set, renewal state, and readiness |
685
- | `quote_automatic_ssl_subscription` | Quote an exact domain set in EUR without charging |
686
- | `order_automatic_ssl_subscription` | Confirm and pay for the explicitly approved subscription quote |
687
- | `list_automatic_ssl_actions` | List customer-visible subscription and DNS-name changes |
688
- | `refresh_automatic_ssl_subscription` | Schedule an authoritative read-only status refresh |
689
- | `quote_automatic_ssl_domain` | Quote one additional DNS name in EUR without charging |
690
- | `order_automatic_ssl_domain` | Confirm and pay for the explicitly approved DNS-name quote |
691
- | `quote_automatic_ssl_renewal` | Quote the next eligible subscription term in EUR |
692
- | `order_automatic_ssl_renewal` | Prepay the explicitly approved next term from account balance |
693
- | `manage_automatic_ssl_subscription` | Cancel, remove a name, or correct an eligible name idempotently |
764
+ | Tool | Description | Scope | Paid |
765
+ |------|-------------|-------|------|
766
+ | `list_automatic_ssl_subscriptions` | List customer-owned Automatic SSL subscriptions without exposing ACME credentials | `certificates:read` | free |
767
+ | `get_automatic_ssl_subscription` | Get one owned subscription, its domain set, renewal state, and readiness | `certificates:read` | free |
768
+ | `quote_automatic_ssl_subscription` | Quote an exact domain set in EUR without charging | `certificates:read` | Quote: `certificates:order` |
769
+ | `order_automatic_ssl_subscription` | Confirm and pay for the explicitly approved subscription quote | `certificates:read` | Paid: `certificates:order` |
770
+ | `list_automatic_ssl_actions` | List customer-visible subscription and DNS-name changes | `certificates:read` | free |
771
+ | `refresh_automatic_ssl_subscription` | Schedule an authoritative read-only status refresh | `certificates:manage` | free |
772
+ | `quote_automatic_ssl_domain` | Quote one additional DNS name in EUR without charging | `certificates:read` | Quote: `certificates:order` |
773
+ | `order_automatic_ssl_domain` | Confirm and pay for the explicitly approved DNS-name quote | `certificates:read` | Paid: `certificates:order` |
774
+ | `quote_automatic_ssl_renewal` | Quote the next eligible subscription term in EUR | `certificates:read` | Quote: `certificates:order` |
775
+ | `order_automatic_ssl_renewal` | Prepay the explicitly approved next term from account balance | `certificates:read` | Paid: `certificates:order` |
776
+ | `manage_automatic_ssl_subscription` | Cancel, remove a name, or correct an eligible name idempotently | `certificates:manage` | free |
694
777
 
695
778
  Automatic SSL is a portable paid ACME subscription. It works with a compatible
696
779
  client on VPSnet or another provider; it is not limited to managed
@@ -699,19 +782,19 @@ in the two-factor-protected customer portal. They are intentionally not an MCP
699
782
  tool or API-key response, so an assistant cannot copy them into model context.
700
783
 
701
784
  ### Paid TLS certificates
702
- | Tool | Description |
703
- |------|-------------|
704
- | `list_certificate_catalog` | List published DV/OV/EV products and final customer offers in EUR |
705
- | `get_certificate_catalog_product` | Get one published product, its capabilities, and current offers |
706
- | `list_certificates` | List customer-owned paid certificate orders and issuance state |
707
- | `get_certificate` | Get one owned paid certificate order |
708
- | `quote_certificate` | Quote an exact certificate or renewal without charging |
709
- | `order_certificate` | Confirm and pay for an explicitly approved certificate quote |
710
- | `get_certificate_validation` | Read per-name validation state and an owner-visible pending challenge |
711
- | `download_certificate` | Download the issued public leaf and chain; private keys are never returned |
712
- | `list_certificate_actions` | List durable customer-visible management actions |
713
- | `refresh_certificate` | Schedule a read-only certificate-authority status reconciliation |
714
- | `manage_certificate` | Queue an idempotent cancellation, validation, or same-name reissue action |
785
+ | Tool | Description | Scope | Paid |
786
+ |------|-------------|-------|------|
787
+ | `list_certificate_catalog` | List published DV/OV/EV products and final customer offers in EUR | `certificates:read` | free |
788
+ | `get_certificate_catalog_product` | Get one published product, its capabilities, and current offers | `certificates:read` | free |
789
+ | `list_certificates` | List customer-owned paid certificate orders and issuance state | `certificates:read` | free |
790
+ | `get_certificate` | Get one owned paid certificate order | `certificates:read` | free |
791
+ | `quote_certificate` | Quote an exact certificate or renewal without charging | `certificates:read` | Quote: `certificates:order` |
792
+ | `order_certificate` | Confirm and pay for an explicitly approved certificate quote | `certificates:read` | Paid: `certificates:order` |
793
+ | `get_certificate_validation` | Read per-name validation state and an owner-visible pending challenge | `certificates:read` | free |
794
+ | `download_certificate` | Download the issued public leaf and chain; private keys are never returned | `certificates:read` | free |
795
+ | `list_certificate_actions` | List durable customer-visible management actions | `certificates:read` | free |
796
+ | `refresh_certificate` | Schedule a read-only certificate-authority status reconciliation | `certificates:manage` | free |
797
+ | `manage_certificate` | Queue an idempotent cancellation, validation, or same-name reissue action | `certificates:manage` | free |
715
798
 
716
799
  Paid certificates are portable account products: customers may install them on
717
800
  Nginx, Apache, lighttpd, OpenLiteSpeed, HAProxy, Caddy, mail, API, load-balancer,
@@ -723,102 +806,102 @@ EUR, and ordering requires explicit approval plus the same idempotency key and
723
806
  short-lived quote token.
724
807
 
725
808
  ### Domains
726
- | Tool | Description |
727
- |------|-------------|
728
- | `list_domains` | List domains owned by the account |
729
- | `get_domain` | Get one owned domain and its pending action |
730
- | `list_domain_tlds` | List TLDs currently enabled for ordering |
731
- | `check_domain_availability` | Check domain availability without ordering |
732
- | `get_domain_ordering_status` | Get non-secret domain-ordering readiness |
733
- | `set_domain_nameservers` | Queue a nameserver change for an owned domain |
734
- | `list_domain_glue_records` | List same-domain nameserver address records |
735
- | `create_domain_glue_record` | Queue creation or update of a nameserver address record |
736
- | `delete_domain_glue_record` | Queue deletion of a nameserver address record |
737
- | `get_domain_parent_ds` | List parent-zone DNSSEC DS records |
738
- | `add_domain_parent_ds` | Queue addition of parent-zone DS records |
739
- | `delete_domain_parent_ds` | Queue deletion of parent-zone DS records |
740
- | `list_domain_contacts` | List domain contacts owned by the account |
741
- | `create_domain_contact` | Create a domain contact |
742
- | `update_domain_contact` | Update an existing domain contact |
743
- | `delete_domain_contact` | Delete an unused domain contact |
744
- | `quote_domain_register` | Quote a domain registration without charging |
745
- | `confirm_domain_register` | Confirm and pay for an exact registration quote |
746
- | `quote_domain_transfer` | Quote a domain transfer without charging |
747
- | `confirm_domain_transfer` | Confirm and pay for an exact transfer quote |
748
- | `quote_domain_renew` | Quote renewal of an owned domain without charging |
749
- | `confirm_domain_renew` | Confirm and pay for an exact renewal quote |
750
- | `quote_domain_restore` | Quote restoration of a domain in redemption without charging |
751
- | `confirm_domain_restore` | Confirm and pay for an exact restoration quote |
752
- | `set_domain_auto_renew` | Enable or disable automatic renewal for an owned domain |
753
- | `get_registrar_lock` | Get registrar transfer-lock state; changes remain panel-only |
809
+ | Tool | Description | Scope | Paid |
810
+ |------|-------------|-------|------|
811
+ | `list_domains` | List domains owned by the account | `domains:read` | free |
812
+ | `get_domain` | Get one owned domain and its pending action | `domains:read` | free |
813
+ | `list_domain_tlds` | List TLDs currently enabled for ordering | `domains:read` | free |
814
+ | `check_domain_availability` | Check domain availability without ordering | `domains:read` | free |
815
+ | `get_domain_ordering_status` | Get non-secret domain-ordering readiness | `domains:read` | free |
816
+ | `set_domain_nameservers` | Queue a nameserver change for an owned domain | `domains:manage` | free |
817
+ | `list_domain_glue_records` | List same-domain nameserver address records | `domains:read` | free |
818
+ | `create_domain_glue_record` | Queue creation or update of a nameserver address record | `domains:manage` | free |
819
+ | `delete_domain_glue_record` | Queue deletion of a nameserver address record | `domains:manage` | free |
820
+ | `get_domain_parent_ds` | List parent-zone DNSSEC DS records | `domains:read` | free |
821
+ | `add_domain_parent_ds` | Queue addition of parent-zone DS records | `domains:manage` | free |
822
+ | `delete_domain_parent_ds` | Queue deletion of parent-zone DS records | `domains:manage` | free |
823
+ | `list_domain_contacts` | List domain contacts owned by the account | `domains:read` | free |
824
+ | `create_domain_contact` | Create a domain contact | `domains:manage` | free |
825
+ | `update_domain_contact` | Update an existing domain contact | `domains:manage` | free |
826
+ | `delete_domain_contact` | Delete an unused domain contact | `domains:manage` | free |
827
+ | `quote_domain_register` | Quote a domain registration without charging | `domains:read` | Quote: `domains:order` |
828
+ | `confirm_domain_register` | Confirm and pay for an exact registration quote | `domains:manage` | Paid: `domains:order` |
829
+ | `quote_domain_transfer` | Quote a domain transfer without charging | `domains:read` | Quote: `domains:transfer` |
830
+ | `confirm_domain_transfer` | Confirm and pay for an exact transfer quote | `domains:manage` | Paid: `domains:transfer` |
831
+ | `quote_domain_renew` | Quote renewal of an owned domain without charging | `domains:read` | Quote: `domains:renew` |
832
+ | `confirm_domain_renew` | Confirm and pay for an exact renewal quote | `domains:manage` | Paid: `domains:renew` |
833
+ | `quote_domain_restore` | Quote restoration of a domain in redemption without charging | `domains:read` | Quote: `domains:renew` |
834
+ | `confirm_domain_restore` | Confirm and pay for an exact restoration quote | `domains:manage` | Paid: `domains:renew` |
835
+ | `set_domain_auto_renew` | Enable or disable automatic renewal for an owned domain | `domains:manage` | Paid (future renewals) |
836
+ | `get_registrar_lock` | Get registrar transfer-lock state; changes remain panel-only | `domains:read` | free |
754
837
 
755
838
  ### DNS
756
- | Tool | Description |
757
- |------|-------------|
758
- | `list_service_dns_options` | List owned zones and service addresses available for DNS attachment |
759
- | `attach_service_dns_record` | Point an owned-zone name at one service address |
760
- | `list_dns_zones` | List forward DNS zones owned by the account |
761
- | `create_dns_zone` | Create a native or secondary forward DNS zone |
762
- | `get_dns_zone` | Get one DNS zone and its desired records |
763
- | `get_dns_zone_diagnostics` | Inspect delegation, SOA, DNSSEC, and record hygiene |
764
- | `export_dns_zone` | Export a native zone as a BIND-style zone file |
765
- | `import_dns_zone` | Import bounded BIND-style records into a native zone |
766
- | `list_dns_templates` | List backend-defined DNS record templates |
767
- | `apply_dns_template` | Preview or apply one DNS record template |
768
- | `delete_dns_zone` | Delete a forward DNS zone |
769
- | `verify_dns_zone` | Verify ownership (TXT publicly or at the previous provider) and publish a pending zone |
770
- | `reissue_dns_zone_verification` | Replace a lost ownership TXT value for a pending zone |
771
- | `get_dnssec` | Get DNSSEC state and public DNSKEY/DS material |
772
- | `set_dnssec` | Enable or safely disable DNSSEC signing |
773
- | `upsert_dns_record` | Create or replace a forward DNS desired-state record |
774
- | `update_dns_record` | Update one existing non-system DNS record |
775
- | `delete_dns_record` | Delete one forward DNS desired-state record |
776
- | `get_dns_service_status` | Get managed DNS cluster status and published endpoints |
777
- | `get_dns_zone_history` | Get recent zone and record change history |
778
- | `list_ddns_tokens` | List non-secret DDNS and ACME token metadata |
779
- | `create_ddns_token` | Create a narrow DDNS or ACME updater token |
780
- | `revoke_ddns_token` | Revoke a DDNS or ACME updater token |
839
+ | Tool | Description | Scope | Paid |
840
+ |------|-------------|-------|------|
841
+ | `list_service_dns_options` | List owned zones and service addresses available for DNS attachment | `dns:read` | free |
842
+ | `attach_service_dns_record` | Point an owned-zone name at one service address | `dns:write` | free |
843
+ | `list_dns_zones` | List forward DNS zones owned by the account | `dns:read` | free |
844
+ | `create_dns_zone` | Create a native or secondary forward DNS zone | `dns:write` | free |
845
+ | `get_dns_zone` | Get one DNS zone and its desired records | `dns:read` | free |
846
+ | `get_dns_zone_diagnostics` | Inspect delegation, SOA, DNSSEC, and record hygiene | `dns:read` | free |
847
+ | `export_dns_zone` | Export a native zone as a BIND-style zone file | `dns:read` | free |
848
+ | `import_dns_zone` | Import bounded BIND-style records into a native zone | `dns:write` | free |
849
+ | `list_dns_templates` | List backend-defined DNS record templates | `dns:read` | free |
850
+ | `apply_dns_template` | Preview or apply one DNS record template | `dns:write` | free |
851
+ | `delete_dns_zone` | Delete a forward DNS zone | `dns:write` | free |
852
+ | `verify_dns_zone` | Verify ownership (TXT publicly or at the previous provider) and publish a pending zone | `dns:write` | free |
853
+ | `reissue_dns_zone_verification` | Replace a lost ownership TXT value for a pending zone | `dns:write` | free |
854
+ | `get_dnssec` | Get DNSSEC state and public DNSKEY/DS material | `dns:read` | free |
855
+ | `set_dnssec` | Enable or safely disable DNSSEC signing | `dnssec:manage` | free |
856
+ | `upsert_dns_record` | Create or replace a forward DNS desired-state record | `dns:write` | free |
857
+ | `update_dns_record` | Update one existing non-system DNS record | `dns:write` | free |
858
+ | `delete_dns_record` | Delete one forward DNS desired-state record | `dns:write` | free |
859
+ | `get_dns_service_status` | Get managed DNS cluster status and published endpoints | `dns:read` | free |
860
+ | `get_dns_zone_history` | Get recent zone and record change history | `dns:read` | free |
861
+ | `list_ddns_tokens` | List non-secret DDNS and ACME token metadata | `dns:read` | free |
862
+ | `create_ddns_token` | Create a narrow DDNS or ACME updater token | `dns:write` | free |
863
+ | `revoke_ddns_token` | Revoke a DDNS or ACME updater token | `dns:write` | free |
781
864
 
782
865
  ### Snapshots
783
- | Tool | Description |
784
- |------|-------------|
785
- | `list_snapshots` | List Cloud VPS disk snapshots and billing policy |
786
- | `create_snapshot` | Create a Cloud VPS disk snapshot |
787
- | `rollback_snapshot` | Destructively roll a Cloud VPS back to a snapshot |
788
- | `delete_snapshot` | Delete a Cloud VPS disk snapshot and stop its keep billing |
789
- | `list_firecracker_snapshots` | List temporary Firecracker VPS snapshots and expiry |
790
- | `create_firecracker_snapshot` | Create a temporary Firecracker VPS snapshot |
791
- | `rollback_firecracker_snapshot` | Destructively roll a Firecracker VPS back to a snapshot |
792
- | `delete_firecracker_snapshot` | Delete a Firecracker VPS snapshot and stop its keep billing |
866
+ | Tool | Description | Scope | Paid |
867
+ |------|-------------|-------|------|
868
+ | `list_snapshots` | List Cloud VPS disk snapshots and billing policy | `services:read` | free |
869
+ | `create_snapshot` | Create a Cloud VPS disk snapshot | `services:manage` | Billed while kept |
870
+ | `rollback_snapshot` | Destructively roll a Cloud VPS back to a snapshot | `services:manage` | free |
871
+ | `delete_snapshot` | Delete a Cloud VPS disk snapshot and stop its keep billing | `services:manage` | free |
872
+ | `list_firecracker_snapshots` | List temporary Firecracker VPS snapshots and expiry | `services:read` | free |
873
+ | `create_firecracker_snapshot` | Create a temporary Firecracker VPS snapshot | `services:manage` | Billed while kept |
874
+ | `rollback_firecracker_snapshot` | Destructively roll a Firecracker VPS back to a snapshot | `services:manage` | free |
875
+ | `delete_firecracker_snapshot` | Delete a Firecracker VPS snapshot and stop its keep billing | `services:manage` | free |
793
876
 
794
877
  ### Service Rescue
795
- | Tool | Description |
796
- |------|-------------|
797
- | `get_service_rescue` | Get rescue capability and current durable rescue session |
798
- | `enter_service_rescue` | Restart an eligible service into an advertised rescue image |
799
- | `exit_service_rescue` | Restore the exact pre-rescue boot configuration and state |
878
+ | Tool | Description | Scope | Paid |
879
+ |------|-------------|-------|------|
880
+ | `get_service_rescue` | Get rescue capability and current durable rescue session | `services:read` | free |
881
+ | `enter_service_rescue` | Restart an eligible service into an advertised rescue image | `services:rescue` | free |
882
+ | `exit_service_rescue` | Restore the exact pre-rescue boot configuration and state | `services:rescue` | free |
800
883
 
801
884
  ### Firecracker Functions
802
- | Tool | Description |
803
- |------|-------------|
804
- | `list_functions` | List usage-billed Firecracker Functions |
805
- | `get_function` | Get one function, including integrity state and protected values when readable |
806
- | `create_function` | Create a Firecracker Function |
807
- | `update_function` | Update a function; unreadable protected values require explicit replacement approval |
808
- | `delete_function` | Delete a Firecracker Function |
809
- | `invoke_function` | Invoke a function with metered CPU and memory usage; one stable Idempotency-Key prevents exact retries from running or billing twice |
810
- | `list_function_invocations` | List a function's invocations, status, duration, and cost |
811
- | `get_function_invocation` | Get one invocation's output, logs, and usage cost |
885
+ | Tool | Description | Scope | Paid |
886
+ |------|-------------|-------|------|
887
+ | `list_functions` | List usage-billed Firecracker Functions | `services:read` | free |
888
+ | `get_function` | Get one function, including integrity state and protected values when readable | `services:read` | free |
889
+ | `create_function` | Create a Firecracker Function | `services:manage` | free |
890
+ | `update_function` | Update a function; unreadable protected values require explicit replacement approval | `services:manage` | free |
891
+ | `delete_function` | Delete a Firecracker Function | `services:manage` | free |
892
+ | `invoke_function` | Invoke a function with metered CPU and memory usage; one stable Idempotency-Key prevents exact retries from running or billing twice | `services:manage` | Paid: `fn:invoke` |
893
+ | `list_function_invocations` | List a function's invocations, status, duration, and cost | `services:read` | free |
894
+ | `get_function_invocation` | Get one invocation's output, logs, and usage cost | `services:read` | free |
812
895
 
813
896
  ### On-demand servers
814
- | Tool | Description |
815
- |------|-------------|
816
- | `get_temp_vm_options` | Get launch state, profiles, compatibility pricing inputs, and exact storage/network policy |
817
- | `quote_temp_vm` | Inspect the disabled quote operation and its coming-soon response |
818
- | `list_temp_vms` | List the account's on-demand server sessions and current options |
819
- | `create_temp_vm` | Inspect the disabled create operation; no payment or allocation occurs while the product is coming soon |
820
- | `get_temp_vm` | Get one tenant-owned on-demand server session |
821
- | `delete_temp_vm` | Permanently delete an on-demand server after explicit data-loss acknowledgement; no customer refund is initiated |
897
+ | Tool | Description | Scope | Paid |
898
+ |------|-------------|-------|------|
899
+ | `get_temp_vm_options` | Get launch state, profiles, compatibility pricing inputs, and exact storage/network policy | `services:read` | free |
900
+ | `quote_temp_vm` | Inspect the disabled quote operation and its coming-soon response | `services:manage` | Disabled (coming soon) |
901
+ | `list_temp_vms` | List the account's on-demand server sessions and current options | `services:read` | free |
902
+ | `create_temp_vm` | Inspect the disabled create operation; no payment or allocation occurs while the product is coming soon | `services:manage` | Disabled (coming soon) |
903
+ | `get_temp_vm` | Get one tenant-owned on-demand server session | `services:read` | free |
904
+ | `delete_temp_vm` | Permanently delete an on-demand server after explicit data-loss acknowledgement; no customer refund is initiated | `services:manage` | free |
822
905
 
823
906
  Customer ordering is disabled while the on-demand server lifecycle is being
824
907
  validated. Current options disclose that automatic backups and snapshots are
@@ -830,22 +913,224 @@ and metered-billing contract must be published consistently before ordering is
830
913
  enabled.
831
914
 
832
915
  ### Guest Agent
833
- | Tool | Description |
834
- |------|-------------|
835
- | `get_guest_agent_status` | Check QEMU guest-agent availability on a Cloud VPS |
916
+ | Tool | Description | Scope | Paid |
917
+ |------|-------------|-------|------|
918
+ | `get_guest_agent_status` | Check QEMU guest-agent availability on a Cloud VPS | `services:read` | free |
836
919
 
837
920
  ### History
838
- | Tool | Description |
839
- |------|-------------|
840
- | `get_login_history` | Get account login history |
841
- | `get_management_history` | Get management/activity history |
921
+ | Tool | Description | Scope | Paid |
922
+ |------|-------------|-------|------|
923
+ | `get_login_history` | Get account login history | `account:read` | free |
924
+ | `get_management_history` | Get management/activity history | `account:read` | free |
842
925
 
843
926
  ### Public
844
- | Tool | Description |
845
- |------|-------------|
846
- | `get_pricing` | Get public pricing |
847
- | `get_system_status` | Get VPSnet.com system status |
848
- | `get_faq` | Get frequently asked questions |
927
+ | Tool | Description | Scope | Paid |
928
+ |------|-------------|-------|------|
929
+ | `get_pricing` | Get public pricing | none | free |
930
+ | `get_system_status` | Get VPSnet.com system status | none | free |
931
+ | `get_faq` | Get frequently asked questions | none | free |
932
+
933
+ ### SDN networking
934
+
935
+ Networking permissions must be granted explicitly: `networking:read` or
936
+ `networking:manage`; the ordinary full/read defaults do not include them.
937
+ Start with capabilities, then read the exact owned resource and its generation.
938
+ The backend enforces tenant ownership, availability and server 2FA locks.
939
+ Accepted, paid, and ready are separate states; poll the matching operation or
940
+ resource. DNS changes are polled through the network's `settings.dns_change`.
941
+
942
+ New private/public load balancers, VPNs and public addresses use an explicit
943
+ quote → common checkout → order-status flow. Quote tools always send
944
+ `prepare_after_payment=true`: no provisioning happens before payment.
945
+ Show the quote's exact EUR `gross_amount`, obtain approval, and pass the same
946
+ `idempotencyKey`, `quote_id` and `quoteToken` to `order_network_product`.
947
+ API keys additionally need full access, enabled paid operations,
948
+ `networking:order`, and spend limits. Read `get_network_payment_methods` and
949
+ select `system=balance`; non-balance checkout is refused for API keys.
950
+ If confirmation is uncertain, recover by the original quote ID and key.
951
+ For an SDN order with `status=paid_pending`, `billing_state=captured` and
952
+ `reason_code=network_product_ip_inventory_wait`, payment is retained while
953
+ public IP inventory is unavailable. Poll `get_network_product_order` with
954
+ the same order ID; the backend resumes automatically when inventory returns.
955
+ Do not create another order, charge again or submit a manual retry.
956
+ `manual_review` or `network_product_stock_reconciliation_required` instead
957
+ requires operator review; it does not authorize an automatic retry.
958
+
959
+ Ordinary VPS orders expose this wait through
960
+ `get_service.stateProcess.waitingReason=public_ip_inventory` (also mirrored
961
+ in the legacy `stateProccess` field). Poll the same service without reordering.
962
+ `stateProcess.attention=true` requires operator attention. A successful
963
+ payment or accepted create does not establish that the server is ready.
964
+
965
+ Public load balancer tiers `alb_proxy_3`/`alb_proxy_5` use request kind
966
+ `proxy_lb`; private tier `nlb` uses `private_lb`. Availability and prices come
967
+ from the live product catalog. A legacy unpaid appliance-create endpoint is
968
+ not an alternative to checkout.
969
+
970
+ Device configuration pickup is a one-time **management** action, even though
971
+ its HTTP method is GET. Generate the reveal key pair outside MCP, submit only
972
+ the X25519 public key, save the returned sealed ciphertext, and decrypt it
973
+ outside the conversation. Neither private keys nor plaintext WireGuard
974
+ configuration are requested or decrypted by these tools. Never automatically
975
+ repeat a pickup after an uncertain response.
976
+
977
+ The current backend has no customer network rename, existing-port fixed-IP
978
+ edit, appliance retry, or native site-to-site API in this release. Fixed DHCP
979
+ addresses are selected at attach; removing/recreating an attachment requires
980
+ separate approval and is not represented as an in-place edit. Legacy unpaid
981
+ LB/VPN create routes, legacy stock-before-payment purchases and enabling
982
+ automatic renewal via API keys are deliberately not exposed. Existing public
983
+ binding management remains available; new public addresses use account
984
+ ownership and common checkout. A tool being listed does not enable a backend
985
+ feature gate.
986
+
987
+ | Tool | Description | Scope | Paid |
988
+ |------|-------------|-------|------|
989
+ | `get_network_payment_methods` | Read payment-method metadata without starting payment | none | free |
990
+ | `get_networking_capabilities` | Read account networking availability, quota, creation options and eligible order-time attachments | `networking:read` | free |
991
+ | `get_networking_features` | Read current networking feature gates, DNS options and supported contract extensions. | `networking:read` | free |
992
+ | `get_networking_overview` | Read owned networks, quota and operation snapshot | `networking:read` | free |
993
+ | `get_networking_topology` | Read the account topology with network-scoped identities | `networking:read` | free |
994
+ | `list_networking_operations` | Read recent network operations and operations_has_more | `networking:read` | free |
995
+ | `get_networking_operation` | Read an accepted network or port operation | `networking:read` | free |
996
+ | `list_private_networks` | List owned private networks, including deletion awaiting verified cleanup. | `networking:read` | free |
997
+ | `get_private_network` | Read one owned network including DHCP reservations, DNS change progress, generation and project_id. | `networking:read` | free |
998
+ | `create_private_network` | Create a private network intent | `networking:manage` | free |
999
+ | `delete_private_network` | Request deletion of an empty network | `networking:manage` | free |
1000
+ | `retry_private_network` | Retry the failed current network operation only; preserve its current generation | `networking:manage` | free |
1001
+ | `set_private_network_dns` | Change DHCP DNS servers in place | `networking:manage` | free |
1002
+ | `set_private_network_names` | Replace the complete internal DNS zone label and alias list | `networking:manage` | free |
1003
+ | `list_private_network_ports` | Read owned network ports, their fixed DHCP addresses, generations and attachment states | `networking:read` | free |
1004
+ | `list_service_private_ports` | Read private ports and order attachment recovery state for one owned service order number. | `networking:read` | free |
1005
+ | `list_network_attachment_candidates` | Read attachable services and each attachment_mode | `networking:read` | free |
1006
+ | `attach_private_network_port` | Attach an owned service; omit ipv4 for automatic allocation or pass a fixed usable address | `networking:manage` | free |
1007
+ | `detach_private_network_port` | Detach the owned server port | `networking:manage` | free |
1008
+ | `retry_private_network_port` | Retry the failed current port operation with the PORT generation and any required restart approval. | `networking:manage` | free |
1009
+ | `get_network_vpn_summary` | Read the network's VPN summary, including truthful absence | `networking:read` | free |
1010
+ | `get_network_routed_egress` | Read this network's NAT/internet access, public address and qualification state. | `networking:read` | free |
1011
+ | `set_network_routed_egress` | Request the currently supported NAT transition for an owned network; the backend may refuse mode changes | `networking:manage` | free |
1012
+ | `get_security_group_capabilities` | Read security-group availability and whether the network default policy can be changed. | `networking:read` | free |
1013
+ | `list_network_security_groups` | List groups in the owned project | `networking:read` | free |
1014
+ | `create_network_security_group` | Create a named allow-rule set | `networking:manage` | free |
1015
+ | `update_network_security_group` | Replace the complete group name and rule list at its expected revision | `networking:manage` | free |
1016
+ | `delete_network_security_group` | Delete an unreferenced customer group at its expected revision; referenced groups are refused. | `networking:manage` | free |
1017
+ | `clone_network_security_group` | Clone an owned group into a new name; use the source group's current revision. | `networking:manage` | free |
1018
+ | `get_network_security_policy` | Read default policy, assigned groups and policy application state | `networking:read` | free |
1019
+ | `set_network_default_security_policy` | Change accept/deny for servers without custom groups | `networking:manage` | free |
1020
+ | `set_private_port_security_groups` | Replace the port's complete customer-group list | `networking:manage` | free |
1021
+ | `retry_network_security_policy` | Retry the failed network security policy using its current desired state. | `networking:manage` | free |
1022
+ | `retire_network_security_policy` | Retire the policy only after its server ports are gone | `networking:manage` | free |
1023
+ | `get_network_appliance_capabilities` | Read available load balancer providers/tiers, public qualification, VPN capabilities and quota | `networking:read` | free |
1024
+ | `list_network_appliances` | Read owned load balancers and VPN gateways with one stream cursor. | `networking:read` | free |
1025
+ | `get_network_appliance_billing` | Read current customer-visible recurring appliance lines and currency. | `networking:read` | free |
1026
+ | `get_network_appliance_operation` | Poll an accepted appliance operation | `networking:read` | free |
1027
+ | `list_network_load_balancers` | List private and public load balancers and customer-safe health/qualification state. | `networking:read` | free |
1028
+ | `get_network_load_balancer` | Read one owned load balancer, listeners, members, generation and health | `networking:read` | free |
1029
+ | `estimate_network_load_balancer` | Read a technical load balancer estimate for this exact configuration | `networking:read` | free |
1030
+ | `delete_network_load_balancer` | Request appliance teardown at its current generation; this is not a refund or paid-period cancellation | `networking:manage` | free |
1031
+ | `add_network_load_balancer_member` | Add an attached private server address to the selected listener; backend validates membership in this network. | `networking:manage` | free |
1032
+ | `remove_network_load_balancer_member` | Remove a member from rotation using the load balancer generation. | `networking:manage` | free |
1033
+ | `add_network_load_balancer_listener` | Add a listener and optional initial members using currently offered protocol capabilities | `networking:manage` | free |
1034
+ | `remove_network_load_balancer_listener` | Remove a listener and its members; deleting the last listener is refused. | `networking:manage` | free |
1035
+ | `list_network_vpn_gateways` | List owned VPN gateways, their device peers and safe status | `networking:read` | free |
1036
+ | `get_network_vpn_gateway` | Read one owned VPN gateway, current generation, device peers, grant candidates and attachment capability. | `networking:read` | free |
1037
+ | `delete_network_vpn_gateway` | Request teardown of an owned VPN gateway; all devices lose connectivity | `networking:manage` | free |
1038
+ | `attach_network_vpn_gateway` | Attach or move an account VPN to an owned network only when standalone attachment is advertised | `networking:manage` | free |
1039
+ | `detach_network_vpn_gateway` | Detach an account VPN from its network when supported; it keeps its paid period and devices but recreates the gateway | `networking:manage` | free |
1040
+ | `set_vpn_server_access` | Choose accept or groups_only for the VPN's access to attached servers when this capability is available | `networking:manage` | free |
1041
+ | `create_network_vpn_peer` | Add a device with an externally generated one-time PUBLIC reveal key | `networking:manage` | free |
1042
+ | `take_network_vpn_peer_config` | Consume the device's sealed configuration ONCE | `networking:manage` | free |
1043
+ | `revoke_network_vpn_peer` | Revoke one device using the VPN GATEWAY generation | `networking:manage` | free |
1044
+ | `set_network_vpn_peer_grants` | Replace the device's complete reachable-server list when standalone VPN is available | `networking:manage` | free |
1045
+ | `get_network_vpn_egress_options` | Read supported VPN Internet exits and qualification | `networking:read` | free |
1046
+ | `set_network_vpn_peer_egress` | Set a device's private-only, inherited NAT, or advertised chosen exit policy | `networking:manage` | free |
1047
+ | `list_network_products` | Read current paid products, live tier names, prices and purchase capability; public proxy load balancer 3/5-node offerings must come from this catalog. | `networking:read` | free |
1048
+ | `list_network_product_periods` | Read owned product periods, renewal availability and lifecycle facts. | `networking:read` | free |
1049
+ | `quote_network_product` | Create the network product's exact paid quote for COMMON CHECKOUT | `networking:manage` | Quote: `networking:order` |
1050
+ | `quote_account_vpn` | Create an account VPN quote for common checkout when vpn_account_order is advertised | `networking:manage` | Quote: `networking:order` |
1051
+ | `order_network_product` | Confirm a common-checkout purchase from an approved exact quote | `networking:manage` | Paid: `networking:order` |
1052
+ | `get_network_product_order` | Read an owned common-checkout order's payment and fulfilment state | `networking:read` | free |
1053
+ | `find_network_product_order` | Recover an uncertain checkout by the ORIGINAL quote_id; order=null means no order was found, not proof to use a new payment key. | `networking:read` | free |
1054
+ | `quote_network_product_renewal` | Quote one next paid month for a network product; no charge | `networking:manage` | Quote: `networking:order` |
1055
+ | `renew_network_product` | Pay the exact previously disclosed renewal from account balance | `networking:manage` | Paid: `networking:order` |
1056
+ | `disable_network_product_auto_renew` | Disable automatic renewal | `networking:manage` | free |
1057
+ | `quote_vpn_period_renewal` | Quote the VPN's next month on its actual paid scope; no charge | `networking:manage` | Quote: `networking:order` |
1058
+ | `renew_vpn_period` | Pay the VPN's approved next-month renewal from account balance using the exact quote and original key. | `networking:manage` | Paid: `networking:order` |
1059
+ | `disable_vpn_auto_renew` | Disable the VPN's automatic renewal; the current paid period remains | `networking:manage` | free |
1060
+ | `list_network_public_addresses` | Read owned paid public addresses, account limits, target support and purchase availability. | `networking:read` | free |
1061
+ | `get_network_public_address` | Read one owned public address, attachment and paid-period state. | `networking:read` | free |
1062
+ | `quote_network_public_address` | Quote a new paid public address for common checkout; no charge | `networking:manage` | Quote: `networking:order` |
1063
+ | `attach_public_address_to_network` | Attach or move an already-paid address to an owned network's NAT | `networking:manage` | free |
1064
+ | `attach_public_address_to_server` | Attach or move an owned paid public address to an eligible zero-public-IP server's private port | `networking:manage` | free |
1065
+ | `detach_network_public_address` | Detach an owned public address from its current target; it stays owned for the paid period | `networking:manage` | free |
1066
+ | `quote_public_address_renewal` | Quote the address's next month without charging; use the returned quote and this key for confirmation. | `networking:manage` | Quote: `networking:order` |
1067
+ | `renew_network_public_address` | Pay the approved address renewal from balance with its exact quote ID/token and original key. | `networking:manage` | Paid: `networking:order` |
1068
+ | `disable_public_address_auto_renew` | Disable address automatic renewal; ownership lasts until paid_until | `networking:manage` | free |
1069
+ | `get_network_public_binding` | Read one existing owned public binding's generation, state and assigned address | `networking:read` | free |
1070
+ | `bind_network_public_ip` | Bind an already reserved floating public binding to an owned private port when supported | `networking:manage` | free |
1071
+ | `move_network_public_ip` | Move a prepared floating public binding to another owned private port; confirm interruption to the old target. | `networking:manage` | free |
1072
+ | `configure_network_public_forwarding` | Configure an existing reserved forwarding binding's TCP/UDP listeners | `networking:manage` | free |
1073
+ | `delete_network_public_binding` | Request deletion of an existing binding using its generation | `networking:manage` | free |
1074
+
1075
+ <!-- tool-reference:end -->
1076
+
1077
+ ## Worked examples
1078
+
1079
+ Each example is a request to your assistant and the tools it calls.
1080
+
1081
+ ### Order a VPS (quote, then confirm)
1082
+
1083
+ > Order the cheapest Cloud VPS with Debian and my SSH key, paid from balance.
1084
+
1085
+ 1. `get_order_plans` for the product, then `get_order_options` for the chosen plan
1086
+ (OS, period, resource IDs) and `list_ssh_keys` for the key ID.
1087
+ 2. `order_service` with `plan`, `os`, `period`, `resources`, `sshKey` (or
1088
+ `rootPassword`, not both), `payment: { payment: 1, successUrl: '', cancelUrl: '' }`
1089
+ and a stable `idempotencyKey`. With an API key it first requests the server
1090
+ quote and then confirms with the returned `quoteToken` in one call, so the key
1091
+ needs `vps:order` (or `vds:order`, `ds:order`, `fc:order`) and spend caps.
1092
+ 3. Poll `get_service` for the returned order number; payment accepted is not
1093
+ server ready.
1094
+
1095
+ ### Networking (quote, then order)
1096
+
1097
+ > Add a private load balancer to my network and pay from balance.
1098
+
1099
+ 1. `get_networking_capabilities`, `list_network_products` and
1100
+ `get_network_payment_methods` (pick the `system=balance` method).
1101
+ 2. `quote_network_product` with `kind` (`private_lb`, `proxy_lb` or `vpn_gateway`),
1102
+ `tier` and an `idempotencyKey`; show the quote's EUR `gross_amount`.
1103
+ 3. After approval, `order_network_product` with the same `idempotencyKey`,
1104
+ `quote_id`, `quoteToken`, the balance `payment` and `acknowledge_charge: true`.
1105
+ If the result is uncertain, `find_network_product_order` by the original
1106
+ `quote_id`, then poll `get_network_product_order`. Never buy a second copy.
1107
+
1108
+ ### DNS record upsert
1109
+
1110
+ > Point www.example.com at 203.0.113.10 with a 5 minute TTL.
1111
+
1112
+ 1. `list_dns_zones` to find the `zone_id` (needs `dns:read`).
1113
+ 2. `upsert_dns_record` with `zone_id`, `name: "www"`, `type: "A"`,
1114
+ `content: "203.0.113.10"`, `ttl: 300` (needs `dns:write`). It creates the
1115
+ record or replaces the existing one.
1116
+ 3. `get_dns_zone` to read the desired records back, or `get_dns_zone_history` to
1117
+ see the change.
1118
+
1119
+ ### Order a paid certificate
1120
+
1121
+ > Buy a one-year DV certificate for example.com; I generated the CSR myself.
1122
+
1123
+ 1. `list_certificate_catalog` and `get_certificate_catalog_product` to choose a
1124
+ product and read its current EUR offer.
1125
+ 2. `quote_certificate` with `product_id`, `offer_id`, `offer_generation`,
1126
+ `common_name` (plus any `alternative_names`), the public PKCS#10 `csr`, the
1127
+ owned contact IDs and an `idempotencyKey` (needs `certificates:order`, paid operations and caps).
1128
+ Never send a private key.
1129
+ 3. After the user approves the exact total, `order_certificate` with the same
1130
+ request, the same `idempotencyKey`, the `quote_token`, the `payment` and
1131
+ `acknowledge_exact_quote_and_payment: true`.
1132
+ 4. `get_certificate_validation` (publish the challenge, for example through
1133
+ `upsert_dns_record`), then `download_certificate` once it is issued.
849
1134
 
850
1135
  ## Getting an API key
851
1136
 
@@ -897,6 +1182,12 @@ This server needs a **management** API key. Every failure below is reported by
897
1182
  the tools with an `auth_problem` object containing the cause and the fix, so
898
1183
  read that rather than guessing from the HTTP status.
899
1184
 
1185
+ Tool failures carry `isError: true` while preserving the API error details and
1186
+ recovery guidance. Unknown mutation outcomes must be checked before another
1187
+ attempt. Service order numbers must be copied from `list_services`; ASCII
1188
+ letters, digits, and hyphens are supported, including multi-order suffixes.
1189
+ Malformed or oversized URL identifiers are rejected before an API request.
1190
+
900
1191
  | What you see | What it means | Fix |
901
1192
  |---|---|---|
902
1193
  | `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. |