@elitedcs/ghl-mcp 3.57.0 → 3.59.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,78 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.59.0 — One-command install: `npx -y @elitedcs/ghl-mcp cli install`
4
+
5
+ The old install step said "Edit Config, paste this block." Edit Config opens a
6
+ folder, not a text box — and the block was a complete config object, so anyone
7
+ who already had other MCP servers and followed the instruction literally wiped
8
+ them. A real buyer hit exactly that this week.
9
+
10
+ This release replaces the hand-edit with one command:
11
+
12
+ npx -y @elitedcs/ghl-mcp cli install
13
+
14
+ It finds Claude Desktop's settings file (including the Microsoft Store build's
15
+ relocated path on Windows), adds GHL Command **alongside** whatever servers are
16
+ already there, and saves a verified backup before touching anything. If the
17
+ file has a formatting problem — often caused by our own old instructions — it
18
+ repairs what it can and preserves the original in the backup. If the file can't
19
+ be read at all, it writes a fresh working config and keeps the original so
20
+ nothing is ever lost.
21
+
22
+ Safety properties, all tested (33 new tests):
23
+
24
+ - **Never writes without a verified backup** of an existing file, and aborts if
25
+ the backup can't be confirmed byte-for-byte.
26
+ - **Never fights Claude for the file**: writes are atomic, lock errors retry
27
+ briefly then stop with plain instructions, and if anything else modifies the
28
+ file mid-run it stops rather than overwrite the newer change.
29
+ - **Never guesses between multiple config files** — it stops and asks.
30
+ - **Never touches** symlinked configs pointing somewhere unexpected, UTF-16
31
+ files, or files whose content it can read but not safely restructure.
32
+ - `--dry-run` previews every decision without writing; `--print-only` emits the
33
+ merged JSON for locked-down machines.
34
+
35
+ Also in this release: the license-failure message now points at ghlcommand.com
36
+ (and mentions the free tier) instead of a retired page, and `setup_ghl_mcp`'s
37
+ description finally includes a URL for people who reach it without a license.
38
+
39
+ ## 3.58.0 — Anonymous install stats, so we can find out where installs get stuck
40
+
41
+ Most people who install GHL Command never get it working, and until now there
42
+ was no way to tell whether that was 50 people or 1,200. This release adds a
43
+ small, anonymous count of install and startup events so the gap can be measured
44
+ and fixed. It is the first release that sends anything off your machine, so the
45
+ disclosure ships in the same version as the feature, not the one after.
46
+
47
+ **Turn it off with either of these and no network call is made at all:**
48
+
49
+ GHL_TELEMETRY=0
50
+ DO_NOT_TRACK=1
51
+
52
+ Run `health_check` to see whether it is on and to confirm an opt-out took effect.
53
+
54
+ - **Exactly twelve fields, and the server rejects anything else.** A random
55
+ device id, the event name, package version, Node major, platform, three
56
+ automation flags (CI / TTY / container), your licence tier, seconds since this
57
+ machine first ran GHL Command, a failure reason code, and a timestamp. The
58
+ endpoint refuses a payload carrying an unknown field rather than quietly
59
+ dropping it, and the database enforces the same list a second time — so the
60
+ shape cannot drift without both being changed deliberately.
61
+ - **Never sent:** your licence key, email, GHL API key, location ID, contact or
62
+ client data, hostname, usernames, file paths, or raw error text. Nothing about
63
+ your GoHighLevel account or your clients' accounts leaves your machine. The
64
+ failure reason is one of eleven fixed labels, never a server message, because
65
+ those can name a sub-account.
66
+ - **Separate identity from your licence.** The telemetry device id is generated
67
+ independently and shares no code with the licence fingerprint, so it cannot
68
+ affect activation or consume an install slot. A consequence worth stating: a
69
+ telemetry row cannot be linked back to a customer.
70
+ - **It cannot slow you down.** Sending is fire-and-forget with a 2-second
71
+ timeout, never awaited, and every failure is swallowed. Identity and
72
+ environment are resolved once per process, so a tool call performs no disk
73
+ access at all.
74
+ - `health_check` gains an "Anonymous usage stats" row reporting ON or OFF.
75
+
3
76
  ## 3.57.0 — Clone Site: copy a live page for a client, with the guardrails built in
4
77
 
5
78
  A second bundled skill. Point Claude at any live URL and get a working,
package/README.md CHANGED
@@ -89,7 +89,24 @@ This MCP (Model Context Protocol) server connects Claude directly to GoHighLevel
89
89
 
90
90
  ### 2. Install in Claude Desktop App
91
91
 
92
- Open Claude Desktop. Click **Claude** menu (top-left) **Settings...** **Developer** → **Edit Config**. Paste this block (or merge into your existing `mcpServers` if you have other MCP servers):
92
+ One command in any terminal (Terminal on Mac, PowerShell on Windows):
93
+
94
+ ```
95
+ npx -y @elitedcs/ghl-mcp cli install
96
+ ```
97
+
98
+ It finds Claude Desktop's settings file, adds GHL Command **alongside any MCP servers you already have** (nothing gets overwritten), and saves a backup first. If the file has a formatting problem, it repairs it. Then **quit Claude completely** — Cmd+Q on Mac; on Windows right-click the Claude icon by the clock and choose Quit — and reopen.
99
+
100
+ > **Claude Code (terminal) instead?** One command:
101
+ > ```
102
+ > claude mcp add --scope user -t stdio ghl -- npx -y @elitedcs/ghl-mcp@latest
103
+ > ```
104
+ > Then restart Claude Code.
105
+
106
+ <details>
107
+ <summary>Prefer to edit the config by hand?</summary>
108
+
109
+ Open Claude Desktop → **Settings...** → **Developer** → **Edit Config**. That opens a **folder**, not a text box — open `claude_desktop_config.json` from it in a text editor. If the file is empty, paste this whole block:
93
110
 
94
111
  ```json
95
112
  {
@@ -102,13 +119,9 @@ Open Claude Desktop. Click **Claude** menu (top-left) → **Settings...** → **
102
119
  }
103
120
  ```
104
121
 
105
- Save the file. **Quit Claude completely** (Cmd+Q on Mac) and reopen.
122
+ If it already has other tools in it, do **not** paste over them — add only the `"ghl": { ... }` entry inside your existing `"mcpServers"` object. Save, then fully quit and reopen Claude. (Unsure? Run `npx -y @elitedcs/ghl-mcp cli install --dry-run` to preview exactly what would change, or `--print-only` to get the merged file printed for you.)
106
123
 
107
- > **Claude Code (terminal) instead?** One command:
108
- > ```
109
- > claude mcp add --scope user -t stdio ghl -- npx -y @elitedcs/ghl-mcp@latest
110
- > ```
111
- > Then restart Claude Code.
124
+ </details>
112
125
 
113
126
  ### 3. Activate
114
127
 
@@ -690,6 +703,40 @@ This MCP server is safe to share via GitHub.
690
703
 
691
704
  ---
692
705
 
706
+ ## Anonymous Usage Stats
707
+
708
+ 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.
709
+
710
+ **Turn it off with either of these — no network call is made at all:**
711
+
712
+ ```bash
713
+ GHL_TELEMETRY=0 # or the cross-tool standard:
714
+ DO_NOT_TRACK=1
715
+ ```
716
+
717
+ Run `health_check` any time to see whether it's on and confirm an opt-out took effect.
718
+
719
+ **Exactly what is sent** — twelve fields, nothing else, ever:
720
+
721
+ | Field | Example | What it is |
722
+ |---|---|---|
723
+ | `device_id` | `e09eb5cd…` | A random number generated on your machine. Not derived from your hostname, username, or hardware. |
724
+ | `event` | `client_connected` | One of seven: connected, started unlicensed, entered a key, setup failed, setup succeeded, license valid, first tool call. |
725
+ | `pkg_version` | `3.57.0` | Which version you're running. |
726
+ | `node_major` | `24` | Node.js major version. |
727
+ | `platform` | `darwin` | mac, linux, or windows. |
728
+ | `is_ci`, `is_tty`, `is_container` | `false` | Whether this is an automated environment. |
729
+ | `licensed_tier` | `none` | none, free, or full. |
730
+ | `elapsed_s` | `12` | Seconds since this machine first ran GHL Command. |
731
+ | `reason_code` | `ghl_key_wrong_location` | If setup failed, which of eleven fixed labels. Never a raw error message. |
732
+ | `ts` | `2026-08-04T03:31:08Z` | When it happened. |
733
+
734
+ **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.
735
+
736
+ 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.
737
+
738
+ ---
739
+
693
740
  ## Reliability & Type Safety
694
741
 
695
742
  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: