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,348 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import http from "node:http";
|
|
3
|
+
import net from "node:net";
|
|
4
|
+
import { api, jsonResult, textResult, errorResult, setAuthToken, getAuthToken } from "../client.js";
|
|
5
|
+
/** Find an available port by binding to port 0. */
|
|
6
|
+
function findAvailablePort() {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const srv = net.createServer();
|
|
9
|
+
srv.listen(0, "127.0.0.1", () => {
|
|
10
|
+
const addr = srv.address();
|
|
11
|
+
if (addr && typeof addr === "object") {
|
|
12
|
+
const port = addr.port;
|
|
13
|
+
srv.close(() => resolve(port));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
srv.close(() => reject(new Error("Could not determine port")));
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
srv.on("error", reject);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Start a temporary HTTP server that waits for a callback with a token. */
|
|
23
|
+
function startCallbackServer(port) {
|
|
24
|
+
let resolveToken;
|
|
25
|
+
let rejectToken;
|
|
26
|
+
const tokenPromise = new Promise((resolve, reject) => {
|
|
27
|
+
resolveToken = resolve;
|
|
28
|
+
rejectToken = reject;
|
|
29
|
+
});
|
|
30
|
+
const server = http.createServer((req, res) => {
|
|
31
|
+
const url = new URL(req.url || "/", `http://127.0.0.1:${port}`);
|
|
32
|
+
if (url.pathname === "/callback") {
|
|
33
|
+
const token = url.searchParams.get("token");
|
|
34
|
+
if (token) {
|
|
35
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
36
|
+
res.end("<html><body><h2>Authorization successful!</h2><p>You can close this tab and return to your terminal.</p></body></html>");
|
|
37
|
+
resolveToken(token);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
41
|
+
res.end("Missing token parameter");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
46
|
+
res.end("Not found");
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
server.listen(port, "127.0.0.1");
|
|
50
|
+
const shutdown = () => {
|
|
51
|
+
server.close();
|
|
52
|
+
rejectToken(new Error("Server shut down"));
|
|
53
|
+
};
|
|
54
|
+
return { server, tokenPromise, shutdown };
|
|
55
|
+
}
|
|
56
|
+
/** Poll the backend for session approval. */
|
|
57
|
+
async function pollForApproval(sessionId, timeoutMs, intervalMs) {
|
|
58
|
+
const deadline = Date.now() + timeoutMs;
|
|
59
|
+
while (Date.now() < deadline) {
|
|
60
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
61
|
+
try {
|
|
62
|
+
const result = await api("GET", `/auth/mcp/sessions/${sessionId}`);
|
|
63
|
+
const data = result.data;
|
|
64
|
+
if (data?.status === "approved" && data.token) {
|
|
65
|
+
return data.token;
|
|
66
|
+
}
|
|
67
|
+
if (data?.status === "consumed" || data?.status === "expired") {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Ignore transient errors, keep polling
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
// Track pending browser auth session for non-blocking flow
|
|
78
|
+
let pendingSessionId = null;
|
|
79
|
+
export function registerAuthTools(server) {
|
|
80
|
+
// Register
|
|
81
|
+
server.registerTool("neuron_register", {
|
|
82
|
+
title: "Register New User",
|
|
83
|
+
description: "Register a new user account with name, email, password, and organization name",
|
|
84
|
+
inputSchema: z.object({
|
|
85
|
+
name: z.string().describe("Full name of the user"),
|
|
86
|
+
email: z.string().email().describe("Email address of the user"),
|
|
87
|
+
password: z.string().min(8).describe("Password for the account (minimum 8 characters)"),
|
|
88
|
+
orgName: z.string().describe("Name of the organization to create"),
|
|
89
|
+
}),
|
|
90
|
+
annotations: { destructiveHint: false },
|
|
91
|
+
}, async (params) => {
|
|
92
|
+
try {
|
|
93
|
+
const result = await api("POST", "/auth/register", {
|
|
94
|
+
name: params.name,
|
|
95
|
+
email: params.email,
|
|
96
|
+
password: params.password,
|
|
97
|
+
orgName: params.orgName,
|
|
98
|
+
});
|
|
99
|
+
return jsonResult(result);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return errorResult(error);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Login (multi-mode)
|
|
106
|
+
server.registerTool("neuron_login", {
|
|
107
|
+
title: "Login to Neuron",
|
|
108
|
+
description: "Authenticate with Neuron. Three modes:\n" +
|
|
109
|
+
"1. No args: Opens a browser URL for secure authorization (recommended — no credentials shared with AI)\n" +
|
|
110
|
+
"2. token: Paste an MCP token from the Neuron dashboard\n" +
|
|
111
|
+
"3. email+password: Legacy login (credentials visible to AI)",
|
|
112
|
+
inputSchema: z.object({
|
|
113
|
+
token: z.string().optional().describe("MCP token from Neuron dashboard (Settings > MCP Tokens)"),
|
|
114
|
+
email: z.string().email().optional().describe("Email for legacy login"),
|
|
115
|
+
password: z.string().optional().describe("Password for legacy login"),
|
|
116
|
+
}).refine((data) => {
|
|
117
|
+
const hasToken = !!data.token;
|
|
118
|
+
const hasCredentials = !!data.email && !!data.password;
|
|
119
|
+
const hasPartialCredentials = !!data.email !== !!data.password;
|
|
120
|
+
if (hasPartialCredentials)
|
|
121
|
+
return false;
|
|
122
|
+
if (hasToken && hasCredentials)
|
|
123
|
+
return false;
|
|
124
|
+
return true;
|
|
125
|
+
}, { message: "Provide either token, email+password, or nothing for browser auth" }),
|
|
126
|
+
annotations: { destructiveHint: false },
|
|
127
|
+
}, async (params) => {
|
|
128
|
+
try {
|
|
129
|
+
// Mode 1: Direct token
|
|
130
|
+
if (params.token) {
|
|
131
|
+
setAuthToken(params.token);
|
|
132
|
+
const me = await api("GET", "/auth/me");
|
|
133
|
+
if (!me.success) {
|
|
134
|
+
setAuthToken("");
|
|
135
|
+
return errorResult(new Error("Invalid token. Please check and try again."));
|
|
136
|
+
}
|
|
137
|
+
const user = me.data;
|
|
138
|
+
return textResult(`Authenticated successfully as ${user.name} (${user.email})` +
|
|
139
|
+
(user.organization ? ` — org: ${user.organization.name}` : ""));
|
|
140
|
+
}
|
|
141
|
+
// Mode 2: Legacy email/password
|
|
142
|
+
if (params.email && params.password) {
|
|
143
|
+
const result = await api("POST", "/auth/login", {
|
|
144
|
+
email: params.email,
|
|
145
|
+
password: params.password,
|
|
146
|
+
});
|
|
147
|
+
if (result.data?.accessToken) {
|
|
148
|
+
setAuthToken(result.data.accessToken);
|
|
149
|
+
}
|
|
150
|
+
return jsonResult(result);
|
|
151
|
+
}
|
|
152
|
+
// Mode 3: Browser auth (default — no args)
|
|
153
|
+
const isRemote = process.env.MCP_TRANSPORT === "http";
|
|
154
|
+
// Check if background polling already set the token
|
|
155
|
+
if (getAuthToken()) {
|
|
156
|
+
try {
|
|
157
|
+
const me = await api("GET", "/auth/me");
|
|
158
|
+
const user = me.data;
|
|
159
|
+
if (user && me.success) {
|
|
160
|
+
pendingSessionId = null;
|
|
161
|
+
return textResult(`Already authenticated as ${user.name} (${user.email})` +
|
|
162
|
+
(user.organization ? ` — org: ${user.organization.name}` : ""));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Token invalid, continue with auth flow
|
|
167
|
+
setAuthToken("");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Check if we have a pending session that was already approved
|
|
171
|
+
if (pendingSessionId) {
|
|
172
|
+
const token = await pollForApproval(pendingSessionId, 5000, 1000);
|
|
173
|
+
if (token) {
|
|
174
|
+
pendingSessionId = null;
|
|
175
|
+
setAuthToken(token);
|
|
176
|
+
const me = await api("GET", "/auth/me");
|
|
177
|
+
const user = me.data;
|
|
178
|
+
return textResult(`Authenticated successfully as ${user?.name || "user"} (${user?.email || "unknown"})` +
|
|
179
|
+
(user?.organization ? ` — org: ${user.organization.name}` : ""));
|
|
180
|
+
}
|
|
181
|
+
// Session still pending or expired — create a new one
|
|
182
|
+
}
|
|
183
|
+
// For local/stdio mode, start a callback server. For remote/HTTP mode, skip it.
|
|
184
|
+
let callbackUrl;
|
|
185
|
+
let callbackPort;
|
|
186
|
+
if (!isRemote) {
|
|
187
|
+
try {
|
|
188
|
+
callbackPort = await findAvailablePort();
|
|
189
|
+
callbackUrl = `http://127.0.0.1:${callbackPort}/callback`;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Can't bind locally — skip callback server
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Create session on backend
|
|
196
|
+
const sessionResult = await api("POST", "/auth/mcp/sessions", { callbackUrl: callbackUrl || "http://127.0.0.1:0/callback" });
|
|
197
|
+
const sessionData = sessionResult.data;
|
|
198
|
+
if (!sessionData?.sessionId || !sessionData?.authUrl) {
|
|
199
|
+
return errorResult(new Error("Failed to create auth session. Is the server running?"));
|
|
200
|
+
}
|
|
201
|
+
const { sessionId, authUrl } = sessionData;
|
|
202
|
+
pendingSessionId = sessionId;
|
|
203
|
+
// Start background polling (non-blocking)
|
|
204
|
+
const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
205
|
+
const POLL_INTERVAL_MS = 3000;
|
|
206
|
+
// Fire-and-forget: poll in background and auto-set token when approved
|
|
207
|
+
pollForApproval(sessionId, TIMEOUT_MS, POLL_INTERVAL_MS).then((token) => {
|
|
208
|
+
if (token) {
|
|
209
|
+
setAuthToken(token);
|
|
210
|
+
pendingSessionId = null;
|
|
211
|
+
console.error("✅ Neuron authorization approved. Token set automatically.");
|
|
212
|
+
}
|
|
213
|
+
}).catch(() => { });
|
|
214
|
+
// Also start local callback server if available (for local/stdio mode only)
|
|
215
|
+
if (callbackPort && !isRemote) {
|
|
216
|
+
try {
|
|
217
|
+
const { tokenPromise, shutdown } = startCallbackServer(callbackPort);
|
|
218
|
+
tokenPromise.then((token) => {
|
|
219
|
+
setAuthToken(token);
|
|
220
|
+
pendingSessionId = null;
|
|
221
|
+
console.error("✅ Neuron authorization approved via callback. Token set automatically.");
|
|
222
|
+
}).catch(() => { });
|
|
223
|
+
// Auto-shutdown after timeout
|
|
224
|
+
setTimeout(() => shutdown(), TIMEOUT_MS);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Callback server not critical
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Return immediately with the URL — don't block!
|
|
231
|
+
return textResult(`🔗 Open this URL to authorize Neuron:\n\n ${authUrl}\n\n` +
|
|
232
|
+
`After approving in your browser, run neuron_login() again (no args) to confirm.\n\n` +
|
|
233
|
+
`Alternatively, generate a token at Settings > MCP Tokens in the Neuron dashboard and run:\n` +
|
|
234
|
+
`neuron_login({ token: "your-token-here" })`);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return errorResult(error);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
// Refresh Token
|
|
241
|
+
server.registerTool("neuron_refresh_token", {
|
|
242
|
+
title: "Refresh Access Token",
|
|
243
|
+
description: "Refresh the access token using a refresh token. Automatically sets the new access token.",
|
|
244
|
+
inputSchema: z.object({
|
|
245
|
+
refreshToken: z.string().describe("Refresh token obtained from login"),
|
|
246
|
+
}),
|
|
247
|
+
annotations: { destructiveHint: false },
|
|
248
|
+
}, async (params) => {
|
|
249
|
+
try {
|
|
250
|
+
const result = await api("POST", "/auth/refresh", {
|
|
251
|
+
refreshToken: params.refreshToken,
|
|
252
|
+
});
|
|
253
|
+
if (result.data?.accessToken) {
|
|
254
|
+
setAuthToken(result.data.accessToken);
|
|
255
|
+
}
|
|
256
|
+
return jsonResult(result);
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
return errorResult(error);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
// Switch Organization
|
|
263
|
+
server.registerTool("neuron_switch_org", {
|
|
264
|
+
title: "Switch Organization",
|
|
265
|
+
description: "Switch to a different organization. Returns a new access token and automatically sets it.",
|
|
266
|
+
inputSchema: z.object({
|
|
267
|
+
orgId: z.string().describe("ID of the organization to switch to"),
|
|
268
|
+
}),
|
|
269
|
+
}, async (params) => {
|
|
270
|
+
try {
|
|
271
|
+
const result = await api("POST", "/auth/switch-org", { orgId: params.orgId });
|
|
272
|
+
if (result.data?.accessToken) {
|
|
273
|
+
setAuthToken(result.data.accessToken);
|
|
274
|
+
}
|
|
275
|
+
return jsonResult(result);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return errorResult(error);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
// List Organizations
|
|
282
|
+
server.registerTool("neuron_list_organizations", {
|
|
283
|
+
title: "List Organizations",
|
|
284
|
+
description: "List all organizations the authenticated user belongs to",
|
|
285
|
+
inputSchema: z.object({}),
|
|
286
|
+
annotations: { readOnlyHint: true },
|
|
287
|
+
}, async () => {
|
|
288
|
+
try {
|
|
289
|
+
const result = await api("GET", "/auth/organizations");
|
|
290
|
+
return jsonResult(result);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
return errorResult(error);
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
// Get Profile
|
|
297
|
+
server.registerTool("neuron_get_profile", {
|
|
298
|
+
title: "Get User Profile",
|
|
299
|
+
description: "Get the authenticated user's profile information",
|
|
300
|
+
inputSchema: z.object({}),
|
|
301
|
+
annotations: { readOnlyHint: true },
|
|
302
|
+
}, async () => {
|
|
303
|
+
try {
|
|
304
|
+
const result = await api("GET", "/auth/me");
|
|
305
|
+
return jsonResult(result);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
return errorResult(error);
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
// Who Am I
|
|
312
|
+
server.registerTool("neuron_whoami", {
|
|
313
|
+
title: "Check Current Account",
|
|
314
|
+
description: "Check which Neuron account is currently logged in, including user name, email, role, and organization.",
|
|
315
|
+
inputSchema: z.object({}),
|
|
316
|
+
annotations: { readOnlyHint: true },
|
|
317
|
+
}, async () => {
|
|
318
|
+
if (!getAuthToken()) {
|
|
319
|
+
return textResult("Not logged in. Use neuron_login() to authenticate.");
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
const result = await api("GET", "/auth/me");
|
|
323
|
+
const user = result.data;
|
|
324
|
+
if (!user || !result.success) {
|
|
325
|
+
return textResult("Not logged in or token is invalid. Use neuron_login() to authenticate.");
|
|
326
|
+
}
|
|
327
|
+
const lines = [
|
|
328
|
+
`Logged in as: ${user.name} (${user.email})`,
|
|
329
|
+
`Role: ${user.role || "member"}`,
|
|
330
|
+
user.organization ? `Organization: ${user.organization.name}` : null,
|
|
331
|
+
].filter(Boolean);
|
|
332
|
+
return textResult(lines.join("\n"));
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
return errorResult(error);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
// Logout
|
|
339
|
+
server.registerTool("neuron_logout", {
|
|
340
|
+
title: "Logout",
|
|
341
|
+
description: "Clear the current auth token locally. Does NOT revoke server-side MCP tokens — revoke from the Neuron dashboard (Settings > MCP Tokens) for full invalidation.",
|
|
342
|
+
inputSchema: z.object({}),
|
|
343
|
+
}, async () => {
|
|
344
|
+
setAuthToken("");
|
|
345
|
+
return textResult("Logged out. Token cleared locally.\n\nTo revoke MCP tokens server-side, go to Settings > MCP Tokens in the Neuron dashboard.");
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { api, jsonResult, errorResult } from "../client.js";
|
|
3
|
+
export function registerBillingTools(server) {
|
|
4
|
+
// Get billing info
|
|
5
|
+
server.registerTool("neuron_get_billing", {
|
|
6
|
+
title: "Get Billing Info",
|
|
7
|
+
description: "Get the current billing information, subscription status, and usage details for the organization",
|
|
8
|
+
inputSchema: z.object({}),
|
|
9
|
+
annotations: { readOnlyHint: true },
|
|
10
|
+
}, async () => {
|
|
11
|
+
try {
|
|
12
|
+
const result = await api("GET", "/billing");
|
|
13
|
+
return jsonResult(result);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
return errorResult(error);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
// Checkout
|
|
20
|
+
server.registerTool("neuron_checkout", {
|
|
21
|
+
title: "Checkout Subscription",
|
|
22
|
+
description: "Start a checkout session for a subscription plan. Returns a checkout URL or confirmation.",
|
|
23
|
+
inputSchema: z.object({
|
|
24
|
+
plan: z.enum(["pro", "business"]).describe("Subscription plan to purchase"),
|
|
25
|
+
}),
|
|
26
|
+
}, async (params) => {
|
|
27
|
+
try {
|
|
28
|
+
const result = await api("POST", "/billing/checkout", { plan: params.plan });
|
|
29
|
+
return jsonResult(result);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return errorResult(error);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// Cancel subscription
|
|
36
|
+
server.registerTool("neuron_cancel_subscription", {
|
|
37
|
+
title: "Cancel Subscription",
|
|
38
|
+
description: "Cancel the current active subscription. The subscription will remain active until the end of the billing period.",
|
|
39
|
+
inputSchema: z.object({}),
|
|
40
|
+
annotations: { destructiveHint: true },
|
|
41
|
+
}, async () => {
|
|
42
|
+
try {
|
|
43
|
+
const result = await api("POST", "/billing/cancel");
|
|
44
|
+
return jsonResult(result);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return errorResult(error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.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,oBAAoB,CAAC,MAAiB;IACpD,mBAAmB;IACnB,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,kGAAkG;QAC/G,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC5C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,WAAW;IACX,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,2FAA2F;QACxG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC5E,CAAC;KACH,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,YAAY,CACjB,4BAA4B,EAC5B;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,kHAAkH;QAC/H,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;KACvC,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACpD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { api, jsonResult, errorResult } from "../client.js";
|
|
3
|
+
export function registerBlogTools(server) {
|
|
4
|
+
// Create blog post
|
|
5
|
+
server.registerTool("neuron_create_blog_post", {
|
|
6
|
+
title: "Create Blog Post",
|
|
7
|
+
description: "Create a new blog post (draft or published)",
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
title: z.string().describe("Post title (max 500 chars)"),
|
|
10
|
+
content: z.string().describe("Post content (markdown)"),
|
|
11
|
+
excerpt: z.string().optional().describe("Short summary (optional)"),
|
|
12
|
+
authorType: z
|
|
13
|
+
.enum(["user", "organization"])
|
|
14
|
+
.describe("Author type"),
|
|
15
|
+
coverImageUrl: z.string().optional().describe("Cover image URL (optional)"),
|
|
16
|
+
tags: z
|
|
17
|
+
.array(z.string())
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Tag names or slugs"),
|
|
20
|
+
status: z
|
|
21
|
+
.enum(["draft", "published"])
|
|
22
|
+
.default("draft")
|
|
23
|
+
.describe("Post status"),
|
|
24
|
+
seoTitle: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("SEO title override (optional)"),
|
|
28
|
+
seoDescription: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Meta description (optional)"),
|
|
32
|
+
seoKeywords: z
|
|
33
|
+
.array(z.string())
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("SEO keywords (optional)"),
|
|
36
|
+
}),
|
|
37
|
+
}, async (params) => {
|
|
38
|
+
try {
|
|
39
|
+
const result = await api("POST", "blog/posts", {
|
|
40
|
+
title: params.title,
|
|
41
|
+
content: params.content,
|
|
42
|
+
excerpt: params.excerpt,
|
|
43
|
+
authorType: params.authorType,
|
|
44
|
+
coverImageUrl: params.coverImageUrl,
|
|
45
|
+
tags: params.tags,
|
|
46
|
+
status: params.status,
|
|
47
|
+
seoTitle: params.seoTitle,
|
|
48
|
+
seoDescription: params.seoDescription,
|
|
49
|
+
seoKeywords: params.seoKeywords,
|
|
50
|
+
});
|
|
51
|
+
return jsonResult(result);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return errorResult(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// List blog posts
|
|
58
|
+
server.registerTool("neuron_list_blog_posts", {
|
|
59
|
+
title: "List Blog Posts",
|
|
60
|
+
description: "List blog posts with filters",
|
|
61
|
+
inputSchema: z.object({
|
|
62
|
+
status: z
|
|
63
|
+
.enum(["draft", "published", "hidden"])
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Filter by status"),
|
|
66
|
+
authorType: z
|
|
67
|
+
.enum(["user", "organization"])
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Filter by author type"),
|
|
70
|
+
authorId: z
|
|
71
|
+
.string()
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("Filter by author UUID"),
|
|
74
|
+
tag: z.string().optional().describe("Filter by tag slug"),
|
|
75
|
+
page: z.number().default(1).describe("Page number"),
|
|
76
|
+
limit: z.number().default(20).describe("Results per page"),
|
|
77
|
+
}),
|
|
78
|
+
}, async (params) => {
|
|
79
|
+
try {
|
|
80
|
+
const result = await api("GET", "blog/posts", undefined, {
|
|
81
|
+
status: params.status,
|
|
82
|
+
authorType: params.authorType,
|
|
83
|
+
authorId: params.authorId,
|
|
84
|
+
tag: params.tag,
|
|
85
|
+
page: params.page,
|
|
86
|
+
limit: params.limit,
|
|
87
|
+
});
|
|
88
|
+
return jsonResult(result);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return errorResult(error);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Get blog post
|
|
95
|
+
server.registerTool("neuron_get_blog_post", {
|
|
96
|
+
title: "Get Blog Post",
|
|
97
|
+
description: "Get a blog post by slug",
|
|
98
|
+
inputSchema: z.object({
|
|
99
|
+
slug: z.string().describe("Post slug"),
|
|
100
|
+
}),
|
|
101
|
+
}, async (params) => {
|
|
102
|
+
try {
|
|
103
|
+
const result = await api("GET", `blog/posts/${params.slug}`);
|
|
104
|
+
return jsonResult(result);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return errorResult(error);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// Update blog post
|
|
111
|
+
server.registerTool("neuron_update_blog_post", {
|
|
112
|
+
title: "Update Blog Post",
|
|
113
|
+
description: "Update an existing blog post",
|
|
114
|
+
inputSchema: z.object({
|
|
115
|
+
id: z.string().describe("Post UUID"),
|
|
116
|
+
title: z.string().optional().describe("Post title"),
|
|
117
|
+
content: z.string().optional().describe("Post content"),
|
|
118
|
+
excerpt: z.string().optional().describe("Short summary"),
|
|
119
|
+
coverImageUrl: z.string().optional().describe("Cover image URL"),
|
|
120
|
+
status: z
|
|
121
|
+
.enum(["draft", "published", "hidden"])
|
|
122
|
+
.optional()
|
|
123
|
+
.describe("Post status"),
|
|
124
|
+
seoTitle: z.string().optional().describe("SEO title"),
|
|
125
|
+
seoDescription: z.string().optional().describe("Meta description"),
|
|
126
|
+
seoKeywords: z
|
|
127
|
+
.array(z.string())
|
|
128
|
+
.optional()
|
|
129
|
+
.describe("SEO keywords"),
|
|
130
|
+
}),
|
|
131
|
+
}, async (params) => {
|
|
132
|
+
try {
|
|
133
|
+
const { id, ...body } = params;
|
|
134
|
+
const result = await api("PUT", `blog/posts/${id}`, body);
|
|
135
|
+
return jsonResult(result);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return errorResult(error);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
// Delete blog post
|
|
142
|
+
server.registerTool("neuron_delete_blog_post", {
|
|
143
|
+
title: "Delete Blog Post",
|
|
144
|
+
description: "Delete a blog post",
|
|
145
|
+
inputSchema: z.object({
|
|
146
|
+
id: z.string().describe("Post UUID"),
|
|
147
|
+
}),
|
|
148
|
+
}, async (params) => {
|
|
149
|
+
try {
|
|
150
|
+
await api("DELETE", `blog/posts/${params.id}`);
|
|
151
|
+
return { content: [{ type: "text", text: "Post deleted successfully" }] };
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return errorResult(error);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
// Publish post
|
|
158
|
+
server.registerTool("neuron_publish_blog_post", {
|
|
159
|
+
title: "Publish Blog Post",
|
|
160
|
+
description: "Publish a draft post",
|
|
161
|
+
inputSchema: z.object({
|
|
162
|
+
id: z.string().describe("Post UUID"),
|
|
163
|
+
}),
|
|
164
|
+
}, async (params) => {
|
|
165
|
+
try {
|
|
166
|
+
const result = await api("POST", `blog/posts/${params.id}/publish`);
|
|
167
|
+
return jsonResult(result);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
return errorResult(error);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=blog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blog.js","sourceRoot":"","sources":["../../src/tools/blog.ts"],"names":[],"mappings":"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"}
|