neuron-mcp-server 1.0.0 → 1.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 (150) hide show
  1. package/.env +13 -0
  2. package/AI_PERSONALITY_DESIGN_RESEARCH.md +1020 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +146 -131
  5. package/dist/client.d.ts +6 -0
  6. package/dist/client.js +50 -12
  7. package/dist/client.js.map +1 -1
  8. package/dist/index.js +51 -7
  9. package/dist/index.js.map +1 -1
  10. package/dist/tools/ai.js +9 -3
  11. package/dist/tools/ai.js.map +1 -1
  12. package/dist/tools/approvals.d.ts +2 -0
  13. package/dist/tools/approvals.js +181 -0
  14. package/dist/tools/approvals.js.map +1 -0
  15. package/dist/tools/audit.js +7 -4
  16. package/dist/tools/audit.js.map +1 -1
  17. package/dist/tools/auth.js +119 -19
  18. package/dist/tools/auth.js.map +1 -1
  19. package/dist/tools/billing.js +22 -6
  20. package/dist/tools/billing.js.map +1 -1
  21. package/dist/tools/blog.js +98 -34
  22. package/dist/tools/blog.js.map +1 -1
  23. package/dist/tools/bot-api-keys.js +27 -12
  24. package/dist/tools/bot-api-keys.js.map +1 -1
  25. package/dist/tools/bot-api.js +53 -27
  26. package/dist/tools/bot-api.js.map +1 -1
  27. package/dist/tools/bots.js +116 -68
  28. package/dist/tools/bots.js.map +1 -1
  29. package/dist/tools/broadcasts.js +78 -38
  30. package/dist/tools/broadcasts.js.map +1 -1
  31. package/dist/tools/builtin-tools.js +19 -12
  32. package/dist/tools/builtin-tools.js.map +1 -1
  33. package/dist/tools/campaigns.js +149 -61
  34. package/dist/tools/campaigns.js.map +1 -1
  35. package/dist/tools/channels.js +163 -53
  36. package/dist/tools/channels.js.map +1 -1
  37. package/dist/tools/contact-lists.js +111 -51
  38. package/dist/tools/contact-lists.js.map +1 -1
  39. package/dist/tools/contacts.js +117 -44
  40. package/dist/tools/contacts.js.map +1 -1
  41. package/dist/tools/conversations.js +95 -50
  42. package/dist/tools/conversations.js.map +1 -1
  43. package/dist/tools/flows.d.ts +2 -0
  44. package/dist/tools/flows.js +242 -0
  45. package/dist/tools/flows.js.map +1 -0
  46. package/dist/tools/group-management.d.ts +2 -0
  47. package/dist/tools/group-management.js +239 -0
  48. package/dist/tools/group-management.js.map +1 -0
  49. package/dist/tools/leads.d.ts +2 -0
  50. package/dist/tools/leads.js +100 -0
  51. package/dist/tools/leads.js.map +1 -0
  52. package/dist/tools/list-campaigns.d.ts +2 -0
  53. package/dist/tools/list-campaigns.js +152 -0
  54. package/dist/tools/list-campaigns.js.map +1 -0
  55. package/dist/tools/list-pool.js +250 -33
  56. package/dist/tools/list-pool.js.map +1 -1
  57. package/dist/tools/media.js +12 -7
  58. package/dist/tools/media.js.map +1 -1
  59. package/dist/tools/newsletters.js +106 -26
  60. package/dist/tools/newsletters.js.map +1 -1
  61. package/dist/tools/organizations.js +76 -35
  62. package/dist/tools/organizations.js.map +1 -1
  63. package/dist/tools/outbound-webhooks.js +32 -20
  64. package/dist/tools/outbound-webhooks.js.map +1 -1
  65. package/dist/tools/payouts.js +44 -17
  66. package/dist/tools/payouts.js.map +1 -1
  67. package/dist/tools/personas.d.ts +2 -0
  68. package/dist/tools/personas.js +141 -0
  69. package/dist/tools/personas.js.map +1 -0
  70. package/dist/tools/polls.d.ts +2 -0
  71. package/dist/tools/polls.js +30 -0
  72. package/dist/tools/polls.js.map +1 -0
  73. package/dist/tools/pool.js +101 -43
  74. package/dist/tools/pool.js.map +1 -1
  75. package/dist/tools/products.d.ts +2 -0
  76. package/dist/tools/products.js +277 -0
  77. package/dist/tools/products.js.map +1 -0
  78. package/dist/tools/profile-privacy.d.ts +2 -0
  79. package/dist/tools/profile-privacy.js +195 -0
  80. package/dist/tools/profile-privacy.js.map +1 -0
  81. package/dist/tools/reflections.js +25 -13
  82. package/dist/tools/reflections.js.map +1 -1
  83. package/dist/tools/scheduled-messages.d.ts +2 -0
  84. package/dist/tools/scheduled-messages.js +124 -0
  85. package/dist/tools/scheduled-messages.js.map +1 -0
  86. package/dist/tools/social-channels.d.ts +2 -0
  87. package/dist/tools/social-channels.js +318 -0
  88. package/dist/tools/social-channels.js.map +1 -0
  89. package/dist/tools/tasks.d.ts +2 -0
  90. package/dist/tools/tasks.js +155 -0
  91. package/dist/tools/tasks.js.map +1 -0
  92. package/dist/tools/tools.js +86 -40
  93. package/dist/tools/tools.js.map +1 -1
  94. package/dist/tools/wallets.js +34 -12
  95. package/dist/tools/wallets.js.map +1 -1
  96. package/dist/tools/webhooks.js +35 -20
  97. package/dist/tools/webhooks.js.map +1 -1
  98. package/dist/tools/whatsapp-actions.d.ts +2 -0
  99. package/dist/tools/whatsapp-actions.js +186 -0
  100. package/dist/tools/whatsapp-actions.js.map +1 -0
  101. package/package.json +4 -31
  102. package/scripts/setup-delivahere-bot.ts +804 -0
  103. package/scripts/test-delivahere-bot.ts +128 -0
  104. package/scripts/update-letschop-prompt.ts +194 -0
  105. package/server.json +26 -0
  106. package/smithery.yaml +19 -0
  107. package/src/client.ts +169 -0
  108. package/src/index.ts +256 -0
  109. package/src/tools/ai.ts +35 -0
  110. package/src/tools/approvals.ts +231 -0
  111. package/src/tools/audit.ts +49 -0
  112. package/src/tools/auth.ts +536 -0
  113. package/src/tools/billing.ts +79 -0
  114. package/src/tools/blog.ts +264 -0
  115. package/src/tools/bot-api-keys.ts +87 -0
  116. package/src/tools/bot-api.ts +193 -0
  117. package/src/tools/bots.ts +320 -0
  118. package/src/tools/broadcasts.ts +224 -0
  119. package/src/tools/builtin-tools.ts +108 -0
  120. package/src/tools/campaigns.ts +429 -0
  121. package/src/tools/channels.ts +520 -0
  122. package/src/tools/contact-lists.ts +320 -0
  123. package/src/tools/contacts.ts +395 -0
  124. package/src/tools/conversations.ts +349 -0
  125. package/src/tools/flows.ts +298 -0
  126. package/src/tools/group-management.ts +265 -0
  127. package/src/tools/knowledge-bases.ts +451 -0
  128. package/src/tools/leads.ts +104 -0
  129. package/src/tools/list-campaigns.ts +190 -0
  130. package/src/tools/list-pool.ts +389 -0
  131. package/src/tools/media.ts +50 -0
  132. package/src/tools/newsletters.ts +271 -0
  133. package/src/tools/organizations.ts +287 -0
  134. package/src/tools/outbound-webhooks.ts +181 -0
  135. package/src/tools/payouts.ts +133 -0
  136. package/src/tools/personas.ts +145 -0
  137. package/src/tools/polls.ts +32 -0
  138. package/src/tools/pool.ts +293 -0
  139. package/src/tools/products.ts +280 -0
  140. package/src/tools/profile-privacy.ts +215 -0
  141. package/src/tools/reflections.ts +124 -0
  142. package/src/tools/scheduled-messages.ts +144 -0
  143. package/src/tools/social-channels.ts +396 -0
  144. package/src/tools/tasks.ts +198 -0
  145. package/src/tools/tools.ts +255 -0
  146. package/src/tools/wallets.ts +107 -0
  147. package/src/tools/webhooks.ts +166 -0
  148. package/src/tools/whatsapp-actions.ts +203 -0
  149. package/tsconfig.json +20 -0
  150. package/LICENSE +0 -21
@@ -0,0 +1,320 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { api, jsonResult, errorResult } from "../client.js";
4
+
5
+ export function registerContactListsTools(server: McpServer): void {
6
+ server.registerTool(
7
+ "neuron_list_contact_lists",
8
+ {
9
+ title: "List Contact Lists",
10
+ description: "Retrieve all contact lists for the current organization with optional filtering by search term, type, and pagination.",
11
+ inputSchema: z.object({
12
+ search: z.string().optional().describe("Search term to filter lists by name or slug"),
13
+ type: z.string().optional().describe("Filter by list type: 'static', 'dynamic', or 'merged'"),
14
+ page: z.number().int().positive().optional().describe("Page number for pagination (default: 1)"),
15
+ limit: z.number().int().positive().optional().describe("Number of items per page (default: 20)"),
16
+ }),
17
+ annotations: {
18
+ readOnlyHint: true,
19
+ destructiveHint: false,
20
+ idempotentHint: true,
21
+ openWorldHint: false,
22
+ },
23
+ },
24
+ async (params) => {
25
+ try {
26
+ const result = await api("GET", "/contact-lists", undefined, {
27
+ search: params.search,
28
+ type: params.type,
29
+ page: params.page,
30
+ limit: params.limit,
31
+ });
32
+ return jsonResult(result);
33
+ } catch (error) {
34
+ return errorResult(error);
35
+ }
36
+ },
37
+ );
38
+
39
+ server.registerTool(
40
+ "neuron_get_contact_list",
41
+ {
42
+ title: "Get Contact List",
43
+ description: "Retrieve detailed information about a specific contact list, including member count and configuration.",
44
+ inputSchema: z.object({
45
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the contact list"),
46
+ }),
47
+ annotations: {
48
+ readOnlyHint: true,
49
+ destructiveHint: false,
50
+ idempotentHint: true,
51
+ openWorldHint: false,
52
+ },
53
+ },
54
+ async (params) => {
55
+ try {
56
+ const result = await api("GET", `/contact-lists/${params.idOrSlug}`);
57
+ return jsonResult(result);
58
+ } catch (error) {
59
+ return errorResult(error);
60
+ }
61
+ },
62
+ );
63
+
64
+ server.registerTool(
65
+ "neuron_create_contact_list",
66
+ {
67
+ title: "Create Contact List",
68
+ description: "Create a new contact list. Slug is auto-generated from name if not provided. For dynamic lists, provide criteria with rules and/or an AI prompt.",
69
+ inputSchema: z.object({
70
+ name: z.string().describe("Display name for the contact list"),
71
+ slug: z.string().optional().describe("URL-friendly identifier (auto-generated from name if omitted)"),
72
+ description: z.string().optional().describe("Human-readable description of the list's purpose"),
73
+ type: z.enum(["static", "dynamic", "merged"]).optional().describe("List type (default: 'static')"),
74
+ criteria: z.record(z.unknown()).optional().describe("Dynamic list criteria object: { rules?: { operator, conditions }, aiPrompt?, aiMaxResults? }"),
75
+ refreshSchedule: z.enum(["manual", "daily", "weekly", "on_access"]).optional().describe("Refresh schedule for dynamic lists (default: 'manual')"),
76
+ }),
77
+ annotations: {
78
+ readOnlyHint: false,
79
+ destructiveHint: false,
80
+ idempotentHint: false,
81
+ openWorldHint: false,
82
+ },
83
+ },
84
+ async (params) => {
85
+ try {
86
+ const result = await api("POST", "/contact-lists", params);
87
+ return jsonResult(result);
88
+ } catch (error) {
89
+ return errorResult(error);
90
+ }
91
+ },
92
+ );
93
+
94
+ server.registerTool(
95
+ "neuron_update_contact_list",
96
+ {
97
+ title: "Update Contact List",
98
+ description: "Update an existing contact list's name, slug, description, criteria, or refresh schedule.",
99
+ inputSchema: z.object({
100
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the contact list to update"),
101
+ name: z.string().optional().describe("Updated display name for the list"),
102
+ slug: z.string().optional().describe("Updated URL-friendly slug for the list"),
103
+ description: z.string().optional().describe("Updated description of the list's purpose"),
104
+ criteria: z.record(z.unknown()).optional().nullable().describe("Updated dynamic list criteria. Set to null to clear existing criteria."),
105
+ refreshSchedule: z.enum(["manual", "daily", "weekly", "on_access"]).optional().describe("Updated refresh schedule for dynamic lists"),
106
+ }),
107
+ annotations: {
108
+ readOnlyHint: false,
109
+ destructiveHint: false,
110
+ idempotentHint: true,
111
+ openWorldHint: false,
112
+ },
113
+ },
114
+ async (params) => {
115
+ try {
116
+ const { idOrSlug, ...body } = params;
117
+ const result = await api("PUT", `/contact-lists/${idOrSlug}`, body);
118
+ return jsonResult(result);
119
+ } catch (error) {
120
+ return errorResult(error);
121
+ }
122
+ },
123
+ );
124
+
125
+ server.registerTool(
126
+ "neuron_delete_contact_list",
127
+ {
128
+ title: "Delete Contact List",
129
+ description: "Permanently delete a contact list. System-protected lists (e.g., 'Do Not Contact') cannot be deleted.",
130
+ inputSchema: z.object({
131
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the contact list to delete"),
132
+ }),
133
+ annotations: {
134
+ readOnlyHint: false,
135
+ destructiveHint: true,
136
+ idempotentHint: true,
137
+ openWorldHint: false,
138
+ },
139
+ },
140
+ async (params) => {
141
+ try {
142
+ const result = await api("DELETE", `/contact-lists/${params.idOrSlug}`);
143
+ return jsonResult(result);
144
+ } catch (error) {
145
+ return errorResult(error);
146
+ }
147
+ },
148
+ );
149
+
150
+ server.registerTool(
151
+ "neuron_get_contact_list_members",
152
+ {
153
+ title: "Get Contact List Members",
154
+ description: "Retrieve the members of a specific contact list with optional search filtering and pagination.",
155
+ inputSchema: z.object({
156
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the contact list"),
157
+ search: z.string().optional().describe("Search term to filter members by name or phone number"),
158
+ page: z.number().int().positive().optional().describe("Page number for pagination (default: 1)"),
159
+ limit: z.number().int().positive().optional().describe("Number of items per page (default: 20)"),
160
+ }),
161
+ annotations: {
162
+ readOnlyHint: true,
163
+ destructiveHint: false,
164
+ idempotentHint: true,
165
+ openWorldHint: false,
166
+ },
167
+ },
168
+ async (params) => {
169
+ try {
170
+ const result = await api("GET", `/contact-lists/${params.idOrSlug}/members`, undefined, {
171
+ search: params.search,
172
+ page: params.page,
173
+ limit: params.limit,
174
+ });
175
+ return jsonResult(result);
176
+ } catch (error) {
177
+ return errorResult(error);
178
+ }
179
+ },
180
+ );
181
+
182
+ server.registerTool(
183
+ "neuron_add_to_contact_list",
184
+ {
185
+ title: "Add to Contact List",
186
+ description: "Add one or more contacts to a list by contact ID or phone number. Phone numbers without existing contacts are auto-created as minimal contact records.",
187
+ inputSchema: z.object({
188
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the target contact list"),
189
+ entries: z.array(
190
+ z.object({
191
+ contactId: z.string().optional().describe("Unique identifier (UUID) of an existing contact"),
192
+ phone: z.string().optional().describe("Phone number in E.164 format (e.g., +2348012345678). Creates a new contact if no match exists."),
193
+ }),
194
+ ).describe("Array of contacts to add, each identified by contactId or phone number"),
195
+ }),
196
+ annotations: {
197
+ readOnlyHint: false,
198
+ destructiveHint: false,
199
+ idempotentHint: false,
200
+ openWorldHint: false,
201
+ },
202
+ },
203
+ async (params) => {
204
+ try {
205
+ const result = await api("POST", `/contact-lists/${params.idOrSlug}/members`, {
206
+ entries: params.entries,
207
+ });
208
+ return jsonResult(result);
209
+ } catch (error) {
210
+ return errorResult(error);
211
+ }
212
+ },
213
+ );
214
+
215
+ server.registerTool(
216
+ "neuron_remove_from_contact_list",
217
+ {
218
+ title: "Remove from Contact List",
219
+ description: "Remove one or more contacts from a list by their contact IDs. Does not delete the contacts themselves.",
220
+ inputSchema: z.object({
221
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the contact list"),
222
+ contactIds: z.array(z.string()).describe("Array of contact UUIDs to remove from the list"),
223
+ }),
224
+ annotations: {
225
+ readOnlyHint: false,
226
+ destructiveHint: true,
227
+ idempotentHint: true,
228
+ openWorldHint: false,
229
+ },
230
+ },
231
+ async (params) => {
232
+ try {
233
+ const result = await api("DELETE", `/contact-lists/${params.idOrSlug}/members`, {
234
+ contactIds: params.contactIds,
235
+ });
236
+ return jsonResult(result);
237
+ } catch (error) {
238
+ return errorResult(error);
239
+ }
240
+ },
241
+ );
242
+
243
+ server.registerTool(
244
+ "neuron_merge_contact_lists",
245
+ {
246
+ title: "Merge Contact Lists",
247
+ description: "Merge two or more contact lists into a single unified list, deduplicating entries. Window merge creates a virtual union; materialized merge creates a static copy.",
248
+ inputSchema: z.object({
249
+ name: z.string().describe("Display name for the resulting merged list"),
250
+ sourceListIds: z.array(z.string()).min(2).describe("UUIDs or slugs of the source lists to merge (minimum 2)"),
251
+ mergeType: z.enum(["window", "materialized"]).describe("Merge strategy: 'window' (virtual union, stays in sync) or 'materialized' (static copy at merge time)"),
252
+ slug: z.string().optional().describe("URL-friendly slug for the merged list (auto-generated if omitted)"),
253
+ }),
254
+ annotations: {
255
+ readOnlyHint: false,
256
+ destructiveHint: false,
257
+ idempotentHint: false,
258
+ openWorldHint: false,
259
+ },
260
+ },
261
+ async (params) => {
262
+ try {
263
+ const result = await api("POST", "/contact-lists/merge", params);
264
+ return jsonResult(result);
265
+ } catch (error) {
266
+ return errorResult(error);
267
+ }
268
+ },
269
+ );
270
+
271
+ server.registerTool(
272
+ "neuron_find_contact_lists_for_contact",
273
+ {
274
+ title: "Find Contact Lists for Contact",
275
+ description: "Retrieve all contact lists that a specific contact belongs to.",
276
+ inputSchema: z.object({
277
+ contactId: z.string().describe("Unique identifier (UUID) of the contact to look up"),
278
+ }),
279
+ annotations: {
280
+ readOnlyHint: true,
281
+ destructiveHint: false,
282
+ idempotentHint: true,
283
+ openWorldHint: false,
284
+ },
285
+ },
286
+ async (params) => {
287
+ try {
288
+ const result = await api("GET", `/contact-lists/by-contact/${params.contactId}`);
289
+ return jsonResult(result);
290
+ } catch (error) {
291
+ return errorResult(error);
292
+ }
293
+ },
294
+ );
295
+
296
+ server.registerTool(
297
+ "neuron_refresh_contact_list",
298
+ {
299
+ title: "Refresh Contact List",
300
+ description: "Trigger a refresh of a dynamic contact list. Re-evaluates criteria rules and/or AI prompt and materializes updated members.",
301
+ inputSchema: z.object({
302
+ idOrSlug: z.string().describe("Unique identifier (UUID) or URL-friendly slug of the dynamic list to refresh"),
303
+ }),
304
+ annotations: {
305
+ readOnlyHint: false,
306
+ destructiveHint: false,
307
+ idempotentHint: true,
308
+ openWorldHint: false,
309
+ },
310
+ },
311
+ async (params) => {
312
+ try {
313
+ const result = await api("POST", `/contact-lists/${params.idOrSlug}/refresh`);
314
+ return jsonResult(result);
315
+ } catch (error) {
316
+ return errorResult(error);
317
+ }
318
+ },
319
+ );
320
+ }