vpsnet-mcp 2.3.10 → 2.3.11

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
@@ -262,7 +262,9 @@ one. `list_restore_file_points`, `browse_restore_files` and
262
262
  charge the account, never overwrite the disk, and never put a file back on the
263
263
  server. Initially supported on Firecracker VPS.
264
264
 
265
- Browsing is asynchronous. `browse_restore_files` returns a browse id in a
265
+ Browsing is asynchronous. `browse_restore_files` creates a persisted job and
266
+ queues worker activity, so its MCP annotation is `readOnlyHint: false` even
267
+ though the backup and running server are unchanged. It returns a browse id in a
266
268
  pending state; poll `get_restore_file_browse` until `state` is `succeeded`.
267
269
  Entries exist only in that state — a `failed` browse carries an `errorCode` and
268
270
  no listing, and must not be presented as an empty directory.
@@ -736,7 +738,7 @@ everything else.
736
738
  | `list_restore_points` | List whole-service restore points | `services:read` | free |
737
739
  | `request_restore` | **Paid and destructive:** restore the whole service disk from a point | `services:read` | Paid: `services:restore` |
738
740
  | `list_restore_file_points` | List browsable backup points and whether folder search is available (free) | `services:read` | free |
739
- | `browse_restore_files` | Queue a listing of one directory inside a backup (free, read-only) | `services:read` | free |
741
+ | `browse_restore_files` | Queue a backup directory listing job without restoring files | `services:read` | free |
740
742
  | `get_restore_file_browse` | Poll a queued backup directory listing (free, read-only) | `services:read` | free |
741
743
 
742
744
  ### SSH Keys
package/build/index.js CHANGED
@@ -3739,7 +3739,7 @@ export function createVpsnetServer(options = {}) {
3739
3739
  };
3740
3740
  });
3741
3741
  server.registerTool("browse_restore_files", {
3742
- description: "Queue a free, read-only listing of one directory inside a backup point. This does NOT restore anything, does not charge the account, and does not modify the server. Start at the backup root by passing only backupPointId. To open a subdirectory, pass sourceBrowseId plus the directoryEntryId of a type=directory entry from that result; filesystem paths are never accepted. A directory can hold an enormous number of files, so the server selects pages of 200 or 1,000 entries: while result.nextOffset is non-null, call again with the same sourceBrowseId and directoryEntryId and offset set to result.nextOffset. Use result.pageSize rather than assuming 200 when moving backwards. When nextOffset is null the listing cannot be paged further even if truncated is true — that is a capped scan; check result.listingStatus: 'complete' means the folder was read end to end, 'partial' means the listing is a bounded lower-bound slice, so never present it as the whole folder. Optionally pass filter to search entry NAMES in that one directory (substring, case-insensitive, never recursive) — but only when list_restore_file_points reported searchAvailable=true, otherwise this tool refuses rather than silently returning an unfiltered listing. The call is asynchronous: it returns a browse id in a pending state, and you must poll get_restore_file_browse until state is succeeded. Requires services:read and, because it is a POST, an API key that permits write operations plus an idempotencyKey.",
3742
+ description: "Create a persisted asynchronous browse job to list one directory inside a backup point. This queues worker activity and stores the listing result; it does not restore files, change backup contents or the running server, or charge the account. Start at the backup root by passing only backupPointId. To open a subdirectory, pass sourceBrowseId plus the directoryEntryId of a type=directory entry from that result; filesystem paths are never accepted. A directory can hold an enormous number of files, so the server selects pages of 200 or 1,000 entries: while result.nextOffset is non-null, call again with the same sourceBrowseId and directoryEntryId and offset set to result.nextOffset. Use result.pageSize rather than assuming 200 when moving backwards. When nextOffset is null the listing cannot be paged further even if truncated is true — that is a capped scan; check result.listingStatus: 'complete' means the folder was read end to end, 'partial' means the listing is a bounded lower-bound slice, so never present it as the whole folder. Optionally pass filter to search entry NAMES in that one directory (substring, case-insensitive, never recursive) — but only when list_restore_file_points reported searchAvailable=true, otherwise this tool refuses rather than silently returning an unfiltered listing. The call is asynchronous: it returns a browse id in a pending state, and you must poll get_restore_file_browse until state is succeeded. Requires services:read and, because it is a POST, an API key that permits write operations plus an idempotencyKey.",
3743
3743
  inputSchema: {
3744
3744
  orderNo: serviceOrderNoSchema,
3745
3745
  backupPointId: fileBrowsePointIdSchema,
@@ -3755,7 +3755,7 @@ export function createVpsnetServer(options = {}) {
3755
3755
  },
3756
3756
  annotations: {
3757
3757
  title: "Browse backup files",
3758
- readOnlyHint: true,
3758
+ readOnlyHint: false,
3759
3759
  destructiveHint: false,
3760
3760
  idempotentHint: true,
3761
3761
  },
@@ -185,9 +185,9 @@ const deduplicatedTools = new Set([
185
185
  'run_vm_command', 'inspect_vm', 'read_vm_file', 'write_vm_file', 'create_vm_file', 'cancel_vm_operation',
186
186
  'create_function', 'invoke_function', 'confirm_service_order', 'confirm_domain_register',
187
187
  ]);
188
- // These read guest state but queue durable operations, so their read scopes do
188
+ // These read guest or backup state but queue durable operations, so their read scopes do
189
189
  // not imply a read-only MCP call.
190
- const queuedReadTools = new Set(['inspect_vm', 'read_vm_file', 'get_application_health', 'get_application_logs', 'discover_service_containers']);
190
+ const queuedReadTools = new Set(['browse_restore_files', 'inspect_vm', 'read_vm_file', 'get_application_health', 'get_application_logs', 'discover_service_containers']);
191
191
  // Keep cached aggregate calls valid, but advertise the individually scoped
192
192
  // actions to new directory clients. The SDK uses one handler for tools/list;
193
193
  // filtering its result leaves the normal tools/call dispatcher intact.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vpsnet-mcp",
3
- "version": "2.3.10",
3
+ "version": "2.3.11",
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": {