helipod-mcp 0.5.10 → 0.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/http.js +33 -1
- package/dist/index.js +33 -1
- package/dist/stdio.js +33 -1
- package/package.json +1 -1
- package/skills/helipod/SKILL.md +2 -2
- package/skills/helipod-vps/SKILL.md +3 -3
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Use [Helipod](https://helipod.io) from AI coding tools: deploy apps and databases, run VPS servers, buy domains and edit DNS, and send email, by asking in plain language.
|
|
4
4
|
|
|
5
|
-
- **MCP server** (`helipod-mcp`):
|
|
5
|
+
- **MCP server** (`helipod-mcp`): 238 tools over the Container, Database, VPS, Domain, Email, Account and AI APIs. Works in Claude Code, Codex, Cursor, VS Code, Windsurf, Claude Desktop and any MCP client.
|
|
6
6
|
- **Skills** (`skills/`): step-by-step playbooks so the agent deploys, prices and confirms the way Helipod expects (price first, confirm before deleting, read build logs on failure).
|
|
7
7
|
|
|
8
8
|
Step-by-step guides for each tool (Claude Code, Codex, Cursor, VS Code, Gemini CLI, opencode, Windsurf, Claude Desktop, Cline and others): **https://docs.helipod.io/docs/helipod/ai-agents**
|
|
@@ -193,10 +193,10 @@ Pick your agents when asked (or pass `-a codex cursor gemini-cli opencode -y`).
|
|
|
193
193
|
|---|---|
|
|
194
194
|
| Containers | projects and environments (create, rename, delete), shared project variables, services (create from image, Git or Dockerfile, rename), deploy, deployments and build logs, restart, variables, domains and their ports, scale, volumes (with resize), function code, secret files, logs, metrics, templates, multi-service stacks |
|
|
195
195
|
| Databases | managed Postgres: create, connection string, branches per environment, compute settings, plan upgrades, usage, live stats, credit balance, tables, read-only queries, SQL classification and confirmed writes |
|
|
196
|
-
| VPS | plans, create, rename, power, reinstall, password, login details, terminate, renew, upgrade options and upgrade, auto-renew, metrics, firewall, port forwarding, SSH keys and SSH on/off, snapshots, backups |
|
|
196
|
+
| VPS | plans, create, rename, power, reinstall, password, login details, terminate, renew, upgrade options and upgrade (create, renew and upgrade each with a dry run), auto-renew, metrics, firewall, port forwarding, SSH keys and SSH on/off, snapshots, backups |
|
|
197
197
|
| Domains | search, prices, owner details, register, transfer, renew (each with a dry run), DNS records, nameservers, child nameservers, WHOIS privacy |
|
|
198
198
|
| Email | status, plan (buy, renew, change, inbox add-ons, with dry runs), send, sent log, sending domains, templates, contacts, segments, topics, broadcasts, suppressions, webhooks, inbox |
|
|
199
|
-
| Account | wallet and transactions, invoices, monthly statements, notifications, project activity, support tickets |
|
|
199
|
+
| Account | wallet and transactions, deposits (top-up payment links), invoices, monthly statements, notifications, project activity, support tickets |
|
|
200
200
|
| AI | models and prices, balance, usage, metrics, AI keys (list, revoke), top-up and auto top-up |
|
|
201
201
|
| Other | `helipod_api_get` to read any other documented endpoint (read only) |
|
|
202
202
|
|
package/dist/http.js
CHANGED
|
@@ -37903,6 +37903,38 @@ var accountTools = [
|
|
|
37903
37903
|
input: { limit: limit2, offset },
|
|
37904
37904
|
run: (a, api2) => api2.api("GET", "/account/wallet/transactions", { query: { limit: a.limit, offset: a.offset } })
|
|
37905
37905
|
}),
|
|
37906
|
+
defineTool({
|
|
37907
|
+
name: "create_deposit",
|
|
37908
|
+
title: "Create deposit (top-up)",
|
|
37909
|
+
kind: "write",
|
|
37910
|
+
description: `Create a wallet top-up of amount IDR (whole number, 10000-50000000) and its payment link. Nothing is charged: give the user paymentUrl to pay (QRIS or bank virtual account, listed in paymentMethods; the link lasts 3 hours); never try to pay it yourself. Limits: one unpaid deposit at a time (409 DEPOSIT_PENDING: details.deposit is the unpaid one, send its paymentUrl instead), 10 minutes between deposits (429 DEPOSIT_COOLDOWN, details.nextAllowedAt), 10 a day (429 DEPOSIT_DAILY_LIMIT). dryRun=true creates nothing and says whether it would be accepted now. Then follow it with get_deposit. ${ACCOUNT_KEY}`,
|
|
37911
|
+
input: {
|
|
37912
|
+
amount: exports_external.number().int().min(1e4).max(50000000).describe("IDR, whole number"),
|
|
37913
|
+
dryRun: exports_external.boolean().optional().describe("true = only check (methods, whether it would be accepted now); nothing is created"),
|
|
37914
|
+
idempotencyKey: exports_external.string().regex(/^[A-Za-z0-9_.:-]{8,128}$/).optional().describe("Idempotency-Key. Generated when omitted; pass the same value when retrying so only one deposit is created")
|
|
37915
|
+
},
|
|
37916
|
+
run: (a, api2) => api2.api("POST", "/account/deposits", {
|
|
37917
|
+
body: { amount: a.amount },
|
|
37918
|
+
query: { dryRun: a.dryRun ? "true" : undefined },
|
|
37919
|
+
idempotencyKey: purchaseKey(a.dryRun, a.idempotencyKey)
|
|
37920
|
+
})
|
|
37921
|
+
}),
|
|
37922
|
+
defineTool({
|
|
37923
|
+
name: "get_deposit",
|
|
37924
|
+
title: "Get deposit",
|
|
37925
|
+
kind: "read",
|
|
37926
|
+
description: `One deposit: status pending (paymentUrl to pay), paid (paidAt; the wallet was credited) or expired (not paid in time). ${ACCOUNT_KEY}`,
|
|
37927
|
+
input: { depositId: uid2("Deposit") },
|
|
37928
|
+
run: (a, api2) => api2.api("GET", `/account/deposits/${a.depositId}`)
|
|
37929
|
+
}),
|
|
37930
|
+
defineTool({
|
|
37931
|
+
name: "list_deposits",
|
|
37932
|
+
title: "List deposits",
|
|
37933
|
+
kind: "read",
|
|
37934
|
+
description: `Deposits (wallet top-ups), newest first, with status and amount. ${ACCOUNT_KEY}`,
|
|
37935
|
+
input: { limit: limit2, offset },
|
|
37936
|
+
run: (a, api2) => api2.api("GET", "/account/deposits", { query: { limit: a.limit, offset: a.offset } })
|
|
37937
|
+
}),
|
|
37906
37938
|
defineTool({
|
|
37907
37939
|
name: "list_invoices",
|
|
37908
37940
|
title: "List invoices",
|
|
@@ -38229,7 +38261,7 @@ var generalTools = [
|
|
|
38229
38261
|
];
|
|
38230
38262
|
|
|
38231
38263
|
// src/server.ts
|
|
38232
|
-
var VERSION = "0.5.
|
|
38264
|
+
var VERSION = "0.5.11";
|
|
38233
38265
|
var INSTRUCTIONS = `Helipod is a cloud platform (Indonesia): containers, managed Postgres databases, VPS, domains, email and an AI gateway, billed from a prepaid wallet in Rupiah.
|
|
38234
38266
|
- Start with list_projects to find projects and environment ids. Account tools (get_wallet, invoices, statements, notifications, get_project_activity, support tickets) cover the account; AI tools (list_ai_models, get_ai_overview, get_ai_usage, AI keys, top-ups, generate_ai_image) cover the AI gateway.
|
|
38235
38267
|
- Anything that costs money (create/deploy/scale services, resize volumes, upgrade a database plan, create/renew/upgrade VPS, VPS backups, register/renew/transfer domains, email plans and inbox add-ons, AI top-ups and auto top-up, generating images): call it with dryRun=true first (or the price lookup when it has no dry run), tell the user the cost in IDR and the wallet balance after, and wait for an explicit yes before the real call. Never treat silence or an earlier general OK as a yes.
|
package/dist/index.js
CHANGED
|
@@ -37048,6 +37048,38 @@ var accountTools = [
|
|
|
37048
37048
|
input: { limit: limit2, offset },
|
|
37049
37049
|
run: (a, api2) => api2.api("GET", "/account/wallet/transactions", { query: { limit: a.limit, offset: a.offset } })
|
|
37050
37050
|
}),
|
|
37051
|
+
defineTool({
|
|
37052
|
+
name: "create_deposit",
|
|
37053
|
+
title: "Create deposit (top-up)",
|
|
37054
|
+
kind: "write",
|
|
37055
|
+
description: `Create a wallet top-up of amount IDR (whole number, 10000-50000000) and its payment link. Nothing is charged: give the user paymentUrl to pay (QRIS or bank virtual account, listed in paymentMethods; the link lasts 3 hours); never try to pay it yourself. Limits: one unpaid deposit at a time (409 DEPOSIT_PENDING: details.deposit is the unpaid one, send its paymentUrl instead), 10 minutes between deposits (429 DEPOSIT_COOLDOWN, details.nextAllowedAt), 10 a day (429 DEPOSIT_DAILY_LIMIT). dryRun=true creates nothing and says whether it would be accepted now. Then follow it with get_deposit. ${ACCOUNT_KEY}`,
|
|
37056
|
+
input: {
|
|
37057
|
+
amount: exports_external.number().int().min(1e4).max(50000000).describe("IDR, whole number"),
|
|
37058
|
+
dryRun: exports_external.boolean().optional().describe("true = only check (methods, whether it would be accepted now); nothing is created"),
|
|
37059
|
+
idempotencyKey: exports_external.string().regex(/^[A-Za-z0-9_.:-]{8,128}$/).optional().describe("Idempotency-Key. Generated when omitted; pass the same value when retrying so only one deposit is created")
|
|
37060
|
+
},
|
|
37061
|
+
run: (a, api2) => api2.api("POST", "/account/deposits", {
|
|
37062
|
+
body: { amount: a.amount },
|
|
37063
|
+
query: { dryRun: a.dryRun ? "true" : undefined },
|
|
37064
|
+
idempotencyKey: purchaseKey(a.dryRun, a.idempotencyKey)
|
|
37065
|
+
})
|
|
37066
|
+
}),
|
|
37067
|
+
defineTool({
|
|
37068
|
+
name: "get_deposit",
|
|
37069
|
+
title: "Get deposit",
|
|
37070
|
+
kind: "read",
|
|
37071
|
+
description: `One deposit: status pending (paymentUrl to pay), paid (paidAt; the wallet was credited) or expired (not paid in time). ${ACCOUNT_KEY}`,
|
|
37072
|
+
input: { depositId: uid2("Deposit") },
|
|
37073
|
+
run: (a, api2) => api2.api("GET", `/account/deposits/${a.depositId}`)
|
|
37074
|
+
}),
|
|
37075
|
+
defineTool({
|
|
37076
|
+
name: "list_deposits",
|
|
37077
|
+
title: "List deposits",
|
|
37078
|
+
kind: "read",
|
|
37079
|
+
description: `Deposits (wallet top-ups), newest first, with status and amount. ${ACCOUNT_KEY}`,
|
|
37080
|
+
input: { limit: limit2, offset },
|
|
37081
|
+
run: (a, api2) => api2.api("GET", "/account/deposits", { query: { limit: a.limit, offset: a.offset } })
|
|
37082
|
+
}),
|
|
37051
37083
|
defineTool({
|
|
37052
37084
|
name: "list_invoices",
|
|
37053
37085
|
title: "List invoices",
|
|
@@ -37374,7 +37406,7 @@ var generalTools = [
|
|
|
37374
37406
|
];
|
|
37375
37407
|
|
|
37376
37408
|
// src/server.ts
|
|
37377
|
-
var VERSION = "0.5.
|
|
37409
|
+
var VERSION = "0.5.11";
|
|
37378
37410
|
var INSTRUCTIONS = `Helipod is a cloud platform (Indonesia): containers, managed Postgres databases, VPS, domains, email and an AI gateway, billed from a prepaid wallet in Rupiah.
|
|
37379
37411
|
- Start with list_projects to find projects and environment ids. Account tools (get_wallet, invoices, statements, notifications, get_project_activity, support tickets) cover the account; AI tools (list_ai_models, get_ai_overview, get_ai_usage, AI keys, top-ups, generate_ai_image) cover the AI gateway.
|
|
37380
37412
|
- Anything that costs money (create/deploy/scale services, resize volumes, upgrade a database plan, create/renew/upgrade VPS, VPS backups, register/renew/transfer domains, email plans and inbox add-ons, AI top-ups and auto top-up, generating images): call it with dryRun=true first (or the price lookup when it has no dry run), tell the user the cost in IDR and the wallet balance after, and wait for an explicit yes before the real call. Never treat silence or an earlier general OK as a yes.
|
package/dist/stdio.js
CHANGED
|
@@ -37155,6 +37155,38 @@ var accountTools = [
|
|
|
37155
37155
|
input: { limit: limit2, offset },
|
|
37156
37156
|
run: (a, api2) => api2.api("GET", "/account/wallet/transactions", { query: { limit: a.limit, offset: a.offset } })
|
|
37157
37157
|
}),
|
|
37158
|
+
defineTool({
|
|
37159
|
+
name: "create_deposit",
|
|
37160
|
+
title: "Create deposit (top-up)",
|
|
37161
|
+
kind: "write",
|
|
37162
|
+
description: `Create a wallet top-up of amount IDR (whole number, 10000-50000000) and its payment link. Nothing is charged: give the user paymentUrl to pay (QRIS or bank virtual account, listed in paymentMethods; the link lasts 3 hours); never try to pay it yourself. Limits: one unpaid deposit at a time (409 DEPOSIT_PENDING: details.deposit is the unpaid one, send its paymentUrl instead), 10 minutes between deposits (429 DEPOSIT_COOLDOWN, details.nextAllowedAt), 10 a day (429 DEPOSIT_DAILY_LIMIT). dryRun=true creates nothing and says whether it would be accepted now. Then follow it with get_deposit. ${ACCOUNT_KEY}`,
|
|
37163
|
+
input: {
|
|
37164
|
+
amount: exports_external.number().int().min(1e4).max(50000000).describe("IDR, whole number"),
|
|
37165
|
+
dryRun: exports_external.boolean().optional().describe("true = only check (methods, whether it would be accepted now); nothing is created"),
|
|
37166
|
+
idempotencyKey: exports_external.string().regex(/^[A-Za-z0-9_.:-]{8,128}$/).optional().describe("Idempotency-Key. Generated when omitted; pass the same value when retrying so only one deposit is created")
|
|
37167
|
+
},
|
|
37168
|
+
run: (a, api2) => api2.api("POST", "/account/deposits", {
|
|
37169
|
+
body: { amount: a.amount },
|
|
37170
|
+
query: { dryRun: a.dryRun ? "true" : undefined },
|
|
37171
|
+
idempotencyKey: purchaseKey(a.dryRun, a.idempotencyKey)
|
|
37172
|
+
})
|
|
37173
|
+
}),
|
|
37174
|
+
defineTool({
|
|
37175
|
+
name: "get_deposit",
|
|
37176
|
+
title: "Get deposit",
|
|
37177
|
+
kind: "read",
|
|
37178
|
+
description: `One deposit: status pending (paymentUrl to pay), paid (paidAt; the wallet was credited) or expired (not paid in time). ${ACCOUNT_KEY}`,
|
|
37179
|
+
input: { depositId: uid2("Deposit") },
|
|
37180
|
+
run: (a, api2) => api2.api("GET", `/account/deposits/${a.depositId}`)
|
|
37181
|
+
}),
|
|
37182
|
+
defineTool({
|
|
37183
|
+
name: "list_deposits",
|
|
37184
|
+
title: "List deposits",
|
|
37185
|
+
kind: "read",
|
|
37186
|
+
description: `Deposits (wallet top-ups), newest first, with status and amount. ${ACCOUNT_KEY}`,
|
|
37187
|
+
input: { limit: limit2, offset },
|
|
37188
|
+
run: (a, api2) => api2.api("GET", "/account/deposits", { query: { limit: a.limit, offset: a.offset } })
|
|
37189
|
+
}),
|
|
37158
37190
|
defineTool({
|
|
37159
37191
|
name: "list_invoices",
|
|
37160
37192
|
title: "List invoices",
|
|
@@ -37481,7 +37513,7 @@ var generalTools = [
|
|
|
37481
37513
|
];
|
|
37482
37514
|
|
|
37483
37515
|
// src/server.ts
|
|
37484
|
-
var VERSION = "0.5.
|
|
37516
|
+
var VERSION = "0.5.11";
|
|
37485
37517
|
var INSTRUCTIONS = `Helipod is a cloud platform (Indonesia): containers, managed Postgres databases, VPS, domains, email and an AI gateway, billed from a prepaid wallet in Rupiah.
|
|
37486
37518
|
- Start with list_projects to find projects and environment ids. Account tools (get_wallet, invoices, statements, notifications, get_project_activity, support tickets) cover the account; AI tools (list_ai_models, get_ai_overview, get_ai_usage, AI keys, top-ups, generate_ai_image) cover the AI gateway.
|
|
37487
37519
|
- Anything that costs money (create/deploy/scale services, resize volumes, upgrade a database plan, create/renew/upgrade VPS, VPS backups, register/renew/transfer domains, email plans and inbox add-ons, AI top-ups and auto top-up, generating images): call it with dryRun=true first (or the price lookup when it has no dry run), tell the user the cost in IDR and the wallet balance after, and wait for an explicit yes before the real call. Never treat silence or an earlier general OK as a yes.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "helipod-mcp",
|
|
3
3
|
"mcpName": "io.helipod/helipod",
|
|
4
|
-
"version": "0.5.
|
|
4
|
+
"version": "0.5.11",
|
|
5
5
|
"description": "MCP server for Helipod: containers, databases, VPS, domains and email from Claude Code, Codex, Cursor and other AI tools.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
package/skills/helipod/SKILL.md
CHANGED
|
@@ -5,7 +5,7 @@ description: Use when the user mentions Helipod (helipod.io) or wants to work wi
|
|
|
5
5
|
|
|
6
6
|
# Helipod
|
|
7
7
|
|
|
8
|
-
Helipod is a cloud platform in Indonesia: containers (deploy apps from Git, images or Dockerfiles), managed Postgres databases, VPS, domain registration and DNS, email sending, and an AI gateway. Everything is billed from a prepaid wallet in Rupiah (IDR).
|
|
8
|
+
Helipod is a cloud platform in Indonesia: containers (deploy apps from Git, images or Dockerfiles), managed Postgres databases, VPS, domain registration and DNS, email sending, and an AI gateway. Everything is billed from a prepaid wallet in Rupiah (IDR). When the wallet is too low, `create_deposit` makes a top-up payment link: give the user its `paymentUrl` to pay (QRIS or bank virtual account) and check it with `get_deposit`; never pay it yourself.
|
|
9
9
|
|
|
10
10
|
## Access
|
|
11
11
|
|
|
@@ -19,7 +19,7 @@ Helipod is a cloud platform in Indonesia: containers (deploy apps from Git, imag
|
|
|
19
19
|
|
|
20
20
|
## Rules (always)
|
|
21
21
|
|
|
22
|
-
1. **Money**: before anything that costs money (create/deploy/scale a service, create/renew/upgrade a VPS, register/renew/transfer a domain, deploy a template), get the price first (`dryRun: true` on container calls
|
|
22
|
+
1. **Money**: before anything that costs money (create/deploy/scale a service, create/renew/upgrade a VPS, register/renew/transfer a domain, deploy a template), get the price first (`dryRun: true` on container, VPS and domain calls; `domain_prices` and `list_vps_plans` to compare), tell the user the amount in IDR, and wait for a clear yes.
|
|
23
23
|
2. **Destructive**: before deleting a service/volume, terminating/reinstalling a VPS, rolling back a snapshot or replacing DNS records, say exactly what will be lost and wait for a clear yes.
|
|
24
24
|
3. **Background work**: deploys and VPS actions are asynchronous. Poll (`get_deployment`, `get_vps`) every few seconds until they settle; on a failed deploy read `get_deployment_logs` and explain the cause.
|
|
25
25
|
4. **Secrets**: never print passwords, API keys or secret variable values unless the user asks. Store app secrets as secret variables, never in code.
|
|
@@ -11,9 +11,9 @@ Follow the `helipod` skill rules. A VPS is prepaid per period: creating one char
|
|
|
11
11
|
|
|
12
12
|
1. `list_vps_plans` → present 2 or 3 fitting plans with CPU, RAM, disk and `effectiveMonthly` (IDR). Note `osTemplates`.
|
|
13
13
|
2. `list_projects` → the project it belongs to (required).
|
|
14
|
-
3. Confirm with the user: plan, OS, billing period (`monthly`, `3month`, `6month`, `yearly`) and
|
|
14
|
+
3. `create_vps` with `dryRun: true` → the exact `price` and `walletBalanceAfter` (nothing is charged). Confirm with the user: plan, OS, billing period (`monthly`, `3month`, `6month`, `yearly`) and that price. Pass `autoRenew: false` if they want to renew by hand.
|
|
15
15
|
4. Generate a strong password (12 to 30 chars, upper, lower, digit, one of `!@#$%^*`) unless the user gives one; do not print it back unless asked.
|
|
16
|
-
5. `create_vps` → poll `get_vps` every 10 s until `running` (a few minutes) or `error` (`lastJobError` says why; a failed create is refunded).
|
|
16
|
+
5. `create_vps` again without `dryRun`, with an `idempotencyKey` (reuse it if you retry) → poll `get_vps` every 10 s until `running` (a few minutes) or `error` (`lastJobError` says why; a failed create is refunded).
|
|
17
17
|
6. Login: `get_vps_credentials` (Linux: `ssh root@<ip>`; Windows: RDP as Administrator, port 3389).
|
|
18
18
|
|
|
19
19
|
## Manage
|
|
@@ -22,7 +22,7 @@ Follow the `helipod` skill rules. A VPS is prepaid per period: creating one char
|
|
|
22
22
|
- Firewall: `list_firewall_rules`, `add_firewall_rules` (e.g. `{ "Protocol": "TCP", "Port": "443", "CidrBlock": "0.0.0.0/0", "Action": "ACCEPT" }`), `remove_firewall_rules` by id. Never remove the SSH rule (port 22) without asking.
|
|
23
23
|
- Snapshots: `create_snapshot` before risky changes; `apply_snapshot` rolls the disk back (data after it is lost: confirm).
|
|
24
24
|
- Reinstall: `reinstall_vps` wipes the disk: confirm explicitly.
|
|
25
|
-
- Billing: `
|
|
25
|
+
- Billing: `renew_vps` / `upgrade_vps` with `dryRun: true` first (price and wallet after), wait for the user's yes, then the real call with an `idempotencyKey`. `get_vps_renewal_options` lists every period; `upgrade_vps` charges the difference and restarts. Auto-renew: `set_vps_auto_renew` (on or off; `toggle_vps_auto_renew` flips it).
|
|
26
26
|
- Terminate: `terminate_vps` is permanent, no refund: confirm explicitly.
|
|
27
27
|
|
|
28
28
|
## Migrate a server to Helipod (free)
|