@elitedcs/ghl-mcp 3.12.0 → 3.13.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 +59 -0
- package/README.md +1 -1
- package/dist/index.js +133 -62
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.13.0 — Memberships read + 200-tool milestone (gap-closure round 6, final)
|
|
4
|
+
|
|
5
|
+
**201 tools across 43 modules. Bundle: ~318 KB.**
|
|
6
|
+
|
|
7
|
+
Closes the last Phase-2 gap. Memberships read tools — and the tool count crosses 200.
|
|
8
|
+
|
|
9
|
+
### 3 new tools (Firebase-gated, read-only)
|
|
10
|
+
|
|
11
|
+
- **`list_membership_offers`** — offers + products in one call (`{products, offers}`). Products are courses/communities; offers are the access grants.
|
|
12
|
+
- **`list_membership_categories`** — all course categories in a location.
|
|
13
|
+
- **`list_membership_lessons`** — all course lessons in a location.
|
|
14
|
+
|
|
15
|
+
Most useful for fetching the IDs that membership trigger conditions reference: `offer_access_granted`, `product_completed`, `category_completed`, `lesson_completed`, etc.
|
|
16
|
+
|
|
17
|
+
### Endpoint discovery
|
|
18
|
+
|
|
19
|
+
From the workflow bundle's `LocationMembership` class:
|
|
20
|
+
```js
|
|
21
|
+
membershipUrl = `${config.membershipURL}` // → backend.leadconnectorhq.com/membership
|
|
22
|
+
endpoint = `${membershipUrl}/smart-list/offers-products/${locationId}`
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Verified endpoints (Firebase auth):
|
|
26
|
+
- `GET /membership/smart-list/offers-products/{loc}`
|
|
27
|
+
- `GET /membership/smart-list/location/{loc}/workflow?type=category`
|
|
28
|
+
- `GET /membership/smart-list/location/{loc}/workflow?type=lesson`
|
|
29
|
+
|
|
30
|
+
Bearer/PIT returns 401 — Firebase-gated, same as the other internal-API tools.
|
|
31
|
+
|
|
32
|
+
### Read-only by design
|
|
33
|
+
|
|
34
|
+
The workflow bundle only READS membership data (to populate trigger/action dropdowns). Creating/editing courses, offers, and lessons lives in the Memberships app and isn't exposed here — that would need a DevTools capture against a live account with actual courses. The per-product (`?product_id=`) and per-category (`/category/{id}/lessons`) filtered endpoints returned 401 for synthetic IDs and couldn't be verified without real course data, so they're not exposed; the location-scoped "list all" endpoints return everything anyway.
|
|
35
|
+
|
|
36
|
+
### Phase-2 complete
|
|
37
|
+
|
|
38
|
+
All 6 Phase-2 gap areas from the v3.8.1 analysis have now been addressed:
|
|
39
|
+
|
|
40
|
+
| Area | Result |
|
|
41
|
+
|---|---|
|
|
42
|
+
| Email templates | list/create/update (v3.10.0) |
|
|
43
|
+
| SMS/snippet templates | list-only — write is scope-walled (v3.10.1) |
|
|
44
|
+
| Smart Lists | full CRUD (v3.11.0) |
|
|
45
|
+
| Reputation | review-link-list; reviews capture-pending (v3.11.1) |
|
|
46
|
+
| Email campaigns | list (fixed) + create-draft; send capture-pending (v3.12.0) |
|
|
47
|
+
| Memberships | read-only (this release) |
|
|
48
|
+
|
|
49
|
+
The recurring limiter: high-value write actions (send a campaign, list reviews, create a course, delete a template) sit behind either GHL's IAM wall or location-resolution quirks that need a DevTools capture against a live account. Read + create-draft surfaces were reachable; full write automation for those areas is the next frontier when a live-account capture session happens.
|
|
50
|
+
|
|
51
|
+
### Tool count impact
|
|
52
|
+
|
|
53
|
+
- Total: 198 → 201 (+3) — crosses 200
|
|
54
|
+
- Modules: 42 → 43
|
|
55
|
+
|
|
56
|
+
### Files changed
|
|
57
|
+
|
|
58
|
+
- `src/tools/memberships.ts` — NEW
|
|
59
|
+
- `src/tools/index.ts` — registered membership tools
|
|
60
|
+
- `src/setup-tool.ts` — count 198 → 201
|
|
61
|
+
|
|
3
62
|
## 3.12.0 — Email campaigns: create-draft + list fix (gap-closure round 5)
|
|
4
63
|
|
|
5
64
|
**198 tools across 42 modules. Bundle: ~316 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.** 201 tools across 43 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
|
|
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.13.0",
|
|
35
|
+
description: "GoHighLevel MCP Server for Claude. 201 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"
|
|
@@ -6245,42 +6245,112 @@ ${text2}`);
|
|
|
6245
6245
|
);
|
|
6246
6246
|
}
|
|
6247
6247
|
|
|
6248
|
-
// src/tools/
|
|
6248
|
+
// src/tools/memberships.ts
|
|
6249
6249
|
var import_zod43 = require("zod");
|
|
6250
|
+
var MEMBERSHIP_BASE = "https://backend.leadconnectorhq.com/membership";
|
|
6251
|
+
function registerMembershipTools(server2, builderClient) {
|
|
6252
|
+
const client = builderClient;
|
|
6253
|
+
if (!client) return;
|
|
6254
|
+
async function membershipRequest(path6) {
|
|
6255
|
+
const headers = await client.buildHeaders();
|
|
6256
|
+
const response = await fetch(`${MEMBERSHIP_BASE}${path6}`, { method: "GET", headers });
|
|
6257
|
+
if (!response.ok) {
|
|
6258
|
+
const text2 = await response.text();
|
|
6259
|
+
throw new Error(`Membership API Error ${response.status}: GET ${path6}
|
|
6260
|
+
${text2}`);
|
|
6261
|
+
}
|
|
6262
|
+
const text = await response.text();
|
|
6263
|
+
if (!text) return {};
|
|
6264
|
+
return JSON.parse(text);
|
|
6265
|
+
}
|
|
6266
|
+
server2.tool(
|
|
6267
|
+
"list_membership_offers",
|
|
6268
|
+
"List a location's membership offers and products in one call. Returns { products: [...], offers: [...] }. Products are courses/communities; offers are the access grants (what a contact gets enrolled in). Use the returned ids with membership trigger conditions like offer_access_granted / product_completed. READ-ONLY \u2014 creating offers/products happens in the GHL Memberships UI.",
|
|
6269
|
+
{
|
|
6270
|
+
locationId: import_zod43.z.string().optional().describe("Location ID. Falls back to the active builder client's location.")
|
|
6271
|
+
},
|
|
6272
|
+
async ({ locationId: locationId2 }) => {
|
|
6273
|
+
try {
|
|
6274
|
+
const loc = locationId2 ?? client.locationId;
|
|
6275
|
+
const result = await membershipRequest(`/smart-list/offers-products/${loc}`);
|
|
6276
|
+
return jsonResponse(result);
|
|
6277
|
+
} catch (error) {
|
|
6278
|
+
return errorResponse(error);
|
|
6279
|
+
}
|
|
6280
|
+
}
|
|
6281
|
+
);
|
|
6282
|
+
server2.tool(
|
|
6283
|
+
"list_membership_categories",
|
|
6284
|
+
"List all membership/course categories in a location. Categories group lessons inside a course/product. Use the returned ids with the category_completed / category_started trigger conditions. READ-ONLY.",
|
|
6285
|
+
{
|
|
6286
|
+
limit: import_zod43.z.number().optional().describe("Max categories to return. Defaults to a large value (effectively all)."),
|
|
6287
|
+
locationId: import_zod43.z.string().optional().describe("Location ID. Falls back to the active builder client's location.")
|
|
6288
|
+
},
|
|
6289
|
+
async ({ limit, locationId: locationId2 }) => {
|
|
6290
|
+
try {
|
|
6291
|
+
const loc = locationId2 ?? client.locationId;
|
|
6292
|
+
const result = await membershipRequest(`/smart-list/location/${loc}/workflow?type=category&limit=${limit ?? 1e5}`);
|
|
6293
|
+
return jsonResponse(result);
|
|
6294
|
+
} catch (error) {
|
|
6295
|
+
return errorResponse(error);
|
|
6296
|
+
}
|
|
6297
|
+
}
|
|
6298
|
+
);
|
|
6299
|
+
server2.tool(
|
|
6300
|
+
"list_membership_lessons",
|
|
6301
|
+
"List all membership/course lessons in a location. Use the returned ids with the lesson_completed / lesson_started trigger conditions. READ-ONLY.",
|
|
6302
|
+
{
|
|
6303
|
+
limit: import_zod43.z.number().optional().describe("Max lessons to return. Defaults to a large value (effectively all)."),
|
|
6304
|
+
locationId: import_zod43.z.string().optional().describe("Location ID. Falls back to the active builder client's location.")
|
|
6305
|
+
},
|
|
6306
|
+
async ({ limit, locationId: locationId2 }) => {
|
|
6307
|
+
try {
|
|
6308
|
+
const loc = locationId2 ?? client.locationId;
|
|
6309
|
+
const result = await membershipRequest(`/smart-list/location/${loc}/workflow?type=lesson&limit=${limit ?? 1e5}`);
|
|
6310
|
+
return jsonResponse(result);
|
|
6311
|
+
} catch (error) {
|
|
6312
|
+
return errorResponse(error);
|
|
6313
|
+
}
|
|
6314
|
+
}
|
|
6315
|
+
);
|
|
6316
|
+
}
|
|
6317
|
+
|
|
6318
|
+
// src/tools/template-deployer.ts
|
|
6319
|
+
var import_zod44 = require("zod");
|
|
6250
6320
|
var fs3 = __toESM(require("fs"));
|
|
6251
6321
|
var path3 = __toESM(require("path"));
|
|
6252
6322
|
function delay3(ms) {
|
|
6253
6323
|
return new Promise((resolve5) => setTimeout(resolve5, ms));
|
|
6254
6324
|
}
|
|
6255
|
-
var TemplateSchema =
|
|
6256
|
-
templateName:
|
|
6257
|
-
templateVersion:
|
|
6258
|
-
description:
|
|
6259
|
-
questionnaire:
|
|
6260
|
-
id:
|
|
6261
|
-
question:
|
|
6262
|
-
type:
|
|
6263
|
-
required:
|
|
6264
|
-
placeholder:
|
|
6325
|
+
var TemplateSchema = import_zod44.z.object({
|
|
6326
|
+
templateName: import_zod44.z.string(),
|
|
6327
|
+
templateVersion: import_zod44.z.string().optional(),
|
|
6328
|
+
description: import_zod44.z.string().optional().default(""),
|
|
6329
|
+
questionnaire: import_zod44.z.array(import_zod44.z.object({
|
|
6330
|
+
id: import_zod44.z.string(),
|
|
6331
|
+
question: import_zod44.z.string(),
|
|
6332
|
+
type: import_zod44.z.string(),
|
|
6333
|
+
required: import_zod44.z.boolean().optional(),
|
|
6334
|
+
placeholder: import_zod44.z.string().optional()
|
|
6265
6335
|
})).optional().default([]),
|
|
6266
|
-
location:
|
|
6267
|
-
tags:
|
|
6268
|
-
customFields:
|
|
6269
|
-
name:
|
|
6270
|
-
dataType:
|
|
6336
|
+
location: import_zod44.z.record(import_zod44.z.unknown()).optional(),
|
|
6337
|
+
tags: import_zod44.z.array(import_zod44.z.string()).optional(),
|
|
6338
|
+
customFields: import_zod44.z.array(import_zod44.z.object({
|
|
6339
|
+
name: import_zod44.z.string(),
|
|
6340
|
+
dataType: import_zod44.z.string()
|
|
6271
6341
|
})).optional(),
|
|
6272
|
-
pipelines:
|
|
6273
|
-
name:
|
|
6274
|
-
stages:
|
|
6342
|
+
pipelines: import_zod44.z.array(import_zod44.z.object({
|
|
6343
|
+
name: import_zod44.z.string(),
|
|
6344
|
+
stages: import_zod44.z.array(import_zod44.z.object({ position: import_zod44.z.number(), name: import_zod44.z.string() }))
|
|
6275
6345
|
})).optional(),
|
|
6276
|
-
workflows:
|
|
6277
|
-
name:
|
|
6278
|
-
condition:
|
|
6279
|
-
actions:
|
|
6346
|
+
workflows: import_zod44.z.array(import_zod44.z.object({
|
|
6347
|
+
name: import_zod44.z.string(),
|
|
6348
|
+
condition: import_zod44.z.string().optional(),
|
|
6349
|
+
actions: import_zod44.z.array(import_zod44.z.record(import_zod44.z.unknown())).optional().default([])
|
|
6280
6350
|
})).optional(),
|
|
6281
|
-
calendars:
|
|
6282
|
-
name:
|
|
6283
|
-
description:
|
|
6351
|
+
calendars: import_zod44.z.array(import_zod44.z.object({
|
|
6352
|
+
name: import_zod44.z.string(),
|
|
6353
|
+
description: import_zod44.z.string().optional()
|
|
6284
6354
|
})).optional()
|
|
6285
6355
|
});
|
|
6286
6356
|
function registerTemplateDeployerTools(server2, client) {
|
|
@@ -6351,7 +6421,7 @@ function registerTemplateDeployerTools(server2, client) {
|
|
|
6351
6421
|
"get_template_questionnaire",
|
|
6352
6422
|
"Get the questionnaire for a specific template. Returns all the questions that need to be answered before deploying. Present these to the user one at a time in a conversational style.",
|
|
6353
6423
|
{
|
|
6354
|
-
templateFile:
|
|
6424
|
+
templateFile: import_zod44.z.string().describe("Path to the template JSON file (from list_templates).")
|
|
6355
6425
|
},
|
|
6356
6426
|
async ({ templateFile }) => {
|
|
6357
6427
|
try {
|
|
@@ -6384,10 +6454,10 @@ function registerTemplateDeployerTools(server2, client) {
|
|
|
6384
6454
|
"deploy_template",
|
|
6385
6455
|
"Deploy a template to set up a GHL sub-account. Creates tags, custom fields, pipelines with stages, calendars, workflows, and forms based on the template and the user's questionnaire answers. This is the main setup automation tool.",
|
|
6386
6456
|
{
|
|
6387
|
-
templateFile:
|
|
6388
|
-
answers:
|
|
6389
|
-
locationId:
|
|
6390
|
-
dryRun:
|
|
6457
|
+
templateFile: import_zod44.z.string().describe("Path to the template JSON file."),
|
|
6458
|
+
answers: import_zod44.z.record(import_zod44.z.unknown()).describe("Questionnaire answers keyed by question ID (e.g. {business_name: 'My Clinic', business_phone: '+15551234567', ...})."),
|
|
6459
|
+
locationId: import_zod44.z.string().optional().describe("Location ID to deploy to. Uses default if not specified."),
|
|
6460
|
+
dryRun: import_zod44.z.boolean().optional().describe("If true, shows what would be created without actually creating anything. Defaults to false.")
|
|
6391
6461
|
},
|
|
6392
6462
|
async ({ templateFile, answers, locationId: locationId2, dryRun }) => {
|
|
6393
6463
|
try {
|
|
@@ -6633,7 +6703,7 @@ ${errors.join("\n")}` : "\nNo errors!",
|
|
|
6633
6703
|
}
|
|
6634
6704
|
|
|
6635
6705
|
// src/tools/validators.ts
|
|
6636
|
-
var
|
|
6706
|
+
var import_zod45 = require("zod");
|
|
6637
6707
|
function extractFromTrigger(trigger, refs) {
|
|
6638
6708
|
const triggerName = String(trigger.name ?? trigger.type ?? "unnamed trigger");
|
|
6639
6709
|
const where = `trigger "${triggerName}"`;
|
|
@@ -6768,7 +6838,7 @@ function registerValidatorTools(server2, client, builderClient) {
|
|
|
6768
6838
|
"validate_workflow",
|
|
6769
6839
|
"Pre-flight ID validation for a deployed GHL workflow. Scans every trigger and action for references to pipelines, pipeline stages, custom fields, users, workflows, forms, calendars, and surveys; verifies each ID exists in the current location. Use this BEFORE publish_workflow when a workflow has been edited, or whenever a published workflow stops behaving as expected. Catches the silent-failure bug where invalid IDs make GHL skip all subsequent actions without warning. Returns a structured report of valid + missing references.",
|
|
6770
6840
|
{
|
|
6771
|
-
workflowId:
|
|
6841
|
+
workflowId: import_zod45.z.string().describe("The workflow ID to validate.")
|
|
6772
6842
|
},
|
|
6773
6843
|
async ({ workflowId }) => {
|
|
6774
6844
|
try {
|
|
@@ -7139,6 +7209,7 @@ function registerAllTools(server2, client, registry2, mcpVersion) {
|
|
|
7139
7209
|
registerSmartListTools(server2, builderClient);
|
|
7140
7210
|
registerReputationTools(server2, builderClient);
|
|
7141
7211
|
registerEmailCampaignTools(server2, builderClient);
|
|
7212
|
+
registerMembershipTools(server2, builderClient);
|
|
7142
7213
|
registerValidatorTools(server2, client, builderClient);
|
|
7143
7214
|
registerDiagnosticTools(server2, mcpVersion ?? "unknown", client, builderClient, registry2 ?? null);
|
|
7144
7215
|
registerLocationSwitcherTools(server2, client, builderClient, registry2, mcpVersion);
|
|
@@ -7148,18 +7219,18 @@ function registerAllTools(server2, client, registry2, mcpVersion) {
|
|
|
7148
7219
|
var fs4 = __toESM(require("fs"));
|
|
7149
7220
|
var path4 = __toESM(require("path"));
|
|
7150
7221
|
var os = __toESM(require("os"));
|
|
7151
|
-
var
|
|
7222
|
+
var import_zod46 = require("zod");
|
|
7152
7223
|
var APP_NAME = "elitedcs-ghl-mcp";
|
|
7153
|
-
var CredentialsSchema =
|
|
7154
|
-
license_key:
|
|
7155
|
-
email:
|
|
7156
|
-
verified_at:
|
|
7157
|
-
ghl_api_key:
|
|
7158
|
-
ghl_location_id:
|
|
7159
|
-
ghl_company_id:
|
|
7160
|
-
ghl_user_id:
|
|
7161
|
-
ghl_firebase_api_key:
|
|
7162
|
-
ghl_firebase_refresh_token:
|
|
7224
|
+
var CredentialsSchema = import_zod46.z.object({
|
|
7225
|
+
license_key: import_zod46.z.string().min(1),
|
|
7226
|
+
email: import_zod46.z.string().email(),
|
|
7227
|
+
verified_at: import_zod46.z.string().min(1),
|
|
7228
|
+
ghl_api_key: import_zod46.z.string().min(1),
|
|
7229
|
+
ghl_location_id: import_zod46.z.string().min(1),
|
|
7230
|
+
ghl_company_id: import_zod46.z.string().optional(),
|
|
7231
|
+
ghl_user_id: import_zod46.z.string().optional(),
|
|
7232
|
+
ghl_firebase_api_key: import_zod46.z.string().optional(),
|
|
7233
|
+
ghl_firebase_refresh_token: import_zod46.z.string().optional()
|
|
7163
7234
|
});
|
|
7164
7235
|
function appDataDir() {
|
|
7165
7236
|
const home = os.homedir();
|
|
@@ -7209,7 +7280,7 @@ function writeCredentials(creds) {
|
|
|
7209
7280
|
// src/setup-tool.ts
|
|
7210
7281
|
var os2 = __toESM(require("os"));
|
|
7211
7282
|
var crypto3 = __toESM(require("crypto"));
|
|
7212
|
-
var
|
|
7283
|
+
var import_zod47 = require("zod");
|
|
7213
7284
|
var LICENSE_API = "https://elitedcs.com/api/validate-license";
|
|
7214
7285
|
var GHL_API = "https://services.leadconnectorhq.com";
|
|
7215
7286
|
var FIREBASE_TOKEN_API = "https://securetoken.googleapis.com/v1/token";
|
|
@@ -7278,16 +7349,16 @@ async function validateFirebase(firebaseKey, refreshToken) {
|
|
|
7278
7349
|
function registerSetupTool(server2) {
|
|
7279
7350
|
server2.tool(
|
|
7280
7351
|
"setup_ghl_mcp",
|
|
7281
|
-
"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
|
|
7352
|
+
"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 201 tools (161 if you skip the optional Firebase fields; add Firebase later with enable_workflow_builder).",
|
|
7282
7353
|
{
|
|
7283
|
-
email:
|
|
7284
|
-
license_key:
|
|
7285
|
-
ghl_api_key:
|
|
7286
|
-
ghl_location_id:
|
|
7287
|
-
ghl_company_id:
|
|
7288
|
-
ghl_user_id:
|
|
7289
|
-
ghl_firebase_api_key:
|
|
7290
|
-
ghl_firebase_refresh_token:
|
|
7354
|
+
email: import_zod47.z.string().email().describe("Email used at purchase."),
|
|
7355
|
+
license_key: import_zod47.z.string().min(20).describe("License key from your purchase email."),
|
|
7356
|
+
ghl_api_key: import_zod47.z.string().min(10).describe("GHL Private Integration key (starts with 'pit-'). Created INSIDE the sub-account at Settings > Integrations > Private Integrations."),
|
|
7357
|
+
ghl_location_id: import_zod47.z.string().min(10).describe("GHL Location ID (sub-account ID). Found in your GHL URL: /location/THIS_PART/dashboard."),
|
|
7358
|
+
ghl_company_id: import_zod47.z.string().optional().describe("(Agency only) Company ID for multi-location access."),
|
|
7359
|
+
ghl_user_id: import_zod47.z.string().optional().describe("(Workflow Builder, optional) Firebase User ID. See README for browser capture instructions."),
|
|
7360
|
+
ghl_firebase_api_key: import_zod47.z.string().optional().describe("(Workflow Builder, optional) Firebase API Key starting with 'AIza'."),
|
|
7361
|
+
ghl_firebase_refresh_token: import_zod47.z.string().optional().describe("(Workflow Builder, optional) Firebase refresh token starting with 'AMf-'.")
|
|
7291
7362
|
},
|
|
7292
7363
|
async (args) => {
|
|
7293
7364
|
const lic = await validateLicense(args.email, args.license_key);
|
|
@@ -7333,7 +7404,7 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
|
|
|
7333
7404
|
ghl_firebase_api_key: workflowBuilderEnabled ? args.ghl_firebase_api_key?.trim() : void 0,
|
|
7334
7405
|
ghl_firebase_refresh_token: workflowBuilderEnabled ? args.ghl_firebase_refresh_token?.trim() : void 0
|
|
7335
7406
|
});
|
|
7336
|
-
const toolCount = workflowBuilderEnabled ? "
|
|
7407
|
+
const toolCount = workflowBuilderEnabled ? "201" : "161";
|
|
7337
7408
|
const wfLine = workflowBuilderEnabled ? "Workflow Builder: enabled." : "Workflow Builder: not configured (optional).";
|
|
7338
7409
|
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.";
|
|
7339
7410
|
return {
|
|
@@ -7361,11 +7432,11 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
|
|
|
7361
7432
|
function registerEnableWorkflowBuilderTool(server2) {
|
|
7362
7433
|
server2.tool(
|
|
7363
7434
|
"enable_workflow_builder",
|
|
7364
|
-
"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 161 to
|
|
7435
|
+
"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 161 to 201 after the next Claude restart.",
|
|
7365
7436
|
{
|
|
7366
|
-
ghl_user_id:
|
|
7367
|
-
ghl_firebase_api_key:
|
|
7368
|
-
ghl_firebase_refresh_token:
|
|
7437
|
+
ghl_user_id: import_zod47.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."),
|
|
7438
|
+
ghl_firebase_api_key: import_zod47.z.string().min(10).describe("Firebase API Key starting with 'AIza'. The string between 'firebase:authUser:' and ':[DEFAULT]' in the row's Key column."),
|
|
7439
|
+
ghl_firebase_refresh_token: import_zod47.z.string().min(10).describe("Firebase refresh token. value.stsTokenManager.refreshToken in the firebase:authUser row.")
|
|
7369
7440
|
},
|
|
7370
7441
|
async (args) => {
|
|
7371
7442
|
const existing = readCredentials();
|
|
@@ -7408,7 +7479,7 @@ DevTools steps: https://elitedcs.com/ghl-mcp-firebase`
|
|
|
7408
7479
|
"",
|
|
7409
7480
|
"Firebase credentials verified and saved.",
|
|
7410
7481
|
"",
|
|
7411
|
-
"**Restart Claude (quit fully and reopen) to load the workflow builder + funnel builder + pipeline builder + form builder + workflow cloner tools (
|
|
7482
|
+
"**Restart Claude (quit fully and reopen) to load the workflow builder + funnel builder + pipeline builder + form builder + workflow cloner tools (201 total).**",
|
|
7412
7483
|
"",
|
|
7413
7484
|
'After restart, try: "List my workflows in full detail" or "Validate workflow <id>".',
|
|
7414
7485
|
"",
|
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.13.0",
|
|
4
|
+
"description": "GoHighLevel MCP Server for Claude. 201 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"
|