@elitedcs/ghl-mcp 3.11.0 → 3.11.1

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,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.11.1 — Reputation: review-link list (partial gap-closure round 4)
4
+
5
+ **197 tools across 41 modules. Bundle: ~315 KB.**
6
+
7
+ Partial close on the reputation gap. One verified tool shipped; the bigger reviews surface needs a DevTools capture against a live account.
8
+
9
+ ### New tool (Firebase-gated)
10
+
11
+ - **`get_review_link_list`** — lists the review-link destinations (Google, Facebook, etc.) configured for a location. Each entry has a label + the public review URL. Useful for building review-request workflows: the workflow goal condition `review_request_clicked` (shipped in v3.8.0) references these review-link ids.
12
+
13
+ Endpoint: `GET backend.leadconnectorhq.com/reputation/integrations/review-link-list?locationId=X` via Firebase auth. Verified 2026-05-22.
14
+
15
+ ### What's NOT shipped + why
16
+
17
+ The core reputation surface — listing the reviews that come BACK from Google/Facebook, responding to them, review-request campaigns — sits behind `/reputation/reviews`. That endpoint returns `401 "Unauthorized Access: undefined - No Location Found"` regardless of:
18
+ - bearer (PIT) vs Firebase auth
19
+ - which location header/param is sent (`location-id`, `locationid`, `location`, query param, path segment)
20
+
21
+ The `undefined` in the error means the endpoint reads a location field from the request that comes back empty — the GHL reputation UI sends something specific that black-box probing can't reproduce. **This needs a DevTools capture** of the exact request the reputation UI makes, against a live account that has connected review platforms (MCP Testing has none, so there'd be nothing to verify against anyway).
22
+
23
+ Documented as capture-pending in the tool's own description so the LLM gives buyers an honest answer.
24
+
25
+ ### Tool count impact
26
+
27
+ - Total: 196 → 197 (+1)
28
+ - Firebase-gated (the new tool uses internal-API auth)
29
+ - Modules: 40 → 41 (new reputation module)
30
+
31
+ ### Files changed
32
+
33
+ - `src/tools/reputation.ts` — NEW
34
+ - `src/tools/index.ts` — registered `registerReputationTools`
35
+ - `src/setup-tool.ts` — Firebase-mode count 196 → 197
36
+
3
37
  ## 3.11.0 — Smart Lists CRUD (gap-closure round 3)
4
38
 
5
39
  **196 tools across 40 modules. Bundle: 315.1 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.** 196 tools across 40 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.** 197 tools across 41 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.11.0",
35
- description: "GoHighLevel MCP Server for Claude. 196 tools \u2014 full CRM, automation, marketing control, and the only programmatic GHL workflow builder.",
34
+ version: "3.11.1",
35
+ description: "GoHighLevel MCP Server for Claude. 197 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"
@@ -6153,42 +6153,78 @@ ${text2}`);
6153
6153
  );
6154
6154
  }
6155
6155
 
6156
- // src/tools/template-deployer.ts
6156
+ // src/tools/reputation.ts
6157
6157
  var import_zod41 = require("zod");
6158
+ var REPUTATION_BASE = "https://backend.leadconnectorhq.com/reputation";
6159
+ function registerReputationTools(server2, builderClient) {
6160
+ const client = builderClient;
6161
+ if (!client) return;
6162
+ async function reputationRequest(method, path6) {
6163
+ const headers = await client.buildHeaders();
6164
+ const response = await fetch(`${REPUTATION_BASE}${path6}`, { method, headers });
6165
+ if (!response.ok) {
6166
+ const text2 = await response.text();
6167
+ throw new Error(`Reputation API Error ${response.status}: ${method} ${path6}
6168
+ ${text2}`);
6169
+ }
6170
+ const text = await response.text();
6171
+ if (!text) return {};
6172
+ return JSON.parse(text);
6173
+ }
6174
+ server2.tool(
6175
+ "get_review_link_list",
6176
+ "List the review-link destinations configured for a location \u2014 the platforms (Google, Facebook, etc.) where review requests send contacts. Each entry has a label and the public review URL. Useful for: building review-request workflows (the workflow goal condition `review_request_clicked` references these review-link ids), and auditing which review platforms a sub-account has connected. NOTE: listing the actual reviews that come BACK (and responding to them) is not yet available \u2014 that endpoint needs a DevTools capture against a live account with connected review platforms.",
6177
+ {
6178
+ locationId: import_zod41.z.string().optional().describe("Location ID. Falls back to the active builder client's location.")
6179
+ },
6180
+ async ({ locationId: locationId2 }) => {
6181
+ try {
6182
+ const loc = locationId2 ?? client.locationId;
6183
+ const result = await reputationRequest("GET", `/integrations/review-link-list?locationId=${loc}`);
6184
+ return jsonResponse(result);
6185
+ } catch (error) {
6186
+ return errorResponse(error);
6187
+ }
6188
+ }
6189
+ );
6190
+ }
6191
+
6192
+ // src/tools/template-deployer.ts
6193
+ var import_zod42 = require("zod");
6158
6194
  var fs3 = __toESM(require("fs"));
6159
6195
  var path3 = __toESM(require("path"));
6160
6196
  function delay3(ms) {
6161
6197
  return new Promise((resolve5) => setTimeout(resolve5, ms));
6162
6198
  }
6163
- var TemplateSchema = import_zod41.z.object({
6164
- templateName: import_zod41.z.string(),
6165
- templateVersion: import_zod41.z.string().optional(),
6166
- description: import_zod41.z.string().optional().default(""),
6167
- questionnaire: import_zod41.z.array(import_zod41.z.object({
6168
- id: import_zod41.z.string(),
6169
- question: import_zod41.z.string(),
6170
- type: import_zod41.z.string(),
6171
- required: import_zod41.z.boolean().optional(),
6172
- placeholder: import_zod41.z.string().optional()
6199
+ var TemplateSchema = import_zod42.z.object({
6200
+ templateName: import_zod42.z.string(),
6201
+ templateVersion: import_zod42.z.string().optional(),
6202
+ description: import_zod42.z.string().optional().default(""),
6203
+ questionnaire: import_zod42.z.array(import_zod42.z.object({
6204
+ id: import_zod42.z.string(),
6205
+ question: import_zod42.z.string(),
6206
+ type: import_zod42.z.string(),
6207
+ required: import_zod42.z.boolean().optional(),
6208
+ placeholder: import_zod42.z.string().optional()
6173
6209
  })).optional().default([]),
6174
- location: import_zod41.z.record(import_zod41.z.unknown()).optional(),
6175
- tags: import_zod41.z.array(import_zod41.z.string()).optional(),
6176
- customFields: import_zod41.z.array(import_zod41.z.object({
6177
- name: import_zod41.z.string(),
6178
- dataType: import_zod41.z.string()
6210
+ location: import_zod42.z.record(import_zod42.z.unknown()).optional(),
6211
+ tags: import_zod42.z.array(import_zod42.z.string()).optional(),
6212
+ customFields: import_zod42.z.array(import_zod42.z.object({
6213
+ name: import_zod42.z.string(),
6214
+ dataType: import_zod42.z.string()
6179
6215
  })).optional(),
6180
- pipelines: import_zod41.z.array(import_zod41.z.object({
6181
- name: import_zod41.z.string(),
6182
- stages: import_zod41.z.array(import_zod41.z.object({ position: import_zod41.z.number(), name: import_zod41.z.string() }))
6216
+ pipelines: import_zod42.z.array(import_zod42.z.object({
6217
+ name: import_zod42.z.string(),
6218
+ stages: import_zod42.z.array(import_zod42.z.object({ position: import_zod42.z.number(), name: import_zod42.z.string() }))
6183
6219
  })).optional(),
6184
- workflows: import_zod41.z.array(import_zod41.z.object({
6185
- name: import_zod41.z.string(),
6186
- condition: import_zod41.z.string().optional(),
6187
- actions: import_zod41.z.array(import_zod41.z.record(import_zod41.z.unknown())).optional().default([])
6220
+ workflows: import_zod42.z.array(import_zod42.z.object({
6221
+ name: import_zod42.z.string(),
6222
+ condition: import_zod42.z.string().optional(),
6223
+ actions: import_zod42.z.array(import_zod42.z.record(import_zod42.z.unknown())).optional().default([])
6188
6224
  })).optional(),
6189
- calendars: import_zod41.z.array(import_zod41.z.object({
6190
- name: import_zod41.z.string(),
6191
- description: import_zod41.z.string().optional()
6225
+ calendars: import_zod42.z.array(import_zod42.z.object({
6226
+ name: import_zod42.z.string(),
6227
+ description: import_zod42.z.string().optional()
6192
6228
  })).optional()
6193
6229
  });
6194
6230
  function registerTemplateDeployerTools(server2, client) {
@@ -6259,7 +6295,7 @@ function registerTemplateDeployerTools(server2, client) {
6259
6295
  "get_template_questionnaire",
6260
6296
  "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.",
6261
6297
  {
6262
- templateFile: import_zod41.z.string().describe("Path to the template JSON file (from list_templates).")
6298
+ templateFile: import_zod42.z.string().describe("Path to the template JSON file (from list_templates).")
6263
6299
  },
6264
6300
  async ({ templateFile }) => {
6265
6301
  try {
@@ -6292,10 +6328,10 @@ function registerTemplateDeployerTools(server2, client) {
6292
6328
  "deploy_template",
6293
6329
  "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.",
6294
6330
  {
6295
- templateFile: import_zod41.z.string().describe("Path to the template JSON file."),
6296
- answers: import_zod41.z.record(import_zod41.z.unknown()).describe("Questionnaire answers keyed by question ID (e.g. {business_name: 'My Clinic', business_phone: '+15551234567', ...})."),
6297
- locationId: import_zod41.z.string().optional().describe("Location ID to deploy to. Uses default if not specified."),
6298
- dryRun: import_zod41.z.boolean().optional().describe("If true, shows what would be created without actually creating anything. Defaults to false.")
6331
+ templateFile: import_zod42.z.string().describe("Path to the template JSON file."),
6332
+ answers: import_zod42.z.record(import_zod42.z.unknown()).describe("Questionnaire answers keyed by question ID (e.g. {business_name: 'My Clinic', business_phone: '+15551234567', ...})."),
6333
+ locationId: import_zod42.z.string().optional().describe("Location ID to deploy to. Uses default if not specified."),
6334
+ dryRun: import_zod42.z.boolean().optional().describe("If true, shows what would be created without actually creating anything. Defaults to false.")
6299
6335
  },
6300
6336
  async ({ templateFile, answers, locationId: locationId2, dryRun }) => {
6301
6337
  try {
@@ -6541,7 +6577,7 @@ ${errors.join("\n")}` : "\nNo errors!",
6541
6577
  }
6542
6578
 
6543
6579
  // src/tools/validators.ts
6544
- var import_zod42 = require("zod");
6580
+ var import_zod43 = require("zod");
6545
6581
  function extractFromTrigger(trigger, refs) {
6546
6582
  const triggerName = String(trigger.name ?? trigger.type ?? "unnamed trigger");
6547
6583
  const where = `trigger "${triggerName}"`;
@@ -6676,7 +6712,7 @@ function registerValidatorTools(server2, client, builderClient) {
6676
6712
  "validate_workflow",
6677
6713
  "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.",
6678
6714
  {
6679
- workflowId: import_zod42.z.string().describe("The workflow ID to validate.")
6715
+ workflowId: import_zod43.z.string().describe("The workflow ID to validate.")
6680
6716
  },
6681
6717
  async ({ workflowId }) => {
6682
6718
  try {
@@ -7045,6 +7081,7 @@ function registerAllTools(server2, client, registry2, mcpVersion) {
7045
7081
  registerPipelineBuilderTools(server2, builderClient);
7046
7082
  registerWorkflowClonerTools(server2, builderClient);
7047
7083
  registerSmartListTools(server2, builderClient);
7084
+ registerReputationTools(server2, builderClient);
7048
7085
  registerValidatorTools(server2, client, builderClient);
7049
7086
  registerDiagnosticTools(server2, mcpVersion ?? "unknown", client, builderClient, registry2 ?? null);
7050
7087
  registerLocationSwitcherTools(server2, client, builderClient, registry2, mcpVersion);
@@ -7054,18 +7091,18 @@ function registerAllTools(server2, client, registry2, mcpVersion) {
7054
7091
  var fs4 = __toESM(require("fs"));
7055
7092
  var path4 = __toESM(require("path"));
7056
7093
  var os = __toESM(require("os"));
7057
- var import_zod43 = require("zod");
7094
+ var import_zod44 = require("zod");
7058
7095
  var APP_NAME = "elitedcs-ghl-mcp";
7059
- var CredentialsSchema = import_zod43.z.object({
7060
- license_key: import_zod43.z.string().min(1),
7061
- email: import_zod43.z.string().email(),
7062
- verified_at: import_zod43.z.string().min(1),
7063
- ghl_api_key: import_zod43.z.string().min(1),
7064
- ghl_location_id: import_zod43.z.string().min(1),
7065
- ghl_company_id: import_zod43.z.string().optional(),
7066
- ghl_user_id: import_zod43.z.string().optional(),
7067
- ghl_firebase_api_key: import_zod43.z.string().optional(),
7068
- ghl_firebase_refresh_token: import_zod43.z.string().optional()
7096
+ var CredentialsSchema = import_zod44.z.object({
7097
+ license_key: import_zod44.z.string().min(1),
7098
+ email: import_zod44.z.string().email(),
7099
+ verified_at: import_zod44.z.string().min(1),
7100
+ ghl_api_key: import_zod44.z.string().min(1),
7101
+ ghl_location_id: import_zod44.z.string().min(1),
7102
+ ghl_company_id: import_zod44.z.string().optional(),
7103
+ ghl_user_id: import_zod44.z.string().optional(),
7104
+ ghl_firebase_api_key: import_zod44.z.string().optional(),
7105
+ ghl_firebase_refresh_token: import_zod44.z.string().optional()
7069
7106
  });
7070
7107
  function appDataDir() {
7071
7108
  const home = os.homedir();
@@ -7115,7 +7152,7 @@ function writeCredentials(creds) {
7115
7152
  // src/setup-tool.ts
7116
7153
  var os2 = __toESM(require("os"));
7117
7154
  var crypto3 = __toESM(require("crypto"));
7118
- var import_zod44 = require("zod");
7155
+ var import_zod45 = require("zod");
7119
7156
  var LICENSE_API = "https://elitedcs.com/api/validate-license";
7120
7157
  var GHL_API = "https://services.leadconnectorhq.com";
7121
7158
  var FIREBASE_TOKEN_API = "https://securetoken.googleapis.com/v1/token";
@@ -7184,16 +7221,16 @@ async function validateFirebase(firebaseKey, refreshToken) {
7184
7221
  function registerSetupTool(server2) {
7185
7222
  server2.tool(
7186
7223
  "setup_ghl_mcp",
7187
- "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 196 tools (161 if you skip the optional Firebase fields; add Firebase later with enable_workflow_builder).",
7224
+ "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 197 tools (161 if you skip the optional Firebase fields; add Firebase later with enable_workflow_builder).",
7188
7225
  {
7189
- email: import_zod44.z.string().email().describe("Email used at purchase."),
7190
- license_key: import_zod44.z.string().min(20).describe("License key from your purchase email."),
7191
- ghl_api_key: import_zod44.z.string().min(10).describe("GHL Private Integration key (starts with 'pit-'). Created INSIDE the sub-account at Settings > Integrations > Private Integrations."),
7192
- ghl_location_id: import_zod44.z.string().min(10).describe("GHL Location ID (sub-account ID). Found in your GHL URL: /location/THIS_PART/dashboard."),
7193
- ghl_company_id: import_zod44.z.string().optional().describe("(Agency only) Company ID for multi-location access."),
7194
- ghl_user_id: import_zod44.z.string().optional().describe("(Workflow Builder, optional) Firebase User ID. See README for browser capture instructions."),
7195
- ghl_firebase_api_key: import_zod44.z.string().optional().describe("(Workflow Builder, optional) Firebase API Key starting with 'AIza'."),
7196
- ghl_firebase_refresh_token: import_zod44.z.string().optional().describe("(Workflow Builder, optional) Firebase refresh token starting with 'AMf-'.")
7226
+ email: import_zod45.z.string().email().describe("Email used at purchase."),
7227
+ license_key: import_zod45.z.string().min(20).describe("License key from your purchase email."),
7228
+ ghl_api_key: import_zod45.z.string().min(10).describe("GHL Private Integration key (starts with 'pit-'). Created INSIDE the sub-account at Settings > Integrations > Private Integrations."),
7229
+ ghl_location_id: import_zod45.z.string().min(10).describe("GHL Location ID (sub-account ID). Found in your GHL URL: /location/THIS_PART/dashboard."),
7230
+ ghl_company_id: import_zod45.z.string().optional().describe("(Agency only) Company ID for multi-location access."),
7231
+ ghl_user_id: import_zod45.z.string().optional().describe("(Workflow Builder, optional) Firebase User ID. See README for browser capture instructions."),
7232
+ ghl_firebase_api_key: import_zod45.z.string().optional().describe("(Workflow Builder, optional) Firebase API Key starting with 'AIza'."),
7233
+ ghl_firebase_refresh_token: import_zod45.z.string().optional().describe("(Workflow Builder, optional) Firebase refresh token starting with 'AMf-'.")
7197
7234
  },
7198
7235
  async (args) => {
7199
7236
  const lic = await validateLicense(args.email, args.license_key);
@@ -7239,7 +7276,7 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
7239
7276
  ghl_firebase_api_key: workflowBuilderEnabled ? args.ghl_firebase_api_key?.trim() : void 0,
7240
7277
  ghl_firebase_refresh_token: workflowBuilderEnabled ? args.ghl_firebase_refresh_token?.trim() : void 0
7241
7278
  });
7242
- const toolCount = workflowBuilderEnabled ? "196" : "161";
7279
+ const toolCount = workflowBuilderEnabled ? "197" : "161";
7243
7280
  const wfLine = workflowBuilderEnabled ? "Workflow Builder: enabled." : "Workflow Builder: not configured (optional).";
7244
7281
  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.";
7245
7282
  return {
@@ -7267,11 +7304,11 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
7267
7304
  function registerEnableWorkflowBuilderTool(server2) {
7268
7305
  server2.tool(
7269
7306
  "enable_workflow_builder",
7270
- "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 196 after the next Claude restart.",
7307
+ "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 197 after the next Claude restart.",
7271
7308
  {
7272
- ghl_user_id: import_zod44.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."),
7273
- ghl_firebase_api_key: import_zod44.z.string().min(10).describe("Firebase API Key starting with 'AIza'. The string between 'firebase:authUser:' and ':[DEFAULT]' in the row's Key column."),
7274
- ghl_firebase_refresh_token: import_zod44.z.string().min(10).describe("Firebase refresh token. value.stsTokenManager.refreshToken in the firebase:authUser row.")
7309
+ ghl_user_id: import_zod45.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."),
7310
+ ghl_firebase_api_key: import_zod45.z.string().min(10).describe("Firebase API Key starting with 'AIza'. The string between 'firebase:authUser:' and ':[DEFAULT]' in the row's Key column."),
7311
+ ghl_firebase_refresh_token: import_zod45.z.string().min(10).describe("Firebase refresh token. value.stsTokenManager.refreshToken in the firebase:authUser row.")
7275
7312
  },
7276
7313
  async (args) => {
7277
7314
  const existing = readCredentials();
@@ -7314,7 +7351,7 @@ DevTools steps: https://elitedcs.com/ghl-mcp-firebase`
7314
7351
  "",
7315
7352
  "Firebase credentials verified and saved.",
7316
7353
  "",
7317
- "**Restart Claude (quit fully and reopen) to load the workflow builder + funnel builder + pipeline builder + form builder + workflow cloner tools (196 total).**",
7354
+ "**Restart Claude (quit fully and reopen) to load the workflow builder + funnel builder + pipeline builder + form builder + workflow cloner tools (197 total).**",
7318
7355
  "",
7319
7356
  'After restart, try: "List my workflows in full detail" or "Validate workflow <id>".',
7320
7357
  "",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elitedcs/ghl-mcp",
3
- "version": "3.11.0",
4
- "description": "GoHighLevel MCP Server for Claude. 196 tools — full CRM, automation, marketing control, and the only programmatic GHL workflow builder.",
3
+ "version": "3.11.1",
4
+ "description": "GoHighLevel MCP Server for Claude. 197 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"