@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 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.** 187 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.
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 157 tools work fine — you just won'''t have workflow/funnel/form/pipeline editing.
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 (187)
170
+ ## Tools (190)
171
171
 
172
- > **v3.9.0 closes the Products + Trigger Links gap.** New: full Products CRUD (`list_products`, `get_product`, `create_product`, `update_product`, `delete_product`, `list_product_prices`) — products underlie invoices, memberships, courses, and e-commerce. New: Trigger Links CRUD (`create_trigger_link`, `update_trigger_link`, `delete_trigger_link`) agencies use these for trackable links in campaigns. Both use the public GHL API (no Firebase needed).
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.9.0",
35
- description: "GoHighLevel MCP Server for Claude. 187 tools \u2014 full CRM, automation, marketing control, and the only programmatic GHL workflow builder.",
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 187 tools (157 if you skip the optional Firebase fields; add Firebase later with enable_workflow_builder).",
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 ? "187" : "157";
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 157 to 187 after the next Claude restart.",
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 (187 total).**",
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.9.0",
4
- "description": "GoHighLevel MCP Server for Claude. 187 tools — full CRM, automation, marketing control, and the only programmatic GHL workflow builder.",
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"