@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,321 @@
1
+ import { z } from "zod";
2
+ import { SchemaDiscovery } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the discover_table_schema tool on the MCP server.
6
+ *
7
+ * Discovers the full schema of a ServiceNow table including all fields,
8
+ * types, references, and optionally choice values, relationships,
9
+ * UI policies, and business rules.
10
+ */
11
+ export function registerDiscoverTableSchemaTool(server) {
12
+ server.registerTool("discover_table_schema", {
13
+ title: "Discover Table Schema",
14
+ description: "Discover the full schema of a ServiceNow table including all fields, types, " +
15
+ "references, and optionally choice values, relationships, UI policies, and " +
16
+ "business rules.\n\n" +
17
+ "Returns the table name, label, parent class, and for each field: name, label, " +
18
+ "type, maxLength, mandatory, readOnly, referenceTable, and defaultValue.\n\n" +
19
+ "Key use cases:\n" +
20
+ "- Understand the structure of a table before querying or scripting against it\n" +
21
+ "- Discover reference fields to understand table relationships\n" +
22
+ "- Find choice values for dropdown fields\n" +
23
+ "- Review UI policies and business rules that affect the table",
24
+ inputSchema: {
25
+ instance: z
26
+ .string()
27
+ .optional()
28
+ .describe("The ServiceNow instance auth alias (e.g., " +
29
+ '"dev224436", "prod"). If not provided, falls back ' +
30
+ "to the SN_AUTH_ALIAS environment variable."),
31
+ table: z
32
+ .string()
33
+ .describe("The ServiceNow table name to discover (e.g., " +
34
+ '"incident", "sys_user", "cmdb_ci").'),
35
+ include_choices: z
36
+ .boolean()
37
+ .optional()
38
+ .default(false)
39
+ .describe("Include choice values for fields that have them (e.g., " +
40
+ "priority, state). Queries sys_choice."),
41
+ include_relationships: z
42
+ .boolean()
43
+ .optional()
44
+ .default(false)
45
+ .describe("Include relationship information extracted from reference fields."),
46
+ include_ui_policies: z
47
+ .boolean()
48
+ .optional()
49
+ .default(false)
50
+ .describe("Include UI policies defined on the table."),
51
+ include_business_rules: z
52
+ .boolean()
53
+ .optional()
54
+ .default(false)
55
+ .describe("Include business rules defined on the table."),
56
+ },
57
+ }, async ({ instance, table, include_choices, include_relationships, include_ui_policies, include_business_rules, }) => {
58
+ try {
59
+ const schema = await withConnectionRetry(instance, async (snInstance) => {
60
+ const discovery = new SchemaDiscovery(snInstance);
61
+ return await discovery.discoverTableSchema(table, {
62
+ includeChoiceTables: include_choices,
63
+ includeRelationships: include_relationships,
64
+ includeUIPolicies: include_ui_policies,
65
+ includeBusinessRules: include_business_rules,
66
+ });
67
+ });
68
+ const lines = [];
69
+ lines.push("=== Table Schema ===");
70
+ lines.push(`Table: ${schema.table}`);
71
+ lines.push(`Label: ${schema.label}`);
72
+ if (schema.superClass) {
73
+ lines.push(`Parent Class: ${schema.superClass}`);
74
+ }
75
+ lines.push(`Fields: ${schema.fields.length}`);
76
+ lines.push("");
77
+ // Fields
78
+ lines.push("=== Fields ===");
79
+ for (const field of schema.fields) {
80
+ lines.push("");
81
+ lines.push(` ${field.name}`);
82
+ lines.push(` Label: ${field.label}`);
83
+ lines.push(` Type: ${field.internalType}`);
84
+ lines.push(` Max Length: ${field.maxLength}`);
85
+ lines.push(` Mandatory: ${field.mandatory}`);
86
+ lines.push(` Read Only: ${field.readOnly}`);
87
+ if (field.referenceTable) {
88
+ lines.push(` Reference Table: ${field.referenceTable}`);
89
+ }
90
+ if (field.defaultValue) {
91
+ lines.push(` Default Value: ${field.defaultValue}`);
92
+ }
93
+ }
94
+ // Choice tables
95
+ if (schema.choiceTables && schema.choiceTables.length > 0) {
96
+ lines.push("");
97
+ lines.push("=== Choice Values ===");
98
+ for (const choiceTable of schema.choiceTables) {
99
+ lines.push("");
100
+ lines.push(` Field: ${choiceTable.field}`);
101
+ for (const choice of choiceTable.choices) {
102
+ lines.push(` ${choice.value} = ${choice.label}`);
103
+ }
104
+ }
105
+ }
106
+ // Relationships
107
+ if (schema.relationships && schema.relationships.length > 0) {
108
+ lines.push("");
109
+ lines.push("=== Relationships ===");
110
+ for (const rel of schema.relationships) {
111
+ lines.push(` ${rel.name} -> ${rel.relatedTable} (${rel.type})`);
112
+ }
113
+ }
114
+ // UI Policies
115
+ if (schema.uiPolicies && schema.uiPolicies.length > 0) {
116
+ lines.push("");
117
+ lines.push("=== UI Policies ===");
118
+ for (const policy of schema.uiPolicies) {
119
+ lines.push(` ${policy.short_description || "(no description)"} [${policy.active ? "active" : "inactive"}] (sys_id: ${policy.sys_id})`);
120
+ }
121
+ }
122
+ // Business Rules
123
+ if (schema.businessRules && schema.businessRules.length > 0) {
124
+ lines.push("");
125
+ lines.push("=== Business Rules ===");
126
+ for (const rule of schema.businessRules) {
127
+ lines.push(` ${rule.name || "(no name)"} [when: ${rule.when}, ${rule.active ? "active" : "inactive"}] (sys_id: ${rule.sys_id})`);
128
+ }
129
+ }
130
+ lines.push("");
131
+ lines.push(`=== ${schema.fields.length} field(s) discovered ===`);
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: lines.join("\n"),
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ catch (error) {
142
+ const message = error instanceof Error ? error.message : String(error);
143
+ return {
144
+ content: [
145
+ {
146
+ type: "text",
147
+ text: `Error discovering table schema: ${message}`,
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ });
154
+ }
155
+ /**
156
+ * Registers the explain_field tool on the MCP server.
157
+ *
158
+ * Gets a detailed explanation of a specific field on a table, including
159
+ * type, constraints, help text, and available choice values.
160
+ */
161
+ export function registerExplainFieldTool(server) {
162
+ server.registerTool("explain_field", {
163
+ title: "Explain Field",
164
+ description: "Get detailed explanation of a specific field on a ServiceNow table, " +
165
+ "including type, constraints, help text, and available choice values.\n\n" +
166
+ "Use this to understand what a field does, what values it accepts, " +
167
+ "and how it is configured before reading or writing data.",
168
+ inputSchema: {
169
+ instance: z
170
+ .string()
171
+ .optional()
172
+ .describe("The ServiceNow instance auth alias (e.g., " +
173
+ '"dev224436", "prod"). If not provided, falls back ' +
174
+ "to the SN_AUTH_ALIAS environment variable."),
175
+ table: z
176
+ .string()
177
+ .describe("The ServiceNow table name containing the field (e.g., " +
178
+ '"incident", "sys_user").'),
179
+ field: z
180
+ .string()
181
+ .describe("The field element name to explain (e.g., " +
182
+ '"state", "priority", "assigned_to").'),
183
+ },
184
+ }, async ({ instance, table, field }) => {
185
+ try {
186
+ const explanation = await withConnectionRetry(instance, async (snInstance) => {
187
+ const discovery = new SchemaDiscovery(snInstance);
188
+ return await discovery.explainField(table, field);
189
+ });
190
+ const lines = [];
191
+ lines.push("=== Field Explanation ===");
192
+ lines.push(`Field: ${explanation.field}`);
193
+ lines.push(`Table: ${explanation.table}`);
194
+ lines.push(`Label: ${explanation.label}`);
195
+ lines.push(`Type: ${explanation.type}`);
196
+ lines.push(`Max Length: ${explanation.maxLength}`);
197
+ lines.push(`Mandatory: ${explanation.mandatory}`);
198
+ lines.push(`Read Only: ${explanation.readOnly}`);
199
+ if (explanation.comments) {
200
+ lines.push(`Comments: ${explanation.comments}`);
201
+ }
202
+ if (explanation.help) {
203
+ lines.push(`Help: ${explanation.help}`);
204
+ }
205
+ if (explanation.referenceTable) {
206
+ lines.push(`Reference Table: ${explanation.referenceTable}`);
207
+ }
208
+ if (explanation.choices && explanation.choices.length > 0) {
209
+ lines.push("");
210
+ lines.push("=== Available Choices ===");
211
+ for (const choice of explanation.choices) {
212
+ lines.push(` ${choice.value} = ${choice.label}`);
213
+ }
214
+ lines.push("");
215
+ lines.push(`=== ${explanation.choices.length} choice(s) ===`);
216
+ }
217
+ return {
218
+ content: [
219
+ {
220
+ type: "text",
221
+ text: lines.join("\n"),
222
+ },
223
+ ],
224
+ };
225
+ }
226
+ catch (error) {
227
+ const message = error instanceof Error ? error.message : String(error);
228
+ return {
229
+ content: [
230
+ {
231
+ type: "text",
232
+ text: `Error explaining field: ${message}`,
233
+ },
234
+ ],
235
+ isError: true,
236
+ };
237
+ }
238
+ });
239
+ }
240
+ /**
241
+ * Registers the validate_catalog tool on the MCP server.
242
+ *
243
+ * Validates a catalog item's configuration, checking variables for
244
+ * duplicates, missing names, inactive mandatory vars, and UI policy issues.
245
+ */
246
+ export function registerValidateCatalogTool(server) {
247
+ server.registerTool("validate_catalog", {
248
+ title: "Validate Catalog Configuration",
249
+ description: "Validate a catalog item's configuration on a ServiceNow instance. " +
250
+ "Checks variables for duplicates, missing names, inactive mandatory " +
251
+ "variables, and UI policy issues.\n\n" +
252
+ "Returns a valid/invalid flag, error and warning counts, and each " +
253
+ "issue with its severity, component, sys_id, description, and suggested fix.",
254
+ inputSchema: {
255
+ instance: z
256
+ .string()
257
+ .optional()
258
+ .describe("The ServiceNow instance auth alias (e.g., " +
259
+ '"dev224436", "prod"). If not provided, falls back ' +
260
+ "to the SN_AUTH_ALIAS environment variable."),
261
+ catalog_item_sys_id: z
262
+ .string()
263
+ .describe("The sys_id of the catalog item to validate."),
264
+ },
265
+ }, async ({ instance, catalog_item_sys_id }) => {
266
+ try {
267
+ const result = await withConnectionRetry(instance, async (snInstance) => {
268
+ const discovery = new SchemaDiscovery(snInstance);
269
+ return await discovery.validateCatalogConfiguration(catalog_item_sys_id);
270
+ });
271
+ const lines = [];
272
+ lines.push("=== Catalog Validation Result ===");
273
+ lines.push(`Catalog Item: ${catalog_item_sys_id}`);
274
+ lines.push(`Valid: ${result.valid}`);
275
+ lines.push(`Errors: ${result.errors}`);
276
+ lines.push(`Warnings: ${result.warnings}`);
277
+ if (result.issues.length > 0) {
278
+ lines.push("");
279
+ lines.push("=== Issues ===");
280
+ for (const issue of result.issues) {
281
+ lines.push("");
282
+ lines.push(` [${issue.severity.toUpperCase()}] ${issue.issue}`);
283
+ lines.push(` Component: ${issue.component}`);
284
+ if (issue.sys_id) {
285
+ lines.push(` sys_id: ${issue.sys_id}`);
286
+ }
287
+ if (issue.fix) {
288
+ lines.push(` Fix: ${issue.fix}`);
289
+ }
290
+ }
291
+ }
292
+ else {
293
+ lines.push("");
294
+ lines.push("No issues found. The catalog item configuration is valid.");
295
+ }
296
+ lines.push("");
297
+ lines.push(`=== ${result.issues.length} issue(s): ${result.errors} error(s), ${result.warnings} warning(s) ===`);
298
+ return {
299
+ content: [
300
+ {
301
+ type: "text",
302
+ text: lines.join("\n"),
303
+ },
304
+ ],
305
+ };
306
+ }
307
+ catch (error) {
308
+ const message = error instanceof Error ? error.message : String(error);
309
+ return {
310
+ content: [
311
+ {
312
+ type: "text",
313
+ text: `Error validating catalog configuration: ${message}`,
314
+ },
315
+ ],
316
+ isError: true,
317
+ };
318
+ }
319
+ });
320
+ }
321
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,8EAA8E;YAC9E,4EAA4E;YAC5E,qBAAqB;YACrB,gFAAgF;YAChF,6EAA6E;YAC7E,kBAAkB;YAClB,iFAAiF;YACjF,iEAAiE;YACjE,4CAA4C;YAC5C,+DAA+D;QACjE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,4CAA4C;gBAC1C,oDAAoD;gBACpD,4CAA4C,CAC/C;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACP,+CAA+C;gBAC7C,qCAAqC,CACxC;YACH,eAAe,EAAE,CAAC;iBACf,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,yDAAyD;gBACvD,uCAAuC,CAC1C;YACH,qBAAqB,EAAE,CAAC;iBACrB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,mEAAmE,CACpE;YACH,mBAAmB,EAAE,CAAC;iBACnB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,2CAA2C,CAC5C;YACH,sBAAsB,EAAE,CAAC;iBACtB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,8CAA8C,CAC/C;SACJ;KACF,EACD,KAAK,EAAE,EACL,QAAQ,EACR,KAAK,EACL,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,GACvB,EAAE,EAAE;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,QAAQ,EACR,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnB,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;gBAClD,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE;oBAChD,mBAAmB,EAAE,eAAe;oBACpC,oBAAoB,EAAE,qBAAqB;oBAC3C,iBAAiB,EAAE,mBAAmB;oBACtC,oBAAoB,EAAE,sBAAsB;iBAC7C,CAAC,CAAC;YACL,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,SAAS;YACT,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC9C,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC/C,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBACzB,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACpC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC5C,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACzC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YAED,cAAc;YACd,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAClC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACvC,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,iBAAiB,IAAI,kBAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,cAAc,MAAM,CAAC,MAAM,GAAG,CAC5H,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,iBAAiB;YACjB,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBACrC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACxC,KAAK,CAAC,IAAI,CACR,KAAK,IAAI,CAAC,IAAI,IAAI,WAAW,WAAW,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,cAAc,IAAI,CAAC,MAAM,GAAG,CACtH,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,0BAA0B,CAAC,CAAC;YAElE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,mCAAmC,OAAO,EAAE;qBACnD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,sEAAsE;YACtE,0EAA0E;YAC1E,oEAAoE;YACpE,0DAA0D;QAC5D,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,4CAA4C;gBAC1C,oDAAoD;gBACpD,4CAA4C,CAC/C;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACP,wDAAwD;gBACtD,0BAA0B,CAC7B;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACP,2CAA2C;gBACzC,sCAAsC,CACzC;SACJ;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAC3C,QAAQ,EACR,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnB,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;gBAClD,OAAO,MAAM,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,eAAe,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEjD,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBACxC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;YAChE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,OAAO,EAAE;qBAC3C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,oEAAoE;YACpE,qEAAqE;YACrE,sCAAsC;YACtC,mEAAmE;YACnE,6EAA6E;QAC/E,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,4CAA4C;gBAC1C,oDAAoD;gBACpD,4CAA4C,CAC/C;YACH,mBAAmB,EAAE,CAAC;iBACnB,MAAM,EAAE;iBACR,QAAQ,CACP,6CAA6C,CAC9C;SACJ;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,QAAQ,EACR,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnB,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;gBAClD,OAAO,MAAM,SAAS,CAAC,4BAA4B,CACjD,mBAAmB,CACpB,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,iBAAiB,mBAAmB,EAAE,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE3C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CACrD,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;oBAChD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;wBACjB,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5C,CAAC;oBACD,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;wBACd,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC1E,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CACR,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,QAAQ,iBAAiB,CACrG,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2CAA2C,OAAO,EAAE;qBAC3D;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the get_current_scope tool on the MCP server.
4
+ *
5
+ * This tool retrieves the currently active application scope on the ServiceNow
6
+ * instance. It mirrors the behavior of the CLI's `scope get` command.
7
+ */
8
+ export declare function registerGetCurrentScopeTool(server: McpServer): void;
9
+ /**
10
+ * Registers the set_current_scope tool on the MCP server.
11
+ *
12
+ * This tool changes the active application scope on the ServiceNow instance.
13
+ * It validates the app exists, records the previous scope, performs the change,
14
+ * and verifies the result. It mirrors the behavior of the CLI's `scope set` command.
15
+ */
16
+ export declare function registerSetCurrentScopeTool(server: McpServer): void;
17
+ /**
18
+ * Registers the list_scoped_apps tool on the MCP server.
19
+ *
20
+ * This tool lists scoped applications (sys_app records) on the ServiceNow
21
+ * instance with optional filtering. It mirrors the behavior of the CLI's
22
+ * `scope list` command.
23
+ */
24
+ export declare function registerListScopedAppsTool(server: McpServer): void;
25
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/tools/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsEnE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoFnE;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+FlE"}
@@ -0,0 +1,226 @@
1
+ import { z } from "zod";
2
+ import { ScopeManager } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the get_current_scope tool on the MCP server.
6
+ *
7
+ * This tool retrieves the currently active application scope on the ServiceNow
8
+ * instance. It mirrors the behavior of the CLI's `scope get` command.
9
+ */
10
+ export function registerGetCurrentScopeTool(server) {
11
+ server.registerTool("get_current_scope", {
12
+ title: "Get Current Application Scope",
13
+ description: "Get the currently active application scope on the ServiceNow instance.",
14
+ inputSchema: {
15
+ instance: z
16
+ .string()
17
+ .optional()
18
+ .describe("The ServiceNow instance auth alias to connect to. " +
19
+ "This is the alias configured via `snc configure` (e.g., " +
20
+ '"dev224436", "prod", "test"). The user will typically refer to ' +
21
+ "this by name when saying things like \"on my dev224436 instance\". " +
22
+ "If not provided, falls back to the SN_AUTH_ALIAS environment variable."),
23
+ },
24
+ }, async ({ instance }) => {
25
+ try {
26
+ const result = await withConnectionRetry(instance, async (snInstance) => {
27
+ const scopeManager = new ScopeManager(snInstance);
28
+ return await scopeManager.getCurrentApplication();
29
+ });
30
+ if (!result) {
31
+ return {
32
+ content: [
33
+ {
34
+ type: "text",
35
+ text: "No current application scope found.",
36
+ },
37
+ ],
38
+ };
39
+ }
40
+ const lines = [
41
+ "=== Current Application Scope ===",
42
+ `Name: ${result.name}`,
43
+ `Sys ID: ${result.sys_id}`,
44
+ `Scope: ${result.scope || "(unknown)"}`,
45
+ `Version: ${result.version || "(unknown)"}`,
46
+ `Active: ${result.active || "(unknown)"}`,
47
+ ];
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: lines.join("\n"),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (error) {
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: `Error getting current scope: ${message}`,
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ });
70
+ }
71
+ /**
72
+ * Registers the set_current_scope tool on the MCP server.
73
+ *
74
+ * This tool changes the active application scope on the ServiceNow instance.
75
+ * It validates the app exists, records the previous scope, performs the change,
76
+ * and verifies the result. It mirrors the behavior of the CLI's `scope set` command.
77
+ */
78
+ export function registerSetCurrentScopeTool(server) {
79
+ server.registerTool("set_current_scope", {
80
+ title: "Set Current Application Scope",
81
+ description: "Change the active application scope. Validates the app exists, records " +
82
+ "previous scope, verifies the change. IMPORTANT: This changes the session's " +
83
+ "application context.",
84
+ inputSchema: {
85
+ instance: z
86
+ .string()
87
+ .optional()
88
+ .describe("The ServiceNow instance auth alias to connect to. " +
89
+ "This is the alias configured via `snc configure` (e.g., " +
90
+ '"dev224436", "prod", "test"). The user will typically refer to ' +
91
+ "this by name when saying things like \"on my dev224436 instance\". " +
92
+ "If not provided, falls back to the SN_AUTH_ALIAS environment variable."),
93
+ app_sys_id: z
94
+ .string()
95
+ .describe("The sys_id of the application to set as the current scope. " +
96
+ "Must be a 32-character hexadecimal string (e.g., " +
97
+ '"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6").'),
98
+ },
99
+ }, async ({ instance, app_sys_id }) => {
100
+ try {
101
+ const result = await withConnectionRetry(instance, async (snInstance) => {
102
+ const scopeManager = new ScopeManager(snInstance);
103
+ return await scopeManager.setCurrentApplication(app_sys_id);
104
+ });
105
+ const lines = [
106
+ "=== Set Application Scope ===",
107
+ `Success: ${result.success}`,
108
+ `Application: ${result.application}`,
109
+ `Scope: ${result.scope || "(unknown)"}`,
110
+ `Sys ID: ${result.sysId}`,
111
+ `Verified: ${result.verified}`,
112
+ ];
113
+ if (result.previousScope) {
114
+ lines.push("", "--- Previous Scope ---", `Name: ${result.previousScope.name || "(unknown)"}`, `Sys ID: ${result.previousScope.sys_id || "(unknown)"}`);
115
+ }
116
+ if (result.warnings.length > 0) {
117
+ lines.push("", "--- Warnings ---");
118
+ for (const warning of result.warnings) {
119
+ lines.push(` - ${warning}`);
120
+ }
121
+ }
122
+ return {
123
+ content: [
124
+ {
125
+ type: "text",
126
+ text: lines.join("\n"),
127
+ },
128
+ ],
129
+ };
130
+ }
131
+ catch (error) {
132
+ const message = error instanceof Error ? error.message : String(error);
133
+ return {
134
+ content: [
135
+ {
136
+ type: "text",
137
+ text: `Error setting current scope: ${message}`,
138
+ },
139
+ ],
140
+ isError: true,
141
+ };
142
+ }
143
+ });
144
+ }
145
+ /**
146
+ * Registers the list_scoped_apps tool on the MCP server.
147
+ *
148
+ * This tool lists scoped applications (sys_app records) on the ServiceNow
149
+ * instance with optional filtering. It mirrors the behavior of the CLI's
150
+ * `scope list` command.
151
+ */
152
+ export function registerListScopedAppsTool(server) {
153
+ server.registerTool("list_scoped_apps", {
154
+ title: "List Scoped Applications",
155
+ description: "List scoped applications (sys_app records) on the instance with optional filtering.",
156
+ inputSchema: {
157
+ instance: z
158
+ .string()
159
+ .optional()
160
+ .describe("The ServiceNow instance auth alias to connect to. " +
161
+ "This is the alias configured via `snc configure` (e.g., " +
162
+ '"dev224436", "prod", "test"). The user will typically refer to ' +
163
+ "this by name when saying things like \"on my dev224436 instance\". " +
164
+ "If not provided, falls back to the SN_AUTH_ALIAS environment variable."),
165
+ query: z
166
+ .string()
167
+ .optional()
168
+ .describe("An encoded query string to filter applications. Uses ServiceNow " +
169
+ "encoded query syntax (e.g., \"active=true^scopeSTARTSWITHx_\", " +
170
+ "\"nameLIKEhr\"). If omitted, all applications are returned."),
171
+ limit: z
172
+ .number()
173
+ .min(1)
174
+ .max(200)
175
+ .default(50)
176
+ .describe("Maximum number of applications to return. Defaults to 50, " +
177
+ "minimum 1, maximum 200."),
178
+ },
179
+ }, async ({ instance, query, limit }) => {
180
+ try {
181
+ const apps = await withConnectionRetry(instance, async (snInstance) => {
182
+ const scopeManager = new ScopeManager(snInstance);
183
+ return await scopeManager.listApplications({ encodedQuery: query, limit });
184
+ });
185
+ if (!apps || apps.length === 0) {
186
+ return {
187
+ content: [
188
+ {
189
+ type: "text",
190
+ text: "No scoped applications found matching the criteria.",
191
+ },
192
+ ],
193
+ };
194
+ }
195
+ const lines = [
196
+ `=== Scoped Applications (${apps.length} found) ===`,
197
+ "",
198
+ ];
199
+ for (let i = 0; i < apps.length; i++) {
200
+ const app = apps[i];
201
+ lines.push(`${i + 1}. ${app.name}`, ` Sys ID: ${app.sys_id}`, ` Scope: ${app.scope || "(unknown)"}`, ` Version: ${app.version || "(unknown)"}`, ` Active: ${app.active || "(unknown)"}`, "");
202
+ }
203
+ return {
204
+ content: [
205
+ {
206
+ type: "text",
207
+ text: lines.join("\n"),
208
+ },
209
+ ],
210
+ };
211
+ }
212
+ catch (error) {
213
+ const message = error instanceof Error ? error.message : String(error);
214
+ return {
215
+ content: [
216
+ {
217
+ type: "text",
218
+ text: `Error listing scoped applications: ${message}`,
219
+ },
220
+ ],
221
+ isError: true,
222
+ };
223
+ }
224
+ });
225
+ }
226
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/tools/scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the pull_script tool on the MCP server.
4
+ *
5
+ * Pulls a script from ServiceNow and saves it to a local file.
6
+ */
7
+ export declare function registerPullScriptTool(server: McpServer): void;
8
+ /**
9
+ * Registers the push_script tool on the MCP server.
10
+ *
11
+ * Pushes a local script file to ServiceNow.
12
+ */
13
+ export declare function registerPushScriptTool(server: McpServer): void;
14
+ //# sourceMappingURL=scriptsync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scriptsync.d.ts","sourceRoot":"","sources":["../../src/tools/scriptsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwF9D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuF9D"}