@elitedcs/ghl-mcp 3.45.0 → 3.46.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/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@elitedcs/ghl-mcp",
3
- "version": "3.45.0",
3
+ "version": "3.46.0",
4
4
  "mcpName": "io.github.drjerryrelth/ghl-command",
5
- "description": "GoHighLevel MCP Server for Claude. 218 tools — full CRM, automation, marketing control, account-wide workflow audit, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
5
+ "description": "GoHighLevel MCP Server for Claude. 220 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",
7
7
  "bin": {
8
8
  "ghl-mcp": "dist/index.js"
@@ -42,7 +42,21 @@ The executor returns what you plug into the Worker config + form:
42
42
  TURNSTILE_SECRET`.
43
43
  5. `wrangler deploy` → point your form at the Worker URL.
44
44
 
45
+ ## Why a bridge and not a raw GHL inbound-webhook
46
+ A GHL **inbound-webhook-triggered workflow runs *contactless*** — unless that
47
+ workflow has a Create/Update Contact action with every payload field mapped, GHL
48
+ runs the whole thing into the void: tags fire on nobody, emails send to no one,
49
+ the execution log still shows green, and **no contact is ever created.** The lead
50
+ silently evaporates. This bridge avoids that entire failure class by creating the
51
+ contact itself via `/contacts/upsert` (the contacts API, not a trigger), then
52
+ adding the tag — so your workflow always fires on a **real contact**. If you ever
53
+ wire a raw inbound webhook instead, it MUST start with a mapped Create/Update
54
+ Contact action or it's a paper shredder.
55
+
45
56
  ## Safety built in
57
+ - **Lead is actually created** — the bridge writes the contact through the
58
+ contacts API and only reports success on a 2xx from GHL (not a thank-you page).
59
+ See "Why a bridge…" above for the contactless-webhook trap this sidesteps.
46
60
  - **Secret stays server-side** — the token lives only as a Cloudflare secret, never
47
61
  in the browser.
48
62
  - **Spam gate** — honeypot field (`_hp`) + Cloudflare Turnstile. **Strongly enable
@@ -64,6 +78,23 @@ what you want. If you need returning submitters re-enrolled, set `RE_ENROLL=true
64
78
  (the Worker removes + re-adds the tag) AND enable re-enrollment on the workflow.
65
79
  Confirm the behavior on your account before relying on it.
66
80
 
81
+ ## Verify after deploy (the form is not proof)
82
+ A live form, a success toast, and a green workflow run are **not** verification —
83
+ a funnel can show every happy signal while the contact never lands. Before you
84
+ call it done, prove it on the **real production URL** (not the worker in isolation,
85
+ not a local deploy):
86
+ 1. **Happy path → backend truth.** Submit the live form with a real email, wait
87
+ ~60s, then `search_contacts` for it. No contact = your form is a paper shredder.
88
+ 2. **Field persistence — check directly.** Open the created contact and confirm
89
+ each custom field actually saved. A wrong/stale field id makes upsert succeed
90
+ while silently dropping that value. This is why the wiring bundle gives you
91
+ **verified GHL field IDs** — send those, never guessed names/keys.
92
+ 3. **Duplicate-contact retest.** Submit the SAME email twice. Correct result: one
93
+ contact (upsert deduped), fields updated, no error. A second contact or a
94
+ false failure means dedup is broken — catch it before real traffic does.
95
+ 4. **Booking, if you wired it.** A reachable calendar URL is not proof. Book one
96
+ real test ("burner") appointment through it and confirm it lands in GHL.
97
+
67
98
  ## Compliance
68
99
  If your workflow sends SMS/email, your external form MUST collect explicit consent
69
100
  (a checkbox + clear copy). Define a **consent custom field** in your Blueprint plan