@sonisoft/now-sdk-ext-mcp 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.
Files changed (102) hide show
  1. package/README.md +393 -0
  2. package/dist/common/connection.d.ts +42 -0
  3. package/dist/common/connection.d.ts.map +1 -0
  4. package/dist/common/connection.js +119 -0
  5. package/dist/common/connection.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +108 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tools/aggregate.d.ts +20 -0
  11. package/dist/tools/aggregate.d.ts.map +1 -0
  12. package/dist/tools/aggregate.js +271 -0
  13. package/dist/tools/aggregate.js.map +1 -0
  14. package/dist/tools/app-manager.d.ts +50 -0
  15. package/dist/tools/app-manager.d.ts.map +1 -0
  16. package/dist/tools/app-manager.js +756 -0
  17. package/dist/tools/app-manager.js.map +1 -0
  18. package/dist/tools/atf.d.ts +16 -0
  19. package/dist/tools/atf.d.ts.map +1 -0
  20. package/dist/tools/atf.js +246 -0
  21. package/dist/tools/atf.js.map +1 -0
  22. package/dist/tools/attachment.d.ts +20 -0
  23. package/dist/tools/attachment.d.ts.map +1 -0
  24. package/dist/tools/attachment.js +223 -0
  25. package/dist/tools/attachment.js.map +1 -0
  26. package/dist/tools/batch.d.ts +15 -0
  27. package/dist/tools/batch.d.ts.map +1 -0
  28. package/dist/tools/batch.js +159 -0
  29. package/dist/tools/batch.js.map +1 -0
  30. package/dist/tools/cmdb.d.ts +14 -0
  31. package/dist/tools/cmdb.d.ts.map +1 -0
  32. package/dist/tools/cmdb.js +199 -0
  33. package/dist/tools/cmdb.js.map +1 -0
  34. package/dist/tools/codesearch.d.ts +31 -0
  35. package/dist/tools/codesearch.d.ts.map +1 -0
  36. package/dist/tools/codesearch.js +371 -0
  37. package/dist/tools/codesearch.js.map +1 -0
  38. package/dist/tools/discovery.d.ts +15 -0
  39. package/dist/tools/discovery.d.ts.map +1 -0
  40. package/dist/tools/discovery.js +204 -0
  41. package/dist/tools/discovery.js.map +1 -0
  42. package/dist/tools/execute-script.d.ts +9 -0
  43. package/dist/tools/execute-script.d.ts.map +1 -0
  44. package/dist/tools/execute-script.js +106 -0
  45. package/dist/tools/execute-script.js.map +1 -0
  46. package/dist/tools/find-atf-tests.d.ts +9 -0
  47. package/dist/tools/find-atf-tests.d.ts.map +1 -0
  48. package/dist/tools/find-atf-tests.js +152 -0
  49. package/dist/tools/find-atf-tests.js.map +1 -0
  50. package/dist/tools/health.d.ts +9 -0
  51. package/dist/tools/health.d.ts.map +1 -0
  52. package/dist/tools/health.js +137 -0
  53. package/dist/tools/health.js.map +1 -0
  54. package/dist/tools/lookup-app.d.ts +11 -0
  55. package/dist/tools/lookup-app.d.ts.map +1 -0
  56. package/dist/tools/lookup-app.js +242 -0
  57. package/dist/tools/lookup-app.js.map +1 -0
  58. package/dist/tools/lookup-columns.d.ts +10 -0
  59. package/dist/tools/lookup-columns.d.ts.map +1 -0
  60. package/dist/tools/lookup-columns.js +180 -0
  61. package/dist/tools/lookup-columns.js.map +1 -0
  62. package/dist/tools/lookup-table.d.ts +10 -0
  63. package/dist/tools/lookup-table.d.ts.map +1 -0
  64. package/dist/tools/lookup-table.js +150 -0
  65. package/dist/tools/lookup-table.js.map +1 -0
  66. package/dist/tools/query-batch.d.ts +16 -0
  67. package/dist/tools/query-batch.d.ts.map +1 -0
  68. package/dist/tools/query-batch.js +197 -0
  69. package/dist/tools/query-batch.js.map +1 -0
  70. package/dist/tools/query-syslog.d.ts +9 -0
  71. package/dist/tools/query-syslog.d.ts.map +1 -0
  72. package/dist/tools/query-syslog.js +127 -0
  73. package/dist/tools/query-syslog.js.map +1 -0
  74. package/dist/tools/query-table.d.ts +8 -0
  75. package/dist/tools/query-table.d.ts.map +1 -0
  76. package/dist/tools/query-table.js +137 -0
  77. package/dist/tools/query-table.js.map +1 -0
  78. package/dist/tools/schema.d.ts +24 -0
  79. package/dist/tools/schema.d.ts.map +1 -0
  80. package/dist/tools/schema.js +321 -0
  81. package/dist/tools/schema.js.map +1 -0
  82. package/dist/tools/scope.d.ts +25 -0
  83. package/dist/tools/scope.d.ts.map +1 -0
  84. package/dist/tools/scope.js +226 -0
  85. package/dist/tools/scope.js.map +1 -0
  86. package/dist/tools/scriptsync.d.ts +14 -0
  87. package/dist/tools/scriptsync.d.ts.map +1 -0
  88. package/dist/tools/scriptsync.js +167 -0
  89. package/dist/tools/scriptsync.js.map +1 -0
  90. package/dist/tools/task.d.ts +39 -0
  91. package/dist/tools/task.d.ts.map +1 -0
  92. package/dist/tools/task.js +390 -0
  93. package/dist/tools/task.js.map +1 -0
  94. package/dist/tools/updateset.d.ts +46 -0
  95. package/dist/tools/updateset.d.ts.map +1 -0
  96. package/dist/tools/updateset.js +475 -0
  97. package/dist/tools/updateset.js.map +1 -0
  98. package/dist/tools/workflow.d.ts +9 -0
  99. package/dist/tools/workflow.d.ts.map +1 -0
  100. package/dist/tools/workflow.js +164 -0
  101. package/dist/tools/workflow.js.map +1 -0
  102. package/package.json +68 -0
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ import { BackgroundScriptExecutor } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the execute_script tool on the MCP server.
6
+ *
7
+ * This tool executes JavaScript on a ServiceNow instance via Scripts - Background
8
+ * (the /sys.scripts.do endpoint). It mirrors the behavior of the CLI's `exec` command.
9
+ */
10
+ export function registerExecuteScriptTool(server) {
11
+ server.registerTool("execute_script", {
12
+ title: "Execute Background Script",
13
+ description: "Execute JavaScript on a ServiceNow instance using Scripts - Background. " +
14
+ "The script runs server-side with full GlideSystem API access (gs, GlideRecord, " +
15
+ "GlideAggregate, etc.). Use gs.print() to produce output. " +
16
+ "Scripts execute with the permissions of the authenticated user.\n\n" +
17
+ "IMPORTANT: This executes code directly on the ServiceNow instance. " +
18
+ "Always review scripts before execution and prefer read-only operations " +
19
+ "unless modification is explicitly intended.",
20
+ inputSchema: {
21
+ instance: z
22
+ .string()
23
+ .optional()
24
+ .describe("The ServiceNow instance auth alias to execute the script on. " +
25
+ "This is the alias configured via `snc configure` (e.g., " +
26
+ '"dev224436", "prod", "test"). The user will typically refer to ' +
27
+ "this by name when saying things like \"on my dev224436 instance\". " +
28
+ "If not provided, falls back to the SN_AUTH_ALIAS environment variable."),
29
+ script: z
30
+ .string()
31
+ .describe("The JavaScript code to execute on the ServiceNow instance. " +
32
+ "Use gs.print() to output results. The script runs in the server-side " +
33
+ "GlideSystem context with access to GlideRecord, GlideAggregate, " +
34
+ "gs.getUser(), gs.now(), and all standard ServiceNow server-side APIs."),
35
+ scope: z
36
+ .string()
37
+ .default("global")
38
+ .describe('The application scope to execute the script in. Use "global" for ' +
39
+ "global scope, or specify an application scope (e.g., " +
40
+ '"x_myapp_custom") to run within that application\'s context.'),
41
+ params: z
42
+ .record(z.string())
43
+ .optional()
44
+ .describe("Optional key-value pairs for parameter substitution. " +
45
+ "Occurrences of {paramName} in the script will be replaced with " +
46
+ "the corresponding value. Example: { \"table\": \"incident\", " +
47
+ '"field": "priority" } replaces {table} and {field} in the script.'),
48
+ },
49
+ }, async ({ instance, script, scope, params }) => {
50
+ try {
51
+ // Apply parameter substitutions if provided
52
+ let processedScript = script;
53
+ if (params && Object.keys(params).length > 0) {
54
+ for (const [key, value] of Object.entries(params)) {
55
+ const placeholder = `{${key}}`;
56
+ processedScript = processedScript.split(placeholder).join(value);
57
+ }
58
+ }
59
+ const result = await withConnectionRetry(instance, async (snInstance) => {
60
+ const executor = new BackgroundScriptExecutor(snInstance, scope);
61
+ return await executor.executeScript(processedScript, scope, snInstance);
62
+ });
63
+ if (!result || !result.scriptResults) {
64
+ return {
65
+ content: [
66
+ {
67
+ type: "text",
68
+ text: "Script executed but returned no output. If you expected output, make sure your script uses gs.print() or gs.info().",
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ // Build structured output
74
+ const scriptLines = result.scriptResults
75
+ .filter((line) => line.line && line.line.trim().length > 0)
76
+ .map((line) => line.line);
77
+ const output = scriptLines.join("\n");
78
+ // Include affected records info if present
79
+ let fullOutput = output;
80
+ if (result.affectedRecords) {
81
+ fullOutput += `\n\n[Affected Records: ${result.affectedRecords}]`;
82
+ }
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: fullOutput || "(Script produced no output)",
88
+ },
89
+ ],
90
+ };
91
+ }
92
+ catch (error) {
93
+ const message = error instanceof Error ? error.message : String(error);
94
+ return {
95
+ content: [
96
+ {
97
+ type: "text",
98
+ text: `Error executing script: ${message}`,
99
+ },
100
+ ],
101
+ isError: true,
102
+ };
103
+ }
104
+ });
105
+ }
106
+ //# sourceMappingURL=execute-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-script.js","sourceRoot":"","sources":["../../src/tools/execute-script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the find_atf_tests tool on the MCP server.
4
+ *
5
+ * Searches the sys_atf_test table to find ATF tests by name, description,
6
+ * or category. Returns results that can be fed into run_atf_test.
7
+ */
8
+ export declare function registerFindAtfTestsTool(server: McpServer): void;
9
+ //# sourceMappingURL=find-atf-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-atf-tests.d.ts","sourceRoot":"","sources":["../../src/tools/find-atf-tests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwKhE"}
@@ -0,0 +1,152 @@
1
+ import { z } from "zod";
2
+ import { TableAPIRequest } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry, isRetryableResponse, } from "../common/connection.js";
4
+ /**
5
+ * Registers the find_atf_tests tool on the MCP server.
6
+ *
7
+ * Searches the sys_atf_test table to find ATF tests by name, description,
8
+ * or category. Returns results that can be fed into run_atf_test.
9
+ */
10
+ export function registerFindAtfTestsTool(server) {
11
+ server.registerTool("find_atf_tests", {
12
+ title: "Find ATF Tests",
13
+ description: "Search for ATF (Automated Test Framework) tests on a ServiceNow instance. " +
14
+ "Find tests by name, description, or category. Returns a list of matching tests " +
15
+ "with their sys_ids, which can then be passed to the run_atf_test tool for execution.\n\n" +
16
+ "Use this when you need to discover which ATF tests exist before running them.",
17
+ inputSchema: {
18
+ instance: z
19
+ .string()
20
+ .optional()
21
+ .describe("The ServiceNow instance auth alias (e.g., " +
22
+ '"dev224436", "prod"). If not provided, falls back ' +
23
+ "to the SN_AUTH_ALIAS environment variable."),
24
+ search_term: z
25
+ .string()
26
+ .optional()
27
+ .describe("Text to search for in test name and description fields. " +
28
+ "Case-insensitive contains matching. " +
29
+ 'Example: "incident" finds tests with "incident" in the name or description.'),
30
+ category: z
31
+ .string()
32
+ .optional()
33
+ .describe('Filter by test category (e.g., "Custom", "Module"). ' +
34
+ "Maps to the sys_atf_test.category field."),
35
+ active: z
36
+ .boolean()
37
+ .default(true)
38
+ .describe("Filter by active status. Defaults to true (only active tests). " +
39
+ "Set to false to find only inactive tests."),
40
+ limit: z
41
+ .number()
42
+ .int()
43
+ .min(1)
44
+ .max(100)
45
+ .default(25)
46
+ .describe("Maximum number of tests to return. Default is 25."),
47
+ },
48
+ }, async ({ instance, search_term, category, active, limit }) => {
49
+ try {
50
+ const response = await withConnectionRetry(instance, async (snInstance) => {
51
+ const tableApi = new TableAPIRequest(snInstance);
52
+ // Build encoded query using ^NQ for safe OR grouping when search_term
53
+ // is provided. This ensures active/category filters apply to both
54
+ // name and description branches.
55
+ let encodedQuery;
56
+ if (search_term) {
57
+ encodedQuery = `active=${active}^nameLIKE${search_term}`;
58
+ if (category)
59
+ encodedQuery += `^category=${category}`;
60
+ encodedQuery += `^NQactive=${active}^descriptionLIKE${search_term}`;
61
+ if (category)
62
+ encodedQuery += `^category=${category}`;
63
+ }
64
+ else {
65
+ encodedQuery = `active=${active}`;
66
+ if (category)
67
+ encodedQuery += `^category=${category}`;
68
+ }
69
+ encodedQuery += "^ORDERBYname";
70
+ const queryParams = {
71
+ sysparm_query: encodedQuery,
72
+ sysparm_fields: "sys_id,name,description,active,category,sys_updated_on",
73
+ sysparm_limit: limit,
74
+ sysparm_display_value: "false",
75
+ };
76
+ const resp = await tableApi.get("sys_atf_test", queryParams);
77
+ if (isRetryableResponse(resp)) {
78
+ const status = resp?.status ?? "unknown";
79
+ throw new Error(`HTTP ${status} searching ATF tests`);
80
+ }
81
+ return resp;
82
+ });
83
+ if (response.status !== 200) {
84
+ return {
85
+ content: [
86
+ {
87
+ type: "text",
88
+ text: `Error searching ATF tests: HTTP ${response.status}`,
89
+ },
90
+ ],
91
+ isError: true,
92
+ };
93
+ }
94
+ const tests = response.bodyObject?.result ?? [];
95
+ const lines = [];
96
+ lines.push("=== ATF Test Search Results ===");
97
+ const searchInfo = [];
98
+ if (search_term)
99
+ searchInfo.push(`Search: "${search_term}"`);
100
+ if (category)
101
+ searchInfo.push(`Category: "${category}"`);
102
+ searchInfo.push(`Active: ${active}`);
103
+ lines.push(searchInfo.join(" | "));
104
+ lines.push(`Found: ${tests.length} test(s)`);
105
+ if (tests.length === 0) {
106
+ lines.push("");
107
+ lines.push("No ATF tests found matching the criteria.");
108
+ }
109
+ else {
110
+ tests.forEach((test, index) => {
111
+ lines.push("");
112
+ lines.push(`${index + 1}. ${test.name}`);
113
+ lines.push(` sys_id: ${test.sys_id}`);
114
+ lines.push(` Active: ${test.active}`);
115
+ if (test.description) {
116
+ const truncated = test.description.length > 100
117
+ ? test.description.substring(0, 100) + "..."
118
+ : test.description;
119
+ lines.push(` Description: ${truncated}`);
120
+ }
121
+ });
122
+ }
123
+ lines.push("");
124
+ lines.push(`=== ${tests.length} test(s) found ===`);
125
+ if (tests.length > 0) {
126
+ lines.push("");
127
+ lines.push("Tip: Use the sys_id with the run_atf_test tool to execute a test.");
128
+ }
129
+ return {
130
+ content: [
131
+ {
132
+ type: "text",
133
+ text: lines.join("\n"),
134
+ },
135
+ ],
136
+ };
137
+ }
138
+ catch (error) {
139
+ const message = error instanceof Error ? error.message : String(error);
140
+ return {
141
+ content: [
142
+ {
143
+ type: "text",
144
+ text: `Error finding ATF tests: ${message}`,
145
+ },
146
+ ],
147
+ isError: true,
148
+ };
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=find-atf-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-atf-tests.js","sourceRoot":"","sources":["../../src/tools/find-atf-tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the check_instance_health tool on the MCP server.
4
+ *
5
+ * Runs a consolidated health check against a ServiceNow instance, returning
6
+ * version info, cluster status, stuck jobs, semaphore count, and operational counts.
7
+ */
8
+ export declare function registerCheckInstanceHealthTool(server: McpServer): void;
9
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6JvE"}
@@ -0,0 +1,137 @@
1
+ import { z } from "zod";
2
+ import { InstanceHealth, AggregateQuery } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the check_instance_health tool on the MCP server.
6
+ *
7
+ * Runs a consolidated health check against a ServiceNow instance, returning
8
+ * version info, cluster status, stuck jobs, semaphore count, and operational counts.
9
+ */
10
+ export function registerCheckInstanceHealthTool(server) {
11
+ server.registerTool("check_instance_health", {
12
+ title: "Check Instance Health",
13
+ description: "Run a consolidated health check on a ServiceNow instance. Returns version info, " +
14
+ "cluster node status, stuck scheduled jobs, active semaphore count, and operational " +
15
+ "counts (open incidents, changes, problems).\n\n" +
16
+ "Each section can be individually enabled/disabled. Use this to quickly assess " +
17
+ "the overall health and status of an instance.",
18
+ inputSchema: {
19
+ instance: z
20
+ .string()
21
+ .optional()
22
+ .describe("The ServiceNow instance auth alias (e.g., " +
23
+ '"dev224436", "prod"). If not provided, falls back ' +
24
+ "to the SN_AUTH_ALIAS environment variable."),
25
+ include_version: z
26
+ .boolean()
27
+ .default(true)
28
+ .describe("Include ServiceNow version/build info."),
29
+ include_cluster: z
30
+ .boolean()
31
+ .default(true)
32
+ .describe("Include cluster node status."),
33
+ include_stuck_jobs: z
34
+ .boolean()
35
+ .default(true)
36
+ .describe("Include stuck scheduled jobs."),
37
+ include_semaphores: z
38
+ .boolean()
39
+ .default(true)
40
+ .describe("Include active semaphore count."),
41
+ include_operational_counts: z
42
+ .boolean()
43
+ .default(true)
44
+ .describe("Include operational counts (open incidents, changes, problems)."),
45
+ stuck_job_threshold_minutes: z
46
+ .number()
47
+ .int()
48
+ .min(1)
49
+ .optional()
50
+ .describe("Threshold in minutes for considering a scheduled job stuck. " +
51
+ "Jobs running longer than this are flagged. Default is 30 minutes."),
52
+ },
53
+ }, async ({ instance, include_version, include_cluster, include_stuck_jobs, include_semaphores, include_operational_counts, stuck_job_threshold_minutes, }) => {
54
+ try {
55
+ const result = await withConnectionRetry(instance, async (snInstance) => {
56
+ const aggregateQuery = new AggregateQuery(snInstance);
57
+ const health = new InstanceHealth(snInstance, aggregateQuery);
58
+ return await health.checkHealth({
59
+ includeVersion: include_version,
60
+ includeCluster: include_cluster,
61
+ includeStuckJobs: include_stuck_jobs,
62
+ includeSemaphores: include_semaphores,
63
+ includeOperationalCounts: include_operational_counts,
64
+ stuckJobThresholdMinutes: stuck_job_threshold_minutes,
65
+ });
66
+ });
67
+ const lines = [];
68
+ lines.push("=== Instance Health Check ===");
69
+ lines.push(`Timestamp: ${result.timestamp}`);
70
+ if (result.version) {
71
+ lines.push("");
72
+ lines.push("--- Version Info ---");
73
+ if (result.version.version)
74
+ lines.push(` Version: ${result.version.version}`);
75
+ if (result.version.buildDate)
76
+ lines.push(` Build Date: ${result.version.buildDate}`);
77
+ if (result.version.buildTag)
78
+ lines.push(` Build Tag: ${result.version.buildTag}`);
79
+ }
80
+ if (result.clusterNodes) {
81
+ lines.push("");
82
+ lines.push(`--- Cluster Nodes (${result.clusterNodes.length}) ---`);
83
+ for (const node of result.clusterNodes) {
84
+ lines.push(` ${node.node_id || node.sys_id}: status=${node.status || "unknown"}`);
85
+ }
86
+ }
87
+ if (result.stuckJobs) {
88
+ lines.push("");
89
+ lines.push(`--- Stuck Jobs (${result.stuckJobs.length}) ---`);
90
+ if (result.stuckJobs.length === 0) {
91
+ lines.push(" None detected");
92
+ }
93
+ else {
94
+ for (const job of result.stuckJobs) {
95
+ lines.push(` ${job.name || job.sys_id}: state=${job.state || "unknown"}, next_action=${job.next_action || "N/A"}`);
96
+ }
97
+ }
98
+ }
99
+ if (result.activeSemaphoreCount !== undefined) {
100
+ lines.push("");
101
+ lines.push("--- Semaphores ---");
102
+ lines.push(` Active count: ${result.activeSemaphoreCount}`);
103
+ }
104
+ if (result.operationalCounts) {
105
+ lines.push("");
106
+ lines.push("--- Operational Counts ---");
107
+ const counts = result.operationalCounts;
108
+ if (counts.openIncidents !== undefined)
109
+ lines.push(` Open Incidents: ${counts.openIncidents}`);
110
+ if (counts.openChanges !== undefined)
111
+ lines.push(` Open Changes: ${counts.openChanges}`);
112
+ if (counts.openProblems !== undefined)
113
+ lines.push(` Open Problems: ${counts.openProblems}`);
114
+ }
115
+ if (result.summary) {
116
+ lines.push("");
117
+ lines.push(`Summary: ${result.summary}`);
118
+ }
119
+ return {
120
+ content: [{ type: "text", text: lines.join("\n") }],
121
+ };
122
+ }
123
+ catch (error) {
124
+ const message = error instanceof Error ? error.message : String(error);
125
+ return {
126
+ content: [
127
+ {
128
+ type: "text",
129
+ text: `Error checking instance health: ${message}`,
130
+ },
131
+ ],
132
+ isError: true,
133
+ };
134
+ }
135
+ });
136
+ }
137
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the lookup_app tool on the MCP server.
4
+ *
5
+ * Searches ServiceNow for applications (scoped apps) and platform plugins
6
+ * by name, scope namespace, or plugin ID. Queries sys_scope (which covers
7
+ * both sys_app and sys_store_app via table inheritance) and sys_plugins
8
+ * in parallel.
9
+ */
10
+ export declare function registerLookupAppTool(server: McpServer): void;
11
+ //# sourceMappingURL=lookup-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup-app.d.ts","sourceRoot":"","sources":["../../src/tools/lookup-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkDpE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6P7D"}