whm_terminate_account
Permanently delete a cPanel account and all its data from a WHM server. Requires confirmation to avoid accidental removal.
Instructions
⚠️ PERMANENTLY DELETE a cPanel account and all its data
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Account alias from accounts.json (use list_accounts to see options) | |
| username | Yes | ||
| confirm | Yes | Must be true to confirm deletion |
Implementation Reference
- src/tools.py:149-161 (registration)Registration of the 'whm_terminate_account' tool with schema requiring 'account', 'username', and 'confirm' (boolean) parameters. Description warns it permanently deletes a cPanel account and all its data.
Tool( name="whm_terminate_account", description="⚠️ PERMANENTLY DELETE a cPanel account and all its data", inputSchema={ "type": "object", "properties": { **ACCOUNT_PARAM, "username": {"type": "string"}, "confirm": {"type": "boolean", "description": "Must be true to confirm deletion"} }, "required": ["account", "username", "confirm"] } ), - src/tools.py:459-462 (handler)Handler for whm_terminate_account. Checks if 'confirm' is truthy; if not, returns error. Otherwise calls the WHM 'removeacct' API endpoint with the username parameter to permanently delete the account.
case "whm_terminate_account": if not args.get("confirm"): return {"error": "You must set confirm=true to permanently delete an account. This is irreversible."} return await _get(client, url("removeacct"), headers, {"user": args["username"]}) - src/tools.py:25-31 (helper)Shared helper that constructs WHM API Authorization headers using the account token and user.
def _headers(account: dict) -> dict: token = account["token"] user = account.get("user", "root") return { "Authorization": f"whm {user}:{token}", "Content-Type": "application/json" } - src/tools.py:34-40 (helper)Shared async HTTP GET helper used to make the API call to WHM's removeacct endpoint.
async def _get(client: httpx.AsyncClient, url: str, headers: dict, params: dict = None) -> dict: try: r = await client.get(url, headers=headers, params=params or {}) r.raise_for_status() return r.json() except Exception as e: return {"error": str(e)} - src/server.py:47-69 (registration)Server call_tool handler that dispatches 'whm_*' tools to handle_whm_tool, which routes to the whm_terminate_account case.
@app.call_tool() async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent]: log.info(f"Tool called: {name} | Args: {json.dumps(arguments)}") if name == "list_accounts": accounts = load_accounts() result = [ {"alias": a, "host": cfg["host"], "type": cfg.get("type","whm")} for a, cfg in accounts.items() ] return [TextContent(type="text", text=json.dumps(result, indent=2))] account_alias = arguments.get("account") if not account_alias: return [TextContent(type="text", text="ERROR: 'account' parameter is required. Use list_accounts to see available accounts.")] account = get_account(account_alias) if not account: return [TextContent(type="text", text=f"ERROR: Account '{account_alias}' not found. Use list_accounts to see configured accounts.")] async with httpx.AsyncClient(verify=False, timeout=30) as client: if name.startswith("whm_"): result = await handle_whm_tool(client, account, name, arguments)