@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,181 @@
1
+ import { ServiceNowError } from '../utils/errors.js';
2
+ import { requireWrite, requireScripting } from '../utils/permissions.js';
3
+ export function getDeploymentToolDefinitions() {
4
+ return [
5
+ {
6
+ name: 'find_artifact',
7
+ description: 'Search for platform artifacts by name, type, or scope (business rules, scripts, widgets, etc.)',
8
+ inputSchema: { type: 'object', properties: { name: { type: 'string', description: 'Artifact name or pattern' }, type: { type: 'string', description: 'Artifact type: business_rule, script_include, client_script, ui_policy, ui_action, widget, flow, sys_properties' }, scope: { type: 'string', description: 'Application scope name' }, limit: { type: 'number' } }, required: ['name'] },
9
+ },
10
+ {
11
+ name: 'validate_artifact',
12
+ description: 'Validate an artifact for best practices, security issues, and performance concerns',
13
+ inputSchema: { type: 'object', properties: { table: { type: 'string', description: 'Artifact table (e.g. sys_script, sys_script_include)' }, sys_id: { type: 'string', description: 'Artifact sys_id' } }, required: ['table', 'sys_id'] },
14
+ },
15
+ {
16
+ name: 'clone_artifact',
17
+ description: 'Clone a platform artifact to a new name/scope. **[Scripting]**',
18
+ inputSchema: { type: 'object', properties: { table: { type: 'string', description: 'Source artifact table' }, sys_id: { type: 'string', description: 'Source artifact sys_id' }, new_name: { type: 'string', description: 'Name for the cloned artifact' }, target_scope: { type: 'string', description: 'Target application scope (optional)' } }, required: ['table', 'sys_id', 'new_name'] },
19
+ },
20
+ {
21
+ name: 'validate_deployment',
22
+ description: 'Pre-validate an update set or app before deployment — check for conflicts and missing dependencies',
23
+ inputSchema: { type: 'object', properties: { update_set_sys_id: { type: 'string', description: 'Update set sys_id to validate' }, app_sys_id: { type: 'string', description: 'Scoped app sys_id (alternative to update set)' } }, required: [] },
24
+ },
25
+ {
26
+ name: 'rollback_deployment',
27
+ description: 'Rollback a deployment by reverting an update set. **[Write]**',
28
+ inputSchema: { type: 'object', properties: { update_set_sys_id: { type: 'string', description: 'Committed update set sys_id to rollback' }, reason: { type: 'string', description: 'Reason for rollback' } }, required: ['update_set_sys_id'] },
29
+ },
30
+ {
31
+ name: 'list_deployment_history',
32
+ description: 'List deployment history — committed update sets and app installs over time',
33
+ inputSchema: { type: 'object', properties: { days: { type: 'number', description: 'Look-back period (default 30)' }, limit: { type: 'number' } }, required: [] },
34
+ },
35
+ {
36
+ name: 'create_solution_package',
37
+ description: 'Create a solution package from selected update sets for distribution. **[Write]**',
38
+ inputSchema: { type: 'object', properties: { name: { type: 'string', description: 'Package name' }, description: { type: 'string' }, update_sets: { type: 'array', items: { type: 'string' }, description: 'Array of update set sys_ids to include' } }, required: ['name', 'update_sets'] },
39
+ },
40
+ {
41
+ name: 'execute_background_script',
42
+ description: 'Execute a background script on the instance (server-side JavaScript). **[Scripting]**',
43
+ inputSchema: { type: 'object', properties: { script: { type: 'string', description: 'JavaScript code to execute' }, scope: { type: 'string', description: 'Application scope (default global)' } }, required: ['script'] },
44
+ },
45
+ {
46
+ name: 'import_cmdb_data',
47
+ description: 'Import CI data into CMDB via import set. **[Write]**',
48
+ inputSchema: { type: 'object', properties: { table: { type: 'string', description: 'Target CMDB table (e.g. cmdb_ci_server)' }, data: { type: 'array', items: { type: 'object' }, description: 'Array of records to import' } }, required: ['table', 'data'] },
49
+ },
50
+ {
51
+ name: 'analyze_data_quality',
52
+ description: 'Analyse data quality for a table — completeness, duplicates, stale records',
53
+ inputSchema: { type: 'object', properties: { table: { type: 'string', description: 'Table to analyse' }, required_fields: { type: 'string', description: 'Comma-separated fields that should be populated' }, days_stale: { type: 'number', description: 'Consider records stale after N days without update (default 180)' } }, required: ['table'] },
54
+ },
55
+ ];
56
+ }
57
+ export async function executeDeploymentToolCall(client, name, args) {
58
+ switch (name) {
59
+ case 'find_artifact': {
60
+ if (!args.name)
61
+ throw new ServiceNowError('name is required', 'INVALID_REQUEST');
62
+ const tableMap = { business_rule: 'sys_script', script_include: 'sys_script_include', client_script: 'sys_script_client', ui_policy: 'sys_ui_policy', ui_action: 'sys_ui_action', widget: 'sp_widget', flow: 'sys_hub_flow', sys_properties: 'sys_properties' };
63
+ const table = args.type ? (tableMap[args.type] || args.type) : 'sys_metadata';
64
+ let query = `nameLIKE${args.name}`;
65
+ if (args.scope)
66
+ query += `^sys_scope.name=${args.scope}`;
67
+ const resp = await client.queryRecords({ table, query, limit: args.limit || 25, fields: 'sys_id,name,sys_class_name,sys_scope,active,sys_updated_on' });
68
+ return { count: resp.count, artifacts: resp.records };
69
+ }
70
+ case 'validate_artifact': {
71
+ if (!args.table || !args.sys_id)
72
+ throw new ServiceNowError('table and sys_id are required', 'INVALID_REQUEST');
73
+ const record = await client.getRecord(args.table, args.sys_id);
74
+ const issues = [];
75
+ const script = String(record.script || record.condition || '');
76
+ if (script.includes('current.update()'))
77
+ issues.push('WARN: current.update() in script can cause infinite loops');
78
+ if (script.includes('eval('))
79
+ issues.push('SECURITY: eval() usage detected');
80
+ if (script.includes('GlideRecord') && !script.includes('addQuery'))
81
+ issues.push('PERF: GlideRecord without query filter may scan entire table');
82
+ if (script.includes('gs.sleep'))
83
+ issues.push('PERF: gs.sleep() blocks thread');
84
+ if (record.active === 'false')
85
+ issues.push('INFO: Artifact is inactive');
86
+ return { name: record.name, table: args.table, sys_id: args.sys_id, issues_found: issues.length, issues, status: issues.length === 0 ? 'PASS' : 'REVIEW' };
87
+ }
88
+ case 'clone_artifact': {
89
+ requireScripting();
90
+ if (!args.table || !args.sys_id || !args.new_name)
91
+ throw new ServiceNowError('table, sys_id, and new_name are required', 'INVALID_REQUEST');
92
+ const source = await client.getRecord(args.table, args.sys_id);
93
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
94
+ const { sys_id: _sysId, sys_created_on: _created, sys_updated_on: _updated, sys_created_by: _createdBy, sys_updated_by: _updatedBy, ...cloneData } = source;
95
+ cloneData.name = args.new_name;
96
+ if (args.target_scope)
97
+ cloneData.sys_scope = args.target_scope;
98
+ const result = await client.createRecord(args.table, cloneData);
99
+ return { action: 'cloned', source_sys_id: args.sys_id, new_name: args.new_name, ...result };
100
+ }
101
+ case 'validate_deployment': {
102
+ if (!args.update_set_sys_id && !args.app_sys_id)
103
+ throw new ServiceNowError('update_set_sys_id or app_sys_id required', 'INVALID_REQUEST');
104
+ if (args.update_set_sys_id) {
105
+ const us = await client.getRecord('sys_update_set', args.update_set_sys_id);
106
+ const changes = await client.queryRecords({ table: 'sys_update_xml', query: `update_set=${args.update_set_sys_id}`, limit: 500, fields: 'sys_id,name,type,action' });
107
+ return { update_set: us.name, state: us.state, total_changes: changes.count, changes_summary: changes.records.slice(0, 20), validation: us.state === 'complete' ? 'READY' : 'NOT_COMPLETE' };
108
+ }
109
+ const app = await client.getRecord('sys_app', args.app_sys_id);
110
+ return { app: app.name, version: app.version, scope: app.scope, validation: 'OK' };
111
+ }
112
+ case 'rollback_deployment': {
113
+ requireWrite();
114
+ if (!args.update_set_sys_id)
115
+ throw new ServiceNowError('update_set_sys_id is required', 'INVALID_REQUEST');
116
+ const us = await client.getRecord('sys_update_set', args.update_set_sys_id);
117
+ return { action: 'rollback_requested', update_set: us.name, state: us.state, note: 'Use ServiceNow Update Set rollback UI to confirm. Automated rollback requires admin background script.', reason: args.reason || '' };
118
+ }
119
+ case 'list_deployment_history': {
120
+ const days = args.days || 30;
121
+ const since = new Date(Date.now() - days * 86400000).toISOString().slice(0, 19).replace('T', ' ');
122
+ const resp = await client.queryRecords({ table: 'sys_update_set', query: `state=complete^sys_updated_on>=${since}`, limit: args.limit || 50, fields: 'sys_id,name,state,application,sys_created_by,sys_updated_on' });
123
+ return { period_days: days, count: resp.count, deployments: resp.records };
124
+ }
125
+ case 'create_solution_package': {
126
+ requireWrite();
127
+ if (!args.name || !args.update_sets?.length)
128
+ throw new ServiceNowError('name and update_sets are required', 'INVALID_REQUEST');
129
+ return { action: 'package_created', name: args.name, update_set_count: args.update_sets.length, note: 'Solution packaging requires Store app or manual export of listed update sets.' };
130
+ }
131
+ case 'execute_background_script': {
132
+ requireScripting();
133
+ if (!args.script)
134
+ throw new ServiceNowError('script is required', 'INVALID_REQUEST');
135
+ try {
136
+ const resp = await client.callNowAssist('/api/now/sp/background_script', { script: args.script, scope: args.scope || 'global' });
137
+ return { action: 'executed', output: resp };
138
+ }
139
+ catch (err) {
140
+ return { action: 'failed', error: err instanceof Error ? err.message : String(err) };
141
+ }
142
+ }
143
+ case 'import_cmdb_data': {
144
+ requireWrite();
145
+ if (!args.table || !args.data?.length)
146
+ throw new ServiceNowError('table and data are required', 'INVALID_REQUEST');
147
+ const results = [];
148
+ for (const record of args.data.slice(0, 50)) {
149
+ try {
150
+ const result = await client.createRecord(args.table, record);
151
+ results.push({ status: 'created', ...result });
152
+ }
153
+ catch (err) {
154
+ results.push({ status: 'failed', error: err instanceof Error ? err.message : String(err) });
155
+ }
156
+ }
157
+ return { action: 'imported', total: args.data.length, processed: results.length, results };
158
+ }
159
+ case 'analyze_data_quality': {
160
+ if (!args.table)
161
+ throw new ServiceNowError('table is required', 'INVALID_REQUEST');
162
+ const totalResp = await client.queryRecords({ table: args.table, limit: 1, fields: 'sys_id' });
163
+ const total = totalResp.count;
164
+ const daysStale = args.days_stale || 180;
165
+ const staleSince = new Date(Date.now() - daysStale * 86400000).toISOString().slice(0, 19).replace('T', ' ');
166
+ const staleResp = await client.queryRecords({ table: args.table, query: `sys_updated_on<${staleSince}`, limit: 1, fields: 'sys_id' });
167
+ const issues = [];
168
+ if (args.required_fields) {
169
+ for (const field of args.required_fields.split(',').map((f) => f.trim())) {
170
+ const emptyResp = await client.queryRecords({ table: args.table, query: `${field}ISEMPTY`, limit: 1, fields: 'sys_id' });
171
+ if (emptyResp.count > 0)
172
+ issues.push(`${field}: ${emptyResp.count} empty records`);
173
+ }
174
+ }
175
+ return { table: args.table, total_records: total, stale_records: staleResp.count, stale_threshold_days: daysStale, completeness_issues: issues, quality_score: total > 0 ? `${Math.round(((total - staleResp.count) / total) * 100)}%` : 'N/A' };
176
+ }
177
+ default:
178
+ return null;
179
+ }
180
+ }
181
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/tools/deployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * DevOps integration tools — CI/CD pipelines, deployment tracking, and velocity metrics.
3
+ *
4
+ * Tier 0 (Read): list_devops_pipelines, get_devops_pipeline, list_deployments,
5
+ * get_deployment, get_devops_insights
6
+ * Tier 1 (Write): create_devops_change, track_deployment
7
+ *
8
+ * ServiceNow tables: sn_devops_pipeline, sn_devops_artifact, sn_devops_deploy_task,
9
+ * sn_devops_change_request
10
+ */
11
+ import type { ServiceNowClient } from '../servicenow/client.js';
12
+ export declare function getDevopsToolDefinitions(): ({
13
+ name: string;
14
+ description: string;
15
+ inputSchema: {
16
+ type: string;
17
+ properties: {
18
+ active: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ limit: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ sys_id?: undefined;
27
+ pipeline_sys_id?: undefined;
28
+ environment?: undefined;
29
+ state?: undefined;
30
+ short_description?: undefined;
31
+ pipeline?: undefined;
32
+ artifact?: undefined;
33
+ type?: undefined;
34
+ assigned_to?: undefined;
35
+ assignment_group?: undefined;
36
+ artifact_name?: undefined;
37
+ artifact_version?: undefined;
38
+ status?: undefined;
39
+ notes?: undefined;
40
+ days?: undefined;
41
+ };
42
+ required: never[];
43
+ };
44
+ } | {
45
+ name: string;
46
+ description: string;
47
+ inputSchema: {
48
+ type: string;
49
+ properties: {
50
+ sys_id: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ active?: undefined;
55
+ limit?: undefined;
56
+ pipeline_sys_id?: undefined;
57
+ environment?: undefined;
58
+ state?: undefined;
59
+ short_description?: undefined;
60
+ pipeline?: undefined;
61
+ artifact?: undefined;
62
+ type?: undefined;
63
+ assigned_to?: undefined;
64
+ assignment_group?: undefined;
65
+ artifact_name?: undefined;
66
+ artifact_version?: undefined;
67
+ status?: undefined;
68
+ notes?: undefined;
69
+ days?: undefined;
70
+ };
71
+ required: string[];
72
+ };
73
+ } | {
74
+ name: string;
75
+ description: string;
76
+ inputSchema: {
77
+ type: string;
78
+ properties: {
79
+ pipeline_sys_id: {
80
+ type: string;
81
+ description: string;
82
+ };
83
+ environment: {
84
+ type: string;
85
+ description: string;
86
+ };
87
+ state: {
88
+ type: string;
89
+ description: string;
90
+ };
91
+ limit: {
92
+ type: string;
93
+ description: string;
94
+ };
95
+ active?: undefined;
96
+ sys_id?: undefined;
97
+ short_description?: undefined;
98
+ pipeline?: undefined;
99
+ artifact?: undefined;
100
+ type?: undefined;
101
+ assigned_to?: undefined;
102
+ assignment_group?: undefined;
103
+ artifact_name?: undefined;
104
+ artifact_version?: undefined;
105
+ status?: undefined;
106
+ notes?: undefined;
107
+ days?: undefined;
108
+ };
109
+ required: never[];
110
+ };
111
+ } | {
112
+ name: string;
113
+ description: string;
114
+ inputSchema: {
115
+ type: string;
116
+ properties: {
117
+ short_description: {
118
+ type: string;
119
+ description: string;
120
+ };
121
+ pipeline: {
122
+ type: string;
123
+ description: string;
124
+ };
125
+ environment: {
126
+ type: string;
127
+ description: string;
128
+ };
129
+ artifact: {
130
+ type: string;
131
+ description: string;
132
+ };
133
+ type: {
134
+ type: string;
135
+ description: string;
136
+ };
137
+ assigned_to: {
138
+ type: string;
139
+ description: string;
140
+ };
141
+ assignment_group: {
142
+ type: string;
143
+ description: string;
144
+ };
145
+ active?: undefined;
146
+ limit?: undefined;
147
+ sys_id?: undefined;
148
+ pipeline_sys_id?: undefined;
149
+ state?: undefined;
150
+ artifact_name?: undefined;
151
+ artifact_version?: undefined;
152
+ status?: undefined;
153
+ notes?: undefined;
154
+ days?: undefined;
155
+ };
156
+ required: string[];
157
+ };
158
+ } | {
159
+ name: string;
160
+ description: string;
161
+ inputSchema: {
162
+ type: string;
163
+ properties: {
164
+ pipeline: {
165
+ type: string;
166
+ description: string;
167
+ };
168
+ environment: {
169
+ type: string;
170
+ description: string;
171
+ };
172
+ artifact_name: {
173
+ type: string;
174
+ description: string;
175
+ };
176
+ artifact_version: {
177
+ type: string;
178
+ description: string;
179
+ };
180
+ status: {
181
+ type: string;
182
+ description: string;
183
+ };
184
+ notes: {
185
+ type: string;
186
+ description: string;
187
+ };
188
+ active?: undefined;
189
+ limit?: undefined;
190
+ sys_id?: undefined;
191
+ pipeline_sys_id?: undefined;
192
+ state?: undefined;
193
+ short_description?: undefined;
194
+ artifact?: undefined;
195
+ type?: undefined;
196
+ assigned_to?: undefined;
197
+ assignment_group?: undefined;
198
+ days?: undefined;
199
+ };
200
+ required: string[];
201
+ };
202
+ } | {
203
+ name: string;
204
+ description: string;
205
+ inputSchema: {
206
+ type: string;
207
+ properties: {
208
+ pipeline_sys_id: {
209
+ type: string;
210
+ description: string;
211
+ };
212
+ days: {
213
+ type: string;
214
+ description: string;
215
+ };
216
+ active?: undefined;
217
+ limit?: undefined;
218
+ sys_id?: undefined;
219
+ environment?: undefined;
220
+ state?: undefined;
221
+ short_description?: undefined;
222
+ pipeline?: undefined;
223
+ artifact?: undefined;
224
+ type?: undefined;
225
+ assigned_to?: undefined;
226
+ assignment_group?: undefined;
227
+ artifact_name?: undefined;
228
+ artifact_version?: undefined;
229
+ status?: undefined;
230
+ notes?: undefined;
231
+ };
232
+ required: never[];
233
+ };
234
+ })[];
235
+ export declare function executeDevopsToolCall(client: ServiceNowClient, name: string, args: Record<string, any>): Promise<any>;
236
+ //# sourceMappingURL=devops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devops.d.ts","sourceRoot":"","sources":["../../src/tools/devops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,wBAAgB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgGvC;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,GAAG,CAAC,CAsGd"}
@@ -0,0 +1,207 @@
1
+ import { ServiceNowError } from '../utils/errors.js';
2
+ import { requireWrite } from '../utils/permissions.js';
3
+ export function getDevopsToolDefinitions() {
4
+ return [
5
+ {
6
+ name: 'list_devops_pipelines',
7
+ description: 'List DevOps pipeline configurations registered in ServiceNow',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ active: { type: 'boolean', description: 'Filter to active pipelines (default true)' },
12
+ limit: { type: 'number', description: 'Max records (default 25)' },
13
+ },
14
+ required: [],
15
+ },
16
+ },
17
+ {
18
+ name: 'get_devops_pipeline',
19
+ description: 'Get details of a specific DevOps pipeline',
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {
23
+ sys_id: { type: 'string', description: 'Pipeline sys_id' },
24
+ },
25
+ required: ['sys_id'],
26
+ },
27
+ },
28
+ {
29
+ name: 'list_deployments',
30
+ description: 'List recent application deployments tracked in ServiceNow',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ pipeline_sys_id: { type: 'string', description: 'Filter by pipeline' },
35
+ environment: { type: 'string', description: 'Filter by environment (e.g. "prod", "staging")' },
36
+ state: { type: 'string', description: 'Filter by state: "success", "failed", "in_progress"' },
37
+ limit: { type: 'number', description: 'Max records (default 25)' },
38
+ },
39
+ required: [],
40
+ },
41
+ },
42
+ {
43
+ name: 'get_deployment',
44
+ description: 'Get details and status of a specific deployment',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ sys_id: { type: 'string', description: 'Deployment sys_id' },
49
+ },
50
+ required: ['sys_id'],
51
+ },
52
+ },
53
+ {
54
+ name: 'create_devops_change',
55
+ description: 'Create a change request linked to a DevOps deployment for change governance. **[Write]**',
56
+ inputSchema: {
57
+ type: 'object',
58
+ properties: {
59
+ short_description: { type: 'string', description: 'Change short description' },
60
+ pipeline: { type: 'string', description: 'Pipeline name or sys_id' },
61
+ environment: { type: 'string', description: 'Target environment (prod, staging, dev)' },
62
+ artifact: { type: 'string', description: 'Artifact name or version being deployed' },
63
+ type: { type: 'string', description: 'Change type: normal, standard, emergency' },
64
+ assigned_to: { type: 'string', description: 'User sys_id' },
65
+ assignment_group: { type: 'string', description: 'Group sys_id' },
66
+ },
67
+ required: ['short_description', 'environment'],
68
+ },
69
+ },
70
+ {
71
+ name: 'track_deployment',
72
+ description: 'Record a deployment event in ServiceNow for audit and velocity tracking. **[Write]**',
73
+ inputSchema: {
74
+ type: 'object',
75
+ properties: {
76
+ pipeline: { type: 'string', description: 'Pipeline sys_id or name' },
77
+ environment: { type: 'string', description: 'Target environment' },
78
+ artifact_name: { type: 'string', description: 'Artifact or application name' },
79
+ artifact_version: { type: 'string', description: 'Version or build number' },
80
+ status: { type: 'string', description: 'Deployment status: success, failed, rolled_back' },
81
+ notes: { type: 'string', description: 'Deployment notes' },
82
+ },
83
+ required: ['environment', 'artifact_name', 'status'],
84
+ },
85
+ },
86
+ {
87
+ name: 'get_devops_insights',
88
+ description: 'Get deployment frequency, failure rate, and lead time metrics for a pipeline',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ pipeline_sys_id: { type: 'string', description: 'Pipeline sys_id (optional — all pipelines if omitted)' },
93
+ days: { type: 'number', description: 'Number of days to analyse (default 30)' },
94
+ },
95
+ required: [],
96
+ },
97
+ },
98
+ ];
99
+ }
100
+ export async function executeDevopsToolCall(client, name, args) {
101
+ switch (name) {
102
+ case 'list_devops_pipelines': {
103
+ const query = args.active !== false ? 'active=true' : '';
104
+ const resp = await client.queryRecords({
105
+ table: 'sn_devops_pipeline',
106
+ query: query || undefined,
107
+ limit: args.limit || 25,
108
+ fields: 'sys_id,name,active,type,description,sys_updated_on',
109
+ });
110
+ return { count: resp.count, pipelines: resp.records };
111
+ }
112
+ case 'get_devops_pipeline': {
113
+ if (!args.sys_id)
114
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
115
+ const result = await client.getRecord('sn_devops_pipeline', args.sys_id);
116
+ return result;
117
+ }
118
+ case 'list_deployments': {
119
+ let query = '';
120
+ if (args.pipeline_sys_id)
121
+ query = `pipeline=${args.pipeline_sys_id}`;
122
+ if (args.environment)
123
+ query = query ? `${query}^stage=${args.environment}` : `stage=${args.environment}`;
124
+ if (args.state)
125
+ query = query ? `${query}^status=${args.state}` : `status=${args.state}`;
126
+ const resp = await client.queryRecords({
127
+ table: 'sn_devops_deploy_task',
128
+ query: query || undefined,
129
+ limit: args.limit || 25,
130
+ fields: 'sys_id,name,pipeline,stage,status,artifact_name,artifact_version,sys_created_on,sys_updated_on',
131
+ });
132
+ return { count: resp.count, deployments: resp.records };
133
+ }
134
+ case 'get_deployment': {
135
+ if (!args.sys_id)
136
+ throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
137
+ const result = await client.getRecord('sn_devops_deploy_task', args.sys_id);
138
+ return result;
139
+ }
140
+ case 'create_devops_change': {
141
+ if (!args.short_description || !args.environment) {
142
+ throw new ServiceNowError('short_description and environment are required', 'INVALID_REQUEST');
143
+ }
144
+ requireWrite();
145
+ const payload = {
146
+ short_description: args.short_description,
147
+ type: args.type || 'standard',
148
+ description: `DevOps deployment to ${args.environment}${args.artifact ? ` — ${args.artifact}` : ''}`,
149
+ };
150
+ if (args.assigned_to)
151
+ payload.assigned_to = args.assigned_to;
152
+ if (args.assignment_group)
153
+ payload.assignment_group = args.assignment_group;
154
+ // Create as a standard change request linked to devops
155
+ const result = await client.createRecord('change_request', payload);
156
+ return { action: 'created', environment: args.environment, ...result };
157
+ }
158
+ case 'track_deployment': {
159
+ if (!args.environment || !args.artifact_name || !args.status) {
160
+ throw new ServiceNowError('environment, artifact_name, and status are required', 'INVALID_REQUEST');
161
+ }
162
+ requireWrite();
163
+ const payload = {
164
+ stage: args.environment,
165
+ artifact_name: args.artifact_name,
166
+ status: args.status,
167
+ };
168
+ if (args.pipeline)
169
+ payload.pipeline = args.pipeline;
170
+ if (args.artifact_version)
171
+ payload.artifact_version = args.artifact_version;
172
+ if (args.notes)
173
+ payload.description = args.notes;
174
+ const result = await client.createRecord('sn_devops_deploy_task', payload);
175
+ return { action: 'tracked', artifact: args.artifact_name, environment: args.environment, status: args.status, ...result };
176
+ }
177
+ case 'get_devops_insights': {
178
+ const days = args.days || 30;
179
+ const since = new Date(Date.now() - days * 86400000).toISOString().slice(0, 19).replace('T', ' ');
180
+ let query = `sys_created_on>=${since}`;
181
+ if (args.pipeline_sys_id)
182
+ query += `^pipeline=${args.pipeline_sys_id}`;
183
+ const resp = await client.queryRecords({
184
+ table: 'sn_devops_deploy_task',
185
+ query,
186
+ limit: 1000,
187
+ fields: 'status,sys_created_on',
188
+ });
189
+ const total = resp.count;
190
+ const success = resp.records.filter((r) => r.status === 'success').length;
191
+ const failed = resp.records.filter((r) => r.status === 'failed').length;
192
+ return {
193
+ period_days: days,
194
+ total_deployments: total,
195
+ successful: success,
196
+ failed,
197
+ success_rate: total > 0 ? `${Math.round((success / total) * 100)}%` : 'N/A',
198
+ failure_rate: total > 0 ? `${Math.round((failed / total) * 100)}%` : 'N/A',
199
+ deployment_frequency: total > 0 ? `${(total / days).toFixed(1)} per day` : 'N/A',
200
+ note: 'Lead time requires change_request linkage; enable DevOps plugin for full DORA metrics',
201
+ };
202
+ }
203
+ default:
204
+ return null;
205
+ }
206
+ }
207
+ //# sourceMappingURL=devops.js.map