@elitedcs/ghl-mcp 3.89.0-beta.9 → 3.89.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 +82 -0
- package/README.md +1 -1
- package/dist/index.js +4704 -3366
- package/dist/shopper-child.js +10509 -0
- package/guide/guide.html +16 -16
- package/package.json +3 -2
- package/skills/blueprint/references/external-funnel.md +4 -2
package/guide/guide.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>GHL Command — User Guide</title>
|
|
7
|
-
<!-- guides-hash:
|
|
7
|
+
<!-- guides-hash: 6fb2473cea0a7413 -->
|
|
8
8
|
<style>
|
|
9
9
|
/* Deliberately light in every environment, including a dark-mode OS. This is a
|
|
10
10
|
reference document people read at length, print, and save to PDF, and a page
|
|
@@ -584,7 +584,7 @@ Before you build: confirm the [Consult] calendar exists and scope the trigger to
|
|
|
584
584
|
</ul>
|
|
585
585
|
</div>
|
|
586
586
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
587
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The reminder arrived three weeks early."</td><td>Fixed delays were used instead of appointment-relative waits. Rebuild the waits to count back from the appointment.</td></tr><tr><td>"It reminded people about the wrong appointment type."</td><td>The trigger was not scoped to a calendar.</td></tr><tr><td>"They got a reminder after they
|
|
587
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The reminder arrived three weeks early."</td><td>Fixed delays were used instead of appointment-relative waits. Rebuild the waits to count back from the appointment.</td></tr><tr><td>"It reminded people about the wrong appointment type."</td><td>The trigger was not scoped to a calendar.</td></tr><tr><td>"They got a reminder after they canceled."</td><td>Add an exit so cancellations drop out of the sequence.</td></tr></table></div>
|
|
588
588
|
</div>
|
|
589
589
|
<div class="gsec"><h2>Related guides</h2>
|
|
590
590
|
<ul>
|
|
@@ -803,14 +803,14 @@ Before you build: confirm both tags exist in my account, and show me the two pat
|
|
|
803
803
|
<ul>
|
|
804
804
|
<li>You are <b>switched to the client's sub-account</b> (<code>switch_location</code>).</li>
|
|
805
805
|
<li>The <b>workflow builder is set up</b> for it. The template library needs that same one-time Firebase sign-in; an API key alone is refused. If you have ever built a workflow in this account you already have it.</li>
|
|
806
|
-
<li>Optionally, a <b>look to brand it with</b>. Six are built in, and you can adjust one to a client's
|
|
806
|
+
<li>Optionally, a <b>look to brand it with</b>. Six are built in, and you can adjust one to a client's colors and faces before you use it. Without one you can still install a template. It just arrives in the designer's own colors.</li>
|
|
807
807
|
</ul>
|
|
808
808
|
</div>
|
|
809
809
|
<div class="gsec"><h2>Do this</h2>
|
|
810
810
|
<p class="gpara"><b>1. Find one.</b></p>
|
|
811
811
|
<div class="prompt"><q>Find me a GoHighLevel template for a chiropractic clinic, in warm gold and cream.</q><button class="copy" type="button">Copy</button></div>
|
|
812
812
|
<p class="gpara">You get a shortlist with install counts, a thumbnail you can open, and the reason each one is on the list. Install count is other agencies voting with their accounts. It is the only quality signal GoHighLevel publishes, and it is not the same as good.</p>
|
|
813
|
-
<p class="gpara">To see what the library is
|
|
813
|
+
<p class="gpara">To see what the library is organized by first: *Show me the GoHighLevel template categories.*</p>
|
|
814
814
|
<p class="gpara"><b>2. Install it, in the client's brand.</b></p>
|
|
815
815
|
<div class="prompt"><q>Install template 68158120b6bd0de1fe287f59 into this account, branded with the calm-clinic look.</q><button class="copy" type="button">Copy</button></div>
|
|
816
816
|
<p class="gpara">You confirm before it writes. It installs one funnel, reads the account back, and reports the funnel that actually appeared with the exact call that removes it.</p>
|
|
@@ -824,7 +824,7 @@ Before you build: confirm both tags exist in my account, and show me the two pat
|
|
|
824
824
|
</div>
|
|
825
825
|
<div class="gsec"><h2>Honest limits</h2>
|
|
826
826
|
<ul>
|
|
827
|
-
<li><b>"In your client's
|
|
827
|
+
<li><b>"In your client's colors", not "a bespoke design".</b> The re-paint claims six roles: the accent, the ground, the body color, a second hue, the tint big section bands use, and the two faces. Some large background areas keep the template's own color, because painting every remaining shade would wreck the photography.</li>
|
|
828
828
|
<li><b>It cannot invent proof.</b> The template arrives with the designer's placeholder testimonials and stock numbers. Those are yours to replace with things that are true.</li>
|
|
829
829
|
<li><b>A branded page is not a persuasive page.</b> The design check measures craft, not whether anyone would buy. If you want that judged too, ask for the copy to be graded.</li>
|
|
830
830
|
</ul>
|
|
@@ -1071,7 +1071,7 @@ Do not change any contact, and do not delete any list that is already there.</p>
|
|
|
1071
1071
|
<a class="back" href="#top">← All guides</a>
|
|
1072
1072
|
<div class="gsec"><h2>What you'll get</h2>
|
|
1073
1073
|
<ul>
|
|
1074
|
-
<li>A page rebuilt for your client from a page you point at, with their name,
|
|
1074
|
+
<li>A page rebuilt for your client from a page you point at, with their name, colors, contact details, and copy.</li>
|
|
1075
1075
|
<li>A rights question at the start that decides how the rebuild is done, and an honest answer either way.</li>
|
|
1076
1076
|
<li>A review report at the end listing everything that still belongs to whoever owned the original.</li>
|
|
1077
1077
|
</ul>
|
|
@@ -1094,13 +1094,13 @@ When you are done, give me the review list of everything still belonging to the
|
|
|
1094
1094
|
<ol class="steps">
|
|
1095
1095
|
<li>Claude asks what rights you have to the page, and records your answer.</li>
|
|
1096
1096
|
<li>With rights, it makes a faithful rebuild. Without them, it takes the design system, meaning the layout logic, spacing, and type scale, and builds a fresh page on it instead of copying the original.</li>
|
|
1097
|
-
<li>It swaps in your client's brand: name, contact details,
|
|
1097
|
+
<li>It swaps in your client's brand: name, contact details, colors. It does NOT rewrite the page's words.</li>
|
|
1098
1098
|
<li>It hands you a review list: everything it found that still belongs to the original owner and everything it could not be sure about.</li>
|
|
1099
1099
|
</ol>
|
|
1100
1100
|
</div>
|
|
1101
1101
|
<div class="gsec"><h2>Good to know</h2>
|
|
1102
1102
|
<ul>
|
|
1103
|
-
<li><b>Changing the
|
|
1103
|
+
<li><b>Changing the colors is riskier than it sounds.</b> A palette is a set of relationships, not a list of hex codes. Swap a dark background for a light one and text that was white for the dark background is now white on light, and invisible. Nothing checks this for you. After any color change, look at the page before you show anyone.</li>
|
|
1104
1104
|
<li><b>A clone copies. It does not rewrite.</b> When it finishes, the layout and brand are your client's and every word is still the original's, so the page still reads as the other business. Rewriting is a second ask, on purpose: a clone that paraphrases as it copies is the one that comes back "not even close".</li>
|
|
1105
1105
|
<li>Read the review list. It exists because some things cannot be caught by find and replace: a brand name split across styled text, a logo inside an image, branding baked into a booking widget, another business's testimonials.</li>
|
|
1106
1106
|
<li>Lead and payment destinations are the dangerous ones. A cloned page that still posts leads to the original owner is worse than no page.</li>
|
|
@@ -1109,7 +1109,7 @@ When you are done, give me the review list of everything still belonging to the
|
|
|
1109
1109
|
</ul>
|
|
1110
1110
|
</div>
|
|
1111
1111
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1112
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The clone still has the other company's name in one spot."</td><td>That is what the review list catches, usually a name split across styled text. Fix the items it names before you show the client.</td></tr><tr><td>"A booking button still goes to the original business."</td><td>Say which account and which calendar the buttons should point at, in the ask. Then check every button on the live page.</td></tr><tr><td>"The new
|
|
1112
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The clone still has the other company's name in one spot."</td><td>That is what the review list catches, usually a name split across styled text. Fix the items it names before you show the client.</td></tr><tr><td>"A booking button still goes to the original business."</td><td>Say which account and which calendar the buttons should point at, in the ask. Then check every button on the live page.</td></tr><tr><td>"The new colors made half the page unreadable."</td><td>Text colors were not swapped alongside the backgrounds they sit on. Caught live: a navy-to-cream background left white headings invisible. Change colors only if you will check the result by eye, or leave them alone and clone exactly.</td></tr><tr><td>"The header still showed the old brand after a clean replace."</td><td>A two-tone brand mark is split across markup, so no find-and-replace can reach it. It is caught and listed for a hand edit. The proving run had exactly two.</td></tr><tr><td>"The logo still says the other company."</td><td>The brand is inside the image file. Pixels cannot be substituted; the review list names the files so you can swap the artwork.</td></tr><tr><td>"It refused to make an exact copy."</td><td>You said you have no rights to the page. That answer routes you to a rebuild on the design system instead, which is the version you can actually ship.</td></tr></table></div>
|
|
1113
1113
|
</div>
|
|
1114
1114
|
<div class="gsec"><h2>Related guides</h2>
|
|
1115
1115
|
<ul>
|
|
@@ -1223,7 +1223,7 @@ Before you build: look up the real calendar, the real workflows you are removing
|
|
|
1223
1223
|
<ol class="steps">
|
|
1224
1224
|
<li>Sign in to your Stripe Dashboard and choose the account you want to read.</li>
|
|
1225
1225
|
<li>Open Developers, then API keys. If your dashboard shows Workbench, open its API keys page.</li>
|
|
1226
|
-
<li>Under Restricted keys, choose Create restricted key and give it a name you
|
|
1226
|
+
<li>Under Restricted keys, choose Create restricted key and give it a name you recognize.</li>
|
|
1227
1227
|
<li>Set Customers, Invoices, Subscriptions, Charges and Products to Read. Leave other permissions at None, then create the key.</li>
|
|
1228
1228
|
<li>Copy the key into the password field on the Stripe card on the Connections screen, add an account label if useful, and choose Connect. Use a live-mode key for real income.</li>
|
|
1229
1229
|
</ol>
|
|
@@ -1363,7 +1363,7 @@ Before you build: look up the real calendar, the real workflows you are removing
|
|
|
1363
1363
|
<ol class="steps">
|
|
1364
1364
|
<li>Open marketplace.zoom.us and sign in with your Zoom account.</li>
|
|
1365
1365
|
<li>Choose Develop at the top right, then Build App.</li>
|
|
1366
|
-
<li>Pick Server-to-Server OAuth App and choose Create. Give it a name you will
|
|
1366
|
+
<li>Pick Server-to-Server OAuth App and choose Create. Give it a name you will recognize, such as Morning brief reader.</li>
|
|
1367
1367
|
<li>On App Credentials, copy the Account ID, the Client ID and the Client Secret. Keep them somewhere private until you paste them here.</li>
|
|
1368
1368
|
<li>Fill in the Information page with your name and email; Zoom asks for them before it lets the app run.</li>
|
|
1369
1369
|
<li>Open Scopes and choose Add Scopes. Add the user read scope, which Zoom may list as View a user (user:read:user:admin), and the cloud recording read scope, which Zoom may list as View all user recordings (cloud_recording:read:list_user_recordings:admin). Add nothing else.</li>
|
|
@@ -1612,7 +1612,7 @@ Then tell me which ones I should chase, in order.</p></div>
|
|
|
1612
1612
|
</ul>
|
|
1613
1613
|
</div>
|
|
1614
1614
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1615
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"It sent to the wrong Dana."</td><td>Two contacts, same first name. Give the email address and Claude confirms the match before sending.</td></tr><tr><td>"The template list is missing one."</td><td>It exists in a different sub-account. Confirm which account you are in first.</td></tr><tr><td>"The client says the document is blank."</td><td>The template has no signature or content blocks filled in. That is fixed in the GHL template editor, then resent.</td></tr><tr><td>"I only wanted to see what it would look like, and the client got it."</td><td>That was the old
|
|
1615
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"It sent to the wrong Dana."</td><td>Two contacts, same first name. Give the email address and Claude confirms the match before sending.</td></tr><tr><td>"The template list is missing one."</td><td>It exists in a different sub-account. Confirm which account you are in first.</td></tr><tr><td>"The client says the document is blank."</td><td>The template has no signature or content blocks filled in. That is fixed in the GHL template editor, then resent.</td></tr><tr><td>"I only wanted to see what it would look like, and the client got it."</td><td>That was the old behavior and it changed on 31 August. Creating from a template now leaves the contract as a draft, and sending is a separate instruction.</td></tr></table></div>
|
|
1616
1616
|
</div>
|
|
1617
1617
|
<div class="gsec"><h2>Related guides</h2>
|
|
1618
1618
|
<ul>
|
|
@@ -1690,7 +1690,7 @@ Show me the first ten rows in the chat so I can sanity check them before you wri
|
|
|
1690
1690
|
<a class="back" href="#top">← All guides</a>
|
|
1691
1691
|
<div class="gsec"><h2>Before you start: what you need</h2>
|
|
1692
1692
|
<ul>
|
|
1693
|
-
<li><b>A GoHighLevel plan that includes API access.</b> That is GoHighLevel Unlimited ($297 a month) or Agency Pro ($497). The $97 Starter plan has no API, so nothing can connect to it, GHL Command included. Check under Settings, then Billing, in GoHighLevel before you install. On Unlimited ($297), GoHighLevel does not let GHL Command create sub-accounts or add staff users. Both are Agency Pro only, so on $297 you do
|
|
1693
|
+
<li><b>A GoHighLevel plan that includes API access.</b> That is GoHighLevel Unlimited ($297 a month) or Agency Pro ($497). The $97 Starter plan has no API, so nothing can connect to it, GHL Command included. Check under Settings, then Billing, in GoHighLevel before you install. On Unlimited ($297), GoHighLevel does not let GHL Command create sub-accounts or add staff users. Both are Agency Pro only, so on $297 you do both jobs in GoHighLevel yourself.</li>
|
|
1694
1694
|
<li><b>Claude on this computer.</b> GHL Command runs inside the Claude Desktop app or inside Claude Code in a terminal. It cannot run in a claude.ai tab in your browser. Not sure which you have? The Members Hub page Which Claude do I use? settles it in two minutes, and with it every later question about restarts.</li>
|
|
1695
1695
|
<li><b>A Private Integration token</b> from the sub-account you want to work in, and that sub-account's location ID. Claude asks for both during setup, not the installer. Inside the sub-account, create the token under Settings, then Private Integrations (under Other settings), then Create New Integration. The location ID is under Settings, then Business Profile, at the top of the General Information card, with a copy button. It is also the part of the sub-account's web address after /location/.</li>
|
|
1696
1696
|
</ul>
|
|
@@ -1742,7 +1742,7 @@ Show me the first ten rows in the chat so I can sanity check them before you wri
|
|
|
1742
1742
|
<div class="gsec"><h2>What you'll get</h2>
|
|
1743
1743
|
<ul>
|
|
1744
1744
|
<li>An invoice raised against a real contact, itemised and priced, without touching the billing screen.</li>
|
|
1745
|
-
<li>A promo code you can hand out, and a product
|
|
1745
|
+
<li>A promo code you can hand out, and a product catalog Claude can price from.</li>
|
|
1746
1746
|
<li>A straight answer to "what came in this month", read from the account rather than a dashboard.</li>
|
|
1747
1747
|
</ul>
|
|
1748
1748
|
</div>
|
|
@@ -1770,7 +1770,7 @@ Do not send it. I will send it myself once I have read it.</p></div>
|
|
|
1770
1770
|
<li>Invoices are created as drafts and stay that way until sent. A draft costs nothing and can be deleted; a sent invoice has landed in someone's inbox and cannot be unsent.</li>
|
|
1771
1771
|
<li>Say "do not send" in the ask when you are experimenting. Claude honours it, and it removes the only irreversible step in the whole flow.</li>
|
|
1772
1772
|
<li>New invoices are real and payable by default. If you want one that cannot be paid, for a demo or a screenshot, ask for a test-mode invoice explicitly.</li>
|
|
1773
|
-
<li>Products are the
|
|
1773
|
+
<li>Products are the catalog, invoices are the bill. Creating a product does not create a price on its own, so ask for the price in the same breath if you want one attached.</li>
|
|
1774
1774
|
<li>Coupons need a code, a type (percentage or fixed) and an amount. Without all three GHL rejects it.</li>
|
|
1775
1775
|
<li>"What was I paid" is a different question from "what did I invoice". Ask for transactions or orders for money that actually moved, and for invoices for money you asked for.</li>
|
|
1776
1776
|
<li>Invoicing needs the full license. The Free plan can read invoices and payments but not raise them.</li>
|
|
@@ -2931,7 +2931,7 @@ Tell me plainly what happens on my side when somebody clicks it, and what I woul
|
|
|
2931
2931
|
<div class="gsec"><h2>What you'll get</h2>
|
|
2932
2932
|
<ul>
|
|
2933
2933
|
<li>New leads for the week, total contacts, open and won and lost deals, and how many conversations are live in the account.</li>
|
|
2934
|
-
<li>Every figure
|
|
2934
|
+
<li>Every figure labeled with the window it covers, so a week number is never mistaken for an all-time number.</li>
|
|
2935
2935
|
<li>Anything that cannot be read is reported as unavailable, not as a zero. A zero you cannot trust is worse than no number.</li>
|
|
2936
2936
|
</ul>
|
|
2937
2937
|
</div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.89.0
|
|
3
|
+
"version": "3.89.0",
|
|
4
4
|
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
5
5
|
"description": "GoHighLevel MCP Server for Claude. 250 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",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"src/command-os/design/rules/anti-default-contract.mjs",
|
|
18
18
|
"dist/index.js",
|
|
19
19
|
"dist/capture-helper.js",
|
|
20
|
+
"dist/shopper-child.js",
|
|
20
21
|
"templates/action-schemas.json",
|
|
21
22
|
"templates/clinic-medspa.json",
|
|
22
23
|
"templates/trigger-schemas.json",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"!skills/blueprint/presets/clinic-launch-a2p.md"
|
|
32
33
|
],
|
|
33
34
|
"scripts": {
|
|
34
|
-
"build": "node src/command-os/assessment/build-app.mjs && node scripts/gen-report-css.mjs && esbuild src/index.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/index.js --packages=external && esbuild src/capture-helper.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/capture-helper.js --packages=external",
|
|
35
|
+
"build": "node src/command-os/assessment/build-app.mjs && node scripts/gen-report-css.mjs && esbuild src/index.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/index.js --packages=external && esbuild src/capture-helper.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/capture-helper.js --packages=external && esbuild src/shopper-child.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/shopper-child.js --packages=external",
|
|
35
36
|
"typecheck": "tsc --noEmit",
|
|
36
37
|
"setup": "node setup-wizard.mjs",
|
|
37
38
|
"catalogue": "node scripts/export-command-os-catalogue.mjs",
|
|
@@ -260,11 +260,13 @@ verify_funnel({
|
|
|
260
260
|
expectCustom: [ { fieldId: "<id>", value: "<sent value>", label: "<label>" }, ... ], // from formFields
|
|
261
261
|
consentFieldId: "<consent field id, if the workflow messages>",
|
|
262
262
|
// testPhone: "<a test-safe number YOU control>", // only if asserting SMS-path; real SMS may bill
|
|
263
|
-
|
|
263
|
+
// verify_funnel never deletes anything: the result lists every contact that now carries the test address (id, name,
|
|
264
|
+
// phone, email, created). Check each before deleting any with delete_contact: a phone-matching form can put the
|
|
265
|
+
// test address on an existing customer.
|
|
264
266
|
})
|
|
265
267
|
```
|
|
266
268
|
|
|
267
|
-
This proves, from the backend (not the UI): (1)
|
|
269
|
+
This proves, from the backend (not the UI): (1) a contact carrying the test address **actually appears** (with submit→appear
|
|
268
270
|
latency); (2) each `expectCustom` value **persisted** (field-value fidelity — catches a wrong field id);
|
|
269
271
|
(3) the **trigger tag landed**; (4) SMS/A2P pre-check; (5) **workflow is not DRAFT** (a draft never fires
|
|
270
272
|
on real leads); (6) the **outreach actually fired** (an outbound message was logged — proves enroll +
|