@elitedcs/ghl-mcp 3.19.0 → 3.20.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 +17 -0
- package/README.md +2 -2
- package/dist/index.js +60 -16
- package/package.json +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.20.0 — License gate for headless / env-var installs
|
|
4
|
+
|
|
5
|
+
**Security + headless support. No tool changes (212 across 43 modules).**
|
|
6
|
+
|
|
7
|
+
Closes a gap where setting `GHL_API_KEY` + `GHL_LOCATION_ID` via environment variables loaded the full tool set **without ever validating a license**. The server now requires a verified license before exposing the full tools:
|
|
8
|
+
|
|
9
|
+
- A `credentials.json` written by `setup_ghl_mcp` carries `verified_at` (validated at setup) and is trusted as before — **no change for normal Desktop/Claude Code installs.**
|
|
10
|
+
- The env-var / headless path must now supply `GHL_LICENSE_EMAIL` + `GHL_LICENSE_KEY`. These are validated once at boot and the verified result is cached to `credentials.json`, so there's no per-restart phone-home and device activations aren't re-counted on a stable machine.
|
|
11
|
+
- Without a verified license, the server stays in bootstrap mode (only `setup_ghl_mcp`, `request_license`, `get_mcp_version`) with a clear message.
|
|
12
|
+
|
|
13
|
+
This makes headless/server installs first-class: set `GHL_LICENSE_EMAIL`, `GHL_LICENSE_KEY`, `GHL_API_KEY`, `GHL_LOCATION_ID` (plus the Firebase vars for the workflow builder) and the server boots into the full tool set.
|
|
14
|
+
|
|
15
|
+
## 3.19.1 — MCP registry prep + README UTM tracking
|
|
16
|
+
|
|
17
|
+
- Added `mcpName` (`io.github.drjerryrelth/ghl-command`) to package.json so the package can be published to the official MCP registry (many directories pull from it).
|
|
18
|
+
- npm README buy links now carry `?utm_source=npm&utm_medium=readme` so npm-sourced traffic to the order page is identifiable once analytics is enabled.
|
|
19
|
+
|
|
3
20
|
## 3.19.0 — npm lead capture + $97 pricing alignment
|
|
4
21
|
|
|
5
22
|
**One new bootstrap-mode tool. Normal-mode count unchanged (212 across 43 modules).**
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
Works with **both the Claude Desktop App and Claude Code terminal** — your choice.
|
|
8
8
|
|
|
9
|
-
**License required.** Buy at [elitedcs.com/ghl-mcp-server](https://elitedcs.com/ghl-mcp-server) — one-time $97, three-machine activation, no subscription.
|
|
9
|
+
**License required.** Buy at [elitedcs.com/ghl-mcp-server](https://elitedcs.com/ghl-mcp-server?utm_source=npm&utm_medium=readme) — one-time $97, three-machine activation, no subscription.
|
|
10
10
|
|
|
11
11
|
Built by [Elite DCs, LLC](https://elitedcs.com).
|
|
12
12
|
|
|
@@ -61,7 +61,7 @@ This MCP (Model Context Protocol) server connects Claude directly to GoHighLevel
|
|
|
61
61
|
|
|
62
62
|
### 1. Buy a license
|
|
63
63
|
|
|
64
|
-
[elitedcs.com/ghl-mcp-server](https://elitedcs.com/ghl-mcp-server) — one-time $97. License key arrives by email within 1-2 minutes.
|
|
64
|
+
[elitedcs.com/ghl-mcp-server](https://elitedcs.com/ghl-mcp-server?utm_source=npm&utm_medium=readme) — one-time $97. License key arrives by email within 1-2 minutes.
|
|
65
65
|
|
|
66
66
|
### 2. Install in Claude Desktop App
|
|
67
67
|
|
package/dist/index.js
CHANGED
|
@@ -31,7 +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.
|
|
34
|
+
version: "3.20.0",
|
|
35
|
+
mcpName: "io.github.drjerryrelth/ghl-command",
|
|
35
36
|
description: "GoHighLevel MCP Server for Claude. 212 tools \u2014 full CRM, automation, marketing control, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
|
|
36
37
|
main: "dist/index.js",
|
|
37
38
|
bin: {
|
|
@@ -59,9 +60,15 @@ var require_package = __commonJS({
|
|
|
59
60
|
"model-context-protocol",
|
|
60
61
|
"gohighlevel",
|
|
61
62
|
"ghl",
|
|
63
|
+
"gohighlevel-mcp",
|
|
64
|
+
"ghl-automation",
|
|
62
65
|
"crm",
|
|
63
66
|
"claude",
|
|
64
|
-
"anthropic"
|
|
67
|
+
"anthropic",
|
|
68
|
+
"workflow-builder",
|
|
69
|
+
"marketing-automation",
|
|
70
|
+
"ai-agent",
|
|
71
|
+
"agency"
|
|
65
72
|
],
|
|
66
73
|
author: "Elite DCs, LLC",
|
|
67
74
|
license: "MIT",
|
|
@@ -8320,24 +8327,60 @@ var server = new import_mcp.McpServer({
|
|
|
8320
8327
|
name: "elite-dcs-ghl",
|
|
8321
8328
|
version: pkg.version
|
|
8322
8329
|
});
|
|
8323
|
-
var inBootstrapMode = !apiKey || !locationId;
|
|
8324
8330
|
registerMetaTools(server, pkg.version);
|
|
8325
|
-
|
|
8326
|
-
|
|
8327
|
-
|
|
8328
|
-
|
|
8331
|
+
var inBootstrapMode = true;
|
|
8332
|
+
async function resolveAccessAndRegister() {
|
|
8333
|
+
let licenseVerified = Boolean(fileCreds?.verified_at && fileCreds?.license_key);
|
|
8334
|
+
if (!licenseVerified && apiKey && locationId) {
|
|
8335
|
+
const licEmail = (process.env.GHL_LICENSE_EMAIL || fileCreds?.email)?.trim();
|
|
8336
|
+
const licKey = (process.env.GHL_LICENSE_KEY || fileCreds?.license_key)?.trim();
|
|
8337
|
+
if (licEmail && licKey) {
|
|
8338
|
+
const lic = await validateLicense(licEmail, licKey);
|
|
8339
|
+
if (lic.ok) {
|
|
8340
|
+
licenseVerified = true;
|
|
8341
|
+
try {
|
|
8342
|
+
writeCredentials({
|
|
8343
|
+
license_key: licKey,
|
|
8344
|
+
email: licEmail,
|
|
8345
|
+
verified_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
8346
|
+
ghl_api_key: apiKey,
|
|
8347
|
+
ghl_location_id: locationId,
|
|
8348
|
+
...process.env.GHL_COMPANY_ID ? { ghl_company_id: process.env.GHL_COMPANY_ID } : {},
|
|
8349
|
+
...process.env.GHL_USER_ID ? { ghl_user_id: process.env.GHL_USER_ID } : {},
|
|
8350
|
+
...process.env.GHL_FIREBASE_API_KEY ? { ghl_firebase_api_key: process.env.GHL_FIREBASE_API_KEY } : {},
|
|
8351
|
+
...process.env.GHL_FIREBASE_REFRESH_TOKEN ? { ghl_firebase_refresh_token: process.env.GHL_FIREBASE_REFRESH_TOKEN } : {}
|
|
8352
|
+
});
|
|
8353
|
+
process.stderr.write("[ghl-mcp] License validated and cached.\n");
|
|
8354
|
+
} catch {
|
|
8355
|
+
}
|
|
8356
|
+
} else {
|
|
8357
|
+
process.stderr.write(`[ghl-mcp] License check failed: ${lic.error}
|
|
8358
|
+
`);
|
|
8359
|
+
}
|
|
8360
|
+
} else {
|
|
8361
|
+
process.stderr.write(
|
|
8362
|
+
"[ghl-mcp] No verified license. For a headless/server install set GHL_LICENSE_EMAIL + GHL_LICENSE_KEY alongside GHL_API_KEY + GHL_LOCATION_ID; otherwise run setup_ghl_mcp.\n"
|
|
8363
|
+
);
|
|
8364
|
+
}
|
|
8365
|
+
}
|
|
8366
|
+
inBootstrapMode = !apiKey || !locationId || !licenseVerified;
|
|
8367
|
+
if (inBootstrapMode) {
|
|
8368
|
+
process.stderr.write(
|
|
8369
|
+
`[ghl-mcp] Bootstrap mode.
|
|
8370
|
+
[ghl-mcp] Need a valid license plus GHL_API_KEY + GHL_LOCATION_ID (env vars or credentials file at ${credentialsPath()}).
|
|
8329
8371
|
[ghl-mcp] Only setup_ghl_mcp, request_license, and get_mcp_version are available. Run setup_ghl_mcp with your license + GHL credentials \u2014 or request_license if you don't have a license yet.
|
|
8330
8372
|
`
|
|
8331
|
-
|
|
8332
|
-
|
|
8333
|
-
|
|
8334
|
-
} else {
|
|
8335
|
-
|
|
8336
|
-
|
|
8337
|
-
|
|
8338
|
-
|
|
8339
|
-
|
|
8373
|
+
);
|
|
8374
|
+
registerSetupTool(server);
|
|
8375
|
+
registerLeadCaptureTool(server);
|
|
8376
|
+
} else {
|
|
8377
|
+
const client = new GHLClient({ apiKey, locationId });
|
|
8378
|
+
registerAllTools(server, client, registry, pkg.version);
|
|
8379
|
+
registerEnableWorkflowBuilderTool(server);
|
|
8380
|
+
if (fileCreds && !process.env.GHL_API_KEY) {
|
|
8381
|
+
process.stderr.write(`[ghl-mcp] Loaded credentials from ${credentialsPath()}
|
|
8340
8382
|
`);
|
|
8383
|
+
}
|
|
8341
8384
|
}
|
|
8342
8385
|
}
|
|
8343
8386
|
async function validateApiKey() {
|
|
@@ -8374,6 +8417,7 @@ async function checkForUpdates() {
|
|
|
8374
8417
|
}
|
|
8375
8418
|
}
|
|
8376
8419
|
async function main() {
|
|
8420
|
+
await resolveAccessAndRegister();
|
|
8377
8421
|
const transport = new import_stdio.StdioServerTransport();
|
|
8378
8422
|
await server.connect(transport);
|
|
8379
8423
|
if (inBootstrapMode) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.20.0",
|
|
4
|
+
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
4
5
|
"description": "GoHighLevel MCP Server for Claude. 212 tools — full CRM, automation, marketing control, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"bin": {
|
|
@@ -28,9 +29,15 @@
|
|
|
28
29
|
"model-context-protocol",
|
|
29
30
|
"gohighlevel",
|
|
30
31
|
"ghl",
|
|
32
|
+
"gohighlevel-mcp",
|
|
33
|
+
"ghl-automation",
|
|
31
34
|
"crm",
|
|
32
35
|
"claude",
|
|
33
|
-
"anthropic"
|
|
36
|
+
"anthropic",
|
|
37
|
+
"workflow-builder",
|
|
38
|
+
"marketing-automation",
|
|
39
|
+
"ai-agent",
|
|
40
|
+
"agency"
|
|
34
41
|
],
|
|
35
42
|
"author": "Elite DCs, LLC",
|
|
36
43
|
"license": "MIT",
|