@elitedcs/ghl-mcp 3.92.1 → 3.93.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 +54 -5
- package/README.md +4 -4
- package/dist/brain-function.js +1 -1
- package/dist/index.js +3746 -2638
- package/dist/shopper-child.js +18 -1
- package/guide/guide.html +1 -1
- package/package.json +2 -2
- package/skills/blueprint/presets/clinic.preset.json +7 -5
- package/skills/blueprint/presets/coach.preset.json +6 -4
- package/skills/blueprint/presets/ecommerce.preset.json +3 -1
- package/skills/blueprint/presets/generic-client.preset.json +3 -1
- package/skills/blueprint/presets/local-service.preset.json +6 -4
- package/skills/blueprint/presets/med-spa.preset.json +6 -4
- package/skills/blueprint/presets/wellness-clinic.preset.json +6 -4
package/dist/shopper-child.js
CHANGED
|
@@ -5532,6 +5532,23 @@ function sanitizeSvgOrDrop(input) {
|
|
|
5532
5532
|
}
|
|
5533
5533
|
|
|
5534
5534
|
// src/command-os/design/extract.ts
|
|
5535
|
+
function brandNameFrom(title, source) {
|
|
5536
|
+
let host = "";
|
|
5537
|
+
try {
|
|
5538
|
+
host = new URL(source).hostname.replace(/^www\./, "");
|
|
5539
|
+
} catch {
|
|
5540
|
+
}
|
|
5541
|
+
const squash = (t) => t.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
5542
|
+
const label = squash(host.split(".")[0] ?? "");
|
|
5543
|
+
const parts = title.split(/\s[|–—:-]\s|[|–—]/).map((p) => p.trim()).filter(Boolean);
|
|
5544
|
+
const spelled = label ? parts.find((p) => {
|
|
5545
|
+
const s = squash(p);
|
|
5546
|
+
return s.length >= 3 && (label.includes(s) || s.includes(label));
|
|
5547
|
+
}) : void 0;
|
|
5548
|
+
if (spelled) return spelled;
|
|
5549
|
+
if (parts[0] && parts[0].split(/\s+/).length <= 5) return parts[0];
|
|
5550
|
+
return host || parts[0] || title.trim();
|
|
5551
|
+
}
|
|
5535
5552
|
var UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36 GHLCommand-DesignStudio/0.1";
|
|
5536
5553
|
async function fetchText(url, fetchImpl, timeoutMs = 15e3) {
|
|
5537
5554
|
const ctl = new AbortController();
|
|
@@ -6074,7 +6091,7 @@ function deriveBrandDna(raw, opts = {}) {
|
|
|
6074
6091
|
const samples = raw.headlines.slice(0, 10);
|
|
6075
6092
|
if (samples.length) declared++;
|
|
6076
6093
|
evidence["voice.samples"] = samples.length ? `${samples.length} headline(s) read from h1/h2` : "no headlines found";
|
|
6077
|
-
const name = opts.name ?? (raw.title
|
|
6094
|
+
const name = opts.name ?? brandNameFrom(raw.title, raw.source);
|
|
6078
6095
|
const slug2 = opts.slug ?? slugify(name);
|
|
6079
6096
|
const extractedVia = fc ? "firecrawl" : b ? "native+browser" : "native";
|
|
6080
6097
|
const warnings = [];
|
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: 00c802d51fe5e825 -->
|
|
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
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.93.0",
|
|
4
4
|
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
5
|
-
"description": "GoHighLevel MCP Server for Claude. 250 tools
|
|
5
|
+
"description": "GoHighLevel MCP Server for Claude. 250 tools for CRM, automation and marketing, an account-wide workflow audit, live funnel-capture verification and a workflow builder, across client accounts.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"ghl-mcp": "dist/index.js"
|
|
@@ -495,7 +495,7 @@
|
|
|
495
495
|
},
|
|
496
496
|
{
|
|
497
497
|
"ref": "email_template.review_email_1",
|
|
498
|
-
"name": "Review Request -
|
|
498
|
+
"name": "Review Request - Email",
|
|
499
499
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
500
500
|
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you again for your visit with {{custom_values.business_name}} this week.</p><p style=\"margin:0 0 14px;\">If it went well, a short review is the most useful thing you could do for us. It takes about a minute and it is how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything was not right, reply to this email instead and I will fix it personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>",
|
|
501
501
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
@@ -833,10 +833,10 @@
|
|
|
833
833
|
},
|
|
834
834
|
{
|
|
835
835
|
"ref": "email.review_email_1",
|
|
836
|
-
"name": "Review Request -
|
|
836
|
+
"name": "Review Request - Email",
|
|
837
837
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
838
838
|
"templateRef": "email_template.review_email_1",
|
|
839
|
-
"copyDirection": "
|
|
839
|
+
"copyDirection": "After a completed visit with no review yet (three days after the text when texting is on). Thank them, why it matters, the review button, and an honest line: if anything was not right, reply instead. Tone: brief.voice.threeWords.",
|
|
840
840
|
"mergeTags": [
|
|
841
841
|
"contact.first_name",
|
|
842
842
|
"custom_values.business_name",
|
|
@@ -1800,7 +1800,9 @@
|
|
|
1800
1800
|
{
|
|
1801
1801
|
"type": "wait",
|
|
1802
1802
|
"value": 3,
|
|
1803
|
-
"unit": "days"
|
|
1803
|
+
"unit": "days",
|
|
1804
|
+
"conditionalOn": "channels.sms == true",
|
|
1805
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
1804
1806
|
},
|
|
1805
1807
|
{
|
|
1806
1808
|
"type": "send_email",
|
|
@@ -1932,7 +1934,7 @@
|
|
|
1932
1934
|
"owner": "TEAM",
|
|
1933
1935
|
"title": "Read every template once for your compliance rules",
|
|
1934
1936
|
"trigger": "always, before publishing",
|
|
1935
|
-
"instruction": "Open Marketing > Emails > Templates and Conversations > Snippets. The copy never names a condition, diagnosis, treatment or medication; confirm your edits keep it that way and match
|
|
1937
|
+
"instruction": "Open Marketing > Emails > Templates and Conversations > Snippets. The copy never names a condition, diagnosis, treatment or medication; confirm your edits keep it that way and match your own compliance rules (privacy, state advertising rules, insurance language). Ten minutes now saves a complaint later.",
|
|
1936
1938
|
"produces": null,
|
|
1937
1939
|
"successCheck": "Every template read by a responsible person; no clinical detail in any text or email",
|
|
1938
1940
|
"blocks": [
|
|
@@ -494,7 +494,7 @@
|
|
|
494
494
|
},
|
|
495
495
|
{
|
|
496
496
|
"ref": "email_template.review_email_1",
|
|
497
|
-
"name": "Review Request -
|
|
497
|
+
"name": "Review Request - Email",
|
|
498
498
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
499
499
|
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you again for your call with {{custom_values.business_name}} this week.</p><p style=\"margin:0 0 14px;\">If it went well, a short review is the most useful thing you could do for us. It takes about a minute and it is how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything was not right, reply to this email instead and I will fix it personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
500
500
|
}
|
|
@@ -830,10 +830,10 @@
|
|
|
830
830
|
},
|
|
831
831
|
{
|
|
832
832
|
"ref": "email.review_email_1",
|
|
833
|
-
"name": "Review Request -
|
|
833
|
+
"name": "Review Request - Email",
|
|
834
834
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
835
835
|
"templateRef": "email_template.review_email_1",
|
|
836
|
-
"copyDirection": "
|
|
836
|
+
"copyDirection": "After a completed call with no review yet (three days after the text when texting is on). Thank them, why it matters, the review button, and an honest line: if anything was not right, reply instead. Tone: brief.voice.threeWords.",
|
|
837
837
|
"mergeTags": [
|
|
838
838
|
"contact.first_name",
|
|
839
839
|
"custom_values.business_name",
|
|
@@ -1778,7 +1778,9 @@
|
|
|
1778
1778
|
{
|
|
1779
1779
|
"type": "wait",
|
|
1780
1780
|
"value": 3,
|
|
1781
|
-
"unit": "days"
|
|
1781
|
+
"unit": "days",
|
|
1782
|
+
"conditionalOn": "channels.sms == true",
|
|
1783
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
1782
1784
|
},
|
|
1783
1785
|
{
|
|
1784
1786
|
"type": "send_email",
|
|
@@ -1245,7 +1245,9 @@
|
|
|
1245
1245
|
{
|
|
1246
1246
|
"type": "wait",
|
|
1247
1247
|
"value": 3,
|
|
1248
|
-
"unit": "days"
|
|
1248
|
+
"unit": "days",
|
|
1249
|
+
"conditionalOn": "channels.sms == true",
|
|
1250
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
1249
1251
|
},
|
|
1250
1252
|
{
|
|
1251
1253
|
"type": "send_email",
|
|
@@ -1709,7 +1709,9 @@
|
|
|
1709
1709
|
{
|
|
1710
1710
|
"type": "wait",
|
|
1711
1711
|
"value": 3,
|
|
1712
|
-
"unit": "days"
|
|
1712
|
+
"unit": "days",
|
|
1713
|
+
"conditionalOn": "channels.sms == true",
|
|
1714
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
1713
1715
|
},
|
|
1714
1716
|
{
|
|
1715
1717
|
"type": "send_email",
|
|
@@ -503,7 +503,7 @@
|
|
|
503
503
|
},
|
|
504
504
|
{
|
|
505
505
|
"ref": "email_template.review_email_1",
|
|
506
|
-
"name": "Review Request -
|
|
506
|
+
"name": "Review Request - Email",
|
|
507
507
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
508
508
|
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you again for your appointment with {{custom_values.business_name}} this week.</p><p style=\"margin:0 0 14px;\">If it went well, a short review is the most useful thing you could do for us. It takes about a minute and it is how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything was not right, reply to this email instead and I will fix it personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
509
509
|
}
|
|
@@ -839,10 +839,10 @@
|
|
|
839
839
|
},
|
|
840
840
|
{
|
|
841
841
|
"ref": "email.review_email_1",
|
|
842
|
-
"name": "Review Request -
|
|
842
|
+
"name": "Review Request - Email",
|
|
843
843
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
844
844
|
"templateRef": "email_template.review_email_1",
|
|
845
|
-
"copyDirection": "
|
|
845
|
+
"copyDirection": "After a completed appointment with no review yet (three days after the text when texting is on). Thank them, why it matters, the review button, and an honest line: if anything was not right, reply instead. Tone: brief.voice.threeWords.",
|
|
846
846
|
"mergeTags": [
|
|
847
847
|
"contact.first_name",
|
|
848
848
|
"custom_values.business_name",
|
|
@@ -1788,7 +1788,9 @@
|
|
|
1788
1788
|
{
|
|
1789
1789
|
"type": "wait",
|
|
1790
1790
|
"value": 3,
|
|
1791
|
-
"unit": "days"
|
|
1791
|
+
"unit": "days",
|
|
1792
|
+
"conditionalOn": "channels.sms == true",
|
|
1793
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
1792
1794
|
},
|
|
1793
1795
|
{
|
|
1794
1796
|
"type": "send_email",
|
|
@@ -479,7 +479,7 @@
|
|
|
479
479
|
},
|
|
480
480
|
{
|
|
481
481
|
"ref": "email_template.review_email_1",
|
|
482
|
-
"name": "Review Request -
|
|
482
|
+
"name": "Review Request - Email",
|
|
483
483
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
484
484
|
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you again for your appointment with {{custom_values.business_name}} this week.</p><p style=\"margin:0 0 14px;\">If it went well, a short review is the most useful thing you could do for us. It takes about a minute and it is how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything was not right, reply to this email instead and I will fix it personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
485
485
|
}
|
|
@@ -815,10 +815,10 @@
|
|
|
815
815
|
},
|
|
816
816
|
{
|
|
817
817
|
"ref": "email.review_email_1",
|
|
818
|
-
"name": "Review Request -
|
|
818
|
+
"name": "Review Request - Email",
|
|
819
819
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
820
820
|
"templateRef": "email_template.review_email_1",
|
|
821
|
-
"copyDirection": "
|
|
821
|
+
"copyDirection": "After a completed appointment with no review yet (three days after the text when texting is on). Thank them, why it matters, the review button, and an honest line: if anything was not right, reply instead. Tone: brief.voice.threeWords.",
|
|
822
822
|
"mergeTags": [
|
|
823
823
|
"contact.first_name",
|
|
824
824
|
"custom_values.business_name",
|
|
@@ -1764,7 +1764,9 @@
|
|
|
1764
1764
|
{
|
|
1765
1765
|
"type": "wait",
|
|
1766
1766
|
"value": 3,
|
|
1767
|
-
"unit": "days"
|
|
1767
|
+
"unit": "days",
|
|
1768
|
+
"conditionalOn": "channels.sms == true",
|
|
1769
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
1768
1770
|
},
|
|
1769
1771
|
{
|
|
1770
1772
|
"type": "send_email",
|
|
@@ -810,7 +810,7 @@
|
|
|
810
810
|
},
|
|
811
811
|
{
|
|
812
812
|
"ref": "email_template.review_email_1",
|
|
813
|
-
"name": "Review Request -
|
|
813
|
+
"name": "Review Request - Email",
|
|
814
814
|
"_source": "[NO REAL SOURCE: proposed] No review request exists in any account read. Med-spa shape; never incentivized.",
|
|
815
815
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
816
816
|
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you for choosing {{custom_values.business_name}}.</p><p style=\"margin:0 0 14px;\">If your experience has been good, a short review is the most useful thing you could do for us. It takes about a minute and it's how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything hasn't been right, reply to this email instead and I'll fix it personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
@@ -1475,7 +1475,7 @@
|
|
|
1475
1475
|
},
|
|
1476
1476
|
{
|
|
1477
1477
|
"ref": "email.review_email_1",
|
|
1478
|
-
"name": "Review Request -
|
|
1478
|
+
"name": "Review Request - Email",
|
|
1479
1479
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
1480
1480
|
"templateRef": "email_template.review_email_1",
|
|
1481
1481
|
"copyDirection": "Three days after the review text. Thank, why it matters, the link, reply if something is wrong.",
|
|
@@ -3558,7 +3558,9 @@
|
|
|
3558
3558
|
{
|
|
3559
3559
|
"type": "wait",
|
|
3560
3560
|
"value": 3,
|
|
3561
|
-
"unit": "days"
|
|
3561
|
+
"unit": "days",
|
|
3562
|
+
"conditionalOn": "channels.sms == true",
|
|
3563
|
+
"_note": "Only between the text and the email: with texting off the email is the first touch and goes after the first wait (cockpit audit 2026-10-28 #24)."
|
|
3562
3564
|
},
|
|
3563
3565
|
{
|
|
3564
3566
|
"type": "send_email",
|
|
@@ -3759,7 +3761,7 @@
|
|
|
3759
3761
|
"owner": "OPERATOR-EXT",
|
|
3760
3762
|
"title": "Register A2P 10DLC (so texts can send)",
|
|
3761
3763
|
"trigger": "channels.sms == true",
|
|
3762
|
-
"instruction": "Submit your A2P brand and campaign in the GHL Trust Center. Use case: Low Volume Mixed, typically 2-8 messages per month. The trial booking form
|
|
3764
|
+
"instruction": "Submit your A2P brand and campaign in the GHL Trust Center. Use case: Low Volume Mixed, typically 2-8 messages per month. The trial booking form built for this account is the only opt-in (it works on your website or on its own GoHighLevel link, so you need no website for this): quote its two consent boxes (one for appointment texts, one for offers), both left unticked until the person ticks them, word for word. Keep health and weight-loss claims off the website and out of your sample messages, because carriers reject them. Switch on the automations that send texts only after this registration is approved. Save your full submission before you submit it.",
|
|
3763
3765
|
"produces": null,
|
|
3764
3766
|
"successCheck": "A2P campaign status shows submitted or approved",
|
|
3765
3767
|
"blocks": [
|