neuron-mcp-server 1.0.1 → 1.1.1

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 (98) hide show
  1. package/README.md +28 -16
  2. package/dist/client.d.ts +6 -0
  3. package/dist/client.js +50 -12
  4. package/dist/client.js.map +1 -1
  5. package/dist/index.js +51 -7
  6. package/dist/index.js.map +1 -1
  7. package/dist/tools/ai.js +9 -3
  8. package/dist/tools/ai.js.map +1 -1
  9. package/dist/tools/approvals.d.ts +2 -0
  10. package/dist/tools/approvals.js +181 -0
  11. package/dist/tools/approvals.js.map +1 -0
  12. package/dist/tools/audit.js +7 -4
  13. package/dist/tools/audit.js.map +1 -1
  14. package/dist/tools/auth.js +119 -19
  15. package/dist/tools/auth.js.map +1 -1
  16. package/dist/tools/billing.js +22 -6
  17. package/dist/tools/billing.js.map +1 -1
  18. package/dist/tools/blog.js +98 -34
  19. package/dist/tools/blog.js.map +1 -1
  20. package/dist/tools/bot-api-keys.js +27 -12
  21. package/dist/tools/bot-api-keys.js.map +1 -1
  22. package/dist/tools/bot-api.js +53 -27
  23. package/dist/tools/bot-api.js.map +1 -1
  24. package/dist/tools/bots.js +116 -68
  25. package/dist/tools/bots.js.map +1 -1
  26. package/dist/tools/broadcasts.js +78 -38
  27. package/dist/tools/broadcasts.js.map +1 -1
  28. package/dist/tools/builtin-tools.js +19 -12
  29. package/dist/tools/builtin-tools.js.map +1 -1
  30. package/dist/tools/campaigns.js +149 -61
  31. package/dist/tools/campaigns.js.map +1 -1
  32. package/dist/tools/channels.js +163 -53
  33. package/dist/tools/channels.js.map +1 -1
  34. package/dist/tools/contact-lists.js +111 -51
  35. package/dist/tools/contact-lists.js.map +1 -1
  36. package/dist/tools/contacts.js +117 -44
  37. package/dist/tools/contacts.js.map +1 -1
  38. package/dist/tools/conversations.js +95 -50
  39. package/dist/tools/conversations.js.map +1 -1
  40. package/dist/tools/flows.d.ts +2 -0
  41. package/dist/tools/flows.js +242 -0
  42. package/dist/tools/flows.js.map +1 -0
  43. package/dist/tools/group-management.d.ts +2 -0
  44. package/dist/tools/group-management.js +239 -0
  45. package/dist/tools/group-management.js.map +1 -0
  46. package/dist/tools/leads.d.ts +2 -0
  47. package/dist/tools/leads.js +100 -0
  48. package/dist/tools/leads.js.map +1 -0
  49. package/dist/tools/list-campaigns.d.ts +2 -0
  50. package/dist/tools/list-campaigns.js +152 -0
  51. package/dist/tools/list-campaigns.js.map +1 -0
  52. package/dist/tools/list-pool.js +250 -33
  53. package/dist/tools/list-pool.js.map +1 -1
  54. package/dist/tools/media.js +12 -7
  55. package/dist/tools/media.js.map +1 -1
  56. package/dist/tools/newsletters.js +106 -26
  57. package/dist/tools/newsletters.js.map +1 -1
  58. package/dist/tools/organizations.js +76 -35
  59. package/dist/tools/organizations.js.map +1 -1
  60. package/dist/tools/outbound-webhooks.js +32 -20
  61. package/dist/tools/outbound-webhooks.js.map +1 -1
  62. package/dist/tools/payouts.js +44 -17
  63. package/dist/tools/payouts.js.map +1 -1
  64. package/dist/tools/personas.d.ts +2 -0
  65. package/dist/tools/personas.js +141 -0
  66. package/dist/tools/personas.js.map +1 -0
  67. package/dist/tools/polls.d.ts +2 -0
  68. package/dist/tools/polls.js +30 -0
  69. package/dist/tools/polls.js.map +1 -0
  70. package/dist/tools/pool.js +101 -43
  71. package/dist/tools/pool.js.map +1 -1
  72. package/dist/tools/products.d.ts +2 -0
  73. package/dist/tools/products.js +277 -0
  74. package/dist/tools/products.js.map +1 -0
  75. package/dist/tools/profile-privacy.d.ts +2 -0
  76. package/dist/tools/profile-privacy.js +195 -0
  77. package/dist/tools/profile-privacy.js.map +1 -0
  78. package/dist/tools/reflections.js +25 -13
  79. package/dist/tools/reflections.js.map +1 -1
  80. package/dist/tools/scheduled-messages.d.ts +2 -0
  81. package/dist/tools/scheduled-messages.js +124 -0
  82. package/dist/tools/scheduled-messages.js.map +1 -0
  83. package/dist/tools/social-channels.d.ts +2 -0
  84. package/dist/tools/social-channels.js +318 -0
  85. package/dist/tools/social-channels.js.map +1 -0
  86. package/dist/tools/tasks.d.ts +2 -0
  87. package/dist/tools/tasks.js +155 -0
  88. package/dist/tools/tasks.js.map +1 -0
  89. package/dist/tools/tools.js +86 -40
  90. package/dist/tools/tools.js.map +1 -1
  91. package/dist/tools/wallets.js +34 -12
  92. package/dist/tools/wallets.js.map +1 -1
  93. package/dist/tools/webhooks.js +35 -20
  94. package/dist/tools/webhooks.js.map +1 -1
  95. package/dist/tools/whatsapp-actions.d.ts +2 -0
  96. package/dist/tools/whatsapp-actions.js +186 -0
  97. package/dist/tools/whatsapp-actions.js.map +1 -0
  98. package/package.json +7 -2
@@ -0,0 +1,239 @@
1
+ import { z } from "zod";
2
+ import { api, jsonResult, errorResult } from "../client.js";
3
+ /** Shared "where do the members come from" schema for create / add / remove. */
4
+ const memberSources = {
5
+ fromGroupIds: z.array(z.string()).optional().describe("Copy/combine members live from these WhatsApp group JIDs"),
6
+ listIds: z.array(z.string()).optional().describe("Contact list ids or slugs — pulls every member"),
7
+ contactIds: z.array(z.string()).optional().describe("Existing contact ids"),
8
+ phones: z.array(z.string()).optional().describe("Raw phone numbers, e.g. pasted from a CSV"),
9
+ allContacts: z.boolean().optional().describe("Union the org's entire address book"),
10
+ tags: z.array(z.string()).optional().describe("Keep only contacts carrying one of these tags"),
11
+ excludeListIds: z.array(z.string()).optional().describe("Subtract every member of these lists"),
12
+ };
13
+ export function registerGroupManagementTools(server) {
14
+ // 0. Create Group
15
+ server.registerTool("neuron_create_group", {
16
+ title: "Create WhatsApp Group",
17
+ description: "Create a new WhatsApp group and seed its members from any combination of sources: other groups (combine/copy), contact lists, individual contacts, pasted phone numbers, or the whole address book. Optionally pass a unique `slug` to address the group later without its JID. Members blocked by privacy come back in the failed list. Uses the org's default connected session unless `channelId` is given.",
18
+ inputSchema: z.object({
19
+ subject: z.string().min(1).max(100).describe("Group name"),
20
+ channelId: z.string().optional().describe("Session (connected WhatsApp number) UUID. Omit to use the default."),
21
+ slug: z.string().optional().describe("Optional org-unique handle (lowercase letters, numbers, hyphens)"),
22
+ description: z.string().optional().describe("Optional group description"),
23
+ ifExists: z.enum(["return", "error"]).optional().describe("When the slug is already taken: 'error' (default) fails, 'return' returns the existing group and adds any given members to it (idempotent create)."),
24
+ ...memberSources,
25
+ }),
26
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
27
+ }, async ({ subject, channelId, slug, description, ifExists, ...sources }) => {
28
+ try {
29
+ const res = await api("POST", `/groups`, { subject, channelId, slug, description, ifExists, sources });
30
+ return jsonResult(res);
31
+ }
32
+ catch (error) {
33
+ return errorResult(error);
34
+ }
35
+ });
36
+ // 0b. Add Group Members (from sources)
37
+ server.registerTool("neuron_add_group_members", {
38
+ title: "Add Members to Group",
39
+ description: "Add members to an existing group, resolved from any combination of sources (other groups, contact lists, contacts, pasted phones, all contacts). Address the group by its id, slug, or JID.",
40
+ inputSchema: z.object({
41
+ group: z.string().describe("Group id, slug, or JID (ending in @g.us)"),
42
+ ...memberSources,
43
+ }),
44
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
45
+ }, async ({ group, ...sources }) => {
46
+ try {
47
+ const res = await api("POST", `/groups/${encodeURIComponent(group)}/members`, { sources });
48
+ return jsonResult(res);
49
+ }
50
+ catch (error) {
51
+ return errorResult(error);
52
+ }
53
+ });
54
+ // 0c. Remove Group Members (from sources)
55
+ server.registerTool("neuron_remove_group_members", {
56
+ title: "Remove Members from Group",
57
+ description: "Remove members from a group, resolved from any combination of sources — e.g. remove everyone on a contact list. Address the group by its id, slug, or JID.",
58
+ inputSchema: z.object({
59
+ group: z.string().describe("Group id, slug, or JID (ending in @g.us)"),
60
+ ...memberSources,
61
+ }),
62
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
63
+ }, async ({ group, ...sources }) => {
64
+ try {
65
+ const res = await api("DELETE", `/groups/${encodeURIComponent(group)}/members`, { sources });
66
+ return jsonResult(res);
67
+ }
68
+ catch (error) {
69
+ return errorResult(error);
70
+ }
71
+ });
72
+ // 1. Update Group Subject
73
+ server.registerTool("neuron_update_group_subject", {
74
+ title: "Update Group Subject",
75
+ description: "Update the name/subject of a WhatsApp group. Requires the bot to be a group admin.",
76
+ inputSchema: z.object({
77
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
78
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
79
+ subject: z.string().min(1).describe("New group name/subject"),
80
+ }),
81
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
82
+ }, async (args) => {
83
+ try {
84
+ const res = await api("PUT", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/subject`, {
85
+ subject: args.subject,
86
+ });
87
+ return jsonResult(res);
88
+ }
89
+ catch (error) {
90
+ return errorResult(error);
91
+ }
92
+ });
93
+ // 2. Update Group Description
94
+ server.registerTool("neuron_update_group_description", {
95
+ title: "Update Group Description",
96
+ description: "Update the description of a WhatsApp group. Requires the bot to be a group admin.",
97
+ inputSchema: z.object({
98
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
99
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
100
+ description: z.string().describe("New group description (can be empty string to clear)"),
101
+ }),
102
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
103
+ }, async (args) => {
104
+ try {
105
+ const res = await api("PUT", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/description`, {
106
+ description: args.description,
107
+ });
108
+ return jsonResult(res);
109
+ }
110
+ catch (error) {
111
+ return errorResult(error);
112
+ }
113
+ });
114
+ // 3. Update Group Settings
115
+ server.registerTool("neuron_update_group_settings", {
116
+ title: "Update Group Settings",
117
+ description: "Change WhatsApp group settings: 'announcement' (only admins send), 'not_announcement' (everyone sends), 'locked' (only admins edit info), 'unlocked' (everyone edits info). Requires admin.",
118
+ inputSchema: z.object({
119
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
120
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
121
+ setting: z.enum(["announcement", "not_announcement", "locked", "unlocked"]).describe("Group setting to apply"),
122
+ }),
123
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
124
+ }, async (args) => {
125
+ try {
126
+ const res = await api("PUT", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/settings`, {
127
+ setting: args.setting,
128
+ });
129
+ return jsonResult(res);
130
+ }
131
+ catch (error) {
132
+ return errorResult(error);
133
+ }
134
+ });
135
+ // 4. Update Group Members
136
+ server.registerTool("neuron_update_group_members", {
137
+ title: "Update Group Members",
138
+ description: "Add, remove, promote, or demote members in a WhatsApp group. Provide phone numbers or JIDs. Requires admin privileges.",
139
+ inputSchema: z.object({
140
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
141
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
142
+ participants: z.array(z.string()).min(1).describe("Array of phone numbers or JIDs (e.g. ['2348012345678'] or ['2348012345678@s.whatsapp.net'])"),
143
+ action: z.enum(["add", "remove", "promote", "demote"]).describe("Action to perform on the participants"),
144
+ }),
145
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
146
+ }, async (args) => {
147
+ try {
148
+ const res = await api("POST", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/members`, {
149
+ participants: args.participants,
150
+ action: args.action,
151
+ });
152
+ return jsonResult(res);
153
+ }
154
+ catch (error) {
155
+ return errorResult(error);
156
+ }
157
+ });
158
+ // 5. Set Group Join Approval
159
+ server.registerTool("neuron_set_group_join_approval", {
160
+ title: "Set Group Join Approval",
161
+ description: "Enable or disable join approval mode for a WhatsApp group. When enabled, join requests must be manually approved by admins. Requires admin.",
162
+ inputSchema: z.object({
163
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
164
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
165
+ enabled: z.boolean().describe("true to require admin approval for joins, false to allow direct joins"),
166
+ }),
167
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
168
+ }, async (args) => {
169
+ try {
170
+ const res = await api("PUT", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/join-approval`, {
171
+ enabled: args.enabled,
172
+ });
173
+ return jsonResult(res);
174
+ }
175
+ catch (error) {
176
+ return errorResult(error);
177
+ }
178
+ });
179
+ // 6. Handle Join Requests
180
+ server.registerTool("neuron_handle_join_requests", {
181
+ title: "Handle Join Requests",
182
+ description: "Approve or reject pending join requests for a WhatsApp group. Requires admin privileges.",
183
+ inputSchema: z.object({
184
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
185
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
186
+ participants: z.array(z.string()).min(1).describe("Array of phone numbers or JIDs of requesters"),
187
+ action: z.enum(["approve", "reject"]).describe("Whether to approve or reject the join requests"),
188
+ }),
189
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
190
+ }, async (args) => {
191
+ try {
192
+ const res = await api("POST", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/join-requests`, {
193
+ participants: args.participants,
194
+ action: args.action,
195
+ });
196
+ return jsonResult(res);
197
+ }
198
+ catch (error) {
199
+ return errorResult(error);
200
+ }
201
+ });
202
+ // 7. Revoke Group Invite
203
+ server.registerTool("neuron_revoke_group_invite", {
204
+ title: "Revoke Group Invite",
205
+ description: "Revoke the current group invite link and generate a new one. The old link will stop working. Requires admin.",
206
+ inputSchema: z.object({
207
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
208
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
209
+ }),
210
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
211
+ }, async (args) => {
212
+ try {
213
+ const res = await api("POST", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/revoke-invite`);
214
+ return jsonResult(res);
215
+ }
216
+ catch (error) {
217
+ return errorResult(error);
218
+ }
219
+ });
220
+ // 8. Leave Group
221
+ server.registerTool("neuron_leave_group", {
222
+ title: "Leave Group",
223
+ description: "Make the bot leave a WhatsApp group. This action is irreversible — the bot will need to be re-added by an admin.",
224
+ inputSchema: z.object({
225
+ channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
226
+ groupJid: z.string().describe("Group JID (ending in @g.us)"),
227
+ }),
228
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
229
+ }, async (args) => {
230
+ try {
231
+ const res = await api("POST", `/whatsapp-actions/${args.channelId}/groups/${args.groupJid}/leave`);
232
+ return jsonResult(res);
233
+ }
234
+ catch (error) {
235
+ return errorResult(error);
236
+ }
237
+ });
238
+ }
239
+ //# sourceMappingURL=group-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-management.js","sourceRoot":"","sources":["../../src/tools/group-management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerLeadTools(server: McpServer): void;
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+ import { api, jsonResult, errorResult } from "../client.js";
3
+ const READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
4
+ const WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false };
5
+ const sourceType = z
6
+ .enum(["csv", "text_paste", "document", "web_scrape", "tool_output", "instagram", "x", "facebook", "tiktok", "stream"])
7
+ .describe("Lead source type. facebook = Meta Ads Library advertisers; web/IG/X/FB scraping needs DeepAPI configured; TikTok has no native provider (use tool_output).");
8
+ export function registerLeadTools(server) {
9
+ server.registerTool("neuron_list_lead_sources", { title: "List Lead Sources", description: "List configured lead sources for the org.", inputSchema: z.object({}), annotations: READ }, async () => {
10
+ try {
11
+ return jsonResult(await api("GET", "/lead-sources"));
12
+ }
13
+ catch (e) {
14
+ return errorResult(e);
15
+ }
16
+ });
17
+ server.registerTool("neuron_create_lead_source", {
18
+ title: "Create Lead Source",
19
+ description: "Create a lead source. `config` depends on type: text_paste {text}; web_scrape {url|urls[]}; document {mediaUrl,mimeType}; tool_output {toolId,args?}; instagram/x {channelId, query?|hashtag?, limit?}; csv {rows[]}; stream {triggerTaskId?} (fed by the ingest endpoint). Set scheduleKind cron/interval/once for recurring (schedule: cron {time,days?} / interval {everyMinutes} / once {runAt}).",
20
+ inputSchema: z.object({
21
+ name: z.string(),
22
+ type: sourceType,
23
+ config: z.record(z.unknown()).optional(),
24
+ scheduleKind: z.enum(["cron", "interval", "once", "manual"]).optional(),
25
+ schedule: z.record(z.unknown()).optional(),
26
+ timezone: z.string().optional(),
27
+ enabled: z.boolean().optional(),
28
+ }),
29
+ annotations: WRITE,
30
+ }, async (body) => {
31
+ try {
32
+ return jsonResult(await api("POST", "/lead-sources", body));
33
+ }
34
+ catch (e) {
35
+ return errorResult(e);
36
+ }
37
+ });
38
+ server.registerTool("neuron_run_lead_source", { title: "Run Lead Source", description: "Run a lead source now to pull new leads into the pool (queues the extraction).", inputSchema: z.object({ id: z.string().describe("Lead source UUID") }), annotations: WRITE }, async ({ id }) => {
39
+ try {
40
+ return jsonResult(await api("POST", `/lead-sources/${id}/run`));
41
+ }
42
+ catch (e) {
43
+ return errorResult(e);
44
+ }
45
+ });
46
+ server.registerTool("neuron_extract_leads", {
47
+ title: "Extract Leads (ad-hoc)",
48
+ description: "Run a one-off extraction WITHOUT creating a persistent source, saving the results to the lead pool. Great for pasted text or a web page. `type` + `config` as in neuron_create_lead_source (e.g. type='text_paste', config={text}).",
49
+ inputSchema: z.object({ type: sourceType, config: z.record(z.unknown()) }),
50
+ annotations: WRITE,
51
+ }, async (body) => {
52
+ try {
53
+ return jsonResult(await api("POST", "/leads/extract", body));
54
+ }
55
+ catch (e) {
56
+ return errorResult(e);
57
+ }
58
+ });
59
+ server.registerTool("neuron_list_leads", {
60
+ title: "List Leads",
61
+ description: "List leads from the pool, filterable by status (new/enriched/contacted/converted/rejected), sourceId, and search.",
62
+ inputSchema: z.object({
63
+ status: z.string().optional(),
64
+ sourceId: z.string().optional(),
65
+ search: z.string().optional(),
66
+ page: z.number().int().positive().optional(),
67
+ limit: z.number().int().positive().optional(),
68
+ }),
69
+ annotations: READ,
70
+ }, async (params) => {
71
+ try {
72
+ return jsonResult(await api("GET", "/leads", undefined, params));
73
+ }
74
+ catch (e) {
75
+ return errorResult(e);
76
+ }
77
+ });
78
+ server.registerTool("neuron_lead_stats", { title: "Lead Pool Stats", description: "Counts of leads by status.", inputSchema: z.object({}), annotations: READ }, async () => {
79
+ try {
80
+ return jsonResult(await api("GET", "/leads/stats"));
81
+ }
82
+ catch (e) {
83
+ return errorResult(e);
84
+ }
85
+ });
86
+ server.registerTool("neuron_convert_lead", {
87
+ title: "Convert Lead to Contact",
88
+ description: "Promote a phone-bearing lead into a contact (so it can be messaged / added to lists). Optionally add the new contact to a list.",
89
+ inputSchema: z.object({ id: z.string().describe("Lead UUID"), addToList: z.string().optional().describe("Contact list name to add the converted contact to.") }),
90
+ annotations: WRITE,
91
+ }, async ({ id, addToList }) => {
92
+ try {
93
+ return jsonResult(await api("POST", `/leads/${id}/convert`, { addToList }));
94
+ }
95
+ catch (e) {
96
+ return errorResult(e);
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=leads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leads.js","sourceRoot":"","sources":["../../src/tools/leads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerListCampaignTools(server: McpServer): void;
@@ -0,0 +1,152 @@
1
+ import { z } from "zod";
2
+ import { api, jsonResult, errorResult } from "../client.js";
3
+ const messageSource = z.discriminatedUnion("kind", [
4
+ z.object({ kind: z.literal("static"), text: z.string().min(1).describe("The message body sent to each contact in the batch") }),
5
+ z.object({ kind: z.literal("rotation"), messages: z.array(z.string().min(1)).min(1).describe("Pool of messages"), mode: z.enum(["sequential", "random"]).optional().describe("Rotate in order (default) or pick randomly per run") }),
6
+ z.object({ kind: z.literal("content"), ref: z.string().min(1).describe("A Neuron Note ID; its content becomes the message, fetched live at each run") }),
7
+ z.object({ kind: z.literal("ai"), prompt: z.string().min(1).describe("Instruction for the message the AI should write"), botId: z.string().uuid().optional().describe("Bot whose system prompt supplies business context"), personaId: z.string().uuid().optional().describe("Persona whose voice the message is written in"), perContact: z.boolean().optional().describe("Generate a distinct message per recipient (slower, more tokens). Default false = one message for the whole batch") }).describe("AI-written message generated live at each run (BYOK-aware)"),
8
+ z.object({ kind: z.literal("webhook"), url: z.string().url().describe("POSTed { campaignId, listId, contact? }; returns { message } or a bare string"), perContact: z.boolean().optional().describe("Call once per recipient with the contact in the payload. Default false = one call per batch") }).describe("Message fetched from your webhook at each run"),
9
+ ]).describe("How the message is resolved live at each batch run: 'static' (fixed), 'rotation' (cycle through several), 'ai' (AI-written), 'webhook' (from your service), or 'content' (a saved Neuron Note).");
10
+ const schedule = z.intersection(z.discriminatedUnion("kind", [
11
+ z.object({ kind: z.literal("interval"), everyMs: z.number().int().min(60_000).describe("Milliseconds between runs, e.g. 86400000 for daily") }),
12
+ z.object({ kind: z.literal("daily"), hour: z.number().int().min(0).max(23).describe("UTC hour"), minute: z.number().int().min(0).max(59).optional() }),
13
+ z.object({ kind: z.literal("weekly"), days: z.array(z.number().int().min(0).max(6)).min(1).describe("Days of week, 0=Sun … 6=Sat"), hour: z.number().int().min(0).max(23).describe("UTC hour"), minute: z.number().int().min(0).max(59).optional() }),
14
+ z.object({ kind: z.literal("monthly"), dayOfMonth: z.number().int().min(1).max(31), hour: z.number().int().min(0).max(23).describe("UTC hour"), minute: z.number().int().min(0).max(59).optional() }),
15
+ ]), z.object({
16
+ timezone: z.string().optional().describe("IANA timezone the daily/weekly/monthly time is interpreted in, e.g. 'Africa/Lagos'. Defaults to UTC. Ignored for 'interval'. The schedule holds its local wall-clock time across DST."),
17
+ endAt: z.string().optional().describe("ISO date; the campaign completes after this"),
18
+ maxRuns: z.number().int().min(1).optional().describe("Stop after this many runs"),
19
+ })).describe("When each batch fires. e.g. daily at 9am in Africa/Lagos, or every weekend.");
20
+ export function registerListCampaignTools(server) {
21
+ server.registerTool("neuron_create_list_campaign", {
22
+ title: "Create List Campaign",
23
+ description: "Create a paced campaign that messages the next N un-reached members of a contact list on a schedule. The cursor follows the LIVE list — as members are added or removed, only current members get reached, and nobody is messaged twice per cycle. Multiple campaigns can run on the same or different lists concurrently. On exhaust, either stop or loop (start over after a cooldown).",
24
+ inputSchema: z.object({
25
+ listId: z.string().uuid().describe("The contact list to run the campaign over"),
26
+ name: z.string().max(255).optional().describe("Campaign name (default: 'Campaign')"),
27
+ sendMode: z.enum(["message", "bot"]).optional().describe("'message' sends a plain broadcast; 'bot' initiates the conversation through a bot (default: 'message')"),
28
+ botId: z.string().uuid().nullable().optional().describe("Bot to send through when sendMode='bot'; its channel is used"),
29
+ channelId: z.string().uuid().nullable().optional().describe("WhatsApp channel to send from; falls back to the org default / first connected channel"),
30
+ messageSource: messageSource,
31
+ batchSize: z.number().int().min(1).max(1000).optional().describe("How many contacts to message per run (default: 20)"),
32
+ schedule: schedule,
33
+ onExhaust: z.enum(["stop", "loop"]).optional().describe("When the whole list has been reached: 'stop' (default) completes the campaign; 'loop' starts a new cycle after loopCooldownMs"),
34
+ loopCooldownMs: z.number().int().min(0).nullable().optional().describe("Milliseconds to wait before looping (default: 24h)"),
35
+ startImmediately: z.boolean().optional().describe("Fire the first batch right away (default: true). Set false to wait for the first scheduled slot"),
36
+ }),
37
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
38
+ }, async (params) => {
39
+ try {
40
+ return jsonResult(await api("POST", "/list-campaigns", params));
41
+ }
42
+ catch (error) {
43
+ return errorResult(error);
44
+ }
45
+ });
46
+ server.registerTool("neuron_list_list_campaigns", {
47
+ title: "List List Campaigns",
48
+ description: "List all paced list campaigns for the organization, optionally filtered to a single contact list.",
49
+ inputSchema: z.object({
50
+ listId: z.string().uuid().optional().describe("Filter to campaigns on this contact list"),
51
+ }),
52
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
53
+ }, async (params) => {
54
+ try {
55
+ return jsonResult(await api("GET", "/list-campaigns", undefined, { listId: params.listId }));
56
+ }
57
+ catch (error) {
58
+ return errorResult(error);
59
+ }
60
+ });
61
+ server.registerTool("neuron_get_list_campaign", {
62
+ title: "Get List Campaign",
63
+ description: "Get a paced list campaign with live progress: how many members have been reached this cycle, the current list size, and how many remain.",
64
+ inputSchema: z.object({ id: z.string().uuid().describe("Campaign ID") }),
65
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
66
+ }, async (params) => {
67
+ try {
68
+ return jsonResult(await api("GET", `/list-campaigns/${params.id}`));
69
+ }
70
+ catch (error) {
71
+ return errorResult(error);
72
+ }
73
+ });
74
+ server.registerTool("neuron_update_list_campaign", {
75
+ title: "Update List Campaign",
76
+ description: "Update a paced list campaign's name, message source, batch size, schedule, exhaust behavior, or send settings. Changing the schedule reschedules the next run.",
77
+ inputSchema: z.object({
78
+ id: z.string().uuid().describe("Campaign ID"),
79
+ name: z.string().max(255).optional(),
80
+ sendMode: z.enum(["message", "bot"]).optional(),
81
+ botId: z.string().uuid().nullable().optional(),
82
+ channelId: z.string().uuid().nullable().optional(),
83
+ messageSource: messageSource.optional(),
84
+ batchSize: z.number().int().min(1).max(1000).optional(),
85
+ schedule: schedule.optional(),
86
+ onExhaust: z.enum(["stop", "loop"]).optional(),
87
+ loopCooldownMs: z.number().int().min(0).nullable().optional(),
88
+ }),
89
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
90
+ }, async (params) => {
91
+ try {
92
+ const { id, ...body } = params;
93
+ return jsonResult(await api("PUT", `/list-campaigns/${id}`, body));
94
+ }
95
+ catch (error) {
96
+ return errorResult(error);
97
+ }
98
+ });
99
+ server.registerTool("neuron_pause_list_campaign", {
100
+ title: "Pause List Campaign",
101
+ description: "Pause a paced list campaign. No further batches run until resumed. The cursor is preserved.",
102
+ inputSchema: z.object({ id: z.string().uuid().describe("Campaign ID") }),
103
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
104
+ }, async (params) => {
105
+ try {
106
+ return jsonResult(await api("POST", `/list-campaigns/${params.id}/pause`));
107
+ }
108
+ catch (error) {
109
+ return errorResult(error);
110
+ }
111
+ });
112
+ server.registerTool("neuron_resume_list_campaign", {
113
+ title: "Resume List Campaign",
114
+ description: "Resume a paused paced list campaign. It picks up from where the cursor left off.",
115
+ inputSchema: z.object({ id: z.string().uuid().describe("Campaign ID") }),
116
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
117
+ }, async (params) => {
118
+ try {
119
+ return jsonResult(await api("POST", `/list-campaigns/${params.id}/resume`));
120
+ }
121
+ catch (error) {
122
+ return errorResult(error);
123
+ }
124
+ });
125
+ server.registerTool("neuron_run_list_campaign_now", {
126
+ title: "Run List Campaign Now",
127
+ description: "Fire the next batch of a paced list campaign immediately (on the next worker tick, ~30s), regardless of its schedule. The schedule continues normally afterward.",
128
+ inputSchema: z.object({ id: z.string().uuid().describe("Campaign ID") }),
129
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
130
+ }, async (params) => {
131
+ try {
132
+ return jsonResult(await api("POST", `/list-campaigns/${params.id}/run-now`));
133
+ }
134
+ catch (error) {
135
+ return errorResult(error);
136
+ }
137
+ });
138
+ server.registerTool("neuron_delete_list_campaign", {
139
+ title: "Delete List Campaign",
140
+ description: "Permanently delete a paced list campaign and its reached-set. Does not delete the contacts or the list.",
141
+ inputSchema: z.object({ id: z.string().uuid().describe("Campaign ID") }),
142
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
143
+ }, async (params) => {
144
+ try {
145
+ return jsonResult(await api("DELETE", `/list-campaigns/${params.id}`));
146
+ }
147
+ catch (error) {
148
+ return errorResult(error);
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=list-campaigns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-campaigns.js","sourceRoot":"","sources":["../../src/tools/list-campaigns.ts"],"names":[],"mappings":"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"}