@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 +135 -0
- package/README.md +35 -1
- package/dist/index.js +1962 -1612
- package/package.json +2 -2
- package/skills/clone-site/README.md +42 -0
- package/skills/clone-site/SKILL.md +247 -0
- package/skills/clone-site/references/facts-and-substitution.md +96 -0
- package/skills/clone-site/references/hosting-verify-and-audit.md +101 -0
- package/skills/clone-site/references/rights-and-lanes.md +72 -0
- package/skills/clone-site/scripts/audit.mjs +364 -0
- package/skills/clone-site/scripts/extract-design.mjs +372 -0
- package/skills/clone-site/scripts/lib.mjs +262 -0
- package/skills/clone-site/scripts/mirror.mjs +489 -0
- package/skills/clone-site/scripts/repair.mjs +113 -0
- package/skills/clone-site/scripts/substitute.mjs +418 -0
- package/skills/clone-site/scripts/verify.mjs +193 -0
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 `&`. 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:
|