vpsnet-mcp 2.3.6 → 2.3.8
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 +35 -11
- package/build/networking-tools.js +1 -1
- package/build/remote-policy.js +8 -1
- package/package.json +1 -1
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.
|
|
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.
|
|
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: "
|
|
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) }] };
|
|
@@ -110,7 +110,7 @@ export const networkingTools = [
|
|
|
110
110
|
tool("create_private_network", "POST", `${N}/networks`, "Create a private network intent. Every subnet is unique on the whole platform and comes from 100.64.0.0/10. Omit subnet and the platform allocates a free block of subnet_prefix_length (28..24, default 26 = 64 addresses; capabilities.private_network.subnet_sizes lists each size with its server count and suggested block); or name an aligned /28 through /24 inside 100.64.0.0/10 that no network holds (409 subnet_in_use), never both. Creation does not itself attach a server or buy a public address.", { name, subnet: z.object({ cidr: z.string().regex(/^100\.(?:6[4-9]|[7-9]\d|1[01]\d|12[0-7])(?:\.\d{1,3}){2}\/(?:2[4-8])$/) }).strict().optional(), subnet_prefix_length: z.union([z.literal(24), z.literal(25), z.literal(26), z.literal(27), z.literal(28)]).optional().describe("Size of the allocated subnet when subnet is omitted; default 26"), settings: settings.optional(), default_policy: z.enum(["accept", "deny"]).optional() }, { idempotent: true }),
|
|
111
111
|
tool("delete_private_network", "DELETE", networks, "Request deletion of an empty network. Referenced appliances/ports may prevent deletion; quota is released only after verified cleanup.", { expected_generation: generation }, { idempotent: true, destructive: true }),
|
|
112
112
|
tool("retry_private_network", "POST", `${networks}/retry`, "Retry the failed current network operation only; preserve its current generation. It may resume a failed deletion or settings change, so inspect the failed operation before retrying.", { expected_generation: generation }, { idempotent: true, destructive: true }),
|
|
113
|
-
tool("set_private_network_dns", "POST", `${networks}/dns`, "
|
|
113
|
+
tool("set_private_network_dns", "POST", `${networks}/dns`, "Replace the network's DHCP DNS mode and resolver addresses; changing or disabling them can interrupt name resolution for attached guests. Use dns_servers only for custom mode. Poll get_private_network.settings.dns_change; its DNS update UUID is not in the network operations feed.", { dns_mode: dnsMode, dns_servers: z.array(ipv4).min(1).max(3).optional() }, { idempotent: true, destructive: true }),
|
|
114
114
|
tool("set_private_network_names", "PUT", `${networks}/names`, "Replace the complete internal DNS zone label and alias list. Server names are automatic; these names resolve only inside this network. Omitted aliases are removed and may stop resolving.", { zone_label: dnsLabel, aliases: z.array(dnsAlias).max(64) }, { destructive: true }),
|
|
115
115
|
tool("list_private_network_ports", "GET", `${networks}/ports`, "Read owned network ports, their fixed DHCP addresses, generations and attachment states. Reserved is not connected."),
|
|
116
116
|
tool("list_service_private_ports", "GET", `${N}/services/{service_id}/ports`, "Read private ports and order attachment recovery state for one owned service order number."),
|
package/build/remote-policy.js
CHANGED
|
@@ -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
|
-
'
|
|
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',
|