Added
create_producttool. Creates a new product/package in the WHMCS product catalog viaAddProduct. Acceptsnameandgid(required) plus optionaltype,paytype,description,hidden,showdomainoptions,welcomeemail,stockcontrol,qty,module, and apricingarray of{ currencyId, billingCycle, price }entries. SupportsdryRun=trueto preview without creating. Total tool count is now 98.
Added
update_domain_donotrenewtool. Sets or clears the do-not-renew flag on a WHMCS domain viaUpdateClientDomain. Acceptsdomainidor domain name; the ID is resolved automatically when only the name is supplied. SupportsdryRun=true. Total tool count is now 97.
Fixed / Extended
- v2.3.4 —
update_clientnow acceptscompanyname,notes, andcustomfields(same encoding asadd_client).register_domainnow accepts an existingdomainidfor retrying WHMCSDomainRegisterafter CIRA additional fields are saved. - v2.3.3 —
add_clientacceptscustomfields,companyname, andnotes, resolving WHMCS rejections when required custom fields (e.g. B2B/B2C) are missing.add_orderacceptsdomainFieldsfor per-domain TLD extras needed for.caregistrations at Enom. - v2.3.2 — domain action names corrected.
register_domain,transfer_domain, andrenew_domainwere calling non-existent WHMCS actions (RegisterDomain,TransferDomain,RenewDomain). All three now send the correctDomainRegister,DomainTransfer, andDomainRenewforms. Action required: update your WHMCS API role to grant the corrected permission names.
Fixed
start_task_timerparameter name corrected — WHMCS 9.x expectstaskid; the tool was sendingtimerid, causing "Task ID Not Set" errors. The client now sends both for cross-version compatibility. Tool input renamedtimerId→taskId.end_task_timerdocs clarified —timerIdis the timelog entry ID created bystart_task_timer, not the task ID.
Added
- 10 Project Management tools — full coverage of the WHMCS Project Management addon API (addon must be active):
list_projects,get_project,create_project,update_project,add_project_task,update_project_task,delete_project_task,add_project_message,start_task_timer,end_task_timer. Total tool count is now 96.
Added
adminUsernameonopen_ticket— optional field that attributes the ticket to a staff member rather than the client.- Multi-line invoice support on
create_invoice— new optionalitems[]array (up to 50 entries, each withdescription,amount, optionaltaxed) maps to WHMCS numbered line-item fields. The legacy single-item fields remain fully backward-compatible.
Fixed
phpSerializebyte-length fix — thes:length field now uses the byte length of the original string, not the escaped copy. Strings with\,", or null bytes previously produced incorrect lengths and failed to deserialize in WHMCS.- Input validation added to
create_invoice,update_client,get_ticket, andadd_ticket_note— each now returns a validation error when no usable identifier is provided.
Security
- Pushgateway credentials externalized — configure via
PUSHGATEWAY_URL,PUSHGATEWAY_USER, andPUSHGATEWAY_PASSWORDenv vars. - CIMD SSRF protection — the auto-fetch now blocks RFC1918, loopback, link-local, and IPv6 internal addresses.
- OAuth consent page XSS fix — scope tokens are HTML-escaped before rendering.
- IP rate limiter extended to
/token,/authorize, and/registerOAuth endpoints. MCP_TRUST_PROXYdefault changed tofalse— set totrueexplicitly when behind a TLS-terminating proxy. Official Docker Compose stack is unaffected.
Added
- 30 new tools — domain management (
register_domain,transfer_domain,renew_domain,get_domain_whois,get_domain_nameservers,update_domain_nameservers,get_domain_lock_status,update_domain_lock_status,get_tld_pricing), admin (get_admin_users,get_staff_online,get_whmcs_details,log_activity), affiliates (get_affiliates,activate_affiliate), promotions (get_promotions), servers (get_servers,module_change_password), system info, support, orders, and invoices. Total tool count is now 86. - 24 MCP resources for real-time, read-only access to system data via
whmcs://URIs with a 60-second TTL cache. - 18 MCP workflow prompts for guided AI interactions — client onboarding, fraud investigation, revenue reports, churn risk, domain audits, and more.
overideautosuspendflag onupdate_serviceto exempt a service from automatic suspension.
Changed
- Unified auth stack —
MCP_AUTH_MODEremoved. Thesimple/oauthmode split is gone. The server now always runs the full OAuth 2.0 stack. Bearer tokens work in all configurations./authorizeis available only whenMCP_OAUTH_ADMIN_PASSWORDis set. MCP_REQUIRE_AUTHremoved. Authentication is always enforced in HTTP mode./healthresponse updated.auth.modeandauth.requiredreplaced byauth.oauthEnabled.
Migration
| Before | After |
|---|---|
MCP_AUTH_MODE=simple | Remove — bearer tokens work without it |
MCP_AUTH_MODE=oauth | Remove — keep MCP_OAUTH_ADMIN_PASSWORD |
MCP_REQUIRE_AUTH=true | Remove — auth is always on |
Existing tokens.json files are untouched — all previously issued bearer tokens continue to work.
Fixed
- dryRun response prefix normalized to
[dryRun]across all mutating tools. - XSS sanitization applied to user input echoed in dryRun responses.
get_product_groupsreimplemented to derive groups from GetProducts.- Startup warnings emitted when deprecated
MCP_AUTH_MODEorMCP_REQUIRE_AUTHenv vars are detected.
Fixed
create_invoicesent wrong client field — WHMCS CreateInvoice requiresuserid; the client was forwardingclientid.get_cancelled_packagesclient filter —clientIdargument was forwarded but the WHMCS API does not support it for this action. Tool description updated.
Fixed
list_invoices/get_overdue_invoicesclient filter ignored — WHMCS GetInvoices acceptsuserid, notclientid. Both tools now send the correct field.
Fixed
- OAuth
stateparameter missing from callback redirect — fixed two-part bug:statewas coerced to""in the consent URL, then dropped by theif (state)guard on POST. Both paths are now fixed;stateis echoed verbatim per the OAuth 2.0 spec. Required for Claude.ai Custom Connector OAuth.
Fixed
- OAuth
/tokenreturned HTTP 500 for normal grant failures —OAuthProvidernow throws properInvalidGrantErrorfor invalid/expired codes and tokens; clients receive 400 withinvalid_grant.
Fixed
- OAuth consent session cookie for cross-site POST (Claude.ai) —
connect.sidnow usesSameSite=None; Secureon HTTPS so the browser sends it on cross-site POST to/oauth/consent.
Fixed
- CSRF tokens now persisted via
express-session— previous in-memory Map was wiped on container restart. Sessions now backed bysession-file-storeon disk.
New optional env vars: MCP_OAUTH_SESSION_SECRET, MCP_OAUTH_SESSIONS_DIR.
Major production release + OAuth stabilisation
- Bearer token auth with scope-based access control (
mcp:read,mcp:write,mcp:admin) - Prometheus metrics, structured JSON logging, audit trail, Grafana dashboard
- Per-IP and per-token rate limiting
- Docker, Kubernetes, and standalone binary deployment
auth-clifor token management- OAuth discovery document and CIMD support for Claude.ai and ChatGPT
- Multiple OAuth routing and PKCE fixes (v2.0.1–v2.0.4)
Initial MCP server with core WHMCS tools, stdio and HTTP transport, dryRun mode, and basic Docker support.