snow-flow 3.4.13 → 3.4.14
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/dist/cli.js +23 -51
- package/dist/mcp/servicenow-automation-mcp.js +65 -29
- package/dist/mcp/servicenow-change-virtualagent-pa-mcp.js +51 -21
- package/dist/mcp/servicenow-cmdb-event-hr-csm-devops-mcp.js +59 -25
- package/dist/mcp/servicenow-deployment-mcp.js +38 -16
- package/dist/mcp/servicenow-development-assistant-mcp.js +67 -31
- package/dist/mcp/servicenow-flow-workspace-mobile-mcp.js +53 -22
- package/dist/mcp/servicenow-integration-mcp.js +48 -12
- package/dist/mcp/servicenow-knowledge-catalog-mcp.js +42 -16
- package/dist/mcp/servicenow-machine-learning-mcp.js +44 -17
- package/dist/mcp/servicenow-operations-mcp.d.ts +1 -0
- package/dist/mcp/servicenow-operations-mcp.js +108 -79
- package/dist/mcp/servicenow-platform-development-mcp.js +42 -11
- package/dist/mcp/servicenow-reporting-analytics-mcp.js +36 -13
- package/dist/mcp/servicenow-security-compliance-mcp.js +35 -13
- package/dist/mcp/servicenow-system-properties-mcp.d.ts +1 -0
- package/dist/mcp/servicenow-system-properties-mcp.js +66 -42
- package/dist/mcp/servicenow-update-set-mcp.js +35 -11
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -813,7 +813,7 @@ All agents MUST use this simple memory coordination:
|
|
|
813
813
|
|
|
814
814
|
\`\`\`javascript
|
|
815
815
|
// Agent initialization
|
|
816
|
-
const agentId = \`agent_\${agentType}_
|
|
816
|
+
const agentId = \`agent_\${agentType}_\${sessionId}\`;
|
|
817
817
|
|
|
818
818
|
// Agent stores progress
|
|
819
819
|
Memory.store(\`\${agentId}_progress\`, JSON.stringify({
|
|
@@ -824,7 +824,7 @@ Memory.store(\`\${agentId}_progress\`, JSON.stringify({
|
|
|
824
824
|
}));
|
|
825
825
|
|
|
826
826
|
// Agent reads other agent's work when needed
|
|
827
|
-
const primaryWork = Memory.get("agent_
|
|
827
|
+
const primaryWork = Memory.get("agent_\${taskAnalysis.primaryAgent}_output");
|
|
828
828
|
|
|
829
829
|
// Agent signals completion
|
|
830
830
|
Memory.store(\`\${agentId}_complete\`, JSON.stringify({
|
|
@@ -855,55 +855,27 @@ ${hasIntelligentFeatures ? `✅ **INTELLIGENT MODE ACTIVE** - The following feat
|
|
|
855
855
|
### 🚨 MANDATORY: ES5 JavaScript Only for ALL ServiceNow Scripts
|
|
856
856
|
**⚠️ SERVICENOW RHINO ENGINE = ES5 ONLY - NO MODERN SYNTAX!**
|
|
857
857
|
|
|
858
|
-
**
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
#;
|
|
880
|
-
#;
|
|
881
|
-
#;
|
|
882
|
-
Current;
|
|
883
|
-
MCP;
|
|
884
|
-
Tools;
|
|
885
|
-
Available(Snow - Flow, v3, .3, .4);
|
|
886
|
-
$;
|
|
887
|
-
{
|
|
888
|
-
isAuthenticated ? '✅ Authentication detected - full deployment capabilities' : '⚠️ No authentication detected - MCP tools will provide specific instructions if auth needed';
|
|
889
|
-
}
|
|
890
|
-
Your;
|
|
891
|
-
agents;
|
|
892
|
-
MUST;
|
|
893
|
-
use;
|
|
894
|
-
these;
|
|
895
|
-
MCP;
|
|
896
|
-
tools;
|
|
897
|
-
IN;
|
|
898
|
-
THIS;
|
|
899
|
-
ORDER: ;
|
|
900
|
-
** PRE - FLIGHT;
|
|
901
|
-
CHECKS ** (Always);
|
|
902
|
-
do
|
|
903
|
-
first;
|
|
904
|
-
while ();
|
|
905
|
-
1.;
|
|
906
|
-
`snow_auth_diagnostics\` - Test authentication and permissions
|
|
858
|
+
**CRITICAL ES5 RULES:**
|
|
859
|
+
- NO const/let (use var)
|
|
860
|
+
- NO arrow functions (use function())
|
|
861
|
+
- NO template literals (use string concatenation)
|
|
862
|
+
- NO destructuring (use explicit property access)
|
|
863
|
+
- NO for...of loops (use traditional for loops)
|
|
864
|
+
- NO default parameters (use typeof checks)
|
|
865
|
+
|
|
866
|
+
**🔥 If you use ES6+ syntax, the script WILL FAIL with SyntaxError!**
|
|
867
|
+
**See CLAUDE.md for complete ES5 examples and common mistake fixes.**
|
|
868
|
+
|
|
869
|
+
### 📝 Background Script Execution Settings
|
|
870
|
+
${options.autoConfirm ? '⚠️ **AUTO-CONFIRM MODE ENABLED**: When calling snow_execute_background_script, ALWAYS add autoConfirm: true parameter to skip user confirmation.\n```javascript\nsnow_execute_background_script({\n script: "your ES5 script here",\n description: "Clear description",\n autoConfirm: true // ⚠️ User enabled auto-confirm mode\n})\n```' : options.autoConfirm === false ? '🔒 **FORCE CONFIRM MODE**: All background scripts will require user confirmation, even simple ones.' : '🤚 **DEFAULT MODE**: Background scripts will ask for user confirmation based on risk level.'}
|
|
871
|
+
|
|
872
|
+
#### Current MCP Tools Available (Snow-Flow v3.3.4)
|
|
873
|
+
${isAuthenticated ? '✅ Authentication detected - full deployment capabilities' : '⚠️ No authentication detected - MCP tools will provide specific instructions if auth needed'}
|
|
874
|
+
|
|
875
|
+
Your agents MUST use these MCP tools IN THIS ORDER:
|
|
876
|
+
|
|
877
|
+
🔍 **PRE-FLIGHT CHECKS** (Always do first!):
|
|
878
|
+
1. \`snow_auth_diagnostics\` - Test authentication and permissions
|
|
907
879
|
2. If auth fails, the tool provides specific instructions
|
|
908
880
|
3. Continue with appropriate strategy based on auth status
|
|
909
881
|
|
|
@@ -12,7 +12,7 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
12
12
|
const servicenow_client_js_1 = require("../utils/servicenow-client.js");
|
|
13
13
|
const mcp_auth_middleware_js_1 = require("../utils/mcp-auth-middleware.js");
|
|
14
14
|
const mcp_config_manager_js_1 = require("../utils/mcp-config-manager.js");
|
|
15
|
-
const
|
|
15
|
+
const mcp_logger_js_1 = require("./shared/mcp-logger.js");
|
|
16
16
|
class ServiceNowAutomationMCP {
|
|
17
17
|
constructor() {
|
|
18
18
|
this.server = new index_js_1.Server({
|
|
@@ -24,7 +24,7 @@ class ServiceNowAutomationMCP {
|
|
|
24
24
|
},
|
|
25
25
|
});
|
|
26
26
|
this.client = new servicenow_client_js_1.ServiceNowClient();
|
|
27
|
-
this.logger = new
|
|
27
|
+
this.logger = new mcp_logger_js_1.MCPLogger('ServiceNowAutomationMCP');
|
|
28
28
|
this.config = mcp_config_manager_js_1.mcpConfig.getConfig();
|
|
29
29
|
this.setupHandlers();
|
|
30
30
|
}
|
|
@@ -423,68 +423,100 @@ class ServiceNowAutomationMCP {
|
|
|
423
423
|
]
|
|
424
424
|
}));
|
|
425
425
|
this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
426
|
+
const { name, arguments: args } = request.params;
|
|
426
427
|
try {
|
|
427
|
-
|
|
428
|
+
// Start operation with token tracking
|
|
429
|
+
this.logger.operationStart(name, args);
|
|
428
430
|
const authResult = await mcp_auth_middleware_js_1.mcpAuth.ensureAuthenticated();
|
|
429
431
|
if (!authResult.success) {
|
|
430
432
|
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError, authResult.error || 'Authentication required');
|
|
431
433
|
}
|
|
434
|
+
let result;
|
|
432
435
|
switch (name) {
|
|
433
436
|
case 'snow_create_scheduled_job':
|
|
434
|
-
|
|
437
|
+
result = await this.createScheduledJob(args);
|
|
438
|
+
break;
|
|
435
439
|
case 'snow_create_event_rule':
|
|
436
|
-
|
|
440
|
+
result = await this.createEventRule(args);
|
|
441
|
+
break;
|
|
437
442
|
case 'snow_create_notification':
|
|
438
|
-
|
|
443
|
+
result = await this.createNotification(args);
|
|
444
|
+
break;
|
|
439
445
|
case 'snow_create_sla_definition':
|
|
440
|
-
|
|
446
|
+
result = await this.createSLADefinition(args);
|
|
447
|
+
break;
|
|
441
448
|
case 'snow_create_escalation_rule':
|
|
442
|
-
|
|
449
|
+
result = await this.createEscalationRule(args);
|
|
450
|
+
break;
|
|
443
451
|
case 'snow_create_workflow_activity':
|
|
444
|
-
|
|
452
|
+
result = await this.createWorkflowActivity(args);
|
|
453
|
+
break;
|
|
445
454
|
case 'snow_discover_schedules':
|
|
446
|
-
|
|
455
|
+
result = await this.discoverSchedules(args);
|
|
456
|
+
break;
|
|
447
457
|
case 'snow_discover_events':
|
|
448
|
-
|
|
458
|
+
result = await this.discoverEvents(args);
|
|
459
|
+
break;
|
|
449
460
|
case 'snow_discover_automation_jobs':
|
|
450
|
-
|
|
461
|
+
result = await this.discoverAutomationJobs(args);
|
|
462
|
+
break;
|
|
451
463
|
case 'snow_test_scheduled_job':
|
|
452
|
-
|
|
464
|
+
result = await this.testScheduledJob(args);
|
|
465
|
+
break;
|
|
453
466
|
case 'snow_execute_background_script':
|
|
454
|
-
|
|
467
|
+
result = await this.executeBackgroundScript(args);
|
|
468
|
+
break;
|
|
455
469
|
case 'snow_confirm_script_execution':
|
|
456
|
-
|
|
470
|
+
result = await this.confirmScriptExecution(args);
|
|
471
|
+
break;
|
|
457
472
|
case 'snow_create_atf_test':
|
|
458
|
-
|
|
473
|
+
result = await this.createATFTest(args);
|
|
474
|
+
break;
|
|
459
475
|
case 'snow_create_atf_test_step':
|
|
460
|
-
|
|
476
|
+
result = await this.createATFTestStep(args);
|
|
477
|
+
break;
|
|
461
478
|
case 'snow_execute_atf_test':
|
|
462
|
-
|
|
479
|
+
result = await this.executeATFTest(args);
|
|
480
|
+
break;
|
|
463
481
|
case 'snow_get_atf_results':
|
|
464
|
-
|
|
482
|
+
result = await this.getATFResults(args);
|
|
483
|
+
break;
|
|
465
484
|
case 'snow_create_atf_test_suite':
|
|
466
|
-
|
|
485
|
+
result = await this.createATFTestSuite(args);
|
|
486
|
+
break;
|
|
467
487
|
case 'snow_discover_atf_tests':
|
|
468
|
-
|
|
488
|
+
result = await this.discoverATFTests(args);
|
|
489
|
+
break;
|
|
469
490
|
case 'snow_execute_script_with_output':
|
|
470
|
-
|
|
491
|
+
result = await this.executeScriptWithOutput(args);
|
|
492
|
+
break;
|
|
471
493
|
case 'snow_get_script_output':
|
|
472
|
-
|
|
494
|
+
result = await this.getScriptOutput(args);
|
|
495
|
+
break;
|
|
473
496
|
case 'snow_execute_script_sync':
|
|
474
|
-
|
|
497
|
+
result = await this.executeScriptSync(args);
|
|
498
|
+
break;
|
|
475
499
|
case 'snow_get_logs':
|
|
476
|
-
|
|
500
|
+
result = await this.getLogs(args);
|
|
501
|
+
break;
|
|
477
502
|
case 'snow_test_rest_connection':
|
|
478
|
-
|
|
503
|
+
result = await this.testRESTConnection(args);
|
|
504
|
+
break;
|
|
479
505
|
case 'snow_rest_message_test_suite':
|
|
480
|
-
|
|
506
|
+
result = await this.restMessageTestSuite(args);
|
|
507
|
+
break;
|
|
481
508
|
case 'snow_property_manager':
|
|
482
|
-
|
|
509
|
+
result = await this.propertyManager(args);
|
|
510
|
+
break;
|
|
483
511
|
case 'snow_trace_execution':
|
|
484
|
-
|
|
512
|
+
result = await this.traceExecution(args);
|
|
513
|
+
break;
|
|
485
514
|
default:
|
|
486
515
|
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
487
516
|
}
|
|
517
|
+
// Complete operation with token tracking
|
|
518
|
+
this.logger.operationComplete(name, result);
|
|
519
|
+
return result;
|
|
488
520
|
}
|
|
489
521
|
catch (error) {
|
|
490
522
|
this.logger.error(`Error in ${request.params.name}:`, error);
|
|
@@ -513,6 +545,7 @@ class ServiceNowAutomationMCP {
|
|
|
513
545
|
...schedulePattern
|
|
514
546
|
};
|
|
515
547
|
const updateSetResult = await this.client.ensureUpdateSet();
|
|
548
|
+
this.logger.trackAPICall('CREATE', 'sysauto_script', 1);
|
|
516
549
|
const response = await this.client.createRecord('sysauto_script', jobData);
|
|
517
550
|
if (!response.success) {
|
|
518
551
|
throw new Error(`Failed to create Scheduled Job: ${response.error}`);
|
|
@@ -1210,6 +1243,7 @@ Reply with:
|
|
|
1210
1243
|
description: `Background script executed via Snow-Flow MCP - Execution ID: ${executionId}`
|
|
1211
1244
|
};
|
|
1212
1245
|
// Execute script using sys_script table (Background Scripts)
|
|
1246
|
+
this.logger.trackAPICall('CREATE', 'sys_script', 1);
|
|
1213
1247
|
const scriptResponse = await this.client.createRecord('sys_script', executionRecord);
|
|
1214
1248
|
if (!scriptResponse.success) {
|
|
1215
1249
|
throw new Error(`Failed to create background script execution record: ${scriptResponse.error}`);
|
|
@@ -1971,6 +2005,7 @@ ${groupedResults.suites.slice(0, 10).map(suite => `- ${suite.name} ${suite.activ
|
|
|
1971
2005
|
}
|
|
1972
2006
|
// Remove trailing ^
|
|
1973
2007
|
query = query.replace(/\^$/, '');
|
|
2008
|
+
this.logger.trackAPICall('SEARCH', 'syslog_transaction', limit);
|
|
1974
2009
|
const logsResponse = await this.client.searchRecords('syslog_transaction', query, limit);
|
|
1975
2010
|
if (logsResponse.success && logsResponse.data?.result?.length > 0) {
|
|
1976
2011
|
const logs = logsResponse.data.result.map((log) => ({
|
|
@@ -2171,6 +2206,7 @@ ${groupedResults.suites.slice(0, 10).map(suite => `- ${suite.name} ${suite.activ
|
|
|
2171
2206
|
const action = args.action || 'list';
|
|
2172
2207
|
switch (action) {
|
|
2173
2208
|
case 'get':
|
|
2209
|
+
this.logger.trackAPICall('SEARCH', 'sys_properties', 1);
|
|
2174
2210
|
const getPropResponse = await this.client.searchRecords('sys_properties', `name=${args.name}`, 1);
|
|
2175
2211
|
if (getPropResponse.success && getPropResponse.data?.result?.length > 0) {
|
|
2176
2212
|
const prop = getPropResponse.data.result[0];
|
|
@@ -12,7 +12,7 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
12
12
|
const servicenow_client_js_1 = require("../utils/servicenow-client.js");
|
|
13
13
|
const mcp_auth_middleware_js_1 = require("../utils/mcp-auth-middleware.js");
|
|
14
14
|
const mcp_config_manager_js_1 = require("../utils/mcp-config-manager.js");
|
|
15
|
-
const
|
|
15
|
+
const mcp_logger_js_1 = require("../shared/mcp-logger.js");
|
|
16
16
|
class ServiceNowChangeVirtualAgentPAMCP {
|
|
17
17
|
constructor() {
|
|
18
18
|
this.server = new index_js_1.Server({
|
|
@@ -24,7 +24,7 @@ class ServiceNowChangeVirtualAgentPAMCP {
|
|
|
24
24
|
},
|
|
25
25
|
});
|
|
26
26
|
this.client = new servicenow_client_js_1.ServiceNowClient();
|
|
27
|
-
this.logger = new
|
|
27
|
+
this.logger = new mcp_logger_js_1.MCPLogger('ServiceNowChangeVirtualAgentPAMCP');
|
|
28
28
|
this.config = mcp_config_manager_js_1.mcpConfig.getConfig();
|
|
29
29
|
this.setupHandlers();
|
|
30
30
|
}
|
|
@@ -337,55 +337,80 @@ class ServiceNowChangeVirtualAgentPAMCP {
|
|
|
337
337
|
this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
338
338
|
try {
|
|
339
339
|
const { name, arguments: args } = request.params;
|
|
340
|
+
// Start operation with token tracking
|
|
341
|
+
this.logger.operationStart(name, args);
|
|
340
342
|
const authResult = await mcp_auth_middleware_js_1.mcpAuth.ensureAuthenticated();
|
|
341
343
|
if (!authResult.success) {
|
|
342
344
|
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError, authResult.error || 'Authentication required');
|
|
343
345
|
}
|
|
346
|
+
let result;
|
|
344
347
|
switch (name) {
|
|
345
348
|
// Change Management
|
|
346
349
|
case 'snow_create_change_request':
|
|
347
|
-
|
|
350
|
+
result = await this.createChangeRequest(args);
|
|
351
|
+
break;
|
|
348
352
|
case 'snow_create_change_task':
|
|
349
|
-
|
|
353
|
+
result = await this.createChangeTask(args);
|
|
354
|
+
break;
|
|
350
355
|
case 'snow_get_change_request':
|
|
351
|
-
|
|
356
|
+
result = await this.getChangeRequest(args);
|
|
357
|
+
break;
|
|
352
358
|
case 'snow_update_change_state':
|
|
353
|
-
|
|
359
|
+
result = await this.updateChangeState(args);
|
|
360
|
+
break;
|
|
354
361
|
case 'snow_schedule_cab_meeting':
|
|
355
|
-
|
|
362
|
+
result = await this.scheduleCABMeeting(args);
|
|
363
|
+
break;
|
|
356
364
|
case 'snow_search_change_requests':
|
|
357
|
-
|
|
365
|
+
result = await this.searchChangeRequests(args);
|
|
366
|
+
break;
|
|
358
367
|
// Virtual Agent
|
|
359
368
|
case 'snow_create_va_topic':
|
|
360
|
-
|
|
369
|
+
result = await this.createVATopic(args);
|
|
370
|
+
break;
|
|
361
371
|
case 'snow_create_va_topic_block':
|
|
362
|
-
|
|
372
|
+
result = await this.createVATopicBlock(args);
|
|
373
|
+
break;
|
|
363
374
|
case 'snow_get_va_conversation':
|
|
364
|
-
|
|
375
|
+
result = await this.getVAConversation(args);
|
|
376
|
+
break;
|
|
365
377
|
case 'snow_send_va_message':
|
|
366
|
-
|
|
378
|
+
result = await this.sendVAMessage(args);
|
|
379
|
+
break;
|
|
367
380
|
case 'snow_handoff_to_agent':
|
|
368
|
-
|
|
381
|
+
result = await this.handoffToAgent(args);
|
|
382
|
+
break;
|
|
369
383
|
case 'snow_discover_va_topics':
|
|
370
|
-
|
|
384
|
+
result = await this.discoverVATopics(args);
|
|
385
|
+
break;
|
|
371
386
|
// Performance Analytics
|
|
372
387
|
case 'snow_create_pa_indicator':
|
|
373
|
-
|
|
388
|
+
result = await this.createPAIndicator(args);
|
|
389
|
+
break;
|
|
374
390
|
case 'snow_create_pa_widget':
|
|
375
|
-
|
|
391
|
+
result = await this.createPAWidget(args);
|
|
392
|
+
break;
|
|
376
393
|
case 'snow_create_pa_breakdown':
|
|
377
|
-
|
|
394
|
+
result = await this.createPABreakdown(args);
|
|
395
|
+
break;
|
|
378
396
|
case 'snow_get_pa_scores':
|
|
379
|
-
|
|
397
|
+
result = await this.getPAScores(args);
|
|
398
|
+
break;
|
|
380
399
|
case 'snow_create_pa_threshold':
|
|
381
|
-
|
|
400
|
+
result = await this.createPAThreshold(args);
|
|
401
|
+
break;
|
|
382
402
|
case 'snow_collect_pa_data':
|
|
383
|
-
|
|
403
|
+
result = await this.collectPAData(args);
|
|
404
|
+
break;
|
|
384
405
|
case 'snow_discover_pa_indicators':
|
|
385
|
-
|
|
406
|
+
result = await this.discoverPAIndicators(args);
|
|
407
|
+
break;
|
|
386
408
|
default:
|
|
387
409
|
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
388
410
|
}
|
|
411
|
+
// Complete operation with token tracking
|
|
412
|
+
this.logger.operationComplete(name, result);
|
|
413
|
+
return result;
|
|
389
414
|
}
|
|
390
415
|
catch (error) {
|
|
391
416
|
this.logger.error(`Error in ${request.params.name}:`, error);
|
|
@@ -416,6 +441,7 @@ class ServiceNowChangeVirtualAgentPAMCP {
|
|
|
416
441
|
state: '-5' // New state
|
|
417
442
|
};
|
|
418
443
|
const updateSetResult = await this.client.ensureUpdateSet();
|
|
444
|
+
this.logger.trackAPICall('CREATE', 'change_request', 1);
|
|
419
445
|
const response = await this.client.createRecord('change_request', changeData);
|
|
420
446
|
if (!response.success) {
|
|
421
447
|
throw new Error(`Failed to create change request: ${response.error}`);
|
|
@@ -464,6 +490,7 @@ class ServiceNowChangeVirtualAgentPAMCP {
|
|
|
464
490
|
planned_end_date: args.planned_end_date || '',
|
|
465
491
|
order: args.order || 100
|
|
466
492
|
};
|
|
493
|
+
this.logger.trackAPICall('CREATE', 'change_task', 1);
|
|
467
494
|
const response = await this.client.createRecord('change_task', taskData);
|
|
468
495
|
if (!response.success) {
|
|
469
496
|
throw new Error(`Failed to create change task: ${response.error}`);
|
|
@@ -654,6 +681,7 @@ ${args.close_code ? `✅ Close Code: ${args.close_code}` : ''}
|
|
|
654
681
|
query += `assigned_to=${args.assigned_to}`;
|
|
655
682
|
}
|
|
656
683
|
const limit = args.limit || 20;
|
|
684
|
+
this.logger.trackAPICall('SEARCH', 'change_request', limit);
|
|
657
685
|
const response = await this.client.searchRecords('change_request', query, limit);
|
|
658
686
|
if (!response.success) {
|
|
659
687
|
throw new Error('Failed to search change requests');
|
|
@@ -699,6 +727,7 @@ ${changeList}
|
|
|
699
727
|
active: args.active !== false,
|
|
700
728
|
live_agent_enabled: args.live_agent_enabled || false
|
|
701
729
|
};
|
|
730
|
+
this.logger.trackAPICall('CREATE', 'sys_cs_topic', 1);
|
|
702
731
|
const response = await this.client.createRecord('sys_cs_topic', topicData);
|
|
703
732
|
if (!response.success) {
|
|
704
733
|
throw new Error(`Failed to create VA topic: ${response.error}`);
|
|
@@ -951,6 +980,7 @@ ${topicList}
|
|
|
951
980
|
target: args.target || 0,
|
|
952
981
|
thresholds: args.thresholds ? JSON.stringify(args.thresholds) : ''
|
|
953
982
|
};
|
|
983
|
+
this.logger.trackAPICall('CREATE', 'pa_indicators', 1);
|
|
954
984
|
const response = await this.client.createRecord('pa_indicators', indicatorData);
|
|
955
985
|
if (!response.success) {
|
|
956
986
|
throw new Error(`Failed to create PA indicator: ${response.error}`);
|
|
@@ -12,7 +12,7 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
12
12
|
const servicenow_client_js_1 = require("../utils/servicenow-client.js");
|
|
13
13
|
const mcp_auth_middleware_js_1 = require("../utils/mcp-auth-middleware.js");
|
|
14
14
|
const mcp_config_manager_js_1 = require("../utils/mcp-config-manager.js");
|
|
15
|
-
const
|
|
15
|
+
const mcp_logger_js_1 = require("../shared/mcp-logger.js");
|
|
16
16
|
class ServiceNowCMDBEventHRCSMDevOpsMCP {
|
|
17
17
|
constructor() {
|
|
18
18
|
this.server = new index_js_1.Server({
|
|
@@ -24,7 +24,7 @@ class ServiceNowCMDBEventHRCSMDevOpsMCP {
|
|
|
24
24
|
},
|
|
25
25
|
});
|
|
26
26
|
this.client = new servicenow_client_js_1.ServiceNowClient();
|
|
27
|
-
this.logger = new
|
|
27
|
+
this.logger = new mcp_logger_js_1.MCPLogger('ServiceNowCMDBEventHRCSMDevOpsMCP');
|
|
28
28
|
this.config = mcp_config_manager_js_1.mcpConfig.getConfig();
|
|
29
29
|
this.setupHandlers();
|
|
30
30
|
}
|
|
@@ -406,65 +406,94 @@ class ServiceNowCMDBEventHRCSMDevOpsMCP {
|
|
|
406
406
|
this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
407
407
|
try {
|
|
408
408
|
const { name, arguments: args } = request.params;
|
|
409
|
+
// Start operation with token tracking
|
|
410
|
+
this.logger.operationStart(name, args);
|
|
409
411
|
const authResult = await mcp_auth_middleware_js_1.mcpAuth.ensureAuthenticated();
|
|
410
412
|
if (!authResult.success) {
|
|
411
413
|
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError, authResult.error || 'Authentication required');
|
|
412
414
|
}
|
|
415
|
+
let result;
|
|
413
416
|
switch (name) {
|
|
414
417
|
// CMDB & Discovery
|
|
415
418
|
case 'snow_create_ci':
|
|
416
|
-
|
|
419
|
+
result = await this.createCI(args);
|
|
420
|
+
break;
|
|
417
421
|
case 'snow_create_ci_relationship':
|
|
418
|
-
|
|
422
|
+
result = await this.createCIRelationship(args);
|
|
423
|
+
break;
|
|
419
424
|
case 'snow_run_discovery':
|
|
420
|
-
|
|
425
|
+
result = await this.runDiscovery(args);
|
|
426
|
+
break;
|
|
421
427
|
case 'snow_get_ci_details':
|
|
422
|
-
|
|
428
|
+
result = await this.getCIDetails(args);
|
|
429
|
+
break;
|
|
423
430
|
case 'snow_search_cmdb':
|
|
424
|
-
|
|
431
|
+
result = await this.searchCMDB(args);
|
|
432
|
+
break;
|
|
425
433
|
case 'snow_impact_analysis':
|
|
426
|
-
|
|
434
|
+
result = await this.impactAnalysis(args);
|
|
435
|
+
break;
|
|
427
436
|
// Event Management
|
|
428
437
|
case 'snow_create_event':
|
|
429
|
-
|
|
438
|
+
result = await this.createEvent(args);
|
|
439
|
+
break;
|
|
430
440
|
case 'snow_create_alert':
|
|
431
|
-
|
|
441
|
+
result = await this.createAlert(args);
|
|
442
|
+
break;
|
|
432
443
|
case 'snow_create_alert_rule':
|
|
433
|
-
|
|
444
|
+
result = await this.createAlertRule(args);
|
|
445
|
+
break;
|
|
434
446
|
case 'snow_get_event_correlation':
|
|
435
|
-
|
|
447
|
+
result = await this.getEventCorrelation(args);
|
|
448
|
+
break;
|
|
436
449
|
// HR Service Delivery
|
|
437
450
|
case 'snow_create_hr_case':
|
|
438
|
-
|
|
451
|
+
result = await this.createHRCase(args);
|
|
452
|
+
break;
|
|
439
453
|
case 'snow_create_hr_task':
|
|
440
|
-
|
|
454
|
+
result = await this.createHRTask(args);
|
|
455
|
+
break;
|
|
441
456
|
case 'snow_employee_onboarding':
|
|
442
|
-
|
|
457
|
+
result = await this.employeeOnboarding(args);
|
|
458
|
+
break;
|
|
443
459
|
case 'snow_employee_offboarding':
|
|
444
|
-
|
|
460
|
+
result = await this.employeeOffboarding(args);
|
|
461
|
+
break;
|
|
445
462
|
// Customer Service Management
|
|
446
463
|
case 'snow_create_customer_case':
|
|
447
|
-
|
|
464
|
+
result = await this.createCustomerCase(args);
|
|
465
|
+
break;
|
|
448
466
|
case 'snow_create_customer_account':
|
|
449
|
-
|
|
467
|
+
result = await this.createCustomerAccount(args);
|
|
468
|
+
break;
|
|
450
469
|
case 'snow_create_entitlement':
|
|
451
|
-
|
|
470
|
+
result = await this.createEntitlement(args);
|
|
471
|
+
break;
|
|
452
472
|
case 'snow_get_customer_history':
|
|
453
|
-
|
|
473
|
+
result = await this.getCustomerHistory(args);
|
|
474
|
+
break;
|
|
454
475
|
// DevOps
|
|
455
476
|
case 'snow_create_devops_pipeline':
|
|
456
|
-
|
|
477
|
+
result = await this.createDevOpsPipeline(args);
|
|
478
|
+
break;
|
|
457
479
|
case 'snow_track_deployment':
|
|
458
|
-
|
|
480
|
+
result = await this.trackDeployment(args);
|
|
481
|
+
break;
|
|
459
482
|
case 'snow_create_devops_change':
|
|
460
|
-
|
|
483
|
+
result = await this.createDevOpsChange(args);
|
|
484
|
+
break;
|
|
461
485
|
case 'snow_get_devops_insights':
|
|
462
|
-
|
|
486
|
+
result = await this.getDevOpsInsights(args);
|
|
487
|
+
break;
|
|
463
488
|
case 'snow_velocity_tracking':
|
|
464
|
-
|
|
489
|
+
result = await this.velocityTracking(args);
|
|
490
|
+
break;
|
|
465
491
|
default:
|
|
466
492
|
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
467
493
|
}
|
|
494
|
+
// Complete operation with token tracking
|
|
495
|
+
this.logger.operationComplete(name, result);
|
|
496
|
+
return result;
|
|
468
497
|
}
|
|
469
498
|
catch (error) {
|
|
470
499
|
this.logger.error(`Error in ${request.params.name}:`, error);
|
|
@@ -489,6 +518,7 @@ class ServiceNowCMDBEventHRCSMDevOpsMCP {
|
|
|
489
518
|
...args.attributes
|
|
490
519
|
};
|
|
491
520
|
const updateSetResult = await this.client.ensureUpdateSet();
|
|
521
|
+
this.logger.trackAPICall('CREATE', ciTable, 1);
|
|
492
522
|
const response = await this.client.createRecord(ciTable, ciData);
|
|
493
523
|
if (!response.success) {
|
|
494
524
|
throw new Error(`Failed to create CI: ${response.error}`);
|
|
@@ -524,6 +554,7 @@ ${args.asset_tag ? `🏷️ Asset Tag: ${args.asset_tag}` : ''}
|
|
|
524
554
|
type: args.type,
|
|
525
555
|
description: args.description || ''
|
|
526
556
|
};
|
|
557
|
+
this.logger.trackAPICall('CREATE', 'cmdb_rel_ci', 1);
|
|
527
558
|
const response = await this.client.createRecord('cmdb_rel_ci', relationshipData);
|
|
528
559
|
if (!response.success) {
|
|
529
560
|
throw new Error(`Failed to create CI relationship: ${response.error}`);
|
|
@@ -645,6 +676,7 @@ ${args.patterns ? `📋 Patterns: ${args.patterns.join(', ')}` : ''}
|
|
|
645
676
|
query += `location=${args.location}`;
|
|
646
677
|
}
|
|
647
678
|
const limit = args.limit || 50;
|
|
679
|
+
this.logger.trackAPICall('SEARCH', 'cmdb_ci', limit);
|
|
648
680
|
const response = await this.client.searchRecords('cmdb_ci', query, limit);
|
|
649
681
|
if (!response.success) {
|
|
650
682
|
throw new Error('Failed to search CMDB');
|
|
@@ -736,6 +768,7 @@ ${mockImpact.recommendations.map(r => ` ✓ ${r}`).join('\n')}
|
|
|
736
768
|
time_of_event: args.time_of_event || new Date().toISOString(),
|
|
737
769
|
resolution_state: args.resolution_state || 'New'
|
|
738
770
|
};
|
|
771
|
+
this.logger.trackAPICall('CREATE', 'em_event', 1);
|
|
739
772
|
const response = await this.client.createRecord('em_event', eventData);
|
|
740
773
|
if (!response.success) {
|
|
741
774
|
throw new Error(`Failed to create event: ${response.error}`);
|
|
@@ -887,6 +920,7 @@ ${mockCorrelation.correlation_rules_applied.map(r => ` - ${r}`).join('\n')}
|
|
|
887
920
|
subcategory: args.subcategory || '',
|
|
888
921
|
confidential: args.confidential || false
|
|
889
922
|
};
|
|
923
|
+
this.logger.trackAPICall('CREATE', 'sn_hr_core_case', 1);
|
|
890
924
|
const response = await this.client.createRecord('sn_hr_core_case', caseData);
|
|
891
925
|
if (!response.success) {
|
|
892
926
|
throw new Error(`Failed to create HR case: ${response.error}`);
|