vpsnet-mcp 2.3.6 → 2.3.7

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/build/index.js CHANGED
@@ -622,6 +622,7 @@ export function createVpsnetServer(options = {}) {
622
622
  readOnlyHint: false,
623
623
  destructiveHint: true,
624
624
  idempotentHint: true,
625
+ openWorldHint: true,
625
626
  },
626
627
  }, async ({ orderNo, installation_id, cpu_percent, email_enabled, memory_mib, network_mib_per_minute, restart_delta, }) => {
627
628
  const { data } = await apiRequest("PUT", applicationPath(orderNo, `installations/${encodeURIComponent(installation_id)}/resource-thresholds`), applicationResourceThresholdRequestBody({
@@ -1244,6 +1245,7 @@ export function createVpsnetServer(options = {}) {
1244
1245
  readOnlyHint: false,
1245
1246
  destructiveHint: true,
1246
1247
  idempotentHint: true,
1248
+ openWorldHint: true,
1247
1249
  },
1248
1250
  }, async ({ orderNo, adoption_id, name, env, secrets, registry_credential_ids, acknowledge_runtime_restart, idempotencyKey, }) => {
1249
1251
  const { status, data } = await apiRequest("POST", applicationPath(orderNo, `compose-adoptions/${encodeURIComponent(adoption_id)}/confirm`), {
@@ -1325,6 +1327,7 @@ export function createVpsnetServer(options = {}) {
1325
1327
  readOnlyHint: false,
1326
1328
  destructiveHint: true,
1327
1329
  idempotentHint: true,
1330
+ openWorldHint: true,
1328
1331
  },
1329
1332
  }, async ({ orderNo, installation_id, access, expected_revision, idempotencyKey, }) => {
1330
1333
  const { status, data } = await apiRequest("POST", applicationPath(orderNo, `installations/${encodeURIComponent(installation_id)}/configure-access`), applicationAccessConfigurationRequestBody(access, expected_revision), { "Idempotency-Key": idempotencyKey });
@@ -1617,22 +1620,24 @@ export function createVpsnetServer(options = {}) {
1617
1620
  return { content: [{ type: "text", text: formatJson(data) }] };
1618
1621
  });
1619
1622
  server.registerTool("change_rdns", {
1620
- description: "Set a customer PTR override for an address returned by get_rdns. Canonical length is 3-253 characters; labels are 1-63 ASCII alphanumeric/hyphen characters without leading/trailing hyphens. A trailing dot is removed and reserved VPSnet names are blocked. Requires services:manage and a full-access API key; this route is not idempotency-keyed.",
1623
+ description: "Set a customer PTR override for an address returned by get_rdns. The new reverse DNS value replaces the previous public PTR answer after propagation. Canonical length is 3-253 characters; labels are 1-63 ASCII alphanumeric/hyphen characters without leading/trailing hyphens. A trailing dot is removed and reserved VPSnet names are blocked. OAuth requires services:manage; API keys require full access. This route is not idempotency-keyed.",
1621
1624
  inputSchema: {
1622
1625
  orderNo: serviceOrderNoSchema,
1623
1626
  ip: serviceIpSchema,
1624
1627
  value: servicePtrSchema,
1625
1628
  },
1629
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
1626
1630
  }, async ({ orderNo, ip, value }) => {
1627
1631
  const { data } = await apiRequest("POST", svc(orderNo, "change-rdns"), { ip, value });
1628
1632
  return { content: [{ type: "text", text: formatJson(data) }] };
1629
1633
  });
1630
1634
  server.registerTool("clear_rdns", {
1631
- description: "Clear a customer PTR override for an address returned by get_rdns. The automatic VPSnet PTR is restored, or PTR is removed when no automatic hostname exists. Requires services:manage and a full-access API key; this route is not idempotency-keyed.",
1635
+ description: "Clear a customer PTR override for an address returned by get_rdns. The automatic VPSnet PTR is restored, or PTR is removed when no automatic hostname exists. OAuth requires services:manage; API keys require full access. This route is not idempotency-keyed.",
1632
1636
  inputSchema: {
1633
1637
  orderNo: serviceOrderNoSchema,
1634
1638
  ip: serviceIpSchema,
1635
1639
  },
1640
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
1636
1641
  }, async ({ orderNo, ip }) => {
1637
1642
  const { data } = await apiRequest("POST", svc(orderNo, "change-rdns/clear"), { ip });
1638
1643
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -2871,12 +2876,13 @@ export function createVpsnetServer(options = {}) {
2871
2876
  return { content: [{ type: "text", text: formatJson(data) }] };
2872
2877
  });
2873
2878
  server.registerTool("set_domain_nameservers", {
2874
- description: "Queue an asynchronous nameserver change for an owned domain. Nameservers must be hostnames, not IP addresses; same-domain nameserver IP records are managed separately. This does not manage DNS records or PTR. Requires domains:manage when using an API key.",
2879
+ description: "Queue an asynchronous registrar nameserver change for an owned domain. When applied, the parent zone delegates the domain to the new public nameservers, replacing the prior delegation. Nameservers must be hostnames, not IP addresses; same-domain nameserver IP records are managed separately. This does not manage DNS records or PTR. Requires domains:manage when using an API key.",
2875
2880
  inputSchema: {
2876
2881
  domain_id: positiveIdSchema.describe("Owned domain ID from list_domains"),
2877
2882
  nameservers: z.array(nameserverHostnameSchema).min(2).max(13).describe("2-13 nameserver hostnames, e.g. ns1.vpsnet.com, ns2.vpsnet.com. IP addresses are not accepted."),
2878
2883
  idempotencyKey: idempotencyKeySchema.optional().describe("Optional idempotency key for the queued domain action"),
2879
2884
  },
2885
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
2880
2886
  }, async ({ domain_id, nameservers, idempotencyKey }) => {
2881
2887
  const headers = idempotencyKey ? { "Idempotency-Key": idempotencyKey } : undefined;
2882
2888
  const { data } = await apiRequest("POST", `/account/domains/${encodeURIComponent(String(domain_id))}/nameservers`, {
@@ -2895,13 +2901,14 @@ export function createVpsnetServer(options = {}) {
2895
2901
  return { content: [{ type: "text", text: formatJson(data) }] };
2896
2902
  });
2897
2903
  server.registerTool("create_domain_glue_record", {
2898
- description: "Queue creating or updating a same-domain nameserver IP record for an owned domain. Hostname must be below the domain, addresses must be public IPs, and this does not create DNS A/AAAA records or PTR. Requires domains:manage when using an API key.",
2904
+ description: "Queue creating or updating a same-domain nameserver IP record at the registrar for an owned domain. The public parent-zone glue can direct resolvers to new nameserver addresses; updating an existing hostname replaces its previous addresses. Hostname must be below the domain, addresses must be public IPs, and this does not create DNS A/AAAA records or PTR. Requires domains:manage when using an API key.",
2899
2905
  inputSchema: {
2900
2906
  domain_id: positiveIdSchema.describe("Owned domain ID from list_domains"),
2901
2907
  hostname: glueHostnameSchema,
2902
2908
  addresses: z.array(gluePublicIpSchema).min(1).max(13).describe("Public IPv4/IPv6 addresses for this nameserver host"),
2903
2909
  idempotencyKey: idempotencyKeySchema.describe("Unique key for this queued domain action; sent as Idempotency-Key"),
2904
2910
  },
2911
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
2905
2912
  }, async ({ domain_id, hostname, addresses, idempotencyKey }) => {
2906
2913
  const { data } = await apiRequest("POST", `/account/domains/${encodeURIComponent(String(domain_id))}/glue`, { hostname, addresses, idempotencyKey }, { "Idempotency-Key": idempotencyKey });
2907
2914
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -2913,6 +2920,7 @@ export function createVpsnetServer(options = {}) {
2913
2920
  record_id: positiveIdSchema.describe("Record ID from list_domain_glue_records"),
2914
2921
  idempotencyKey: idempotencyKeySchema.describe("Unique key for this queued domain action; sent as Idempotency-Key"),
2915
2922
  },
2923
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
2916
2924
  }, async ({ domain_id, record_id, idempotencyKey }) => {
2917
2925
  const { data } = await apiRequest("DELETE", `/account/domains/${encodeURIComponent(String(domain_id))}/glue/${encodeURIComponent(String(record_id))}`, { idempotencyKey }, { "Idempotency-Key": idempotencyKey });
2918
2926
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -2927,7 +2935,7 @@ export function createVpsnetServer(options = {}) {
2927
2935
  return { content: [{ type: "text", text: formatJson(data) }] };
2928
2936
  });
2929
2937
  server.registerTool("add_domain_parent_ds", {
2930
- description: "Queue adding DNSSEC DS records at the parent zone for an owned domain. Requires domains:manage when using an API key.",
2938
+ description: "Queue adding public DNSSEC DS records at the parent zone for an owned domain. Confirm the records match the child zone's DNSKEY; mismatched DS records can prevent validating resolvers from resolving the domain. Requires domains:manage when using an API key.",
2931
2939
  inputSchema: {
2932
2940
  domain_id: positiveIdSchema.describe("Owned domain ID from list_domains"),
2933
2941
  ds: z
@@ -2936,6 +2944,7 @@ export function createVpsnetServer(options = {}) {
2936
2944
  .describe("One or more DS records, one per line. Accepted forms include '12345 13 2 ABCDEF...' or full BIND-style DS lines."),
2937
2945
  idempotencyKey: idempotencyKeySchema.describe("Unique key for this queued domain action; sent as Idempotency-Key"),
2938
2946
  },
2947
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
2939
2948
  }, async ({ domain_id, ds, idempotencyKey }) => {
2940
2949
  const { data } = await apiRequest("POST", `/account/domains/${encodeURIComponent(String(domain_id))}/dnssec-ds`,
2941
2950
  // The API's preferred key is ds_records; bare `ds` is only a
@@ -2953,6 +2962,7 @@ export function createVpsnetServer(options = {}) {
2953
2962
  .describe("One or more DS records to remove, one per line. Accepted forms include '12345 13 2 ABCDEF...' or full BIND-style DS lines."),
2954
2963
  idempotencyKey: idempotencyKeySchema.describe("Unique key for this queued domain action; sent as Idempotency-Key"),
2955
2964
  },
2965
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
2956
2966
  }, async ({ domain_id, ds, idempotencyKey }) => {
2957
2967
  const { data } = await apiRequest("DELETE", `/account/domains/${encodeURIComponent(String(domain_id))}/dnssec-ds`,
2958
2968
  // The API's preferred key is ds_records; bare `ds` is only a
@@ -3091,6 +3101,7 @@ export function createVpsnetServer(options = {}) {
3091
3101
  quoteToken: z.string().min(32).describe("quoteToken returned by quote_domain_register"),
3092
3102
  payment: domainPaymentSchema,
3093
3103
  },
3104
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
3094
3105
  }, async ({ idempotencyKey, quoteToken, ...input }) => {
3095
3106
  const body = { ...input, idempotencyKey, quoteToken };
3096
3107
  const { data } = await apiRequest("POST", options.remoteProfile === "orders" ? "/account/mcp/orders/domains/confirm" : "/account/domains/register/confirm", body, { "Idempotency-Key": idempotencyKey, "X-Quote-Token": quoteToken });
@@ -3111,6 +3122,7 @@ export function createVpsnetServer(options = {}) {
3111
3122
  quoteToken: z.string().min(32).describe("quoteToken returned by quote_domain_transfer"),
3112
3123
  payment: domainPaymentSchema,
3113
3124
  },
3125
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
3114
3126
  }, async ({ idempotencyKey, quoteToken, authCode, ...input }) => {
3115
3127
  const body = { ...input, auth_code: authCode, idempotencyKey, quoteToken };
3116
3128
  const { data } = await apiRequest("POST", "/account/domains/transfer/confirm", body, { "Idempotency-Key": idempotencyKey, "X-Quote-Token": quoteToken });
@@ -3139,6 +3151,7 @@ export function createVpsnetServer(options = {}) {
3139
3151
  quoteToken: z.string().min(32).describe("quoteToken returned by quote_domain_renew"),
3140
3152
  payment: domainPaymentSchema,
3141
3153
  },
3154
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
3142
3155
  }, async ({ idempotencyKey, quoteToken, ...input }) => {
3143
3156
  const body = { ...input, idempotencyKey, quoteToken };
3144
3157
  const { data } = await apiRequest("POST", "/account/domains/renew/confirm", body, { "Idempotency-Key": idempotencyKey, "X-Quote-Token": quoteToken });
@@ -3165,6 +3178,7 @@ export function createVpsnetServer(options = {}) {
3165
3178
  quoteToken: z.string().min(32).describe("quoteToken returned by quote_domain_restore"),
3166
3179
  payment: domainPaymentSchema,
3167
3180
  },
3181
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
3168
3182
  }, async ({ idempotencyKey, quoteToken, ...input }) => {
3169
3183
  const body = { ...input, idempotencyKey, quoteToken };
3170
3184
  const { data } = await apiRequest("POST", "/account/domains/restore/confirm", body, { "Idempotency-Key": idempotencyKey, "X-Quote-Token": quoteToken });
@@ -3221,6 +3235,7 @@ export function createVpsnetServer(options = {}) {
3221
3235
  .describe("CNAME target hostname (required when type=CNAME)"),
3222
3236
  ttl: z.number().optional().describe("TTL in seconds (default 120)"),
3223
3237
  },
3238
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
3224
3239
  }, async ({ orderNo, zone_id, name, type, ip, target, ttl }) => {
3225
3240
  const body = { zone_id, name, type };
3226
3241
  if (ip !== undefined)
@@ -3686,10 +3701,11 @@ export function createVpsnetServer(options = {}) {
3686
3701
  return { content: [{ type: "text", text: formatJson(data) }] };
3687
3702
  });
3688
3703
  server.registerTool("delete_function", {
3689
- description: "Delete a Firecracker Function.",
3704
+ description: "Delete a Firecracker Function, including its public webhook endpoint when enabled.",
3690
3705
  inputSchema: {
3691
3706
  function_id: positiveIdSchema.describe("Function ID from list_functions"),
3692
3707
  },
3708
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
3693
3709
  }, async ({ function_id }) => {
3694
3710
  const { data } = await apiRequest("DELETE", `/account/firecracker/functions/${encodeURIComponent(String(function_id))}`);
3695
3711
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -4005,7 +4021,7 @@ export function createVpsnetServer(options = {}) {
4005
4021
  return { content: [{ type: "text", text: formatJson(data) }] };
4006
4022
  });
4007
4023
  server.registerTool("import_dns_zone", {
4008
- description: "Import BIND-style forward DNS records into a native zone. Set replace=true to replace non-system desired-state records; false upserts imported records. PTR/reverse DNS, SOA, DNSSEC wire records, apex NS, and LUA are skipped or rejected by the API. Requires dns:write when using an API key.",
4024
+ description: "Import BIND-style forward DNS records into a native zone. These records can change public DNS answers after publication. Set replace=true to replace non-system desired-state records; false upserts imported records. PTR/reverse DNS, SOA, DNSSEC wire records, apex NS, and LUA are skipped or rejected by the API. Requires dns:write when using an API key.",
4009
4025
  inputSchema: {
4010
4026
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4011
4027
  zonefile: z
@@ -4018,6 +4034,7 @@ export function createVpsnetServer(options = {}) {
4018
4034
  .optional()
4019
4035
  .describe("If true, delete existing non-system desired-state records before importing. Defaults to false."),
4020
4036
  },
4037
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4021
4038
  }, async ({ zone_id, zonefile, replace }) => {
4022
4039
  const { data } = await apiRequest("POST", `/account/dns/zones/${encodeURIComponent(String(zone_id))}/import`, {
4023
4040
  zonefile,
@@ -4035,7 +4052,7 @@ export function createVpsnetServer(options = {}) {
4035
4052
  return { content: [{ type: "text", text: formatJson(data) }] };
4036
4053
  });
4037
4054
  server.registerTool("apply_dns_template", {
4038
- description: "Apply a backend-defined DNS template to a native forward zone. Records still pass the same API validation, quotas and conflict rules as manual record writes. Prefer preview=true first to show the user exactly which records a template would write before changing the zone. Requires dns:write when using an API key.",
4055
+ description: "Apply a backend-defined DNS template to a native forward zone. The written records can change public DNS answers; overwrite=true replaces conflicting records. Records still pass the same API validation, quotas and conflict rules as manual record writes. Prefer preview=true first to show the user exactly which records a template would write before changing the zone. Requires dns:write when using an API key.",
4039
4056
  inputSchema: {
4040
4057
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4041
4058
  template: dnsTemplateIdSchema
@@ -4053,6 +4070,7 @@ export function createVpsnetServer(options = {}) {
4053
4070
  .optional()
4054
4071
  .describe("true to replace existing records that conflict with the template. Destructive: confirm the exact conflicts with the user first, ideally from a preview run."),
4055
4072
  },
4073
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4056
4074
  }, async ({ zone_id, template, parameters, preview, overwrite }) => {
4057
4075
  const { data } = await apiRequest("POST", `/account/dns/zones/${encodeURIComponent(String(zone_id))}/templates/${encodeURIComponent(template)}`, {
4058
4076
  ...(parameters !== undefined ? { parameters } : {}),
@@ -4066,6 +4084,7 @@ export function createVpsnetServer(options = {}) {
4066
4084
  inputSchema: {
4067
4085
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4068
4086
  },
4087
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4069
4088
  }, async ({ zone_id }) => {
4070
4089
  const { data } = await apiRequest("DELETE", `/account/dns/zones/${encodeURIComponent(String(zone_id))}`);
4071
4090
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -4075,6 +4094,7 @@ export function createVpsnetServer(options = {}) {
4075
4094
  inputSchema: {
4076
4095
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4077
4096
  },
4097
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4078
4098
  }, async ({ zone_id }) => {
4079
4099
  const { data } = await apiRequest("POST", `/account/dns/zones/${encodeURIComponent(String(zone_id))}/verify`);
4080
4100
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -4098,7 +4118,7 @@ export function createVpsnetServer(options = {}) {
4098
4118
  return { content: [{ type: "text", text: formatJson(data) }] };
4099
4119
  });
4100
4120
  server.registerTool("set_dnssec", {
4101
- description: "Enable or disable DNSSEC signing for a native DNS zone. If parent DS records still exist outside VPSNet, remove them first and set parent_ds_removed=true before disabling signing. Secondary-zone DNSSEC is controlled on the primary server. Requires dnssec:manage when using an API key.",
4121
+ description: "Enable or disable public DNSSEC signing for a native DNS zone. This changes the zone's DNSSEC chain and can affect validating resolvers. If parent DS records still exist outside VPSNet, remove them first and set parent_ds_removed=true before disabling signing. Secondary-zone DNSSEC is controlled on the primary server. Requires dnssec:manage when using an API key.",
4102
4122
  inputSchema: {
4103
4123
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4104
4124
  enabled: z.boolean().describe("true to enable/sign the zone, false to disable/remove signing"),
@@ -4107,6 +4127,7 @@ export function createVpsnetServer(options = {}) {
4107
4127
  .optional()
4108
4128
  .describe("When disabling DNSSEC for a zone whose parent DS is managed outside VPSNet, set true only after removing the parent DS records."),
4109
4129
  },
4130
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4110
4131
  }, async ({ zone_id, enabled, parent_ds_removed }) => {
4111
4132
  const { data } = await apiRequest("POST", `/account/dns/zones/${encodeURIComponent(String(zone_id))}/dnssec`, {
4112
4133
  enabled,
@@ -4115,7 +4136,7 @@ export function createVpsnetServer(options = {}) {
4115
4136
  return { content: [{ type: "text", text: formatJson(data) }] };
4116
4137
  });
4117
4138
  server.registerTool("upsert_dns_record", {
4118
- description: "Create or replace a forward DNS record in desired state for a native zone. PTR and *.arpa are rejected; use change_rdns for reverse DNS. Requires dns:write when using an API key.",
4139
+ description: "Create or replace a forward DNS record in desired state for a native zone. Replacing an existing record changes the public answer after publication. PTR and *.arpa are rejected; use change_rdns for reverse DNS. Requires dns:write when using an API key.",
4119
4140
  inputSchema: {
4120
4141
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4121
4142
  name: z
@@ -4133,6 +4154,7 @@ export function createVpsnetServer(options = {}) {
4133
4154
  .optional()
4134
4155
  .describe("Optional note about this record, max 255 chars."),
4135
4156
  },
4157
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4136
4158
  }, async ({ zone_id, name, type, content, ttl, comment }) => {
4137
4159
  const body = { name, type, content };
4138
4160
  if (ttl !== undefined)
@@ -4143,7 +4165,7 @@ export function createVpsnetServer(options = {}) {
4143
4165
  return { content: [{ type: "text", text: formatJson(data) }] };
4144
4166
  });
4145
4167
  server.registerTool("update_dns_record", {
4146
- description: "Edit an existing forward DNS record by its ID (PUT) — change value, TTL, or comment without replacing it. System-managed records cannot be edited. Requires dns:write when using an API key.",
4168
+ description: "Update an existing forward DNS record by its ID (PUT), replacing its desired value, TTL or comment. A changed value can replace the public DNS answer after publication. System-managed records cannot be edited. Requires dns:write when using an API key.",
4147
4169
  inputSchema: {
4148
4170
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4149
4171
  record_id: positiveIdSchema.describe("DNS record ID to update"),
@@ -4162,6 +4184,7 @@ export function createVpsnetServer(options = {}) {
4162
4184
  .optional()
4163
4185
  .describe("Optional note about this record, max 255 chars."),
4164
4186
  },
4187
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4165
4188
  }, async ({ zone_id, record_id, name, type, content, ttl, comment }) => {
4166
4189
  const body = { name, type, content };
4167
4190
  if (ttl !== undefined)
@@ -4177,6 +4200,7 @@ export function createVpsnetServer(options = {}) {
4177
4200
  zone_id: positiveIdSchema.describe("DNS zone ID"),
4178
4201
  record_id: positiveIdSchema.describe("DNS record ID"),
4179
4202
  },
4203
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4180
4204
  }, async ({ zone_id, record_id }) => {
4181
4205
  const { data } = await apiRequest("DELETE", `/account/dns/zones/${encodeURIComponent(String(zone_id))}/records/${encodeURIComponent(String(record_id))}`);
4182
4206
  return { content: [{ type: "text", text: formatJson(data) }] };
@@ -158,11 +158,18 @@ const additiveTools = new Set([
158
158
  ]);
159
159
  const externalTools = new Set([
160
160
  'run_vm_command', 'invoke_function', 'install_application', 'install_application_recipe',
161
- 'create_function', 'update_function', 'create_dns_zone',
161
+ 'configure_application_access', 'configure_application_resource_thresholds',
162
+ 'confirm_application_compose_adoption',
163
+ 'create_function', 'update_function', 'delete_function', 'create_dns_zone',
162
164
  'validate_application_recipe', 'create_application_recipe', 'create_application_recipe_revision',
163
165
  'read_vm_file', 'write_vm_file', 'manage_application', 'get_application_health', 'get_application_logs',
164
166
  'reconcile_application', 'repair_application', 'restart_application', 'start_application',
165
167
  'stop_application', 'uninstall_application', 'update_application',
168
+ 'change_rdns', 'clear_rdns', 'set_domain_nameservers',
169
+ 'create_domain_glue_record', 'delete_domain_glue_record',
170
+ 'add_domain_parent_ds', 'delete_domain_parent_ds', 'confirm_domain_register',
171
+ 'attach_service_dns_record', 'import_dns_zone', 'apply_dns_template', 'delete_dns_zone',
172
+ 'set_dnssec', 'upsert_dns_record', 'update_dns_record', 'delete_dns_record',
166
173
  'verify_dns_zone', 'reissue_dns_zone_verification', 'get_dns_zone_diagnostics',
167
174
  'create_free_certificate', 'manage_free_certificate', 'refresh_automatic_ssl_subscription',
168
175
  'manage_automatic_ssl_subscription', 'refresh_certificate', 'manage_certificate',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vpsnet-mcp",
3
- "version": "2.3.6",
3
+ "version": "2.3.7",
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": {