@elitedcs/ghl-mcp 3.56.0 → 3.58.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,140 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.58.0 — Anonymous install stats, so we can find out where installs get stuck
4
+
5
+ Most people who install GHL Command never get it working, and until now there
6
+ was no way to tell whether that was 50 people or 1,200. This release adds a
7
+ small, anonymous count of install and startup events so the gap can be measured
8
+ and fixed. It is the first release that sends anything off your machine, so the
9
+ disclosure ships in the same version as the feature, not the one after.
10
+
11
+ **Turn it off with either of these and no network call is made at all:**
12
+
13
+ GHL_TELEMETRY=0
14
+ DO_NOT_TRACK=1
15
+
16
+ Run `health_check` to see whether it is on and to confirm an opt-out took effect.
17
+
18
+ - **Exactly twelve fields, and the server rejects anything else.** A random
19
+ device id, the event name, package version, Node major, platform, three
20
+ automation flags (CI / TTY / container), your licence tier, seconds since this
21
+ machine first ran GHL Command, a failure reason code, and a timestamp. The
22
+ endpoint refuses a payload carrying an unknown field rather than quietly
23
+ dropping it, and the database enforces the same list a second time — so the
24
+ shape cannot drift without both being changed deliberately.
25
+ - **Never sent:** your licence key, email, GHL API key, location ID, contact or
26
+ client data, hostname, usernames, file paths, or raw error text. Nothing about
27
+ your GoHighLevel account or your clients' accounts leaves your machine. The
28
+ failure reason is one of eleven fixed labels, never a server message, because
29
+ those can name a sub-account.
30
+ - **Separate identity from your licence.** The telemetry device id is generated
31
+ independently and shares no code with the licence fingerprint, so it cannot
32
+ affect activation or consume an install slot. A consequence worth stating: a
33
+ telemetry row cannot be linked back to a customer.
34
+ - **It cannot slow you down.** Sending is fire-and-forget with a 2-second
35
+ timeout, never awaited, and every failure is swallowed. Identity and
36
+ environment are resolved once per process, so a tool call performs no disk
37
+ access at all.
38
+ - `health_check` gains an "Anonymous usage stats" row reporting ON or OFF.
39
+
40
+ ## 3.57.0 — Clone Site: copy a live page for a client, with the guardrails built in
41
+
42
+ A second bundled skill. Point Claude at any live URL and get a working,
43
+ rebranded copy for a client — same layout, images, video and CSS, with the
44
+ new business's details in place of the original's. It installs itself like
45
+ Blueprint; there is nothing to download and no new tools to learn.
46
+
47
+ Cloning normally fails because the model *regenerates* the page instead of
48
+ copying it, and you get a worse version of what you pointed at. This skill
49
+ runs real scripts: they download the bytes, swap the strings, and verify the
50
+ result. Nothing is retyped from memory.
51
+
52
+ - **The rights question is step 0 and cannot be skipped.** Before anything is
53
+ copied, the skill asks who owns the page — you, your client (authorized),
54
+ written permission, or none — and records the answer in the run report and
55
+ in the final report header. It does not verify ownership; the declaration is
56
+ yours to make. The mirror script refuses to run without it.
57
+ - **"None" gets a real lane, not a refusal.** It extracts the page's actual
58
+ design system — palette, CSS variables, font stack and type scale, spacing
59
+ rhythm, radii, shadows, breakpoints, and the section skeleton as shape — so
60
+ the rebuild starts from the real design instead of a from-memory redraw. No
61
+ bytes, images, video or copy are copied in that lane.
62
+ - **Substitution that doesn't leak the old brand.** Derives the bare brand word,
63
+ every phone format, the address as a unit (not just the city), and domain and
64
+ email variants; runs across JS bundles as well as HTML and CSS, because
65
+ compiled sites keep contact details only in the bundle. Asset filenames are
66
+ protected from rewriting. Dry-run counts first, a zero-check after, and a
67
+ NEAR MISS warning when one of your facts is *almost* right.
68
+ - **Catches the leak a string search cannot see.** A brand mark is usually
69
+ two-tone — `GHL <span style="color:#D4AF37;">Command</span>` — which reads as
70
+ the old brand on screen while that string appears nowhere in the file. Every
71
+ literal check calls it clean. Clone Site renders the page to text while
72
+ keeping a map back to source offsets, so it reports exactly which occurrences
73
+ are split by markup, shows the markup, and fails the zero-check until they are
74
+ hand-edited. Found on a real page, in the header and the footer, after a
75
+ file-level rebrand had already "passed."
76
+ - **Asset capture from all four places** — HTML, CSS `url()`, CDN URLs in JS
77
+ bundles, and root-relative paths inside JS bundles (the one that silently
78
+ breaks images). Oversized files are reported for object storage, never
79
+ hot-linked back to the original owner's CDN.
80
+ - **A mandatory pre-launch REVIEW REQUIRED report** on every run: form endpoints,
81
+ webhooks, payment links and publishable keys, booking embeds, analytics and ad
82
+ pixels (MUST REPOINT); names, addresses, testimonials and likenesses; and
83
+ inherited claims with regulated health/efficacy language flagged separately.
84
+ Nothing is auto-deleted — findings go to a human.
85
+ - **Verification by content-type, not status code**, because static hosts answer
86
+ 200 with the page shell for assets that don't exist. It retries once before
87
+ calling anything broken (a CDN rollout can answer a single request with HTML),
88
+ and separates references the *source* page was already serving badly from
89
+ breakage the clone caused.
90
+ - Reports are written outside the deployable folder, so a rights declaration and
91
+ a liability list can never be published with the site.
92
+
93
+ Everything below was found by running the tool against real production sites
94
+ rather than test fixtures, and every one of them shipped a fix:
95
+
96
+ - **Whole-site cloning.** A one-page mirror inherits the original's entire
97
+ navigation, so every menu item 404s the moment a client clicks it.
98
+ `--crawl --depth N --max-pages N` follows the site's own navigation, writes
99
+ each page at its own path, and rewrites links between your pages as
100
+ root-relative so the nav works locally and after deploy — while canonical and
101
+ og:url keep their host so the rebrand can point them at the client's domain.
102
+ The skill asks how deep to go rather than assuming. Real numbers: a 36-page
103
+ contractor site came to 2,104 files and 935 MB at depth 2.
104
+ - **Assets that only exist at runtime.** Page-builders publish an asset base
105
+ path and concatenate chunk filenames onto it in JavaScript, so those files
106
+ appear in no attribute, stylesheet or string literal. Six missing Elementor
107
+ chunks meant no section background was painted at all: the hero rendered blank
108
+ and its white headline was invisible on white, while every file-level check
109
+ reported success. New `repair.mjs` plus a mandatory render-and-repair loop
110
+ fetches whatever the running page asks for and cannot find.
111
+ - **Media hidden in escaped JSON.** Background slideshows and galleries store
112
+ image URLs inside entity-encoded, backslash-escaped JSON attributes. Those are
113
+ now extracted and localised, escaping preserved.
114
+ - **Brand marks split across tags.** `GHL <span style="color:#D4AF37">Command</span>`
115
+ reads as the old brand on screen while that string exists nowhere in the file.
116
+ Detected exactly via a rendered-text-to-source offset map; the zero-check now
117
+ fails until they are hand-edited instead of reporting a false clean.
118
+ - **HTML-entity brand forms.** A brand containing `&` is stored as `&amp;`. On
119
+ one page the plain token matched twice and the encoded form 56 times.
120
+ - **Brand baked into image pixels.** Logos and graphics carrying the old phone
121
+ number or web address are flagged — substitution cannot edit artwork, and the
122
+ logo is the most visible way a clone gives itself away.
123
+ - **New audit rules from real pages:** contractor and professional licence
124
+ numbers (the highest-severity item on any trades or medical clone), consumer
125
+ financing links, review widgets that load the original's reviews at runtime,
126
+ and internal links with no page in the clone.
127
+ - **Bare-word derivation is now cautioned**, because a brand beginning with a
128
+ place name ("Arizona AC & Heating") would otherwise rewrite ordinary sentences.
129
+ - **Style lane returns the brand's palette, not the framework's.** Plugin CSS
130
+ repeats neutral greys hundreds of times while the real brand colours appear
131
+ twice; vendor stylesheets are now separated, accents are attributed to their
132
+ source file, declared colour tokens are surfaced first, and CSS variables are
133
+ resolved so the type scale comes back as real pixel values.
134
+ - **The style lane's deliverable is a page, not a document.** Its rebuild is now
135
+ five explicit steps, including a media step and a leak check against the
136
+ original page.
137
+
3
138
  ## 3.56.0 — Security off-switches: any tool can be disabled; sub-account create/delete is opt-in
4
139
 
5
140
  Shaped directly by subscriber feedback: some teams keep account-level
package/README.md CHANGED
@@ -12,7 +12,7 @@ Works with **both the Claude Desktop App and Claude Code terminal** — your cho
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
 
15
- **Bundled skills (install automatically).** The package ships guided skills that teach Claude complete multi-step workflows on top of the raw tools. On every start the server installs/updates them into your `~/.claude/skills/` (never overwriting files you've edited — your version wins and is reported). Current skills: **Blueprint** — turn one client intake into a complete reviewed GHL account build. Verify or repair any time by asking Claude to `run install_skills`, then fully restart Claude so new skills load.
15
+ **Bundled skills (install automatically).** The package ships guided skills that teach Claude complete multi-step workflows on top of the raw tools. On every start the server installs/updates them into your `~/.claude/skills/` (never overwriting files you've edited — your version wins and is reported). Current skills: **Blueprint** — turn one client intake into a complete reviewed GHL account build; **Clone Site** — point at a live URL and get a rebranded, deploy-ready copy for a client, with a recorded rights declaration, a style-only lane when you have no rights, and a mandatory pre-launch report of every lead/booking/payment destination, borrowed testimonial and inherited claim still belonging to the original owner. Verify or repair any time by asking Claude to `run install_skills`, then fully restart Claude so new skills load.
16
16
 
17
17
  Built by [Elite DCs, LLC](https://elitedcs.com).
18
18
 
@@ -690,6 +690,40 @@ This MCP server is safe to share via GitHub.
690
690
 
691
691
  ---
692
692
 
693
+ ## Anonymous Usage Stats
694
+
695
+ GHL Command sends a small, anonymous count of install and startup events so we can see where installs get stuck. Most people who install this never get it working, and we couldn't tell whether that was 50 people or 1,200 — this is how we find out and fix it.
696
+
697
+ **Turn it off with either of these — no network call is made at all:**
698
+
699
+ ```bash
700
+ GHL_TELEMETRY=0 # or the cross-tool standard:
701
+ DO_NOT_TRACK=1
702
+ ```
703
+
704
+ Run `health_check` any time to see whether it's on and confirm an opt-out took effect.
705
+
706
+ **Exactly what is sent** — twelve fields, nothing else, ever:
707
+
708
+ | Field | Example | What it is |
709
+ |---|---|---|
710
+ | `device_id` | `e09eb5cd…` | A random number generated on your machine. Not derived from your hostname, username, or hardware. |
711
+ | `event` | `client_connected` | One of seven: connected, started unlicensed, entered a key, setup failed, setup succeeded, license valid, first tool call. |
712
+ | `pkg_version` | `3.57.0` | Which version you're running. |
713
+ | `node_major` | `24` | Node.js major version. |
714
+ | `platform` | `darwin` | mac, linux, or windows. |
715
+ | `is_ci`, `is_tty`, `is_container` | `false` | Whether this is an automated environment. |
716
+ | `licensed_tier` | `none` | none, free, or full. |
717
+ | `elapsed_s` | `12` | Seconds since this machine first ran GHL Command. |
718
+ | `reason_code` | `ghl_key_wrong_location` | If setup failed, which of eleven fixed labels. Never a raw error message. |
719
+ | `ts` | `2026-08-04T03:31:08Z` | When it happened. |
720
+
721
+ **Never sent:** your license key, email, GHL API key, location ID, contact or client data, hostname, usernames, file paths, IP-derived location, or raw error text. Nothing about your GHL account or your clients' accounts ever leaves your machine.
722
+
723
+ The receiving endpoint **rejects** any payload containing a field not on that list rather than quietly dropping it, and the database enforces the same list a second time — so the shape can't drift without both being changed deliberately.
724
+
725
+ ---
726
+
693
727
  ## Reliability & Type Safety
694
728
 
695
729
  This server has been through a rigorous, multi-pass audit for production reliability (v2.4.0–v2.7.0). Here's what's in place: