@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,371 @@
1
+ import { z } from "zod";
2
+ import { CodeSearch } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the code_search tool on the MCP server.
6
+ *
7
+ * Searches for code across a ServiceNow instance using the Code Search API.
8
+ * This is the primary tool for finding scripts, business rules, and other
9
+ * code artifacts on the platform.
10
+ */
11
+ export function registerCodeSearchTool(server) {
12
+ server.registerTool("code_search", {
13
+ title: "Code Search",
14
+ description: "Search for code across a ServiceNow instance using the Code Search API. " +
15
+ "Finds matching scripts, business rules, script includes, and other code artifacts " +
16
+ "across the platform. Results include the record name, table, field, and matching " +
17
+ "line numbers with context.\n\n" +
18
+ "Code Search works through Search Groups, which define sets of tables and fields " +
19
+ "to search. There is typically a default search group. Use `list_code_search_groups` " +
20
+ "to discover available groups, and `list_code_search_tables` to see which tables " +
21
+ "a group covers.\n\n" +
22
+ "Key use cases:\n" +
23
+ "- Find scripts that reference a specific API, table, or pattern\n" +
24
+ "- Locate business rules, script includes, or UI scripts containing specific logic\n" +
25
+ "- Verify whether code has been deployed to an instance\n" +
26
+ "- Search within a specific application scope or table",
27
+ inputSchema: {
28
+ instance: z
29
+ .string()
30
+ .optional()
31
+ .describe("The ServiceNow instance auth alias (e.g., " +
32
+ '"dev224436", "prod"). If not provided, falls back ' +
33
+ "to the SN_AUTH_ALIAS environment variable."),
34
+ term: z
35
+ .string()
36
+ .describe("The search term to find in code. Searches across script fields " +
37
+ "in the tables defined by the search group."),
38
+ search_group: z
39
+ .string()
40
+ .optional()
41
+ .describe("The search group NAME to scope the search (e.g., " +
42
+ '"Default Code Search Group"). If omitted, the instance\'s ' +
43
+ "default search group is used. Use `list_code_search_groups` " +
44
+ "to discover available groups."),
45
+ table: z
46
+ .string()
47
+ .optional()
48
+ .describe("Specific table to search within (e.g., \"sys_script_include\"). " +
49
+ "Requires `search_group` to also be specified. Use " +
50
+ "`list_code_search_tables` to see available tables for a group."),
51
+ current_app: z
52
+ .string()
53
+ .optional()
54
+ .describe("Application scope to limit results to (e.g., \"x_myapp\"). " +
55
+ "When set, only results from this application scope are returned. " +
56
+ "Automatically sets search_all_scopes to false."),
57
+ search_all_scopes: z
58
+ .boolean()
59
+ .optional()
60
+ .describe("When false, limits results to files within the scope specified by " +
61
+ "`current_app`. Defaults to true (search all scopes)."),
62
+ limit: z
63
+ .number()
64
+ .optional()
65
+ .describe("Maximum number of results to return."),
66
+ },
67
+ }, async ({ instance, term, search_group, table, current_app, search_all_scopes, limit, }) => {
68
+ try {
69
+ const results = await withConnectionRetry(instance, async (snInstance) => {
70
+ const codeSearch = new CodeSearch(snInstance);
71
+ // If current_app is specified but search_all_scopes is not,
72
+ // default to false (matching searchInApp behavior)
73
+ const effectiveSearchAllScopes = current_app && search_all_scopes === undefined
74
+ ? false
75
+ : search_all_scopes;
76
+ return await codeSearch.search({
77
+ term,
78
+ search_group,
79
+ table,
80
+ current_app,
81
+ search_all_scopes: effectiveSearchAllScopes,
82
+ limit,
83
+ });
84
+ });
85
+ // Build output
86
+ const lines = [];
87
+ lines.push("=== Code Search Results ===");
88
+ const searchInfo = [`Search: "${term}"`];
89
+ if (search_group)
90
+ searchInfo.push(`Group: ${search_group}`);
91
+ if (table)
92
+ searchInfo.push(`Table: ${table}`);
93
+ if (current_app)
94
+ searchInfo.push(`App: ${current_app}`);
95
+ if (limit)
96
+ searchInfo.push(`Limit: ${limit}`);
97
+ lines.push(searchInfo.join(" | "));
98
+ lines.push("");
99
+ // Use the core library's formatter for result details
100
+ lines.push(CodeSearch.formatResultsAsText(results));
101
+ // Footer tips
102
+ if (!search_group) {
103
+ lines.push("");
104
+ lines.push("Tip: Use `list_code_search_groups` to discover available search groups, " +
105
+ "then pass the group name as `search_group` to scope your search.");
106
+ }
107
+ if (results.length === 0) {
108
+ lines.push("");
109
+ lines.push("No matching code found. Try a different search term, or use " +
110
+ "`list_code_search_tables` to verify which tables are being searched.");
111
+ }
112
+ return {
113
+ content: [
114
+ {
115
+ type: "text",
116
+ text: lines.join("\n"),
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ catch (error) {
122
+ const message = error instanceof Error ? error.message : String(error);
123
+ return {
124
+ content: [
125
+ {
126
+ type: "text",
127
+ text: `Error searching code: ${message}`,
128
+ },
129
+ ],
130
+ isError: true,
131
+ };
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * Registers the list_code_search_groups tool on the MCP server.
137
+ *
138
+ * Lists available code search groups on a ServiceNow instance.
139
+ * Search groups define which tables and fields are included in code searches.
140
+ */
141
+ export function registerListCodeSearchGroupsTool(server) {
142
+ server.registerTool("list_code_search_groups", {
143
+ title: "List Code Search Groups",
144
+ description: "List available code search groups on a ServiceNow instance. " +
145
+ "Search groups define which tables and fields are included when performing " +
146
+ "a code search. Each instance typically has a default search group, and " +
147
+ "additional groups can be created for specific use cases.\n\n" +
148
+ "Use the group `name` as the `search_group` parameter in `code_search`. " +
149
+ "Use the group `sys_id` when adding tables via `add_code_search_table`.",
150
+ inputSchema: {
151
+ instance: z
152
+ .string()
153
+ .optional()
154
+ .describe("The ServiceNow instance auth alias (e.g., " +
155
+ '"dev224436", "prod"). If not provided, falls back ' +
156
+ "to the SN_AUTH_ALIAS environment variable."),
157
+ limit: z
158
+ .number()
159
+ .default(100)
160
+ .describe("Maximum number of search groups to return. Default is 100."),
161
+ },
162
+ }, async ({ instance, limit }) => {
163
+ try {
164
+ const groups = await withConnectionRetry(instance, async (snInstance) => {
165
+ const codeSearch = new CodeSearch(snInstance);
166
+ return await codeSearch.getSearchGroups({ limit });
167
+ });
168
+ const lines = [];
169
+ lines.push("=== Code Search Groups ===");
170
+ lines.push(`Found: ${groups.length} group(s)`);
171
+ if (groups.length === 0) {
172
+ lines.push("");
173
+ lines.push("No code search groups found on this instance.");
174
+ }
175
+ else {
176
+ groups.forEach((group, index) => {
177
+ lines.push("");
178
+ lines.push(`${index + 1}. ${group.name}`);
179
+ lines.push(` sys_id: ${group.sys_id}`);
180
+ if (group.description) {
181
+ const truncated = group.description.length > 120
182
+ ? group.description.substring(0, 120) + "..."
183
+ : group.description;
184
+ lines.push(` Description: ${truncated}`);
185
+ }
186
+ });
187
+ }
188
+ lines.push("");
189
+ lines.push(`=== ${groups.length} group(s) found ===`);
190
+ lines.push("");
191
+ lines.push("Tip: Use the group name as `search_group` in `code_search`. " +
192
+ "Use the sys_id as `search_group` in `add_code_search_table`.");
193
+ return {
194
+ content: [
195
+ {
196
+ type: "text",
197
+ text: lines.join("\n"),
198
+ },
199
+ ],
200
+ };
201
+ }
202
+ catch (error) {
203
+ const message = error instanceof Error ? error.message : String(error);
204
+ return {
205
+ content: [
206
+ {
207
+ type: "text",
208
+ text: `Error listing code search groups: ${message}`,
209
+ },
210
+ ],
211
+ isError: true,
212
+ };
213
+ }
214
+ });
215
+ }
216
+ /**
217
+ * Registers the list_code_search_tables tool on the MCP server.
218
+ *
219
+ * Lists the tables associated with a code search group — these are the
220
+ * tables that get searched when using that group in a code search.
221
+ */
222
+ export function registerListCodeSearchTablesTool(server) {
223
+ server.registerTool("list_code_search_tables", {
224
+ title: "List Code Search Tables",
225
+ description: "List the tables associated with a code search group. These are the tables " +
226
+ "and fields that are searched when performing a code search with that group.\n\n" +
227
+ "Use this to understand what a search group covers, or to identify if a " +
228
+ "specific table is missing and needs to be added via `add_code_search_table`.",
229
+ inputSchema: {
230
+ instance: z
231
+ .string()
232
+ .optional()
233
+ .describe("The ServiceNow instance auth alias (e.g., " +
234
+ '"dev224436", "prod"). If not provided, falls back ' +
235
+ "to the SN_AUTH_ALIAS environment variable."),
236
+ search_group: z
237
+ .string()
238
+ .describe("The search group NAME (not sys_id) to list tables for. " +
239
+ "Use `list_code_search_groups` to find available group names."),
240
+ },
241
+ }, async ({ instance, search_group }) => {
242
+ try {
243
+ const tables = await withConnectionRetry(instance, async (snInstance) => {
244
+ const codeSearch = new CodeSearch(snInstance);
245
+ return await codeSearch.getTablesForSearchGroup(search_group);
246
+ });
247
+ const lines = [];
248
+ lines.push(`=== Tables in Search Group: ${search_group} ===`);
249
+ lines.push(`Found: ${tables.length} table(s)`);
250
+ if (tables.length === 0) {
251
+ lines.push("");
252
+ lines.push("No tables found in this search group. Use `add_code_search_table` to add tables.");
253
+ }
254
+ else {
255
+ tables.forEach((table, index) => {
256
+ lines.push("");
257
+ lines.push(`${index + 1}. ${table.name}${table.label ? ` (${table.label})` : ""}`);
258
+ });
259
+ }
260
+ lines.push("");
261
+ lines.push(`=== ${tables.length} table(s) found ===`);
262
+ if (tables.length > 0) {
263
+ lines.push("");
264
+ lines.push("Tip: Use `add_code_search_table` to add a table to this search group, " +
265
+ "or pass a table name as `table` in `code_search` to search a specific table.");
266
+ }
267
+ return {
268
+ content: [
269
+ {
270
+ type: "text",
271
+ text: lines.join("\n"),
272
+ },
273
+ ],
274
+ };
275
+ }
276
+ catch (error) {
277
+ const message = error instanceof Error ? error.message : String(error);
278
+ return {
279
+ content: [
280
+ {
281
+ type: "text",
282
+ text: `Error listing code search tables: ${message}`,
283
+ },
284
+ ],
285
+ isError: true,
286
+ };
287
+ }
288
+ });
289
+ }
290
+ /**
291
+ * Registers the add_code_search_table tool on the MCP server.
292
+ *
293
+ * Adds a new table to an existing code search group, expanding what
294
+ * gets searched when using that group.
295
+ */
296
+ export function registerAddCodeSearchTableTool(server) {
297
+ server.registerTool("add_code_search_table", {
298
+ title: "Add Code Search Table",
299
+ description: "Add a new table to an existing code search group, expanding what gets searched. " +
300
+ "After adding a table, code searches using that group will also search the " +
301
+ "specified fields on the new table.\n\n" +
302
+ "Requires the search group's sys_id (get it from `list_code_search_groups`) " +
303
+ "and the table name and fields to search.\n\n" +
304
+ "IMPORTANT: This modifies the code search configuration on the instance. " +
305
+ "Verify the table name and fields before adding.",
306
+ inputSchema: {
307
+ instance: z
308
+ .string()
309
+ .optional()
310
+ .describe("The ServiceNow instance auth alias (e.g., " +
311
+ '"dev224436", "prod"). If not provided, falls back ' +
312
+ "to the SN_AUTH_ALIAS environment variable."),
313
+ table: z
314
+ .string()
315
+ .describe("The table name to add to the search group (e.g., " +
316
+ '"sys_script_include", "sys_ui_script"). Use `lookup_table` ' +
317
+ "to verify the table name exists."),
318
+ search_fields: z
319
+ .string()
320
+ .describe("Comma-separated field names to search on this table (e.g., " +
321
+ '"script,name", "script"). Use `lookup_columns` to find ' +
322
+ "available fields on the table."),
323
+ search_group: z
324
+ .string()
325
+ .describe("The sys_id of the target code search group. Get this from " +
326
+ "`list_code_search_groups`."),
327
+ },
328
+ }, async ({ instance, table, search_fields, search_group }) => {
329
+ try {
330
+ const record = await withConnectionRetry(instance, async (snInstance) => {
331
+ const codeSearch = new CodeSearch(snInstance);
332
+ return await codeSearch.addTableToSearchGroup({
333
+ table,
334
+ search_fields,
335
+ search_group,
336
+ });
337
+ });
338
+ const lines = [];
339
+ lines.push("=== Code Search Table Added ===");
340
+ lines.push("");
341
+ lines.push(`Table: ${record.table}`);
342
+ lines.push(`Search Fields: ${record.search_fields}`);
343
+ lines.push(`sys_id: ${record.sys_id}`);
344
+ lines.push(`Search Group: ${search_group}`);
345
+ lines.push("");
346
+ lines.push("The table has been added to the search group. Code searches using " +
347
+ "this group will now include results from this table.");
348
+ return {
349
+ content: [
350
+ {
351
+ type: "text",
352
+ text: lines.join("\n"),
353
+ },
354
+ ],
355
+ };
356
+ }
357
+ catch (error) {
358
+ const message = error instanceof Error ? error.message : String(error);
359
+ return {
360
+ content: [
361
+ {
362
+ type: "text",
363
+ text: `Error adding code search table: ${message}`,
364
+ },
365
+ ],
366
+ isError: true,
367
+ };
368
+ }
369
+ });
370
+ }
371
+ //# sourceMappingURL=codesearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codesearch.js","sourceRoot":"","sources":["../../src/tools/codesearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the list_instance_tables tool on the MCP server.
4
+ *
5
+ * Lists tables on a ServiceNow instance with optional filtering by name prefix,
6
+ * scope, and extendability. Complements lookup_table which searches by name/label.
7
+ */
8
+ export declare function registerListInstanceTablesTool(server: McpServer): void;
9
+ /**
10
+ * Registers the list_plugins tool on the MCP server.
11
+ *
12
+ * Lists platform plugins on a ServiceNow instance.
13
+ */
14
+ export declare function registerListPluginsTool(server: McpServer): void;
15
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0HtE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkG/D"}
@@ -0,0 +1,204 @@
1
+ import { z } from "zod";
2
+ import { InstanceDiscovery } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the list_instance_tables tool on the MCP server.
6
+ *
7
+ * Lists tables on a ServiceNow instance with optional filtering by name prefix,
8
+ * scope, and extendability. Complements lookup_table which searches by name/label.
9
+ */
10
+ export function registerListInstanceTablesTool(server) {
11
+ server.registerTool("list_instance_tables", {
12
+ title: "List Instance Tables",
13
+ description: "List tables on a ServiceNow instance with optional filtering. Returns table name, " +
14
+ "label, parent class, scope, and whether the table is extendable.\n\n" +
15
+ "Unlike lookup_table (which searches by name or label keyword), this tool supports " +
16
+ "browsing with prefix filters, scope filters, and extendable-only mode. " +
17
+ "Use this to discover tables in a specific scope or browse tables by naming convention.",
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
+ name_prefix: z
26
+ .string()
27
+ .optional()
28
+ .describe('Filter tables whose name starts with this prefix (e.g., "cmdb_ci", ' +
29
+ '"x_myapp", "incident"). Case-sensitive.'),
30
+ scope: z
31
+ .string()
32
+ .optional()
33
+ .describe('Filter tables belonging to a specific application scope (e.g., "global", ' +
34
+ '"x_myapp_custom").'),
35
+ extendable_only: z
36
+ .boolean()
37
+ .optional()
38
+ .describe("When true, only return tables that can be extended."),
39
+ query: z
40
+ .string()
41
+ .optional()
42
+ .describe("An encoded query string for advanced filtering on sys_db_object."),
43
+ limit: z
44
+ .number()
45
+ .int()
46
+ .min(1)
47
+ .max(500)
48
+ .default(50)
49
+ .describe("Maximum number of tables to return. Default is 50."),
50
+ offset: z
51
+ .number()
52
+ .int()
53
+ .min(0)
54
+ .optional()
55
+ .describe("Offset for pagination (skip this many records)."),
56
+ },
57
+ }, async ({ instance, name_prefix, scope, extendable_only, query, limit, offset }) => {
58
+ try {
59
+ const tables = await withConnectionRetry(instance, async (snInstance) => {
60
+ const discovery = new InstanceDiscovery(snInstance);
61
+ return await discovery.listTables({
62
+ namePrefix: name_prefix,
63
+ scope,
64
+ extendableOnly: extendable_only,
65
+ query,
66
+ limit,
67
+ offset,
68
+ });
69
+ });
70
+ const lines = [];
71
+ lines.push("=== Instance Tables ===");
72
+ if (name_prefix)
73
+ lines.push(`Name Prefix: ${name_prefix}`);
74
+ if (scope)
75
+ lines.push(`Scope: ${scope}`);
76
+ if (extendable_only)
77
+ lines.push("Extendable Only: true");
78
+ lines.push(`Tables returned: ${tables.length}`);
79
+ if (tables.length === 0) {
80
+ lines.push("");
81
+ lines.push("No tables found matching the criteria.");
82
+ }
83
+ else {
84
+ for (const table of tables) {
85
+ lines.push("");
86
+ lines.push(` ${table.name || "unknown"} — ${table.label || "no label"}`);
87
+ if (table.super_class)
88
+ lines.push(` Extends: ${table.super_class}`);
89
+ if (table.sys_scope)
90
+ lines.push(` Scope: ${table.sys_scope}`);
91
+ if (table.is_extendable)
92
+ lines.push(` Extendable: ${table.is_extendable}`);
93
+ }
94
+ }
95
+ lines.push("");
96
+ lines.push(`=== ${tables.length} table(s) returned ===`);
97
+ return {
98
+ content: [{ type: "text", text: lines.join("\n") }],
99
+ };
100
+ }
101
+ catch (error) {
102
+ const message = error instanceof Error ? error.message : String(error);
103
+ return {
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: `Error listing tables: ${message}`,
108
+ },
109
+ ],
110
+ isError: true,
111
+ };
112
+ }
113
+ });
114
+ }
115
+ /**
116
+ * Registers the list_plugins tool on the MCP server.
117
+ *
118
+ * Lists platform plugins on a ServiceNow instance.
119
+ */
120
+ export function registerListPluginsTool(server) {
121
+ server.registerTool("list_plugins", {
122
+ title: "List Plugins",
123
+ description: "List ServiceNow platform plugins on an instance. Returns plugin ID, name, " +
124
+ "version, and active status. Use to discover which plugins are installed/active " +
125
+ "or to find a specific plugin by name prefix.",
126
+ inputSchema: {
127
+ instance: z
128
+ .string()
129
+ .optional()
130
+ .describe("The ServiceNow instance auth alias (e.g., " +
131
+ '"dev224436", "prod"). If not provided, falls back ' +
132
+ "to the SN_AUTH_ALIAS environment variable."),
133
+ name_prefix: z
134
+ .string()
135
+ .optional()
136
+ .describe('Filter plugins whose name starts with this prefix (e.g., "com.snc", ' +
137
+ '"com.glide"). Case-sensitive.'),
138
+ active_only: z
139
+ .boolean()
140
+ .default(true)
141
+ .describe("When true (default), only return active plugins."),
142
+ query: z
143
+ .string()
144
+ .optional()
145
+ .describe("An encoded query string for advanced filtering on sys_plugins."),
146
+ limit: z
147
+ .number()
148
+ .int()
149
+ .min(1)
150
+ .max(500)
151
+ .default(50)
152
+ .describe("Maximum number of plugins to return. Default is 50."),
153
+ },
154
+ }, async ({ instance, name_prefix, active_only, query, limit }) => {
155
+ try {
156
+ const plugins = await withConnectionRetry(instance, async (snInstance) => {
157
+ const discovery = new InstanceDiscovery(snInstance);
158
+ return await discovery.listPlugins({
159
+ namePrefix: name_prefix,
160
+ activeOnly: active_only,
161
+ query,
162
+ limit,
163
+ });
164
+ });
165
+ const lines = [];
166
+ lines.push("=== Plugins ===");
167
+ if (name_prefix)
168
+ lines.push(`Name Prefix: ${name_prefix}`);
169
+ lines.push(`Active Only: ${active_only}`);
170
+ lines.push(`Plugins returned: ${plugins.length}`);
171
+ if (plugins.length === 0) {
172
+ lines.push("");
173
+ lines.push("No plugins found matching the criteria.");
174
+ }
175
+ else {
176
+ for (const plugin of plugins) {
177
+ lines.push("");
178
+ lines.push(` ${plugin.id || plugin.sys_id} — ${plugin.name || "unnamed"}`);
179
+ if (plugin.version)
180
+ lines.push(` Version: ${plugin.version}`);
181
+ lines.push(` Active: ${plugin.active ?? "unknown"}`);
182
+ }
183
+ }
184
+ lines.push("");
185
+ lines.push(`=== ${plugins.length} plugin(s) returned ===`);
186
+ return {
187
+ content: [{ type: "text", text: lines.join("\n") }],
188
+ };
189
+ }
190
+ catch (error) {
191
+ const message = error instanceof Error ? error.message : String(error);
192
+ return {
193
+ content: [
194
+ {
195
+ type: "text",
196
+ text: `Error listing plugins: ${message}`,
197
+ },
198
+ ],
199
+ isError: true,
200
+ };
201
+ }
202
+ });
203
+ }
204
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the execute_script tool on the MCP server.
4
+ *
5
+ * This tool executes JavaScript on a ServiceNow instance via Scripts - Background
6
+ * (the /sys.scripts.do endpoint). It mirrors the behavior of the CLI's `exec` command.
7
+ */
8
+ export declare function registerExecuteScriptTool(server: McpServer): void;
9
+ //# sourceMappingURL=execute-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-script.d.ts","sourceRoot":"","sources":["../../src/tools/execute-script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkHjE"}