@selfhost.dev/mcp-server 0.9.0 → 0.10.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 +205 -43
- package/dist/client.d.ts +7 -0
- package/dist/client.js +2 -1
- package/dist/client.js.map +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/alerts.js +12 -2
- package/dist/tools/alerts.js.map +1 -1
- package/dist/tools/backups.js +29 -5
- package/dist/tools/backups.js.map +1 -1
- package/dist/tools/billing.js +233 -39
- package/dist/tools/billing.js.map +1 -1
- package/dist/tools/database-users.js +53 -6
- package/dist/tools/database-users.js.map +1 -1
- package/dist/tools/deployments.js +47 -3
- package/dist/tools/deployments.js.map +1 -1
- package/dist/tools/github.js +21 -4
- package/dist/tools/github.js.map +1 -1
- package/dist/tools/instance-logs.js +2 -2
- package/dist/tools/instance-logs.js.map +1 -1
- package/dist/tools/instances.js +423 -88
- package/dist/tools/instances.js.map +1 -1
- package/dist/tools/organizations.js +5 -1
- package/dist/tools/organizations.js.map +1 -1
- package/dist/tools/pitr.d.ts +22 -0
- package/dist/tools/pitr.js +75 -10
- package/dist/tools/pitr.js.map +1 -1
- package/dist/tools/postgres-extensions.js +176 -57
- package/dist/tools/postgres-extensions.js.map +1 -1
- package/dist/tools/project-backups.js +130 -0
- package/dist/tools/project-backups.js.map +1 -1
- package/dist/tools/project-databases.js +16 -23
- package/dist/tools/project-databases.js.map +1 -1
- package/dist/tools/project-services.js +544 -53
- package/dist/tools/project-services.js.map +1 -1
- package/dist/tools/project-ssh.d.ts +2 -0
- package/dist/tools/project-ssh.js +338 -0
- package/dist/tools/project-ssh.js.map +1 -0
- package/dist/tools/projects.js +21 -3
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/scaling.js +1 -1
- package/dist/tools/scaling.js.map +1 -1
- package/dist/types/tiers.js +27 -4
- package/dist/types/tiers.js.map +1 -1
- package/package.json +2 -1
package/dist/tools/billing.js
CHANGED
|
@@ -9,17 +9,30 @@ import { session } from "../session.js";
|
|
|
9
9
|
* - GET /organizations/:pid/billing/skus - priced resource catalog
|
|
10
10
|
* - GET /organizations/:pid/billing/ledger - credit lots (topup/free/usage)
|
|
11
11
|
* - GET /organizations/:pid/billing/transactions - per-resource hourly charges
|
|
12
|
-
* - POST /organizations/:pid/billing/topup - buy credit
|
|
13
|
-
* -
|
|
12
|
+
* - POST /organizations/:pid/billing/topup - buy credit (optionally saving the card)
|
|
13
|
+
* - DELETE /organizations/:pid/billing/link - unlink the saved payment method
|
|
14
14
|
* - PATCH /organizations/:pid/billing/contact - update contact / tax info
|
|
15
|
+
* - GET/POST/PATCH /organizations/:pid/billing/auto_recharge - top up automatically
|
|
16
|
+
* - POST /organizations/:pid/billing/auto_recharge/{enable,disable}
|
|
15
17
|
*
|
|
16
18
|
* The org PID is taken from the MCP session by default; pass `organization_id`
|
|
17
19
|
* to target a different org.
|
|
18
20
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* THERE IS NO SEPARATE "LINK A CARD" CALL ANY MORE. `POST billing/link` was
|
|
22
|
+
* removed backend-side; a card is saved by passing `save_card: true` on a real
|
|
23
|
+
* top-up, and reused afterwards with `use_saved_card: true`. The MCP shipped a
|
|
24
|
+
* `link_billing_payment_method` tool against that route until v0.9.1, and it
|
|
25
|
+
* had been 404ing - do not reintroduce it. `DELETE billing/link` survives as
|
|
26
|
+
* the un-link.
|
|
27
|
+
*
|
|
28
|
+
* Paying still happens in a browser (Razorpay Standard Checkout, in-page since
|
|
29
|
+
* 2026-08-25 - no longer a hosted payment link). `create_topup` returns the
|
|
30
|
+
* order to check out plus a `payment_url` fallback; it cannot complete the
|
|
31
|
+
* payment from here, and `POST billing/topup/complete` is deliberately not a
|
|
32
|
+
* tool because it needs a `razorpay_signature` only the browser holds. The one
|
|
33
|
+
* exception is `use_saved_card`, which charges off-session and needs no
|
|
34
|
+
* browser at all. There are no plans or tiers - credit is consumed per usage
|
|
35
|
+
* and gated by wallet balance.
|
|
23
36
|
*/
|
|
24
37
|
function resolveOrgId(organization_id) {
|
|
25
38
|
return organization_id || session.getActiveOrgId();
|
|
@@ -118,21 +131,62 @@ CHECK \`expiring_soon\` AND SAY SO UNPROMPTED. Some credit has an expiry date, s
|
|
|
118
131
|
}
|
|
119
132
|
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
120
133
|
});
|
|
121
|
-
server.tool("create_topup",
|
|
134
|
+
server.tool("create_topup", `Buy wallet credit. Amount is in cents: min $5 = 500, max $500 = 50000.
|
|
135
|
+
|
|
136
|
+
THREE DIFFERENT FLOWS, and which one you get decides whether a browser is needed:
|
|
137
|
+
- **Default** (no flags) - returns a \`checkout\` payload for Razorpay Standard Checkout plus a \`payment_url\` fallback. The user pays in a browser; the MCP cannot. The wallet is credited when Razorpay's webhook confirms, so poll \`get_wallet_balance\` afterwards rather than trusting the response.
|
|
138
|
+
- **\`save_card: true\`** - same browser checkout, but the card is stored for later one-tap and auto-recharge. This is the ONLY way to save a card: the old \`POST billing/link\` endpoint is gone. \`billing_contact_phone\` becomes REQUIRED (hard gate - a missing phone blocks the whole top-up, it does not silently fall back).
|
|
139
|
+
- **\`use_saved_card: true\`** - charges the already-saved card off-session. No browser, no URL. Returns status \`completed\`, or \`pending_confirmation\` (HTTP 202) when the bank wants a challenge, in which case the payment finishes by itself and you just poll the balance.
|
|
140
|
+
|
|
141
|
+
Errors worth relaying verbatim: \`use_saved_card\` with nothing saved refuses ("No saved card is linked"), and a card carries a per-charge mandate limit the top-up may not exceed - the message names the limit. Both are 422, not a reason to retry.
|
|
142
|
+
|
|
143
|
+
PASS \`idempotency_key\` ON EVERY RETRY. This spends real money. The key scopes to user + org + key + a fingerprint of the amount and card flags, so re-sending the same key with the same amount replays the first result instead of charging twice; re-using it with a DIFFERENT amount is correctly treated as a new top-up. Without a key, a blind retry after a timeout is a second real charge.`, {
|
|
122
144
|
organization_id: z.string().optional()
|
|
123
145
|
.describe("Org PID (defaults to active org)"),
|
|
124
146
|
amount_cents: z.number().int().min(500).max(50000)
|
|
125
147
|
.describe("Top-up amount in cents (500 = \$5 … 50000 = \$500)"),
|
|
126
|
-
|
|
148
|
+
save_card: z.boolean().optional()
|
|
149
|
+
.describe("Save this card for one-tap top-ups and auto-recharge. Requires billing_contact_phone."),
|
|
150
|
+
use_saved_card: z.boolean().optional()
|
|
151
|
+
.describe("Charge the already-saved card off-session - no browser. Mutually exclusive with save_card."),
|
|
152
|
+
billing_contact_phone: z.string().optional()
|
|
153
|
+
.describe("E.164 preferred (+14155551234). REQUIRED when save_card is true; optional otherwise."),
|
|
154
|
+
idempotency_key: z.string().min(1).optional()
|
|
155
|
+
.describe("Send the SAME key when retrying a top-up you are unsure landed, so it replays instead of charging twice."),
|
|
156
|
+
}, async ({ organization_id, amount_cents, save_card, use_saved_card, billing_contact_phone, idempotency_key }) => {
|
|
127
157
|
const orgId = resolveOrgId(organization_id);
|
|
128
158
|
if (!orgId) {
|
|
129
159
|
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
130
160
|
}
|
|
161
|
+
if (save_card && use_saved_card) {
|
|
162
|
+
return {
|
|
163
|
+
content: [{
|
|
164
|
+
type: "text",
|
|
165
|
+
text: "save_card and use_saved_card are mutually exclusive: save_card stores a NEW card during a browser checkout, use_saved_card charges the one already stored. Pick one.",
|
|
166
|
+
}],
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (save_card && !billing_contact_phone) {
|
|
170
|
+
return {
|
|
171
|
+
content: [{
|
|
172
|
+
type: "text",
|
|
173
|
+
text: "billing_contact_phone is required when save_card is true - the backend hard-gates on it, so the top-up would be rejected outright rather than proceeding without a saved card.",
|
|
174
|
+
}],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const body = { amount_cents };
|
|
178
|
+
if (save_card)
|
|
179
|
+
body.save_card = true;
|
|
180
|
+
if (use_saved_card)
|
|
181
|
+
body.use_saved_card = true;
|
|
182
|
+
if (billing_contact_phone)
|
|
183
|
+
body.billing_contact_phone = billing_contact_phone;
|
|
131
184
|
const result = await apiRequest(`/organizations/${orgId}/billing/topup`, {
|
|
132
185
|
method: "POST",
|
|
133
|
-
body
|
|
186
|
+
body,
|
|
134
187
|
toolName: "create_topup",
|
|
135
188
|
skipOrgInjection: true,
|
|
189
|
+
...(idempotency_key ? { headers: { "Idempotency-Key": idempotency_key } } : {}),
|
|
136
190
|
});
|
|
137
191
|
if (!result.success) {
|
|
138
192
|
return {
|
|
@@ -142,58 +196,62 @@ CHECK \`expiring_soon\` AND SAY SO UNPROMPTED. Some credit has an expiry date, s
|
|
|
142
196
|
}],
|
|
143
197
|
};
|
|
144
198
|
}
|
|
199
|
+
const status = result.data?.status;
|
|
200
|
+
let note;
|
|
201
|
+
if (status === "completed") {
|
|
202
|
+
note = "Top-up completed - the saved card was charged off-session. Call `get_wallet_balance` to see the new balance.";
|
|
203
|
+
}
|
|
204
|
+
else if (status === "pending_confirmation") {
|
|
205
|
+
note = "The bank asked for a confirmation challenge. Nothing more to do here - the top-up completes by itself once the payment is captured. Poll `get_wallet_balance`.";
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
note = "Top-up initiated but NOT yet paid. The user must complete Razorpay checkout in a browser - use the `checkout` payload, or open `payment_url` as a fallback. The wallet is credited only after Razorpay's webhook confirms, so poll `get_wallet_balance` rather than assuming success.";
|
|
209
|
+
}
|
|
145
210
|
return {
|
|
146
211
|
content: [
|
|
147
|
-
{ type: "text", text:
|
|
212
|
+
{ type: "text", text: note },
|
|
148
213
|
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
149
214
|
],
|
|
150
215
|
};
|
|
151
216
|
});
|
|
152
|
-
server.tool("
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
217
|
+
server.tool("unlink_billing_payment_method", `Remove the organization's saved payment method. Returns the resulting \`payment_channel_state\` (\`unlinked\` | \`linking\` | \`chargeable\`) and whether the provider token was deleted.
|
|
218
|
+
|
|
219
|
+
This DISABLES auto-recharge as a side effect - the setting keeps its numbers but can no longer be enabled without a token, so an org relying on it to stay above zero will start running its balance down instead. Say so before unlinking if auto-recharge is on (\`get_auto_recharge\`).
|
|
220
|
+
|
|
221
|
+
There is no matching "link" call: a card is saved by passing \`save_card: true\` on a real \`create_topup\`, not by a separate linking step.`, {
|
|
222
|
+
organization_id: z.string().optional()
|
|
223
|
+
.describe("Org PID (defaults to active org)"),
|
|
224
|
+
confirm: z.boolean()
|
|
225
|
+
.describe("Must be true - removes the saved card and disables one-tap top-ups and auto-recharge."),
|
|
226
|
+
}, async ({ organization_id, confirm }) => {
|
|
227
|
+
if (!confirm) {
|
|
228
|
+
return {
|
|
229
|
+
content: [{
|
|
230
|
+
type: "text",
|
|
231
|
+
text: "Refusing to unlink without confirm: true. This removes the saved card, so one-tap top-ups and auto-recharge stop working.",
|
|
232
|
+
}],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
165
235
|
const orgId = resolveOrgId(organization_id);
|
|
166
236
|
if (!orgId) {
|
|
167
237
|
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
168
238
|
}
|
|
169
|
-
const orgFields = {
|
|
170
|
-
billing_contact_phone,
|
|
171
|
-
};
|
|
172
|
-
if (billing_email)
|
|
173
|
-
orgFields.billing_email = billing_email;
|
|
174
|
-
if (tax_id)
|
|
175
|
-
orgFields.tax_id = tax_id;
|
|
176
|
-
if (country_code)
|
|
177
|
-
orgFields.country_code = country_code;
|
|
178
|
-
if (state_code)
|
|
179
|
-
orgFields.state_code = state_code;
|
|
180
239
|
const result = await apiRequest(`/organizations/${orgId}/billing/link`, {
|
|
181
|
-
method: "
|
|
182
|
-
|
|
183
|
-
toolName: "link_billing_payment_method",
|
|
240
|
+
method: "DELETE",
|
|
241
|
+
toolName: "unlink_billing_payment_method",
|
|
184
242
|
skipOrgInjection: true,
|
|
185
243
|
});
|
|
186
244
|
if (!result.success) {
|
|
187
245
|
return {
|
|
188
246
|
content: [{
|
|
189
247
|
type: "text",
|
|
190
|
-
text: `Failed to
|
|
248
|
+
text: `Failed to unlink payment method (${result.statusCode}): ${result.message}`,
|
|
191
249
|
}],
|
|
192
250
|
};
|
|
193
251
|
}
|
|
194
252
|
return {
|
|
195
253
|
content: [
|
|
196
|
-
{ type: "text", text: "
|
|
254
|
+
{ type: "text", text: "Payment method unlinked. Auto-recharge can no longer run - re-save a card via `create_topup` with `save_card: true` to restore it." },
|
|
197
255
|
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
198
256
|
],
|
|
199
257
|
};
|
|
@@ -244,5 +302,141 @@ CHECK \`expiring_soon\` AND SAY SO UNPROMPTED. Some credit has an expiry date, s
|
|
|
244
302
|
}
|
|
245
303
|
return { content: [{ type: "text", text: "Billing contact updated." }] };
|
|
246
304
|
});
|
|
305
|
+
server.tool("get_auto_recharge", `Read the organization's auto-recharge configuration - the standing instruction to top the wallet up from a saved card when the balance falls past a threshold, so resources are not stopped for running out of credit.
|
|
306
|
+
|
|
307
|
+
Returns four blocks:
|
|
308
|
+
- \`setting\` - **\`null\` when auto-recharge has never been configured**, which is the normal state for most orgs. Otherwise \`enabled\`, \`threshold_cents\`, \`amount_cents\`, \`monthly_cap_cents\`, \`token_id\`, \`provider\`, \`operational_state\`, \`paused_reason\` and \`next_retry_at\`.
|
|
309
|
+
- \`per_charge_cap_cents\` - the platform maximum for a single automatic charge. Present on EVERY read, including the first, so use this rather than assuming a figure.
|
|
310
|
+
- \`cards\` - the saved cards that can be used, each with a \`token_id\`, a display \`label\` and its own \`max_amount_cents\` mandate ceiling. An empty list means there is nothing to charge and auto-recharge cannot be enabled - the user has to save a card first via \`create_topup\` with \`save_card: true\`.
|
|
311
|
+
- \`burn\` - \`hourly_burn_cents\`, \`estimated_days_to_threshold\`, \`estimated_days_to_zero\`, \`spent_this_month_cents\`. This is what makes the numbers meaningful: a threshold the balance will not reach for 40 days is a very different thing from one it hits tomorrow.
|
|
312
|
+
|
|
313
|
+
READ \`operational_state\` AND \`paused_reason\` BEFORE REPORTING THAT AUTO-RECHARGE IS ON. \`enabled: true\` with a paused operational state means it is configured but NOT currently protecting the wallet - typically because a charge failed. That combination is the one worth raising unprompted, because the user believes they are covered.
|
|
314
|
+
|
|
315
|
+
Requires billing-manager permission on the org.`, {
|
|
316
|
+
organization_id: z.string().optional().describe("Org PID (defaults to active org)"),
|
|
317
|
+
}, async ({ organization_id }) => {
|
|
318
|
+
const orgId = resolveOrgId(organization_id);
|
|
319
|
+
if (!orgId)
|
|
320
|
+
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
321
|
+
const result = await apiRequest(`/organizations/${orgId}/billing/auto_recharge`, { toolName: "get_auto_recharge", skipOrgInjection: true });
|
|
322
|
+
if (!result.success) {
|
|
323
|
+
return { content: [{ type: "text", text: `Failed to get auto-recharge settings (${result.statusCode}): ${result.message}` }] };
|
|
324
|
+
}
|
|
325
|
+
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
326
|
+
});
|
|
327
|
+
server.tool("configure_auto_recharge", `Set or update auto-recharge: when the wallet drops below \`threshold_cents\`, charge \`amount_cents\` to a saved card, up to \`monthly_cap_cents\` of automatic charges per month.
|
|
328
|
+
|
|
329
|
+
CALL \`get_auto_recharge\` FIRST, for two reasons: it gives you the \`cards\` list (you need a \`token_id\` from it - there is no other way to get one) and the \`burn\` block, which is what tells you whether the numbers you are about to set are sensible. Setting a $5 threshold on an org burning $8/day means the recharge fires roughly daily.
|
|
330
|
+
|
|
331
|
+
THIS SPENDS MONEY LATER, WITHOUT ASKING AGAIN. That is the point of it, and it is also why the amounts should be the user's explicit choice rather than your defaults. Confirm all three figures with them.
|
|
332
|
+
|
|
333
|
+
Bounds the backend enforces, all returned at once on failure:
|
|
334
|
+
- \`amount_cents\`: at least 500 ($5), at most the \`per_charge_cap_cents\` from \`get_auto_recharge\` ($150 today).
|
|
335
|
+
- \`monthly_cap_cents\`: at least \`amount_cents\`, and at least 100 ($1).
|
|
336
|
+
- \`threshold_cents\`: at least 100 ($1).
|
|
337
|
+
- The card's own mandate ceiling also applies: a token whose \`max_amount_cents\` is below \`amount_cents\` is refused, and the error names the ceiling.
|
|
338
|
+
|
|
339
|
+
Configuring does NOT enable it. Call \`enable_auto_recharge\` afterwards, or the settings sit there inert.`, {
|
|
340
|
+
organization_id: z.string().optional().describe("Org PID (defaults to active org)"),
|
|
341
|
+
threshold_cents: z.number().int().min(100)
|
|
342
|
+
.describe("Charge when the balance falls below this, in cents (min 100 = $1)"),
|
|
343
|
+
amount_cents: z.number().int().min(500)
|
|
344
|
+
.describe("How much to add each time, in cents (min 500 = $5, max = per_charge_cap_cents from get_auto_recharge)"),
|
|
345
|
+
monthly_cap_cents: z.number().int().min(100)
|
|
346
|
+
.describe("Ceiling on total automatic charges per month, in cents. Must be >= amount_cents. This is the user's protection against a runaway loop - set it deliberately."),
|
|
347
|
+
token_id: z.string().optional()
|
|
348
|
+
.describe("Saved card token from `get_auto_recharge`'s `cards` list. Required before auto-recharge can be ENABLED."),
|
|
349
|
+
provider: z.string().optional().describe("Payment provider for the token (defaults to the org's, normally razorpay)"),
|
|
350
|
+
}, async ({ organization_id, threshold_cents, amount_cents, monthly_cap_cents, token_id, provider }) => {
|
|
351
|
+
const orgId = resolveOrgId(organization_id);
|
|
352
|
+
if (!orgId)
|
|
353
|
+
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
354
|
+
if (monthly_cap_cents < amount_cents) {
|
|
355
|
+
return {
|
|
356
|
+
content: [{
|
|
357
|
+
type: "text",
|
|
358
|
+
text: `monthly_cap_cents (${monthly_cap_cents}) must be at least amount_cents (${amount_cents}) - otherwise the very first recharge would breach the monthly cap and nothing could ever fire.`,
|
|
359
|
+
}],
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
const body = { threshold_cents, amount_cents, monthly_cap_cents };
|
|
363
|
+
if (token_id)
|
|
364
|
+
body.token_id = token_id;
|
|
365
|
+
if (provider)
|
|
366
|
+
body.provider = provider;
|
|
367
|
+
const result = await apiRequest(`/organizations/${orgId}/billing/auto_recharge`, { method: "POST", body, toolName: "configure_auto_recharge", skipOrgInjection: true });
|
|
368
|
+
if (!result.success) {
|
|
369
|
+
return { content: [{ type: "text", text: `Failed to configure auto-recharge (${result.statusCode}): ${result.message}` }] };
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
content: [
|
|
373
|
+
{
|
|
374
|
+
type: "text",
|
|
375
|
+
text: `Auto-recharge configured: add $${(amount_cents / 100).toFixed(2)} whenever the balance falls below $${(threshold_cents / 100).toFixed(2)}, up to $${(monthly_cap_cents / 100).toFixed(2)} of automatic charges a month.\n\nIT IS NOT ACTIVE YET - saving the settings does not switch it on. Call \`enable_auto_recharge\` to start it${token_id ? "" : ", which needs a saved card: pass a `token_id` from `get_auto_recharge` first"}.`,
|
|
376
|
+
},
|
|
377
|
+
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
378
|
+
],
|
|
379
|
+
};
|
|
380
|
+
});
|
|
381
|
+
server.tool("enable_auto_recharge", `Switch auto-recharge on. From here the platform will charge the saved card by itself whenever the balance falls below the configured threshold.
|
|
382
|
+
|
|
383
|
+
Requires an existing configuration (\`configure_auto_recharge\`) WITH a linked \`token_id\` - a 422 "No auto-recharge configuration exists" or "A linked payment token is required" means that step is missing. The configured amount is re-validated at this point too, so a setting saved before the per-charge cap moved can be refused here with the cap named.
|
|
384
|
+
|
|
385
|
+
Tell the user this is a standing authorisation to charge their card without further prompting, and that \`monthly_cap_cents\` is the limit on how much it can spend.`, {
|
|
386
|
+
organization_id: z.string().optional().describe("Org PID (defaults to active org)"),
|
|
387
|
+
confirm: z.boolean().describe("Must be true. This authorises future card charges with no further confirmation."),
|
|
388
|
+
}, async ({ organization_id, confirm }) => {
|
|
389
|
+
const orgId = resolveOrgId(organization_id);
|
|
390
|
+
if (!orgId)
|
|
391
|
+
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
392
|
+
if (!confirm) {
|
|
393
|
+
return {
|
|
394
|
+
content: [{
|
|
395
|
+
type: "text",
|
|
396
|
+
text: "Enabling auto-recharge is a standing authorisation: the platform will charge the saved card whenever the balance falls below the threshold, without asking again. Read the configured threshold, amount and monthly cap back to the user from `get_auto_recharge`, then call again with confirm=true.",
|
|
397
|
+
}],
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
const result = await apiRequest(`/organizations/${orgId}/billing/auto_recharge/enable`, { method: "POST", toolName: "enable_auto_recharge", skipOrgInjection: true });
|
|
401
|
+
if (!result.success) {
|
|
402
|
+
return { content: [{ type: "text", text: `Failed to enable auto-recharge (${result.statusCode}): ${result.message}` }] };
|
|
403
|
+
}
|
|
404
|
+
return {
|
|
405
|
+
content: [
|
|
406
|
+
{ type: "text", text: "Auto-recharge enabled. Check `operational_state` in the payload: anything other than an active state means it is configured but not currently protecting the wallet." },
|
|
407
|
+
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
408
|
+
],
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
server.tool("disable_auto_recharge", `Switch auto-recharge off. The configuration is kept - thresholds and amounts stay - so \`enable_auto_recharge\` turns it back on without re-entering anything.
|
|
412
|
+
|
|
413
|
+
SAY WHAT THIS MEANS: nothing will top the wallet up automatically any more, so the balance will run down to zero and resources will be STOPPED unless the user tops up by hand. Use \`get_wallet_balance\` for \`estimated_hours_remaining\` and tell them roughly how long they have.
|
|
414
|
+
|
|
415
|
+
Idempotent - disabling when no configuration exists is a no-op, not an error.`, {
|
|
416
|
+
organization_id: z.string().optional().describe("Org PID (defaults to active org)"),
|
|
417
|
+
confirm: z.boolean().describe("Must be true. The wallet will no longer top itself up, so resources can be stopped when it empties."),
|
|
418
|
+
}, async ({ organization_id, confirm }) => {
|
|
419
|
+
const orgId = resolveOrgId(organization_id);
|
|
420
|
+
if (!orgId)
|
|
421
|
+
return { content: [{ type: "text", text: noOrgMessage }] };
|
|
422
|
+
if (!confirm) {
|
|
423
|
+
return {
|
|
424
|
+
content: [{
|
|
425
|
+
type: "text",
|
|
426
|
+
text: "Disabling auto-recharge means the wallet stops topping itself up: when the balance reaches zero, running resources are stopped until someone tops up manually. Check `get_wallet_balance` for the current runway and tell the user how long that leaves them, then call again with confirm=true.",
|
|
427
|
+
}],
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
const result = await apiRequest(`/organizations/${orgId}/billing/auto_recharge/disable`, { method: "POST", toolName: "disable_auto_recharge", skipOrgInjection: true });
|
|
431
|
+
if (!result.success) {
|
|
432
|
+
return { content: [{ type: "text", text: `Failed to disable auto-recharge (${result.statusCode}): ${result.message}` }] };
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
content: [
|
|
436
|
+
{ type: "text", text: "Auto-recharge disabled; the settings are kept for when it is turned back on. The wallet will now run down - watch `get_wallet_balance`." },
|
|
437
|
+
{ type: "text", text: JSON.stringify(result.data, null, 2) },
|
|
438
|
+
],
|
|
439
|
+
};
|
|
440
|
+
});
|
|
247
441
|
}
|
|
248
442
|
//# sourceMappingURL=billing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,24 @@ import { apiRequest } from "../client.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Database users - DBMS-level credentials (distinct from the platform login).
|
|
5
5
|
*
|
|
6
|
-
* Postgres, MySQL and
|
|
6
|
+
* Postgres, MySQL, ClickHouse and OpenSearch. NOT supported for Redis - Redis auth is a
|
|
7
7
|
* single shared `requirepass`, so the backend returns "Database user management
|
|
8
8
|
* not supported for redis". Do not call these tools on a Redis instance.
|
|
9
9
|
* ClickHouse users are real SQL users (SHA-256 credentials) managed through
|
|
10
10
|
* these same endpoints.
|
|
11
11
|
*
|
|
12
|
+
* OpenSearch works here too, and the controller has no engine gate at all - the platform
|
|
13
|
+
* roles map onto security-plugin roles (`read_only` → `readall`, `read_write` → a custom
|
|
14
|
+
* `selfhost_read_write`, `admin` → `all_access`). The backend's own integration guide still
|
|
15
|
+
* calls this a future "if/when"; the console confirmed it live on 2026-08-24. `target_database`
|
|
16
|
+
* is meaningless there - OpenSearch has no named-database concept.
|
|
17
|
+
*
|
|
18
|
+
* ENGINE-RESERVED USERNAMES are a real trap on OpenSearch: `opensearch_user_management.sh`
|
|
19
|
+
* refuses six names, but only `admin` is in the backend's `DatabaseUser::RESERVED_USERNAMES`.
|
|
20
|
+
* The other five pass API validation and then fail at agent sync, landing as `status: failed`
|
|
21
|
+
* with nothing useful to show. They are rejected client-side here for that reason - remove the
|
|
22
|
+
* check once the backend list catches up.
|
|
23
|
+
*
|
|
12
24
|
* Endpoints:
|
|
13
25
|
* - GET /aws/v1/instances/:id/database_users
|
|
14
26
|
* - POST /aws/v1/instances/:id/database_users
|
|
@@ -20,8 +32,27 @@ import { apiRequest } from "../client.js";
|
|
|
20
32
|
* sharing the master admin password.
|
|
21
33
|
*/
|
|
22
34
|
const ROLES = ["read_only", "read_write", "admin"];
|
|
35
|
+
/**
|
|
36
|
+
* Usernames the OpenSearch security plugin owns, on top of the platform-wide reserved list the
|
|
37
|
+
* backend already enforces. Mirrors the console's `engineReservedUsernames`.
|
|
38
|
+
*/
|
|
39
|
+
const OPENSEARCH_RESERVED_USERNAMES = new Set([
|
|
40
|
+
"admin", "kibanaserver", "kibanaro", "logstash", "readall", "snapshotrestore",
|
|
41
|
+
]);
|
|
42
|
+
/**
|
|
43
|
+
* Engine of an instance, for the OpenSearch-only username check. Only called when the
|
|
44
|
+
* requested username is one of the six reserved names, so the common path pays nothing -
|
|
45
|
+
* and `logstash` or `readall` stay perfectly legal usernames on every other engine.
|
|
46
|
+
* Returns null when the lookup fails; the caller then lets the backend decide.
|
|
47
|
+
*/
|
|
48
|
+
async function lookupEngine(instanceId) {
|
|
49
|
+
const result = await apiRequest("/aws/v1/instances/details", { query: { instance_id: instanceId }, toolName: "get_instance", skipOrgInjection: true });
|
|
50
|
+
if (!result.success)
|
|
51
|
+
return null;
|
|
52
|
+
return result.data?.type_of_dbms ?? result.data?.instance?.type_of_dbms ?? null;
|
|
53
|
+
}
|
|
23
54
|
export function registerDatabaseUserTools(server) {
|
|
24
|
-
server.tool("list_database_users", `List DBMS-level users on an instance. Returns each user's id, username, role, status (\`active\` | \`pending\` | \`deleting\` | \`failed\`), target database, connection limit, password expiry metadata and \`password_rotation_enabled\`. Postgres, MySQL and
|
|
55
|
+
server.tool("list_database_users", `List DBMS-level users on an instance. Returns each user's id, username, role, status (\`active\` | \`pending\` | \`deleting\` | \`failed\`), target database, connection limit, password expiry metadata and \`password_rotation_enabled\`. Postgres, MySQL, ClickHouse and OpenSearch (not Redis).
|
|
25
56
|
|
|
26
57
|
Read \`password_rotation_enabled\` alongside the expiry when a user asks about credentials: \`false\` means the credential will be LOCKED at expiry (warned by email first), \`true\` means it will be silently rotated and a webhook fired. A credential nearing expiry with the wrong setting for how it is consumed is the failure worth flagging without being asked.
|
|
27
58
|
|
|
@@ -42,7 +73,9 @@ A \`failed\` user whose error mentions enforcement sync means a lock half-applie
|
|
|
42
73
|
}
|
|
43
74
|
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
44
75
|
});
|
|
45
|
-
server.tool("create_database_user", `Create a DBMS-level user on an instance. Postgres, MySQL and
|
|
76
|
+
server.tool("create_database_user", `Create a DBMS-level user on an instance. Postgres, MySQL, ClickHouse and OpenSearch - NOT supported for Redis (Redis uses a single shared requirepass; the backend returns "Database user management not supported for redis"). Username 1-31 chars, letters/digits/underscores only. Password 8-128 printable chars. Role determines DB privileges: read_only (SELECT), read_write (SELECT/INSERT/UPDATE/DELETE), admin (broader DDL). Target database scopes the grant to one DB; leave empty for cluster-level access - and omit it entirely on OpenSearch, which has no named-database concept.
|
|
77
|
+
|
|
78
|
+
ON OPENSEARCH the role maps onto a security-plugin role (read_only → \`readall\`, read_write → a custom \`selfhost_read_write\`, admin → \`all_access\`), and six usernames the plugin owns are rejected here before the request goes out: admin, kibanaserver, kibanaro, logstash, readall, snapshotrestore. Only \`admin\` is in the backend's own reserved list, so the other five would otherwise pass validation and then fail at agent sync as \`status: failed\`.
|
|
46
79
|
|
|
47
80
|
PASSWORD LIFETIME: every user's password expires after 90 days, and what happens then depends on \`password_rotation_enabled\`:
|
|
48
81
|
|
|
@@ -64,6 +97,20 @@ The instance must be \`running\` or \`provisioned\`, and the username must be fr
|
|
|
64
97
|
password_rotation_enabled: z.boolean().optional()
|
|
65
98
|
.describe("false (default) = warn by email, then lock the credential at expiry. true = rotate silently at expiry and fire a `database_user.password_rotated` webhook instead. Only pick true if something is listening for that webhook - it will break a hardcoded password with no warning."),
|
|
66
99
|
}, async ({ instance_id, username, password, role, target_database, connection_limit, password_expiry_days, password_rotation_enabled }) => {
|
|
100
|
+
// The OpenSearch security plugin owns six usernames but the backend only reserves
|
|
101
|
+
// `admin`, so the other five would be accepted here and then fail at agent sync as
|
|
102
|
+
// `status: failed` with no useful error. Check the engine ONLY for those names.
|
|
103
|
+
if (OPENSEARCH_RESERVED_USERNAMES.has(username.toLowerCase())) {
|
|
104
|
+
const engine = await lookupEngine(instance_id);
|
|
105
|
+
if (engine === "opensearch") {
|
|
106
|
+
return {
|
|
107
|
+
content: [{
|
|
108
|
+
type: "text",
|
|
109
|
+
text: `\`${username}\` is reserved by the OpenSearch security plugin and cannot be used. The platform would accept this create and the agent would then refuse it, leaving a user stuck at \`status: failed\`. Reserved: ${[...OPENSEARCH_RESERVED_USERNAMES].join(", ")}. Pick another name.`,
|
|
110
|
+
}],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
67
114
|
const body = {
|
|
68
115
|
username,
|
|
69
116
|
password,
|
|
@@ -98,7 +145,7 @@ The instance must be \`running\` or \`provisioned\`, and the username must be fr
|
|
|
98
145
|
],
|
|
99
146
|
};
|
|
100
147
|
});
|
|
101
|
-
server.tool("update_database_user", `Update a database user - change role, connection limit, password expiry, or the expiry BEHAVIOUR. Username and target database are immutable (delete + recreate to change them). Postgres, MySQL and
|
|
148
|
+
server.tool("update_database_user", `Update a database user - change role, connection limit, password expiry, or the expiry BEHAVIOUR. Username and target database are immutable (delete + recreate to change them). Postgres, MySQL, ClickHouse and OpenSearch (not Redis).
|
|
102
149
|
|
|
103
150
|
The password itself is not changed here: use \`rotate_database_user_password\` for that (it reveals the new password once).
|
|
104
151
|
|
|
@@ -147,7 +194,7 @@ A user that has ALREADY been locked by an expiry is not recovered by flipping th
|
|
|
147
194
|
}
|
|
148
195
|
return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
|
|
149
196
|
});
|
|
150
|
-
server.tool("delete_database_user", "Soft-delete a database user. Existing connections opened by this user are terminated. The record is preserved for audit - contact support to recover. Postgres, MySQL and
|
|
197
|
+
server.tool("delete_database_user", "Soft-delete a database user. Existing connections opened by this user are terminated. The record is preserved for audit - contact support to recover. Postgres, MySQL, ClickHouse and OpenSearch (not Redis).", {
|
|
151
198
|
instance_id: z.string().min(1),
|
|
152
199
|
user_id: z.string().min(1),
|
|
153
200
|
username: z.string().optional().describe("Username for the confirmation message (cosmetic)"),
|
|
@@ -177,7 +224,7 @@ A user that has ALREADY been locked by an expiry is not recovered by flipping th
|
|
|
177
224
|
}
|
|
178
225
|
return { content: [{ type: "text", text: "Database user delete requested - status will move to `deleting` and then disappear from the list." }] };
|
|
179
226
|
});
|
|
180
|
-
server.tool("rotate_database_user_password", "Rotate the password for a database user. The new password is generated server-side and returned ONCE in the response. SECURITY: save it immediately - there is no way to retrieve it later. Existing connections using the old password are terminated. Postgres, MySQL and
|
|
227
|
+
server.tool("rotate_database_user_password", "Rotate the password for a database user. The new password is generated server-side and returned ONCE in the response. SECURITY: save it immediately - there is no way to retrieve it later. Existing connections using the old password are terminated. Postgres, MySQL, ClickHouse and OpenSearch (not Redis).", {
|
|
181
228
|
instance_id: z.string().min(1),
|
|
182
229
|
user_id: z.string().min(1),
|
|
183
230
|
confirm: z.boolean().describe("Must be true. Old password is invalidated immediately; apps and scripts must pick up the new value."),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-users.js","sourceRoot":"","sources":["../../src/tools/database-users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"database-users.js","sourceRoot":"","sources":["../../src/tools/database-users.ts"],"names":[],"mappings":"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"}
|