@elitedcs/ghl-mcp 3.24.0 → 3.25.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 +19 -0
- package/dist/index.js +193 -22
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.25.0 — One-paste Firebase capture
|
|
4
|
+
|
|
5
|
+
**New bootstrap-and-normal-mode tool. Tool count goes from 212 to 213 (the new tool counts whether you're set up or not).**
|
|
6
|
+
|
|
7
|
+
The worst-pain step of GHL Command setup has been the three separate IndexedDB lookups buyers had to do for Firebase credentials. v3.0.x tried bookmarklets; per memory that failed because buyers couldn't drag them onto their bookmarks bar. v3.25.0 ships the working version: a tool that hands the buyer a 25-line Chrome console script. One copy, one paste in DevTools, one Enter — the script extracts all three Firebase fields from IndexedDB and copies the result to the clipboard as a JSON object. The buyer pastes the JSON back into `setup_ghl_mcp` (or `enable_workflow_builder`) via a new `firebase_paste` parameter. Three separate captures → one paste.
|
|
8
|
+
|
|
9
|
+
**New tool: `auto_capture_firebase_script`**. Available in bootstrap mode AND normal mode (the latter so existing buyers can re-grab a fresh token when their refresh rotates). Takes no arguments; returns the script plus a numbered walkthrough.
|
|
10
|
+
|
|
11
|
+
**Updated tools:**
|
|
12
|
+
|
|
13
|
+
- `setup_ghl_mcp` accepts a new optional `firebase_paste` parameter. When provided, it parses the three Firebase fields out of the JSON and treats them as if you'd filled `ghl_user_id`, `ghl_firebase_api_key`, `ghl_firebase_refresh_token` manually. The three separate fields still work (manual fallback for locked-down browsers).
|
|
14
|
+
- `enable_workflow_builder` accepts the same `firebase_paste` parameter, again with the three separate fields as fallback.
|
|
15
|
+
|
|
16
|
+
**Parser is forgiving.** Strips markdown code fences (chat-copy artifact), normalizes curly quotes (email-client artifact), trims whitespace, and demands the API key actually start with `AIza` (catches misdirected pastes — e.g. pasting the PIT key here by mistake).
|
|
17
|
+
|
|
18
|
+
**Website + email also updated.** `elitedcs.com/ghl-mcp-firebase` now leads with a copy-button that grabs the script, falls back to manual capture in a collapsed details element. The Stripe-webhook welcome email points buyers at `auto_capture_firebase_script` instead of the old four-step DevTools dive.
|
|
19
|
+
|
|
20
|
+
Locked in by 19 new tests covering parse paths (clean JSON, fence-wrapped, curly-quoted, whitespace, malformed, missing fields, wrong API-key prefix) plus the script contract (self-contained IIFE, IndexedDB + clipboard usage, expected field names, not-logged-in branch).
|
|
21
|
+
|
|
3
22
|
## 3.24.0 — Signed-attestation gate closes the credentials.json bypass
|
|
4
23
|
|
|
5
24
|
**Security fix. Tool count unchanged (212 across 43 modules).**
|
package/dist/index.js
CHANGED
|
@@ -31,7 +31,7 @@ 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.25.0",
|
|
35
35
|
mcpName: "io.github.drjerryrelth/ghl-command",
|
|
36
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.",
|
|
37
37
|
main: "dist/index.js",
|
|
@@ -5828,6 +5828,83 @@ var import_zod38 = require("zod");
|
|
|
5828
5828
|
var os2 = __toESM(require("os"));
|
|
5829
5829
|
var crypto2 = __toESM(require("crypto"));
|
|
5830
5830
|
var import_zod37 = require("zod");
|
|
5831
|
+
|
|
5832
|
+
// src/firebase-capture-script.ts
|
|
5833
|
+
var FIREBASE_CAPTURE_SCRIPT = `(async () => {
|
|
5834
|
+
try {
|
|
5835
|
+
const db = await new Promise((res, rej) => {
|
|
5836
|
+
const r = indexedDB.open('firebaseLocalStorageDb');
|
|
5837
|
+
r.onsuccess = () => res(r.result);
|
|
5838
|
+
r.onerror = () => rej(r.error);
|
|
5839
|
+
});
|
|
5840
|
+
const tx = db.transaction('firebaseLocalStorage', 'readonly');
|
|
5841
|
+
const store = tx.objectStore('firebaseLocalStorage');
|
|
5842
|
+
const rows = await new Promise((res, rej) => {
|
|
5843
|
+
const r = store.getAll();
|
|
5844
|
+
r.onsuccess = () => res(r.result);
|
|
5845
|
+
r.onerror = () => rej(r.error);
|
|
5846
|
+
});
|
|
5847
|
+
const row = rows.find(r => typeof r?.fbase_key === 'string' && r.fbase_key.startsWith('firebase:authUser:AIza'));
|
|
5848
|
+
if (!row) {
|
|
5849
|
+
console.log('%cGHL Command: no Firebase login found.', 'color:red;font-weight:bold');
|
|
5850
|
+
console.log('Open a tab logged into your GHL account, then run this again in that tab.');
|
|
5851
|
+
return;
|
|
5852
|
+
}
|
|
5853
|
+
const v = row.value || {};
|
|
5854
|
+
const out = {
|
|
5855
|
+
ghl_firebase_api_key: v.apiKey,
|
|
5856
|
+
ghl_user_id: v.uid,
|
|
5857
|
+
ghl_firebase_refresh_token: v.stsTokenManager?.refreshToken,
|
|
5858
|
+
};
|
|
5859
|
+
if (!out.ghl_firebase_api_key || !out.ghl_user_id || !out.ghl_firebase_refresh_token) {
|
|
5860
|
+
console.log('%cGHL Command: found Firebase login but a field was missing.', 'color:red;font-weight:bold');
|
|
5861
|
+
console.log('Try logging out of GHL and back in, then run this again.');
|
|
5862
|
+
return;
|
|
5863
|
+
}
|
|
5864
|
+
const json = JSON.stringify(out, null, 2);
|
|
5865
|
+
console.log('%cGHL Command: paste this into setup_ghl_mcp (firebase_paste field):', 'color:green;font-weight:bold');
|
|
5866
|
+
console.log(json);
|
|
5867
|
+
try {
|
|
5868
|
+
await navigator.clipboard.writeText(json);
|
|
5869
|
+
console.log('%cAlready copied to your clipboard \u2014 Cmd+V / Ctrl+V to paste.', 'color:green');
|
|
5870
|
+
} catch (e) {
|
|
5871
|
+
console.log('%cCopy it manually from above (clipboard access not granted).', 'color:orange');
|
|
5872
|
+
}
|
|
5873
|
+
} catch (err) {
|
|
5874
|
+
console.log('%cGHL Command: script error.', 'color:red;font-weight:bold');
|
|
5875
|
+
console.log(err);
|
|
5876
|
+
}
|
|
5877
|
+
})();`;
|
|
5878
|
+
function parseFirebasePaste(input) {
|
|
5879
|
+
if (typeof input !== "string") return null;
|
|
5880
|
+
let cleaned = input.trim();
|
|
5881
|
+
cleaned = cleaned.replace(/^```(?:json)?\s*/i, "").replace(/```$/i, "").trim();
|
|
5882
|
+
cleaned = cleaned.replace(/[“”]/g, '"').replace(/[‘’]/g, "'");
|
|
5883
|
+
let parsed;
|
|
5884
|
+
try {
|
|
5885
|
+
parsed = JSON.parse(cleaned);
|
|
5886
|
+
} catch {
|
|
5887
|
+
return null;
|
|
5888
|
+
}
|
|
5889
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
5890
|
+
const obj = parsed;
|
|
5891
|
+
const api = obj.ghl_firebase_api_key;
|
|
5892
|
+
const uid = obj.ghl_user_id;
|
|
5893
|
+
const refresh = obj.ghl_firebase_refresh_token;
|
|
5894
|
+
if (typeof api !== "string" || typeof uid !== "string" || typeof refresh !== "string") return null;
|
|
5895
|
+
const trimmedApi = api.trim();
|
|
5896
|
+
const trimmedUid = uid.trim();
|
|
5897
|
+
const trimmedRefresh = refresh.trim();
|
|
5898
|
+
if (!trimmedApi.startsWith("AIza")) return null;
|
|
5899
|
+
if (!trimmedUid || !trimmedRefresh) return null;
|
|
5900
|
+
return {
|
|
5901
|
+
ghl_firebase_api_key: trimmedApi,
|
|
5902
|
+
ghl_user_id: trimmedUid,
|
|
5903
|
+
ghl_firebase_refresh_token: trimmedRefresh
|
|
5904
|
+
};
|
|
5905
|
+
}
|
|
5906
|
+
|
|
5907
|
+
// src/setup-tool.ts
|
|
5831
5908
|
var LICENSE_API = "https://elitedcs.com/api/validate-license";
|
|
5832
5909
|
var CAPTURE_API = "https://elitedcs.com/api/capture-lead";
|
|
5833
5910
|
var GHL_API = "https://services.leadconnectorhq.com";
|
|
@@ -5908,9 +5985,14 @@ function registerSetupTool(server2) {
|
|
|
5908
5985
|
ghl_api_key: import_zod37.z.string().min(10).describe("GHL Private Integration key (starts with 'pit-'). Created INSIDE the sub-account at Settings > Integrations > Private Integrations."),
|
|
5909
5986
|
ghl_location_id: import_zod37.z.string().min(10).describe("GHL Location ID (sub-account ID). Found in your GHL URL: /location/THIS_PART/dashboard."),
|
|
5910
5987
|
ghl_company_id: import_zod37.z.string().optional().describe("(Agency only) Company ID for multi-location access."),
|
|
5911
|
-
|
|
5912
|
-
|
|
5913
|
-
|
|
5988
|
+
// v3.25.0: one-paste shortcut. Run `auto_capture_firebase_script` first;
|
|
5989
|
+
// it returns a console script that fills the clipboard with this exact
|
|
5990
|
+
// JSON payload. Pasting it here removes the need to fill ghl_user_id,
|
|
5991
|
+
// ghl_firebase_api_key, and ghl_firebase_refresh_token individually.
|
|
5992
|
+
firebase_paste: import_zod37.z.string().optional().describe("(Workflow Builder, one-paste path) Paste the JSON output from auto_capture_firebase_script here. Replaces the three separate Firebase fields below."),
|
|
5993
|
+
ghl_user_id: import_zod37.z.string().optional().describe("(Workflow Builder, manual path) Firebase User ID. Prefer firebase_paste instead."),
|
|
5994
|
+
ghl_firebase_api_key: import_zod37.z.string().optional().describe("(Workflow Builder, manual path) Firebase API Key starting with 'AIza'. Prefer firebase_paste instead."),
|
|
5995
|
+
ghl_firebase_refresh_token: import_zod37.z.string().optional().describe("(Workflow Builder, manual path) Firebase refresh token. Prefer firebase_paste instead.")
|
|
5914
5996
|
},
|
|
5915
5997
|
async (args) => {
|
|
5916
5998
|
const lic = await validateLicense(args.email, args.license_key);
|
|
@@ -5923,24 +6005,42 @@ Purchase a license at https://elitedcs.com/ghl-mcp-server or contact support.` }
|
|
|
5923
6005
|
if (!ghl.ok) {
|
|
5924
6006
|
return { content: [{ type: "text", text: `GHL credential check failed: ${ghl.error}` }], isError: true };
|
|
5925
6007
|
}
|
|
5926
|
-
|
|
6008
|
+
let resolvedUserId = args.ghl_user_id;
|
|
6009
|
+
let resolvedFbApi = args.ghl_firebase_api_key;
|
|
6010
|
+
let resolvedFbRefresh = args.ghl_firebase_refresh_token;
|
|
6011
|
+
if (args.firebase_paste) {
|
|
6012
|
+
const parsed = parseFirebasePaste(args.firebase_paste);
|
|
6013
|
+
if (!parsed) {
|
|
6014
|
+
return {
|
|
6015
|
+
content: [{
|
|
6016
|
+
type: "text",
|
|
6017
|
+
text: "Couldn't parse firebase_paste. Expected the JSON output from auto_capture_firebase_script. Re-run that tool, follow the steps, and paste the entire JSON object it copies to your clipboard."
|
|
6018
|
+
}],
|
|
6019
|
+
isError: true
|
|
6020
|
+
};
|
|
6021
|
+
}
|
|
6022
|
+
resolvedUserId = parsed.ghl_user_id;
|
|
6023
|
+
resolvedFbApi = parsed.ghl_firebase_api_key;
|
|
6024
|
+
resolvedFbRefresh = parsed.ghl_firebase_refresh_token;
|
|
6025
|
+
}
|
|
6026
|
+
const wantsWorkflowBuilder = resolvedUserId || resolvedFbApi || resolvedFbRefresh;
|
|
5927
6027
|
let workflowBuilderEnabled = false;
|
|
5928
6028
|
let workflowBuilderNote = "";
|
|
5929
6029
|
if (wantsWorkflowBuilder) {
|
|
5930
|
-
if (!
|
|
6030
|
+
if (!resolvedUserId || !resolvedFbApi || !resolvedFbRefresh) {
|
|
5931
6031
|
return {
|
|
5932
6032
|
content: [{
|
|
5933
6033
|
type: "text",
|
|
5934
|
-
text: "Workflow Builder requires ALL THREE Firebase fields: ghl_user_id, ghl_firebase_api_key, ghl_firebase_refresh_token.
|
|
6034
|
+
text: "Workflow Builder requires ALL THREE Firebase fields: ghl_user_id, ghl_firebase_api_key, ghl_firebase_refresh_token. The easy way is `auto_capture_firebase_script` -> paste the JSON output into `firebase_paste`. Manual capture steps: https://elitedcs.com/ghl-mcp-firebase"
|
|
5935
6035
|
}],
|
|
5936
6036
|
isError: true
|
|
5937
6037
|
};
|
|
5938
6038
|
}
|
|
5939
|
-
const fb = await validateFirebase(
|
|
6039
|
+
const fb = await validateFirebase(resolvedFbApi, resolvedFbRefresh);
|
|
5940
6040
|
if (!fb.ok) {
|
|
5941
6041
|
workflowBuilderNote = `
|
|
5942
6042
|
|
|
5943
|
-
Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builder. Re-run setup_ghl_mcp later with fresh Firebase fields to enable it.`;
|
|
6043
|
+
Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builder. Re-run setup_ghl_mcp later with fresh Firebase fields (use auto_capture_firebase_script for a one-paste flow) to enable it.`;
|
|
5944
6044
|
} else {
|
|
5945
6045
|
workflowBuilderEnabled = true;
|
|
5946
6046
|
}
|
|
@@ -5952,9 +6052,9 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
|
|
|
5952
6052
|
ghl_api_key: args.ghl_api_key.trim(),
|
|
5953
6053
|
ghl_location_id: args.ghl_location_id.trim(),
|
|
5954
6054
|
ghl_company_id: args.ghl_company_id?.trim() || void 0,
|
|
5955
|
-
ghl_user_id: workflowBuilderEnabled ?
|
|
5956
|
-
ghl_firebase_api_key: workflowBuilderEnabled ?
|
|
5957
|
-
ghl_firebase_refresh_token: workflowBuilderEnabled ?
|
|
6055
|
+
ghl_user_id: workflowBuilderEnabled ? resolvedUserId?.trim() : void 0,
|
|
6056
|
+
ghl_firebase_api_key: workflowBuilderEnabled ? resolvedFbApi?.trim() : void 0,
|
|
6057
|
+
ghl_firebase_refresh_token: workflowBuilderEnabled ? resolvedFbRefresh?.trim() : void 0,
|
|
5958
6058
|
// v3.24.0+ attestation. Tied to email + license + device fingerprint;
|
|
5959
6059
|
// verified on every MCP startup. Closes the hand-crafted creds bypass.
|
|
5960
6060
|
signed_attestation: lic.signedAttestation
|
|
@@ -5987,11 +6087,16 @@ Note: Firebase credentials rejected (${fb.error}). Saved without Workflow Builde
|
|
|
5987
6087
|
function registerEnableWorkflowBuilderTool(server2) {
|
|
5988
6088
|
server2.tool(
|
|
5989
6089
|
"enable_workflow_builder",
|
|
5990
|
-
"Add Firebase credentials to an existing GHL Command install to unlock 49 additional tools across the internal-API modules: workflow builder (create/edit/clone/delete/publish/validate workflows, build_if_else_branch, build_goal_event, get_trigger_registry), funnel + page builder, form builder, pipeline builder, workflow cloner, smart lists, reputation, email campaigns, email templates, and memberships, plus the pre-deploy validator. Requires you've already run setup_ghl_mcp.
|
|
6090
|
+
"Add Firebase credentials to an existing GHL Command install to unlock 49 additional tools across the internal-API modules: workflow builder (create/edit/clone/delete/publish/validate workflows, build_if_else_branch, build_goal_event, get_trigger_registry), funnel + page builder, form builder, pipeline builder, workflow cloner, smart lists, reputation, email campaigns, email templates, and memberships, plus the pre-deploy validator. Requires you've already run setup_ghl_mcp. EASIEST PATH: run `auto_capture_firebase_script` first, paste the JSON output into `firebase_paste` here. MANUAL PATH: capture the three Firebase fields via DevTools and pass them individually. Tool count goes from 163 to 212 after the next Claude restart.",
|
|
5991
6091
|
{
|
|
5992
|
-
|
|
5993
|
-
|
|
5994
|
-
|
|
6092
|
+
// v3.25.0: one-paste path. Tool runs `auto_capture_firebase_script` to
|
|
6093
|
+
// get the console script; the script returns a JSON object that pastes
|
|
6094
|
+
// cleanly into this field. Saves the buyer from picking out three
|
|
6095
|
+
// separate fields in IndexedDB.
|
|
6096
|
+
firebase_paste: import_zod37.z.string().optional().describe("Paste the JSON output from auto_capture_firebase_script here. Replaces the three separate Firebase fields below."),
|
|
6097
|
+
ghl_user_id: import_zod37.z.string().min(10).optional().describe("(Manual path) Firebase User ID (uid). Prefer firebase_paste."),
|
|
6098
|
+
ghl_firebase_api_key: import_zod37.z.string().min(10).optional().describe("(Manual path) Firebase API Key starting with 'AIza'. Prefer firebase_paste."),
|
|
6099
|
+
ghl_firebase_refresh_token: import_zod37.z.string().min(10).optional().describe("(Manual path) Firebase refresh token. Prefer firebase_paste.")
|
|
5995
6100
|
},
|
|
5996
6101
|
async (args) => {
|
|
5997
6102
|
const existing = readCredentials();
|
|
@@ -6004,7 +6109,34 @@ function registerEnableWorkflowBuilderTool(server2) {
|
|
|
6004
6109
|
isError: true
|
|
6005
6110
|
};
|
|
6006
6111
|
}
|
|
6007
|
-
|
|
6112
|
+
let userId = args.ghl_user_id;
|
|
6113
|
+
let fbApi = args.ghl_firebase_api_key;
|
|
6114
|
+
let fbRefresh = args.ghl_firebase_refresh_token;
|
|
6115
|
+
if (args.firebase_paste) {
|
|
6116
|
+
const parsed = parseFirebasePaste(args.firebase_paste);
|
|
6117
|
+
if (!parsed) {
|
|
6118
|
+
return {
|
|
6119
|
+
content: [{
|
|
6120
|
+
type: "text",
|
|
6121
|
+
text: "Couldn't parse firebase_paste. Expected the JSON output from auto_capture_firebase_script. Re-run that tool, follow the steps, and paste the entire JSON object it copies to your clipboard."
|
|
6122
|
+
}],
|
|
6123
|
+
isError: true
|
|
6124
|
+
};
|
|
6125
|
+
}
|
|
6126
|
+
userId = parsed.ghl_user_id;
|
|
6127
|
+
fbApi = parsed.ghl_firebase_api_key;
|
|
6128
|
+
fbRefresh = parsed.ghl_firebase_refresh_token;
|
|
6129
|
+
}
|
|
6130
|
+
if (!userId || !fbApi || !fbRefresh) {
|
|
6131
|
+
return {
|
|
6132
|
+
content: [{
|
|
6133
|
+
type: "text",
|
|
6134
|
+
text: "Workflow Builder needs all three Firebase fields. Easiest: run `auto_capture_firebase_script`, follow the prompt, then pass the JSON output as `firebase_paste`. Manual capture: https://elitedcs.com/ghl-mcp-firebase"
|
|
6135
|
+
}],
|
|
6136
|
+
isError: true
|
|
6137
|
+
};
|
|
6138
|
+
}
|
|
6139
|
+
const fb = await validateFirebase(fbApi.trim(), fbRefresh.trim());
|
|
6008
6140
|
if (!fb.ok) {
|
|
6009
6141
|
return {
|
|
6010
6142
|
content: [{
|
|
@@ -6012,7 +6144,7 @@ function registerEnableWorkflowBuilderTool(server2) {
|
|
|
6012
6144
|
text: `Firebase credentials rejected: ${fb.error}
|
|
6013
6145
|
|
|
6014
6146
|
Common causes:
|
|
6015
|
-
- The refresh token has rotated (they rotate every few weeks). Re-
|
|
6147
|
+
- The refresh token has rotated (they rotate every few weeks). Re-run auto_capture_firebase_script for a fresh one.
|
|
6016
6148
|
- The Firebase API Key doesn't match the refresh token's project. Both must come from the SAME firebase:authUser row.
|
|
6017
6149
|
|
|
6018
6150
|
DevTools steps: https://elitedcs.com/ghl-mcp-firebase`
|
|
@@ -6022,9 +6154,9 @@ DevTools steps: https://elitedcs.com/ghl-mcp-firebase`
|
|
|
6022
6154
|
}
|
|
6023
6155
|
writeCredentials({
|
|
6024
6156
|
...existing,
|
|
6025
|
-
ghl_user_id:
|
|
6026
|
-
ghl_firebase_api_key:
|
|
6027
|
-
ghl_firebase_refresh_token:
|
|
6157
|
+
ghl_user_id: userId.trim(),
|
|
6158
|
+
ghl_firebase_api_key: fbApi.trim(),
|
|
6159
|
+
ghl_firebase_refresh_token: fbRefresh.trim()
|
|
6028
6160
|
});
|
|
6029
6161
|
return {
|
|
6030
6162
|
content: [{
|
|
@@ -6045,6 +6177,43 @@ DevTools steps: https://elitedcs.com/ghl-mcp-firebase`
|
|
|
6045
6177
|
}
|
|
6046
6178
|
);
|
|
6047
6179
|
}
|
|
6180
|
+
function registerFirebaseCaptureScriptTool(server2) {
|
|
6181
|
+
server2.tool(
|
|
6182
|
+
"auto_capture_firebase_script",
|
|
6183
|
+
"Get the browser-console script that auto-extracts the 3 Firebase fields needed to enable the Workflow Builder. Run this, copy the script, paste it into Chrome DevTools Console on a tab logged into GHL, press Enter, and the result lands in your clipboard. Then paste the JSON into setup_ghl_mcp's firebase_paste field (or enable_workflow_builder's). No manual IndexedDB digging.",
|
|
6184
|
+
{},
|
|
6185
|
+
async () => {
|
|
6186
|
+
const steps = [
|
|
6187
|
+
"## One-paste Firebase capture",
|
|
6188
|
+
"",
|
|
6189
|
+
"**Step 1.** Open your GoHighLevel account in Chrome. Make sure you're logged in.",
|
|
6190
|
+
"",
|
|
6191
|
+
"**Step 2.** Open DevTools \u2014 press `F12` on Windows / Linux, or `Cmd+Option+I` on Mac. Click the **Console** tab.",
|
|
6192
|
+
"",
|
|
6193
|
+
"**Step 3.** Copy the script below, paste it into the Console, and press Enter:",
|
|
6194
|
+
"",
|
|
6195
|
+
"```javascript",
|
|
6196
|
+
FIREBASE_CAPTURE_SCRIPT,
|
|
6197
|
+
"```",
|
|
6198
|
+
"",
|
|
6199
|
+
"**Step 4.** The script prints a JSON object and copies it to your clipboard automatically. Looks like this (your values will be longer):",
|
|
6200
|
+
"",
|
|
6201
|
+
"```json",
|
|
6202
|
+
"{",
|
|
6203
|
+
` "ghl_firebase_api_key": "AIza...",`,
|
|
6204
|
+
` "ghl_user_id": "abc...",`,
|
|
6205
|
+
` "ghl_firebase_refresh_token": "AMf-..."`,
|
|
6206
|
+
"}",
|
|
6207
|
+
"```",
|
|
6208
|
+
"",
|
|
6209
|
+
"**Step 5.** Come back to Claude. Run `setup_ghl_mcp` (first-time install) or `enable_workflow_builder` (already set up) and paste the JSON into the `firebase_paste` field. The MCP parses it automatically \u2014 you don't need to fill the individual `ghl_user_id`, `ghl_firebase_api_key`, `ghl_firebase_refresh_token` fields.",
|
|
6210
|
+
"",
|
|
6211
|
+
"Step-by-step screenshots: https://elitedcs.com/ghl-mcp-firebase"
|
|
6212
|
+
].join("\n");
|
|
6213
|
+
return { content: [{ type: "text", text: steps }] };
|
|
6214
|
+
}
|
|
6215
|
+
);
|
|
6216
|
+
}
|
|
6048
6217
|
function registerLeadCaptureTool(server2) {
|
|
6049
6218
|
server2.tool(
|
|
6050
6219
|
"request_license",
|
|
@@ -8571,15 +8740,17 @@ async function resolveAccessAndRegister() {
|
|
|
8571
8740
|
process.stderr.write(
|
|
8572
8741
|
`[ghl-mcp] Bootstrap mode.
|
|
8573
8742
|
[ghl-mcp] Need a valid license plus GHL_API_KEY + GHL_LOCATION_ID (env vars or credentials file at ${credentialsPath()}).
|
|
8574
|
-
[ghl-mcp]
|
|
8743
|
+
[ghl-mcp] Available: setup_ghl_mcp, request_license, auto_capture_firebase_script, get_mcp_version. Run setup_ghl_mcp with your license + GHL credentials \u2014 or request_license if you don't have a license yet.
|
|
8575
8744
|
`
|
|
8576
8745
|
);
|
|
8577
8746
|
registerSetupTool(server);
|
|
8578
8747
|
registerLeadCaptureTool(server);
|
|
8748
|
+
registerFirebaseCaptureScriptTool(server);
|
|
8579
8749
|
} else {
|
|
8580
8750
|
const client = new GHLClient({ apiKey, locationId });
|
|
8581
8751
|
registerAllTools(server, client, registry, pkg.version);
|
|
8582
8752
|
registerEnableWorkflowBuilderTool(server);
|
|
8753
|
+
registerFirebaseCaptureScriptTool(server);
|
|
8583
8754
|
if (fileCreds && !process.env.GHL_API_KEY) {
|
|
8584
8755
|
process.stderr.write(`[ghl-mcp] Loaded credentials from ${credentialsPath()}
|
|
8585
8756
|
`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.25.0",
|
|
4
4
|
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
5
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.",
|
|
6
6
|
"main": "dist/index.js",
|