@tedorigawa001/servicenow-mcp 1.0.2

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 (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +844 -0
  3. package/dist/cli/auth.d.ts +15 -0
  4. package/dist/cli/auth.d.ts.map +1 -0
  5. package/dist/cli/auth.js +200 -0
  6. package/dist/cli/auth.js.map +1 -0
  7. package/dist/cli/config-store.d.ts +28 -0
  8. package/dist/cli/config-store.d.ts.map +1 -0
  9. package/dist/cli/config-store.js +66 -0
  10. package/dist/cli/config-store.js.map +1 -0
  11. package/dist/cli/detect-clients.d.ts +16 -0
  12. package/dist/cli/detect-clients.d.ts.map +1 -0
  13. package/dist/cli/detect-clients.js +151 -0
  14. package/dist/cli/detect-clients.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +135 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/setup.d.ts +4 -0
  20. package/dist/cli/setup.d.ts.map +1 -0
  21. package/dist/cli/setup.js +564 -0
  22. package/dist/cli/setup.js.map +1 -0
  23. package/dist/cli/writers/index.d.ts +9 -0
  24. package/dist/cli/writers/index.d.ts.map +1 -0
  25. package/dist/cli/writers/index.js +135 -0
  26. package/dist/cli/writers/index.js.map +1 -0
  27. package/dist/prompts/index.d.ts +25 -0
  28. package/dist/prompts/index.d.ts.map +1 -0
  29. package/dist/prompts/index.js +38 -0
  30. package/dist/prompts/index.js.map +1 -0
  31. package/dist/prompts/itsm.d.ts +20 -0
  32. package/dist/prompts/itsm.d.ts.map +1 -0
  33. package/dist/prompts/itsm.js +110 -0
  34. package/dist/prompts/itsm.js.map +1 -0
  35. package/dist/prompts/user-prompts.d.ts +3 -0
  36. package/dist/prompts/user-prompts.d.ts.map +1 -0
  37. package/dist/prompts/user-prompts.js +35 -0
  38. package/dist/prompts/user-prompts.js.map +1 -0
  39. package/dist/resources/index.d.ts +26 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +99 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/server-http.d.ts +41 -0
  44. package/dist/server-http.d.ts.map +1 -0
  45. package/dist/server-http.js +187 -0
  46. package/dist/server-http.js.map +1 -0
  47. package/dist/server.d.ts +54 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +150 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/servicenow/client.d.ts +137 -0
  52. package/dist/servicenow/client.d.ts.map +1 -0
  53. package/dist/servicenow/client.js +855 -0
  54. package/dist/servicenow/client.js.map +1 -0
  55. package/dist/servicenow/instances.d.ts +28 -0
  56. package/dist/servicenow/instances.d.ts.map +1 -0
  57. package/dist/servicenow/instances.js +190 -0
  58. package/dist/servicenow/instances.js.map +1 -0
  59. package/dist/servicenow/types.d.ts +578 -0
  60. package/dist/servicenow/types.d.ts.map +1 -0
  61. package/dist/servicenow/types.js +3 -0
  62. package/dist/servicenow/types.js.map +1 -0
  63. package/dist/tools/agile.d.ts +225 -0
  64. package/dist/tools/agile.d.ts.map +1 -0
  65. package/dist/tools/agile.js +205 -0
  66. package/dist/tools/agile.js.map +1 -0
  67. package/dist/tools/app-studio.d.ts +139 -0
  68. package/dist/tools/app-studio.d.ts.map +1 -0
  69. package/dist/tools/app-studio.js +139 -0
  70. package/dist/tools/app-studio.js.map +1 -0
  71. package/dist/tools/atf.d.ts +144 -0
  72. package/dist/tools/atf.d.ts.map +1 -0
  73. package/dist/tools/atf.js +186 -0
  74. package/dist/tools/atf.js.map +1 -0
  75. package/dist/tools/catalog.d.ts +966 -0
  76. package/dist/tools/catalog.d.ts.map +1 -0
  77. package/dist/tools/catalog.js +640 -0
  78. package/dist/tools/catalog.js.map +1 -0
  79. package/dist/tools/change.d.ts +351 -0
  80. package/dist/tools/change.d.ts.map +1 -0
  81. package/dist/tools/change.js +214 -0
  82. package/dist/tools/change.js.map +1 -0
  83. package/dist/tools/core.d.ts +768 -0
  84. package/dist/tools/core.d.ts.map +1 -0
  85. package/dist/tools/core.js +695 -0
  86. package/dist/tools/core.js.map +1 -0
  87. package/dist/tools/csm.d.ts +403 -0
  88. package/dist/tools/csm.d.ts.map +1 -0
  89. package/dist/tools/csm.js +256 -0
  90. package/dist/tools/csm.js.map +1 -0
  91. package/dist/tools/deployment.d.ts +366 -0
  92. package/dist/tools/deployment.d.ts.map +1 -0
  93. package/dist/tools/deployment.js +181 -0
  94. package/dist/tools/deployment.js.map +1 -0
  95. package/dist/tools/devops.d.ts +236 -0
  96. package/dist/tools/devops.d.ts.map +1 -0
  97. package/dist/tools/devops.js +207 -0
  98. package/dist/tools/devops.js.map +1 -0
  99. package/dist/tools/discovery.d.ts +306 -0
  100. package/dist/tools/discovery.d.ts.map +1 -0
  101. package/dist/tools/discovery.js +357 -0
  102. package/dist/tools/discovery.js.map +1 -0
  103. package/dist/tools/flow.d.ts +496 -0
  104. package/dist/tools/flow.d.ts.map +1 -0
  105. package/dist/tools/flow.js +348 -0
  106. package/dist/tools/flow.js.map +1 -0
  107. package/dist/tools/hrsd.d.ts +790 -0
  108. package/dist/tools/hrsd.d.ts.map +1 -0
  109. package/dist/tools/hrsd.js +378 -0
  110. package/dist/tools/hrsd.js.map +1 -0
  111. package/dist/tools/incident.d.ts +259 -0
  112. package/dist/tools/incident.d.ts.map +1 -0
  113. package/dist/tools/incident.js +170 -0
  114. package/dist/tools/incident.js.map +1 -0
  115. package/dist/tools/index.d.ts +13 -0
  116. package/dist/tools/index.d.ts.map +1 -0
  117. package/dist/tools/index.js +385 -0
  118. package/dist/tools/index.js.map +1 -0
  119. package/dist/tools/integration.d.ts +940 -0
  120. package/dist/tools/integration.d.ts.map +1 -0
  121. package/dist/tools/integration.js +685 -0
  122. package/dist/tools/integration.js.map +1 -0
  123. package/dist/tools/itam.d.ts +462 -0
  124. package/dist/tools/itam.d.ts.map +1 -0
  125. package/dist/tools/itam.js +306 -0
  126. package/dist/tools/itam.js.map +1 -0
  127. package/dist/tools/knowledge.d.ts +187 -0
  128. package/dist/tools/knowledge.d.ts.map +1 -0
  129. package/dist/tools/knowledge.js +161 -0
  130. package/dist/tools/knowledge.js.map +1 -0
  131. package/dist/tools/ml.d.ts +263 -0
  132. package/dist/tools/ml.d.ts.map +1 -0
  133. package/dist/tools/ml.js +251 -0
  134. package/dist/tools/ml.js.map +1 -0
  135. package/dist/tools/mobile.d.ts +352 -0
  136. package/dist/tools/mobile.d.ts.map +1 -0
  137. package/dist/tools/mobile.js +122 -0
  138. package/dist/tools/mobile.js.map +1 -0
  139. package/dist/tools/notification.d.ts +590 -0
  140. package/dist/tools/notification.d.ts.map +1 -0
  141. package/dist/tools/notification.js +382 -0
  142. package/dist/tools/notification.js.map +1 -0
  143. package/dist/tools/now-assist.d.ts +300 -0
  144. package/dist/tools/now-assist.d.ts.map +1 -0
  145. package/dist/tools/now-assist.js +227 -0
  146. package/dist/tools/now-assist.js.map +1 -0
  147. package/dist/tools/performance.d.ts +447 -0
  148. package/dist/tools/performance.d.ts.map +1 -0
  149. package/dist/tools/performance.js +473 -0
  150. package/dist/tools/performance.js.map +1 -0
  151. package/dist/tools/portal.d.ts +530 -0
  152. package/dist/tools/portal.d.ts.map +1 -0
  153. package/dist/tools/portal.js +425 -0
  154. package/dist/tools/portal.js.map +1 -0
  155. package/dist/tools/problem.d.ts +111 -0
  156. package/dist/tools/problem.d.ts.map +1 -0
  157. package/dist/tools/problem.js +101 -0
  158. package/dist/tools/problem.js.map +1 -0
  159. package/dist/tools/reporting.d.ts +825 -0
  160. package/dist/tools/reporting.d.ts.map +1 -0
  161. package/dist/tools/reporting.js +453 -0
  162. package/dist/tools/reporting.js.map +1 -0
  163. package/dist/tools/sam.d.ts +312 -0
  164. package/dist/tools/sam.d.ts.map +1 -0
  165. package/dist/tools/sam.js +360 -0
  166. package/dist/tools/sam.js.map +1 -0
  167. package/dist/tools/schema-helpers.d.ts +119 -0
  168. package/dist/tools/schema-helpers.d.ts.map +1 -0
  169. package/dist/tools/schema-helpers.js +121 -0
  170. package/dist/tools/schema-helpers.js.map +1 -0
  171. package/dist/tools/script.d.ts +714 -0
  172. package/dist/tools/script.d.ts.map +1 -0
  173. package/dist/tools/script.js +629 -0
  174. package/dist/tools/script.js.map +1 -0
  175. package/dist/tools/security.d.ts +802 -0
  176. package/dist/tools/security.d.ts.map +1 -0
  177. package/dist/tools/security.js +426 -0
  178. package/dist/tools/security.js.map +1 -0
  179. package/dist/tools/smart-query.d.ts +84 -0
  180. package/dist/tools/smart-query.d.ts.map +1 -0
  181. package/dist/tools/smart-query.js +320 -0
  182. package/dist/tools/smart-query.js.map +1 -0
  183. package/dist/tools/sys-properties.d.ts +315 -0
  184. package/dist/tools/sys-properties.d.ts.map +1 -0
  185. package/dist/tools/sys-properties.js +416 -0
  186. package/dist/tools/sys-properties.js.map +1 -0
  187. package/dist/tools/task.d.ts +82 -0
  188. package/dist/tools/task.d.ts.map +1 -0
  189. package/dist/tools/task.js +96 -0
  190. package/dist/tools/task.js.map +1 -0
  191. package/dist/tools/updateset.d.ts +159 -0
  192. package/dist/tools/updateset.d.ts.map +1 -0
  193. package/dist/tools/updateset.js +266 -0
  194. package/dist/tools/updateset.js.map +1 -0
  195. package/dist/tools/usem-approval.d.ts +130 -0
  196. package/dist/tools/usem-approval.d.ts.map +1 -0
  197. package/dist/tools/usem-approval.js +194 -0
  198. package/dist/tools/usem-approval.js.map +1 -0
  199. package/dist/tools/usem-config.d.ts +171 -0
  200. package/dist/tools/usem-config.d.ts.map +1 -0
  201. package/dist/tools/usem-config.js +254 -0
  202. package/dist/tools/usem-config.js.map +1 -0
  203. package/dist/tools/usem-integration.d.ts +228 -0
  204. package/dist/tools/usem-integration.d.ts.map +1 -0
  205. package/dist/tools/usem-integration.js +223 -0
  206. package/dist/tools/usem-integration.js.map +1 -0
  207. package/dist/tools/usem-sla.d.ts +201 -0
  208. package/dist/tools/usem-sla.d.ts.map +1 -0
  209. package/dist/tools/usem-sla.js +322 -0
  210. package/dist/tools/usem-sla.js.map +1 -0
  211. package/dist/tools/usem.d.ts +489 -0
  212. package/dist/tools/usem.d.ts.map +1 -0
  213. package/dist/tools/usem.js +514 -0
  214. package/dist/tools/usem.js.map +1 -0
  215. package/dist/tools/user.d.ts +206 -0
  216. package/dist/tools/user.d.ts.map +1 -0
  217. package/dist/tools/user.js +163 -0
  218. package/dist/tools/user.js.map +1 -0
  219. package/dist/tools/va.d.ts +217 -0
  220. package/dist/tools/va.d.ts.map +1 -0
  221. package/dist/tools/va.js +178 -0
  222. package/dist/tools/va.js.map +1 -0
  223. package/dist/tools/workspace.d.ts +565 -0
  224. package/dist/tools/workspace.d.ts.map +1 -0
  225. package/dist/tools/workspace.js +201 -0
  226. package/dist/tools/workspace.js.map +1 -0
  227. package/dist/utils/errors.d.ts +6 -0
  228. package/dist/utils/errors.d.ts.map +1 -0
  229. package/dist/utils/errors.js +11 -0
  230. package/dist/utils/errors.js.map +1 -0
  231. package/dist/utils/logging.d.ts +7 -0
  232. package/dist/utils/logging.d.ts.map +1 -0
  233. package/dist/utils/logging.js +15 -0
  234. package/dist/utils/logging.js.map +1 -0
  235. package/dist/utils/permissions.d.ts +21 -0
  236. package/dist/utils/permissions.d.ts.map +1 -0
  237. package/dist/utils/permissions.js +54 -0
  238. package/dist/utils/permissions.js.map +1 -0
  239. package/instances.example.json +69 -0
  240. package/package.json +110 -0
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Software Asset Management (SAM Pro) tools — discovered installs, product
3
+ * catalog, license-position compliance, software models, and EOL/EOS lifecycle.
4
+ *
5
+ * Tier 0 (Read): list_software_installs, get_software_install, list_software_products,
6
+ * list_license_positions, get_license_position_summary,
7
+ * list_software_discovery_models, list_software_models, get_software_model,
8
+ * list_software_lifecycle_reports, get_software_lifecycle_report,
9
+ * list_software_lifecycle_entries
10
+ *
11
+ * ServiceNow tables: cmdb_sam_sw_install, samp_sw_product, samp_license_position_report,
12
+ * cmdb_sam_sw_discovery_model, cmdb_software_product_model,
13
+ * sam_sw_product_lifecycle_report, sam_sw_product_lifecycle
14
+ *
15
+ * Note: license-position and lifecycle-report figures are computed by the SAM Pro
16
+ * reconciliation job, not user-editable — this module is read-only by design.
17
+ */
18
+ import type { ServiceNowClient } from '../servicenow/client.js';
19
+ export declare function getSamToolDefinitions(): ({
20
+ name: string;
21
+ description: string;
22
+ inputSchema: {
23
+ type: string;
24
+ properties: {
25
+ publisher: {
26
+ type: string;
27
+ description: string;
28
+ };
29
+ product: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ unlicensed_only: {
34
+ type: string;
35
+ description: string;
36
+ };
37
+ query: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ limit: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ sys_id?: undefined;
46
+ name?: undefined;
47
+ over_licensed_only?: undefined;
48
+ approved?: undefined;
49
+ current_phase?: undefined;
50
+ lifecycle_phase?: undefined;
51
+ risk?: undefined;
52
+ active?: undefined;
53
+ };
54
+ required: never[];
55
+ };
56
+ } | {
57
+ name: string;
58
+ description: string;
59
+ inputSchema: {
60
+ type: string;
61
+ properties: {
62
+ sys_id: {
63
+ type: string;
64
+ description: string;
65
+ };
66
+ publisher?: undefined;
67
+ product?: undefined;
68
+ unlicensed_only?: undefined;
69
+ query?: undefined;
70
+ limit?: undefined;
71
+ name?: undefined;
72
+ over_licensed_only?: undefined;
73
+ approved?: undefined;
74
+ current_phase?: undefined;
75
+ lifecycle_phase?: undefined;
76
+ risk?: undefined;
77
+ active?: undefined;
78
+ };
79
+ required: string[];
80
+ };
81
+ } | {
82
+ name: string;
83
+ description: string;
84
+ inputSchema: {
85
+ type: string;
86
+ properties: {
87
+ publisher: {
88
+ type: string;
89
+ description: string;
90
+ };
91
+ name: {
92
+ type: string;
93
+ description: string;
94
+ };
95
+ limit: {
96
+ type: string;
97
+ description: string;
98
+ };
99
+ product?: undefined;
100
+ unlicensed_only?: undefined;
101
+ query?: undefined;
102
+ sys_id?: undefined;
103
+ over_licensed_only?: undefined;
104
+ approved?: undefined;
105
+ current_phase?: undefined;
106
+ lifecycle_phase?: undefined;
107
+ risk?: undefined;
108
+ active?: undefined;
109
+ };
110
+ required: never[];
111
+ };
112
+ } | {
113
+ name: string;
114
+ description: string;
115
+ inputSchema: {
116
+ type: string;
117
+ properties: {
118
+ publisher: {
119
+ type: string;
120
+ description: string;
121
+ };
122
+ product: {
123
+ type: string;
124
+ description: string;
125
+ };
126
+ over_licensed_only: {
127
+ type: string;
128
+ description: string;
129
+ };
130
+ limit: {
131
+ type: string;
132
+ description: string;
133
+ };
134
+ unlicensed_only?: undefined;
135
+ query?: undefined;
136
+ sys_id?: undefined;
137
+ name?: undefined;
138
+ approved?: undefined;
139
+ current_phase?: undefined;
140
+ lifecycle_phase?: undefined;
141
+ risk?: undefined;
142
+ active?: undefined;
143
+ };
144
+ required: never[];
145
+ };
146
+ } | {
147
+ name: string;
148
+ description: string;
149
+ inputSchema: {
150
+ type: string;
151
+ properties: {
152
+ publisher: {
153
+ type: string;
154
+ description: string;
155
+ };
156
+ product?: undefined;
157
+ unlicensed_only?: undefined;
158
+ query?: undefined;
159
+ limit?: undefined;
160
+ sys_id?: undefined;
161
+ name?: undefined;
162
+ over_licensed_only?: undefined;
163
+ approved?: undefined;
164
+ current_phase?: undefined;
165
+ lifecycle_phase?: undefined;
166
+ risk?: undefined;
167
+ active?: undefined;
168
+ };
169
+ required: never[];
170
+ };
171
+ } | {
172
+ name: string;
173
+ description: string;
174
+ inputSchema: {
175
+ type: string;
176
+ properties: {
177
+ publisher: {
178
+ type: string;
179
+ description: string;
180
+ };
181
+ approved: {
182
+ type: string;
183
+ description: string;
184
+ };
185
+ limit: {
186
+ type: string;
187
+ description: string;
188
+ };
189
+ product?: undefined;
190
+ unlicensed_only?: undefined;
191
+ query?: undefined;
192
+ sys_id?: undefined;
193
+ name?: undefined;
194
+ over_licensed_only?: undefined;
195
+ current_phase?: undefined;
196
+ lifecycle_phase?: undefined;
197
+ risk?: undefined;
198
+ active?: undefined;
199
+ };
200
+ required: never[];
201
+ };
202
+ } | {
203
+ name: string;
204
+ description: string;
205
+ inputSchema: {
206
+ type: string;
207
+ properties: {
208
+ publisher: {
209
+ type: string;
210
+ description: string;
211
+ };
212
+ product: {
213
+ type: string;
214
+ description: string;
215
+ };
216
+ query: {
217
+ type: string;
218
+ description: string;
219
+ };
220
+ limit: {
221
+ type: string;
222
+ description: string;
223
+ };
224
+ unlicensed_only?: undefined;
225
+ sys_id?: undefined;
226
+ name?: undefined;
227
+ over_licensed_only?: undefined;
228
+ approved?: undefined;
229
+ current_phase?: undefined;
230
+ lifecycle_phase?: undefined;
231
+ risk?: undefined;
232
+ active?: undefined;
233
+ };
234
+ required: never[];
235
+ };
236
+ } | {
237
+ name: string;
238
+ description: string;
239
+ inputSchema: {
240
+ type: string;
241
+ properties: {
242
+ publisher: {
243
+ type: string;
244
+ description: string;
245
+ };
246
+ product: {
247
+ type: string;
248
+ description: string;
249
+ };
250
+ current_phase: {
251
+ type: string;
252
+ description: string;
253
+ };
254
+ limit: {
255
+ type: string;
256
+ description: string;
257
+ };
258
+ unlicensed_only?: undefined;
259
+ query?: undefined;
260
+ sys_id?: undefined;
261
+ name?: undefined;
262
+ over_licensed_only?: undefined;
263
+ approved?: undefined;
264
+ lifecycle_phase?: undefined;
265
+ risk?: undefined;
266
+ active?: undefined;
267
+ };
268
+ required: never[];
269
+ };
270
+ } | {
271
+ name: string;
272
+ description: string;
273
+ inputSchema: {
274
+ type: string;
275
+ properties: {
276
+ publisher: {
277
+ type: string;
278
+ description: string;
279
+ };
280
+ product: {
281
+ type: string;
282
+ description: string;
283
+ };
284
+ lifecycle_phase: {
285
+ type: string;
286
+ description: string;
287
+ };
288
+ risk: {
289
+ type: string;
290
+ description: string;
291
+ };
292
+ active: {
293
+ type: string;
294
+ description: string;
295
+ };
296
+ limit: {
297
+ type: string;
298
+ description: string;
299
+ };
300
+ unlicensed_only?: undefined;
301
+ query?: undefined;
302
+ sys_id?: undefined;
303
+ name?: undefined;
304
+ over_licensed_only?: undefined;
305
+ approved?: undefined;
306
+ current_phase?: undefined;
307
+ };
308
+ required: never[];
309
+ };
310
+ })[];
311
+ export declare function executeSamToolCall(client: ServiceNowClient, name: string, args: Record<string, any>): Promise<any>;
312
+ //# sourceMappingURL=sam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sam.d.ts","sourceRoot":"","sources":["../../src/tools/sam.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAoChE,wBAAgB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkJpC;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,GAAG,CAAC,CAuKd"}
@@ -0,0 +1,360 @@
1
+ import { ServiceNowError } from '../utils/errors.js';
2
+ /**
3
+ * `lifecycle_phase` / `current_lifecycle_phase` and `risk` are plain string
4
+ * fields backed by a sys_choice list — the encoded query needs the internal
5
+ * choice value (e.g. "very_high"), not the display label ("Very High").
6
+ * Confirmed live against dev400464's sys_choice records for both tables.
7
+ */
8
+ const LIFECYCLE_PHASE_CHOICES = {
9
+ 'pre release': 'pre_release',
10
+ 'general availability': 'availability',
11
+ ga: 'availability',
12
+ availability: 'availability',
13
+ upgrade: 'upgrade',
14
+ 'end of support': 'end_of_support',
15
+ eos: 'end_of_support',
16
+ 'end of extended support': 'end_of_extended_support',
17
+ eoes: 'end_of_extended_support',
18
+ 'end of life': 'end_of_life',
19
+ eol: 'end_of_life',
20
+ };
21
+ const RISK_CHOICES = {
22
+ none: 'none',
23
+ low: 'low',
24
+ moderate: 'moderate',
25
+ medium: 'moderate',
26
+ high: 'high',
27
+ 'very high': 'very_high',
28
+ };
29
+ function normalizeChoice(input, map) {
30
+ const key = input.trim().toLowerCase().replace(/[_-]+/g, ' ').replace(/\s+/g, ' ');
31
+ return map[key] ?? input;
32
+ }
33
+ export function getSamToolDefinitions() {
34
+ return [
35
+ {
36
+ name: 'list_software_installs',
37
+ description: 'List discovered software installations with publisher, version, and license status',
38
+ inputSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ publisher: { type: 'string', description: 'Filter by normalized publisher name' },
42
+ product: { type: 'string', description: 'Filter by normalized product / display name' },
43
+ unlicensed_only: { type: 'boolean', description: 'Only installs flagged as unlicensed' },
44
+ query: { type: 'string', description: 'Additional encoded query' },
45
+ limit: { type: 'number', description: 'Max records (default 25)' },
46
+ },
47
+ required: [],
48
+ },
49
+ },
50
+ {
51
+ name: 'get_software_install',
52
+ description: 'Get full details of a discovered software installation',
53
+ inputSchema: {
54
+ type: 'object',
55
+ properties: {
56
+ sys_id: { type: 'string', description: 'cmdb_sam_sw_install sys_id' },
57
+ },
58
+ required: ['sys_id'],
59
+ },
60
+ },
61
+ {
62
+ name: 'list_software_products',
63
+ description: 'List the normalized software product catalog (publisher, product type)',
64
+ inputSchema: {
65
+ type: 'object',
66
+ properties: {
67
+ publisher: { type: 'string', description: 'Filter by publisher name' },
68
+ name: { type: 'string', description: 'Filter by product name (LIKE match)' },
69
+ limit: { type: 'number', description: 'Max records (default 25)' },
70
+ },
71
+ required: [],
72
+ },
73
+ },
74
+ {
75
+ name: 'list_license_positions',
76
+ description: 'List SAM Pro effective license position (ELP) records — owned vs. used rights per product',
77
+ inputSchema: {
78
+ type: 'object',
79
+ properties: {
80
+ publisher: { type: 'string', description: 'Filter by publisher name' },
81
+ product: { type: 'string', description: 'Filter by product name' },
82
+ over_licensed_only: { type: 'boolean', description: 'Only positions with unused rights / potential savings > 0' },
83
+ limit: { type: 'number', description: 'Max records (default 25)' },
84
+ },
85
+ required: [],
86
+ },
87
+ },
88
+ {
89
+ name: 'get_license_position_summary',
90
+ description: 'Aggregate license-compliance dashboard: over-licensed vs. under-licensed counts, total potential savings, total true-up cost',
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ publisher: { type: 'string', description: 'Optional filter by publisher name' },
95
+ },
96
+ required: [],
97
+ },
98
+ },
99
+ {
100
+ name: 'list_software_discovery_models',
101
+ description: 'List normalized software discovery models (raw discovery output before/after normalization)',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ publisher: { type: 'string', description: 'Filter by normalized publisher name' },
106
+ approved: { type: 'boolean', description: 'Filter by normalization approval status' },
107
+ limit: { type: 'number', description: 'Max records (default 25)' },
108
+ },
109
+ required: [],
110
+ },
111
+ },
112
+ {
113
+ name: 'list_software_models',
114
+ description: 'List software models — specific version/edition entitlement units of a product (license type, EOL date, install count)',
115
+ inputSchema: {
116
+ type: 'object',
117
+ properties: {
118
+ publisher: { type: 'string', description: 'Filter by manufacturer/publisher name' },
119
+ product: { type: 'string', description: 'Filter by product name' },
120
+ query: { type: 'string', description: 'Additional encoded query' },
121
+ limit: { type: 'number', description: 'Max records (default 25)' },
122
+ },
123
+ required: [],
124
+ },
125
+ },
126
+ {
127
+ name: 'get_software_model',
128
+ description: 'Get full details of a software model (rights, consumption rules, EOL date, lifecycle stage)',
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ sys_id: { type: 'string', description: 'cmdb_software_product_model sys_id' },
133
+ },
134
+ required: ['sys_id'],
135
+ },
136
+ },
137
+ {
138
+ name: 'list_software_lifecycle_reports',
139
+ description: 'List software lifecycle reports — current/upcoming EOL/EOS phase, install count, and CVE exposure per product',
140
+ inputSchema: {
141
+ type: 'object',
142
+ properties: {
143
+ publisher: { type: 'string', description: 'Filter by manufacturer/publisher name' },
144
+ product: { type: 'string', description: 'Filter by product name' },
145
+ current_phase: { type: 'string', description: 'Filter by current lifecycle phase (e.g. "End of Life", "General Availability")' },
146
+ limit: { type: 'number', description: 'Max records (default 25)' },
147
+ },
148
+ required: [],
149
+ },
150
+ },
151
+ {
152
+ name: 'get_software_lifecycle_report',
153
+ description: 'Get full lifecycle report details for one product (all phase dates, CVE breakdown, owners)',
154
+ inputSchema: {
155
+ type: 'object',
156
+ properties: {
157
+ sys_id: { type: 'string', description: 'sam_sw_product_lifecycle_report sys_id' },
158
+ },
159
+ required: ['sys_id'],
160
+ },
161
+ },
162
+ {
163
+ name: 'list_software_lifecycle_entries',
164
+ description: 'List software lifecycle master data — publisher-provided phase entries (GA/EOL/EOS/EOES) per product/version, with risk rating',
165
+ inputSchema: {
166
+ type: 'object',
167
+ properties: {
168
+ publisher: { type: 'string', description: 'Filter by publisher name' },
169
+ product: { type: 'string', description: 'Filter by normalized product name' },
170
+ lifecycle_phase: { type: 'string', description: 'Filter by phase (e.g. "End of life", "General availability")' },
171
+ risk: { type: 'string', description: 'Filter by risk level (e.g. "Very High", "High", "Medium", "Low")' },
172
+ active: { type: 'boolean', description: 'Filter by active status (default: only active entries)' },
173
+ limit: { type: 'number', description: 'Max records (default 25)' },
174
+ },
175
+ required: [],
176
+ },
177
+ },
178
+ ];
179
+ }
180
+ export async function executeSamToolCall(client, name, args) {
181
+ switch (name) {
182
+ case 'list_software_installs': {
183
+ let query = '';
184
+ if (args.publisher)
185
+ query = `norm_publisherLIKE${args.publisher}`;
186
+ if (args.product)
187
+ query = query ? `${query}^norm_productLIKE${args.product}` : `norm_productLIKE${args.product}`;
188
+ if (args.unlicensed_only)
189
+ query = query ? `${query}^unlicensed_install=true` : 'unlicensed_install=true';
190
+ if (args.query)
191
+ query = query ? `${query}^${args.query}` : args.query;
192
+ const resp = await client.queryRecords({
193
+ table: 'cmdb_sam_sw_install',
194
+ query: query || undefined,
195
+ limit: args.limit || 25,
196
+ display_value: true,
197
+ fields: 'sys_id,display_name,norm_publisher,norm_product,version,install_date,unlicensed_install,is_reconciled,last_used,active,installed_on',
198
+ });
199
+ return { count: resp.count, installs: resp.records };
200
+ }
201
+ case 'get_software_install': {
202
+ if (!args.sys_id)
203
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
204
+ return await client.getRecord('cmdb_sam_sw_install', args.sys_id);
205
+ }
206
+ case 'list_software_products': {
207
+ let query = '';
208
+ if (args.publisher)
209
+ query = `publisherLIKE${args.publisher}`;
210
+ if (args.name)
211
+ query = query ? `${query}^prod_nameLIKE${args.name}` : `prod_nameLIKE${args.name}`;
212
+ const resp = await client.queryRecords({
213
+ table: 'samp_sw_product',
214
+ query: query || undefined,
215
+ limit: args.limit || 25,
216
+ display_value: true,
217
+ fields: 'sys_id,prod_name,publisher,product_type,function_type,active',
218
+ });
219
+ return { count: resp.count, products: resp.records };
220
+ }
221
+ case 'list_license_positions': {
222
+ let query = '';
223
+ if (args.publisher)
224
+ query = `publisherLIKE${args.publisher}`;
225
+ if (args.product)
226
+ query = query ? `${query}^productLIKE${args.product}` : `productLIKE${args.product}`;
227
+ if (args.over_licensed_only)
228
+ query = query ? `${query}^over_licensed_amount>0` : 'over_licensed_amount>0';
229
+ const resp = await client.queryRecords({
230
+ table: 'samp_license_position_report',
231
+ query: query || undefined,
232
+ limit: args.limit || 25,
233
+ display_value: true,
234
+ fields: 'sys_id,product,publisher,licenses_owned,licenses_required,rights_owned,rights_used,rights_consumed,unused_rights,over_licensed_amount,potential_savings,status,total_spend,true_up_cost',
235
+ });
236
+ return { count: resp.count, positions: resp.records };
237
+ }
238
+ case 'get_license_position_summary': {
239
+ const query = args.publisher ? `publisherLIKE${args.publisher}` : undefined;
240
+ // display_value is omitted here: currency fields (over_licensed_amount,
241
+ // potential_savings, true_up_cost) come back as formatted strings like
242
+ // "$3,855,035.2455" under display_value, which breaks Number() parsing below.
243
+ const resp = await client.queryRecords({
244
+ table: 'samp_license_position_report',
245
+ query,
246
+ limit: 1000,
247
+ fields: 'product,publisher,licenses_owned,licenses_required,over_licensed_amount,potential_savings,true_up_cost,status',
248
+ });
249
+ let overLicensed = 0;
250
+ let underLicensed = 0;
251
+ let totalSavings = 0;
252
+ let totalTrueUpCost = 0;
253
+ for (const r of resp.records) {
254
+ const over = Number(r.over_licensed_amount) || 0;
255
+ const savings = Number(r.potential_savings) || 0;
256
+ const trueUp = Number(r.true_up_cost) || 0;
257
+ if (over > 0)
258
+ overLicensed++;
259
+ if (trueUp > 0)
260
+ underLicensed++;
261
+ totalSavings += savings;
262
+ totalTrueUpCost += trueUp;
263
+ }
264
+ return {
265
+ products_evaluated: resp.count,
266
+ over_licensed_count: overLicensed,
267
+ under_licensed_count: underLicensed,
268
+ total_potential_savings: totalSavings,
269
+ total_true_up_cost: totalTrueUpCost,
270
+ };
271
+ }
272
+ case 'list_software_discovery_models': {
273
+ let query = '';
274
+ if (args.publisher)
275
+ query = `norm_publisherLIKE${args.publisher}`;
276
+ if (args.approved !== undefined)
277
+ query = query ? `${query}^approved=${args.approved}` : `approved=${args.approved}`;
278
+ const resp = await client.queryRecords({
279
+ table: 'cmdb_sam_sw_discovery_model',
280
+ query: query || undefined,
281
+ limit: args.limit || 25,
282
+ display_value: true,
283
+ fields: 'sys_id,primary_display_name,norm_publisher,norm_product,norm_version,install_count,approved,status',
284
+ });
285
+ return { count: resp.count, discovery_models: resp.records };
286
+ }
287
+ case 'list_software_models': {
288
+ let query = '';
289
+ if (args.publisher)
290
+ query = `manufacturer.nameLIKE${args.publisher}`;
291
+ if (args.product)
292
+ query = query ? `${query}^product.prod_nameLIKE${args.product}` : `product.prod_nameLIKE${args.product}`;
293
+ if (args.query)
294
+ query = query ? `${query}^${args.query}` : args.query;
295
+ const resp = await client.queryRecords({
296
+ table: 'cmdb_software_product_model',
297
+ query: query || undefined,
298
+ limit: args.limit || 25,
299
+ display_value: true,
300
+ fields: 'sys_id,title,manufacturer,product,version,edition,sw_product_type,license_type,end_of_life_date,life_cycle_stage,install_count',
301
+ });
302
+ return { count: resp.count, models: resp.records };
303
+ }
304
+ case 'get_software_model': {
305
+ if (!args.sys_id)
306
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
307
+ return await client.getRecord('cmdb_software_product_model', args.sys_id);
308
+ }
309
+ case 'list_software_lifecycle_reports': {
310
+ let query = '';
311
+ if (args.publisher)
312
+ query = `manufacturerLIKE${args.publisher}`;
313
+ if (args.product)
314
+ query = query ? `${query}^norm_productLIKE${args.product}` : `norm_productLIKE${args.product}`;
315
+ if (args.current_phase) {
316
+ const phase = normalizeChoice(args.current_phase, LIFECYCLE_PHASE_CHOICES);
317
+ query = query ? `${query}^current_lifecycle_phase=${phase}` : `current_lifecycle_phase=${phase}`;
318
+ }
319
+ const resp = await client.queryRecords({
320
+ table: 'sam_sw_product_lifecycle_report',
321
+ query: query || undefined,
322
+ limit: args.limit || 25,
323
+ display_value: true,
324
+ fields: 'sys_id,display_name,manufacturer,norm_product,current_lifecycle_phase,upcoming_lifecycle_phase,upcoming_lifecycle_phase_start_date,eol_start_date,eos_start_date,ga_start_date,install_count,cve_count,critical_cve_count,max_cvss_score',
325
+ });
326
+ return { count: resp.count, lifecycle_reports: resp.records };
327
+ }
328
+ case 'get_software_lifecycle_report': {
329
+ if (!args.sys_id)
330
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
331
+ return await client.getRecord('sam_sw_product_lifecycle_report', args.sys_id);
332
+ }
333
+ case 'list_software_lifecycle_entries': {
334
+ let query = args.active !== false ? 'active=true' : '';
335
+ if (args.publisher)
336
+ query = query ? `${query}^publisherLIKE${args.publisher}` : `publisherLIKE${args.publisher}`;
337
+ if (args.product)
338
+ query = query ? `${query}^norm_productLIKE${args.product}` : `norm_productLIKE${args.product}`;
339
+ if (args.lifecycle_phase) {
340
+ const phase = normalizeChoice(args.lifecycle_phase, LIFECYCLE_PHASE_CHOICES);
341
+ query = query ? `${query}^lifecycle_phase=${phase}` : `lifecycle_phase=${phase}`;
342
+ }
343
+ if (args.risk) {
344
+ const risk = normalizeChoice(args.risk, RISK_CHOICES);
345
+ query = query ? `${query}^risk=${risk}` : `risk=${risk}`;
346
+ }
347
+ const resp = await client.queryRecords({
348
+ table: 'sam_sw_product_lifecycle',
349
+ query: query || undefined,
350
+ limit: args.limit || 25,
351
+ display_value: true,
352
+ fields: 'sys_id,norm_product,publisher,norm_version,norm_edition,lifecycle_phase,lifecycle_type,start_date,risk,source,active',
353
+ });
354
+ return { count: resp.count, lifecycle_entries: resp.records };
355
+ }
356
+ default:
357
+ return null;
358
+ }
359
+ }
360
+ //# sourceMappingURL=sam.js.map