@selfhost.dev/mcp-server 0.7.0 → 0.9.0
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 +118 -17
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/alerts.js +83 -12
- package/dist/tools/alerts.js.map +1 -1
- package/dist/tools/auth.js +13 -1
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/backups.js +197 -18
- package/dist/tools/backups.js.map +1 -1
- package/dist/tools/billing.js +5 -1
- package/dist/tools/billing.js.map +1 -1
- package/dist/tools/capacity.d.ts +2 -0
- package/dist/tools/capacity.js +253 -0
- package/dist/tools/capacity.js.map +1 -0
- package/dist/tools/database-users.js +33 -6
- package/dist/tools/database-users.js.map +1 -1
- package/dist/tools/deployments.js +14 -16
- package/dist/tools/deployments.js.map +1 -1
- package/dist/tools/env-vars.js +23 -0
- package/dist/tools/env-vars.js.map +1 -1
- package/dist/tools/github.js +65 -4
- package/dist/tools/github.js.map +1 -1
- package/dist/tools/instance-logs.d.ts +2 -0
- package/dist/tools/instance-logs.js +151 -0
- package/dist/tools/instance-logs.js.map +1 -0
- package/dist/tools/instances.js +251 -25
- package/dist/tools/instances.js.map +1 -1
- package/dist/tools/organizations.js +107 -13
- package/dist/tools/organizations.js.map +1 -1
- package/dist/tools/postgres-tls.d.ts +16 -0
- package/dist/tools/postgres-tls.js +64 -0
- package/dist/tools/postgres-tls.js.map +1 -0
- package/dist/tools/project-activities.d.ts +2 -0
- package/dist/tools/project-activities.js +52 -0
- package/dist/tools/project-activities.js.map +1 -0
- package/dist/tools/project-backups.d.ts +2 -0
- package/dist/tools/project-backups.js +159 -0
- package/dist/tools/project-backups.js.map +1 -0
- package/dist/tools/project-databases.js +26 -2
- package/dist/tools/project-databases.js.map +1 -1
- package/dist/tools/project-services.js +136 -25
- package/dist/tools/project-services.js.map +1 -1
- package/dist/tools/projects.js +151 -5
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/scaling.js +401 -36
- package/dist/tools/scaling.js.map +1 -1
- package/dist/tools/webhooks.d.ts +2 -0
- package/dist/tools/webhooks.js +195 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/dist/types/models.d.ts +8 -1
- package/dist/types/tiers.js +5 -0
- package/dist/types/tiers.js.map +1 -1
- package/package.json +3 -2
package/dist/tools/scaling.js
CHANGED
|
@@ -18,11 +18,61 @@ import { session } from "../session.js";
|
|
|
18
18
|
*
|
|
19
19
|
* The body of POST/PATCH must be wrapped: `{ scaling_policy: { ... } }`. The
|
|
20
20
|
* outer `organization_pid` is required by the backend.
|
|
21
|
+
*
|
|
22
|
+
* CLUSTER-CASCADE CONTRACT (backend, Jul 2026). Storage auto-scale is no longer
|
|
23
|
+
* an absolute target:
|
|
24
|
+
* - `expand_storage` grows by DOUBLING on each fire, clamped to
|
|
25
|
+
* `details.cluster_max_storage_gb` and the volume type's own max. The old
|
|
26
|
+
* `details.new_size_gb` / `growth_step_gb` are rejected outright (422).
|
|
27
|
+
* - The threshold must sit in the 40-85 band and the operator may not be `<`;
|
|
28
|
+
* a rule can only attach to a data, non-replica node.
|
|
29
|
+
* - When a data node commits a new size the platform expands every live data
|
|
30
|
+
* peer to match (StorageCascadeFanoutService) - storage is billed per node.
|
|
31
|
+
* - Multi-instance targets (`cloud_instance_pids`) are start/stop only.
|
|
32
|
+
* - The backend requires the reactive fields on EVERY non-start/stop policy
|
|
33
|
+
* even when the trigger is a cron schedule, so scheduled rules get neutral
|
|
34
|
+
* defaults injected here; ScheduledScalingJob fires on cron alone.
|
|
35
|
+
*
|
|
36
|
+
* TIER POLICIES are a distinct shape sharing this endpoint. A policy becomes one
|
|
37
|
+
* when `scaling_action` is `resize_instance` AND `group_id` is set. It then
|
|
38
|
+
* triggers a whole-GROUP move along a capacity ladder instead of resizing one
|
|
39
|
+
* instance, and its fields change completely: `direction` plus paired cpu/memory
|
|
40
|
+
* thresholds and `window_minutes`, never `metric_name`/`threshold`. It also
|
|
41
|
+
* requires an enabled GroupCapacityConfig for (group_id, target_class) to already
|
|
42
|
+
* exist - see `create_capacity_config`. `schedule_type` is FORBIDDEN on one.
|
|
21
43
|
*/
|
|
22
44
|
function resolveOrgId(organization_id) {
|
|
23
45
|
return organization_id || session.getActiveOrgId();
|
|
24
46
|
}
|
|
25
47
|
const noOrgMessage = "No organization selected. Call `select_organization` first or pass an organization_id.";
|
|
48
|
+
/**
|
|
49
|
+
* Pre-flight for a tier policy. Everything here is enforced backend-side too; it
|
|
50
|
+
* is checked first so the model gets an actionable sentence instead of a bare 422.
|
|
51
|
+
*/
|
|
52
|
+
function validateTierPolicy(p) {
|
|
53
|
+
if (!p.target_class) {
|
|
54
|
+
return "A tier policy needs `target_class`: `data` for the data plane (the usual case) or `non_data` for ClickHouse keepers.";
|
|
55
|
+
}
|
|
56
|
+
if (!p.direction) {
|
|
57
|
+
return "A tier policy needs `direction`: `scale_up` or `scale_down`. Up and down are separate policies - create one now and the other in a second call.";
|
|
58
|
+
}
|
|
59
|
+
if (p.schedule_type) {
|
|
60
|
+
return "`schedule_type` is not allowed on a tier policy (the backend 422s it) - tier scaling is reactive only. Drop it and set the direction's CPU/memory thresholds and `window_minutes` instead.";
|
|
61
|
+
}
|
|
62
|
+
if (p.cloud_instance_pid || (p.cloud_instance_pids?.length ?? 0) > 0) {
|
|
63
|
+
return "A tier policy targets the GROUP, not an instance. Drop cloud_instance_pid / cloud_instance_pids - `group_id` is the target.";
|
|
64
|
+
}
|
|
65
|
+
if (p.details && Object.keys(p.details).length > 0) {
|
|
66
|
+
return "A tier policy takes no `details`. The capacity ladder decides the next machine size, so `target_instance_type` has no meaning here - remove it.";
|
|
67
|
+
}
|
|
68
|
+
if (p.direction === "scale_up" && (p.cpu_down_threshold !== undefined || p.memory_down_threshold !== undefined)) {
|
|
69
|
+
return "A `scale_up` policy carries `cpu_up_threshold` / `memory_up_threshold`. The down thresholds belong on the separate `scale_down` policy.";
|
|
70
|
+
}
|
|
71
|
+
if (p.direction === "scale_down" && (p.cpu_up_threshold !== undefined || p.memory_up_threshold !== undefined)) {
|
|
72
|
+
return "A `scale_down` policy carries `cpu_down_threshold` / `memory_down_threshold`. The up thresholds belong on the separate `scale_up` policy.";
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
26
76
|
const VOLUME_TYPES = ["gp2", "gp3", "io1", "io2", "st1", "sc1", "standard"];
|
|
27
77
|
const SCALING_ACTIONS = [
|
|
28
78
|
"start_instance",
|
|
@@ -37,11 +87,96 @@ const METRIC_NAMES = [
|
|
|
37
87
|
"cpu_usage_percent",
|
|
38
88
|
"memory_usage_percent",
|
|
39
89
|
"disk_usage_percent",
|
|
90
|
+
"disk_used_percent",
|
|
40
91
|
"manual_trigger",
|
|
41
92
|
];
|
|
42
93
|
const COMPARISON_OPERATORS = [">", "<", ">=", "<="];
|
|
94
|
+
/** Actions that skip the reactive-trigger fields entirely and may target many instances. */
|
|
95
|
+
const START_STOP_ACTIONS = new Set(["start_instance", "stop_instance"]);
|
|
96
|
+
/** Actions the backend refuses to attach to more than one instance. */
|
|
97
|
+
const SINGLE_TARGET_ACTIONS = new Set(["expand_storage", "resize_instance", "add_replica"]);
|
|
98
|
+
/** Backend threshold band for storage auto-scale (`validate_expand_threshold_band`). */
|
|
99
|
+
const EXPAND_THRESHOLD_MIN = 40;
|
|
100
|
+
const EXPAND_THRESHOLD_MAX = 85;
|
|
101
|
+
/**
|
|
102
|
+
* Neutral reactive fields injected into scheduled (cron-triggered) non-start/stop
|
|
103
|
+
* policies. The backend validates them on every such policy regardless of
|
|
104
|
+
* `schedule_type`; the scheduled job ignores them and fires on cron alone.
|
|
105
|
+
*/
|
|
106
|
+
const SCHEDULED_REACTIVE_DEFAULTS = {
|
|
107
|
+
metric_name: "manual_trigger",
|
|
108
|
+
threshold: EXPAND_THRESHOLD_MAX,
|
|
109
|
+
comparison_operator: ">",
|
|
110
|
+
duration_minutes: 1,
|
|
111
|
+
cooldown_minutes: 0,
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Action-specific `details` validation, mirroring `ScalingPolicy#validate_details_based_on_scaling_action`
|
|
115
|
+
* so a doomed policy fails here with an explanation instead of as a bare 422.
|
|
116
|
+
*/
|
|
117
|
+
function validateActionDetails(scalingAction, details) {
|
|
118
|
+
if (START_STOP_ACTIONS.has(scalingAction))
|
|
119
|
+
return null;
|
|
120
|
+
if (!details || Object.keys(details).length === 0) {
|
|
121
|
+
return `details is required for ${scalingAction} - the backend rejects a policy with empty details.`;
|
|
122
|
+
}
|
|
123
|
+
switch (scalingAction) {
|
|
124
|
+
case "expand_storage": {
|
|
125
|
+
if (details.new_size_gb !== undefined) {
|
|
126
|
+
return "details.new_size_gb is no longer accepted on expand_storage policies. Storage auto-scale now DOUBLES the volume on each fire, clamped to details.cluster_max_storage_gb - pass that ceiling instead. (One-off absolute resizes still go through `scale_instance`.)";
|
|
127
|
+
}
|
|
128
|
+
if (details.growth_step_gb !== undefined) {
|
|
129
|
+
return "details.growth_step_gb is not supported - growth is always a doubling until details.cluster_max_storage_gb is reached.";
|
|
130
|
+
}
|
|
131
|
+
const max = details.cluster_max_storage_gb;
|
|
132
|
+
if (max === undefined) {
|
|
133
|
+
return "details.cluster_max_storage_gb is required for expand_storage: the GiB ceiling the doubling stops at. It must exceed the volume's current size (and stay within the volume type's max).";
|
|
134
|
+
}
|
|
135
|
+
if (typeof max !== "number" || !Number.isInteger(max) || max <= 0) {
|
|
136
|
+
return "details.cluster_max_storage_gb must be a positive integer number of GiB.";
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
case "resize_instance":
|
|
141
|
+
if (!details.target_instance_type) {
|
|
142
|
+
return 'details.target_instance_type is required for resize_instance, e.g. details: { "target_instance_type": "t3.large" }.';
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
case "add_replica":
|
|
146
|
+
if (details.max_replicas === undefined) {
|
|
147
|
+
return 'details.max_replicas is required for add_replica, e.g. details: { "max_replicas": 2 }.';
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
default:
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Threshold band + operator rules the backend enforces on storage auto-scale. */
|
|
155
|
+
function validateExpandTrigger(scalingAction, threshold, comparisonOperator) {
|
|
156
|
+
if (scalingAction !== "expand_storage")
|
|
157
|
+
return null;
|
|
158
|
+
if (comparisonOperator === "<" || comparisonOperator === "<=") {
|
|
159
|
+
return `comparison_operator '${comparisonOperator}' is invalid for expand_storage - a disk-fill trigger only makes sense as '>' or '>='. (The backend rejects '<' outright.)`;
|
|
160
|
+
}
|
|
161
|
+
if (threshold !== undefined && (threshold < EXPAND_THRESHOLD_MIN || threshold > EXPAND_THRESHOLD_MAX)) {
|
|
162
|
+
return `threshold ${threshold} is outside the ${EXPAND_THRESHOLD_MIN}-${EXPAND_THRESHOLD_MAX} band the backend enforces for storage auto-scale.`;
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Scaling-policy writes still sit behind the backend's payment-channel gate
|
|
168
|
+
* (`require_paid_plan!` -> `chargeable_payment_channel?`), whose error copy
|
|
169
|
+
* predates the wallet migration and talks about "plans". Translate it.
|
|
170
|
+
*/
|
|
171
|
+
function explainPolicyError(action, statusCode, message) {
|
|
172
|
+
const base = `Failed to ${action} scaling policy (${statusCode}): ${message}`;
|
|
173
|
+
if (/free plan|upgrade to a paid plan/i.test(message)) {
|
|
174
|
+
return `${base}\n\nThis is the payment-method gate, not a plan: auto-scaling policies need a linked card on the org. Call \`link_billing_payment_method\` and open the returned URL, then retry. (SelfHost has no plans or tiers - the backend's wording is stale.)`;
|
|
175
|
+
}
|
|
176
|
+
return base;
|
|
177
|
+
}
|
|
43
178
|
export function registerScalingTools(server) {
|
|
44
|
-
server.tool("scale_instance", "Manual one-off resize of an instance - change instance type, volume type, size, IOPS, throughput. Only fields you pass are sent (PATCH-style). Response includes `scaling_event_id` you can poll on the instance status (`resizing` / `modifying_storage` → terminal state). Storage must grow, not shrink.", {
|
|
179
|
+
server.tool("scale_instance", "Manual one-off resize of an instance - change instance type, volume type, size, IOPS, throughput. Only fields you pass are sent (PATCH-style). Response includes `scaling_event_id` you can poll on the instance status (`resizing` / `modifying_storage` → terminal state). Storage must grow, not shrink.\n\nSTORAGE CASCADES: growing a data node's volume also expands every live data peer in its cluster to match, and storage bills per node - so on a multi-node cluster the cost of `new_size_gb` is multiplied by the number of data nodes. Tell the user before scaling a clustered instance. (Unlike an auto-scale rule, a manual scale takes an absolute size and ignores any cluster_max_storage_gb ceiling.)", {
|
|
45
180
|
instance_id: z.string().min(1),
|
|
46
181
|
target_instance_type: z.string().optional()
|
|
47
182
|
.describe("e.g. t3.medium, m6i.xlarge, r7g.4xlarge"),
|
|
@@ -93,7 +228,14 @@ export function registerScalingTools(server) {
|
|
|
93
228
|
],
|
|
94
229
|
};
|
|
95
230
|
});
|
|
96
|
-
server.tool("list_scaling_policies",
|
|
231
|
+
server.tool("list_scaling_policies", `List scaling policies, optionally filtered to one instance. Covers start/stop schedules, auto-scaling rules and cluster tier triggers; each row carries \`cloud_instance_pid\` so you can tell which instance it belongs to.
|
|
232
|
+
|
|
233
|
+
TELLING THE THREE APART matters, because they behave nothing alike:
|
|
234
|
+
- \`cloud_instance_pid\` set, \`group_id\` empty - an ordinary single-instance rule.
|
|
235
|
+
- \`group_id\` set with \`scaling_action: resize_instance\` - a CLUSTER TIER trigger. It moves the whole group along a capacity ladder and its thresholds are the \`cpu_*\`/\`memory_*\` pair plus \`window_minutes\`, not \`metric_name\`/\`threshold\`. Its bounds live on the group's capacity config (\`get_capacity_config\`), so this row alone does not tell you how far the group can move. Tier triggers come in pairs - one \`scale_up\`, one \`scale_down\` - and a group with only an up policy will grow and never shrink, which is worth pointing out.
|
|
236
|
+
- Filtering by instance will NOT return a group's tier policies, since they have no instance target. Use \`get_capacity_config\` for those.
|
|
237
|
+
|
|
238
|
+
An \`expand_storage\` policy whose \`details\` still has \`new_size_gb\` (instead of \`cluster_max_storage_gb\`) predates the cluster-cascade contract: it is outdated, cannot be edited or disabled (every save 422s), and must be deleted and recreated. Flag those to the user rather than trying to patch them.`, {
|
|
97
239
|
organization_id: z.string().optional()
|
|
98
240
|
.describe("Org PID; defaults to active org. Used as `organization_pid` on the wire."),
|
|
99
241
|
cloud_instance_pid: z.string().optional()
|
|
@@ -123,19 +265,49 @@ export function registerScalingTools(server) {
|
|
|
123
265
|
}
|
|
124
266
|
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
125
267
|
});
|
|
126
|
-
server.tool("create_scaling_policy",
|
|
268
|
+
server.tool("create_scaling_policy", `Create a scaling policy. Use this for both auto-start/stop schedules and reactive/scheduled auto-scaling rules. Shape depends on action + trigger:
|
|
269
|
+
|
|
270
|
+
• start/stop schedules → schedule_type=scheduled + scheduled_start_time OR scheduled_stop_time (HH:MM UTC) + days_of_week. These are the only policies that may target MANY instances (cloud_instance_pids).
|
|
271
|
+
• reactive auto-scale → schedule_type=reactive + metric_name + comparison_operator + threshold + duration_minutes + cooldown_minutes
|
|
272
|
+
• scheduled auto-scale → schedule_type=scheduled + cron_expression (5-field) + optional start_time/end_time (ISO 8601). The reactive fields are still required by the backend; neutral defaults are injected for you (manual_trigger / ${SCHEDULED_REACTIVE_DEFAULTS.threshold} / '>' / ${SCHEDULED_REACTIVE_DEFAULTS.duration_minutes}m / ${SCHEDULED_REACTIVE_DEFAULTS.cooldown_minutes} cooldown) and ignored at fire time.
|
|
273
|
+
|
|
274
|
+
Action-specific \`details\` (required on every non-start/stop policy):
|
|
275
|
+
• resize_instance → { target_instance_type }
|
|
276
|
+
• add_replica → { max_replicas }
|
|
277
|
+
• expand_storage → { cluster_max_storage_gb }
|
|
278
|
+
|
|
279
|
+
STORAGE AUTO-SCALE (expand_storage) - read before writing one:
|
|
280
|
+
- Growth is a DOUBLING on each fire, clamped to cluster_max_storage_gb and the volume type's own max: target = min(current x 2, cluster_max, type_max). There is no absolute-size or step option; details.new_size_gb and details.growth_step_gb are rejected (422). For a one-off absolute resize use \`scale_instance\`.
|
|
281
|
+
- cluster_max_storage_gb must EXCEED the volume's current size.
|
|
282
|
+
- threshold must be between ${EXPAND_THRESHOLD_MIN} and ${EXPAND_THRESHOLD_MAX}, and the operator must be '>' or '>=' (disk metrics: disk_used_percent / disk_usage_percent).
|
|
283
|
+
- The rule may only attach to a DATA, non-replica node (ClickHouse keeper-only nodes are not data nodes).
|
|
284
|
+
- Expansion CASCADES: when the volume commits, every live data peer in the cluster is expanded to match, and storage bills per node. Warn the user about the multiplied cost on a multi-node cluster.
|
|
285
|
+
|
|
286
|
+
TIER POLICIES (whole-cluster ladder scaling) are a FOURTH shape and none of the above applies to them. A policy is a tier policy when \`scaling_action\` is \`resize_instance\` AND \`group_id\` is set:
|
|
287
|
+
- Required: \`group_id\`, \`target_class\`, \`direction\` (\`scale_up\` or \`scale_down\`), and \`window_minutes\`.
|
|
288
|
+
- Thresholds are the direction's CPU **and** memory pair - \`cpu_up_threshold\` + \`memory_up_threshold\` for up, \`cpu_down_threshold\` + \`memory_down_threshold\` for down. NOT \`metric_name\` / \`threshold\` / \`comparison_operator\`, which are ignored.
|
|
289
|
+
- \`schedule_type\` is FORBIDDEN (422). Tier scaling is reactive only.
|
|
290
|
+
- \`details.target_instance_type\` is NOT used - the ladder decides the next size.
|
|
291
|
+
- ONE POLICY PER DIRECTION. Scaling up and scaling down are two separate rules against the same group.
|
|
292
|
+
- An enabled capacity config for (\`group_id\`, \`target_class\`) must ALREADY EXIST or this is refused. Create it with \`create_capacity_config\` first.
|
|
293
|
+
- HYSTERESIS IS ENFORCED across the pair: a scale_down threshold must be strictly below its scale_up sibling, on both CPU and memory. Equal values are rejected, because they would let the cluster oscillate.
|
|
294
|
+
- Server defaults if omitted: 80/80 up, 20/20 down, \`window_minutes\` 10 up and 360 down, cooldown 30. The long scale-down window is intentional - a quiet afternoon should not shrink a production cluster.
|
|
295
|
+
- Use this instead of a plain \`resize_instance\` rule for any clustered engine: a single-node switchover fired at a multi-node cluster desyncs its tier state.`, {
|
|
127
296
|
organization_id: z.string().optional()
|
|
128
297
|
.describe("Org PID; defaults to active org. Wire field: organization_pid"),
|
|
129
|
-
cloud_instance_pid: z.string().min(1)
|
|
130
|
-
.describe("Target instance PID"),
|
|
298
|
+
cloud_instance_pid: z.string().min(1).optional()
|
|
299
|
+
.describe("Target instance PID. Required for every action except bulk start/stop schedules, which may use cloud_instance_pids instead."),
|
|
300
|
+
cloud_instance_pids: z.array(z.string().min(1)).min(1).optional()
|
|
301
|
+
.describe("Multiple target instances - ONLY valid for start_instance / stop_instance schedules. The backend rejects it for expand_storage / resize_instance / add_replica."),
|
|
131
302
|
scaling_action: z.enum(SCALING_ACTIONS),
|
|
132
303
|
schedule_type: z.enum(SCHEDULE_TYPES),
|
|
133
304
|
enabled: z.boolean().default(true),
|
|
134
305
|
// Reactive trigger
|
|
135
|
-
metric_name: z.enum(METRIC_NAMES).optional()
|
|
306
|
+
metric_name: z.enum(METRIC_NAMES).optional()
|
|
307
|
+
.describe("Metric to watch. Disk fill reports as disk_used_percent (also accepted: disk_usage_percent)."),
|
|
136
308
|
comparison_operator: z.enum(COMPARISON_OPERATORS).optional(),
|
|
137
309
|
threshold: z.number().optional()
|
|
138
|
-
.describe(
|
|
310
|
+
.describe(`0-100 for percentage metrics. expand_storage is restricted to ${EXPAND_THRESHOLD_MIN}-${EXPAND_THRESHOLD_MAX}.`),
|
|
139
311
|
duration_minutes: z.number().int().min(1).optional(),
|
|
140
312
|
cooldown_minutes: z.number().int().min(0).optional(),
|
|
141
313
|
// Scheduled / start-stop trigger
|
|
@@ -152,30 +324,185 @@ export function registerScalingTools(server) {
|
|
|
152
324
|
days_of_week: z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"])).optional(),
|
|
153
325
|
timezone: z.string().optional().describe("Default UTC; BE supports UTC | EST | PST | GMT | CET"),
|
|
154
326
|
// Action-specific details
|
|
327
|
+
// ── Tier-policy fields (group-wide ladder scaling) ──────────────────
|
|
328
|
+
group_id: z.string().optional()
|
|
329
|
+
.describe("TIER POLICY: the instance group to scale as a whole. Setting this with scaling_action `resize_instance` makes this a tier policy, not a single-instance resize. Requires an enabled capacity config for (group_id, target_class)."),
|
|
330
|
+
target_class: z.enum(["data", "non_data"]).optional()
|
|
331
|
+
.describe("TIER POLICY: which plane this trigger governs. `data` is the normal choice; `non_data` is ClickHouse keepers."),
|
|
332
|
+
direction: z.enum(["scale_up", "scale_down"]).optional()
|
|
333
|
+
.describe("TIER POLICY: required. One policy per direction - up and down are separate rules, not one rule with two thresholds."),
|
|
334
|
+
cpu_up_threshold: z.number().int().min(1).max(99).optional()
|
|
335
|
+
.describe("TIER POLICY (scale_up): CPU percent that must be exceeded. Defaults to 80."),
|
|
336
|
+
memory_up_threshold: z.number().int().min(1).max(99).optional()
|
|
337
|
+
.describe("TIER POLICY (scale_up): memory percent that must be exceeded. Defaults to 80. Both CPU and memory apply."),
|
|
338
|
+
cpu_down_threshold: z.number().int().min(1).max(99).optional()
|
|
339
|
+
.describe("TIER POLICY (scale_down): CPU percent to fall below. Defaults to 20. Must be strictly BELOW the sibling scale_up threshold."),
|
|
340
|
+
memory_down_threshold: z.number().int().min(1).max(99).optional()
|
|
341
|
+
.describe("TIER POLICY (scale_down): memory percent to fall below. Defaults to 20. Must be strictly BELOW the sibling scale_up threshold."),
|
|
342
|
+
window_minutes: z.number().int().min(1).optional()
|
|
343
|
+
.describe("TIER POLICY: how long the condition must hold. Defaults to 10 for scale_up, 360 for scale_down - the asymmetry is deliberate, so a lull does not shrink a cluster."),
|
|
155
344
|
details: z.record(z.unknown()).optional()
|
|
156
|
-
.describe("Action-specific payload: { target_instance_type } | {
|
|
345
|
+
.describe("Action-specific payload: { target_instance_type } | { cluster_max_storage_gb } | { max_replicas }. Required for every action except start_instance / stop_instance."),
|
|
157
346
|
}, async (params) => {
|
|
158
347
|
const orgId = resolveOrgId(params.organization_id);
|
|
159
348
|
if (!orgId) {
|
|
160
349
|
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
161
350
|
}
|
|
351
|
+
const action = params.scaling_action;
|
|
352
|
+
const isStartStop = START_STOP_ACTIONS.has(action);
|
|
353
|
+
const targets = params.cloud_instance_pids ?? [];
|
|
354
|
+
// ── Tier policy: a whole-group ladder move, not a single-instance resize.
|
|
355
|
+
// Handled first and returned from, because every check below assumes an
|
|
356
|
+
// instance target and an action `details` payload, and a tier policy has
|
|
357
|
+
// neither - the group is the target and the ladder picks the size.
|
|
358
|
+
const isTierPolicy = action === "resize_instance" && !!params.group_id;
|
|
359
|
+
if (isTierPolicy) {
|
|
360
|
+
const tierError = validateTierPolicy(params);
|
|
361
|
+
if (tierError) {
|
|
362
|
+
return { content: [{ type: "text", text: tierError }] };
|
|
363
|
+
}
|
|
364
|
+
const tierFields = {
|
|
365
|
+
organization_pid: orgId,
|
|
366
|
+
scaling_action: action,
|
|
367
|
+
group_id: params.group_id,
|
|
368
|
+
target_class: params.target_class,
|
|
369
|
+
direction: params.direction,
|
|
370
|
+
enabled: params.enabled,
|
|
371
|
+
};
|
|
372
|
+
if (params.window_minutes !== undefined)
|
|
373
|
+
tierFields.window_minutes = params.window_minutes;
|
|
374
|
+
if (params.cooldown_minutes !== undefined)
|
|
375
|
+
tierFields.cooldown_minutes = params.cooldown_minutes;
|
|
376
|
+
if (params.direction === "scale_up") {
|
|
377
|
+
if (params.cpu_up_threshold !== undefined)
|
|
378
|
+
tierFields.cpu_up_threshold = params.cpu_up_threshold;
|
|
379
|
+
if (params.memory_up_threshold !== undefined)
|
|
380
|
+
tierFields.memory_up_threshold = params.memory_up_threshold;
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
if (params.cpu_down_threshold !== undefined)
|
|
384
|
+
tierFields.cpu_down_threshold = params.cpu_down_threshold;
|
|
385
|
+
if (params.memory_down_threshold !== undefined)
|
|
386
|
+
tierFields.memory_down_threshold = params.memory_down_threshold;
|
|
387
|
+
}
|
|
388
|
+
const tierResult = await apiRequest("/scaling_policies", {
|
|
389
|
+
method: "POST",
|
|
390
|
+
body: { scaling_policy: tierFields },
|
|
391
|
+
toolName: "create_scaling_policy",
|
|
392
|
+
skipOrgInjection: true,
|
|
393
|
+
});
|
|
394
|
+
if (!tierResult.success) {
|
|
395
|
+
return { content: [{ type: "text", text: explainPolicyError("create", tierResult.statusCode, tierResult.message) }] };
|
|
396
|
+
}
|
|
397
|
+
const dir = params.direction === "scale_up" ? "up" : "down";
|
|
398
|
+
const win = params.window_minutes ?? (params.direction === "scale_up" ? 10 : 360);
|
|
399
|
+
return {
|
|
400
|
+
content: [
|
|
401
|
+
{
|
|
402
|
+
type: "text",
|
|
403
|
+
text: `Tier ${dir}-scaling trigger created for group ${params.group_id} (${params.target_class}). It fires when BOTH CPU and memory stay past their thresholds for ${win} minutes, and the capacity config's bounds decide how far the group may move. Watch a move with \`get_capacity_config\`.${params.direction === "scale_up" ? " Add a matching scale_down policy separately if the group should shrink again." : ""}`,
|
|
404
|
+
},
|
|
405
|
+
{ type: "text", text: JSON.stringify(tierResult.data, null, 2) },
|
|
406
|
+
],
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
// Target shape. Only start/stop fan out; everything else is single-instance
|
|
410
|
+
// (the backend enforces this for expand/resize/add_replica in
|
|
411
|
+
// `validate_multi_target_restrictions`).
|
|
412
|
+
if (targets.length > 0 && !isStartStop) {
|
|
413
|
+
const why = SINGLE_TARGET_ACTIONS.has(action)
|
|
414
|
+
? `the backend rejects multi-instance targets for ${action}`
|
|
415
|
+
: "only start_instance / stop_instance schedules fan out";
|
|
416
|
+
return {
|
|
417
|
+
content: [{
|
|
418
|
+
type: "text",
|
|
419
|
+
text: `cloud_instance_pids is not allowed here - ${why}. Pass a single cloud_instance_pid instead.`,
|
|
420
|
+
}],
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
if (!params.cloud_instance_pid && targets.length === 0) {
|
|
424
|
+
return {
|
|
425
|
+
content: [{
|
|
426
|
+
type: "text",
|
|
427
|
+
text: "No target instance. Pass cloud_instance_pid (any action), or cloud_instance_pids for a bulk start/stop schedule.",
|
|
428
|
+
}],
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
if (new Set(targets).size !== targets.length) {
|
|
432
|
+
return { content: [{ type: "text", text: "cloud_instance_pids contains duplicates - the backend rejects those." }] };
|
|
433
|
+
}
|
|
434
|
+
const detailsError = validateActionDetails(action, params.details);
|
|
435
|
+
if (detailsError) {
|
|
436
|
+
return { content: [{ type: "text", text: detailsError }] };
|
|
437
|
+
}
|
|
438
|
+
// Scheduled non-start/stop rules still need the reactive fields on the wire.
|
|
439
|
+
const scheduledNonStartStop = params.schedule_type === "scheduled" && !isStartStop;
|
|
440
|
+
const trigger = {
|
|
441
|
+
metric_name: params.metric_name ?? (scheduledNonStartStop ? SCHEDULED_REACTIVE_DEFAULTS.metric_name : undefined),
|
|
442
|
+
comparison_operator: params.comparison_operator ?? (scheduledNonStartStop ? SCHEDULED_REACTIVE_DEFAULTS.comparison_operator : undefined),
|
|
443
|
+
threshold: params.threshold ?? (scheduledNonStartStop ? SCHEDULED_REACTIVE_DEFAULTS.threshold : undefined),
|
|
444
|
+
duration_minutes: params.duration_minutes ?? (scheduledNonStartStop ? SCHEDULED_REACTIVE_DEFAULTS.duration_minutes : undefined),
|
|
445
|
+
cooldown_minutes: params.cooldown_minutes ?? (scheduledNonStartStop ? SCHEDULED_REACTIVE_DEFAULTS.cooldown_minutes : undefined),
|
|
446
|
+
};
|
|
447
|
+
// `manual_scale` skips the numeric trigger but the backend still demands a metric name.
|
|
448
|
+
if (action === "manual_scale") {
|
|
449
|
+
trigger.metric_name ??= SCHEDULED_REACTIVE_DEFAULTS.metric_name;
|
|
450
|
+
}
|
|
451
|
+
else if (!isStartStop) {
|
|
452
|
+
// Everything else needs the whole reactive trigger, whatever the schedule type.
|
|
453
|
+
const missing = Object.entries({
|
|
454
|
+
metric_name: trigger.metric_name,
|
|
455
|
+
comparison_operator: trigger.comparison_operator,
|
|
456
|
+
threshold: trigger.threshold,
|
|
457
|
+
duration_minutes: trigger.duration_minutes,
|
|
458
|
+
cooldown_minutes: trigger.cooldown_minutes,
|
|
459
|
+
})
|
|
460
|
+
.filter(([, v]) => v === undefined)
|
|
461
|
+
.map(([k]) => k);
|
|
462
|
+
if (missing.length > 0) {
|
|
463
|
+
return {
|
|
464
|
+
content: [{
|
|
465
|
+
type: "text",
|
|
466
|
+
text: `Missing required trigger field(s) for ${action}: ${missing.join(", ")}. The backend validates the reactive trigger on every non-start/stop policy.`,
|
|
467
|
+
}],
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
// Start/stop schedules carry their own required shape.
|
|
472
|
+
if (isStartStop) {
|
|
473
|
+
const timeField = action === "start_instance" ? "scheduled_start_time" : "scheduled_stop_time";
|
|
474
|
+
const timeValue = action === "start_instance" ? params.scheduled_start_time : params.scheduled_stop_time;
|
|
475
|
+
if (!timeValue) {
|
|
476
|
+
return { content: [{ type: "text", text: `${timeField} (HH:MM UTC) is required for ${action}.` }] };
|
|
477
|
+
}
|
|
478
|
+
if (!params.days_of_week?.length) {
|
|
479
|
+
return { content: [{ type: "text", text: `days_of_week must list at least one day for ${action}.` }] };
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
const expandError = validateExpandTrigger(action, trigger.threshold, trigger.comparison_operator);
|
|
483
|
+
if (expandError) {
|
|
484
|
+
return { content: [{ type: "text", text: expandError }] };
|
|
485
|
+
}
|
|
162
486
|
const fields = {
|
|
163
487
|
organization_pid: orgId,
|
|
164
|
-
|
|
165
|
-
scaling_action: params.scaling_action,
|
|
488
|
+
scaling_action: action,
|
|
166
489
|
schedule_type: params.schedule_type,
|
|
167
490
|
enabled: params.enabled,
|
|
168
491
|
};
|
|
169
|
-
if (params.
|
|
170
|
-
fields.
|
|
171
|
-
if (
|
|
172
|
-
fields.
|
|
173
|
-
if (
|
|
174
|
-
fields.
|
|
175
|
-
if (
|
|
176
|
-
fields.
|
|
177
|
-
if (
|
|
178
|
-
fields.
|
|
492
|
+
if (params.cloud_instance_pid)
|
|
493
|
+
fields.cloud_instance_pid = params.cloud_instance_pid;
|
|
494
|
+
if (targets.length > 0)
|
|
495
|
+
fields.cloud_instance_pids = targets;
|
|
496
|
+
if (trigger.metric_name)
|
|
497
|
+
fields.metric_name = trigger.metric_name;
|
|
498
|
+
if (trigger.comparison_operator)
|
|
499
|
+
fields.comparison_operator = trigger.comparison_operator;
|
|
500
|
+
if (trigger.threshold !== undefined)
|
|
501
|
+
fields.threshold = trigger.threshold;
|
|
502
|
+
if (trigger.duration_minutes !== undefined)
|
|
503
|
+
fields.duration_minutes = trigger.duration_minutes;
|
|
504
|
+
if (trigger.cooldown_minutes !== undefined)
|
|
505
|
+
fields.cooldown_minutes = trigger.cooldown_minutes;
|
|
179
506
|
if (params.cron_expression)
|
|
180
507
|
fields.cron_expression = params.cron_expression;
|
|
181
508
|
if (params.start_time)
|
|
@@ -200,21 +527,39 @@ export function registerScalingTools(server) {
|
|
|
200
527
|
});
|
|
201
528
|
if (!result.success) {
|
|
202
529
|
return {
|
|
203
|
-
content: [{
|
|
204
|
-
type: "text",
|
|
205
|
-
text: `Failed to create scaling policy (${result.statusCode}): ${result.message}`,
|
|
206
|
-
}],
|
|
530
|
+
content: [{ type: "text", text: explainPolicyError("create", result.statusCode, result.message) }],
|
|
207
531
|
};
|
|
208
532
|
}
|
|
533
|
+
const notes = ["Scaling policy created."];
|
|
534
|
+
if (scheduledNonStartStop && (!params.metric_name || params.threshold === undefined)) {
|
|
535
|
+
notes.push(`Neutral reactive defaults were filled in (${SCHEDULED_REACTIVE_DEFAULTS.metric_name} / ${SCHEDULED_REACTIVE_DEFAULTS.threshold} / '${SCHEDULED_REACTIVE_DEFAULTS.comparison_operator}') because the backend requires them on every non-start/stop policy. The rule fires on the cron schedule alone.`);
|
|
536
|
+
}
|
|
537
|
+
if (action === "expand_storage") {
|
|
538
|
+
const ceiling = params.details?.cluster_max_storage_gb;
|
|
539
|
+
notes.push(`Storage will DOUBLE on each fire up to ${ceiling} GiB, then stop. Every live data peer in the cluster is expanded to match, and storage bills per node.`);
|
|
540
|
+
}
|
|
209
541
|
return {
|
|
210
542
|
content: [
|
|
211
|
-
{ type: "text", text:
|
|
543
|
+
{ type: "text", text: notes.join("\n\n") },
|
|
212
544
|
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
213
545
|
],
|
|
214
546
|
};
|
|
215
547
|
});
|
|
216
|
-
server.tool("update_scaling_policy",
|
|
548
|
+
server.tool("update_scaling_policy", `Update an existing scaling policy. Only the fields you pass are changed - but note the backend re-validates the WHOLE policy, so a rule written under the old storage contract cannot be edited.
|
|
549
|
+
|
|
550
|
+
LEGACY expand_storage RULES: policies still carrying details.new_size_gb are outdated and every save 422s. There is no in-place migration - delete the rule and create a fresh one with details.cluster_max_storage_gb. Disabling one also fails; only \`delete_scaling_policy\` works.
|
|
551
|
+
|
|
552
|
+
Pass scaling_action when you know it so the storage-specific rules (${EXPAND_THRESHOLD_MIN}-${EXPAND_THRESHOLD_MAX} threshold band, '>' / '>=' only, doubling ceiling) can be checked before the request goes out.`, {
|
|
217
553
|
policy_id: z.string().min(1).describe("Scaling policy PID"),
|
|
554
|
+
direction: z.enum(["scale_up", "scale_down"]).optional()
|
|
555
|
+
.describe("TIER POLICY only. Changing direction rewrites which threshold pair applies - normally leave alone."),
|
|
556
|
+
cpu_up_threshold: z.number().int().min(1).max(99).optional().describe("TIER POLICY (scale_up). Must stay above the sibling scale_down value."),
|
|
557
|
+
memory_up_threshold: z.number().int().min(1).max(99).optional().describe("TIER POLICY (scale_up). Must stay above the sibling scale_down value."),
|
|
558
|
+
cpu_down_threshold: z.number().int().min(1).max(99).optional().describe("TIER POLICY (scale_down). Must stay below the sibling scale_up value."),
|
|
559
|
+
memory_down_threshold: z.number().int().min(1).max(99).optional().describe("TIER POLICY (scale_down). Must stay below the sibling scale_up value."),
|
|
560
|
+
window_minutes: z.number().int().min(1).optional().describe("TIER POLICY: how long the condition must hold before firing."),
|
|
561
|
+
scaling_action: z.enum(SCALING_ACTIONS).optional()
|
|
562
|
+
.describe("The policy's action, from `list_scaling_policies`. Not sent as a change - used to validate the fields below against the right rules."),
|
|
218
563
|
enabled: z.boolean().optional(),
|
|
219
564
|
metric_name: z.enum(METRIC_NAMES).optional(),
|
|
220
565
|
comparison_operator: z.enum(COMPARISON_OPERATORS).optional(),
|
|
@@ -228,8 +573,31 @@ export function registerScalingTools(server) {
|
|
|
228
573
|
scheduled_stop_time: z.string().optional(),
|
|
229
574
|
days_of_week: z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"])).optional(),
|
|
230
575
|
timezone: z.string().optional(),
|
|
231
|
-
details: z.record(z.unknown()).optional()
|
|
232
|
-
|
|
576
|
+
details: z.record(z.unknown()).optional()
|
|
577
|
+
.describe("Replacement action payload: { target_instance_type } | { cluster_max_storage_gb } | { max_replicas }."),
|
|
578
|
+
}, async ({ policy_id, scaling_action, ...rest }) => {
|
|
579
|
+
// These keys are rejected on the only action that ever accepted them, so
|
|
580
|
+
// they can only be a leftover from the pre-cascade contract.
|
|
581
|
+
if (rest.details?.new_size_gb !== undefined || rest.details?.growth_step_gb !== undefined) {
|
|
582
|
+
return {
|
|
583
|
+
content: [{
|
|
584
|
+
type: "text",
|
|
585
|
+
text: "details.new_size_gb / details.growth_step_gb belong to the retired storage contract and are rejected by the backend. Storage auto-scale doubles the volume up to details.cluster_max_storage_gb; for a one-off absolute resize use `scale_instance`.",
|
|
586
|
+
}],
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
if (scaling_action) {
|
|
590
|
+
const expandError = validateExpandTrigger(scaling_action, rest.threshold, rest.comparison_operator);
|
|
591
|
+
if (expandError) {
|
|
592
|
+
return { content: [{ type: "text", text: expandError }] };
|
|
593
|
+
}
|
|
594
|
+
if (rest.details) {
|
|
595
|
+
const detailsError = validateActionDetails(scaling_action, rest.details);
|
|
596
|
+
if (detailsError) {
|
|
597
|
+
return { content: [{ type: "text", text: detailsError }] };
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
233
601
|
const fields = {};
|
|
234
602
|
for (const [k, v] of Object.entries(rest)) {
|
|
235
603
|
if (v !== undefined)
|
|
@@ -250,11 +618,11 @@ export function registerScalingTools(server) {
|
|
|
250
618
|
skipOrgInjection: true,
|
|
251
619
|
});
|
|
252
620
|
if (!result.success) {
|
|
621
|
+
const hint = /new_size_gb|cluster_max_storage_gb/i.test(result.message)
|
|
622
|
+
? "\n\nThis rule predates the cluster-cascade storage contract. Delete it and create a replacement with details.cluster_max_storage_gb."
|
|
623
|
+
: "";
|
|
253
624
|
return {
|
|
254
|
-
content: [{
|
|
255
|
-
type: "text",
|
|
256
|
-
text: `Failed to update scaling policy (${result.statusCode}): ${result.message}`,
|
|
257
|
-
}],
|
|
625
|
+
content: [{ type: "text", text: explainPolicyError("update", result.statusCode, result.message) + hint }],
|
|
258
626
|
};
|
|
259
627
|
}
|
|
260
628
|
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
@@ -278,10 +646,7 @@ export function registerScalingTools(server) {
|
|
|
278
646
|
});
|
|
279
647
|
if (!result.success) {
|
|
280
648
|
return {
|
|
281
|
-
content: [{
|
|
282
|
-
type: "text",
|
|
283
|
-
text: `Failed to delete scaling policy (${result.statusCode}): ${result.message}`,
|
|
284
|
-
}],
|
|
649
|
+
content: [{ type: "text", text: explainPolicyError("delete", result.statusCode, result.message) }],
|
|
285
650
|
};
|
|
286
651
|
}
|
|
287
652
|
return { content: [{ type: "text", text: "Scaling policy deleted." }] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaling.js","sourceRoot":"","sources":["../../src/tools/scaling.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scaling.js","sourceRoot":"","sources":["../../src/tools/scaling.ts"],"names":[],"mappings":"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"}
|