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.
- package/.env +13 -0
- package/AI_PERSONALITY_DESIGN_RESEARCH.md +1020 -0
- package/Dockerfile +18 -0
- package/README.md +146 -131
- package/dist/client.d.ts +6 -0
- package/dist/client.js +50 -12
- package/dist/client.js.map +1 -1
- package/dist/index.js +51 -7
- package/dist/index.js.map +1 -1
- package/dist/tools/ai.js +9 -3
- package/dist/tools/ai.js.map +1 -1
- package/dist/tools/approvals.d.ts +2 -0
- package/dist/tools/approvals.js +181 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/audit.js +7 -4
- package/dist/tools/audit.js.map +1 -1
- package/dist/tools/auth.js +119 -19
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/billing.js +22 -6
- package/dist/tools/billing.js.map +1 -1
- package/dist/tools/blog.js +98 -34
- package/dist/tools/blog.js.map +1 -1
- package/dist/tools/bot-api-keys.js +27 -12
- package/dist/tools/bot-api-keys.js.map +1 -1
- package/dist/tools/bot-api.js +53 -27
- package/dist/tools/bot-api.js.map +1 -1
- package/dist/tools/bots.js +116 -68
- package/dist/tools/bots.js.map +1 -1
- package/dist/tools/broadcasts.js +78 -38
- package/dist/tools/broadcasts.js.map +1 -1
- package/dist/tools/builtin-tools.js +19 -12
- package/dist/tools/builtin-tools.js.map +1 -1
- package/dist/tools/campaigns.js +149 -61
- package/dist/tools/campaigns.js.map +1 -1
- package/dist/tools/channels.js +163 -53
- package/dist/tools/channels.js.map +1 -1
- package/dist/tools/contact-lists.js +111 -51
- package/dist/tools/contact-lists.js.map +1 -1
- package/dist/tools/contacts.js +117 -44
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/conversations.js +95 -50
- package/dist/tools/conversations.js.map +1 -1
- package/dist/tools/flows.d.ts +2 -0
- package/dist/tools/flows.js +242 -0
- package/dist/tools/flows.js.map +1 -0
- package/dist/tools/group-management.d.ts +2 -0
- package/dist/tools/group-management.js +239 -0
- package/dist/tools/group-management.js.map +1 -0
- package/dist/tools/leads.d.ts +2 -0
- package/dist/tools/leads.js +100 -0
- package/dist/tools/leads.js.map +1 -0
- package/dist/tools/list-campaigns.d.ts +2 -0
- package/dist/tools/list-campaigns.js +152 -0
- package/dist/tools/list-campaigns.js.map +1 -0
- package/dist/tools/list-pool.js +250 -33
- package/dist/tools/list-pool.js.map +1 -1
- package/dist/tools/media.js +12 -7
- package/dist/tools/media.js.map +1 -1
- package/dist/tools/newsletters.js +106 -26
- package/dist/tools/newsletters.js.map +1 -1
- package/dist/tools/organizations.js +76 -35
- package/dist/tools/organizations.js.map +1 -1
- package/dist/tools/outbound-webhooks.js +32 -20
- package/dist/tools/outbound-webhooks.js.map +1 -1
- package/dist/tools/payouts.js +44 -17
- package/dist/tools/payouts.js.map +1 -1
- package/dist/tools/personas.d.ts +2 -0
- package/dist/tools/personas.js +141 -0
- package/dist/tools/personas.js.map +1 -0
- package/dist/tools/polls.d.ts +2 -0
- package/dist/tools/polls.js +30 -0
- package/dist/tools/polls.js.map +1 -0
- package/dist/tools/pool.js +101 -43
- package/dist/tools/pool.js.map +1 -1
- package/dist/tools/products.d.ts +2 -0
- package/dist/tools/products.js +277 -0
- package/dist/tools/products.js.map +1 -0
- package/dist/tools/profile-privacy.d.ts +2 -0
- package/dist/tools/profile-privacy.js +195 -0
- package/dist/tools/profile-privacy.js.map +1 -0
- package/dist/tools/reflections.js +25 -13
- package/dist/tools/reflections.js.map +1 -1
- package/dist/tools/scheduled-messages.d.ts +2 -0
- package/dist/tools/scheduled-messages.js +124 -0
- package/dist/tools/scheduled-messages.js.map +1 -0
- package/dist/tools/social-channels.d.ts +2 -0
- package/dist/tools/social-channels.js +318 -0
- package/dist/tools/social-channels.js.map +1 -0
- package/dist/tools/tasks.d.ts +2 -0
- package/dist/tools/tasks.js +155 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/tools.js +86 -40
- package/dist/tools/tools.js.map +1 -1
- package/dist/tools/wallets.js +34 -12
- package/dist/tools/wallets.js.map +1 -1
- package/dist/tools/webhooks.js +35 -20
- package/dist/tools/webhooks.js.map +1 -1
- package/dist/tools/whatsapp-actions.d.ts +2 -0
- package/dist/tools/whatsapp-actions.js +186 -0
- package/dist/tools/whatsapp-actions.js.map +1 -0
- package/package.json +4 -31
- package/scripts/setup-delivahere-bot.ts +804 -0
- package/scripts/test-delivahere-bot.ts +128 -0
- package/scripts/update-letschop-prompt.ts +194 -0
- package/server.json +26 -0
- package/smithery.yaml +19 -0
- package/src/client.ts +169 -0
- package/src/index.ts +256 -0
- package/src/tools/ai.ts +35 -0
- package/src/tools/approvals.ts +231 -0
- package/src/tools/audit.ts +49 -0
- package/src/tools/auth.ts +536 -0
- package/src/tools/billing.ts +79 -0
- package/src/tools/blog.ts +264 -0
- package/src/tools/bot-api-keys.ts +87 -0
- package/src/tools/bot-api.ts +193 -0
- package/src/tools/bots.ts +320 -0
- package/src/tools/broadcasts.ts +224 -0
- package/src/tools/builtin-tools.ts +108 -0
- package/src/tools/campaigns.ts +429 -0
- package/src/tools/channels.ts +520 -0
- package/src/tools/contact-lists.ts +320 -0
- package/src/tools/contacts.ts +395 -0
- package/src/tools/conversations.ts +349 -0
- package/src/tools/flows.ts +298 -0
- package/src/tools/group-management.ts +265 -0
- package/src/tools/knowledge-bases.ts +451 -0
- package/src/tools/leads.ts +104 -0
- package/src/tools/list-campaigns.ts +190 -0
- package/src/tools/list-pool.ts +389 -0
- package/src/tools/media.ts +50 -0
- package/src/tools/newsletters.ts +271 -0
- package/src/tools/organizations.ts +287 -0
- package/src/tools/outbound-webhooks.ts +181 -0
- package/src/tools/payouts.ts +133 -0
- package/src/tools/personas.ts +145 -0
- package/src/tools/polls.ts +32 -0
- package/src/tools/pool.ts +293 -0
- package/src/tools/products.ts +280 -0
- package/src/tools/profile-privacy.ts +215 -0
- package/src/tools/reflections.ts +124 -0
- package/src/tools/scheduled-messages.ts +144 -0
- package/src/tools/social-channels.ts +396 -0
- package/src/tools/tasks.ts +198 -0
- package/src/tools/tools.ts +255 -0
- package/src/tools/wallets.ts +107 -0
- package/src/tools/webhooks.ts +166 -0
- package/src/tools/whatsapp-actions.ts +203 -0
- package/tsconfig.json +20 -0
- package/LICENSE +0 -21
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
export function registerPersonaTools(server) {
|
|
6
|
+
server.registerTool("neuron_list_personas", { title: "List Personas", description: "List voice personas for the org. Each persona holds a voiceProfile (tone/style/themes/dos/donts) + exemplars distilled from a Collection of mined content.", inputSchema: z.object({}), annotations: READ }, async () => {
|
|
7
|
+
try {
|
|
8
|
+
return jsonResult(await api("GET", "/personas"));
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
return errorResult(e);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
server.registerTool("neuron_get_persona", { title: "Get Persona", description: "Get one voice persona (full voiceProfile + exemplars).", inputSchema: z.object({ id: z.string().describe("Persona UUID") }), annotations: READ }, async ({ id }) => {
|
|
15
|
+
try {
|
|
16
|
+
return jsonResult(await api("GET", `/personas/${id}`));
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return errorResult(e);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
server.registerTool("neuron_build_persona", {
|
|
23
|
+
title: "Build Persona from Collection",
|
|
24
|
+
description: "Distill a reusable voice from a Collection of mined content: analyzes the top-engagement items and reverse-engineers a voiceProfile (tone, diction, cadence, emoji/formatting habits, themes, dos/donts) + representative exemplars. Requires the collection to have >=3 usable samples. Runs an LLM call (a few seconds).",
|
|
25
|
+
inputSchema: z.object({
|
|
26
|
+
collectionId: z.string().describe("Source Collection UUID (built by the web agent / content mining)."),
|
|
27
|
+
name: z.string().optional().describe("Persona name. Defaults to '<collection name> voice'."),
|
|
28
|
+
sampleLimit: z.number().int().min(1).max(200).optional().describe("How many top-engagement items to analyze (default 40)."),
|
|
29
|
+
}),
|
|
30
|
+
annotations: WRITE,
|
|
31
|
+
}, async (body) => {
|
|
32
|
+
try {
|
|
33
|
+
return jsonResult(await api("POST", "/personas/build", body));
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return errorResult(e);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.registerTool("neuron_build_persona_from_text", {
|
|
40
|
+
title: "Build Persona from Text",
|
|
41
|
+
description: "Distill a reusable voice from raw text — no Collection or browser extension needed. Feed it pasted posts, a chat/dialogue transcript, WhatsApp-export text, or your own well-crafted writing sample, and it reverse-engineers a voiceProfile (tone, diction, cadence, emoji/formatting habits, themes, dos/donts) + exemplars. Provide `text` (auto-split into samples) and/or `samples` (already-split). Runs an LLM call (a few seconds).",
|
|
42
|
+
inputSchema: z.object({
|
|
43
|
+
text: z.string().optional().describe("A raw blob to distill: posts, a dialogue, a chat transcript, or a writing sample. Auto-split into samples."),
|
|
44
|
+
samples: z.array(z.string()).optional().describe("Pre-split writing samples (alternative or addition to `text`)."),
|
|
45
|
+
name: z.string().optional().describe("Persona name. Defaults to '<author> voice' or 'Custom voice'."),
|
|
46
|
+
description: z.string().optional(),
|
|
47
|
+
speaker: z.string().optional().describe("If `text` is a chat transcript, keep only this speaker's lines (name match) — so a group chat yields one person's voice."),
|
|
48
|
+
platform: z.string().optional().describe("Optional metadata tag for the samples (e.g. 'whatsapp', 'x')."),
|
|
49
|
+
authorLabel: z.string().optional().describe("Who the voice belongs to, for a more grounded analysis."),
|
|
50
|
+
}),
|
|
51
|
+
annotations: WRITE,
|
|
52
|
+
}, async (body) => {
|
|
53
|
+
try {
|
|
54
|
+
return jsonResult(await api("POST", "/personas/build-from-text", body));
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return errorResult(e);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
server.registerTool("neuron_build_persona_from_conversation", {
|
|
61
|
+
title: "Build Persona from WhatsApp Chat",
|
|
62
|
+
description: "Distill a reusable voice from an existing WhatsApp conversation's stored messages — no extension needed. `author` picks whose voice: 'me' (owner's own outgoing texts), 'contact' (the other party), 'bot', or 'any'. For a group chat, pass senderName/senderPhone to isolate one participant. Requires >=3 usable text messages. Runs an LLM call.",
|
|
63
|
+
inputSchema: z.object({
|
|
64
|
+
conversationId: z.string().describe("Conversation UUID (from neuron_list_conversations)."),
|
|
65
|
+
author: z.enum(["me", "contact", "bot", "any"]).optional().describe("Whose voice to capture. Default 'me'."),
|
|
66
|
+
senderName: z.string().optional().describe("For groups: match one participant by display name."),
|
|
67
|
+
senderPhone: z.string().optional().describe("For groups: match one participant by phone."),
|
|
68
|
+
name: z.string().optional(),
|
|
69
|
+
limit: z.number().int().min(1).max(500).optional().describe("How many recent messages to read (default 200)."),
|
|
70
|
+
}),
|
|
71
|
+
annotations: WRITE,
|
|
72
|
+
}, async (body) => {
|
|
73
|
+
try {
|
|
74
|
+
return jsonResult(await api("POST", "/personas/build-from-conversation", body));
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
return errorResult(e);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
server.registerTool("neuron_generate_from_persona", {
|
|
81
|
+
title: "Generate Content in Voice",
|
|
82
|
+
description: "Generate content written in the persona's voice for a topic/brief. Returns N variations. Stateless — nothing is persisted.",
|
|
83
|
+
inputSchema: z.object({
|
|
84
|
+
id: z.string().describe("Persona UUID"),
|
|
85
|
+
topic: z.string().optional().describe("What to write about."),
|
|
86
|
+
platform: z.string().optional().describe("Target platform (instagram/x/tiktok/linkedin/facebook/whatsapp...)."),
|
|
87
|
+
format: z.string().optional().describe("Desired format (post, reply, caption, thread, DM...)."),
|
|
88
|
+
count: z.number().int().min(1).max(10).optional().describe("Number of variations (1-10, default 1)."),
|
|
89
|
+
extraInstructions: z.string().optional(),
|
|
90
|
+
}),
|
|
91
|
+
annotations: WRITE,
|
|
92
|
+
}, async ({ id, ...body }) => {
|
|
93
|
+
try {
|
|
94
|
+
return jsonResult(await api("POST", `/personas/${id}/generate`, body));
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
return errorResult(e);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
server.registerTool("neuron_apply_persona_to_bot", {
|
|
101
|
+
title: "Apply Persona Voice to Bot",
|
|
102
|
+
description: "Give a bot this persona's voice: merges a delimited voice block into the bot's system prompt (idempotent — re-applying or swapping personas replaces it cleanly) and tags the bot's metadata with the persona id.",
|
|
103
|
+
inputSchema: z.object({ id: z.string().describe("Persona UUID"), botId: z.string().describe("Bot UUID to apply the voice to.") }),
|
|
104
|
+
annotations: WRITE,
|
|
105
|
+
}, async ({ id, botId }) => {
|
|
106
|
+
try {
|
|
107
|
+
return jsonResult(await api("POST", `/personas/${id}/apply-to-bot`, { botId }));
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
return errorResult(e);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
server.registerTool("neuron_update_persona", {
|
|
114
|
+
title: "Update Persona",
|
|
115
|
+
description: "Update a persona's name/description, or hand-tune its voiceProfile / exemplars.",
|
|
116
|
+
inputSchema: z.object({
|
|
117
|
+
id: z.string().describe("Persona UUID"),
|
|
118
|
+
name: z.string().optional(),
|
|
119
|
+
description: z.string().optional(),
|
|
120
|
+
voiceProfile: z.record(z.unknown()).optional(),
|
|
121
|
+
exemplars: z.array(z.record(z.unknown())).optional(),
|
|
122
|
+
}),
|
|
123
|
+
annotations: WRITE,
|
|
124
|
+
}, async ({ id, ...body }) => {
|
|
125
|
+
try {
|
|
126
|
+
return jsonResult(await api("PUT", `/personas/${id}`, body));
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
return errorResult(e);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
server.registerTool("neuron_delete_persona", { title: "Delete Persona", description: "Delete a voice persona.", inputSchema: z.object({ id: z.string().describe("Persona UUID") }), annotations: WRITE }, async ({ id }) => {
|
|
133
|
+
try {
|
|
134
|
+
return jsonResult(await api("DELETE", `/personas/${id}`));
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
return errorResult(e);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=personas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personas.js","sourceRoot":"","sources":["../../src/tools/personas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { api, jsonResult, errorResult } from "../client.js";
|
|
3
|
+
export function registerPollTools(server) {
|
|
4
|
+
server.registerTool("neuron_send_poll", {
|
|
5
|
+
title: "Send Poll",
|
|
6
|
+
description: "Send a poll message via WhatsApp. Polls support 2-12 options and optional multi-select. Only supported on Baileys channels.",
|
|
7
|
+
inputSchema: z.object({
|
|
8
|
+
channelId: z.string().describe("WhatsApp channel identifier (UUID)"),
|
|
9
|
+
to: z.string().describe("Recipient JID or phone number (individual or group)"),
|
|
10
|
+
name: z.string().min(1).describe("Poll question/title"),
|
|
11
|
+
options: z.array(z.string().min(1)).min(2).max(12).describe("Poll answer options (2-12 items)"),
|
|
12
|
+
selectableCount: z.number().int().min(0).optional().describe("Max selections allowed. 0 = unlimited (default). 1 = single-choice."),
|
|
13
|
+
}),
|
|
14
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
15
|
+
}, async (args) => {
|
|
16
|
+
try {
|
|
17
|
+
const res = await api("POST", `/whatsapp-actions/${args.channelId}/send-poll`, {
|
|
18
|
+
to: args.to,
|
|
19
|
+
name: args.name,
|
|
20
|
+
options: args.options,
|
|
21
|
+
selectableCount: args.selectableCount,
|
|
22
|
+
});
|
|
23
|
+
return jsonResult(res);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return errorResult(error);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=polls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polls.js","sourceRoot":"","sources":["../../src/tools/polls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,6HAA6H;QAC1I,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACpE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YAC9E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACvD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YAC/F,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;SACpI,CAAC;QACF,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1G,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,qBAAqB,IAAI,CAAC,SAAS,YAAY,EAAE;gBAC7E,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,eAAe,EAAE,IAAI,CAAC,eAAe;aACtC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;IAChD,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/pool.js
CHANGED
|
@@ -4,16 +4,22 @@ export function registerPoolTools(server) {
|
|
|
4
4
|
// 1. Browse pool
|
|
5
5
|
server.registerTool("neuron_browse_pool", {
|
|
6
6
|
title: "Browse Pool",
|
|
7
|
-
description: "Browse the marketplace
|
|
7
|
+
description: "Browse the shared marketplace pool of published bots, tools, knowledge bases, and reflections with optional filtering by type, category, tags, or search query.",
|
|
8
8
|
inputSchema: z.object({
|
|
9
|
-
query: z.string().optional().describe("
|
|
10
|
-
type: z.
|
|
11
|
-
category: z.string().optional().describe("Filter by category"),
|
|
12
|
-
tags: z.string().optional().describe("Filter by tags (comma-separated)"),
|
|
13
|
-
featured: z.boolean().optional().describe("
|
|
9
|
+
query: z.string().optional().describe("Free-text search query to filter pool items by name or description"),
|
|
10
|
+
type: z.enum(["knowledge_base", "bot_template", "tool_template", "reflection_pack"]).optional().describe("Filter by resource type"),
|
|
11
|
+
category: z.string().optional().describe("Filter by category name"),
|
|
12
|
+
tags: z.string().optional().describe("Filter by tags (comma-separated list, e.g., 'ai,chatbot')"),
|
|
13
|
+
featured: z.boolean().optional().describe("When true, return only featured items"),
|
|
14
14
|
page: z.number().optional().describe("Page number for pagination (default: 1)"),
|
|
15
15
|
limit: z.number().optional().describe("Number of items per page (default: 20)"),
|
|
16
16
|
}),
|
|
17
|
+
annotations: {
|
|
18
|
+
readOnlyHint: true,
|
|
19
|
+
destructiveHint: false,
|
|
20
|
+
idempotentHint: true,
|
|
21
|
+
openWorldHint: false,
|
|
22
|
+
},
|
|
17
23
|
}, async (args) => {
|
|
18
24
|
try {
|
|
19
25
|
const queryParams = {};
|
|
@@ -41,10 +47,16 @@ export function registerPoolTools(server) {
|
|
|
41
47
|
// 2. Get pool item
|
|
42
48
|
server.registerTool("neuron_get_pool_item", {
|
|
43
49
|
title: "Get Pool Item",
|
|
44
|
-
description: "
|
|
50
|
+
description: "Retrieve detailed information about a specific item in the marketplace pool, including its description, category, tags, and install count.",
|
|
45
51
|
inputSchema: z.object({
|
|
46
|
-
id: z.string().describe("
|
|
52
|
+
id: z.string().describe("Unique identifier (UUID) of the pool item to retrieve"),
|
|
47
53
|
}),
|
|
54
|
+
annotations: {
|
|
55
|
+
readOnlyHint: true,
|
|
56
|
+
destructiveHint: false,
|
|
57
|
+
idempotentHint: true,
|
|
58
|
+
openWorldHint: false,
|
|
59
|
+
},
|
|
48
60
|
}, async (args) => {
|
|
49
61
|
try {
|
|
50
62
|
const response = await api("GET", `/pool/${args.id}`);
|
|
@@ -57,8 +69,14 @@ export function registerPoolTools(server) {
|
|
|
57
69
|
// 3. List published items
|
|
58
70
|
server.registerTool("neuron_list_published", {
|
|
59
71
|
title: "List My Published Items",
|
|
60
|
-
description: "List all items
|
|
72
|
+
description: "List all items the current organization has published to the marketplace pool.",
|
|
61
73
|
inputSchema: z.object({}),
|
|
74
|
+
annotations: {
|
|
75
|
+
readOnlyHint: true,
|
|
76
|
+
destructiveHint: false,
|
|
77
|
+
idempotentHint: true,
|
|
78
|
+
openWorldHint: false,
|
|
79
|
+
},
|
|
62
80
|
}, async () => {
|
|
63
81
|
try {
|
|
64
82
|
const response = await api("GET", "/pool/my");
|
|
@@ -71,8 +89,14 @@ export function registerPoolTools(server) {
|
|
|
71
89
|
// 4. List installed items
|
|
72
90
|
server.registerTool("neuron_list_installed", {
|
|
73
91
|
title: "List Installed Items",
|
|
74
|
-
description: "List all items
|
|
92
|
+
description: "List all items the current organization has installed from the marketplace pool.",
|
|
75
93
|
inputSchema: z.object({}),
|
|
94
|
+
annotations: {
|
|
95
|
+
readOnlyHint: true,
|
|
96
|
+
destructiveHint: false,
|
|
97
|
+
idempotentHint: true,
|
|
98
|
+
openWorldHint: false,
|
|
99
|
+
},
|
|
76
100
|
}, async () => {
|
|
77
101
|
try {
|
|
78
102
|
const response = await api("GET", "/pool/installed");
|
|
@@ -85,26 +109,26 @@ export function registerPoolTools(server) {
|
|
|
85
109
|
// 5. Publish to pool
|
|
86
110
|
server.registerTool("neuron_publish_to_pool", {
|
|
87
111
|
title: "Publish to Pool",
|
|
88
|
-
description: "Publish a bot, tool, knowledge base, or reflection to the marketplace
|
|
112
|
+
description: "Publish a bot, tool, knowledge base, or reflection to the shared marketplace pool for other organizations to discover and install.",
|
|
89
113
|
inputSchema: z.object({
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
description: z.string().optional().describe("Detailed description of the resource"),
|
|
94
|
-
category: z.string().optional().describe("Category for organizing the resource"),
|
|
95
|
-
tags: z.array(z.string()).optional().describe("
|
|
114
|
+
type: z.enum(["knowledge_base", "bot_template", "tool_template", "reflection_pack"]).describe("Type of resource to publish to the pool"),
|
|
115
|
+
sourceId: z.string().describe("Unique identifier (UUID) of the source resource to publish"),
|
|
116
|
+
name: z.string().describe("Display name for the pool listing"),
|
|
117
|
+
description: z.string().optional().describe("Detailed description of the resource for the pool listing"),
|
|
118
|
+
category: z.string().optional().describe("Category name for organizing the resource in the pool"),
|
|
119
|
+
tags: z.array(z.string()).optional().describe("List of tags for improved discoverability (e.g., ['ai', 'customer-support'])"),
|
|
120
|
+
setupInstructions: z.string().optional().describe("Step-by-step setup guide shown after installation (tool_template only, max 5000 chars)"),
|
|
121
|
+
defaultSecrets: z.record(z.string()).optional().describe("Pre-filled secrets auto-populated on install, e.g. { OAUTH2_TOKEN_URL: 'https://...' }"),
|
|
96
122
|
}),
|
|
123
|
+
annotations: {
|
|
124
|
+
readOnlyHint: false,
|
|
125
|
+
destructiveHint: false,
|
|
126
|
+
idempotentHint: false,
|
|
127
|
+
openWorldHint: false,
|
|
128
|
+
},
|
|
97
129
|
}, async (args) => {
|
|
98
130
|
try {
|
|
99
|
-
const
|
|
100
|
-
type: args.resourceType,
|
|
101
|
-
sourceId: args.resourceId,
|
|
102
|
-
name: args.title,
|
|
103
|
-
description: args.description,
|
|
104
|
-
category: args.category,
|
|
105
|
-
tags: args.tags,
|
|
106
|
-
};
|
|
107
|
-
const response = await api("POST", "/pool", body);
|
|
131
|
+
const response = await api("POST", "/pool", args);
|
|
108
132
|
return jsonResult(response);
|
|
109
133
|
}
|
|
110
134
|
catch (error) {
|
|
@@ -114,14 +138,22 @@ export function registerPoolTools(server) {
|
|
|
114
138
|
// 6. Update pool item
|
|
115
139
|
server.registerTool("neuron_update_pool_item", {
|
|
116
140
|
title: "Update Pool Item",
|
|
117
|
-
description: "Update
|
|
141
|
+
description: "Update a pool item you have published — metadata (name, description, category, tags) and content fields (setupInstructions, defaultSecrets for tool_template items). The underlying resource is re-snapshotted and version is bumped on every update.",
|
|
118
142
|
inputSchema: z.object({
|
|
119
|
-
id: z.string().describe("
|
|
120
|
-
|
|
121
|
-
description: z.string().optional().describe("New description"),
|
|
122
|
-
category: z.string().optional().describe("New category"),
|
|
123
|
-
tags: z.array(z.string()).optional().describe("New tags"),
|
|
143
|
+
id: z.string().describe("Unique identifier (UUID) of the pool item to update"),
|
|
144
|
+
name: z.string().optional().describe("New display name for the pool listing"),
|
|
145
|
+
description: z.string().optional().describe("New detailed description for the pool listing"),
|
|
146
|
+
category: z.string().optional().describe("New category name for the pool listing"),
|
|
147
|
+
tags: z.array(z.string()).optional().describe("New list of tags for the pool listing"),
|
|
148
|
+
setupInstructions: z.string().optional().describe("Updated setup guide shown after installation (tool_template only, max 5000 chars)"),
|
|
149
|
+
defaultSecrets: z.record(z.string()).optional().describe("Updated pre-filled secrets auto-populated on install, e.g. { OAUTH2_TOKEN_URL: 'https://...' }"),
|
|
124
150
|
}),
|
|
151
|
+
annotations: {
|
|
152
|
+
readOnlyHint: false,
|
|
153
|
+
destructiveHint: false,
|
|
154
|
+
idempotentHint: true,
|
|
155
|
+
openWorldHint: false,
|
|
156
|
+
},
|
|
125
157
|
}, async (args) => {
|
|
126
158
|
try {
|
|
127
159
|
const { id, ...updateData } = args;
|
|
@@ -135,10 +167,16 @@ export function registerPoolTools(server) {
|
|
|
135
167
|
// 7. Unpublish from pool
|
|
136
168
|
server.registerTool("neuron_unpublish_from_pool", {
|
|
137
169
|
title: "Unpublish from Pool",
|
|
138
|
-
description: "
|
|
170
|
+
description: "Permanently remove a published item from the marketplace pool. Organizations that installed this item will retain their copies.",
|
|
139
171
|
inputSchema: z.object({
|
|
140
|
-
id: z.string().describe("
|
|
172
|
+
id: z.string().describe("Unique identifier (UUID) of the pool item to unpublish"),
|
|
141
173
|
}),
|
|
174
|
+
annotations: {
|
|
175
|
+
readOnlyHint: false,
|
|
176
|
+
destructiveHint: true,
|
|
177
|
+
idempotentHint: true,
|
|
178
|
+
openWorldHint: false,
|
|
179
|
+
},
|
|
142
180
|
}, async (args) => {
|
|
143
181
|
try {
|
|
144
182
|
const response = await api("DELETE", `/pool/${args.id}`);
|
|
@@ -151,15 +189,23 @@ export function registerPoolTools(server) {
|
|
|
151
189
|
// 8. Install from pool
|
|
152
190
|
server.registerTool("neuron_install_from_pool", {
|
|
153
191
|
title: "Install from Pool",
|
|
154
|
-
description: "Install a resource from the marketplace
|
|
192
|
+
description: "Install a resource from the marketplace pool into the current organization. Choose 'fork' for an independent copy or 'subscribe' to receive future updates from the publisher.",
|
|
155
193
|
inputSchema: z.object({
|
|
156
|
-
id: z.string().describe("
|
|
157
|
-
mode: z.enum(["fork", "subscribe"]).
|
|
194
|
+
id: z.string().describe("Unique identifier (UUID) of the pool item to install"),
|
|
195
|
+
mode: z.enum(["fork", "subscribe"]).describe("Installation mode: 'fork' creates an independent copy, 'subscribe' links to publisher updates"),
|
|
196
|
+
targetBotId: z.string().optional().describe("UUID of the bot to attach the installed resource to (for tool_template or knowledge_base types)"),
|
|
197
|
+
targetKbId: z.string().optional().describe("UUID of the knowledge base to install into (for knowledge_base types)"),
|
|
158
198
|
}),
|
|
199
|
+
annotations: {
|
|
200
|
+
readOnlyHint: false,
|
|
201
|
+
destructiveHint: false,
|
|
202
|
+
idempotentHint: false,
|
|
203
|
+
openWorldHint: false,
|
|
204
|
+
},
|
|
159
205
|
}, async (args) => {
|
|
160
206
|
try {
|
|
161
|
-
const { id,
|
|
162
|
-
const response = await api("POST", `/pool/${id}/install`,
|
|
207
|
+
const { id, ...body } = args;
|
|
208
|
+
const response = await api("POST", `/pool/${id}/install`, body);
|
|
163
209
|
return jsonResult(response);
|
|
164
210
|
}
|
|
165
211
|
catch (error) {
|
|
@@ -169,10 +215,16 @@ export function registerPoolTools(server) {
|
|
|
169
215
|
// 9. Pull pool update
|
|
170
216
|
server.registerTool("neuron_pull_pool_update", {
|
|
171
217
|
title: "Pull Pool Update",
|
|
172
|
-
description: "Pull the latest updates for a subscribed pool resource. Only applies to items installed with 'subscribe' mode.",
|
|
218
|
+
description: "Pull the latest updates for a subscribed pool resource to sync with the publisher's changes. Only applies to items installed with 'subscribe' mode.",
|
|
173
219
|
inputSchema: z.object({
|
|
174
|
-
installId: z.string().describe("
|
|
220
|
+
installId: z.string().describe("Unique identifier (UUID) of the installed resource to pull updates for"),
|
|
175
221
|
}),
|
|
222
|
+
annotations: {
|
|
223
|
+
readOnlyHint: false,
|
|
224
|
+
destructiveHint: false,
|
|
225
|
+
idempotentHint: true,
|
|
226
|
+
openWorldHint: false,
|
|
227
|
+
},
|
|
176
228
|
}, async (args) => {
|
|
177
229
|
try {
|
|
178
230
|
const response = await api("POST", `/pool/installed/${args.installId}/pull`);
|
|
@@ -185,10 +237,16 @@ export function registerPoolTools(server) {
|
|
|
185
237
|
// 10. Toggle featured status
|
|
186
238
|
server.registerTool("neuron_toggle_featured", {
|
|
187
239
|
title: "Toggle Featured Status",
|
|
188
|
-
description: "Toggle the featured status of a pool item. Featured items appear prominently in the marketplace.
|
|
240
|
+
description: "Toggle the featured status of a pool item. Featured items appear prominently in the marketplace. Requires admin privileges.",
|
|
189
241
|
inputSchema: z.object({
|
|
190
|
-
id: z.string().describe("
|
|
242
|
+
id: z.string().describe("Unique identifier (UUID) of the pool item to feature or unfeature"),
|
|
191
243
|
}),
|
|
244
|
+
annotations: {
|
|
245
|
+
readOnlyHint: false,
|
|
246
|
+
destructiveHint: false,
|
|
247
|
+
idempotentHint: true,
|
|
248
|
+
openWorldHint: false,
|
|
249
|
+
},
|
|
192
250
|
}, async (args) => {
|
|
193
251
|
try {
|
|
194
252
|
const response = await api("POST", `/pool/${args.id}/feature`);
|
package/dist/tools/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/tools/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/tools/pool.ts"],"names":[],"mappings":"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"}
|