helipod-mcp 0.5.1 → 0.5.2

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 CHANGED
@@ -198,7 +198,7 @@ Pick your agents when asked (or pass `-a codex cursor gemini-cli opencode -y`).
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
199
  | Account | wallet and transactions, 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
- | Other | `helipod_request` for any other documented endpoint |
201
+ | Other | `helipod_api_get` to read any other documented endpoint (read only) |
202
202
 
203
203
  Each tool is marked read-only, write or destructive, so clients can ask before running the risky ones. Calls that cost money support a dry run, and the server tells the agent to show the price and wait for your OK.
204
204
 
package/dist/http.js CHANGED
@@ -35673,7 +35673,7 @@ function register(server, api2, defs) {
35673
35673
  annotations: {
35674
35674
  title: d.title,
35675
35675
  readOnlyHint: d.kind === "read",
35676
- destructiveHint: d.kind === "destructive",
35676
+ destructiveHint: d.kind !== "read",
35677
35677
  idempotentHint: d.kind === "read" || !!d.idempotent,
35678
35678
  openWorldHint: true
35679
35679
  }
@@ -37958,16 +37958,14 @@ var aiTools = [
37958
37958
  var API_PREFIXES = ["/containers/", "/databases", "/vps", "/backup/", "/domains", "/account/", "/ai/"];
37959
37959
  var generalTools = [
37960
37960
  defineTool({
37961
- name: "helipod_request",
37962
- title: "Call any Helipod API endpoint",
37963
- kind: "destructive",
37964
- description: "Call an endpoint that has no dedicated tool, as documented at https://docs.helipod.io. api=core for the Container, Database, VPS, Domain, Account and AI APIs (paths like /vps/{id}/backup, /account/wallet, /ai/usage), api=email for the Email API (paths like /broadcasts). Prefer the dedicated tools; ask the user before any call that costs money or deletes something.",
37961
+ name: "helipod_api_get",
37962
+ title: "Read any Helipod API endpoint",
37963
+ kind: "read",
37964
+ description: "GET an endpoint of the Helipod public API that has no dedicated read tool (Helipod API reference: https://docs.helipod.io/docs/helipod). api=core for the Container, Database, VPS, Domain, Account and AI APIs (paths like /vps/{id}/backup/runs, /account/wallet, /ai/usage), api=email for the Email API (paths like /broadcasts). Read only: it never changes anything.",
37965
37965
  input: {
37966
37966
  api: exports_external.enum(["core", "email"]),
37967
- method: exports_external.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]),
37968
- path: exports_external.string().regex(/^\/[A-Za-z0-9/_.\-:]*$/).describe("Path after the base URL, e.g. /vps/abc/backup"),
37969
- query: exports_external.record(exports_external.string(), exports_external.string()).optional(),
37970
- body: exports_external.record(exports_external.string(), exports_external.any()).optional()
37967
+ path: exports_external.string().regex(/^\/[A-Za-z0-9/_.\-:]*$/).describe("Path after the base URL, e.g. /vps/abc/backup/runs"),
37968
+ query: exports_external.record(exports_external.string(), exports_external.string()).optional()
37971
37969
  },
37972
37970
  run: (a, api2) => {
37973
37971
  if (a.path.includes(".."))
@@ -37975,15 +37973,15 @@ var generalTools = [
37975
37973
  if (a.api === "core") {
37976
37974
  if (!API_PREFIXES.some((p) => a.path.startsWith(p)))
37977
37975
  throw new Error(`Core API paths start with one of: ${API_PREFIXES.join(", ")}`);
37978
- return api2.api(a.method, a.path, { query: a.query, body: a.body });
37976
+ return api2.api("GET", a.path, { query: a.query });
37979
37977
  }
37980
- return api2.email(a.method, a.path, { query: a.query, body: a.body });
37978
+ return api2.email("GET", a.path, { query: a.query });
37981
37979
  }
37982
37980
  })
37983
37981
  ];
37984
37982
 
37985
37983
  // src/server.ts
37986
- var VERSION = "0.5.1";
37984
+ var VERSION = "0.5.2";
37987
37985
  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.
37988
37986
  - 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) cover the AI gateway.
37989
37987
  - 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): 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
@@ -34818,7 +34818,7 @@ function register(server, api2, defs) {
34818
34818
  annotations: {
34819
34819
  title: d.title,
34820
34820
  readOnlyHint: d.kind === "read",
34821
- destructiveHint: d.kind === "destructive",
34821
+ destructiveHint: d.kind !== "read",
34822
34822
  idempotentHint: d.kind === "read" || !!d.idempotent,
34823
34823
  openWorldHint: true
34824
34824
  }
@@ -37103,16 +37103,14 @@ var aiTools = [
37103
37103
  var API_PREFIXES = ["/containers/", "/databases", "/vps", "/backup/", "/domains", "/account/", "/ai/"];
37104
37104
  var generalTools = [
37105
37105
  defineTool({
37106
- name: "helipod_request",
37107
- title: "Call any Helipod API endpoint",
37108
- kind: "destructive",
37109
- description: "Call an endpoint that has no dedicated tool, as documented at https://docs.helipod.io. api=core for the Container, Database, VPS, Domain, Account and AI APIs (paths like /vps/{id}/backup, /account/wallet, /ai/usage), api=email for the Email API (paths like /broadcasts). Prefer the dedicated tools; ask the user before any call that costs money or deletes something.",
37106
+ name: "helipod_api_get",
37107
+ title: "Read any Helipod API endpoint",
37108
+ kind: "read",
37109
+ description: "GET an endpoint of the Helipod public API that has no dedicated read tool (Helipod API reference: https://docs.helipod.io/docs/helipod). api=core for the Container, Database, VPS, Domain, Account and AI APIs (paths like /vps/{id}/backup/runs, /account/wallet, /ai/usage), api=email for the Email API (paths like /broadcasts). Read only: it never changes anything.",
37110
37110
  input: {
37111
37111
  api: exports_external.enum(["core", "email"]),
37112
- method: exports_external.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]),
37113
- path: exports_external.string().regex(/^\/[A-Za-z0-9/_.\-:]*$/).describe("Path after the base URL, e.g. /vps/abc/backup"),
37114
- query: exports_external.record(exports_external.string(), exports_external.string()).optional(),
37115
- body: exports_external.record(exports_external.string(), exports_external.any()).optional()
37112
+ path: exports_external.string().regex(/^\/[A-Za-z0-9/_.\-:]*$/).describe("Path after the base URL, e.g. /vps/abc/backup/runs"),
37113
+ query: exports_external.record(exports_external.string(), exports_external.string()).optional()
37116
37114
  },
37117
37115
  run: (a, api2) => {
37118
37116
  if (a.path.includes(".."))
@@ -37120,15 +37118,15 @@ var generalTools = [
37120
37118
  if (a.api === "core") {
37121
37119
  if (!API_PREFIXES.some((p) => a.path.startsWith(p)))
37122
37120
  throw new Error(`Core API paths start with one of: ${API_PREFIXES.join(", ")}`);
37123
- return api2.api(a.method, a.path, { query: a.query, body: a.body });
37121
+ return api2.api("GET", a.path, { query: a.query });
37124
37122
  }
37125
- return api2.email(a.method, a.path, { query: a.query, body: a.body });
37123
+ return api2.email("GET", a.path, { query: a.query });
37126
37124
  }
37127
37125
  })
37128
37126
  ];
37129
37127
 
37130
37128
  // src/server.ts
37131
- var VERSION = "0.5.1";
37129
+ var VERSION = "0.5.2";
37132
37130
  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.
37133
37131
  - 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) cover the AI gateway.
37134
37132
  - 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): 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
@@ -34925,7 +34925,7 @@ function register(server, api2, defs) {
34925
34925
  annotations: {
34926
34926
  title: d.title,
34927
34927
  readOnlyHint: d.kind === "read",
34928
- destructiveHint: d.kind === "destructive",
34928
+ destructiveHint: d.kind !== "read",
34929
34929
  idempotentHint: d.kind === "read" || !!d.idempotent,
34930
34930
  openWorldHint: true
34931
34931
  }
@@ -37210,16 +37210,14 @@ var aiTools = [
37210
37210
  var API_PREFIXES = ["/containers/", "/databases", "/vps", "/backup/", "/domains", "/account/", "/ai/"];
37211
37211
  var generalTools = [
37212
37212
  defineTool({
37213
- name: "helipod_request",
37214
- title: "Call any Helipod API endpoint",
37215
- kind: "destructive",
37216
- description: "Call an endpoint that has no dedicated tool, as documented at https://docs.helipod.io. api=core for the Container, Database, VPS, Domain, Account and AI APIs (paths like /vps/{id}/backup, /account/wallet, /ai/usage), api=email for the Email API (paths like /broadcasts). Prefer the dedicated tools; ask the user before any call that costs money or deletes something.",
37213
+ name: "helipod_api_get",
37214
+ title: "Read any Helipod API endpoint",
37215
+ kind: "read",
37216
+ description: "GET an endpoint of the Helipod public API that has no dedicated read tool (Helipod API reference: https://docs.helipod.io/docs/helipod). api=core for the Container, Database, VPS, Domain, Account and AI APIs (paths like /vps/{id}/backup/runs, /account/wallet, /ai/usage), api=email for the Email API (paths like /broadcasts). Read only: it never changes anything.",
37217
37217
  input: {
37218
37218
  api: exports_external.enum(["core", "email"]),
37219
- method: exports_external.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]),
37220
- path: exports_external.string().regex(/^\/[A-Za-z0-9/_.\-:]*$/).describe("Path after the base URL, e.g. /vps/abc/backup"),
37221
- query: exports_external.record(exports_external.string(), exports_external.string()).optional(),
37222
- body: exports_external.record(exports_external.string(), exports_external.any()).optional()
37219
+ path: exports_external.string().regex(/^\/[A-Za-z0-9/_.\-:]*$/).describe("Path after the base URL, e.g. /vps/abc/backup/runs"),
37220
+ query: exports_external.record(exports_external.string(), exports_external.string()).optional()
37223
37221
  },
37224
37222
  run: (a, api2) => {
37225
37223
  if (a.path.includes(".."))
@@ -37227,15 +37225,15 @@ var generalTools = [
37227
37225
  if (a.api === "core") {
37228
37226
  if (!API_PREFIXES.some((p) => a.path.startsWith(p)))
37229
37227
  throw new Error(`Core API paths start with one of: ${API_PREFIXES.join(", ")}`);
37230
- return api2.api(a.method, a.path, { query: a.query, body: a.body });
37228
+ return api2.api("GET", a.path, { query: a.query });
37231
37229
  }
37232
- return api2.email(a.method, a.path, { query: a.query, body: a.body });
37230
+ return api2.email("GET", a.path, { query: a.query });
37233
37231
  }
37234
37232
  })
37235
37233
  ];
37236
37234
 
37237
37235
  // src/server.ts
37238
- var VERSION = "0.5.1";
37236
+ var VERSION = "0.5.2";
37239
37237
  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.
37240
37238
  - 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) cover the AI gateway.
37241
37239
  - 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): 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,6 +1,6 @@
1
1
  {
2
2
  "name": "helipod-mcp",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "MCP server for Helipod: containers, databases, VPS, domains and email from Claude Code, Codex, Cursor and other AI tools.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -25,4 +25,4 @@ Follow the `helipod` skill rules. A VPS is prepaid per period: creating one char
25
25
  - Billing: `get_vps_renewal_options` → `renew_vps`; `upgrade_vps` to a larger plan (charges the difference, restarts); `toggle_vps_auto_renew`.
26
26
  - Terminate: `terminate_vps` is permanent, no refund: confirm explicitly.
27
27
 
28
- Backups (paid add-on) and anything else: `helipod_request` with paths from https://docs.helipod.io/docs/vps-api
28
+ Backups (paid add-on) have dedicated tools; to read anything else use `helipod_api_get` with paths from https://docs.helipod.io/docs/vps-api