@elitedcs/ghl-mcp 3.59.0 → 3.60.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.60.0 — One install for every tier, and upgrading is just the license key
4
+
5
+ A real free-tier user installed, was told "Setup complete!", asked for the
6
+ account audit every email promises — and got "Tool not found." The audit
7
+ needs a one-time browser login that was framed as optional and buried after
8
+ the success message. Worse: a free user who completed that login and then
9
+ upgraded had it silently ERASED by the upgrade itself. This release makes
10
+ the install one thing, for everyone:
11
+
12
+ - **"Complete" now means complete.** When the browser login hasn't happened
13
+ yet, setup says "Step 1 of 2 done" and names the next command
14
+ (`capture_firebase_interactive`, now available before the restart) — one
15
+ restart total, not two. The word "optional" is gone.
16
+ - **The auditor never vanishes.** Before the unlock, `audit_workflows` and
17
+ `validate_workflow` answer with 60-second finish-your-install directions
18
+ instead of not existing.
19
+ - **Upgrading is one paste.** `setup_ghl_mcp` now accepts just your email and
20
+ the new license key: the GHL credentials and Workflow Builder unlock saved
21
+ on your machine are reused and kept. (Previously, re-running setup wiped
22
+ the unlock — fixed, with tests that keep it fixed.) Supply the GHL key and
23
+ location ID only on a first-time setup, always as a pair.
24
+ - **A rejected credential update can no longer destroy a working one** — if
25
+ you re-run setup with bad Firebase values, the good saved ones stay.
26
+ - `health_check` now points at the one-click unlock and current URLs.
27
+
28
+ The free and paid tiers install identically; the license key alone decides
29
+ what unlocks. Free stays read-only; paid unlocks everything, on the same
30
+ install, with the same key-swap.
31
+
3
32
  ## 3.59.0 — One-command install: `npx -y @elitedcs/ghl-mcp cli install`
4
33
 
5
34
  The old install step said "Edit Config, paste this block." Edit Config opens a
package/README.md CHANGED
@@ -8,7 +8,7 @@ Works with **both the Claude Desktop App and Claude Code terminal** — your cho
8
8
 
9
9
  **License required.** Get it at [ghlcommand.com](https://ghlcommand.com?utm_source=npm&utm_medium=readme) — $97/mo, covering UNLIMITED GoHighLevel sub-accounts on up to 3 machines (never billed per account). **30-day time-back guarantee**: save 5+ hours on one client build or your first month back.
10
10
 
11
- **Try it FREE (read-only tier).** Grab an instant free key at [ghlcommand.com/free](https://ghlcommand.com/free?utm_source=npm&utm_medium=readme) — 107 read-only tools on your own GHL account (89 before the one-login auditor unlock): the account-wide workflow audit (`audit_workflows` finds the silently broken references GHL never warns you about), account health, and every read across contacts, pipelines, funnels, and workflows. Write tools stay visible and answer with upgrade info. Buying later with the same email upgrades your key in place — 1 machine on free, 3 when you upgrade.
11
+ **Try it FREE (read-only tier).** Grab an instant free key at [ghlcommand.com/free](https://ghlcommand.com/free?utm_source=npm&utm_medium=readme) — 107 read-only tools on your own GHL account once the two-step install is finished (the same install as the paid tier — upgrading later is just a license swap): the account-wide workflow audit (`audit_workflows` finds the silently broken references GHL never warns you about), account health, and every read across contacts, pipelines, funnels, and workflows. Write tools stay visible and answer with upgrade info. Buying later with the same email upgrades your key in place — 1 machine on free, 3 when you upgrade.
12
12
 
13
13
  **How this differs from HighLevel's official MCP.** HighLevel ships an official Anthropic MCP that reads and writes your CRM (contacts, conversations, calendars, opportunities, payments, social) over the public API — it's free and it's good; use it for that. What it *cannot* do, because the public API doesn't expose it: **build or edit workflows, build funnels/landing pages, or build forms.** That's exactly what GHL Command does — the programmatic Workflow Builder, funnel/page builder, form builder, deep workflow cloning, the silent-failure `audit_workflows`, and Blueprint (build a whole client account from one intake — ships as a guided skill that **installs itself automatically** with this package; nothing to download), all on GHL's internal APIs. **Official MCP = read/write your CRM. GHL Command = build and fix it.** They stack fine together.
14
14
 
@@ -175,7 +175,7 @@ https://app.gohighlevel.com/v2/location/YOUR_LOCATION_ID/dashboard
175
175
 
176
176
  ## Enable the Workflow Builder
177
177
 
178
- The builder + cloner + validator tools (workflow builder, funnel builder, form builder, pipeline builder, workflow cloner, validate_workflow) use GHL's internal API and require Firebase credentials. Without them, the other 179 tools work fine — you just won't have workflow/funnel/form/pipeline editing. This is the flagship feature: do this step.
178
+ The builder + cloner + validator tools (workflow builder, funnel builder, form builder, pipeline builder, workflow cloner, validate_workflow) use GHL's internal API and require Firebase credentials. Without them, the other 181 tools work fine — you just won't have workflow/funnel/form/pipeline editing. This is the flagship feature: do this step.
179
179
 
180
180
  **One-click capture (v3.49.0+, the supported path):**
181
181
 
@@ -518,7 +518,7 @@ Highlights (full guide: [`docs/HEADLESS.md`](docs/HEADLESS.md)):
518
518
  |---|---|
519
519
  | `get_mcp_version` | Check installed version against the latest published to npm. Confirms an upgrade landed after restarting Claude. Available even before GHL credentials are configured. |
520
520
  | `health_check` | Run a full health check: npm registry + version status, GHL API key validity, default location reachability, Firebase auth status, token registry presence. Use when something feels broken. |
521
- | `enable_workflow_builder` | Add Firebase credentials to an existing install to unlock 54 additional Firebase-gated tools (workflow builder, funnel builder, form builder, pipeline builder, workflow cloner, smart lists, reputation, email campaigns, email templates, memberships, validate_workflow). No need to re-enter license / API key / location ID. Run this any time after the basic setup, on the buyer's schedule. |
521
+ | `enable_workflow_builder` | Add Firebase credentials to an existing install to unlock 52 additional Firebase-gated tools (workflow builder, funnel builder, form builder, pipeline builder, workflow cloner, smart lists, reputation, email campaigns, email templates, memberships, validate_workflow). No need to re-enter license / API key / location ID. Run this any time after the basic setup, on the buyer's schedule. |
522
522
 
523
523
  ### Other Modules
524
524
 
package/dist/index.js CHANGED
@@ -1508,12 +1508,16 @@ function registerSetupTool(server2, pkgVersion) {
1508
1508
  if (pkgVersion) setupPkgVersion = pkgVersion;
1509
1509
  server2.tool(
1510
1510
  "setup_ghl_mcp",
1511
- "First-run setup for GHL Command MCP. Validates your license and GHL credentials, then writes them to a per-user credentials file. Restart Claude after this completes to load all 233 tools (179 if you skip the optional Firebase fields; add Firebase later with enable_workflow_builder). No license yet? Paid ($97/mo) at https://ghlcommand.com \u2014 or a FREE read-only key, instantly, at https://ghlcommand.com/free.",
1511
+ "First-run setup AND license upgrades for GHL Command MCP. Validates your license and GHL credentials, then writes them to a per-user credentials file; restart Claude once after it completes. UPGRADING an existing install (e.g. free key to paid)? Supply ONLY email + license_key \u2014 the GHL credentials and any Workflow Builder unlock already saved on this machine are reused and kept; do not re-enter ghl_api_key or ghl_location_id. No license yet? Paid ($97/mo) at https://ghlcommand.com \u2014 or a FREE read-only key, instantly, at https://ghlcommand.com/free.",
1512
1512
  {
1513
1513
  email: import_zod42.z.string().email().describe("Email used at purchase."),
1514
1514
  license_key: import_zod42.z.string().min(20).describe("License key from your purchase email."),
1515
- ghl_api_key: import_zod42.z.string().min(10).describe("GHL Private Integration key (starts with 'pit-'). Created INSIDE the sub-account at Settings > Integrations > Private Integrations."),
1516
- ghl_location_id: import_zod42.z.string().min(10).describe("GHL Location ID (sub-account ID). Found in your GHL URL: /location/THIS_PART/dashboard."),
1515
+ // v3.60.0: optional AS A PAIR for the one-line upgrade. Supply both, or
1516
+ // neither (reuses the pair saved on this machine). Never one alone
1517
+ // mixing a fresh key with a stale stored location (or vice versa) would
1518
+ // silently persist a mismatched tuple (Codex-agreed atomic-pair rule).
1519
+ ghl_api_key: import_zod42.z.string().min(10).optional().describe("GHL Private Integration key (starts with 'pit-'). Created INSIDE the sub-account at Settings > Integrations > Private Integrations. OMIT together with ghl_location_id to reuse the pair already saved on this machine (upgrades)."),
1520
+ ghl_location_id: import_zod42.z.string().min(10).optional().describe("GHL Location ID (sub-account ID). Found in your GHL URL: /location/THIS_PART/dashboard. OMIT together with ghl_api_key to reuse the saved pair (upgrades)."),
1517
1521
  ghl_company_id: import_zod42.z.string().optional().describe("(Agency only) Company ID for multi-location access."),
1518
1522
  // v3.25.0: one-paste shortcut. Run `auto_capture_firebase_script` first;
1519
1523
  // it returns a console script that fills the clipboard with this exact
@@ -1533,7 +1537,38 @@ function registerSetupTool(server2, pkgVersion) {
1533
1537
 
1534
1538
  Purchase a license at https://ghlcommand.com \u2014 or get a FREE read-only key instantly at https://ghlcommand.com/free. Stuck? Reply to any email from us or write support@ghlcommand.com.` }], isError: true };
1535
1539
  }
1536
- const ghl = await validateGhl(args.ghl_api_key, args.ghl_location_id);
1540
+ const priorForPair = readCredentials();
1541
+ const suppliedApiKey = args.ghl_api_key?.trim();
1542
+ const suppliedLocationId = args.ghl_location_id?.trim();
1543
+ if (suppliedApiKey && !suppliedLocationId || !suppliedApiKey && suppliedLocationId) {
1544
+ return {
1545
+ content: [{
1546
+ type: "text",
1547
+ text: "Provide BOTH ghl_api_key and ghl_location_id, or NEITHER (to reuse the pair already saved on this machine). Mixing one new value with one saved value is not allowed \u2014 they are validated and stored as a pair."
1548
+ }],
1549
+ isError: true
1550
+ };
1551
+ }
1552
+ let ghlApiKey;
1553
+ let ghlLocationId;
1554
+ let usedStoredPair = false;
1555
+ if (suppliedApiKey && suppliedLocationId) {
1556
+ ghlApiKey = suppliedApiKey;
1557
+ ghlLocationId = suppliedLocationId;
1558
+ } else if (priorForPair?.ghl_api_key && priorForPair?.ghl_location_id) {
1559
+ ghlApiKey = priorForPair.ghl_api_key;
1560
+ ghlLocationId = priorForPair.ghl_location_id;
1561
+ usedStoredPair = true;
1562
+ } else {
1563
+ return {
1564
+ content: [{
1565
+ type: "text",
1566
+ text: 'No GHL credentials supplied and none saved on this machine yet. For a first-time setup you need both:\n ghl_api_key \u2014 a Private Integration key (pit-...) created INSIDE your sub-account: Settings > Integrations > Private Integrations (click "Select all" on scopes, copy the WHOLE key)\n ghl_location_id \u2014 the part of your GHL URL after /location/\nFull walkthrough: https://ghlcommand.com/start'
1567
+ }],
1568
+ isError: true
1569
+ };
1570
+ }
1571
+ const ghl = await validateGhl(ghlApiKey, ghlLocationId);
1537
1572
  if (!ghl.ok) {
1538
1573
  emit("setup_failed", { pkgVersion: setupPkgVersion, reasonCode: ghl.reason });
1539
1574
  return { content: [{ type: "text", text: `GHL credential check failed: ${ghl.error}` }], isError: true };
@@ -1573,21 +1608,34 @@ Purchase a license at https://ghlcommand.com \u2014 or get a FREE read-only key
1573
1608
  if (!fb.ok) {
1574
1609
  workflowBuilderNote = `
1575
1610
 
1576
- Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builder. Re-run setup_ghl_mcp later with fresh Firebase fields (use auto_capture_firebase_script for a one-paste flow) to enable it.`;
1611
+ Note: Firebase credentials rejected (${fb.error}).`;
1577
1612
  } else {
1578
1613
  workflowBuilderEnabled = true;
1579
1614
  }
1580
1615
  }
1616
+ const prior = priorForPair;
1617
+ const priorFirebase = prior?.ghl_user_id && prior?.ghl_firebase_api_key && prior?.ghl_firebase_refresh_token ? {
1618
+ userId: prior.ghl_user_id,
1619
+ fbApi: prior.ghl_firebase_api_key,
1620
+ fbRefresh: prior.ghl_firebase_refresh_token
1621
+ } : null;
1622
+ const finalFirebase = workflowBuilderEnabled ? { userId: resolvedUserId.trim(), fbApi: resolvedFbApi.trim(), fbRefresh: resolvedFbRefresh.trim() } : priorFirebase;
1623
+ if (!workflowBuilderEnabled && wantsWorkflowBuilder && priorFirebase) {
1624
+ workflowBuilderNote += ` KEPT your existing working Workflow Builder credentials \u2014 nothing was lost. To refresh them later, run capture_firebase_interactive.`;
1625
+ } else if (!workflowBuilderEnabled && wantsWorkflowBuilder) {
1626
+ workflowBuilderNote += ` Saved without Workflow Builder. Run capture_firebase_interactive (one browser login) to finish the install.`;
1627
+ }
1628
+ const builderActive = finalFirebase !== null;
1581
1629
  writeCredentials({
1582
1630
  license_key: args.license_key.trim(),
1583
1631
  email: args.email.trim(),
1584
1632
  verified_at: (/* @__PURE__ */ new Date()).toISOString(),
1585
- ghl_api_key: args.ghl_api_key.trim(),
1586
- ghl_location_id: args.ghl_location_id.trim(),
1587
- ghl_company_id: args.ghl_company_id?.trim() || void 0,
1588
- ghl_user_id: workflowBuilderEnabled ? resolvedUserId?.trim() : void 0,
1589
- ghl_firebase_api_key: workflowBuilderEnabled ? resolvedFbApi?.trim() : void 0,
1590
- ghl_firebase_refresh_token: workflowBuilderEnabled ? resolvedFbRefresh?.trim() : void 0,
1633
+ ghl_api_key: ghlApiKey,
1634
+ ghl_location_id: ghlLocationId,
1635
+ ghl_company_id: args.ghl_company_id?.trim() || prior?.ghl_company_id || void 0,
1636
+ ghl_user_id: finalFirebase?.userId,
1637
+ ghl_firebase_api_key: finalFirebase?.fbApi,
1638
+ ghl_firebase_refresh_token: finalFirebase?.fbRefresh,
1591
1639
  // v3.24.0+ attestation. Tied to email + license + device fingerprint;
1592
1640
  // verified on every MCP startup. Closes the hand-crafted creds bypass.
1593
1641
  signed_attestation: lic.signedAttestation
@@ -1600,30 +1648,44 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
1600
1648
  const telemetryLine = telemetryDisabled(process.env) ? "" : `
1601
1649
 
1602
1650
  ${TELEMETRY_DISCLOSURE}`;
1603
- const toolCount = isFree ? workflowBuilderEnabled ? "107" : "89" : workflowBuilderEnabled ? "233" : "179";
1604
- const wfLine = workflowBuilderEnabled ? "Workflow Builder: enabled." : "Workflow Builder: not configured (optional).";
1605
- const wfTip = workflowBuilderEnabled ? "" : isFree ? `
1606
- Unlock the account auditor next (the free tier's best tool): say "Unlock the Workflow Builder" \u2014 one browser login enables audit_workflows, validate_workflow, and the full-detail reads.` : "\nTo enable Workflow Builder later (52 extra Firebase-gated tools): run enable_workflow_builder with your three Firebase values. No need to re-enter license/API key/location ID.";
1607
- const freeTip = isFree ? "\n\nFree tier: 107 read-only tools (89 before the one-login auditor unlock). Write tools stay visible but answer with upgrade info instead of acting. Full version ($97/mo founding rate, same key upgrades in place): https://ghlcommand.com" : "";
1651
+ const finishedCount = isFree ? "107" : "233";
1652
+ const freeTip = isFree ? `
1653
+
1654
+ Free tier: read-only. Write tools stay visible but answer with upgrade info instead of acting. Full version ($97/mo founding rate) upgrades in place \u2014 same install, you only swap the license key: https://ghlcommand.com` : "";
1655
+ const upgradeLine = usedStoredPair && prior && prior.license_key !== args.license_key.trim() ? `License updated \u2014 everything you set up before is kept.
1656
+ ` : "";
1657
+ const text = builderActive ? [
1658
+ `Setup complete!`,
1659
+ ``,
1660
+ upgradeLine + `License: verified (installs ${lic.installs})${isFree ? " \u2014 FREE read-only tier" : ""}.`,
1661
+ `GHL: connected to "${ghl.locationName}".`,
1662
+ `Workflow Builder: enabled.`,
1663
+ ``,
1664
+ `Credentials saved to: ${credentialsPath()}`,
1665
+ ``,
1666
+ `**Restart Claude once (quit fully and reopen) to load all ${finishedCount} ${isFree ? "read-only " : ""}tools.**`,
1667
+ ``,
1668
+ `After restart, try: "List my GHL contacts" \u2014 or "Audit my workflows" to find what's silently broken.${freeTip}`,
1669
+ workflowBuilderNote,
1670
+ telemetryLine
1671
+ ] : [
1672
+ `Step 1 of 2 done \u2014 one more step finishes the install.`,
1673
+ ``,
1674
+ upgradeLine + `License: verified (installs ${lic.installs})${isFree ? " \u2014 FREE read-only tier" : ""}.`,
1675
+ `GHL: connected to "${ghl.locationName}".`,
1676
+ `Credentials saved to: ${credentialsPath()}`,
1677
+ ``,
1678
+ `**Step 2 \u2014 run \`capture_firebase_interactive\` now.** A Chrome window opens; log into GHL once; the install finishes itself (about 60 seconds). It powers the account auditor${isFree ? "" : " and the workflow/funnel/form builders"} \u2014 the reason you installed this.`,
1679
+ `(No Chrome on this machine? Run \`auto_capture_firebase_script\` for the copy-paste path.)`,
1680
+ ``,
1681
+ `**Then restart Claude once** (quit fully and reopen) and all ${finishedCount} ${isFree ? "read-only " : ""}tools load. One restart total \u2014 do step 2 first.`,
1682
+ ``,
1683
+ `Checkpoint after restart: ask "Audit my workflows".${freeTip}`,
1684
+ workflowBuilderNote,
1685
+ telemetryLine
1686
+ ];
1608
1687
  return {
1609
- content: [{
1610
- type: "text",
1611
- text: [
1612
- `Setup complete!`,
1613
- ``,
1614
- `License: verified (installs ${lic.installs})${isFree ? " \u2014 FREE read-only tier" : ""}.`,
1615
- `GHL: connected to "${ghl.locationName}".`,
1616
- wfLine,
1617
- ``,
1618
- `Credentials saved to: ${credentialsPath()}`,
1619
- ``,
1620
- `**Restart Claude (quit fully and reopen) to load all ${toolCount} ${isFree ? "read-only " : ""}tools.**`,
1621
- ``,
1622
- `After restart, try: "List my GHL contacts" or "Show my pipelines".${wfTip}${freeTip}`,
1623
- workflowBuilderNote,
1624
- telemetryLine
1625
- ].join("\n")
1626
- }]
1688
+ content: [{ type: "text", text: text.join("\n") }]
1627
1689
  };
1628
1690
  }
1629
1691
  );
@@ -1631,7 +1693,7 @@ Unlock the account auditor next (the free tier's best tool): say "Unlock the Wor
1631
1693
  function registerEnableWorkflowBuilderTool(server2) {
1632
1694
  server2.tool(
1633
1695
  "enable_workflow_builder",
1634
- "Add Firebase credentials to an existing GHL Command install to unlock 54 additional tools across the internal-API modules: workflow builder (create/edit/clone/delete/publish/validate workflows, build_if_else_branch, build_goal_event, get_trigger_registry), funnel + page builder, form builder, pipeline builder, workflow cloner, smart lists, reputation, email campaigns, email templates, and memberships, plus the pre-deploy validator. On the FREE tier this same login unlocks the read-only auditor suite (audit_workflows, validate_workflow, full-detail workflow/funnel/pipeline reads). Requires you've already run setup_ghl_mcp. EASIEST PATH: run `capture_firebase_interactive` instead \u2014 a Chrome window opens, you log into GHL, zero pasting. Use THIS tool when you have JSON from `auto_capture_firebase_script` (console-paste path) to put in `firebase_paste`, or the three manual DevTools fields. Tool count goes from 179 to 233 after the next Claude restart.",
1696
+ "Add Firebase credentials to an existing GHL Command install to unlock 52 additional tools across the internal-API modules: workflow builder (create/edit/clone/delete/publish/validate workflows, build_if_else_branch, build_goal_event, get_trigger_registry), funnel + page builder, form builder, pipeline builder, workflow cloner, smart lists, reputation, email campaigns, email templates, and memberships, plus the pre-deploy validator. On the FREE tier this same login unlocks the read-only auditor suite (audit_workflows, validate_workflow, full-detail workflow/funnel/pipeline reads). Requires you've already run setup_ghl_mcp. EASIEST PATH: run `capture_firebase_interactive` instead \u2014 a Chrome window opens, you log into GHL, zero pasting. Use THIS tool when you have JSON from `auto_capture_firebase_script` (console-paste path) to put in `firebase_paste`, or the three manual DevTools fields. Tool count goes from 181 to 233 after the next Claude restart.",
1635
1697
  {
1636
1698
  // v3.25.0: one-paste path. Tool runs `auto_capture_firebase_script` to
1637
1699
  // get the console script; the script returns a JSON object that pastes
@@ -2792,7 +2854,7 @@ var require_package = __commonJS({
2792
2854
  "package.json"(exports2, module2) {
2793
2855
  module2.exports = {
2794
2856
  name: "@elitedcs/ghl-mcp",
2795
- version: "3.59.0",
2857
+ version: "3.60.0",
2796
2858
  mcpName: "io.github.drjerryrelth/ghl-command",
2797
2859
  description: "GoHighLevel MCP Server for Claude. 233 tools \u2014 full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
2798
2860
  main: "dist/index.js",
@@ -14734,7 +14796,35 @@ async function fullWorkflowCatalog(builderClient) {
14734
14796
  return { ids, rows, complete };
14735
14797
  }
14736
14798
  function registerValidatorTools(server2, client, builderClient) {
14737
- if (!builderClient) return;
14799
+ if (!builderClient) {
14800
+ const finishInstallStub = (asked) => ({
14801
+ content: [{
14802
+ type: "text",
14803
+ text: [
14804
+ `\`${asked}\` needs the one-time browser login that finishes your install (step 2 of 2).`,
14805
+ "",
14806
+ 'Say: **"Unlock the Workflow Builder"** (or run `capture_firebase_interactive`).',
14807
+ "A Chrome window opens, you log into GHL once, and the install finishes itself \u2014 about 60 seconds.",
14808
+ "Then restart Claude once, and this tool will be live.",
14809
+ "",
14810
+ "No Chrome on this machine? Run `auto_capture_firebase_script` for the copy-paste path instead."
14811
+ ].join("\n")
14812
+ }]
14813
+ });
14814
+ server2.tool(
14815
+ "validate_workflow",
14816
+ "Pre-flight ID validation for ONE deployed GHL workflow. [NEEDS INSTALL STEP 2 \u2014 run capture_firebase_interactive (one-time browser login) to activate this tool.]",
14817
+ { workflowId: import_zod52.z.string().describe("The workflow ID to validate.") },
14818
+ async () => finishInstallStub("validate_workflow")
14819
+ );
14820
+ server2.tool(
14821
+ "audit_workflows",
14822
+ "Account-wide silent-failure audit of every workflow. [NEEDS INSTALL STEP 2 \u2014 run capture_firebase_interactive (one-time browser login) to activate this tool.]",
14823
+ {},
14824
+ async () => finishInstallStub("audit_workflows")
14825
+ );
14826
+ return;
14827
+ }
14738
14828
  server2.tool(
14739
14829
  "validate_workflow",
14740
14830
  "Pre-flight ID validation for ONE deployed GHL workflow. Scans every trigger and action for references to pipelines, pipeline stages, custom fields, users, workflows, forms, calendars, and surveys; verifies each ID exists in the current location. Use BEFORE publish_workflow when a workflow was edited, or when a published workflow stops behaving. Catches the silent-failure bug where invalid IDs make GHL skip all subsequent actions. Never reports a false break \u2014 anything it cannot fully verify is marked 'unverified', not 'error'.",
@@ -14919,7 +15009,7 @@ function registerDiagnosticTools(server2, installedVersion, client, builderClien
14919
15009
  })();
14920
15010
  const firebasePromise = (async () => {
14921
15011
  if (!builderClient) {
14922
- return { name: "Firebase auth (workflow builder)", status: "skip", detail: "Not configured. The 54 Firebase-gated tools need Firebase credentials. The other 179 tools work fine without. To add it: run enable_workflow_builder with the three Firebase values from your GHL browser session (see elitedcs.com/ghl-mcp-firebase for DevTools steps). Do NOT put Firebase values as env vars in your Claude Desktop config \u2014 that path is unreliable and is the usual reason this still shows skip after a restart. enable_workflow_builder saves and verifies them for you." };
15012
+ return { name: "Firebase auth (workflow builder)", status: "skip", detail: "Not configured \u2014 your install is one step from finished. Run capture_firebase_interactive: a Chrome window opens, you log into GHL once, and it captures + verifies everything itself (about 60 seconds). This powers the account auditor and the Firebase-gated tools. No Chrome on this machine? auto_capture_firebase_script is the copy-paste path. Do NOT put Firebase values as env vars in your Claude Desktop config \u2014 that path is unreliable and is the usual reason this still shows skip after a restart." };
14923
15013
  }
14924
15014
  const result = await builderClient.checkAuth();
14925
15015
  const tokenCompany = builderClient.getTokenCompanyId();
@@ -19288,7 +19378,10 @@ async function resolveAccessAndRegister() {
19288
19378
  registerSetupTool(server, pkg.version);
19289
19379
  registerLeadCaptureTool(server);
19290
19380
  registerOutOfBand(
19291
- [{ name: "auto_capture_firebase_script", register: () => registerFirebaseCaptureScriptTool(server) }],
19381
+ [
19382
+ { name: "auto_capture_firebase_script", register: () => registerFirebaseCaptureScriptTool(server) },
19383
+ { name: "capture_firebase_interactive", register: () => registerInteractiveCaptureTool(server) }
19384
+ ],
19292
19385
  gatingConfig,
19293
19386
  outOfBandTracker
19294
19387
  );
@@ -19302,6 +19395,13 @@ async function resolveAccessAndRegister() {
19302
19395
  // a fresh refresh token when it rotates. Registered on the FREE tier too:
19303
19396
  // the Firebase login powers the read-only auditor tools (audit_workflows,
19304
19397
  // validate_workflow, *_full reads) — only the write tools stay gated.
19398
+ // v3.60.0: setup_ghl_mcp registers in NORMAL mode too — it is the
19399
+ // ONE-LINE UPGRADE path ("email + new license key, nothing else").
19400
+ // Before this it existed only in bootstrap, so an installed free user
19401
+ // pasting the upgrade line got "Tool setup_ghl_mcp not found" — the
19402
+ // exact audience the upgrade exists for. Caught by the live wire
19403
+ // proof, not by unit tests (the handler worked; registration didn't).
19404
+ { name: "setup_ghl_mcp", register: () => registerSetupTool(server, pkg.version) },
19305
19405
  { name: "enable_workflow_builder", register: () => registerEnableWorkflowBuilderTool(server) },
19306
19406
  { name: "auto_capture_firebase_script", register: () => registerFirebaseCaptureScriptTool(server) },
19307
19407
  // One-click Builder unlock — buyer just logs into a Chrome window the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elitedcs/ghl-mcp",
3
- "version": "3.59.0",
3
+ "version": "3.60.0",
4
4
  "mcpName": "io.github.drjerryrelth/ghl-command",
5
5
  "description": "GoHighLevel MCP Server for Claude. 233 tools — full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
6
6
  "main": "dist/index.js",