@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,43 @@
1
+ import { formatApiError } from "../services/errors.js";
2
+ import { GetLocationSchema, ListUsersSchema } from "../schemas/locations.js";
3
+ import { formatResponse, makeToolResponse, summarizeRecord } from "./format.js";
4
+ import { registerCollectionReadTool } from "./read-tools.js";
5
+ export function registerLocationTools(server, client) {
6
+ server.registerTool("ghl_get_location", {
7
+ title: "Get GoHighLevel Location",
8
+ description: "Get one GoHighLevel location/sub-account with GET /locations/{locationId}.",
9
+ inputSchema: GetLocationSchema.shape,
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ openWorldHint: true
15
+ }
16
+ }, async ({ location_id, response_format }) => {
17
+ try {
18
+ const location = await client.get(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}`);
19
+ const data = { location };
20
+ const markdown = ["# GoHighLevel Location", "", summarizeRecord(location, ["id", "name", "businessName", "email", "phone", "timezone"])].join("\n");
21
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
22
+ }
23
+ catch (error) {
24
+ const data = { error: formatApiError(error) };
25
+ return makeToolResponse(data, data.error, true);
26
+ }
27
+ });
28
+ registerCollectionReadTool(server, client, {
29
+ name: "ghl_list_users",
30
+ title: "List GoHighLevel Users",
31
+ description: "List users for a location with GET /users/?locationId={locationId}.",
32
+ inputSchema: ListUsersSchema.shape,
33
+ path: () => "/users/",
34
+ query: (params) => ({ locationId: resolveLocationId(client, params.location_id) }),
35
+ preferredFields: ["id", "name", "firstName", "lastName", "email", "phone", "role"],
36
+ heading: "GoHighLevel Users",
37
+ collectionLabel: "users"
38
+ });
39
+ }
40
+ function resolveLocationId(client, locationId) {
41
+ return typeof locationId === "string" && locationId.length > 0 ? locationId : client.defaultLocationId;
42
+ }
43
+ //# sourceMappingURL=locations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.js","sourceRoot":"","sources":["../../src/tools/locations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAyB,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAyB;IAChF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE,iBAAiB,CAAC,KAAK;QACpC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,eAAe,EAAoB,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,cAAc,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;YACvH,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,CAAC,wBAAwB,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpJ,OAAO,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,qEAAqE;QAClF,WAAW,EAAE,eAAe,CAAC,KAAK;QAClC,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;QACrB,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAClF,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;QAClF,OAAO,EAAE,mBAAmB;QAC5B,eAAe,EAAE,OAAO;KACzB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAyB,EAAE,UAAmB;IACvE,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;AACzG,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 registerOpportunityTools(server: McpServer, client: GoHighLevelClient): void;
4
+ //# sourceMappingURL=opportunities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opportunities.d.ts","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAmB3E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAuL3F"}
@@ -0,0 +1,182 @@
1
+ import { formatApiError } from "../services/errors.js";
2
+ import { CreateOpportunitySchema, DeleteOpportunitySchema, GetPipelinesSchema, OpportunityIdSchema, SearchOpportunitiesSchema, UpdateOpportunitySchema, UpdateOpportunityStatusSchema } from "../schemas/opportunities.js";
3
+ import { formatResponse, makeToolResponse, mergeExtra, omitUndefined, requireConfirm, summarizeRecord } from "./format.js";
4
+ import { registerCollectionReadTool } from "./read-tools.js";
5
+ export function registerOpportunityTools(server, client) {
6
+ registerCollectionReadTool(server, client, {
7
+ name: "ghl_search_opportunities",
8
+ title: "Search GoHighLevel Opportunities",
9
+ description: "Search opportunities with GET /opportunities/search using GoHighLevel server-side filters.",
10
+ inputSchema: SearchOpportunitiesSchema.shape,
11
+ path: () => "/opportunities/search",
12
+ query: (params) => omitUndefined({
13
+ location_id: resolveLocationId(client, params.location_id),
14
+ q: params.q,
15
+ pipeline_id: params.pipeline_id,
16
+ pipeline_stage_id: params.pipeline_stage_id,
17
+ status: params.status,
18
+ assigned_to: params.assigned_to,
19
+ campaignId: params.campaignId,
20
+ id: params.id,
21
+ order: params.order,
22
+ endDate: params.endDate,
23
+ startAfter: params.startAfter,
24
+ startAfterId: params.startAfterId,
25
+ date: params.date,
26
+ country: params.country,
27
+ limit: params.server_limit,
28
+ page: params.page
29
+ }),
30
+ preferredFields: ["id", "name", "contactId", "pipelineId", "pipelineStageId", "status", "monetaryValue"],
31
+ heading: "GoHighLevel Opportunities",
32
+ collectionLabel: "opportunities"
33
+ });
34
+ registerCollectionReadTool(server, client, {
35
+ name: "ghl_get_pipelines",
36
+ title: "Get GoHighLevel Pipelines",
37
+ description: "List opportunity pipelines with GET /opportunities/pipelines?locationId={locationId}.",
38
+ inputSchema: GetPipelinesSchema.shape,
39
+ path: () => "/opportunities/pipelines",
40
+ query: (params) => ({ locationId: resolveLocationId(client, params.location_id) }),
41
+ preferredFields: ["id", "name", "stages"],
42
+ heading: "GoHighLevel Pipelines",
43
+ collectionLabel: "pipelines"
44
+ });
45
+ server.registerTool("ghl_get_opportunity", {
46
+ title: "Get GoHighLevel Opportunity",
47
+ description: "Get one opportunity with GET /opportunities/{id}.",
48
+ inputSchema: OpportunityIdSchema.shape,
49
+ annotations: {
50
+ readOnlyHint: true,
51
+ destructiveHint: false,
52
+ idempotentHint: true,
53
+ openWorldHint: true
54
+ }
55
+ }, async ({ opportunity_id, response_format }) => {
56
+ try {
57
+ const opportunity = await client.get(`/opportunities/${encodeURIComponent(opportunity_id)}`);
58
+ const data = { opportunity };
59
+ const markdown = ["# GoHighLevel Opportunity", "", summarizeRecord(opportunity, ["id", "name", "contactId", "pipelineId", "pipelineStageId", "status", "monetaryValue"])].join("\n");
60
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
61
+ }
62
+ catch (error) {
63
+ const data = { error: formatApiError(error) };
64
+ return makeToolResponse(data, data.error, true);
65
+ }
66
+ });
67
+ server.registerTool("ghl_create_opportunity", {
68
+ title: "Create GoHighLevel Opportunity",
69
+ description: "Create an opportunity with POST /opportunities/. Write operation: do not run against live data without explicit approval.",
70
+ inputSchema: CreateOpportunitySchema.shape,
71
+ annotations: {
72
+ readOnlyHint: false,
73
+ destructiveHint: false,
74
+ idempotentHint: false,
75
+ openWorldHint: true
76
+ }
77
+ }, async (params) => {
78
+ try {
79
+ const opportunity = await client.post("/opportunities/", opportunityBody(client, params, true));
80
+ const data = { opportunity };
81
+ const markdown = ["# Created GoHighLevel Opportunity", "", summarizeRecord(opportunity, ["id", "name", "contactId", "pipelineId", "pipelineStageId", "status", "monetaryValue"])].join("\n");
82
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
83
+ }
84
+ catch (error) {
85
+ const data = { error: formatApiError(error) };
86
+ return makeToolResponse(data, data.error, true);
87
+ }
88
+ });
89
+ server.registerTool("ghl_update_opportunity", {
90
+ title: "Update GoHighLevel Opportunity",
91
+ description: "Update an opportunity with PUT /opportunities/{id}. Write operation: do not run against live data without explicit approval.",
92
+ inputSchema: UpdateOpportunitySchema.shape,
93
+ annotations: {
94
+ readOnlyHint: false,
95
+ destructiveHint: false,
96
+ idempotentHint: true,
97
+ openWorldHint: true
98
+ }
99
+ }, async (params) => {
100
+ try {
101
+ const body = opportunityBody(client, params, false);
102
+ if (Object.keys(body).length === 0) {
103
+ const data = { error: "At least one opportunity property must be provided for update." };
104
+ return makeToolResponse(data, data.error, true);
105
+ }
106
+ const opportunity = await client.put(`/opportunities/${encodeURIComponent(params.opportunity_id)}`, body);
107
+ const data = { opportunity };
108
+ const markdown = ["# Updated GoHighLevel Opportunity", "", summarizeRecord(opportunity, ["id", "name", "contactId", "pipelineId", "pipelineStageId", "status", "monetaryValue"])].join("\n");
109
+ return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
110
+ }
111
+ catch (error) {
112
+ const data = { error: formatApiError(error) };
113
+ return makeToolResponse(data, data.error, true);
114
+ }
115
+ });
116
+ server.registerTool("ghl_update_opportunity_status", {
117
+ title: "Update GoHighLevel Opportunity Status",
118
+ description: "Update opportunity status with PUT /opportunities/{id}/status. Write operation: do not run against live data without explicit approval.",
119
+ inputSchema: UpdateOpportunityStatusSchema.shape,
120
+ annotations: {
121
+ readOnlyHint: false,
122
+ destructiveHint: false,
123
+ idempotentHint: true,
124
+ openWorldHint: true
125
+ }
126
+ }, async ({ opportunity_id, status, response_format }) => {
127
+ try {
128
+ const opportunity = await client.put(`/opportunities/${encodeURIComponent(opportunity_id)}/status`, { status });
129
+ const data = { opportunity };
130
+ const markdown = ["# Updated GoHighLevel Opportunity Status", "", summarizeRecord(opportunity, ["id", "name", "status"])].join("\n");
131
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
132
+ }
133
+ catch (error) {
134
+ const data = { error: formatApiError(error) };
135
+ return makeToolResponse(data, data.error, true);
136
+ }
137
+ });
138
+ server.registerTool("ghl_delete_opportunity", {
139
+ title: "Delete GoHighLevel Opportunity",
140
+ description: "Delete an opportunity with DELETE /opportunities/{id}. Requires confirm: true and owner approval before live execution.",
141
+ inputSchema: DeleteOpportunitySchema.shape,
142
+ annotations: {
143
+ readOnlyHint: false,
144
+ destructiveHint: true,
145
+ idempotentHint: false,
146
+ openWorldHint: true
147
+ }
148
+ }, async ({ opportunity_id, confirm, response_format }) => {
149
+ const guard = requireConfirm(confirm);
150
+ if (guard) {
151
+ const data = { error: guard };
152
+ return makeToolResponse(data, data.error, true);
153
+ }
154
+ try {
155
+ const result = await client.del(`/opportunities/${encodeURIComponent(opportunity_id)}`);
156
+ const data = { opportunity_id, result };
157
+ const markdown = ["# Deleted GoHighLevel Opportunity", "", `Deleted opportunity ${opportunity_id}.`].join("\n");
158
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
159
+ }
160
+ catch (error) {
161
+ const data = { error: formatApiError(error) };
162
+ return makeToolResponse(data, data.error, true);
163
+ }
164
+ });
165
+ }
166
+ function resolveLocationId(client, locationId) {
167
+ return typeof locationId === "string" && locationId.length > 0 ? locationId : client.defaultLocationId;
168
+ }
169
+ function opportunityBody(client, params, includeLocationId) {
170
+ return mergeExtra({
171
+ ...(includeLocationId ? { locationId: resolveLocationId(client, "location_id" in params ? params.location_id : undefined) } : {}),
172
+ name: params.name,
173
+ contactId: params.contactId,
174
+ pipelineId: params.pipelineId,
175
+ pipelineStageId: params.pipelineStageId,
176
+ status: params.status,
177
+ monetaryValue: params.monetaryValue,
178
+ assignedTo: params.assignedTo,
179
+ source: params.source
180
+ }, params.extra);
181
+ }
182
+ //# sourceMappingURL=opportunities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opportunities.js","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { z } from "zod";
3
+ import type { GoHighLevelClient } from "../services/gohighlevel-client.js";
4
+ type ToolParams = Record<string, unknown>;
5
+ type CollectionReadOptions = {
6
+ name: string;
7
+ title: string;
8
+ description: string;
9
+ inputSchema: Record<string, z.ZodTypeAny>;
10
+ path: (params: ToolParams) => string;
11
+ query?: (params: ToolParams) => Record<string, unknown> | undefined;
12
+ body?: (params: ToolParams) => Record<string, unknown> | undefined;
13
+ method?: "get" | "post";
14
+ preferredFields: string[];
15
+ heading: string;
16
+ collectionLabel: string;
17
+ };
18
+ export declare function registerCollectionReadTool(server: McpServer, client: GoHighLevelClient, options: CollectionReadOptions): void;
19
+ export declare function extractItems(raw: unknown): unknown[];
20
+ export declare function extractTraceId(raw: unknown): unknown;
21
+ export {};
22
+ //# sourceMappingURL=read-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-tools.d.ts","sourceRoot":"","sources":["../../src/tools/read-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnE,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAQF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CA4CN;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,CAepD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,68 @@
1
+ import { formatApiError } from "../services/errors.js";
2
+ import { formatResponse, makeToolResponse, paginate, summarizeRecord } from "./format.js";
3
+ export function registerCollectionReadTool(server, client, options) {
4
+ server.registerTool(options.name, {
5
+ title: options.title,
6
+ description: options.description,
7
+ inputSchema: options.inputSchema,
8
+ annotations: {
9
+ readOnlyHint: true,
10
+ destructiveHint: false,
11
+ idempotentHint: true,
12
+ openWorldHint: true
13
+ }
14
+ }, async (params) => {
15
+ try {
16
+ const paging = params;
17
+ const raw = options.method === "post"
18
+ ? await client.post(options.path(params), options.body?.(params))
19
+ : await client.get(options.path(params), options.query?.(params));
20
+ const items = extractItems(raw);
21
+ const data = {
22
+ server_total: extractServerTotal(raw),
23
+ traceId: extractTraceId(raw),
24
+ ...paginate(items, paging.limit, paging.offset)
25
+ };
26
+ const totalText = data.server_total === undefined
27
+ ? `${data.total} ${options.collectionLabel}`
28
+ : `${data.server_total} ${options.collectionLabel} reported by GoHighLevel, ${data.total} received`;
29
+ const markdown = [
30
+ `# ${options.heading}`,
31
+ "",
32
+ `Showing ${data.count} of ${totalText}.`,
33
+ "",
34
+ ...data.items.map((item) => `- ${summarizeRecord(item, options.preferredFields)}`)
35
+ ].join("\n");
36
+ return makeToolResponse(data, formatResponse(paging.response_format, data, markdown));
37
+ }
38
+ catch (error) {
39
+ const data = { error: formatApiError(error) };
40
+ return makeToolResponse(data, data.error, true);
41
+ }
42
+ });
43
+ }
44
+ export function extractItems(raw) {
45
+ if (Array.isArray(raw)) {
46
+ return raw;
47
+ }
48
+ if (raw && typeof raw === "object") {
49
+ const source = raw;
50
+ for (const key of ["customFields", "customValues", "contacts", "tags", "pipelines", "opportunities", "conversations", "messages", "calendars", "users", "fields", "folders", "events", "appointments", "slots", "freeSlots", "notes", "tasks", "results", "items", "data", "rows"]) {
51
+ if (Array.isArray(source[key])) {
52
+ return source[key];
53
+ }
54
+ }
55
+ }
56
+ return raw === undefined || raw === null ? [] : [raw];
57
+ }
58
+ export function extractTraceId(raw) {
59
+ return raw && typeof raw === "object" ? raw.traceId : undefined;
60
+ }
61
+ function extractServerTotal(raw) {
62
+ if (!raw || typeof raw !== "object") {
63
+ return undefined;
64
+ }
65
+ const value = raw.total;
66
+ return typeof value === "number" ? value : undefined;
67
+ }
68
+ //# sourceMappingURL=read-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-tools.js","sourceRoot":"","sources":["../../src/tools/read-tools.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 registerTagTools(server: McpServer, client: GoHighLevelClient): void;
4
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAgB3E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAyHnF"}
@@ -0,0 +1,113 @@
1
+ import { formatApiError } from "../services/errors.js";
2
+ import { CreateTagSchema, DeleteTagSchema, GetTagSchema, ListTagsSchema, UpdateTagSchema } from "../schemas/tags.js";
3
+ import { formatResponse, makeToolResponse, requireConfirm, summarizeRecord } from "./format.js";
4
+ import { registerCollectionReadTool } from "./read-tools.js";
5
+ export function registerTagTools(server, client) {
6
+ registerCollectionReadTool(server, client, {
7
+ name: "ghl_list_tags",
8
+ title: "List GoHighLevel Tags",
9
+ description: "List tags for a GoHighLevel location from /locations/{locationId}/tags.",
10
+ inputSchema: ListTagsSchema.shape,
11
+ path: (params) => `/locations/${encodeURIComponent(resolveLocationId(client, params.location_id))}/tags`,
12
+ preferredFields: ["id", "name"],
13
+ heading: "GoHighLevel Tags",
14
+ collectionLabel: "tags"
15
+ });
16
+ server.registerTool("ghl_get_tag", {
17
+ title: "Get GoHighLevel Tag",
18
+ description: "Get one tag from /locations/{locationId}/tags/{id}.",
19
+ inputSchema: GetTagSchema.shape,
20
+ annotations: {
21
+ readOnlyHint: true,
22
+ destructiveHint: false,
23
+ idempotentHint: true,
24
+ openWorldHint: true
25
+ }
26
+ }, async ({ location_id, tag_id, response_format }) => {
27
+ try {
28
+ const tag = await client.get(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/tags/${encodeURIComponent(tag_id)}`);
29
+ const data = { tag };
30
+ const markdown = ["# GoHighLevel Tag", "", summarizeRecord(tag, ["id", "name"])].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_tag", {
39
+ title: "Create GoHighLevel Tag",
40
+ description: "Create a location tag. Write operation: do not run against live data without explicit approval.",
41
+ inputSchema: CreateTagSchema.shape,
42
+ annotations: {
43
+ readOnlyHint: false,
44
+ destructiveHint: false,
45
+ idempotentHint: false,
46
+ openWorldHint: true
47
+ }
48
+ }, async ({ location_id, name, response_format }) => {
49
+ try {
50
+ const tag = await client.post(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/tags`, { name });
51
+ const data = { tag };
52
+ const markdown = ["# Created GoHighLevel Tag", "", summarizeRecord(tag, ["id", "name"])].join("\n");
53
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
54
+ }
55
+ catch (error) {
56
+ const data = { error: formatApiError(error) };
57
+ return makeToolResponse(data, data.error, true);
58
+ }
59
+ });
60
+ server.registerTool("ghl_update_tag", {
61
+ title: "Update GoHighLevel Tag",
62
+ description: "Update a location tag. Write operation: do not run against live data without explicit approval.",
63
+ inputSchema: UpdateTagSchema.shape,
64
+ annotations: {
65
+ readOnlyHint: false,
66
+ destructiveHint: false,
67
+ idempotentHint: true,
68
+ openWorldHint: true
69
+ }
70
+ }, async ({ location_id, tag_id, name, response_format }) => {
71
+ try {
72
+ const tag = await client.put(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/tags/${encodeURIComponent(tag_id)}`, { name });
73
+ const data = { tag };
74
+ const markdown = ["# Updated GoHighLevel Tag", "", summarizeRecord(tag, ["id", "name"])].join("\n");
75
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
76
+ }
77
+ catch (error) {
78
+ const data = { error: formatApiError(error) };
79
+ return makeToolResponse(data, data.error, true);
80
+ }
81
+ });
82
+ server.registerTool("ghl_delete_tag", {
83
+ title: "Delete GoHighLevel Tag",
84
+ description: "Delete a location tag. Requires confirm: true and owner approval before live execution.",
85
+ inputSchema: DeleteTagSchema.shape,
86
+ annotations: {
87
+ readOnlyHint: false,
88
+ destructiveHint: true,
89
+ idempotentHint: false,
90
+ openWorldHint: true
91
+ }
92
+ }, async ({ location_id, tag_id, confirm, response_format }) => {
93
+ const guard = requireConfirm(confirm);
94
+ if (guard) {
95
+ const data = { error: guard };
96
+ return makeToolResponse(data, data.error, true);
97
+ }
98
+ try {
99
+ const result = await client.del(`/locations/${encodeURIComponent(resolveLocationId(client, location_id))}/tags/${encodeURIComponent(tag_id)}`);
100
+ const data = { tag_id, result };
101
+ const markdown = ["# Deleted GoHighLevel Tag", "", `Deleted tag ${tag_id}.`].join("\n");
102
+ return makeToolResponse(data, formatResponse(response_format, data, markdown));
103
+ }
104
+ catch (error) {
105
+ const data = { error: formatApiError(error) };
106
+ return makeToolResponse(data, data.error, true);
107
+ }
108
+ });
109
+ }
110
+ function resolveLocationId(client, locationId) {
111
+ return typeof locationId === "string" && locationId.length > 0 ? locationId : client.defaultLocationId;
112
+ }
113
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type GhlMethod = "GET" | "POST" | "PUT" | "DELETE";
2
+ export type ResponseFormat = "markdown" | "json";
3
+ export interface GhlConfig {
4
+ baseUrl: string;
5
+ apiToken: string;
6
+ apiVersion: string;
7
+ locationId: string;
8
+ timeoutMs: number;
9
+ }
10
+ export interface PaginatedItems<T> {
11
+ [key: string]: unknown;
12
+ total: number;
13
+ count: number;
14
+ offset: number;
15
+ items: T[];
16
+ has_more: boolean;
17
+ next_offset?: number;
18
+ }
19
+ export interface ToolResponse<T extends Record<string, unknown>> {
20
+ [key: string]: unknown;
21
+ content: Array<{
22
+ type: "text";
23
+ text: string;
24
+ }>;
25
+ structuredContent: T;
26
+ isError?: boolean;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,CAAC,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@nightsquawktech/gohighlevel-mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for curated GoHighLevel API v2 coverage.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": "./dist/index.js",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE",
12
+ "COMMERCIAL.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx src/index.ts",
18
+ "clean": "rimraf dist"
19
+ },
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.26.0",
25
+ "axios": "^1.13.2",
26
+ "zod": "^3.25.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^24.0.0",
30
+ "rimraf": "^6.0.1",
31
+ "tsx": "^4.20.0",
32
+ "typescript": "^5.9.0"
33
+ },
34
+ "license": "AGPL-3.0-only",
35
+ "author": "Kevin Reyes (NightSquawk Tech) <hello@nightsquawk.tech>",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/NightSquawk/gohighlevel-mcp-server.git"
39
+ },
40
+ "homepage": "https://github.com/NightSquawk/gohighlevel-mcp-server#readme",
41
+ "bugs": {
42
+ "url": "https://github.com/NightSquawk/gohighlevel-mcp-server/issues"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ }
47
+ }