@elitedcs/ghl-mcp 3.70.0 → 3.71.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 +21 -0
- package/README.md +8 -5
- package/dist/index.js +64 -4
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.71.0 — a task you can close
|
|
4
|
+
|
|
5
|
+
A subscriber's Claude created a callback task on a contact and, come Monday, could not
|
|
6
|
+
close it. It said so plainly: the server can create tasks but has no way to update or
|
|
7
|
+
complete one, tick it off by hand. It was right. `create_contact_task` and
|
|
8
|
+
`get_contact_tasks` were the whole task surface.
|
|
9
|
+
|
|
10
|
+
**Three tools close the loop.** `complete_contact_task` marks a task done, or reopens it
|
|
11
|
+
with `completed: false`. `update_contact_task` changes a task's title, description, due
|
|
12
|
+
date, assignee or completed state, and sends only the fields you pass, so changing a due
|
|
13
|
+
date never blanks the title; an update with no fields is refused before any request goes
|
|
14
|
+
out. `delete_contact_task` removes a task for good and, like every delete in this server,
|
|
15
|
+
asks for `confirm: "DELETE"`. All three use the routes in
|
|
16
|
+
GoHighLevel's published contacts spec and were proven live before release on a throwaway
|
|
17
|
+
contact in a sandbox account: create, complete, read back completed, update, reopen,
|
|
18
|
+
delete, read back gone, contact removed (`docs/proofs/2026-08-26-task-lifecycle.md`).
|
|
19
|
+
|
|
20
|
+
Counts: 245 tools across 51 modules (was 242). The free read-only tier is unchanged at
|
|
21
|
+
111; the three new tools are writes and answer with upgrade information there. Restart
|
|
22
|
+
Claude after the update to see them.
|
|
23
|
+
|
|
3
24
|
## 3.70.0 — a clean validation now means something
|
|
4
25
|
|
|
5
26
|
A subscriber built an Instagram-comment-to-DM workflow, ran `validate_workflow`, got
|
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.** 245 tools across 51 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. **Multi-tenant:** one install can run the workflow builder across multiple clients' GHL accounts.
|
|
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
|
|
|
@@ -135,7 +135,7 @@ Run setup_ghl_mcp to activate GHL Command:
|
|
|
135
135
|
ghl_location_id: YOUR_LOCATION_ID
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
-
Approve the tool call. Server validates your license, verifies your GHL credentials, writes them to a per-user config file. **Quit Claude one more time and reopen** — the full core toolset is now unlocked (
|
|
138
|
+
Approve the tool call. Server validates your license, verifies your GHL credentials, writes them to a per-user config file. **Quit Claude one more time and reopen** — the full core toolset is now unlocked (245 tools total with the optional Workflow Builder Firebase add-on).
|
|
139
139
|
|
|
140
140
|
### 4. Try it
|
|
141
141
|
|
|
@@ -175,7 +175,7 @@ https://app.gohighlevel.com/v2/location/YOUR_LOCATION_ID/dashboard
|
|
|
175
175
|
|
|
176
176
|
## Enable the Workflow Builder
|
|
177
177
|
|
|
178
|
-
The 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
|
|
178
|
+
The 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 190 tools work fine — you just won't have workflow/funnel/form/pipeline editing. This is the flagship feature: do this step.
|
|
179
179
|
|
|
180
180
|
**One-click capture (v3.49.0+, the supported path):**
|
|
181
181
|
|
|
@@ -269,7 +269,7 @@ Highlights (full guide: [`docs/HEADLESS.md`](docs/HEADLESS.md)):
|
|
|
269
269
|
|
|
270
270
|
> **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).
|
|
271
271
|
|
|
272
|
-
### CRM & Contacts (
|
|
272
|
+
### CRM & Contacts (18 tools)
|
|
273
273
|
|
|
274
274
|
| Tool | What It Does |
|
|
275
275
|
|---|---|
|
|
@@ -283,6 +283,9 @@ Highlights (full guide: [`docs/HEADLESS.md`](docs/HEADLESS.md)):
|
|
|
283
283
|
| `remove_contact_tags` | Remove tags from a contact |
|
|
284
284
|
| `get_contact_tasks` | List tasks for a contact |
|
|
285
285
|
| `create_contact_task` | Create a task on a contact |
|
|
286
|
+
| `complete_contact_task` | Mark a task done (or reopen it) |
|
|
287
|
+
| `update_contact_task` | Change a task's title, description, due date, assignee or state |
|
|
288
|
+
| `delete_contact_task` | Delete a task from a contact |
|
|
286
289
|
| `get_contact_notes` | List notes on a contact |
|
|
287
290
|
| `create_contact_note` | Add a note to a contact |
|
|
288
291
|
| `get_contact_appointments` | List a contact's appointments |
|
|
@@ -798,7 +801,7 @@ Source repo is private. Contributors need an invitation from `drjerryrelth`. The
|
|
|
798
801
|
|
|
799
802
|
### Reducing context / token usage
|
|
800
803
|
|
|
801
|
-
Every registered MCP tool's schema is shipped to the model on every message. With
|
|
804
|
+
Every registered MCP tool's schema is shipped to the model on every message. With 245 tools that's a meaningful per-message context cost even in chats that never touch GHL. If you only use a slice of GHL Command, restrict the tool surface with `GHL_ENABLED_MODULES` and/or `GHL_ENABLED_TOOLS`:
|
|
802
805
|
|
|
803
806
|
```jsonc
|
|
804
807
|
// Claude Desktop config — enable whole modules
|
package/dist/index.js
CHANGED
|
@@ -2732,6 +2732,15 @@ var init_contact_window = __esm({
|
|
|
2732
2732
|
});
|
|
2733
2733
|
|
|
2734
2734
|
// src/tools/contacts.ts
|
|
2735
|
+
function buildUpdateTaskBody(input) {
|
|
2736
|
+
const body = {};
|
|
2737
|
+
if (input.title !== void 0) body.title = input.title;
|
|
2738
|
+
if (input.body !== void 0) body.body = input.body;
|
|
2739
|
+
if (input.dueDate !== void 0) body.dueDate = input.dueDate;
|
|
2740
|
+
if (input.completed !== void 0) body.completed = input.completed;
|
|
2741
|
+
if (input.assignedTo !== void 0) body.assignedTo = input.assignedTo;
|
|
2742
|
+
return Object.keys(body).length === 0 ? null : body;
|
|
2743
|
+
}
|
|
2735
2744
|
function registerContactTools(server2, client) {
|
|
2736
2745
|
safeTool(
|
|
2737
2746
|
server2,
|
|
@@ -3012,6 +3021,57 @@ function registerContactTools(server2, client) {
|
|
|
3012
3021
|
});
|
|
3013
3022
|
}
|
|
3014
3023
|
);
|
|
3024
|
+
safeTool(
|
|
3025
|
+
server2,
|
|
3026
|
+
"complete_contact_task",
|
|
3027
|
+
"Mark a contact's task as done (or reopen it with completed=false). Find the task ID with get_contact_tasks; create_contact_task also returns it. Use this to tick off a task created earlier.",
|
|
3028
|
+
{
|
|
3029
|
+
contactId: import_zod9.z.string().min(1).describe("The ID of the contact the task belongs to."),
|
|
3030
|
+
taskId: import_zod9.z.string().min(1).describe("The ID of the task (from get_contact_tasks or create_contact_task)."),
|
|
3031
|
+
completed: import_zod9.z.boolean().optional().describe("true (default) marks the task completed; false reopens a completed task.")
|
|
3032
|
+
},
|
|
3033
|
+
async ({ contactId, taskId, completed }) => {
|
|
3034
|
+
return client.put(`/contacts/${contactId}/tasks/${taskId}/completed`, {
|
|
3035
|
+
body: { completed: completed ?? true }
|
|
3036
|
+
});
|
|
3037
|
+
}
|
|
3038
|
+
);
|
|
3039
|
+
safeTool(
|
|
3040
|
+
server2,
|
|
3041
|
+
"update_contact_task",
|
|
3042
|
+
"Change an existing task on a contact: title, description, due date, assignee, or completed state. Only the fields you pass are changed. To simply tick a task off, complete_contact_task is the direct route.",
|
|
3043
|
+
{
|
|
3044
|
+
contactId: import_zod9.z.string().min(1).describe("The ID of the contact the task belongs to."),
|
|
3045
|
+
taskId: import_zod9.z.string().min(1).describe("The ID of the task to update (from get_contact_tasks)."),
|
|
3046
|
+
title: import_zod9.z.string().min(1).optional().describe("New title / summary of the task (cannot be blank)."),
|
|
3047
|
+
body: import_zod9.z.string().optional().describe("New detailed description of the task."),
|
|
3048
|
+
dueDate: import_zod9.z.string().refine((d) => !Number.isNaN(Date.parse(d)), "dueDate must be an ISO 8601 date or date-time").optional().describe("New due date in ISO 8601 format (e.g. 2026-08-31T16:00:00.000Z)."),
|
|
3049
|
+
completed: import_zod9.z.boolean().optional().describe("Set the completed state of the task."),
|
|
3050
|
+
assignedTo: import_zod9.z.string().optional().describe("User ID to reassign the task to.")
|
|
3051
|
+
},
|
|
3052
|
+
async ({ contactId, taskId, title, body: taskBody, dueDate, completed, assignedTo }) => {
|
|
3053
|
+
const reqBody = buildUpdateTaskBody({ title, body: taskBody, dueDate, completed, assignedTo });
|
|
3054
|
+
if (!reqBody) {
|
|
3055
|
+
throw new Error(
|
|
3056
|
+
"Nothing to update: pass at least one of title, body, dueDate, completed, assignedTo."
|
|
3057
|
+
);
|
|
3058
|
+
}
|
|
3059
|
+
return client.put(`/contacts/${contactId}/tasks/${taskId}`, { body: reqBody });
|
|
3060
|
+
}
|
|
3061
|
+
);
|
|
3062
|
+
safeTool(
|
|
3063
|
+
server2,
|
|
3064
|
+
"delete_contact_task",
|
|
3065
|
+
"Delete a task from a contact. Permanent. To keep the record and just close it, use complete_contact_task instead.",
|
|
3066
|
+
{
|
|
3067
|
+
contactId: import_zod9.z.string().min(1).describe("The ID of the contact the task belongs to."),
|
|
3068
|
+
taskId: import_zod9.z.string().min(1).describe("The ID of the task to delete (from get_contact_tasks)."),
|
|
3069
|
+
confirm: import_zod9.z.literal("DELETE").describe("Must pass 'DELETE' to confirm this destructive action.")
|
|
3070
|
+
},
|
|
3071
|
+
async ({ contactId, taskId }) => {
|
|
3072
|
+
return client.delete(`/contacts/${contactId}/tasks/${taskId}`);
|
|
3073
|
+
}
|
|
3074
|
+
);
|
|
3015
3075
|
safeTool(
|
|
3016
3076
|
server2,
|
|
3017
3077
|
"get_contact_notes",
|
|
@@ -9797,7 +9857,7 @@ Note: Firebase credentials rejected (${fb.error}).`;
|
|
|
9797
9857
|
const telemetryLine = telemetryDisabled(process.env) ? "" : `
|
|
9798
9858
|
|
|
9799
9859
|
${TELEMETRY_DISCLOSURE}`;
|
|
9800
|
-
const finishedCount = isFree ? "111" : "
|
|
9860
|
+
const finishedCount = isFree ? "111" : "245";
|
|
9801
9861
|
const freeTip = isFree ? `
|
|
9802
9862
|
|
|
9803
9863
|
Free tier: read-only. Write tools stay visible but answer with upgrade info instead of acting. Full version ($97/mo founding rate) upgrades in place \u2014 same install, you only swap the license key: https://ghlcommand.com` : "";
|
|
@@ -9842,7 +9902,7 @@ Free tier: read-only. Write tools stay visible but answer with upgrade info inst
|
|
|
9842
9902
|
function registerEnableWorkflowBuilderTool(server2) {
|
|
9843
9903
|
server2.tool(
|
|
9844
9904
|
"enable_workflow_builder",
|
|
9845
|
-
"Add Firebase credentials to an existing GHL Command install to unlock 55 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. On the FREE tier this same login unlocks the read-only auditor suite (audit_workflows, validate_workflow, full-detail workflow/funnel/pipeline reads). Requires you've already run setup_ghl_mcp. EASIEST PATH: run `capture_firebase_interactive` instead \u2014 a Chrome window opens, you log into GHL, zero pasting. Use THIS tool when you have JSON from `auto_capture_firebase_script` (console-paste path) to put in `firebase_paste`, or the three manual DevTools fields. Tool count goes from
|
|
9905
|
+
"Add Firebase credentials to an existing GHL Command install to unlock 55 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. On the FREE tier this same login unlocks the read-only auditor suite (audit_workflows, validate_workflow, full-detail workflow/funnel/pipeline reads). Requires you've already run setup_ghl_mcp. EASIEST PATH: run `capture_firebase_interactive` instead \u2014 a Chrome window opens, you log into GHL, zero pasting. Use THIS tool when you have JSON from `auto_capture_firebase_script` (console-paste path) to put in `firebase_paste`, or the three manual DevTools fields. Tool count goes from 190 to 245 after the next Claude restart.",
|
|
9846
9906
|
{
|
|
9847
9907
|
// v3.25.0: one-paste path. Tool runs `auto_capture_firebase_script` to
|
|
9848
9908
|
// get the console script; the script returns a JSON object that pastes
|
|
@@ -18968,9 +19028,9 @@ var require_package = __commonJS({
|
|
|
18968
19028
|
"package.json"(exports2, module2) {
|
|
18969
19029
|
module2.exports = {
|
|
18970
19030
|
name: "@elitedcs/ghl-mcp",
|
|
18971
|
-
version: "3.
|
|
19031
|
+
version: "3.71.0",
|
|
18972
19032
|
mcpName: "io.github.drjerryrelth/ghl-command",
|
|
18973
|
-
description: "GoHighLevel MCP Server for Claude.
|
|
19033
|
+
description: "GoHighLevel MCP Server for Claude. 245 tools \u2014 full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
|
|
18974
19034
|
main: "dist/index.js",
|
|
18975
19035
|
bin: {
|
|
18976
19036
|
"ghl-mcp": "dist/index.js"
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.71.0",
|
|
4
4
|
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
5
|
-
"description": "GoHighLevel MCP Server for Claude.
|
|
5
|
+
"description": "GoHighLevel MCP Server for Claude. 245 tools \u2014 full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"ghl-mcp": "dist/index.js"
|