@nightsquawktech/gohighlevel-mcp-server 0.1.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.
Files changed (108) hide show
  1. package/COMMERCIAL.md +35 -0
  2. package/LICENSE +661 -0
  3. package/README.md +172 -0
  4. package/dist/constants.d.ts +14 -0
  5. package/dist/constants.d.ts.map +1 -0
  6. package/dist/constants.js +14 -0
  7. package/dist/constants.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +24 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/schemas/calendars.d.ts +185 -0
  13. package/dist/schemas/calendars.d.ts.map +1 -0
  14. package/dist/schemas/calendars.js +74 -0
  15. package/dist/schemas/calendars.js.map +1 -0
  16. package/dist/schemas/common.d.ts +10 -0
  17. package/dist/schemas/common.d.ts.map +1 -0
  18. package/dist/schemas/common.js +33 -0
  19. package/dist/schemas/common.js.map +1 -0
  20. package/dist/schemas/contacts.d.ts +401 -0
  21. package/dist/schemas/contacts.d.ts.map +1 -0
  22. package/dist/schemas/contacts.js +132 -0
  23. package/dist/schemas/contacts.js.map +1 -0
  24. package/dist/schemas/conversations.d.ts +89 -0
  25. package/dist/schemas/conversations.d.ts.map +1 -0
  26. package/dist/schemas/conversations.js +39 -0
  27. package/dist/schemas/conversations.js.map +1 -0
  28. package/dist/schemas/custom-fields.d.ts +360 -0
  29. package/dist/schemas/custom-fields.d.ts.map +1 -0
  30. package/dist/schemas/custom-fields.js +154 -0
  31. package/dist/schemas/custom-fields.js.map +1 -0
  32. package/dist/schemas/custom-values.d.ts +87 -0
  33. package/dist/schemas/custom-values.d.ts.map +1 -0
  34. package/dist/schemas/custom-values.js +43 -0
  35. package/dist/schemas/custom-values.js.map +1 -0
  36. package/dist/schemas/locations.d.ts +30 -0
  37. package/dist/schemas/locations.d.ts.map +1 -0
  38. package/dist/schemas/locations.js +17 -0
  39. package/dist/schemas/locations.js.map +1 -0
  40. package/dist/schemas/opportunities.d.ts +196 -0
  41. package/dist/schemas/opportunities.d.ts.map +1 -0
  42. package/dist/schemas/opportunities.js +83 -0
  43. package/dist/schemas/opportunities.js.map +1 -0
  44. package/dist/schemas/tags.d.ts +81 -0
  45. package/dist/schemas/tags.d.ts.map +1 -0
  46. package/dist/schemas/tags.js +41 -0
  47. package/dist/schemas/tags.js.map +1 -0
  48. package/dist/services/config.d.ts +3 -0
  49. package/dist/services/config.d.ts.map +1 -0
  50. package/dist/services/config.js +26 -0
  51. package/dist/services/config.js.map +1 -0
  52. package/dist/services/errors.d.ts +2 -0
  53. package/dist/services/errors.d.ts.map +1 -0
  54. package/dist/services/errors.js +47 -0
  55. package/dist/services/errors.js.map +1 -0
  56. package/dist/services/gohighlevel-client.d.ts +13 -0
  57. package/dist/services/gohighlevel-client.d.ts.map +1 -0
  58. package/dist/services/gohighlevel-client.js +42 -0
  59. package/dist/services/gohighlevel-client.js.map +1 -0
  60. package/dist/tools/calendars.d.ts +4 -0
  61. package/dist/tools/calendars.d.ts.map +1 -0
  62. package/dist/tools/calendars.js +163 -0
  63. package/dist/tools/calendars.js.map +1 -0
  64. package/dist/tools/contacts.d.ts +4 -0
  65. package/dist/tools/contacts.d.ts.map +1 -0
  66. package/dist/tools/contacts.js +492 -0
  67. package/dist/tools/contacts.js.map +1 -0
  68. package/dist/tools/conversations.d.ts +4 -0
  69. package/dist/tools/conversations.d.ts.map +1 -0
  70. package/dist/tools/conversations.js +76 -0
  71. package/dist/tools/conversations.js.map +1 -0
  72. package/dist/tools/custom-fields.d.ts +4 -0
  73. package/dist/tools/custom-fields.d.ts.map +1 -0
  74. package/dist/tools/custom-fields.js +337 -0
  75. package/dist/tools/custom-fields.js.map +1 -0
  76. package/dist/tools/custom-values.d.ts +4 -0
  77. package/dist/tools/custom-values.d.ts.map +1 -0
  78. package/dist/tools/custom-values.js +121 -0
  79. package/dist/tools/custom-values.js.map +1 -0
  80. package/dist/tools/format.d.ts +9 -0
  81. package/dist/tools/format.d.ts.map +1 -0
  82. package/dist/tools/format.js +49 -0
  83. package/dist/tools/format.js.map +1 -0
  84. package/dist/tools/index.d.ts +4 -0
  85. package/dist/tools/index.d.ts.map +1 -0
  86. package/dist/tools/index.js +19 -0
  87. package/dist/tools/index.js.map +1 -0
  88. package/dist/tools/locations.d.ts +4 -0
  89. package/dist/tools/locations.d.ts.map +1 -0
  90. package/dist/tools/locations.js +43 -0
  91. package/dist/tools/locations.js.map +1 -0
  92. package/dist/tools/opportunities.d.ts +4 -0
  93. package/dist/tools/opportunities.d.ts.map +1 -0
  94. package/dist/tools/opportunities.js +182 -0
  95. package/dist/tools/opportunities.js.map +1 -0
  96. package/dist/tools/read-tools.d.ts +22 -0
  97. package/dist/tools/read-tools.d.ts.map +1 -0
  98. package/dist/tools/read-tools.js +68 -0
  99. package/dist/tools/read-tools.js.map +1 -0
  100. package/dist/tools/tags.d.ts +4 -0
  101. package/dist/tools/tags.d.ts.map +1 -0
  102. package/dist/tools/tags.js +113 -0
  103. package/dist/tools/tags.js.map +1 -0
  104. package/dist/types.d.ts +28 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +2 -0
  107. package/dist/types.js.map +1 -0
  108. package/package.json +47 -0
@@ -0,0 +1,337 @@
1
+ import { formatApiError } from "../services/errors.js";
2
+ import { CreateCustomFieldSchema, CreateCustomFieldFolderSchema, CreateCustomFieldV2Schema, DeleteCustomFieldSchema, DeleteCustomFieldFolderSchema, DeleteCustomFieldV2Schema, GetCustomFieldSchema, GetCustomFieldV2Schema, ListCustomFieldsSchema, ListCustomFieldsV2Schema, UpdateCustomFieldFolderSchema, UpdateCustomFieldSchema, UpdateCustomFieldV2Schema } from "../schemas/custom-fields.js";
3
+ import { formatResponse, makeToolResponse, mergeExtra, omitUndefined, requireConfirm, summarizeRecord } from "./format.js";
4
+ import { registerCollectionReadTool } from "./read-tools.js";
5
+ export function registerCustomFieldTools(server, client) {
6
+ registerCollectionReadTool(server, client, {
7
+ name: "ghl_list_custom_fields",
8
+ title: "List GoHighLevel Custom Fields",
9
+ description: "List custom fields for a GoHighLevel location from /locations/{locationId}/customFields.",
10
+ inputSchema: ListCustomFieldsSchema.shape,
11
+ path: (params) => `/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/customFields`,
12
+ preferredFields: ["id", "name", "fieldKey", "dataType", "model", "placeholder"],
13
+ heading: "GoHighLevel Custom Fields",
14
+ collectionLabel: "custom fields"
15
+ });
16
+ server.registerTool("ghl_get_custom_field", {
17
+ title: "Get GoHighLevel Custom Field",
18
+ description: "Get one custom field for a GoHighLevel location from /locations/{locationId}/customFields/{id}.",
19
+ inputSchema: GetCustomFieldSchema.shape,
20
+ annotations: {
21
+ readOnlyHint: true,
22
+ destructiveHint: false,
23
+ idempotentHint: true,
24
+ openWorldHint: true
25
+ }
26
+ }, async ({ location_id, field_id, response_format }) => {
27
+ try {
28
+ const customField = await client.get(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/customFields/${encodeURIComponent(field_id)}`);
29
+ const data = { customField };
30
+ const markdown = ["# GoHighLevel Custom Field", "", summarizeRecord(customField, ["id", "name", "fieldKey", "dataType", "model"])].join("\n");
31
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
32
+ }
33
+ catch (error) {
34
+ const data = { error: formatApiError(error) };
35
+ return makeToolResponse(data, data.error, true);
36
+ }
37
+ });
38
+ server.registerTool("ghl_create_custom_field", {
39
+ title: "Create GoHighLevel Custom Field",
40
+ description: "Create a custom field for a GoHighLevel location. Write operation: do not run against live data without explicit approval.",
41
+ inputSchema: CreateCustomFieldSchema.shape,
42
+ annotations: {
43
+ readOnlyHint: false,
44
+ destructiveHint: false,
45
+ idempotentHint: false,
46
+ openWorldHint: true
47
+ }
48
+ }, async (params) => {
49
+ try {
50
+ const body = customFieldBody(params);
51
+ const customField = await client.post(`/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/customFields`, body);
52
+ const data = { customField };
53
+ const markdown = ["# Created GoHighLevel Custom Field", "", summarizeRecord(customField, ["id", "name", "fieldKey", "dataType", "model"])].join("\n");
54
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
55
+ }
56
+ catch (error) {
57
+ const data = { error: formatApiError(error) };
58
+ return makeToolResponse(data, data.error, true);
59
+ }
60
+ });
61
+ server.registerTool("ghl_update_custom_field", {
62
+ title: "Update GoHighLevel Custom Field",
63
+ description: "Update a custom field through the current location-scoped API: PUT /locations/{locationId}/customFields/{id}. Write operation: do not run against live data without explicit approval.",
64
+ inputSchema: UpdateCustomFieldSchema.shape,
65
+ annotations: {
66
+ readOnlyHint: false,
67
+ destructiveHint: false,
68
+ idempotentHint: true,
69
+ openWorldHint: true
70
+ }
71
+ }, async (params) => {
72
+ try {
73
+ const body = customFieldBody(params);
74
+ if (Object.keys(body).length === 0) {
75
+ const data = { error: "At least one custom field property must be provided for update." };
76
+ return makeToolResponse(data, data.error, true);
77
+ }
78
+ const customField = await client.put(`/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/customFields/${encodeURIComponent(params.field_id)}`, body);
79
+ const data = { customField };
80
+ const markdown = ["# Updated GoHighLevel Custom Field", "", summarizeRecord(customField, ["id", "name", "fieldKey", "dataType", "model"])].join("\n");
81
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
82
+ }
83
+ catch (error) {
84
+ const data = { error: formatApiError(error) };
85
+ return makeToolResponse(data, data.error, true);
86
+ }
87
+ });
88
+ server.registerTool("ghl_delete_custom_field", {
89
+ title: "Delete GoHighLevel Custom Field",
90
+ description: "Delete a custom field from /locations/{locationId}/customFields/{id}. Requires confirm: true and owner approval before live execution.",
91
+ inputSchema: DeleteCustomFieldSchema.shape,
92
+ annotations: {
93
+ readOnlyHint: false,
94
+ destructiveHint: true,
95
+ idempotentHint: false,
96
+ openWorldHint: true
97
+ }
98
+ }, async ({ location_id, field_id, confirm, response_format }) => {
99
+ const guard = requireConfirm(confirm);
100
+ if (guard) {
101
+ const data = { error: guard };
102
+ return makeToolResponse(data, data.error, true);
103
+ }
104
+ try {
105
+ const result = await client.del(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/customFields/${encodeURIComponent(field_id)}`);
106
+ const data = { field_id, result };
107
+ const markdown = ["# Deleted GoHighLevel Custom Field", "", `Deleted custom field ${field_id}.`].join("\n");
108
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
109
+ }
110
+ catch (error) {
111
+ const data = { error: formatApiError(error) };
112
+ return makeToolResponse(data, data.error, true);
113
+ }
114
+ });
115
+ registerCollectionReadTool(server, client, {
116
+ name: "ghl_list_custom_fields_v2",
117
+ title: "List GoHighLevel Custom Fields V2 By Object Key",
118
+ description: "List Custom Fields V2 fields/folders by object key with GET /custom-fields/object-key/{objectKey}. Supports Custom Objects and Company/Business per HighLevel docs.",
119
+ inputSchema: ListCustomFieldsV2Schema.shape,
120
+ path: (params) => `/custom-fields/object-key/${encodeURIComponent(String(params.objectKey))}`,
121
+ query: (params) => ({ locationId: resolveLocationId(client, params.location_id) }),
122
+ preferredFields: ["id", "name", "fieldKey", "objectKey", "dataType", "parentId"],
123
+ heading: "GoHighLevel Custom Fields V2",
124
+ collectionLabel: "custom fields v2"
125
+ });
126
+ server.registerTool("ghl_get_custom_field_v2", {
127
+ title: "Get GoHighLevel Custom Field Or Folder V2",
128
+ description: "Get a Custom Fields V2 field or folder by ID with GET /custom-fields/{id}.",
129
+ inputSchema: GetCustomFieldV2Schema.shape,
130
+ annotations: {
131
+ readOnlyHint: true,
132
+ destructiveHint: false,
133
+ idempotentHint: true,
134
+ openWorldHint: true
135
+ }
136
+ }, async ({ id, response_format }) => {
137
+ try {
138
+ const customField = await client.get(`/custom-fields/${encodeURIComponent(id)}`);
139
+ const data = { customField };
140
+ const markdown = ["# GoHighLevel Custom Field V2", "", summarizeRecord(customField, ["id", "name", "fieldKey", "objectKey", "dataType", "parentId"])].join("\n");
141
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
142
+ }
143
+ catch (error) {
144
+ const data = { error: formatApiError(error) };
145
+ return makeToolResponse(data, data.error, true);
146
+ }
147
+ });
148
+ server.registerTool("ghl_create_custom_field_v2", {
149
+ title: "Create GoHighLevel Custom Field V2",
150
+ description: "Create a Custom Fields V2 field with POST /custom-fields/. Write operation: do not run against live data without explicit approval.",
151
+ inputSchema: CreateCustomFieldV2Schema.shape,
152
+ annotations: {
153
+ readOnlyHint: false,
154
+ destructiveHint: false,
155
+ idempotentHint: false,
156
+ openWorldHint: true
157
+ }
158
+ }, async (params) => {
159
+ try {
160
+ const customField = await client.post("/custom-fields/", customFieldV2Body(client, params));
161
+ const data = { customField };
162
+ const markdown = ["# Created GoHighLevel Custom Field V2", "", summarizeRecord(customField, ["id", "name", "fieldKey", "objectKey", "dataType", "parentId"])].join("\n");
163
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
164
+ }
165
+ catch (error) {
166
+ const data = { error: formatApiError(error) };
167
+ return makeToolResponse(data, data.error, true);
168
+ }
169
+ });
170
+ server.registerTool("ghl_update_custom_field_v2", {
171
+ title: "Update GoHighLevel Custom Field V2",
172
+ description: "Update a Custom Fields V2 field with PUT /custom-fields/{id}. Write operation: do not run against live data without explicit approval.",
173
+ inputSchema: UpdateCustomFieldV2Schema.shape,
174
+ annotations: {
175
+ readOnlyHint: false,
176
+ destructiveHint: false,
177
+ idempotentHint: true,
178
+ openWorldHint: true
179
+ }
180
+ }, async (params) => {
181
+ try {
182
+ const body = customFieldV2Body(client, params);
183
+ if (Object.keys(body).length === 0) {
184
+ const data = { error: "At least one Custom Fields V2 property must be provided for update." };
185
+ return makeToolResponse(data, data.error, true);
186
+ }
187
+ const customField = await client.put(`/custom-fields/${encodeURIComponent(params.id)}`, body);
188
+ const data = { customField };
189
+ const markdown = ["# Updated GoHighLevel Custom Field V2", "", summarizeRecord(customField, ["id", "name", "fieldKey", "objectKey", "dataType", "parentId"])].join("\n");
190
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
191
+ }
192
+ catch (error) {
193
+ const data = { error: formatApiError(error) };
194
+ return makeToolResponse(data, data.error, true);
195
+ }
196
+ });
197
+ server.registerTool("ghl_delete_custom_field_v2", {
198
+ title: "Delete GoHighLevel Custom Field V2",
199
+ description: "Delete a Custom Fields V2 field with DELETE /custom-fields/{id}. Requires confirm: true and owner approval before live execution.",
200
+ inputSchema: DeleteCustomFieldV2Schema.shape,
201
+ annotations: {
202
+ readOnlyHint: false,
203
+ destructiveHint: true,
204
+ idempotentHint: false,
205
+ openWorldHint: true
206
+ }
207
+ }, async ({ id, confirm, response_format }) => {
208
+ const guard = requireConfirm(confirm);
209
+ if (guard) {
210
+ const data = { error: guard };
211
+ return makeToolResponse(data, data.error, true);
212
+ }
213
+ try {
214
+ const result = await client.del(`/custom-fields/${encodeURIComponent(id)}`);
215
+ const data = { id, result };
216
+ const markdown = ["# Deleted GoHighLevel Custom Field V2", "", `Deleted Custom Fields V2 field ${id}.`].join("\n");
217
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
218
+ }
219
+ catch (error) {
220
+ const data = { error: formatApiError(error) };
221
+ return makeToolResponse(data, data.error, true);
222
+ }
223
+ });
224
+ server.registerTool("ghl_create_custom_field_folder", {
225
+ title: "Create GoHighLevel Custom Field Folder",
226
+ description: "Create a Custom Fields V2 folder with POST /custom-fields/folder. Write operation: do not run against live data without explicit approval.",
227
+ inputSchema: CreateCustomFieldFolderSchema.shape,
228
+ annotations: {
229
+ readOnlyHint: false,
230
+ destructiveHint: false,
231
+ idempotentHint: false,
232
+ openWorldHint: true
233
+ }
234
+ }, async ({ location_id, objectKey, name, parentId, extra, response_format }) => {
235
+ try {
236
+ const folder = await client.post("/custom-fields/folder", mergeExtra({
237
+ locationId: resolveLocationId(client, location_id),
238
+ objectKey,
239
+ name,
240
+ parentId
241
+ }, extra));
242
+ const data = { folder };
243
+ const markdown = ["# Created GoHighLevel Custom Field Folder", "", summarizeRecord(folder, ["id", "name", "objectKey", "locationId"])].join("\n");
244
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
245
+ }
246
+ catch (error) {
247
+ const data = { error: formatApiError(error) };
248
+ return makeToolResponse(data, data.error, true);
249
+ }
250
+ });
251
+ server.registerTool("ghl_update_custom_field_folder", {
252
+ title: "Update GoHighLevel Custom Field Folder",
253
+ description: "Update a Custom Fields V2 folder name with PUT /custom-fields/folder/{id}. Write operation: do not run against live data without explicit approval.",
254
+ inputSchema: UpdateCustomFieldFolderSchema.shape,
255
+ annotations: {
256
+ readOnlyHint: false,
257
+ destructiveHint: false,
258
+ idempotentHint: true,
259
+ openWorldHint: true
260
+ }
261
+ }, async ({ folder_id, name, response_format }) => {
262
+ try {
263
+ const folder = await client.put(`/custom-fields/folder/${encodeURIComponent(folder_id)}`, {
264
+ locationId: client.defaultLocationId,
265
+ name
266
+ });
267
+ const data = { folder };
268
+ const markdown = ["# Updated GoHighLevel Custom Field Folder", "", summarizeRecord(folder, ["id", "name", "objectKey", "locationId"])].join("\n");
269
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
270
+ }
271
+ catch (error) {
272
+ const data = { error: formatApiError(error) };
273
+ return makeToolResponse(data, data.error, true);
274
+ }
275
+ });
276
+ server.registerTool("ghl_delete_custom_field_folder", {
277
+ title: "Delete GoHighLevel Custom Field Folder",
278
+ description: "Delete a Custom Fields V2 folder with DELETE /custom-fields/folder/{id}. Requires confirm: true and owner approval before live execution.",
279
+ inputSchema: DeleteCustomFieldFolderSchema.shape,
280
+ annotations: {
281
+ readOnlyHint: false,
282
+ destructiveHint: true,
283
+ idempotentHint: false,
284
+ openWorldHint: true
285
+ }
286
+ }, async ({ folder_id, confirm, response_format }) => {
287
+ const guard = requireConfirm(confirm);
288
+ if (guard) {
289
+ const data = { error: guard };
290
+ return makeToolResponse(data, data.error, true);
291
+ }
292
+ try {
293
+ const result = await client.del(`/custom-fields/folder/${encodeURIComponent(folder_id)}`);
294
+ const data = { folder_id, result };
295
+ const markdown = ["# Deleted GoHighLevel Custom Field Folder", "", `Deleted Custom Fields V2 folder ${folder_id}.`].join("\n");
296
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
297
+ }
298
+ catch (error) {
299
+ const data = { error: formatApiError(error) };
300
+ return makeToolResponse(data, data.error, true);
301
+ }
302
+ });
303
+ }
304
+ function resolveLocationId(client, locationId) {
305
+ return typeof locationId === "string" && locationId.length > 0 ? locationId : client.defaultLocationId;
306
+ }
307
+ function customFieldBody(params) {
308
+ return omitUndefined({
309
+ name: params.name,
310
+ dataType: params.dataType,
311
+ placeholder: params.placeholder,
312
+ position: params.position,
313
+ model: params.model,
314
+ options: params.options,
315
+ acceptedFormat: params.acceptedFormat,
316
+ isMultipleFile: params.isMultipleFile,
317
+ maxNumberOfFiles: params.maxNumberOfFiles,
318
+ textBoxListOptions: params.textBoxListOptions
319
+ });
320
+ }
321
+ function customFieldV2Body(client, params) {
322
+ return mergeExtra({
323
+ locationId: params.locationId ?? client.defaultLocationId,
324
+ name: params.name,
325
+ objectKey: params.objectKey,
326
+ dataType: params.dataType,
327
+ description: params.description,
328
+ placeholder: params.placeholder,
329
+ parentId: params.parentId,
330
+ showInForms: params.showInForms,
331
+ options: params.options,
332
+ acceptedFormats: params.acceptedFormats,
333
+ allowCustomOption: params.allowCustomOption,
334
+ maxFileLimit: params.maxFileLimit
335
+ }, params.extra);
336
+ }
337
+ //# sourceMappingURL=custom-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-fields.js","sourceRoot":"","sources":["../../src/tools/custom-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { GoHighLevelClient } from "../services/gohighlevel-client.js";
3
+ export declare function registerCustomValueTools(server: McpServer, client: GoHighLevelClient): void;
4
+ //# sourceMappingURL=custom-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-values.d.ts","sourceRoot":"","sources":["../../src/tools/custom-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAgB3E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAkI3F"}
@@ -0,0 +1,121 @@
1
+ import { formatApiError } from "../services/errors.js";
2
+ import { CreateCustomValueSchema, DeleteCustomValueSchema, GetCustomValueSchema, ListCustomValuesSchema, UpdateCustomValueSchema } from "../schemas/custom-values.js";
3
+ import { formatResponse, makeToolResponse, omitUndefined, requireConfirm, summarizeRecord } from "./format.js";
4
+ import { registerCollectionReadTool } from "./read-tools.js";
5
+ export function registerCustomValueTools(server, client) {
6
+ registerCollectionReadTool(server, client, {
7
+ name: "ghl_list_custom_values",
8
+ title: "List GoHighLevel Custom Values",
9
+ description: "List custom values for a GoHighLevel location from /locations/{locationId}/customValues.",
10
+ inputSchema: ListCustomValuesSchema.shape,
11
+ path: (params) => `/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/customValues`,
12
+ preferredFields: ["id", "name", "value", "fieldKey"],
13
+ heading: "GoHighLevel Custom Values",
14
+ collectionLabel: "custom values"
15
+ });
16
+ server.registerTool("ghl_get_custom_value", {
17
+ title: "Get GoHighLevel Custom Value",
18
+ description: "Get one custom value from /locations/{locationId}/customValues/{id}.",
19
+ inputSchema: GetCustomValueSchema.shape,
20
+ annotations: {
21
+ readOnlyHint: true,
22
+ destructiveHint: false,
23
+ idempotentHint: true,
24
+ openWorldHint: true
25
+ }
26
+ }, async ({ location_id, custom_value_id, response_format }) => {
27
+ try {
28
+ const customValue = await client.get(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/customValues/${encodeURIComponent(custom_value_id)}`);
29
+ const data = { customValue };
30
+ const markdown = ["# GoHighLevel Custom Value", "", summarizeRecord(customValue, ["id", "name", "value", "fieldKey"])].join("\n");
31
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
32
+ }
33
+ catch (error) {
34
+ const data = { error: formatApiError(error) };
35
+ return makeToolResponse(data, data.error, true);
36
+ }
37
+ });
38
+ server.registerTool("ghl_create_custom_value", {
39
+ title: "Create GoHighLevel Custom Value",
40
+ description: "Create a custom value for a GoHighLevel location. Write operation: do not run against live data without explicit approval.",
41
+ inputSchema: CreateCustomValueSchema.shape,
42
+ annotations: {
43
+ readOnlyHint: false,
44
+ destructiveHint: false,
45
+ idempotentHint: false,
46
+ openWorldHint: true
47
+ }
48
+ }, async (params) => {
49
+ try {
50
+ const customValue = await client.post(`/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/customValues`, {
51
+ name: params.name,
52
+ value: params.value
53
+ });
54
+ const data = { customValue };
55
+ const markdown = ["# Created GoHighLevel Custom Value", "", summarizeRecord(customValue, ["id", "name", "value", "fieldKey"])].join("\n");
56
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
57
+ }
58
+ catch (error) {
59
+ const data = { error: formatApiError(error) };
60
+ return makeToolResponse(data, data.error, true);
61
+ }
62
+ });
63
+ server.registerTool("ghl_update_custom_value", {
64
+ title: "Update GoHighLevel Custom Value",
65
+ description: "Update a custom value from /locations/{locationId}/customValues/{id}. Write operation: do not run against live data without explicit approval.",
66
+ inputSchema: UpdateCustomValueSchema.shape,
67
+ annotations: {
68
+ readOnlyHint: false,
69
+ destructiveHint: false,
70
+ idempotentHint: true,
71
+ openWorldHint: true
72
+ }
73
+ }, async (params) => {
74
+ try {
75
+ const body = omitUndefined({ name: params.name, value: params.value });
76
+ if (Object.keys(body).length === 0) {
77
+ const data = { error: "At least one custom value property must be provided for update." };
78
+ return makeToolResponse(data, data.error, true);
79
+ }
80
+ const customValue = await client.put(`/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/customValues/${encodeURIComponent(params.custom_value_id)}`, body);
81
+ const data = { customValue };
82
+ const markdown = ["# Updated GoHighLevel Custom Value", "", summarizeRecord(customValue, ["id", "name", "value", "fieldKey"])].join("\n");
83
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
84
+ }
85
+ catch (error) {
86
+ const data = { error: formatApiError(error) };
87
+ return makeToolResponse(data, data.error, true);
88
+ }
89
+ });
90
+ server.registerTool("ghl_delete_custom_value", {
91
+ title: "Delete GoHighLevel Custom Value",
92
+ description: "Delete a custom value from /locations/{locationId}/customValues/{id}. Requires confirm: true and owner approval before live execution.",
93
+ inputSchema: DeleteCustomValueSchema.shape,
94
+ annotations: {
95
+ readOnlyHint: false,
96
+ destructiveHint: true,
97
+ idempotentHint: false,
98
+ openWorldHint: true
99
+ }
100
+ }, async ({ location_id, custom_value_id, confirm, response_format }) => {
101
+ const guard = requireConfirm(confirm);
102
+ if (guard) {
103
+ const data = { error: guard };
104
+ return makeToolResponse(data, data.error, true);
105
+ }
106
+ try {
107
+ const result = await client.del(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/customValues/${encodeURIComponent(custom_value_id)}`);
108
+ const data = { custom_value_id, result };
109
+ const markdown = ["# Deleted GoHighLevel Custom Value", "", `Deleted custom value ${custom_value_id}.`].join("\n");
110
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
111
+ }
112
+ catch (error) {
113
+ const data = { error: formatApiError(error) };
114
+ return makeToolResponse(data, data.error, true);
115
+ }
116
+ });
117
+ }
118
+ function resolveLocationId(client, locationId) {
119
+ return typeof locationId === "string" && locationId.length > 0 ? locationId : client.defaultLocationId;
120
+ }
121
+ //# sourceMappingURL=custom-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-values.js","sourceRoot":"","sources":["../../src/tools/custom-values.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PaginatedItems, ResponseFormat, ToolResponse } from "../types.js";
2
+ export declare function paginate<T>(items: T[], limit: number, offset: number): PaginatedItems<T>;
3
+ export declare function makeToolResponse<T extends Record<string, unknown>>(data: T, text: string, isError?: boolean): ToolResponse<T>;
4
+ export declare function formatResponse<T>(format: ResponseFormat, data: T, markdown: string): string;
5
+ export declare function summarizeRecord(record: unknown, preferredFields: string[]): string;
6
+ export declare function omitUndefined(input: Record<string, unknown>): Record<string, unknown>;
7
+ export declare function mergeExtra(input: Record<string, unknown>, extra: Record<string, unknown> | undefined): Record<string, unknown>;
8
+ export declare function requireConfirm(confirm: boolean): string | null;
9
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/tools/format.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAYxF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAU3H;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,CAWlF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK9H;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE9D"}
@@ -0,0 +1,49 @@
1
+ import { RESPONSE_CHARACTER_LIMIT } from "../constants.js";
2
+ export function paginate(items, limit, offset) {
3
+ const pageItems = items.slice(offset, offset + limit);
4
+ const hasMore = offset + pageItems.length < items.length;
5
+ return {
6
+ total: items.length,
7
+ count: pageItems.length,
8
+ offset,
9
+ items: pageItems,
10
+ has_more: hasMore,
11
+ ...(hasMore ? { next_offset: offset + pageItems.length } : {})
12
+ };
13
+ }
14
+ export function makeToolResponse(data, text, isError = false) {
15
+ const responseText = text.length > RESPONSE_CHARACTER_LIMIT
16
+ ? `${text.slice(0, RESPONSE_CHARACTER_LIMIT)}\n\nResponse truncated at ${RESPONSE_CHARACTER_LIMIT} characters. Use filters or a smaller limit.`
17
+ : text;
18
+ return {
19
+ content: [{ type: "text", text: responseText }],
20
+ structuredContent: data,
21
+ ...(isError ? { isError: true } : {})
22
+ };
23
+ }
24
+ export function formatResponse(format, data, markdown) {
25
+ return format === "json" ? JSON.stringify(data, null, 2) : markdown;
26
+ }
27
+ export function summarizeRecord(record, preferredFields) {
28
+ if (!record || typeof record !== "object") {
29
+ return String(record);
30
+ }
31
+ const source = record;
32
+ const fields = preferredFields
33
+ .filter((field) => source[field] !== undefined && source[field] !== null && source[field] !== "")
34
+ .map((field) => `${field}: ${String(source[field])}`);
35
+ return fields.length > 0 ? fields.join(", ") : JSON.stringify(record);
36
+ }
37
+ export function omitUndefined(input) {
38
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
39
+ }
40
+ export function mergeExtra(input, extra) {
41
+ return {
42
+ ...omitUndefined(input),
43
+ ...(extra ?? {})
44
+ };
45
+ }
46
+ export function requireConfirm(confirm) {
47
+ return confirm === true ? null : "This is a destructive GoHighLevel operation. Re-run with confirm: true to call the API.";
48
+ }
49
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/tools/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { GoHighLevelClient } from "../services/gohighlevel-client.js";
3
+ export declare function registerTools(server: McpServer, client: GoHighLevelClient): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAU3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAShF"}
@@ -0,0 +1,19 @@
1
+ import { registerCalendarTools } from "./calendars.js";
2
+ import { registerContactTools } from "./contacts.js";
3
+ import { registerConversationTools } from "./conversations.js";
4
+ import { registerCustomFieldTools } from "./custom-fields.js";
5
+ import { registerCustomValueTools } from "./custom-values.js";
6
+ import { registerLocationTools } from "./locations.js";
7
+ import { registerOpportunityTools } from "./opportunities.js";
8
+ import { registerTagTools } from "./tags.js";
9
+ export function registerTools(server, client) {
10
+ registerCustomFieldTools(server, client);
11
+ registerCustomValueTools(server, client);
12
+ registerContactTools(server, client);
13
+ registerTagTools(server, client);
14
+ registerOpportunityTools(server, client);
15
+ registerConversationTools(server, client);
16
+ registerCalendarTools(server, client);
17
+ registerLocationTools(server, client);
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,MAAyB;IACxE,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { GoHighLevelClient } from "../services/gohighlevel-client.js";
3
+ export declare function registerLocationTools(server: McpServer, client: GoHighLevelClient): void;
4
+ //# sourceMappingURL=locations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.d.ts","sourceRoot":"","sources":["../../src/tools/locations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAM3E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAsCxF"}