neuron-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.js +104 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +190 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ai.d.ts +2 -0
- package/dist/tools/ai.js +25 -0
- package/dist/tools/ai.js.map +1 -0
- package/dist/tools/audit.d.ts +2 -0
- package/dist/tools/audit.js +40 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/auth.d.ts +2 -0
- package/dist/tools/auth.js +348 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/billing.d.ts +2 -0
- package/dist/tools/billing.js +51 -0
- package/dist/tools/billing.js.map +1 -0
- package/dist/tools/blog.d.ts +2 -0
- package/dist/tools/blog.js +174 -0
- package/dist/tools/blog.js.map +1 -0
- package/dist/tools/bot-api-keys.d.ts +2 -0
- package/dist/tools/bot-api-keys.js +60 -0
- package/dist/tools/bot-api-keys.js.map +1 -0
- package/dist/tools/bot-api.d.ts +2 -0
- package/dist/tools/bot-api.js +120 -0
- package/dist/tools/bot-api.js.map +1 -0
- package/dist/tools/bots.d.ts +2 -0
- package/dist/tools/bots.js +228 -0
- package/dist/tools/bots.js.map +1 -0
- package/dist/tools/broadcasts.d.ts +2 -0
- package/dist/tools/broadcasts.js +156 -0
- package/dist/tools/broadcasts.js.map +1 -0
- package/dist/tools/builtin-tools.d.ts +5 -0
- package/dist/tools/builtin-tools.js +81 -0
- package/dist/tools/builtin-tools.js.map +1 -0
- package/dist/tools/campaigns.d.ts +2 -0
- package/dist/tools/campaigns.js +277 -0
- package/dist/tools/campaigns.js.map +1 -0
- package/dist/tools/channels.d.ts +2 -0
- package/dist/tools/channels.js +334 -0
- package/dist/tools/channels.js.map +1 -0
- package/dist/tools/contact-lists.d.ts +2 -0
- package/dist/tools/contact-lists.js +214 -0
- package/dist/tools/contact-lists.js.map +1 -0
- package/dist/tools/contacts.d.ts +2 -0
- package/dist/tools/contacts.js +265 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/conversations.d.ts +5 -0
- package/dist/tools/conversations.js +270 -0
- package/dist/tools/conversations.js.map +1 -0
- package/dist/tools/knowledge-bases.d.ts +6 -0
- package/dist/tools/knowledge-bases.js +398 -0
- package/dist/tools/knowledge-bases.js.map +1 -0
- package/dist/tools/list-pool.d.ts +2 -0
- package/dist/tools/list-pool.js +120 -0
- package/dist/tools/list-pool.js.map +1 -0
- package/dist/tools/media.d.ts +2 -0
- package/dist/tools/media.js +39 -0
- package/dist/tools/media.js.map +1 -0
- package/dist/tools/newsletters.d.ts +2 -0
- package/dist/tools/newsletters.js +154 -0
- package/dist/tools/newsletters.js.map +1 -0
- package/dist/tools/organizations.d.ts +2 -0
- package/dist/tools/organizations.js +205 -0
- package/dist/tools/organizations.js.map +1 -0
- package/dist/tools/outbound-webhooks.d.ts +5 -0
- package/dist/tools/outbound-webhooks.js +143 -0
- package/dist/tools/outbound-webhooks.js.map +1 -0
- package/dist/tools/payouts.d.ts +2 -0
- package/dist/tools/payouts.js +86 -0
- package/dist/tools/payouts.js.map +1 -0
- package/dist/tools/pool.d.ts +2 -0
- package/dist/tools/pool.js +202 -0
- package/dist/tools/pool.js.map +1 -0
- package/dist/tools/reflections.d.ts +5 -0
- package/dist/tools/reflections.js +90 -0
- package/dist/tools/reflections.js.map +1 -0
- package/dist/tools/tools.d.ts +5 -0
- package/dist/tools/tools.js +174 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/tools/wallets.d.ts +2 -0
- package/dist/tools/wallets.js +68 -0
- package/dist/tools/wallets.js.map +1 -0
- package/dist/tools/webhooks.d.ts +5 -0
- package/dist/tools/webhooks.js +124 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { api, jsonResult, errorResult } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register webhook tools (inbound webhooks that trigger bot actions)
|
|
5
|
+
*/
|
|
6
|
+
export function registerWebhooksTools(server) {
|
|
7
|
+
// 1. Create Webhook
|
|
8
|
+
server.registerTool("neuron_create_webhook", {
|
|
9
|
+
title: "Create Webhook",
|
|
10
|
+
description: "Create a new inbound webhook that triggers bot actions when called",
|
|
11
|
+
inputSchema: z.object({
|
|
12
|
+
botId: z.string().describe("The ID of the bot to create the webhook for"),
|
|
13
|
+
name: z.string().describe("Name of the webhook"),
|
|
14
|
+
slug: z.string().optional().describe("URL-friendly slug for the webhook endpoint"),
|
|
15
|
+
eventType: z.string().optional().describe("Type of event this webhook handles"),
|
|
16
|
+
processingPrompt: z.string().optional().describe("Prompt to guide bot processing of webhook data"),
|
|
17
|
+
isActive: z.boolean().optional().describe("Whether the webhook is active (default: true)"),
|
|
18
|
+
}),
|
|
19
|
+
annotations: {
|
|
20
|
+
openWorldHint: true,
|
|
21
|
+
},
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
const { botId, ...body } = args;
|
|
24
|
+
const response = await api("POST", `/webhooks/bot/${botId}`, body);
|
|
25
|
+
if (response.success) {
|
|
26
|
+
return jsonResult(response.data);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return errorResult(response.error || "Failed to create webhook");
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// 2. List Webhooks
|
|
33
|
+
server.registerTool("neuron_list_webhooks", {
|
|
34
|
+
title: "List Webhooks",
|
|
35
|
+
description: "List all inbound webhooks configured for a specific bot",
|
|
36
|
+
inputSchema: z.object({
|
|
37
|
+
botId: z.string().describe("The ID of the bot to list webhooks for"),
|
|
38
|
+
}),
|
|
39
|
+
annotations: {
|
|
40
|
+
openWorldHint: true,
|
|
41
|
+
},
|
|
42
|
+
}, async (args) => {
|
|
43
|
+
const response = await api("GET", `/webhooks/bot/${args.botId}`);
|
|
44
|
+
if (response.success) {
|
|
45
|
+
return jsonResult(response.data);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return errorResult(response.error || "Failed to list webhooks");
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// 3. Update Webhook
|
|
52
|
+
server.registerTool("neuron_update_webhook", {
|
|
53
|
+
title: "Update Webhook",
|
|
54
|
+
description: "Update an existing webhook configuration",
|
|
55
|
+
inputSchema: z.object({
|
|
56
|
+
id: z.string().describe("The ID of the webhook to update"),
|
|
57
|
+
name: z.string().optional().describe("Updated name of the webhook"),
|
|
58
|
+
eventType: z.string().optional().describe("Updated event type"),
|
|
59
|
+
processingPrompt: z.string().optional().describe("Updated processing prompt"),
|
|
60
|
+
isActive: z.boolean().optional().describe("Whether the webhook should be active"),
|
|
61
|
+
}),
|
|
62
|
+
annotations: {
|
|
63
|
+
openWorldHint: true,
|
|
64
|
+
},
|
|
65
|
+
}, async (args) => {
|
|
66
|
+
const { id, ...body } = args;
|
|
67
|
+
const response = await api("PUT", `/webhooks/${id}`, body);
|
|
68
|
+
if (response.success) {
|
|
69
|
+
return jsonResult(response.data);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return errorResult(response.error || "Failed to update webhook");
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// 4. Delete Webhook
|
|
76
|
+
server.registerTool("neuron_delete_webhook", {
|
|
77
|
+
title: "Delete Webhook",
|
|
78
|
+
description: "Delete an inbound webhook from a bot",
|
|
79
|
+
inputSchema: z.object({
|
|
80
|
+
id: z.string().describe("The ID of the webhook to delete"),
|
|
81
|
+
}),
|
|
82
|
+
annotations: {
|
|
83
|
+
openWorldHint: true,
|
|
84
|
+
},
|
|
85
|
+
}, async (args) => {
|
|
86
|
+
const response = await api("DELETE", `/webhooks/${args.id}`);
|
|
87
|
+
if (response.success) {
|
|
88
|
+
return jsonResult(response.data || { message: "Webhook deleted successfully" });
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return errorResult(response.error || "Failed to delete webhook");
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// 5. Get Webhook Logs
|
|
95
|
+
server.registerTool("neuron_get_webhook_logs", {
|
|
96
|
+
title: "Get Webhook Logs",
|
|
97
|
+
description: "Retrieve execution logs for a webhook to monitor activity and debug issues",
|
|
98
|
+
inputSchema: z.object({
|
|
99
|
+
id: z.string().describe("The ID of the webhook to get logs for"),
|
|
100
|
+
page: z.number().optional().describe("Page number for pagination (default: 1)"),
|
|
101
|
+
limit: z.number().optional().describe("Number of logs per page (default: 20)"),
|
|
102
|
+
}),
|
|
103
|
+
annotations: {
|
|
104
|
+
openWorldHint: true,
|
|
105
|
+
},
|
|
106
|
+
}, async (args) => {
|
|
107
|
+
const { id, page, limit } = args;
|
|
108
|
+
const params = {};
|
|
109
|
+
if (page !== undefined) {
|
|
110
|
+
params.page = String(page);
|
|
111
|
+
}
|
|
112
|
+
if (limit !== undefined) {
|
|
113
|
+
params.limit = String(limit);
|
|
114
|
+
}
|
|
115
|
+
const response = await api("GET", `/webhooks/${id}/logs`, undefined, params);
|
|
116
|
+
if (response.success) {
|
|
117
|
+
return jsonResult(response.data);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return errorResult(response.error || "Failed to get webhook logs");
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "neuron-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Neuron — the WhatsApp automation platform. 120+ tools for AI chatbots, broadcasts, campaigns, contacts, knowledge bases, newsletters, and more.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"neuron-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"dev": "tsx watch src/index.ts",
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"mcp",
|
|
21
|
+
"model-context-protocol",
|
|
22
|
+
"whatsapp",
|
|
23
|
+
"whatsapp-api",
|
|
24
|
+
"whatsapp-automation",
|
|
25
|
+
"chatbot",
|
|
26
|
+
"ai",
|
|
27
|
+
"claude",
|
|
28
|
+
"cursor",
|
|
29
|
+
"neuron",
|
|
30
|
+
"messaging",
|
|
31
|
+
"broadcast",
|
|
32
|
+
"campaign",
|
|
33
|
+
"knowledge-base",
|
|
34
|
+
"newsletter",
|
|
35
|
+
"contacts"
|
|
36
|
+
],
|
|
37
|
+
"author": "Neuron <hello@neuron.ng>",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"homepage": "https://neuron.ng",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/conquext/neuron-mcp-server.git"
|
|
43
|
+
},
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/conquext/neuron-mcp-server/issues"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
49
|
+
"axios": "^1.7.9",
|
|
50
|
+
"dotenv": "^17.3.1",
|
|
51
|
+
"express": "^5.2.1",
|
|
52
|
+
"form-data": "^4.0.5",
|
|
53
|
+
"zod": "^3.23.8"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/express": "^5.0.6",
|
|
57
|
+
"@types/node": "^22.10.0",
|
|
58
|
+
"tsx": "^4.19.2",
|
|
59
|
+
"typescript": "^5.7.2"
|
|
60
|
+
}
|
|
61
|
+
}
|