@velaro/mcp-server 0.6.81 → 0.6.83

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/package.json +1 -1
  2. package/server.js +69 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@velaro/mcp-server",
3
- "version": "0.6.81",
3
+ "version": "0.6.83",
4
4
  "description": "Velaro MCP server — connect Claude and other AI agents directly to your Velaro account: KB, workflows, bots, conversations, contacts, routing, and more.",
5
5
  "type": "module",
6
6
  "bin": {
package/server.js CHANGED
@@ -492,6 +492,38 @@ const TOOLS = [
492
492
  description: 'List all KB topics. Call this first to find the topicId needed for creating articles.',
493
493
  inputSchema: { type: 'object', properties: {}, required: [] },
494
494
  },
495
+ {
496
+ name: 'kb_list_categories',
497
+ description: 'List KB categories. Topics hang under a category; use with kb_create_topic.',
498
+ inputSchema: { type: 'object', properties: {}, required: [] },
499
+ },
500
+ {
501
+ name: 'kb_create_category',
502
+ description: 'Create a KB category. Seed the topic tree (category -> topic) BEFORE creating articles when the right topic does not exist.',
503
+ inputSchema: {
504
+ type: 'object',
505
+ properties: {
506
+ name: { type: 'string', description: 'Category name' },
507
+ priority: { type: 'number', description: 'Display priority (lower sorts first)' },
508
+ icon: { type: 'string', description: 'Optional icon name' },
509
+ },
510
+ required: ['name'],
511
+ },
512
+ },
513
+ {
514
+ name: 'kb_create_topic',
515
+ description: 'Create a KB topic under a category and return its id for kb_create_article.',
516
+ inputSchema: {
517
+ type: 'object',
518
+ properties: {
519
+ name: { type: 'string', description: 'Topic name' },
520
+ slug: { type: 'string', description: 'URL slug' },
521
+ categoryId: { type: 'string', description: 'Category id from kb_list_categories' },
522
+ priority: { type: 'number', description: 'Display priority (lower sorts first)' },
523
+ },
524
+ required: ['name', 'slug'],
525
+ },
526
+ },
495
527
  {
496
528
  name: 'kb_search_articles',
497
529
  description: 'Search KB articles. Returns id, title, slug, topicName, hitCount, isPublished, and public URL.',
@@ -3033,7 +3065,7 @@ For multiSelect dynamic options: the variable named in dynamicOptionsVariable mu
3033
3065
  },
3034
3066
  {
3035
3067
  name: 'support_bulk_set_flags',
3036
- description: 'Set multiple subscription feature flags AND/OR numeric caps on a site in one call. SuperAdmin only. Use to restore a test/internal site, enable a batch of features, or set caps like maxEmailCampaignSendsPerMonth. Pass flags as an object e.g. {"enableAI": true, "maxEmailCampaignSendsPerMonth": 500}. Unknown or type-mismatched keys come back in the response\'s "skipped" list — check it, do not assume everything applied.',
3068
+ description: 'Set multiple subscription feature flags AND/OR numeric caps on a site in one call. SuperAdmin only. Use to restore a test/internal site, enable a batch of features, or set caps like maxEmailCampaignSendsPerMonth or maxBotTurnsPerMonth (monthly AI bot turns; 0 = plan value, never unlimited). Pass flags as an object e.g. {"enableAI": true, "maxEmailCampaignSendsPerMonth": 500, "maxBotTurnsPerMonth": 10000}. Unknown or type-mismatched keys come back in the response\'s "skipped" list — check it, do not assume everything applied.',
3037
3069
  inputSchema: {
3038
3070
  type: 'object',
3039
3071
  properties: {
@@ -4354,6 +4386,16 @@ For multiSelect dynamic options: the variable named in dynamicOptionsVariable mu
4354
4386
  description: 'Backfill SiteSubscription rows from active Subscription rows in the messaging DB. Skips sites that already have a live SiteSubscription. Run once to seed historical state before reconciliation. Superadmin only.',
4355
4387
  inputSchema: { type: 'object', properties: {} },
4356
4388
  },
4389
+ {
4390
+ name: 'entitlement_backfill_sap_tiers',
4391
+ description: 'Grant the four SAP add-on packages (Sales, Service, Finance, Supply Chain) to existing SAP sites after the package split. Dry run by default; pass apply=true to write. Superadmin only.',
4392
+ inputSchema: { type: 'object', properties: { apply: { type: 'boolean', description: 'true writes the grants; default is a dry run' } } },
4393
+ },
4394
+ {
4395
+ name: 'entitlement_backfill_legacy_write_tiers',
4396
+ description: 'Grant EnableServiceNowWrite / EnableAccelaWrite / EnableQuickBooksWrite to existing sites after the dead OR-gate sweep so write skills are not lost. Dry run by default; pass apply=true to write. Superadmin only.',
4397
+ inputSchema: { type: 'object', properties: { apply: { type: 'boolean', description: 'true writes the grants; default is a dry run' } } },
4398
+ },
4357
4399
  {
4358
4400
  name: 'entitlement_reconcile',
4359
4401
  description: 'Diff Subscription.cs bool flags vs the entitlements API for a site. Returns deltaCount and the specific deltas. Zero deltas = site is ready for entitlements cutover. Superadmin only.',
@@ -5336,6 +5378,22 @@ async function handleTool(name, args) {
5336
5378
  || 'No topics found.';
5337
5379
  }
5338
5380
 
5381
+ case 'kb_list_categories': {
5382
+ const data = await api('GET', '/api/kb/categories');
5383
+ const cats = data?.categories ?? [];
5384
+ return cats.map(c => `[${c.id}] ${c.name} (priority ${c.displayPriority})`).join('\n') || 'No categories found.';
5385
+ }
5386
+
5387
+ case 'kb_create_category': {
5388
+ const c = await api('POST', '/api/kb/categories', { name: args.name, displayPriority: args.priority ?? 0, icon: args.icon });
5389
+ return `Category created: [${c.id}] ${c.name}`;
5390
+ }
5391
+
5392
+ case 'kb_create_topic': {
5393
+ const t = await api('POST', '/api/kb/topics', { name: args.name, slug: args.slug, categoryId: args.categoryId, displayPriority: args.priority ?? 0 });
5394
+ return `Topic created: [${t.id}] ${t.name} (slug ${t.slug})`;
5395
+ }
5396
+
5339
5397
  case 'kb_search_articles': {
5340
5398
  const data = await api('POST', '/api/kb/articles/search', {
5341
5399
  searchTerm: args.searchTerm,
@@ -9558,6 +9616,16 @@ async function handleTool(name, args) {
9558
9616
  return `✅ Backfill complete: ${result.inserted} inserted, ${result.skipped} already existed, ${result.unknownPlan} skipped (unknown plan).`;
9559
9617
  }
9560
9618
 
9619
+ case 'entitlement_backfill_sap_tiers': {
9620
+ const result = await api('POST', `/Entitlements/admin/backfill-sap-tiers?dryRun=${args.apply ? 'false' : 'true'}`);
9621
+ return `${args.apply ? 'APPLIED' : 'DRY RUN'}: ${JSON.stringify(result, null, 2)}`;
9622
+ }
9623
+
9624
+ case 'entitlement_backfill_legacy_write_tiers': {
9625
+ const result = await api('POST', `/Entitlements/admin/backfill-legacy-write-tiers?dryRun=${args.apply ? 'false' : 'true'}`);
9626
+ return `${args.apply ? 'APPLIED' : 'DRY RUN'}: ${JSON.stringify(result, null, 2)}`;
9627
+ }
9628
+
9561
9629
  case 'entitlement_reconcile': {
9562
9630
  if (!args.siteId) throw new Error('siteId is required');
9563
9631
  const result = await api('GET', `/Entitlements/admin/reconcile/${args.siteId}`);