snow-flow 8.41.24 → 8.42.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 (112) hide show
  1. package/CLAUDE.md +9 -6
  2. package/dist/mcp/servicenow-automation-mcp.js +8 -8
  3. package/dist/mcp/servicenow-automation-mcp.js.map +1 -1
  4. package/dist/mcp/servicenow-mcp-server.js +4 -4
  5. package/dist/mcp/servicenow-mcp-server.js.map +1 -1
  6. package/dist/mcp/servicenow-mcp-unified/tools/automation/index.d.ts +1 -2
  7. package/dist/mcp/servicenow-mcp-unified/tools/automation/index.d.ts.map +1 -1
  8. package/dist/mcp/servicenow-mcp-unified/tools/automation/index.js +6 -8
  9. package/dist/mcp/servicenow-mcp-unified/tools/automation/index.js.map +1 -1
  10. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_confirm_script_execution.d.ts +1 -1
  11. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_confirm_script_execution.js +2 -2
  12. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_confirm_script_execution.js.map +1 -1
  13. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_get_scheduled_job_logs.d.ts.map +1 -1
  14. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_get_scheduled_job_logs.js +14 -5
  15. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_get_scheduled_job_logs.js.map +1 -1
  16. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_schedule_script_job.d.ts +26 -0
  17. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_schedule_script_job.d.ts.map +1 -0
  18. package/dist/mcp/servicenow-mcp-unified/tools/automation/{snow_execute_script.js → snow_schedule_script_job.js} +19 -13
  19. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_schedule_script_job.js.map +1 -0
  20. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.d.ts +12 -4
  21. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.d.ts.map +1 -1
  22. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.js +69 -67
  23. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.js.map +1 -1
  24. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_artifact.d.ts.map +1 -1
  25. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_artifact.js +2 -1
  26. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_artifact.js.map +1 -1
  27. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_requirements.d.ts.map +1 -1
  28. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_requirements.js +2 -1
  29. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_requirements.js.map +1 -1
  30. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_artifact.d.ts.map +1 -1
  31. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_artifact.js +2 -1
  32. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_artifact.js.map +1 -1
  33. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_by_sysid.d.ts.map +1 -1
  34. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_by_sysid.js +5 -2
  35. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_by_sysid.js.map +1 -1
  36. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_find_artifact.d.ts.map +1 -1
  37. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_find_artifact.js +2 -1
  38. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_find_artifact.js.map +1 -1
  39. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_get_by_sysid.d.ts.map +1 -1
  40. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_get_by_sysid.js +2 -1
  41. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_get_by_sysid.js.map +1 -1
  42. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_memory_search.d.ts.map +1 -1
  43. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_memory_search.js +2 -1
  44. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_memory_search.js.map +1 -1
  45. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_orchestrate_development.d.ts.map +1 -1
  46. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_orchestrate_development.js +2 -1
  47. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_orchestrate_development.js.map +1 -1
  48. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_sync_data_consistency.d.ts.map +1 -1
  49. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_sync_data_consistency.js +2 -1
  50. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_sync_data_consistency.js.map +1 -1
  51. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_validate_live_connection.d.ts.map +1 -1
  52. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_validate_live_connection.js +2 -1
  53. package/dist/mcp/servicenow-mcp-unified/tools/development/snow_validate_live_connection.js.map +1 -1
  54. package/dist/mcp/servicenow-mcp-unified/tools/integration/index.d.ts +1 -0
  55. package/dist/mcp/servicenow-mcp-unified/tools/integration/index.d.ts.map +1 -1
  56. package/dist/mcp/servicenow-mcp-unified/tools/integration/index.js +4 -1
  57. package/dist/mcp/servicenow-mcp-unified/tools/integration/index.js.map +1 -1
  58. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_analyze_query.d.ts.map +1 -1
  59. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_analyze_query.js +53 -32
  60. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_analyze_query.js.map +1 -1
  61. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.d.ts +26 -0
  62. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.d.ts.map +1 -0
  63. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.js +1280 -0
  64. package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.js.map +1 -0
  65. package/dist/mcp/servicenow-mcp-unified/tools/operations/snow_cmdb_search.d.ts.map +1 -1
  66. package/dist/mcp/servicenow-mcp-unified/tools/operations/snow_cmdb_search.js +30 -7
  67. package/dist/mcp/servicenow-mcp-unified/tools/operations/snow_cmdb_search.js.map +1 -1
  68. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/index.d.ts +1 -1
  69. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/index.js +4 -4
  70. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.d.ts +19 -0
  71. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.d.ts.map +1 -0
  72. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.js +142 -0
  73. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.js.map +1 -0
  74. package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.d.ts +1 -1
  75. package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.d.ts.map +1 -1
  76. package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.js +4 -4
  77. package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.js.map +1 -1
  78. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.d.ts +15 -0
  79. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.d.ts.map +1 -0
  80. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.js +136 -0
  81. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.js.map +1 -0
  82. package/dist/templates/agents-md-template.d.ts +1 -1
  83. package/dist/templates/agents-md-template.d.ts.map +1 -1
  84. package/dist/templates/agents-md-template.js +5 -5
  85. package/dist/templates/claude-md-template.d.ts +1 -1
  86. package/dist/templates/claude-md-template.d.ts.map +1 -1
  87. package/dist/templates/claude-md-template.js +11 -9
  88. package/dist/templates/claude-md-template.js.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_execute_script.d.ts +0 -20
  91. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_execute_script.d.ts.map +0 -1
  92. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_execute_script.js.map +0 -1
  93. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.d.ts +0 -11
  94. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.d.ts.map +0 -1
  95. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.js +0 -142
  96. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.js.map +0 -1
  97. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.d.ts +0 -9
  98. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.d.ts.map +0 -1
  99. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.js +0 -57
  100. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.js.map +0 -1
  101. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.d.ts +0 -9
  102. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.d.ts.map +0 -1
  103. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.js +0 -58
  104. package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.js.map +0 -1
  105. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.d.ts +0 -9
  106. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.d.ts.map +0 -1
  107. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.js +0 -59
  108. package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.js.map +0 -1
  109. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.d.ts +0 -9
  110. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.d.ts.map +0 -1
  111. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.js +0 -55
  112. package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.js.map +0 -1
@@ -0,0 +1,1280 @@
1
+ "use strict";
2
+ /**
3
+ * snow_rest_message_manage - Universal REST Message Management Tool
4
+ *
5
+ * Complete CRUD operations for REST Messages, HTTP Methods, Headers, and Parameters.
6
+ *
7
+ * Tables used:
8
+ * - sys_rest_message: REST Message definitions
9
+ * - sys_rest_message_headers: Headers for REST Message (apply to ALL methods)
10
+ * - sys_rest_message_fn: HTTP Methods (functions) for REST Messages
11
+ * - sys_rest_message_fn_headers: Headers for specific HTTP Methods
12
+ * - sys_rest_message_fn_parameters: Query parameters for HTTP Methods
13
+ *
14
+ * Header Levels:
15
+ * - Message headers (sys_rest_message_headers): Apply to ALL methods in the REST message
16
+ * - Method headers (sys_rest_message_fn_headers): Apply only to specific method
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.changelog = exports.author = exports.version = exports.toolDefinition = void 0;
20
+ exports.execute = execute;
21
+ const auth_js_1 = require("../../shared/auth.js");
22
+ const error_handler_js_1 = require("../../shared/error-handler.js");
23
+ exports.toolDefinition = {
24
+ name: 'snow_rest_message_manage',
25
+ description: `Universal REST Message management tool. CRUD operations for:
26
+ • REST Messages (list, get, create, update, delete)
27
+ • HTTP Methods (list_methods, get_method, create_method, update_method, delete_method)
28
+ • Message-level Headers - apply to ALL methods (list_message_headers, create_message_header, delete_message_header)
29
+ • Method-level Headers - apply to specific method (list_method_headers, create_method_header, delete_method_header)
30
+ • Query Parameters (list_parameters, create_parameter, delete_parameter)
31
+ • Testing (test) - generates ES5-compatible test script for snow_schedule_script_job`,
32
+ // Metadata for tool discovery (not sent to LLM)
33
+ category: 'integration',
34
+ subcategory: 'rest',
35
+ use_cases: ['integration', 'rest', 'api', 'crud', 'headers', 'parameters', 'testing'],
36
+ complexity: 'intermediate',
37
+ frequency: 'high',
38
+ // Permission enforcement
39
+ permission: 'write',
40
+ allowedRoles: ['developer', 'admin'],
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ action: {
45
+ type: 'string',
46
+ enum: [
47
+ // REST Message operations
48
+ 'list', // List all REST messages
49
+ 'get', // Get a specific REST message with its methods
50
+ 'create', // Create a new REST message
51
+ 'update', // Update an existing REST message
52
+ 'delete', // Delete a REST message
53
+ // Method operations
54
+ 'list_methods', // List methods for a REST message
55
+ 'get_method', // Get a specific method
56
+ 'create_method', // Create a method for a REST message
57
+ 'update_method', // Update a method
58
+ 'delete_method', // Delete a method
59
+ // Message-level headers (apply to ALL methods)
60
+ 'list_message_headers', // List headers at REST message level
61
+ 'create_message_header', // Create header at REST message level
62
+ 'delete_message_header', // Delete header at REST message level
63
+ // Method-level headers (apply to specific method only)
64
+ 'list_method_headers', // List headers for a specific method
65
+ 'create_method_header', // Create header for a specific method
66
+ 'delete_method_header', // Delete header from a method
67
+ // Query parameters (for methods)
68
+ 'list_parameters', // List query parameters for a method
69
+ 'create_parameter', // Create query parameter for a method
70
+ 'delete_parameter', // Delete query parameter from a method
71
+ // Testing
72
+ 'test' // Test a REST message/method
73
+ ],
74
+ description: 'Action to perform'
75
+ },
76
+ // For list action
77
+ filter: {
78
+ type: 'string',
79
+ description: 'Filter for list action (e.g., "nameLIKEopenai" or "active=true")'
80
+ },
81
+ limit: {
82
+ type: 'number',
83
+ description: 'Maximum results to return',
84
+ default: 50
85
+ },
86
+ // For get/update/delete actions
87
+ sys_id: {
88
+ type: 'string',
89
+ description: 'sys_id of REST message or method'
90
+ },
91
+ name: {
92
+ type: 'string',
93
+ description: 'Name of REST message (alternative to sys_id for lookup)'
94
+ },
95
+ // For create/update REST message
96
+ endpoint: {
97
+ type: 'string',
98
+ description: 'Base URL endpoint for REST message'
99
+ },
100
+ description: {
101
+ type: 'string',
102
+ description: 'Description of the REST message'
103
+ },
104
+ authentication_type: {
105
+ type: 'string',
106
+ enum: ['no_authentication', 'basic', 'oauth2', 'api_key', 'mutual_auth'],
107
+ description: 'Authentication type',
108
+ default: 'no_authentication'
109
+ },
110
+ basic_auth_profile: {
111
+ type: 'string',
112
+ description: 'Basic auth profile sys_id (if authentication_type is basic)'
113
+ },
114
+ oauth_profile: {
115
+ type: 'string',
116
+ description: 'OAuth profile sys_id (if authentication_type is oauth2)'
117
+ },
118
+ use_mid_server: {
119
+ type: 'boolean',
120
+ description: 'Route through MID Server',
121
+ default: false
122
+ },
123
+ mid_server: {
124
+ type: 'string',
125
+ description: 'MID Server name or sys_id'
126
+ },
127
+ // For method operations
128
+ rest_message_sys_id: {
129
+ type: 'string',
130
+ description: 'Parent REST message sys_id (for method operations)'
131
+ },
132
+ method_sys_id: {
133
+ type: 'string',
134
+ description: 'Method sys_id (for method update/delete)'
135
+ },
136
+ http_method: {
137
+ type: 'string',
138
+ enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
139
+ description: 'HTTP method type',
140
+ default: 'GET'
141
+ },
142
+ relative_path: {
143
+ type: 'string',
144
+ description: 'Relative endpoint path for method (e.g., "/v1/completions")'
145
+ },
146
+ request_body: {
147
+ type: 'string',
148
+ description: 'Request body template (for POST/PUT/PATCH)'
149
+ },
150
+ // For headers
151
+ header_name: {
152
+ type: 'string',
153
+ description: 'Header name'
154
+ },
155
+ header_value: {
156
+ type: 'string',
157
+ description: 'Header value'
158
+ },
159
+ header_sys_id: {
160
+ type: 'string',
161
+ description: 'Header sys_id (for delete operations)'
162
+ },
163
+ headers: {
164
+ type: 'object',
165
+ description: 'Multiple headers as key-value pairs'
166
+ },
167
+ // For query parameters
168
+ parameter_name: {
169
+ type: 'string',
170
+ description: 'Query parameter name'
171
+ },
172
+ parameter_value: {
173
+ type: 'string',
174
+ description: 'Query parameter value'
175
+ },
176
+ parameter_sys_id: {
177
+ type: 'string',
178
+ description: 'Parameter sys_id (for delete operations)'
179
+ },
180
+ parameters: {
181
+ type: 'object',
182
+ description: 'Multiple query parameters as key-value pairs'
183
+ },
184
+ // For test action
185
+ test_params: {
186
+ type: 'object',
187
+ description: 'Parameters for testing the REST message'
188
+ }
189
+ },
190
+ required: ['action']
191
+ }
192
+ };
193
+ async function execute(args, context) {
194
+ const { action } = args;
195
+ try {
196
+ const client = await (0, auth_js_1.getAuthenticatedClient)(context);
197
+ switch (action) {
198
+ // REST Message operations
199
+ case 'list':
200
+ return await listRestMessages(client, args);
201
+ case 'get':
202
+ return await getRestMessage(client, args);
203
+ case 'create':
204
+ return await createRestMessage(client, args);
205
+ case 'update':
206
+ return await updateRestMessage(client, args);
207
+ case 'delete':
208
+ return await deleteRestMessage(client, args);
209
+ // Method operations
210
+ case 'list_methods':
211
+ return await listMethods(client, args);
212
+ case 'get_method':
213
+ return await getMethod(client, args);
214
+ case 'create_method':
215
+ return await createMethod(client, args);
216
+ case 'update_method':
217
+ return await updateMethod(client, args);
218
+ case 'delete_method':
219
+ return await deleteMethod(client, args);
220
+ // Message-level headers (apply to ALL methods)
221
+ case 'list_message_headers':
222
+ return await listMessageHeaders(client, args);
223
+ case 'create_message_header':
224
+ return await createMessageHeader(client, args);
225
+ case 'delete_message_header':
226
+ return await deleteMessageHeader(client, args);
227
+ // Method-level headers (apply to specific method only)
228
+ case 'list_method_headers':
229
+ return await listMethodHeaders(client, args);
230
+ case 'create_method_header':
231
+ return await createMethodHeader(client, args);
232
+ case 'delete_method_header':
233
+ return await deleteMethodHeader(client, args);
234
+ // Query parameters
235
+ case 'list_parameters':
236
+ return await listParameters(client, args);
237
+ case 'create_parameter':
238
+ return await createParameter(client, args);
239
+ case 'delete_parameter':
240
+ return await deleteParameter(client, args);
241
+ // Testing
242
+ case 'test':
243
+ return await testRestMessage(client, args);
244
+ default:
245
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, `Unknown action: ${action}. See tool description for valid actions.`);
246
+ }
247
+ }
248
+ catch (error) {
249
+ if (error.response?.status === 403) {
250
+ return (0, error_handler_js_1.createErrorResult)(`Permission denied (403): Your ServiceNow user lacks permissions for REST message operations. ` +
251
+ `Required roles: 'rest_service' or 'admin'. ` +
252
+ `Please contact your ServiceNow administrator to grant the necessary permissions.`);
253
+ }
254
+ return (0, error_handler_js_1.createErrorResult)(error instanceof error_handler_js_1.SnowFlowError
255
+ ? error
256
+ : new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.UNKNOWN_ERROR, error.message, { originalError: error }));
257
+ }
258
+ }
259
+ // ============================================================================
260
+ // REST MESSAGE OPERATIONS
261
+ // ============================================================================
262
+ async function listRestMessages(client, args) {
263
+ const { filter, limit = 50 } = args;
264
+ const params = {
265
+ sysparm_fields: 'sys_id,name,rest_endpoint,description,authentication_type,use_mid_server,active,sys_updated_on',
266
+ sysparm_limit: limit
267
+ };
268
+ if (filter) {
269
+ params.sysparm_query = filter;
270
+ }
271
+ const response = await client.get('/api/now/table/sys_rest_message', { params });
272
+ const messages = response.data?.result || [];
273
+ return (0, error_handler_js_1.createSuccessResult)({
274
+ action: 'list',
275
+ count: messages.length,
276
+ rest_messages: messages.map((m) => ({
277
+ sys_id: m.sys_id,
278
+ name: m.name,
279
+ endpoint: m.rest_endpoint,
280
+ description: m.description,
281
+ authentication_type: m.authentication_type,
282
+ use_mid_server: m.use_mid_server === 'true',
283
+ active: m.active === 'true',
284
+ updated: m.sys_updated_on
285
+ }))
286
+ }, { operation: 'list_rest_messages' });
287
+ }
288
+ async function getRestMessage(client, args) {
289
+ const { sys_id, name } = args;
290
+ if (!sys_id && !name) {
291
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either sys_id or name is required for get action');
292
+ }
293
+ let messageSysId = sys_id;
294
+ // Lookup by name if sys_id not provided
295
+ if (!messageSysId && name) {
296
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
297
+ params: {
298
+ sysparm_query: `name=${name}`,
299
+ sysparm_fields: 'sys_id',
300
+ sysparm_limit: 1
301
+ }
302
+ });
303
+ if (!lookupResponse.data?.result?.[0]) {
304
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
305
+ }
306
+ messageSysId = lookupResponse.data.result[0].sys_id;
307
+ }
308
+ // Get the REST message
309
+ const messageResponse = await client.get(`/api/now/table/sys_rest_message/${messageSysId}`);
310
+ const message = messageResponse.data?.result;
311
+ if (!message) {
312
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${messageSysId}`);
313
+ }
314
+ // Get associated methods
315
+ const methodsResponse = await client.get('/api/now/table/sys_rest_message_fn', {
316
+ params: {
317
+ sysparm_query: `rest_message=${messageSysId}`,
318
+ sysparm_fields: 'sys_id,name,http_method,rest_endpoint,content,active'
319
+ }
320
+ });
321
+ const methods = methodsResponse.data?.result || [];
322
+ return (0, error_handler_js_1.createSuccessResult)({
323
+ action: 'get',
324
+ rest_message: {
325
+ sys_id: message.sys_id,
326
+ name: message.name,
327
+ endpoint: message.rest_endpoint,
328
+ description: message.description,
329
+ authentication_type: message.authentication_type,
330
+ basic_auth_profile: message.basic_auth_profile,
331
+ oauth_profile: message.oauth2_profile,
332
+ use_mid_server: message.use_mid_server === 'true',
333
+ mid_server: message.mid_server,
334
+ active: message.active === 'true',
335
+ created: message.sys_created_on,
336
+ updated: message.sys_updated_on
337
+ },
338
+ methods: methods.map((m) => ({
339
+ sys_id: m.sys_id,
340
+ name: m.name,
341
+ http_method: m.http_method,
342
+ endpoint: m.rest_endpoint,
343
+ has_body: !!m.content,
344
+ active: m.active === 'true'
345
+ })),
346
+ method_count: methods.length
347
+ }, { operation: 'get_rest_message' });
348
+ }
349
+ async function createRestMessage(client, args) {
350
+ const { name, endpoint, description = '', authentication_type = 'no_authentication', basic_auth_profile, oauth_profile, use_mid_server = false, mid_server } = args;
351
+ if (!name || !endpoint) {
352
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'name and endpoint are required for create action');
353
+ }
354
+ const messageData = {
355
+ name,
356
+ rest_endpoint: endpoint,
357
+ description,
358
+ authentication_type,
359
+ use_mid_server,
360
+ active: true
361
+ };
362
+ if (authentication_type === 'basic' && basic_auth_profile) {
363
+ messageData.basic_auth_profile = basic_auth_profile;
364
+ }
365
+ if (authentication_type === 'oauth2' && oauth_profile) {
366
+ messageData.oauth2_profile = oauth_profile;
367
+ }
368
+ if (use_mid_server && mid_server) {
369
+ messageData.mid_server = mid_server;
370
+ }
371
+ const response = await client.post('/api/now/table/sys_rest_message', messageData);
372
+ const created = response.data?.result;
373
+ return (0, error_handler_js_1.createSuccessResult)({
374
+ action: 'create',
375
+ created: true,
376
+ rest_message: {
377
+ sys_id: created.sys_id,
378
+ name: created.name,
379
+ endpoint: created.rest_endpoint,
380
+ authentication_type: created.authentication_type
381
+ },
382
+ message: `REST message "${name}" created successfully`,
383
+ next_steps: [
384
+ `Create methods using: action="create_method", rest_message_sys_id="${created.sys_id}"`,
385
+ `Add headers using: action="create_header", method_sys_id="<method_sys_id>"`
386
+ ]
387
+ }, { operation: 'create_rest_message' });
388
+ }
389
+ async function updateRestMessage(client, args) {
390
+ const { sys_id, name, endpoint, description, authentication_type, basic_auth_profile, oauth_profile, use_mid_server, mid_server } = args;
391
+ let messageSysId = sys_id;
392
+ // Lookup by name if needed
393
+ if (!messageSysId && name) {
394
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
395
+ params: {
396
+ sysparm_query: `name=${name}`,
397
+ sysparm_fields: 'sys_id',
398
+ sysparm_limit: 1
399
+ }
400
+ });
401
+ if (!lookupResponse.data?.result?.[0]) {
402
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
403
+ }
404
+ messageSysId = lookupResponse.data.result[0].sys_id;
405
+ }
406
+ if (!messageSysId) {
407
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'sys_id or name is required for update action');
408
+ }
409
+ const updateData = {};
410
+ if (endpoint !== undefined)
411
+ updateData.rest_endpoint = endpoint;
412
+ if (description !== undefined)
413
+ updateData.description = description;
414
+ if (authentication_type !== undefined)
415
+ updateData.authentication_type = authentication_type;
416
+ if (basic_auth_profile !== undefined)
417
+ updateData.basic_auth_profile = basic_auth_profile;
418
+ if (oauth_profile !== undefined)
419
+ updateData.oauth2_profile = oauth_profile;
420
+ if (use_mid_server !== undefined)
421
+ updateData.use_mid_server = use_mid_server;
422
+ if (mid_server !== undefined)
423
+ updateData.mid_server = mid_server;
424
+ if (Object.keys(updateData).length === 0) {
425
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'No fields to update. Provide at least one field to change.');
426
+ }
427
+ const response = await client.patch(`/api/now/table/sys_rest_message/${messageSysId}`, updateData);
428
+ const updated = response.data?.result;
429
+ return (0, error_handler_js_1.createSuccessResult)({
430
+ action: 'update',
431
+ updated: true,
432
+ rest_message: {
433
+ sys_id: updated.sys_id,
434
+ name: updated.name,
435
+ endpoint: updated.rest_endpoint
436
+ },
437
+ fields_updated: Object.keys(updateData)
438
+ }, { operation: 'update_rest_message' });
439
+ }
440
+ async function deleteRestMessage(client, args) {
441
+ const { sys_id, name } = args;
442
+ let messageSysId = sys_id;
443
+ // Lookup by name if needed
444
+ if (!messageSysId && name) {
445
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
446
+ params: {
447
+ sysparm_query: `name=${name}`,
448
+ sysparm_fields: 'sys_id,name',
449
+ sysparm_limit: 1
450
+ }
451
+ });
452
+ if (!lookupResponse.data?.result?.[0]) {
453
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
454
+ }
455
+ messageSysId = lookupResponse.data.result[0].sys_id;
456
+ }
457
+ if (!messageSysId) {
458
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'sys_id or name is required for delete action');
459
+ }
460
+ // Delete associated methods first
461
+ const methodsResponse = await client.get('/api/now/table/sys_rest_message_fn', {
462
+ params: {
463
+ sysparm_query: `rest_message=${messageSysId}`,
464
+ sysparm_fields: 'sys_id'
465
+ }
466
+ });
467
+ const methods = methodsResponse.data?.result || [];
468
+ for (const method of methods) {
469
+ await client.delete(`/api/now/table/sys_rest_message_fn/${method.sys_id}`);
470
+ }
471
+ // Delete the REST message
472
+ await client.delete(`/api/now/table/sys_rest_message/${messageSysId}`);
473
+ return (0, error_handler_js_1.createSuccessResult)({
474
+ action: 'delete',
475
+ deleted: true,
476
+ sys_id: messageSysId,
477
+ methods_deleted: methods.length,
478
+ message: `REST message and ${methods.length} associated methods deleted`
479
+ }, { operation: 'delete_rest_message' });
480
+ }
481
+ // ============================================================================
482
+ // METHOD OPERATIONS
483
+ // ============================================================================
484
+ async function listMethods(client, args) {
485
+ const { rest_message_sys_id, name, limit = 50 } = args;
486
+ let messageSysId = rest_message_sys_id;
487
+ // Lookup by name if needed
488
+ if (!messageSysId && name) {
489
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
490
+ params: {
491
+ sysparm_query: `name=${name}`,
492
+ sysparm_fields: 'sys_id',
493
+ sysparm_limit: 1
494
+ }
495
+ });
496
+ if (!lookupResponse.data?.result?.[0]) {
497
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
498
+ }
499
+ messageSysId = lookupResponse.data.result[0].sys_id;
500
+ }
501
+ if (!messageSysId) {
502
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id or name is required for list_methods action');
503
+ }
504
+ const response = await client.get('/api/now/table/sys_rest_message_fn', {
505
+ params: {
506
+ sysparm_query: `rest_message=${messageSysId}`,
507
+ sysparm_fields: 'sys_id,name,http_method,rest_endpoint,content,active',
508
+ sysparm_limit: limit
509
+ }
510
+ });
511
+ const methods = response.data?.result || [];
512
+ return (0, error_handler_js_1.createSuccessResult)({
513
+ action: 'list_methods',
514
+ rest_message_sys_id: messageSysId,
515
+ count: methods.length,
516
+ methods: methods.map((m) => ({
517
+ sys_id: m.sys_id,
518
+ name: m.name,
519
+ http_method: m.http_method,
520
+ endpoint: m.rest_endpoint,
521
+ has_body: !!m.content,
522
+ active: m.active === 'true'
523
+ }))
524
+ }, { operation: 'list_methods' });
525
+ }
526
+ async function getMethod(client, args) {
527
+ const { method_sys_id, sys_id } = args;
528
+ const methodId = method_sys_id || sys_id;
529
+ if (!methodId) {
530
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for get_method action');
531
+ }
532
+ // Get the method
533
+ const methodResponse = await client.get(`/api/now/table/sys_rest_message_fn/${methodId}`);
534
+ const method = methodResponse.data?.result;
535
+ if (!method) {
536
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Method not found: ${methodId}`);
537
+ }
538
+ // Get associated headers
539
+ const headersResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
540
+ params: {
541
+ sysparm_query: `rest_message_function=${methodId}`,
542
+ sysparm_fields: 'sys_id,name,value'
543
+ }
544
+ });
545
+ const headers = headersResponse.data?.result || [];
546
+ // Get associated parameters
547
+ const paramsResponse = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
548
+ params: {
549
+ sysparm_query: `rest_message_function=${methodId}`,
550
+ sysparm_fields: 'sys_id,name,value'
551
+ }
552
+ });
553
+ const parameters = paramsResponse.data?.result || [];
554
+ return (0, error_handler_js_1.createSuccessResult)({
555
+ action: 'get_method',
556
+ method: {
557
+ sys_id: method.sys_id,
558
+ name: method.name,
559
+ http_method: method.http_method,
560
+ endpoint: method.rest_endpoint,
561
+ request_body: method.content,
562
+ active: method.active === 'true',
563
+ rest_message: method.rest_message
564
+ },
565
+ headers: headers.map((h) => ({
566
+ sys_id: h.sys_id,
567
+ name: h.name,
568
+ value: h.value
569
+ })),
570
+ parameters: parameters.map((p) => ({
571
+ sys_id: p.sys_id,
572
+ name: p.name,
573
+ value: p.value
574
+ }))
575
+ }, { operation: 'get_method' });
576
+ }
577
+ async function createMethod(client, args) {
578
+ const { rest_message_sys_id, name, http_method = 'GET', relative_path = '', request_body, headers } = args;
579
+ if (!rest_message_sys_id) {
580
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id is required for create_method action');
581
+ }
582
+ if (!name) {
583
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'name is required for create_method action');
584
+ }
585
+ // Get the parent REST message to build full endpoint
586
+ const messageResponse = await client.get(`/api/now/table/sys_rest_message/${rest_message_sys_id}`, {
587
+ params: { sysparm_fields: 'rest_endpoint' }
588
+ });
589
+ const baseEndpoint = messageResponse.data?.result?.rest_endpoint || '';
590
+ const methodData = {
591
+ rest_message: rest_message_sys_id,
592
+ name,
593
+ http_method,
594
+ rest_endpoint: baseEndpoint + relative_path,
595
+ active: true
596
+ };
597
+ if (request_body) {
598
+ methodData.content = request_body;
599
+ }
600
+ const response = await client.post('/api/now/table/sys_rest_message_fn', methodData);
601
+ const created = response.data?.result;
602
+ // Create headers if provided
603
+ const createdHeaders = [];
604
+ if (headers && typeof headers === 'object') {
605
+ for (const [headerName, headerValue] of Object.entries(headers)) {
606
+ const headerResponse = await client.post('/api/now/table/sys_rest_message_fn_headers', {
607
+ rest_message_function: created.sys_id,
608
+ name: headerName,
609
+ value: headerValue
610
+ });
611
+ createdHeaders.push({
612
+ sys_id: headerResponse.data?.result?.sys_id,
613
+ name: headerName,
614
+ value: headerValue
615
+ });
616
+ }
617
+ }
618
+ return (0, error_handler_js_1.createSuccessResult)({
619
+ action: 'create_method',
620
+ created: true,
621
+ method: {
622
+ sys_id: created.sys_id,
623
+ name: created.name,
624
+ http_method: created.http_method,
625
+ endpoint: created.rest_endpoint
626
+ },
627
+ headers_created: createdHeaders.length,
628
+ headers: createdHeaders
629
+ }, { operation: 'create_method' });
630
+ }
631
+ async function updateMethod(client, args) {
632
+ const { method_sys_id, sys_id, name, http_method, relative_path, request_body } = args;
633
+ const methodId = method_sys_id || sys_id;
634
+ if (!methodId) {
635
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for update_method action');
636
+ }
637
+ const updateData = {};
638
+ if (name !== undefined)
639
+ updateData.name = name;
640
+ if (http_method !== undefined)
641
+ updateData.http_method = http_method;
642
+ if (relative_path !== undefined) {
643
+ // Get parent REST message to build full endpoint
644
+ const methodResponse = await client.get(`/api/now/table/sys_rest_message_fn/${methodId}`, {
645
+ params: { sysparm_fields: 'rest_message' }
646
+ });
647
+ const restMessageId = methodResponse.data?.result?.rest_message?.value;
648
+ if (restMessageId) {
649
+ const messageResponse = await client.get(`/api/now/table/sys_rest_message/${restMessageId}`, {
650
+ params: { sysparm_fields: 'rest_endpoint' }
651
+ });
652
+ const baseEndpoint = messageResponse.data?.result?.rest_endpoint || '';
653
+ updateData.rest_endpoint = baseEndpoint + relative_path;
654
+ }
655
+ }
656
+ if (request_body !== undefined)
657
+ updateData.content = request_body;
658
+ if (Object.keys(updateData).length === 0) {
659
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'No fields to update');
660
+ }
661
+ const response = await client.patch(`/api/now/table/sys_rest_message_fn/${methodId}`, updateData);
662
+ const updated = response.data?.result;
663
+ return (0, error_handler_js_1.createSuccessResult)({
664
+ action: 'update_method',
665
+ updated: true,
666
+ method: {
667
+ sys_id: updated.sys_id,
668
+ name: updated.name,
669
+ http_method: updated.http_method,
670
+ endpoint: updated.rest_endpoint
671
+ },
672
+ fields_updated: Object.keys(updateData)
673
+ }, { operation: 'update_method' });
674
+ }
675
+ async function deleteMethod(client, args) {
676
+ const { method_sys_id, sys_id } = args;
677
+ const methodId = method_sys_id || sys_id;
678
+ if (!methodId) {
679
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for delete_method action');
680
+ }
681
+ // Delete associated headers first
682
+ const headersResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
683
+ params: {
684
+ sysparm_query: `rest_message_function=${methodId}`,
685
+ sysparm_fields: 'sys_id'
686
+ }
687
+ });
688
+ const headers = headersResponse.data?.result || [];
689
+ for (const header of headers) {
690
+ await client.delete(`/api/now/table/sys_rest_message_fn_headers/${header.sys_id}`);
691
+ }
692
+ // Delete the method
693
+ await client.delete(`/api/now/table/sys_rest_message_fn/${methodId}`);
694
+ return (0, error_handler_js_1.createSuccessResult)({
695
+ action: 'delete_method',
696
+ deleted: true,
697
+ method_sys_id: methodId,
698
+ headers_deleted: headers.length
699
+ }, { operation: 'delete_method' });
700
+ }
701
+ // ============================================================================
702
+ // MESSAGE-LEVEL HEADER OPERATIONS (sys_rest_message_headers)
703
+ // These headers apply to ALL methods in the REST message
704
+ // ============================================================================
705
+ async function listMessageHeaders(client, args) {
706
+ const { rest_message_sys_id, sys_id, name } = args;
707
+ let messageSysId = rest_message_sys_id || sys_id;
708
+ // Lookup by name if needed
709
+ if (!messageSysId && name) {
710
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
711
+ params: {
712
+ sysparm_query: `name=${name}`,
713
+ sysparm_fields: 'sys_id',
714
+ sysparm_limit: 1
715
+ }
716
+ });
717
+ if (!lookupResponse.data?.result?.[0]) {
718
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
719
+ }
720
+ messageSysId = lookupResponse.data.result[0].sys_id;
721
+ }
722
+ if (!messageSysId) {
723
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id, sys_id, or name is required for list_message_headers action');
724
+ }
725
+ const response = await client.get('/api/now/table/sys_rest_message_headers', {
726
+ params: {
727
+ sysparm_query: `rest_message=${messageSysId}`,
728
+ sysparm_fields: 'sys_id,name,value'
729
+ }
730
+ });
731
+ const headers = response.data?.result || [];
732
+ return (0, error_handler_js_1.createSuccessResult)({
733
+ action: 'list_message_headers',
734
+ rest_message_sys_id: messageSysId,
735
+ count: headers.length,
736
+ headers: headers.map((h) => ({
737
+ sys_id: h.sys_id,
738
+ name: h.name,
739
+ value: h.value
740
+ })),
741
+ note: 'These headers apply to ALL methods in this REST message'
742
+ }, { operation: 'list_message_headers' });
743
+ }
744
+ async function createMessageHeader(client, args) {
745
+ const { rest_message_sys_id, sys_id, name, header_name, header_value, headers } = args;
746
+ let messageSysId = rest_message_sys_id || sys_id;
747
+ // Lookup by name if needed
748
+ if (!messageSysId && name) {
749
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
750
+ params: {
751
+ sysparm_query: `name=${name}`,
752
+ sysparm_fields: 'sys_id',
753
+ sysparm_limit: 1
754
+ }
755
+ });
756
+ if (!lookupResponse.data?.result?.[0]) {
757
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
758
+ }
759
+ messageSysId = lookupResponse.data.result[0].sys_id;
760
+ }
761
+ if (!messageSysId) {
762
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id, sys_id, or name is required for create_message_header action');
763
+ }
764
+ const createdHeaders = [];
765
+ // Create multiple headers if provided as object
766
+ if (headers && typeof headers === 'object') {
767
+ for (const [hName, hValue] of Object.entries(headers)) {
768
+ const response = await client.post('/api/now/table/sys_rest_message_headers', {
769
+ rest_message: messageSysId,
770
+ name: hName,
771
+ value: hValue
772
+ });
773
+ createdHeaders.push({
774
+ sys_id: response.data?.result?.sys_id,
775
+ name: hName,
776
+ value: hValue
777
+ });
778
+ }
779
+ }
780
+ else if (header_name && header_value !== undefined) {
781
+ // Create single header
782
+ const response = await client.post('/api/now/table/sys_rest_message_headers', {
783
+ rest_message: messageSysId,
784
+ name: header_name,
785
+ value: header_value
786
+ });
787
+ createdHeaders.push({
788
+ sys_id: response.data?.result?.sys_id,
789
+ name: header_name,
790
+ value: header_value
791
+ });
792
+ }
793
+ else {
794
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either headers object or header_name+header_value is required');
795
+ }
796
+ return (0, error_handler_js_1.createSuccessResult)({
797
+ action: 'create_message_header',
798
+ created: true,
799
+ rest_message_sys_id: messageSysId,
800
+ headers: createdHeaders,
801
+ count: createdHeaders.length,
802
+ note: 'These headers will apply to ALL methods in this REST message'
803
+ }, { operation: 'create_message_header' });
804
+ }
805
+ async function deleteMessageHeader(client, args) {
806
+ const { header_sys_id, sys_id, header_name, rest_message_sys_id, name } = args;
807
+ const headerSysIdToDelete = header_sys_id || sys_id;
808
+ if (headerSysIdToDelete) {
809
+ // Delete by sys_id
810
+ await client.delete(`/api/now/table/sys_rest_message_headers/${headerSysIdToDelete}`);
811
+ return (0, error_handler_js_1.createSuccessResult)({
812
+ action: 'delete_message_header',
813
+ deleted: true,
814
+ header_sys_id: headerSysIdToDelete
815
+ }, { operation: 'delete_message_header' });
816
+ }
817
+ else if (header_name && (rest_message_sys_id || name)) {
818
+ // Find REST message sys_id if needed
819
+ let messageSysId = rest_message_sys_id;
820
+ if (!messageSysId && name) {
821
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
822
+ params: {
823
+ sysparm_query: `name=${name}`,
824
+ sysparm_fields: 'sys_id',
825
+ sysparm_limit: 1
826
+ }
827
+ });
828
+ if (!lookupResponse.data?.result?.[0]) {
829
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
830
+ }
831
+ messageSysId = lookupResponse.data.result[0].sys_id;
832
+ }
833
+ // Find and delete by name
834
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message_headers', {
835
+ params: {
836
+ sysparm_query: `rest_message=${messageSysId}^name=${header_name}`,
837
+ sysparm_fields: 'sys_id',
838
+ sysparm_limit: 1
839
+ }
840
+ });
841
+ if (!lookupResponse.data?.result?.[0]) {
842
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Message header not found: ${header_name}`);
843
+ }
844
+ const foundHeaderSysId = lookupResponse.data.result[0].sys_id;
845
+ await client.delete(`/api/now/table/sys_rest_message_headers/${foundHeaderSysId}`);
846
+ return (0, error_handler_js_1.createSuccessResult)({
847
+ action: 'delete_message_header',
848
+ deleted: true,
849
+ header_name,
850
+ header_sys_id: foundHeaderSysId
851
+ }, { operation: 'delete_message_header' });
852
+ }
853
+ else {
854
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either header_sys_id/sys_id OR (header_name + rest_message_sys_id/name) is required');
855
+ }
856
+ }
857
+ // ============================================================================
858
+ // METHOD-LEVEL HEADER OPERATIONS (sys_rest_message_fn_headers)
859
+ // These headers apply only to a specific method
860
+ // ============================================================================
861
+ async function listMethodHeaders(client, args) {
862
+ const { method_sys_id, sys_id } = args;
863
+ const methodId = method_sys_id || sys_id;
864
+ if (!methodId) {
865
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for list_method_headers action');
866
+ }
867
+ const response = await client.get('/api/now/table/sys_rest_message_fn_headers', {
868
+ params: {
869
+ sysparm_query: `rest_message_function=${methodId}`,
870
+ sysparm_fields: 'sys_id,name,value'
871
+ }
872
+ });
873
+ const headers = response.data?.result || [];
874
+ return (0, error_handler_js_1.createSuccessResult)({
875
+ action: 'list_method_headers',
876
+ method_sys_id: methodId,
877
+ count: headers.length,
878
+ headers: headers.map((h) => ({
879
+ sys_id: h.sys_id,
880
+ name: h.name,
881
+ value: h.value
882
+ })),
883
+ note: 'These headers apply only to this specific method'
884
+ }, { operation: 'list_method_headers' });
885
+ }
886
+ async function createMethodHeader(client, args) {
887
+ const { method_sys_id, header_name, header_value, headers } = args;
888
+ if (!method_sys_id) {
889
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for create_method_header action');
890
+ }
891
+ const createdHeaders = [];
892
+ // Create multiple headers if provided as object
893
+ if (headers && typeof headers === 'object') {
894
+ for (const [hName, hValue] of Object.entries(headers)) {
895
+ const response = await client.post('/api/now/table/sys_rest_message_fn_headers', {
896
+ rest_message_function: method_sys_id,
897
+ name: hName,
898
+ value: hValue
899
+ });
900
+ createdHeaders.push({
901
+ sys_id: response.data?.result?.sys_id,
902
+ name: hName,
903
+ value: hValue
904
+ });
905
+ }
906
+ }
907
+ else if (header_name && header_value !== undefined) {
908
+ // Create single header
909
+ const response = await client.post('/api/now/table/sys_rest_message_fn_headers', {
910
+ rest_message_function: method_sys_id,
911
+ name: header_name,
912
+ value: header_value
913
+ });
914
+ createdHeaders.push({
915
+ sys_id: response.data?.result?.sys_id,
916
+ name: header_name,
917
+ value: header_value
918
+ });
919
+ }
920
+ else {
921
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either headers object or header_name+header_value is required');
922
+ }
923
+ return (0, error_handler_js_1.createSuccessResult)({
924
+ action: 'create_method_header',
925
+ created: true,
926
+ method_sys_id,
927
+ headers: createdHeaders,
928
+ count: createdHeaders.length,
929
+ note: 'These headers apply only to this specific method'
930
+ }, { operation: 'create_method_header' });
931
+ }
932
+ async function deleteMethodHeader(client, args) {
933
+ const { header_sys_id, sys_id, header_name, method_sys_id } = args;
934
+ const headerSysIdToDelete = header_sys_id || sys_id;
935
+ if (headerSysIdToDelete) {
936
+ // Delete by sys_id
937
+ await client.delete(`/api/now/table/sys_rest_message_fn_headers/${headerSysIdToDelete}`);
938
+ return (0, error_handler_js_1.createSuccessResult)({
939
+ action: 'delete_method_header',
940
+ deleted: true,
941
+ header_sys_id: headerSysIdToDelete
942
+ }, { operation: 'delete_method_header' });
943
+ }
944
+ else if (header_name && method_sys_id) {
945
+ // Find and delete by name
946
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
947
+ params: {
948
+ sysparm_query: `rest_message_function=${method_sys_id}^name=${header_name}`,
949
+ sysparm_fields: 'sys_id',
950
+ sysparm_limit: 1
951
+ }
952
+ });
953
+ if (!lookupResponse.data?.result?.[0]) {
954
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Method header not found: ${header_name}`);
955
+ }
956
+ const foundHeaderSysId = lookupResponse.data.result[0].sys_id;
957
+ await client.delete(`/api/now/table/sys_rest_message_fn_headers/${foundHeaderSysId}`);
958
+ return (0, error_handler_js_1.createSuccessResult)({
959
+ action: 'delete_method_header',
960
+ deleted: true,
961
+ header_name,
962
+ header_sys_id: foundHeaderSysId
963
+ }, { operation: 'delete_method_header' });
964
+ }
965
+ else {
966
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either header_sys_id/sys_id OR (header_name + method_sys_id) is required');
967
+ }
968
+ }
969
+ // ============================================================================
970
+ // QUERY PARAMETER OPERATIONS (sys_rest_message_fn_parameters)
971
+ // ============================================================================
972
+ async function listParameters(client, args) {
973
+ const { method_sys_id, sys_id } = args;
974
+ const methodId = method_sys_id || sys_id;
975
+ if (!methodId) {
976
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for list_parameters action');
977
+ }
978
+ const response = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
979
+ params: {
980
+ sysparm_query: `rest_message_function=${methodId}`,
981
+ sysparm_fields: 'sys_id,name,value'
982
+ }
983
+ });
984
+ const parameters = response.data?.result || [];
985
+ return (0, error_handler_js_1.createSuccessResult)({
986
+ action: 'list_parameters',
987
+ method_sys_id: methodId,
988
+ count: parameters.length,
989
+ parameters: parameters.map((p) => ({
990
+ sys_id: p.sys_id,
991
+ name: p.name,
992
+ value: p.value
993
+ }))
994
+ }, { operation: 'list_parameters' });
995
+ }
996
+ async function createParameter(client, args) {
997
+ const { method_sys_id, parameter_name, parameter_value, parameters } = args;
998
+ if (!method_sys_id) {
999
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for create_parameter action');
1000
+ }
1001
+ const createdParams = [];
1002
+ // Create multiple parameters if provided as object
1003
+ if (parameters && typeof parameters === 'object') {
1004
+ for (const [pName, pValue] of Object.entries(parameters)) {
1005
+ const response = await client.post('/api/now/table/sys_rest_message_fn_parameters', {
1006
+ rest_message_function: method_sys_id,
1007
+ name: pName,
1008
+ value: pValue
1009
+ });
1010
+ createdParams.push({
1011
+ sys_id: response.data?.result?.sys_id,
1012
+ name: pName,
1013
+ value: pValue
1014
+ });
1015
+ }
1016
+ }
1017
+ else if (parameter_name && parameter_value !== undefined) {
1018
+ // Create single parameter
1019
+ const response = await client.post('/api/now/table/sys_rest_message_fn_parameters', {
1020
+ rest_message_function: method_sys_id,
1021
+ name: parameter_name,
1022
+ value: parameter_value
1023
+ });
1024
+ createdParams.push({
1025
+ sys_id: response.data?.result?.sys_id,
1026
+ name: parameter_name,
1027
+ value: parameter_value
1028
+ });
1029
+ }
1030
+ else {
1031
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either parameters object or parameter_name+parameter_value is required');
1032
+ }
1033
+ return (0, error_handler_js_1.createSuccessResult)({
1034
+ action: 'create_parameter',
1035
+ created: true,
1036
+ method_sys_id,
1037
+ parameters: createdParams,
1038
+ count: createdParams.length
1039
+ }, { operation: 'create_parameter' });
1040
+ }
1041
+ async function deleteParameter(client, args) {
1042
+ const { parameter_sys_id, sys_id, parameter_name, method_sys_id } = args;
1043
+ const paramSysIdToDelete = parameter_sys_id || sys_id;
1044
+ if (paramSysIdToDelete) {
1045
+ // Delete by sys_id
1046
+ await client.delete(`/api/now/table/sys_rest_message_fn_parameters/${paramSysIdToDelete}`);
1047
+ return (0, error_handler_js_1.createSuccessResult)({
1048
+ action: 'delete_parameter',
1049
+ deleted: true,
1050
+ parameter_sys_id: paramSysIdToDelete
1051
+ }, { operation: 'delete_parameter' });
1052
+ }
1053
+ else if (parameter_name && method_sys_id) {
1054
+ // Find and delete by name
1055
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
1056
+ params: {
1057
+ sysparm_query: `rest_message_function=${method_sys_id}^name=${parameter_name}`,
1058
+ sysparm_fields: 'sys_id',
1059
+ sysparm_limit: 1
1060
+ }
1061
+ });
1062
+ if (!lookupResponse.data?.result?.[0]) {
1063
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Parameter not found: ${parameter_name}`);
1064
+ }
1065
+ const foundParamSysId = lookupResponse.data.result[0].sys_id;
1066
+ await client.delete(`/api/now/table/sys_rest_message_fn_parameters/${foundParamSysId}`);
1067
+ return (0, error_handler_js_1.createSuccessResult)({
1068
+ action: 'delete_parameter',
1069
+ deleted: true,
1070
+ parameter_name,
1071
+ parameter_sys_id: foundParamSysId
1072
+ }, { operation: 'delete_parameter' });
1073
+ }
1074
+ else {
1075
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either parameter_sys_id/sys_id OR (parameter_name + method_sys_id) is required');
1076
+ }
1077
+ }
1078
+ // ============================================================================
1079
+ // TEST OPERATIONS
1080
+ // ============================================================================
1081
+ async function testRestMessage(client, args) {
1082
+ const { method_sys_id, sys_id, name, rest_message_sys_id, test_params = {} } = args;
1083
+ const methodId = method_sys_id || sys_id;
1084
+ // If we have a method_sys_id, get method details
1085
+ if (methodId) {
1086
+ const methodResponse = await client.get(`/api/now/table/sys_rest_message_fn/${methodId}`, {
1087
+ params: { sysparm_fields: 'name,http_method,rest_endpoint,rest_message,content' }
1088
+ });
1089
+ const method = methodResponse.data?.result;
1090
+ if (!method) {
1091
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Method not found: ${methodId}`);
1092
+ }
1093
+ // Get REST message details
1094
+ const restMessageId = method.rest_message?.value;
1095
+ const messageResponse = await client.get(`/api/now/table/sys_rest_message/${restMessageId}`, {
1096
+ params: { sysparm_fields: 'name,rest_endpoint,authentication_type' }
1097
+ });
1098
+ const restMessage = messageResponse.data?.result;
1099
+ const restMessageName = restMessage?.name;
1100
+ // Get method headers
1101
+ const headersResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
1102
+ params: {
1103
+ sysparm_query: `rest_message_function=${methodId}`,
1104
+ sysparm_fields: 'name,value'
1105
+ }
1106
+ });
1107
+ const methodHeaders = headersResponse.data?.result || [];
1108
+ // Get message-level headers
1109
+ const msgHeadersResponse = await client.get('/api/now/table/sys_rest_message_headers', {
1110
+ params: {
1111
+ sysparm_query: `rest_message=${restMessageId}`,
1112
+ sysparm_fields: 'name,value'
1113
+ }
1114
+ });
1115
+ const messageHeaders = msgHeadersResponse.data?.result || [];
1116
+ // Get parameters
1117
+ const paramsResponse = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
1118
+ params: {
1119
+ sysparm_query: `rest_message_function=${methodId}`,
1120
+ sysparm_fields: 'name,value'
1121
+ }
1122
+ });
1123
+ const parameters = paramsResponse.data?.result || [];
1124
+ // Build parameter setting code
1125
+ const paramLines = Object.entries(test_params).map(([k, v]) => `rm.setStringParameterNoEscape('${k}', '${String(v).replace(/'/g, "\\'")}');`);
1126
+ // Generate the test script (ES5 compatible!)
1127
+ const testScript = `
1128
+ // Test REST Message: ${restMessageName} - Method: ${method.name}
1129
+ // Generated by snow_rest_message_manage test action
1130
+ // ES5 COMPATIBLE - Safe for ServiceNow execution
1131
+
1132
+ (function() {
1133
+ var results = {
1134
+ success: false,
1135
+ status_code: null,
1136
+ response_body: null,
1137
+ response_headers: {},
1138
+ error: null,
1139
+ timing_ms: 0
1140
+ };
1141
+
1142
+ try {
1143
+ var startTime = new Date().getTime();
1144
+
1145
+ // Create REST message instance
1146
+ var rm = new sn_ws.RESTMessageV2('${restMessageName}', '${method.name}');
1147
+
1148
+ // Set parameters from test_params
1149
+ ${paramLines.length > 0 ? ' ' + paramLines.join('\n ') : ' // No parameters specified'}
1150
+
1151
+ // Execute the request
1152
+ var response = rm.execute();
1153
+ var endTime = new Date().getTime();
1154
+
1155
+ // Collect results
1156
+ results.success = true;
1157
+ results.status_code = response.getStatusCode();
1158
+ results.response_body = response.getBody();
1159
+ results.timing_ms = endTime - startTime;
1160
+
1161
+ // Try to get response headers
1162
+ try {
1163
+ var headerStr = response.getAllHeaders();
1164
+ if (headerStr) {
1165
+ results.response_headers = headerStr;
1166
+ }
1167
+ } catch(headerErr) {
1168
+ // Headers may not be available
1169
+ }
1170
+
1171
+ // Log results
1172
+ gs.info('=== REST MESSAGE TEST RESULTS ===');
1173
+ gs.info('REST Message: ${restMessageName}');
1174
+ gs.info('Method: ${method.name}');
1175
+ gs.info('HTTP Method: ${method.http_method}');
1176
+ gs.info('Status Code: ' + results.status_code);
1177
+ gs.info('Response Time: ' + results.timing_ms + 'ms');
1178
+ gs.info('Response Body: ' + results.response_body);
1179
+
1180
+ } catch(e) {
1181
+ results.success = false;
1182
+ results.error = e.message || String(e);
1183
+ gs.error('REST Message Test Failed: ' + results.error);
1184
+ }
1185
+
1186
+ // Store results in sys_properties for retrieval
1187
+ var propName = 'snow_flow.rest_test.${methodId}';
1188
+ gs.setProperty(propName, JSON.stringify(results));
1189
+ gs.info('Results stored in property: ' + propName);
1190
+
1191
+ return results;
1192
+ })();
1193
+ `.trim();
1194
+ return (0, error_handler_js_1.createSuccessResult)({
1195
+ action: 'test',
1196
+ method: {
1197
+ sys_id: methodId,
1198
+ name: method.name,
1199
+ http_method: method.http_method,
1200
+ endpoint: method.rest_endpoint,
1201
+ has_body: !!method.content
1202
+ },
1203
+ rest_message: {
1204
+ sys_id: restMessageId,
1205
+ name: restMessageName,
1206
+ base_endpoint: restMessage?.rest_endpoint,
1207
+ authentication_type: restMessage?.authentication_type
1208
+ },
1209
+ configuration: {
1210
+ message_headers: messageHeaders.map((h) => ({ name: h.name, value: h.value })),
1211
+ method_headers: methodHeaders.map((h) => ({ name: h.name, value: h.value })),
1212
+ parameters: parameters.map((p) => ({ name: p.name, value: p.value }))
1213
+ },
1214
+ test_params_provided: test_params,
1215
+ test_script: testScript,
1216
+ usage: {
1217
+ description: 'Use snow_schedule_script_job to execute this test script',
1218
+ example: `snow_schedule_script_job({ script: <test_script>, description: 'Test REST: ${restMessageName}' })`,
1219
+ manual_test: `In ServiceNow: System Web Services > Outbound > REST Message > ${restMessageName} > ${method.name} > Test`
1220
+ },
1221
+ note: 'Direct REST message testing requires ServiceNow script execution. Copy the test_script and run it via snow_schedule_script_job.'
1222
+ }, { operation: 'test_rest_message' });
1223
+ }
1224
+ // If we have REST message name but no method, list available methods
1225
+ if (name || rest_message_sys_id) {
1226
+ let messageSysId = rest_message_sys_id;
1227
+ let messageName = name;
1228
+ // Lookup by name if needed
1229
+ if (!messageSysId && name) {
1230
+ const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
1231
+ params: {
1232
+ sysparm_query: `name=${name}`,
1233
+ sysparm_fields: 'sys_id,name',
1234
+ sysparm_limit: 1
1235
+ }
1236
+ });
1237
+ if (!lookupResponse.data?.result?.[0]) {
1238
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
1239
+ }
1240
+ messageSysId = lookupResponse.data.result[0].sys_id;
1241
+ messageName = lookupResponse.data.result[0].name;
1242
+ }
1243
+ else if (messageSysId && !messageName) {
1244
+ const msgResponse = await client.get(`/api/now/table/sys_rest_message/${messageSysId}`, {
1245
+ params: { sysparm_fields: 'name' }
1246
+ });
1247
+ messageName = msgResponse.data?.result?.name;
1248
+ }
1249
+ // Get methods for this REST message
1250
+ const methodsResponse = await client.get('/api/now/table/sys_rest_message_fn', {
1251
+ params: {
1252
+ sysparm_query: `rest_message=${messageSysId}`,
1253
+ sysparm_fields: 'sys_id,name,http_method,rest_endpoint'
1254
+ }
1255
+ });
1256
+ const methods = methodsResponse.data?.result || [];
1257
+ return (0, error_handler_js_1.createSuccessResult)({
1258
+ action: 'test',
1259
+ rest_message: {
1260
+ sys_id: messageSysId,
1261
+ name: messageName
1262
+ },
1263
+ available_methods: methods.map((m) => ({
1264
+ sys_id: m.sys_id,
1265
+ name: m.name,
1266
+ http_method: m.http_method,
1267
+ endpoint: m.rest_endpoint
1268
+ })),
1269
+ note: 'Specify method_sys_id to generate a test script for a specific method'
1270
+ }, { operation: 'test_rest_message' });
1271
+ }
1272
+ throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id, name, or rest_message_sys_id is required for test action');
1273
+ }
1274
+ exports.version = '2.0.0';
1275
+ exports.author = 'Snow-Flow SDK';
1276
+ exports.changelog = {
1277
+ '2.0.0': 'Added message-level headers, method-level headers, query parameters, improved test with ES5 script generation',
1278
+ '1.0.0': 'Initial release with REST message and method CRUD operations'
1279
+ };
1280
+ //# sourceMappingURL=snow_rest_message_manage.js.map