@mentionova/mcp-server 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +158 -0
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -249,6 +249,60 @@ server.tool(
249
249
  }
250
250
  );
251
251
 
252
+ // --- Write: Workspaces ---
253
+
254
+ server.tool(
255
+ "mentionova_create_workspace",
256
+ "Create a new workspace to track a brand's AI search visibility",
257
+ {
258
+ name: z.string().describe("Workspace name (e.g. brand or client name)"),
259
+ description: z.string().optional().describe("Description"),
260
+ website_url: z.string().optional().describe("Brand website URL"),
261
+ industry: z.string().optional().describe("Industry"),
262
+ competitor_domains: z.array(z.string()).optional().describe("Competitor website domains"),
263
+ competitor_names: z.array(z.string()).optional().describe("Competitor brand names"),
264
+ seed_keywords: z.array(z.string()).optional().describe("Initial keywords to track"),
265
+ brand_aliases: z.array(z.string()).optional().describe("Alternative brand names"),
266
+ },
267
+ async (params) => {
268
+ const data = await apiPost("/workspaces", params);
269
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
270
+ }
271
+ );
272
+
273
+ server.tool(
274
+ "mentionova_update_workspace",
275
+ "Update a workspace's name, competitors, keywords, or other settings",
276
+ {
277
+ workspace_id: z.string().describe("Workspace UUID"),
278
+ name: z.string().optional().describe("New name"),
279
+ description: z.string().optional().describe("New description"),
280
+ website_url: z.string().optional().describe("New website URL"),
281
+ industry: z.string().optional().describe("New industry"),
282
+ competitor_domains: z.array(z.string()).optional().describe("New competitor domains"),
283
+ competitor_names: z.array(z.string()).optional().describe("New competitor names"),
284
+ seed_keywords: z.array(z.string()).optional().describe("New keywords"),
285
+ brand_aliases: z.array(z.string()).optional().describe("New brand aliases"),
286
+ client_context: z.string().optional().describe("Client context/brief"),
287
+ },
288
+ async ({ workspace_id, ...body }) => {
289
+ const data = await apiPatch(`/workspaces/${workspace_id}`, body);
290
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
291
+ }
292
+ );
293
+
294
+ server.tool(
295
+ "mentionova_delete_workspace",
296
+ "Delete a workspace and all its prompts, runs, citations, and data",
297
+ {
298
+ workspace_id: z.string().describe("Workspace UUID"),
299
+ },
300
+ async ({ workspace_id }) => {
301
+ const data = await apiDelete(`/workspaces/${workspace_id}`);
302
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
303
+ }
304
+ );
305
+
252
306
  // --- Write: Prompts ---
253
307
 
254
308
  server.tool(
@@ -315,6 +369,110 @@ server.tool(
315
369
  }
316
370
  );
317
371
 
372
+ // --- Write: Runs ---
373
+
374
+ server.tool(
375
+ "mentionova_delete_run",
376
+ "Delete a specific run and its associated data",
377
+ {
378
+ workspace_id: z.string().describe("Workspace UUID"),
379
+ run_id: z.string().describe("Run UUID to delete"),
380
+ },
381
+ async ({ workspace_id, run_id }) => {
382
+ const data = await apiDelete(`/workspaces/${workspace_id}/runs?run_id=${run_id}`);
383
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
384
+ }
385
+ );
386
+
387
+ // --- Write: Citations ---
388
+
389
+ server.tool(
390
+ "mentionova_delete_citation",
391
+ "Delete a specific citation",
392
+ {
393
+ workspace_id: z.string().describe("Workspace UUID"),
394
+ citation_id: z.string().describe("Citation UUID to delete"),
395
+ },
396
+ async ({ workspace_id, citation_id }) => {
397
+ const data = await apiDelete(`/workspaces/${workspace_id}/citations?citation_id=${citation_id}`);
398
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
399
+ }
400
+ );
401
+
402
+ // --- Write: Grids ---
403
+
404
+ server.tool(
405
+ "mentionova_create_grid",
406
+ "Create a new content grid in a workspace",
407
+ {
408
+ workspace_id: z.string().describe("Workspace UUID"),
409
+ name: z.string().describe("Grid name"),
410
+ description: z.string().optional().describe("Grid description"),
411
+ template_id: z.string().optional().describe("Template UUID to base grid on"),
412
+ },
413
+ async ({ workspace_id, ...body }) => {
414
+ const data = await apiPost(`/workspaces/${workspace_id}/grids`, body);
415
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
416
+ }
417
+ );
418
+
419
+ server.tool(
420
+ "mentionova_update_grid",
421
+ "Update a grid's name, description, or status",
422
+ {
423
+ workspace_id: z.string().describe("Workspace UUID"),
424
+ grid_id: z.string().describe("Grid UUID"),
425
+ name: z.string().optional().describe("New name"),
426
+ description: z.string().optional().describe("New description"),
427
+ status: z.enum(["active", "archived"]).optional().describe("New status"),
428
+ },
429
+ async ({ workspace_id, ...body }) => {
430
+ const data = await apiPatch(`/workspaces/${workspace_id}/grids`, body);
431
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
432
+ }
433
+ );
434
+
435
+ server.tool(
436
+ "mentionova_delete_grid",
437
+ "Delete a grid",
438
+ {
439
+ workspace_id: z.string().describe("Workspace UUID"),
440
+ grid_id: z.string().describe("Grid UUID to delete"),
441
+ },
442
+ async ({ workspace_id, grid_id }) => {
443
+ const data = await apiDelete(`/workspaces/${workspace_id}/grids?grid_id=${grid_id}`);
444
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
445
+ }
446
+ );
447
+
448
+ // --- Write: Alerts ---
449
+
450
+ server.tool(
451
+ "mentionova_mark_alert_read",
452
+ "Mark an alert/notification as read",
453
+ {
454
+ workspace_id: z.string().describe("Workspace UUID"),
455
+ alert_id: z.string().describe("Alert UUID"),
456
+ },
457
+ async ({ workspace_id, alert_id }) => {
458
+ const data = await apiPatch(`/workspaces/${workspace_id}/alerts`, { alert_id });
459
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
460
+ }
461
+ );
462
+
463
+ server.tool(
464
+ "mentionova_delete_alert",
465
+ "Delete an alert/notification",
466
+ {
467
+ workspace_id: z.string().describe("Workspace UUID"),
468
+ alert_id: z.string().describe("Alert UUID to delete"),
469
+ },
470
+ async ({ workspace_id, alert_id }) => {
471
+ const data = await apiDelete(`/workspaces/${workspace_id}/alerts?alert_id=${alert_id}`);
472
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
473
+ }
474
+ );
475
+
318
476
  // Start the server
319
477
  const transport = new StdioServerTransport();
320
478
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mentionova/mcp-server",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "MCP server for the Mentionova API - connect AI assistants to your AI search visibility data",
5
5
  "type": "module",
6
6
  "main": "index.js",