@elitedcs/ghl-mcp 3.9.0 → 3.10.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 +41 -0
- package/README.md +4 -4
- package/dist/index.js +63 -7
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.10.0 — Email Templates (gap-closure round 2)
|
|
4
|
+
|
|
5
|
+
**190 tools across 39 modules. Bundle: 304.6 KB.**
|
|
6
|
+
|
|
7
|
+
Closes another buyer-visible gap from the v3.8.1 analysis. Email templates power both standalone marketing emails and workflow email actions — agencies have been asking for programmatic management since day one.
|
|
8
|
+
|
|
9
|
+
### How GHL's API is structured
|
|
10
|
+
GHL calls these "builders" in the public API (the term comes from the drag-and-drop email-builder UI). One template is one builder. Each template has metadata (id, title, type, version, lastUpdated) plus HTML content stored separately in Firebase storage.
|
|
11
|
+
|
|
12
|
+
### 3 new tools
|
|
13
|
+
- **`list_email_templates`** — paginated list of all email templates in a location
|
|
14
|
+
- **`create_email_template`** — create a template shell. Required: `title`, `type` (one of `html`, `folder`, `import`, `builder`, `blank`, `ai_template`, `vibe-editor`). Response includes the new template `id`.
|
|
15
|
+
- **`update_email_template`** — save HTML content into an existing template. Takes `templateId`, `html`, `editorType` (one of `html`, `builder`), and optional `updatedBy` (defaults to "mcp"). Response includes the Firebase storage preview URL.
|
|
16
|
+
|
|
17
|
+
### Endpoint discovery transparency
|
|
18
|
+
Probed extensively. **Three endpoints work on the public API:**
|
|
19
|
+
- `GET /emails/builder?locationId=X` — list ✅
|
|
20
|
+
- `POST /emails/builder` with `{locationId, title, type}` — create ✅
|
|
21
|
+
- `POST /emails/builder/data` with `{locationId, templateId, html, editorType, updatedBy}` — save content ✅
|
|
22
|
+
|
|
23
|
+
**Three operations are NOT on the public API:**
|
|
24
|
+
- `GET /emails/builder/{id}` returns 404 — single-get doesn't exist
|
|
25
|
+
- `PUT /emails/builder/{id}` returns 404 — renaming after create is not exposed
|
|
26
|
+
- `DELETE /emails/builder/{id}` returns 404 — deletion is not exposed (also tried on the internal backend.leadconnectorhq.com host with the same auth — still 404)
|
|
27
|
+
|
|
28
|
+
These three likely live on GHL's internal API behind Firebase auth. Reaching them would need the same DevTools-capture work that unlocked workflow-builder and funnel-builder. Buyers can delete/rename via the GHL UI for now.
|
|
29
|
+
|
|
30
|
+
### Round-trip verified against MCP Testing
|
|
31
|
+
- 3/3 new tools registered (190 total)
|
|
32
|
+
- Created template → saved HTML content with merge-field syntax → listed and confirmed the template appeared with the new `templateType: html` flag and a Firebase storage preview URL.
|
|
33
|
+
|
|
34
|
+
### Tool count impact
|
|
35
|
+
- Total: 187 → 190 (+3)
|
|
36
|
+
- Without Firebase: 157 → 160 (all new tools are public API)
|
|
37
|
+
|
|
38
|
+
### Field-name quirk worth knowing
|
|
39
|
+
On WRITE, the title field is called `title`. On READ in the list response, it shows up as `name`. The `create_email_template` tool's parameter is `title` (matching write); the list response gives buyers `name` (matching GHL's read shape). Not something Claude needs to worry about — the tools handle the conversion implicitly.
|
|
40
|
+
|
|
41
|
+
### Files changed
|
|
42
|
+
- `src/tools/emails.ts` — added 3 template tools alongside the existing `get_email_campaigns`
|
|
43
|
+
|
|
3
44
|
## 3.9.0 — Products + Trigger Links CRUD (gap-closure round 1)
|
|
4
45
|
|
|
5
46
|
**187 tools across 39 modules. Bundle: 300.9 KB.**
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# GHL Command — GoHighLevel MCP Server
|
|
2
2
|
|
|
3
|
-
**Full GoHighLevel API access for Claude.**
|
|
3
|
+
**Full GoHighLevel API access for Claude.** 190 tools across 39 modules — manage contacts, conversations, pipelines, calendars, funnels, workflows, invoices, custom objects, webhooks, and more. **Includes full workflow builder, funnel/page editor, form builder, pipeline builder, bulk operations, account export, and workflow cloning** — capabilities no other GHL tool offers.
|
|
4
4
|
|
|
5
5
|
**Distributed via npm as [`@elitedcs/ghl-mcp`](https://www.npmjs.com/package/@elitedcs/ghl-mcp).** Buyers install with one config block — no git, no Node.js setup, no terminal commands. Updates flow automatically (`npx @latest` re-resolves on every Claude restart).
|
|
6
6
|
|
|
@@ -138,7 +138,7 @@ https://app.gohighlevel.com/v2/location/YOUR_LOCATION_ID/dashboard
|
|
|
138
138
|
|
|
139
139
|
## Enable Workflow Builder (Optional)
|
|
140
140
|
|
|
141
|
-
The 30 builder + cloner + validator tools (workflow builder, funnel builder, form builder, pipeline builder, workflow cloner, validate_workflow) use GHL'''s internal API and require Firebase credentials. Without them, the other
|
|
141
|
+
The 30 builder + cloner + validator tools (workflow builder, funnel builder, form builder, pipeline builder, workflow cloner, validate_workflow) use GHL'''s internal API and require Firebase credentials. Without them, the other 160 tools work fine — you just won'''t have workflow/funnel/form/pipeline editing.
|
|
142
142
|
|
|
143
143
|
Grab the three values from your GHL browser session, then re-run `setup_ghl_mcp` with them:
|
|
144
144
|
|
|
@@ -167,9 +167,9 @@ Re-run setup_ghl_mcp with workflow builder:
|
|
|
167
167
|
|
|
168
168
|
---
|
|
169
169
|
|
|
170
|
-
## Tools (
|
|
170
|
+
## Tools (190)
|
|
171
171
|
|
|
172
|
-
> **v3.
|
|
172
|
+
> **v3.10.0 adds Email Templates** (`list_email_templates`, `create_email_template`, `update_email_template`) — Claude can now create new HTML email templates and save content into them via the public API. Templates power both standalone marketing emails and workflow email actions. Delete + rename remain UI-only (no public-API endpoint exists).
|
|
173
173
|
|
|
174
174
|
### CRM & Contacts (15 tools)
|
|
175
175
|
|
package/dist/index.js
CHANGED
|
@@ -31,8 +31,8 @@ var require_package = __commonJS({
|
|
|
31
31
|
"package.json"(exports2, module2) {
|
|
32
32
|
module2.exports = {
|
|
33
33
|
name: "@elitedcs/ghl-mcp",
|
|
34
|
-
version: "3.
|
|
35
|
-
description: "GoHighLevel MCP Server for Claude.
|
|
34
|
+
version: "3.10.0",
|
|
35
|
+
description: "GoHighLevel MCP Server for Claude. 190 tools \u2014 full CRM, automation, marketing control, and the only programmatic GHL workflow builder.",
|
|
36
36
|
main: "dist/index.js",
|
|
37
37
|
bin: {
|
|
38
38
|
"ghl-mcp": "dist/index.js"
|
|
@@ -3577,11 +3577,13 @@ function registerBlogTools(server2, client) {
|
|
|
3577
3577
|
|
|
3578
3578
|
// src/tools/emails.ts
|
|
3579
3579
|
var import_zod24 = require("zod");
|
|
3580
|
+
var TEMPLATE_TYPES = ["html", "folder", "import", "builder", "blank", "ai_template", "vibe-editor"];
|
|
3581
|
+
var EDITOR_TYPES = ["html", "builder"];
|
|
3580
3582
|
function registerEmailTools(server2, client) {
|
|
3581
3583
|
safeTool(
|
|
3582
3584
|
server2,
|
|
3583
3585
|
"get_email_campaigns",
|
|
3584
|
-
"List email campaigns for a location",
|
|
3586
|
+
"List email campaigns for a location.",
|
|
3585
3587
|
{
|
|
3586
3588
|
locationId: import_zod24.z.string().optional().describe("GHL Location ID (optional if GHL_LOCATION_ID is set)")
|
|
3587
3589
|
},
|
|
@@ -3592,6 +3594,60 @@ function registerEmailTools(server2, client) {
|
|
|
3592
3594
|
});
|
|
3593
3595
|
}
|
|
3594
3596
|
);
|
|
3597
|
+
safeTool(
|
|
3598
|
+
server2,
|
|
3599
|
+
"list_email_templates",
|
|
3600
|
+
"List email templates ('builders') in a location. Templates power both standalone marketing emails and email actions inside workflows. Returns each template's id, name (display title), type, version, last-updated timestamp, and Firebase storage preview URL.",
|
|
3601
|
+
{
|
|
3602
|
+
locationId: import_zod24.z.string().optional().describe("GHL Location ID (optional if GHL_LOCATION_ID is set).")
|
|
3603
|
+
},
|
|
3604
|
+
async ({ locationId: locationId2 }) => {
|
|
3605
|
+
const resolvedLocationId = client.resolveLocationId(locationId2);
|
|
3606
|
+
return client.get("/emails/builder", {
|
|
3607
|
+
params: { locationId: resolvedLocationId }
|
|
3608
|
+
});
|
|
3609
|
+
}
|
|
3610
|
+
);
|
|
3611
|
+
safeTool(
|
|
3612
|
+
server2,
|
|
3613
|
+
"create_email_template",
|
|
3614
|
+
"Create a new email template (a 'builder' in GHL's API). Creates the metadata shell; use update_email_template to save HTML content into it. After creation, the response includes the template `id` which you'll use with update_email_template + when referencing the template from workflow email actions.",
|
|
3615
|
+
{
|
|
3616
|
+
title: import_zod24.z.string().describe("Display name for the template (e.g., 'May Newsletter \u2014 V2'). Shown in the GHL UI. Note: GHL stores this as `name` on read but expects `title` on write."),
|
|
3617
|
+
type: import_zod24.z.enum(TEMPLATE_TYPES).describe("Template kind. 'blank' = empty starting point. 'html' = raw HTML import. 'builder' = drag-and-drop builder. 'import' = imported from an external source. 'ai_template' / 'vibe-editor' = AI-generated. 'folder' = organizational folder (no content)."),
|
|
3618
|
+
locationId: import_zod24.z.string().optional().describe("Location ID. Falls back to GHL_LOCATION_ID env var.")
|
|
3619
|
+
},
|
|
3620
|
+
async ({ title, type, locationId: locationId2 }) => {
|
|
3621
|
+
const resolvedLocationId = client.resolveLocationId(locationId2);
|
|
3622
|
+
return client.post("/emails/builder", {
|
|
3623
|
+
body: { locationId: resolvedLocationId, title, type }
|
|
3624
|
+
});
|
|
3625
|
+
}
|
|
3626
|
+
);
|
|
3627
|
+
safeTool(
|
|
3628
|
+
server2,
|
|
3629
|
+
"update_email_template",
|
|
3630
|
+
"Save HTML content into an existing email template. Use this to update the body of a template after `create_email_template`. The `updatedBy` field is required by GHL; defaults to 'mcp' if not provided. Note: this updates CONTENT only. Renaming the title or deleting the template is not yet possible through the public API \u2014 do those in the GHL UI for now.",
|
|
3631
|
+
{
|
|
3632
|
+
templateId: import_zod24.z.string().describe("The template ID to update (from create_email_template or list_email_templates)."),
|
|
3633
|
+
html: import_zod24.z.string().describe("The full HTML body of the email. Can include merge fields like {{contact.first_name}}."),
|
|
3634
|
+
editorType: import_zod24.z.enum(EDITOR_TYPES).describe("Which editor produced this content. 'html' for raw HTML; 'builder' if you're saving a drag-and-drop builder export. After this save, the template will be flagged as the chosen editorType in lists."),
|
|
3635
|
+
updatedBy: import_zod24.z.string().optional().describe("Identifier of who's making the change (a user ID or label). Defaults to 'mcp' if omitted. Shown in the GHL audit log for this template."),
|
|
3636
|
+
locationId: import_zod24.z.string().optional().describe("Location ID. Falls back to GHL_LOCATION_ID env var.")
|
|
3637
|
+
},
|
|
3638
|
+
async ({ templateId, html, editorType, updatedBy, locationId: locationId2 }) => {
|
|
3639
|
+
const resolvedLocationId = client.resolveLocationId(locationId2);
|
|
3640
|
+
return client.post("/emails/builder/data", {
|
|
3641
|
+
body: {
|
|
3642
|
+
locationId: resolvedLocationId,
|
|
3643
|
+
templateId,
|
|
3644
|
+
html,
|
|
3645
|
+
editorType,
|
|
3646
|
+
updatedBy: updatedBy ?? "mcp"
|
|
3647
|
+
}
|
|
3648
|
+
});
|
|
3649
|
+
}
|
|
3650
|
+
);
|
|
3595
3651
|
}
|
|
3596
3652
|
|
|
3597
3653
|
// src/tools/trigger-links.ts
|
|
@@ -6965,7 +7021,7 @@ async function validateFirebase(firebaseKey, refreshToken) {
|
|
|
6965
7021
|
function registerSetupTool(server2) {
|
|
6966
7022
|
server2.tool(
|
|
6967
7023
|
"setup_ghl_mcp",
|
|
6968
|
-
"First-run setup for GHL Command MCP. Validates your license and GHL credentials, then writes them to a per-user credentials file. Restart Claude after this completes to load all
|
|
7024
|
+
"First-run setup for GHL Command MCP. Validates your license and GHL credentials, then writes them to a per-user credentials file. Restart Claude after this completes to load all 190 tools (160 if you skip the optional Firebase fields; add Firebase later with enable_workflow_builder).",
|
|
6969
7025
|
{
|
|
6970
7026
|
email: import_zod43.z.string().email().describe("Email used at purchase."),
|
|
6971
7027
|
license_key: import_zod43.z.string().min(20).describe("License key from your purchase email."),
|
|
@@ -7020,7 +7076,7 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
|
|
|
7020
7076
|
ghl_firebase_api_key: workflowBuilderEnabled ? args.ghl_firebase_api_key?.trim() : void 0,
|
|
7021
7077
|
ghl_firebase_refresh_token: workflowBuilderEnabled ? args.ghl_firebase_refresh_token?.trim() : void 0
|
|
7022
7078
|
});
|
|
7023
|
-
const toolCount = workflowBuilderEnabled ? "
|
|
7079
|
+
const toolCount = workflowBuilderEnabled ? "190" : "160";
|
|
7024
7080
|
const wfLine = workflowBuilderEnabled ? "Workflow Builder: enabled." : "Workflow Builder: not configured (optional).";
|
|
7025
7081
|
const wfTip = workflowBuilderEnabled ? "" : "\nTo enable Workflow Builder later (8 extra tools): run enable_workflow_builder with your three Firebase values. No need to re-enter license/API key/location ID.";
|
|
7026
7082
|
return {
|
|
@@ -7048,7 +7104,7 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
|
|
|
7048
7104
|
function registerEnableWorkflowBuilderTool(server2) {
|
|
7049
7105
|
server2.tool(
|
|
7050
7106
|
"enable_workflow_builder",
|
|
7051
|
-
"Add Firebase credentials to an existing GHL Command install to unlock 30 additional tools across 6 modules: workflow builder (create/edit/clone/delete/publish/validate workflows, build_if_else_branch, build_goal_event, get_trigger_registry), funnel + page builder (10 tools), form builder (5 tools), pipeline builder (5 tools), and workflow cloning. Requires you've already run setup_ghl_mcp. Capture the three Firebase values from your GHL browser session \u2014 see elitedcs.com/ghl-mcp-firebase for step-by-step DevTools instructions. Tool count goes from
|
|
7107
|
+
"Add Firebase credentials to an existing GHL Command install to unlock 30 additional tools across 6 modules: workflow builder (create/edit/clone/delete/publish/validate workflows, build_if_else_branch, build_goal_event, get_trigger_registry), funnel + page builder (10 tools), form builder (5 tools), pipeline builder (5 tools), and workflow cloning. Requires you've already run setup_ghl_mcp. Capture the three Firebase values from your GHL browser session \u2014 see elitedcs.com/ghl-mcp-firebase for step-by-step DevTools instructions. Tool count goes from 160 to 190 after the next Claude restart.",
|
|
7052
7108
|
{
|
|
7053
7109
|
ghl_user_id: import_zod43.z.string().min(10).describe("Firebase User ID (uid). DevTools \u2192 Application \u2192 IndexedDB \u2192 firebaseLocalStorageDb \u2192 firebaseLocalStorage \u2192 the value.uid field of the firebase:authUser row."),
|
|
7054
7110
|
ghl_firebase_api_key: import_zod43.z.string().min(10).describe("Firebase API Key starting with 'AIza'. The string between 'firebase:authUser:' and ':[DEFAULT]' in the row's Key column."),
|
|
@@ -7095,7 +7151,7 @@ DevTools steps: https://elitedcs.com/ghl-mcp-firebase`
|
|
|
7095
7151
|
"",
|
|
7096
7152
|
"Firebase credentials verified and saved.",
|
|
7097
7153
|
"",
|
|
7098
|
-
"**Restart Claude (quit fully and reopen) to load the workflow builder + funnel builder + pipeline builder + form builder + workflow cloner tools (
|
|
7154
|
+
"**Restart Claude (quit fully and reopen) to load the workflow builder + funnel builder + pipeline builder + form builder + workflow cloner tools (190 total).**",
|
|
7099
7155
|
"",
|
|
7100
7156
|
'After restart, try: "List my workflows in full detail" or "Validate workflow <id>".',
|
|
7101
7157
|
"",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "GoHighLevel MCP Server for Claude.
|
|
3
|
+
"version": "3.10.0",
|
|
4
|
+
"description": "GoHighLevel MCP Server for Claude. 190 tools — full CRM, automation, marketing control, and the only programmatic GHL workflow builder.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"ghl-mcp": "dist/index.js"
|