Odel
WHMCS MCP Server

WHMCS MCP Server

Local
@daddariotech2TypeScriptUpdated Today

Connect Claude, ChatGPT, and Cursor to live WHMCS over MCP.

WHMCS MCP Server

The first production-grade AI integration for WHMCS. Connect ChatGPT, Claude, and Cursor directly to your WHMCS installation — manage clients, invoices, tickets, and services through natural language.

You: "Send a payment reminder to all clients with overdue invoices over $50"
AI:  Fetching overdue invoices... Found 12. Sending reminder emails... Done.

License Docker MCP


Prerequisites — WHMCS API Setup

Before running the installer you need a WHMCS API credential with the right permissions.

1. Create an API Role

In WHMCS Admin: Setup → Staff Management → API Roles → Add Role

Choose a permission preset based on how much you trust the AI:

Minimum permissions (read-only — AI can look but not touch): GetClients GetClientsDetails GetClientsProducts GetClientsDomains GetClientsAddons GetClientGroups GetContacts GetEmails GetInvoice GetInvoices GetOrders GetOrderStatuses GetProducts GetTicket GetTickets GetSupportDepartments GetQuotes GetCredits GetTransactions GetStats GetActivityLog GetCancelledPackages GetEmailTemplates GetCurrencies GetPaymentMethods GetHealthStatus GetProductGroups GetRegistrars GetServers GetAffiliates GetAnnouncements GetSupportStatuses GetTicketCounts GetTicketPredefinedCats GetAdminUsers GetToDoItems GetToDoItemStatuses GetStaffOnline DomainWhois DomainGetNameservers DomainGetLockingStatus GetTLDPricing GetPromotions GetProjects GetProject

Maximum permissions (full access — AI can take any action): Everything above, plus: AddClient UpdateClient AddClientNote AddContact UpdateContact CreateInvoice AddInvoicePayment AddOrder AcceptOrder CancelOrder OpenTicket AddTicketReply UpdateTicket CreateQuote UpdateQuote SendQuote AcceptQuote DeleteQuote AddCredit ApplyCredit AddBillableItem SendEmail UpdateClientProduct ModuleSuspend ModuleUnsuspend ModuleTerminate ModuleCreate UpgradeProduct DomainRegister DomainTransfer DomainRenew DomainUpdateNameservers DomainUpdateLockingStatus DomainToggleIdProtect FraudOrder PendingOrder UpdateInvoice ModuleChangePw LogActivity AddTicketNote AffiliateActivate CreateProject UpdateProject AddProjectTask UpdateProjectTask DeleteProjectTask AddProjectMessage StartTaskTimer EndTaskTimer

Project Management tools: list_projects through end_task_timer additionally require the WHMCS Project Management addon to be active (Setup → Addon Modules), regardless of API role permissions.

Domain write permissions: register_domain, transfer_domain, and renew_domain require DomainRegister, DomainTransfer, and DomainRenew respectively. Note the Domain prefix comes first — RegisterDomain / TransferDomain / RenewDomain are not valid WHMCS permission keys and are silently ignored if granted. If a domain tool returns HTTP 403, the matching permission is missing from your role. Upgrading from 2.3.1 or earlier? See the 2.3.2 changelog entry — you need to re-grant these three under their correct names.

Tip: Start with minimum permissions and add write permissions only as needed. This limits blast radius if an AI client goes rogue or gets a bad prompt.

2. Set an API Access Key (recommended)

An Access Key bypasses IP restrictions entirely — the recommended approach since the MCP server's outbound IP can change (Docker restarts, server moves, etc.).

Add this line to your configuration.php in the WHMCS root:

$api_access_key = 'your-secret-passphrase';

Allowed characters: letters, numbers, and ! @ # $ % . ( ) * [ ] - _

Then set WHMCS_ACCESS_KEY to the same value in your .env or Portainer stack.

3. Create an API Credential

Setup → Staff Management → API Credentials → Generate New Credential

  • Role: select the role you just created
  • Allowed IPs: leave blank if using an Access Key (recommended), or enter the server IP if you prefer IP-based restrictions
  • Copy the Identifier and Secret — you'll need these during install

Quick Start — running in under 5 minutes

Binary (no Docker required):

curl -fsSL https://daddar.io/whmcs-mcp/install.sh | sudo bash

Prompts for your WHMCS credentials and license key, installs the binary to /usr/local/bin, and registers a systemd service.

Docker (recommended for servers already running Docker):

curl -fsSL https://daddar.io/whmcs-mcp/install-docker.sh | bash

Prompts for credentials, writes .env, and starts the stack via Docker Compose.


Get a License

Purchase a license at daddar.io/store/ai-tools/whmcs-mcp — after checkout, your license key appears in the client portal. Paste it into setup.sh when prompted.

No license? A 14-day free trial starts automatically on first run.


What You Can Do

96 WHMCS Tools

CategoryTools
Clientsget_client list_clients add_client update_client get_client_details get_client_groups get_client_emails get_client_domains get_client_addons add_client_note
Invoicesget_invoice list_invoices create_invoice add_invoice_payment get_overdue_invoices get_transactions update_invoice
Ordersadd_order get_orders accept_order cancel_order get_order_statuses fraud_order pending_order
Serviceslist_services update_service upgrade_product module_create module_suspend module_unsuspend module_terminate get_cancelled_packages
Ticketsget_ticket list_tickets open_ticket add_ticket_reply update_ticket get_support_departments add_ticket_note get_support_statuses get_ticket_counts get_ticket_predefined_categories
Quotesget_quotes create_quote send_quote accept_quote update_quote delete_quote
Contactsget_contacts add_contact update_contact
Creditsget_credits add_credit apply_credit
Billingadd_billable_item get_payment_methods get_currencies
Emailsend_email get_email_templates
Productsget_products get_product_groups
Domainsregister_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
Adminget_admin_users get_staff_online get_whmcs_details log_activity get_activity_log
Affiliatesget_affiliates activate_affiliate
Promotionsget_promotions
Serversget_servers module_change_password
Systemget_health_status get_todo_items get_todo_item_statuses get_announcements get_registrars get_stats
Reportsget_stats get_activity_log get_transactions
Projectslist_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 — requires the WHMCS Project Management addon to be active

All tools support dryRun mode — preview what would happen before making changes.

24 Real-Time Resources

Resources are read-only data endpoints that AI clients can subscribe to via whmcs:// URIs. Data is served from a 60-second TTL cache.

URIDescription
whmcs://statsLive system statistics (revenue, client counts, invoice totals)
whmcs://healthServer health status
whmcs://system/infoWHMCS installation details (version, PHP, database)
whmcs://productsFull product and service catalog
whmcs://product-groupsProduct groups with product counts
whmcs://tld-pricingDomain TLD registration/transfer/renewal pricing
whmcs://promotionsActive promotions and coupon codes
whmcs://order-statusesAvailable order status values
whmcs://currenciesConfigured currencies with exchange rates
whmcs://payment-methodsActive payment gateway modules
whmcs://registrarsConfigured domain registrar modules
whmcs://serversProvisioning servers
whmcs://client-groupsClient group definitions
whmcs://affiliatesRegistered affiliate accounts
whmcs://email-templatesEmail template library
whmcs://announcementsPublished announcements
whmcs://support/departmentsSupport departments
whmcs://support/statusesAvailable ticket status values
whmcs://support/ticket-countsTicket counts by department and status
whmcs://support/predefined-categoriesPredefined ticket reply categories
whmcs://admin/usersAdmin user accounts
whmcs://admin/todoAdmin to-do items
whmcs://admin/todo-statusesAvailable to-do item status values
whmcs://admin/staff-onlineStaff currently logged into the admin area

18 Workflow Prompts

Prompts are pre-built workflow templates that MCP clients surface as one-click guided interactions.

PromptDescription
new_clientGuided new client account creation
new_orderPlace and accept a product order for a client
new_invoiceCreate a custom invoice with optional send
new_quoteDraft a sales quote with send/accept lifecycle
ticket_responseLoad a ticket, draft a professional staff reply
client_onboardingFull account onboarding review checklist
fraud_investigationSecurity audit for a suspicious order
bulk_invoice_reminderFind overdue invoices and send payment reminders
revenue_reportMRR + outstanding + paid financial breakdown
client_health_checkDeep account scorecard (services, billing, support)
domain_expiry_auditFlag at-risk domains, draft renewal reminders
new_product_setupStep-by-step product configuration guide
churn_risk_reportRanked churn-risk table with recommended actions
support_queue_triagePriority-ordered ticket queue with quick-win suggestions
affiliate_performanceTop performers, commissions, activation gaps
service_renewal_forecastN-month renewal revenue projection
addon_upsell_opportunitiesMissing add-on detection + upsell quote generation
promo_effectivenessPromo code usage, revenue impact, and expiry analysis

vs other WHMCS MCP servers

FeatureWHMCS MCP Server (us)scarecr0w12/whmcs-mcp-toolMX Modules
Tools86~50~20
HTTP transport (ChatGPT, Claude remote)YesNo — stdio onlyYes
AuthenticationOAuth 2.0 PKCE + bearer tokensNoneStatic tokens only
One-click installYes (curl | bash)Manual (clone + npm)Manual
Real-time webhook pushYesNoNo
Audit logYesNoNo
Prometheus metricsYesNoNo
Rate limitingYesNoNo
dryRun mode on every toolYesNoNo
Trial period14 days freeFree forever (MIT)None
Commercial supportYesNoneLimited
LicenseCommercialMITCommercial

Supported AI Clients

ClientTransportAuth
ChatGPT (via GPT Actions)HTTPBearer token or OAuth 2.0
Claude DesktopHTTPBearer token or OAuth 2.0
Cursor IDEstdio or HTTPBearer token or OAuth 2.0
Any MCP-compatible clientHTTPBearer token or OAuth 2.0

Security

  • OAuth 2.0 PKCE — industry-standard authorization with short-lived tokens and refresh
  • Bearer token mode — simple API key setup for single-tenant deployments
  • Rate limiting — per-IP and per-token controls (configurable)
  • Audit log — every authenticated request logged with client ID, method, and timestamp
  • Helmet.js — security headers (CSP, HSTS, X-Frame-Options, etc.)
  • Input sanitization — defense-in-depth against injection
  • HTTPS enforcement — rejects plain HTTP in production
  • Docker secrets — credentials read from /run/secrets/ if present

Configuration

Environment Variables

Copy .env.example to .env and fill in your values.

Required:

VariableDescription
WHMCS_API_URLYour WHMCS URL, e.g. https://billing.example.com
WHMCS_IDENTIFIERWHMCS API identifier
WHMCS_SECRETWHMCS API secret

License:

VariableDescriptionDefault
LICENSE_KEYYour license key from daddar.io(14-day free trial starts automatically)

Authentication:

VariableDescriptionDefault
MCP_OAUTH_ADMIN_PASSWORDEnables the /authorize consent UI for OAuth PKCE flows(unset — consent UI disabled)
MCP_OAUTH_SESSION_SECRETSecret used to sign OAuth CSRF session cookies. Generate with openssl rand -hex 32.(auto-generated ephemeral — set this in production)
MCP_AUTH_TOKENS_FILEPath to bearer token store/app/data/tokens.json

Note (v2.1.0): MCP_AUTH_MODE and MCP_REQUIRE_AUTH have been removed. The server always runs the full auth stack — bearer tokens and OAuth are both available in every configuration. Auth is always enforced in HTTP mode.

Network / proxy:

VariableDescriptionDefault
MCP_TRUST_PROXYSet to true when the server runs behind a TLS-terminating reverse proxy (Traefik, nginx, etc.). Enables X-Forwarded-* header trust for correct IP detection and HTTPS enforcement.false (changed in v2.2.0 — set explicitly in production)

Observability (optional):

VariableDescriptionDefault
MCP_METRICS_ENABLEDEnable Prometheus metrics endpointtrue
MCP_METRICS_PORTPort for /metrics endpoint9090
PUSHGATEWAY_URLPrometheus Pushgateway URL for metric push(unset)
PUSHGATEWAY_USERHTTP Basic Auth username for Pushgateway(unset)
PUSHGATEWAY_PASSWORDHTTP Basic Auth password for Pushgateway(unset)

Webhooks (optional):

VariableDescription
WHMCS_WEBHOOK_SECRETHMAC secret shared with your WHMCS PHP hook

See .env.example for all options.


Connecting AI Clients

Cursor IDE

Bearer token (simple): Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "whmcs": {
      "url": "https://your-server:3100/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN"
      }
    }
  }
}

OAuth (New App UI): When adding via Cursor's "New App" with OAuth, the server must have MCP_CLIENT_REGISTRATION_SECRET set (in Portainer or .env). Generate with openssl rand -hex 24, set it on the server, then enter the same value in Cursor's Advanced OAuth settings under "Client registration secret" (or equivalent). This enables Dynamic Client Registration so Cursor can self-register.

Or for local stdio mode:

{
  "mcpServers": {
    "whmcs": {
      "command": "node",
      "args": ["/path/to/whmcs-mcp/dist/index.js"],
      "env": {
        "WHMCS_API_URL": "https://your-whmcs.example.com",
        "WHMCS_IDENTIFIER": "your-identifier",
        "WHMCS_SECRET": "your-secret"
      }
    }
  }
}

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "whmcs": {
      "url": "https://your-server:3100/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN"
      }
    }
  }
}

ChatGPT (GPT Actions)

Point your GPT Action schema at https://your-server:3100/mcp. Use OAuth 2.0 mode for multi-user setups.


Real-Time Webhook Push

Receive WHMCS events pushed to your AI in real time — new tickets, invoices, overdue payments.

See docs/WEBHOOKS.md for setup instructions.


Deployment

Docker Compose (recommended)

docker compose -f docker-compose.marketplace.yml up -d

Generates tokens:

docker exec -it whmcs-mcp node dist/scripts/auth-cli.js generate \
  --name "My AI" --scopes "mcp:read,mcp:write"

Kubernetes

See k8s-deployment.yaml and DEPLOYMENT.md.

Behind a Reverse Proxy (nginx / Caddy / Traefik)

Remove the ports block from docker-compose.marketplace.yml and proxy to whmcs-mcp:3100. See comments in that file.


Observability

  • Health check: GET /health
  • Readiness: GET /ready
  • Prometheus metrics: port 9090 (configurable via MCP_METRICS_PORT)

Key metrics: whmcs_mcp_requests_total, whmcs_mcp_request_duration_seconds, whmcs_mcp_active_sessions, whmcs_mcp_auth_total


Support & Licensing

Copyright © 2026 Daddario Tech Solutions. All rights reserved. See LICENSE.