vpsnet-mcp 2.3.2 → 2.3.3

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
@@ -295,7 +295,7 @@ This MCP server manages your VPS infrastructure through the VPSnet.com API, incl
295
295
 
296
296
  1. AI reads the local machine's public key (`~/.ssh/id_rsa.pub`)
297
297
  2. Uploads it to VPSnet.com via `create_ssh_key`
298
- 3. Deploys it to a VPS via `deploy_ssh_key` (or passes it when ordering with `order_service`)
298
+ 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`)
299
299
  4. Connects directly: `ssh root@<vps_ip>`
300
300
 
301
301
  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.
@@ -672,7 +672,7 @@ everything else.
672
672
  | `change_title` | Change service display title | `services:manage` | free |
673
673
  | `toggle_ipv6` | Enable or disable IPv6 | `services:manage` | free |
674
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 |
675
+ | `deploy_ssh_key` | Deploy an SSH key to a VPS; remote OAuth also requires `vm:exec` | `services:manage` | free |
676
676
 
677
677
  ### OS Reinstall
678
678
  | Tool | Description | Scope | Paid |
package/build/index.js CHANGED
@@ -1661,7 +1661,7 @@ export function createVpsnetServer(options = {}) {
1661
1661
  return { content: [{ type: "text", text: formatJson(data) }] };
1662
1662
  });
1663
1663
  server.registerTool("deploy_ssh_key", {
1664
- description: "Deploy an SSH key to VPS. Returns a noty UUID; follow it with wait_for_event. ASYNC — wait 15-30 seconds after deploying before attempting SSH. Use list_ssh_keys to get available key IDs. To add your own key first: read ~/.ssh/id_rsa.pub from local machine, then create_ssh_key, then deploy it here. Requires services:manage and a full-access API key.",
1664
+ description: "Deploy an SSH key to VPS. Returns a noty UUID; follow it with wait_for_event. ASYNC — wait 15-30 seconds after deploying before attempting SSH. Use list_ssh_keys to get available key IDs. To add your own key first: read ~/.ssh/id_rsa.pub from local machine, then create_ssh_key, then deploy it here. Remote OAuth requires vm:exec; direct API-key use requires services:manage and a full-access key.",
1665
1665
  inputSchema: {
1666
1666
  orderNo: serviceOrderNoSchema,
1667
1667
  ssh_key: positiveIdSchema.describe("SSH key ID from list_ssh_keys"),
@@ -22,7 +22,7 @@ export const orderScopes = ["orders:read", "orders:servers", "orders:domains"];
22
22
  export const orderInstructions = remoteInstructions.replace("This connector does not purchase capacity, change payment settings or run model inference.", "This VPSnet connection can purchase permanent VPS servers and register domains from the customer’s VPSnet balance when purchase permissions are enabled. Use the existing connection; its owner can change purchase permissions in the VPSnet panel without reconnecting. Quote first, show the final gross EUR amount and period, and confirm only after explicit approval. Domain registration may be non-refundable. Daily and monthly limits cover this connection across token refresh. Never use a new key to retry an uncertain payment; inspect get_purchase_result. Payment settings and saved-card charges are not exposed.");
23
23
  export const supportedScopes = ["services:read", "services:manage", "applications:read", "applications:manage", "networking:read", "networking:manage", "functions:read", "functions:manage", "functions:invoke", "vm:diagnostics", "vm:files:read", "vm:files:write", "vm:exec", "services:reinstall", "services:restore", "services:rescue", "dns:read", "dns:write", "dnssec:manage", "domains:read", "domains:manage", "certificates:read", "certificates:manage", "ssh_keys:read", "ssh_keys:manage"];
24
24
  const readServices = ["get_service_rescue", "get_guest_agent_status", "get_plan_options", "get_plan_resources", "calculate_plan_change", "get_period_options", "list_restore_points", "list_restore_file_points", "browse_restore_files", "get_restore_file_browse", "list_services", "get_service", "get_service_graphs", "get_service_history", "get_hostname", "get_title", "get_rdns", "get_os_options", "get_backup_status", "get_backup_history", "list_snapshots", "list_firecracker_snapshots", "get_firecracker_backup_status", "get_firecracker_backup_history"];
25
- const manageServices = ["suspend_service", "resume_service", "flush_iptables", "toggle_ipv6", "toggle_extra_settings", "deploy_ssh_key", "reinstall_os", "rollback_snapshot", "delete_snapshot", "rollback_firecracker_snapshot", "delete_firecracker_snapshot", "start_service", "stop_service", "restart_service", "change_hostname", "reset_hostname", "change_title", "change_rdns", "clear_rdns"];
25
+ const manageServices = ["suspend_service", "resume_service", "flush_iptables", "toggle_ipv6", "toggle_extra_settings", "reinstall_os", "rollback_snapshot", "delete_snapshot", "rollback_firecracker_snapshot", "delete_firecracker_snapshot", "start_service", "stop_service", "restart_service", "change_hostname", "reset_hostname", "change_title", "change_rdns", "clear_rdns"];
26
26
  const readApps = ["list_application_registry_credentials", "get_application_data_restore", "list_application_catalog", "list_service_applications", "get_application_installation", "get_application_events", "get_application_health", "get_application_logs", "list_application_recipes", "list_application_recipe_revisions", "export_application_recipe", "discover_service_containers", "get_application_compose_adoption"];
27
27
  const manageApps = ["configure_application_resource_thresholds", "validate_application_recipe", "create_application_recipe", "create_application_recipe_revision", "install_application_recipe", "prepare_application_compose_adoption", "confirm_application_compose_adoption", "install_application", "configure_application_access", "manage_application", "cancel_application_action"];
28
28
  const permissions = new Map([
@@ -97,6 +97,7 @@ const permissions = new Map([
97
97
  ["get_ssh_key", "ssh_keys:read"],
98
98
  ["create_ssh_key", "ssh_keys:manage"],
99
99
  ["delete_ssh_key", "ssh_keys:manage"],
100
+ ["deploy_ssh_key", "vm:exec"],
100
101
  ["enter_service_rescue", "services:rescue"],
101
102
  ["exit_service_rescue", "services:rescue"],
102
103
  ["get_system_status", "authenticated"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vpsnet-mcp",
3
- "version": "2.3.2",
3
+ "version": "2.3.3",
4
4
  "type": "module",
5
5
  "description": "MCP server for managing VPSnet.com services, applications, DNS, domains, billing, and server lifecycle operations",
6
6
  "bin": {