@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.
- package/LICENSE +21 -0
- package/README.md +844 -0
- package/dist/cli/auth.d.ts +15 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +200 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/config-store.d.ts +28 -0
- package/dist/cli/config-store.d.ts.map +1 -0
- package/dist/cli/config-store.js +66 -0
- package/dist/cli/config-store.js.map +1 -0
- package/dist/cli/detect-clients.d.ts +16 -0
- package/dist/cli/detect-clients.d.ts.map +1 -0
- package/dist/cli/detect-clients.js +151 -0
- package/dist/cli/detect-clients.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +135 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +564 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/writers/index.d.ts +9 -0
- package/dist/cli/writers/index.d.ts.map +1 -0
- package/dist/cli/writers/index.js +135 -0
- package/dist/cli/writers/index.js.map +1 -0
- package/dist/prompts/index.d.ts +25 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +38 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/itsm.d.ts +20 -0
- package/dist/prompts/itsm.d.ts.map +1 -0
- package/dist/prompts/itsm.js +110 -0
- package/dist/prompts/itsm.js.map +1 -0
- package/dist/prompts/user-prompts.d.ts +3 -0
- package/dist/prompts/user-prompts.d.ts.map +1 -0
- package/dist/prompts/user-prompts.js +35 -0
- package/dist/prompts/user-prompts.js.map +1 -0
- package/dist/resources/index.d.ts +26 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +99 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server-http.d.ts +41 -0
- package/dist/server-http.d.ts.map +1 -0
- package/dist/server-http.js +187 -0
- package/dist/server-http.js.map +1 -0
- package/dist/server.d.ts +54 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +150 -0
- package/dist/server.js.map +1 -0
- package/dist/servicenow/client.d.ts +137 -0
- package/dist/servicenow/client.d.ts.map +1 -0
- package/dist/servicenow/client.js +855 -0
- package/dist/servicenow/client.js.map +1 -0
- package/dist/servicenow/instances.d.ts +28 -0
- package/dist/servicenow/instances.d.ts.map +1 -0
- package/dist/servicenow/instances.js +190 -0
- package/dist/servicenow/instances.js.map +1 -0
- package/dist/servicenow/types.d.ts +578 -0
- package/dist/servicenow/types.d.ts.map +1 -0
- package/dist/servicenow/types.js +3 -0
- package/dist/servicenow/types.js.map +1 -0
- package/dist/tools/agile.d.ts +225 -0
- package/dist/tools/agile.d.ts.map +1 -0
- package/dist/tools/agile.js +205 -0
- package/dist/tools/agile.js.map +1 -0
- package/dist/tools/app-studio.d.ts +139 -0
- package/dist/tools/app-studio.d.ts.map +1 -0
- package/dist/tools/app-studio.js +139 -0
- package/dist/tools/app-studio.js.map +1 -0
- package/dist/tools/atf.d.ts +144 -0
- package/dist/tools/atf.d.ts.map +1 -0
- package/dist/tools/atf.js +186 -0
- package/dist/tools/atf.js.map +1 -0
- package/dist/tools/catalog.d.ts +966 -0
- package/dist/tools/catalog.d.ts.map +1 -0
- package/dist/tools/catalog.js +640 -0
- package/dist/tools/catalog.js.map +1 -0
- package/dist/tools/change.d.ts +351 -0
- package/dist/tools/change.d.ts.map +1 -0
- package/dist/tools/change.js +214 -0
- package/dist/tools/change.js.map +1 -0
- package/dist/tools/core.d.ts +768 -0
- package/dist/tools/core.d.ts.map +1 -0
- package/dist/tools/core.js +695 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/csm.d.ts +403 -0
- package/dist/tools/csm.d.ts.map +1 -0
- package/dist/tools/csm.js +256 -0
- package/dist/tools/csm.js.map +1 -0
- package/dist/tools/deployment.d.ts +366 -0
- package/dist/tools/deployment.d.ts.map +1 -0
- package/dist/tools/deployment.js +181 -0
- package/dist/tools/deployment.js.map +1 -0
- package/dist/tools/devops.d.ts +236 -0
- package/dist/tools/devops.d.ts.map +1 -0
- package/dist/tools/devops.js +207 -0
- package/dist/tools/devops.js.map +1 -0
- package/dist/tools/discovery.d.ts +306 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +357 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/flow.d.ts +496 -0
- package/dist/tools/flow.d.ts.map +1 -0
- package/dist/tools/flow.js +348 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/hrsd.d.ts +790 -0
- package/dist/tools/hrsd.d.ts.map +1 -0
- package/dist/tools/hrsd.js +378 -0
- package/dist/tools/hrsd.js.map +1 -0
- package/dist/tools/incident.d.ts +259 -0
- package/dist/tools/incident.d.ts.map +1 -0
- package/dist/tools/incident.js +170 -0
- package/dist/tools/incident.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +385 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/integration.d.ts +940 -0
- package/dist/tools/integration.d.ts.map +1 -0
- package/dist/tools/integration.js +685 -0
- package/dist/tools/integration.js.map +1 -0
- package/dist/tools/itam.d.ts +462 -0
- package/dist/tools/itam.d.ts.map +1 -0
- package/dist/tools/itam.js +306 -0
- package/dist/tools/itam.js.map +1 -0
- package/dist/tools/knowledge.d.ts +187 -0
- package/dist/tools/knowledge.d.ts.map +1 -0
- package/dist/tools/knowledge.js +161 -0
- package/dist/tools/knowledge.js.map +1 -0
- package/dist/tools/ml.d.ts +263 -0
- package/dist/tools/ml.d.ts.map +1 -0
- package/dist/tools/ml.js +251 -0
- package/dist/tools/ml.js.map +1 -0
- package/dist/tools/mobile.d.ts +352 -0
- package/dist/tools/mobile.d.ts.map +1 -0
- package/dist/tools/mobile.js +122 -0
- package/dist/tools/mobile.js.map +1 -0
- package/dist/tools/notification.d.ts +590 -0
- package/dist/tools/notification.d.ts.map +1 -0
- package/dist/tools/notification.js +382 -0
- package/dist/tools/notification.js.map +1 -0
- package/dist/tools/now-assist.d.ts +300 -0
- package/dist/tools/now-assist.d.ts.map +1 -0
- package/dist/tools/now-assist.js +227 -0
- package/dist/tools/now-assist.js.map +1 -0
- package/dist/tools/performance.d.ts +447 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +473 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/portal.d.ts +530 -0
- package/dist/tools/portal.d.ts.map +1 -0
- package/dist/tools/portal.js +425 -0
- package/dist/tools/portal.js.map +1 -0
- package/dist/tools/problem.d.ts +111 -0
- package/dist/tools/problem.d.ts.map +1 -0
- package/dist/tools/problem.js +101 -0
- package/dist/tools/problem.js.map +1 -0
- package/dist/tools/reporting.d.ts +825 -0
- package/dist/tools/reporting.d.ts.map +1 -0
- package/dist/tools/reporting.js +453 -0
- package/dist/tools/reporting.js.map +1 -0
- package/dist/tools/sam.d.ts +312 -0
- package/dist/tools/sam.d.ts.map +1 -0
- package/dist/tools/sam.js +360 -0
- package/dist/tools/sam.js.map +1 -0
- package/dist/tools/schema-helpers.d.ts +119 -0
- package/dist/tools/schema-helpers.d.ts.map +1 -0
- package/dist/tools/schema-helpers.js +121 -0
- package/dist/tools/schema-helpers.js.map +1 -0
- package/dist/tools/script.d.ts +714 -0
- package/dist/tools/script.d.ts.map +1 -0
- package/dist/tools/script.js +629 -0
- package/dist/tools/script.js.map +1 -0
- package/dist/tools/security.d.ts +802 -0
- package/dist/tools/security.d.ts.map +1 -0
- package/dist/tools/security.js +426 -0
- package/dist/tools/security.js.map +1 -0
- package/dist/tools/smart-query.d.ts +84 -0
- package/dist/tools/smart-query.d.ts.map +1 -0
- package/dist/tools/smart-query.js +320 -0
- package/dist/tools/smart-query.js.map +1 -0
- package/dist/tools/sys-properties.d.ts +315 -0
- package/dist/tools/sys-properties.d.ts.map +1 -0
- package/dist/tools/sys-properties.js +416 -0
- package/dist/tools/sys-properties.js.map +1 -0
- package/dist/tools/task.d.ts +82 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +96 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/updateset.d.ts +159 -0
- package/dist/tools/updateset.d.ts.map +1 -0
- package/dist/tools/updateset.js +266 -0
- package/dist/tools/updateset.js.map +1 -0
- package/dist/tools/usem-approval.d.ts +130 -0
- package/dist/tools/usem-approval.d.ts.map +1 -0
- package/dist/tools/usem-approval.js +194 -0
- package/dist/tools/usem-approval.js.map +1 -0
- package/dist/tools/usem-config.d.ts +171 -0
- package/dist/tools/usem-config.d.ts.map +1 -0
- package/dist/tools/usem-config.js +254 -0
- package/dist/tools/usem-config.js.map +1 -0
- package/dist/tools/usem-integration.d.ts +228 -0
- package/dist/tools/usem-integration.d.ts.map +1 -0
- package/dist/tools/usem-integration.js +223 -0
- package/dist/tools/usem-integration.js.map +1 -0
- package/dist/tools/usem-sla.d.ts +201 -0
- package/dist/tools/usem-sla.d.ts.map +1 -0
- package/dist/tools/usem-sla.js +322 -0
- package/dist/tools/usem-sla.js.map +1 -0
- package/dist/tools/usem.d.ts +489 -0
- package/dist/tools/usem.d.ts.map +1 -0
- package/dist/tools/usem.js +514 -0
- package/dist/tools/usem.js.map +1 -0
- package/dist/tools/user.d.ts +206 -0
- package/dist/tools/user.d.ts.map +1 -0
- package/dist/tools/user.js +163 -0
- package/dist/tools/user.js.map +1 -0
- package/dist/tools/va.d.ts +217 -0
- package/dist/tools/va.d.ts.map +1 -0
- package/dist/tools/va.js +178 -0
- package/dist/tools/va.js.map +1 -0
- package/dist/tools/workspace.d.ts +565 -0
- package/dist/tools/workspace.d.ts.map +1 -0
- package/dist/tools/workspace.js +201 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/utils/errors.d.ts +6 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +11 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logging.d.ts +7 -0
- package/dist/utils/logging.d.ts.map +1 -0
- package/dist/utils/logging.js +15 -0
- package/dist/utils/logging.js.map +1 -0
- package/dist/utils/permissions.d.ts +21 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +54 -0
- package/dist/utils/permissions.js.map +1 -0
- package/instances.example.json +69 -0
- package/package.json +110 -0
|
@@ -0,0 +1,685 @@
|
|
|
1
|
+
import { ServiceNowError } from '../utils/errors.js';
|
|
2
|
+
import { requireWrite, requireScripting } from '../utils/permissions.js';
|
|
3
|
+
export function getIntegrationToolDefinitions() {
|
|
4
|
+
return [
|
|
5
|
+
// ── Outbound REST Messages ───────────────────────────────────────────────
|
|
6
|
+
{
|
|
7
|
+
name: 'list_rest_messages',
|
|
8
|
+
description: 'List outbound REST Message configurations (integrations with external APIs)',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
query: { type: 'string', description: 'Search by name or description' },
|
|
13
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
14
|
+
},
|
|
15
|
+
required: [],
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'get_rest_message',
|
|
20
|
+
description: 'Get full configuration of an outbound REST Message including its endpoints',
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
sys_id_or_name: { type: 'string', description: 'REST Message sys_id or name' },
|
|
25
|
+
},
|
|
26
|
+
required: ['sys_id_or_name'],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'list_rest_message_functions',
|
|
31
|
+
description: 'List HTTP methods (functions) defined within a REST Message',
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
rest_message_sys_id: { type: 'string', description: 'Parent REST Message sys_id' },
|
|
36
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
37
|
+
},
|
|
38
|
+
required: ['rest_message_sys_id'],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'create_rest_message',
|
|
43
|
+
description: 'Create a new outbound REST Message definition (requires WRITE_ENABLED=true)',
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: {
|
|
47
|
+
name: { type: 'string', description: 'Unique REST Message name' },
|
|
48
|
+
endpoint: { type: 'string', description: 'Base URL endpoint (e.g. "https://api.example.com/v1")' },
|
|
49
|
+
description: { type: 'string', description: 'Purpose/description of this integration' },
|
|
50
|
+
use_mutual_auth: { type: 'boolean', description: 'Whether to use mutual TLS authentication' },
|
|
51
|
+
authentication_type: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'Auth type: "no_authentication", "basic", "oauth2"',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
required: ['name', 'endpoint'],
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
// ── Transform Maps ──────────────────────────────────────────────────────
|
|
60
|
+
{
|
|
61
|
+
name: 'list_transform_maps',
|
|
62
|
+
description: 'List Transform Maps used for importing data into ServiceNow tables',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
properties: {
|
|
66
|
+
query: { type: 'string', description: 'Search by name or target table' },
|
|
67
|
+
target_table: { type: 'string', description: 'Filter by target table name (e.g. "incident")' },
|
|
68
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
69
|
+
},
|
|
70
|
+
required: [],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'get_transform_map',
|
|
75
|
+
description: 'Get details of a Transform Map including its field mappings',
|
|
76
|
+
inputSchema: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
sys_id_or_name: { type: 'string', description: 'Transform Map sys_id or name' },
|
|
80
|
+
},
|
|
81
|
+
required: ['sys_id_or_name'],
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'run_transform_map',
|
|
86
|
+
description: 'Execute a Transform Map on an Import Set to load data (requires WRITE_ENABLED=true)',
|
|
87
|
+
inputSchema: {
|
|
88
|
+
type: 'object',
|
|
89
|
+
properties: {
|
|
90
|
+
transform_map_sys_id: { type: 'string', description: 'sys_id of the Transform Map to run' },
|
|
91
|
+
import_set_sys_id: { type: 'string', description: 'sys_id of the Import Set containing source data' },
|
|
92
|
+
},
|
|
93
|
+
required: ['transform_map_sys_id', 'import_set_sys_id'],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'list_transform_field_maps',
|
|
98
|
+
description: 'List field-level mappings within a Transform Map',
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
properties: {
|
|
102
|
+
transform_map_sys_id: { type: 'string', description: 'Parent Transform Map sys_id' },
|
|
103
|
+
limit: { type: 'number', description: 'Max records to return (default 50)' },
|
|
104
|
+
},
|
|
105
|
+
required: ['transform_map_sys_id'],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
// ── Import Sets ─────────────────────────────────────────────────────────
|
|
109
|
+
{
|
|
110
|
+
name: 'list_import_sets',
|
|
111
|
+
description: 'List Import Sets with optional filter by state or staging table',
|
|
112
|
+
inputSchema: {
|
|
113
|
+
type: 'object',
|
|
114
|
+
properties: {
|
|
115
|
+
state: { type: 'string', description: 'Filter by state: loaded, partial, transform_failed, complete' },
|
|
116
|
+
query: { type: 'string', description: 'Additional encoded query string' },
|
|
117
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
118
|
+
},
|
|
119
|
+
required: [],
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'get_import_set',
|
|
124
|
+
description: 'Get details of a specific Import Set including row count and transform status',
|
|
125
|
+
inputSchema: {
|
|
126
|
+
type: 'object',
|
|
127
|
+
properties: {
|
|
128
|
+
sys_id: { type: 'string', description: 'Import Set sys_id' },
|
|
129
|
+
},
|
|
130
|
+
required: ['sys_id'],
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'create_import_set_row',
|
|
135
|
+
description: 'Insert a row into an Import Set staging table for later transformation (requires WRITE_ENABLED=true)',
|
|
136
|
+
inputSchema: {
|
|
137
|
+
type: 'object',
|
|
138
|
+
properties: {
|
|
139
|
+
staging_table: {
|
|
140
|
+
type: 'string',
|
|
141
|
+
description: 'Staging table name (e.g. "u_import_incident"). Must already exist.',
|
|
142
|
+
},
|
|
143
|
+
data: { type: 'object', description: 'Key-value pairs for the staging table row' },
|
|
144
|
+
},
|
|
145
|
+
required: ['staging_table', 'data'],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'list_data_sources',
|
|
150
|
+
description: 'List Import Set data source definitions (file/JDBC/REST loaders)',
|
|
151
|
+
inputSchema: {
|
|
152
|
+
type: 'object',
|
|
153
|
+
properties: {
|
|
154
|
+
query: { type: 'string', description: 'Search by name' },
|
|
155
|
+
type: { type: 'string', description: 'Filter by type: file, jdbc, ldap, rest' },
|
|
156
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
157
|
+
},
|
|
158
|
+
required: [],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
// ── Event Registry & Management ─────────────────────────────────────────
|
|
162
|
+
{
|
|
163
|
+
name: 'list_event_registry',
|
|
164
|
+
description: 'List registered event definitions in the ServiceNow event registry',
|
|
165
|
+
inputSchema: {
|
|
166
|
+
type: 'object',
|
|
167
|
+
properties: {
|
|
168
|
+
query: { type: 'string', description: 'Search events by name or description' },
|
|
169
|
+
limit: { type: 'number', description: 'Max records to return (default 50)' },
|
|
170
|
+
},
|
|
171
|
+
required: [],
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'get_event_registry_entry',
|
|
176
|
+
description: 'Get details of a specific registered event definition',
|
|
177
|
+
inputSchema: {
|
|
178
|
+
type: 'object',
|
|
179
|
+
properties: {
|
|
180
|
+
name_or_sysid: { type: 'string', description: 'Event name (e.g. "incident.created") or sys_id' },
|
|
181
|
+
},
|
|
182
|
+
required: ['name_or_sysid'],
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: 'register_event',
|
|
187
|
+
description: 'Register a new custom event in the event registry (requires SCRIPTING_ENABLED=true)',
|
|
188
|
+
inputSchema: {
|
|
189
|
+
type: 'object',
|
|
190
|
+
properties: {
|
|
191
|
+
name: { type: 'string', description: 'Unique event name (e.g. "my_app.record_created")' },
|
|
192
|
+
description: { type: 'string', description: 'Description of when this event fires' },
|
|
193
|
+
table: { type: 'string', description: 'Table that fires this event (e.g. "incident")' },
|
|
194
|
+
},
|
|
195
|
+
required: ['name', 'table'],
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: 'fire_event',
|
|
200
|
+
description: 'Fire a custom ServiceNow event for a specific record (requires WRITE_ENABLED=true)',
|
|
201
|
+
inputSchema: {
|
|
202
|
+
type: 'object',
|
|
203
|
+
properties: {
|
|
204
|
+
event_name: { type: 'string', description: 'Event name to fire (must be registered)' },
|
|
205
|
+
table: { type: 'string', description: 'Table name of the target record' },
|
|
206
|
+
record_sys_id: { type: 'string', description: 'sys_id of the record to fire the event on' },
|
|
207
|
+
parm1: { type: 'string', description: 'Optional first parameter passed to event handlers' },
|
|
208
|
+
parm2: { type: 'string', description: 'Optional second parameter passed to event handlers' },
|
|
209
|
+
},
|
|
210
|
+
required: ['event_name', 'table', 'record_sys_id'],
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: 'list_event_log',
|
|
215
|
+
description: 'List recent event log entries (fired events and their processing status)',
|
|
216
|
+
inputSchema: {
|
|
217
|
+
type: 'object',
|
|
218
|
+
properties: {
|
|
219
|
+
event_name: { type: 'string', description: 'Filter by event name' },
|
|
220
|
+
state: {
|
|
221
|
+
type: 'string',
|
|
222
|
+
description: 'Filter by state: ready, processing, processed, error, transferred',
|
|
223
|
+
},
|
|
224
|
+
limit: { type: 'number', description: 'Max records to return (default 50)' },
|
|
225
|
+
},
|
|
226
|
+
required: [],
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
// ── OAuth & Credentials ─────────────────────────────────────────────────
|
|
230
|
+
{
|
|
231
|
+
name: 'list_oauth_applications',
|
|
232
|
+
description: 'List OAuth application registry entries (client applications that can authenticate)',
|
|
233
|
+
inputSchema: {
|
|
234
|
+
type: 'object',
|
|
235
|
+
properties: {
|
|
236
|
+
query: { type: 'string', description: 'Search by name or client ID' },
|
|
237
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
238
|
+
},
|
|
239
|
+
required: [],
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
name: 'list_credential_aliases',
|
|
244
|
+
description: 'List connection and credential aliases used by integrations',
|
|
245
|
+
inputSchema: {
|
|
246
|
+
type: 'object',
|
|
247
|
+
properties: {
|
|
248
|
+
query: { type: 'string', description: 'Search by name' },
|
|
249
|
+
type: { type: 'string', description: 'Filter by type: basic, oauth2, api_key, certificate' },
|
|
250
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
251
|
+
},
|
|
252
|
+
required: [],
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
// ── Outbound SOAP Messages ───────────────────────────────────────────────
|
|
256
|
+
{
|
|
257
|
+
name: 'list_soap_messages',
|
|
258
|
+
description: 'List outbound SOAP Message configurations (sys_web_service)',
|
|
259
|
+
inputSchema: {
|
|
260
|
+
type: 'object',
|
|
261
|
+
properties: {
|
|
262
|
+
query: { type: 'string', description: 'Search by name or endpoint' },
|
|
263
|
+
active: { type: 'boolean', description: 'Filter by active status' },
|
|
264
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
265
|
+
},
|
|
266
|
+
required: [],
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
name: 'get_soap_message',
|
|
271
|
+
description: 'Get full configuration of a SOAP Message including its functions/operations',
|
|
272
|
+
inputSchema: {
|
|
273
|
+
type: 'object',
|
|
274
|
+
properties: {
|
|
275
|
+
sys_id_or_name: { type: 'string', description: 'SOAP Message sys_id or name' },
|
|
276
|
+
},
|
|
277
|
+
required: ['sys_id_or_name'],
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
name: 'list_soap_message_functions',
|
|
282
|
+
description: 'List SOAP Message Functions (operations) for a given SOAP Message',
|
|
283
|
+
inputSchema: {
|
|
284
|
+
type: 'object',
|
|
285
|
+
properties: {
|
|
286
|
+
soap_message_sys_id: { type: 'string', description: 'Parent SOAP Message sys_id' },
|
|
287
|
+
limit: { type: 'number', description: 'Max records to return (default 25)' },
|
|
288
|
+
},
|
|
289
|
+
required: ['soap_message_sys_id'],
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
name: 'create_soap_message',
|
|
294
|
+
description: 'Create a new outbound SOAP Message definition (requires WRITE_ENABLED=true)',
|
|
295
|
+
inputSchema: {
|
|
296
|
+
type: 'object',
|
|
297
|
+
properties: {
|
|
298
|
+
name: { type: 'string', description: 'Unique SOAP Message name' },
|
|
299
|
+
endpoint: { type: 'string', description: 'SOAP service endpoint URL' },
|
|
300
|
+
wsdl: { type: 'string', description: 'WSDL URL for the service (used for schema introspection)' },
|
|
301
|
+
namespace: { type: 'string', description: 'XML namespace for SOAP body elements' },
|
|
302
|
+
soap_action_prefix: { type: 'string', description: 'Prefix prepended to all SOAP action headers' },
|
|
303
|
+
authentication_type: {
|
|
304
|
+
type: 'string',
|
|
305
|
+
description: 'Auth type: "no_authentication" (default), "basic", "mutual_authentication"',
|
|
306
|
+
},
|
|
307
|
+
description: { type: 'string', description: 'Purpose/description of this integration' },
|
|
308
|
+
active: { type: 'boolean', description: 'Make active immediately (default: true)' },
|
|
309
|
+
},
|
|
310
|
+
required: ['name', 'endpoint'],
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: 'create_soap_message_function',
|
|
315
|
+
description: 'Add a SOAP function (operation) to an existing SOAP Message (requires WRITE_ENABLED=true)',
|
|
316
|
+
inputSchema: {
|
|
317
|
+
type: 'object',
|
|
318
|
+
properties: {
|
|
319
|
+
soap_message_sys_id: { type: 'string', description: 'Parent SOAP Message sys_id' },
|
|
320
|
+
name: { type: 'string', description: 'Function name (used in scripts to call this operation)' },
|
|
321
|
+
function_name: { type: 'string', description: 'WSDL operation name (matches the SOAP operation)' },
|
|
322
|
+
soap_action: { type: 'string', description: 'Full SOAP Action header value' },
|
|
323
|
+
soap_message_template: { type: 'string', description: 'SOAP XML request body template with ${variable} placeholders' },
|
|
324
|
+
active: { type: 'boolean', description: 'Make active immediately (default: true)' },
|
|
325
|
+
},
|
|
326
|
+
required: ['soap_message_sys_id', 'name', 'function_name'],
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
];
|
|
330
|
+
}
|
|
331
|
+
export async function executeIntegrationToolCall(client, name, args) {
|
|
332
|
+
switch (name) {
|
|
333
|
+
// ── Outbound REST Messages ───────────────────────────────────────────────
|
|
334
|
+
case 'list_rest_messages': {
|
|
335
|
+
const parts = [];
|
|
336
|
+
if (args.query)
|
|
337
|
+
parts.push(`nameCONTAINS${args.query}^ORdescriptionCONTAINS${args.query}`);
|
|
338
|
+
return await client.queryRecords({
|
|
339
|
+
table: 'sys_rest_message',
|
|
340
|
+
query: parts.join('^') || undefined,
|
|
341
|
+
limit: args.limit ?? 25,
|
|
342
|
+
fields: 'sys_id,name,endpoint,description,authentication_type,sys_updated_on',
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
case 'get_rest_message': {
|
|
346
|
+
if (!args.sys_id_or_name)
|
|
347
|
+
throw new ServiceNowError('sys_id_or_name is required', 'INVALID_REQUEST');
|
|
348
|
+
if (/^[0-9a-f]{32}$/i.test(args.sys_id_or_name)) {
|
|
349
|
+
return await client.getRecord('sys_rest_message', args.sys_id_or_name);
|
|
350
|
+
}
|
|
351
|
+
const resp = await client.queryRecords({
|
|
352
|
+
table: 'sys_rest_message',
|
|
353
|
+
query: `name=${args.sys_id_or_name}`,
|
|
354
|
+
limit: 1,
|
|
355
|
+
});
|
|
356
|
+
if (resp.count === 0)
|
|
357
|
+
throw new ServiceNowError(`REST Message not found: ${args.sys_id_or_name}`, 'NOT_FOUND');
|
|
358
|
+
return resp.records[0];
|
|
359
|
+
}
|
|
360
|
+
case 'list_rest_message_functions': {
|
|
361
|
+
if (!args.rest_message_sys_id)
|
|
362
|
+
throw new ServiceNowError('rest_message_sys_id is required', 'INVALID_REQUEST');
|
|
363
|
+
return await client.queryRecords({
|
|
364
|
+
table: 'sys_rest_message_fn',
|
|
365
|
+
query: `rest_message=${args.rest_message_sys_id}`,
|
|
366
|
+
limit: args.limit ?? 25,
|
|
367
|
+
fields: 'sys_id,name,http_method,relative_path,rest_message,sys_updated_on',
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
case 'create_rest_message': {
|
|
371
|
+
requireWrite();
|
|
372
|
+
if (!args.name || !args.endpoint)
|
|
373
|
+
throw new ServiceNowError('name and endpoint are required', 'INVALID_REQUEST');
|
|
374
|
+
const data = {
|
|
375
|
+
name: args.name,
|
|
376
|
+
endpoint: args.endpoint,
|
|
377
|
+
description: args.description || '',
|
|
378
|
+
authentication_type: args.authentication_type || 'no_authentication',
|
|
379
|
+
};
|
|
380
|
+
if (args.use_mutual_auth !== undefined)
|
|
381
|
+
data.use_mutual_auth = args.use_mutual_auth;
|
|
382
|
+
const result = await client.createRecord('sys_rest_message', data);
|
|
383
|
+
return { ...result, summary: `Created REST Message "${args.name}"` };
|
|
384
|
+
}
|
|
385
|
+
// ── Transform Maps ──────────────────────────────────────────────────────
|
|
386
|
+
case 'list_transform_maps': {
|
|
387
|
+
const parts = [];
|
|
388
|
+
if (args.target_table)
|
|
389
|
+
parts.push(`target_table=${args.target_table}`);
|
|
390
|
+
if (args.query)
|
|
391
|
+
parts.push(`nameCONTAINS${args.query}^ORtarget_tableCONTAINS${args.query}`);
|
|
392
|
+
return await client.queryRecords({
|
|
393
|
+
table: 'sys_transform_map',
|
|
394
|
+
query: parts.join('^') || undefined,
|
|
395
|
+
limit: args.limit ?? 25,
|
|
396
|
+
fields: 'sys_id,name,target_table,source_table,active,sys_updated_on',
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
case 'get_transform_map': {
|
|
400
|
+
if (!args.sys_id_or_name)
|
|
401
|
+
throw new ServiceNowError('sys_id_or_name is required', 'INVALID_REQUEST');
|
|
402
|
+
if (/^[0-9a-f]{32}$/i.test(args.sys_id_or_name)) {
|
|
403
|
+
return await client.getRecord('sys_transform_map', args.sys_id_or_name);
|
|
404
|
+
}
|
|
405
|
+
const resp = await client.queryRecords({
|
|
406
|
+
table: 'sys_transform_map',
|
|
407
|
+
query: `name=${args.sys_id_or_name}`,
|
|
408
|
+
limit: 1,
|
|
409
|
+
});
|
|
410
|
+
if (resp.count === 0)
|
|
411
|
+
throw new ServiceNowError(`Transform Map not found: ${args.sys_id_or_name}`, 'NOT_FOUND');
|
|
412
|
+
return resp.records[0];
|
|
413
|
+
}
|
|
414
|
+
case 'run_transform_map': {
|
|
415
|
+
requireWrite();
|
|
416
|
+
if (!args.transform_map_sys_id || !args.import_set_sys_id) {
|
|
417
|
+
throw new ServiceNowError('transform_map_sys_id and import_set_sys_id are required', 'INVALID_REQUEST');
|
|
418
|
+
}
|
|
419
|
+
// Trigger transform via Scripted REST — create a sys_import_set_run record
|
|
420
|
+
const data = {
|
|
421
|
+
import_set: args.import_set_sys_id,
|
|
422
|
+
transform_map: args.transform_map_sys_id,
|
|
423
|
+
};
|
|
424
|
+
const result = await client.createRecord('sys_import_set_run', data);
|
|
425
|
+
return {
|
|
426
|
+
...result,
|
|
427
|
+
summary: `Triggered Transform Map ${args.transform_map_sys_id} on Import Set ${args.import_set_sys_id}`,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
case 'list_transform_field_maps': {
|
|
431
|
+
if (!args.transform_map_sys_id)
|
|
432
|
+
throw new ServiceNowError('transform_map_sys_id is required', 'INVALID_REQUEST');
|
|
433
|
+
return await client.queryRecords({
|
|
434
|
+
table: 'sys_transform_entry',
|
|
435
|
+
query: `map=${args.transform_map_sys_id}`,
|
|
436
|
+
limit: args.limit ?? 50,
|
|
437
|
+
fields: 'sys_id,map,source_field,target_field,coalesce,use_source_script,sys_updated_on',
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
// ── Import Sets ─────────────────────────────────────────────────────────
|
|
441
|
+
case 'list_import_sets': {
|
|
442
|
+
const parts = [];
|
|
443
|
+
if (args.state)
|
|
444
|
+
parts.push(`state=${args.state}`);
|
|
445
|
+
if (args.query)
|
|
446
|
+
parts.push(args.query);
|
|
447
|
+
return await client.queryRecords({
|
|
448
|
+
table: 'sys_import_set',
|
|
449
|
+
query: parts.join('^') || undefined,
|
|
450
|
+
limit: args.limit ?? 25,
|
|
451
|
+
fields: 'sys_id,label,state,table_name,import_count,error_count,sys_created_on',
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
case 'get_import_set': {
|
|
455
|
+
if (!args.sys_id)
|
|
456
|
+
throw new ServiceNowError('sys_id is required', 'INVALID_REQUEST');
|
|
457
|
+
return await client.getRecord('sys_import_set', args.sys_id);
|
|
458
|
+
}
|
|
459
|
+
case 'create_import_set_row': {
|
|
460
|
+
requireWrite();
|
|
461
|
+
if (!args.staging_table || !args.data) {
|
|
462
|
+
throw new ServiceNowError('staging_table and data are required', 'INVALID_REQUEST');
|
|
463
|
+
}
|
|
464
|
+
const result = await client.createRecord(args.staging_table, args.data);
|
|
465
|
+
return { ...result, summary: `Inserted row into staging table "${args.staging_table}"` };
|
|
466
|
+
}
|
|
467
|
+
case 'list_data_sources': {
|
|
468
|
+
const parts = [];
|
|
469
|
+
if (args.type)
|
|
470
|
+
parts.push(`type=${args.type}`);
|
|
471
|
+
if (args.query)
|
|
472
|
+
parts.push(`nameCONTAINS${args.query}`);
|
|
473
|
+
return await client.queryRecords({
|
|
474
|
+
table: 'sys_data_source',
|
|
475
|
+
query: parts.join('^') || undefined,
|
|
476
|
+
limit: args.limit ?? 25,
|
|
477
|
+
fields: 'sys_id,name,type,format,import_set_table_name,sys_updated_on',
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
// ── Event Registry ──────────────────────────────────────────────────────
|
|
481
|
+
case 'list_event_registry': {
|
|
482
|
+
const parts = [];
|
|
483
|
+
if (args.query)
|
|
484
|
+
parts.push(`nameCONTAINS${args.query}^ORdescriptionCONTAINS${args.query}`);
|
|
485
|
+
return await client.queryRecords({
|
|
486
|
+
table: 'sysevent_register',
|
|
487
|
+
query: parts.join('^') || undefined,
|
|
488
|
+
limit: args.limit ?? 50,
|
|
489
|
+
fields: 'sys_id,name,table,description,sys_updated_on',
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
case 'get_event_registry_entry': {
|
|
493
|
+
if (!args.name_or_sysid)
|
|
494
|
+
throw new ServiceNowError('name_or_sysid is required', 'INVALID_REQUEST');
|
|
495
|
+
if (/^[0-9a-f]{32}$/i.test(args.name_or_sysid)) {
|
|
496
|
+
return await client.getRecord('sysevent_register', args.name_or_sysid);
|
|
497
|
+
}
|
|
498
|
+
const resp = await client.queryRecords({
|
|
499
|
+
table: 'sysevent_register',
|
|
500
|
+
query: `name=${args.name_or_sysid}`,
|
|
501
|
+
limit: 1,
|
|
502
|
+
});
|
|
503
|
+
if (resp.count === 0) {
|
|
504
|
+
throw new ServiceNowError(`Event registry entry not found: ${args.name_or_sysid}`, 'NOT_FOUND');
|
|
505
|
+
}
|
|
506
|
+
return resp.records[0];
|
|
507
|
+
}
|
|
508
|
+
case 'register_event': {
|
|
509
|
+
requireScripting();
|
|
510
|
+
if (!args.name || !args.table)
|
|
511
|
+
throw new ServiceNowError('name and table are required', 'INVALID_REQUEST');
|
|
512
|
+
const data = {
|
|
513
|
+
name: args.name,
|
|
514
|
+
table: args.table,
|
|
515
|
+
description: args.description || '',
|
|
516
|
+
};
|
|
517
|
+
const result = await client.createRecord('sysevent_register', data);
|
|
518
|
+
return { ...result, summary: `Registered event "${args.name}" for table "${args.table}"` };
|
|
519
|
+
}
|
|
520
|
+
case 'fire_event': {
|
|
521
|
+
requireWrite();
|
|
522
|
+
if (!args.event_name || !args.table || !args.record_sys_id) {
|
|
523
|
+
throw new ServiceNowError('event_name, table, and record_sys_id are required', 'INVALID_REQUEST');
|
|
524
|
+
}
|
|
525
|
+
// Fire via sys_event table insert
|
|
526
|
+
const data = {
|
|
527
|
+
name: args.event_name,
|
|
528
|
+
table: args.table,
|
|
529
|
+
instance: args.record_sys_id,
|
|
530
|
+
};
|
|
531
|
+
if (args.parm1)
|
|
532
|
+
data.parm1 = args.parm1;
|
|
533
|
+
if (args.parm2)
|
|
534
|
+
data.parm2 = args.parm2;
|
|
535
|
+
const result = await client.createRecord('sysevent', data);
|
|
536
|
+
return {
|
|
537
|
+
...result,
|
|
538
|
+
summary: `Fired event "${args.event_name}" on ${args.table}:${args.record_sys_id}`,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
case 'list_event_log': {
|
|
542
|
+
const parts = [];
|
|
543
|
+
if (args.event_name)
|
|
544
|
+
parts.push(`nameCONTAINS${args.event_name}`);
|
|
545
|
+
if (args.state)
|
|
546
|
+
parts.push(`state=${args.state}`);
|
|
547
|
+
return await client.queryRecords({
|
|
548
|
+
table: 'sysevent',
|
|
549
|
+
query: parts.join('^') || undefined,
|
|
550
|
+
limit: args.limit ?? 50,
|
|
551
|
+
orderBy: '-sys_created_on',
|
|
552
|
+
fields: 'sys_id,name,table,instance,state,parm1,parm2,sys_created_on',
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
// ── Outbound SOAP Messages ───────────────────────────────────────────────
|
|
556
|
+
case 'list_soap_messages': {
|
|
557
|
+
const parts = [];
|
|
558
|
+
if (args.active !== undefined)
|
|
559
|
+
parts.push(`active=${args.active}`);
|
|
560
|
+
if (args.query) {
|
|
561
|
+
// Strip encoded-query control characters from free-text search value
|
|
562
|
+
const safe = args.query.replace(/[\^]/g, '').replace(/\0/g, '');
|
|
563
|
+
parts.push(`nameCONTAINS${safe}^ORendpointCONTAINS${safe}`);
|
|
564
|
+
}
|
|
565
|
+
return await client.queryRecords({
|
|
566
|
+
table: 'sys_web_service',
|
|
567
|
+
query: parts.join('^') || undefined,
|
|
568
|
+
limit: args.limit ?? 25,
|
|
569
|
+
fields: 'sys_id,name,endpoint,wsdl,namespace,authentication_type,active,description,sys_updated_on',
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
case 'get_soap_message': {
|
|
573
|
+
if (!args.sys_id_or_name)
|
|
574
|
+
throw new ServiceNowError('sys_id_or_name is required', 'INVALID_REQUEST');
|
|
575
|
+
let msg;
|
|
576
|
+
if (/^[0-9a-f]{32}$/i.test(args.sys_id_or_name)) {
|
|
577
|
+
msg = await client.getRecord('sys_web_service', args.sys_id_or_name);
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
// Sanitize name: strip encoded-query control chars before using in CONTAINS clause
|
|
581
|
+
const safeName = args.sys_id_or_name.replace(/[\^=]/g, '').replace(/\0/g, '');
|
|
582
|
+
if (!safeName)
|
|
583
|
+
throw new ServiceNowError('sys_id_or_name must not be empty after sanitization', 'INVALID_REQUEST');
|
|
584
|
+
const resp = await client.queryRecords({
|
|
585
|
+
table: 'sys_web_service',
|
|
586
|
+
query: `nameCONTAINS${safeName}`,
|
|
587
|
+
limit: 1,
|
|
588
|
+
});
|
|
589
|
+
if (resp.count === 0)
|
|
590
|
+
throw new ServiceNowError(`SOAP Message not found: ${args.sys_id_or_name}`, 'NOT_FOUND');
|
|
591
|
+
msg = resp.records[0];
|
|
592
|
+
}
|
|
593
|
+
const msgId = msg.sys_id?.value ?? msg.sys_id;
|
|
594
|
+
if (!/^[0-9a-f]{32}$/i.test(String(msgId)))
|
|
595
|
+
throw new ServiceNowError('Unexpected sys_id format in response', 'API_ERROR');
|
|
596
|
+
const fns = await client.queryRecords({
|
|
597
|
+
table: 'sys_web_service_function',
|
|
598
|
+
query: `web_service=${msgId}`,
|
|
599
|
+
limit: 50,
|
|
600
|
+
fields: 'sys_id,name,function_name,soap_action,active',
|
|
601
|
+
});
|
|
602
|
+
return { soap_message: msg, functions: fns.records, function_count: fns.count };
|
|
603
|
+
}
|
|
604
|
+
case 'list_soap_message_functions': {
|
|
605
|
+
if (!args.soap_message_sys_id)
|
|
606
|
+
throw new ServiceNowError('soap_message_sys_id is required', 'INVALID_REQUEST');
|
|
607
|
+
if (!/^[0-9a-f]{32}$/i.test(args.soap_message_sys_id))
|
|
608
|
+
throw new ServiceNowError('soap_message_sys_id must be a 32-char hex sys_id', 'INVALID_REQUEST');
|
|
609
|
+
return await client.queryRecords({
|
|
610
|
+
table: 'sys_web_service_function',
|
|
611
|
+
query: `web_service=${args.soap_message_sys_id}`,
|
|
612
|
+
limit: args.limit ?? 25,
|
|
613
|
+
fields: 'sys_id,name,function_name,soap_action,active,sys_updated_on',
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
case 'create_soap_message': {
|
|
617
|
+
requireWrite();
|
|
618
|
+
if (!args.name || !args.endpoint)
|
|
619
|
+
throw new ServiceNowError('name and endpoint are required', 'INVALID_REQUEST');
|
|
620
|
+
const data = {
|
|
621
|
+
name: args.name,
|
|
622
|
+
endpoint: args.endpoint,
|
|
623
|
+
authentication_type: args.authentication_type || 'no_authentication',
|
|
624
|
+
active: args.active !== false,
|
|
625
|
+
};
|
|
626
|
+
if (args.wsdl)
|
|
627
|
+
data.wsdl = args.wsdl;
|
|
628
|
+
if (args.namespace)
|
|
629
|
+
data.namespace = args.namespace;
|
|
630
|
+
if (args.soap_action_prefix)
|
|
631
|
+
data.soap_action_prefix = args.soap_action_prefix;
|
|
632
|
+
if (args.description)
|
|
633
|
+
data.description = args.description;
|
|
634
|
+
const result = await client.createRecord('sys_web_service', data);
|
|
635
|
+
return { ...result, summary: `Created SOAP Message "${args.name}" at ${args.endpoint}` };
|
|
636
|
+
}
|
|
637
|
+
case 'create_soap_message_function': {
|
|
638
|
+
requireWrite();
|
|
639
|
+
if (!args.soap_message_sys_id || !args.name || !args.function_name)
|
|
640
|
+
throw new ServiceNowError('soap_message_sys_id, name, and function_name are required', 'INVALID_REQUEST');
|
|
641
|
+
if (!/^[0-9a-f]{32}$/i.test(args.soap_message_sys_id))
|
|
642
|
+
throw new ServiceNowError('soap_message_sys_id must be a 32-char hex sys_id', 'INVALID_REQUEST');
|
|
643
|
+
const data = {
|
|
644
|
+
web_service: args.soap_message_sys_id,
|
|
645
|
+
name: args.name,
|
|
646
|
+
function_name: args.function_name,
|
|
647
|
+
active: args.active !== false,
|
|
648
|
+
};
|
|
649
|
+
if (args.soap_action)
|
|
650
|
+
data.soap_action = args.soap_action;
|
|
651
|
+
if (args.soap_message_template)
|
|
652
|
+
data.soap_message = args.soap_message_template;
|
|
653
|
+
const result = await client.createRecord('sys_web_service_function', data);
|
|
654
|
+
return { ...result, summary: `Created SOAP function "${args.name}" on message ${args.soap_message_sys_id}` };
|
|
655
|
+
}
|
|
656
|
+
// ── OAuth ────────────────────────────────────────────────────────────────
|
|
657
|
+
case 'list_oauth_applications': {
|
|
658
|
+
const parts = [];
|
|
659
|
+
if (args.query)
|
|
660
|
+
parts.push(`nameCONTAINS${args.query}^ORclient_idCONTAINS${args.query}`);
|
|
661
|
+
return await client.queryRecords({
|
|
662
|
+
table: 'oauth_entity',
|
|
663
|
+
query: parts.join('^') || undefined,
|
|
664
|
+
limit: args.limit ?? 25,
|
|
665
|
+
fields: 'sys_id,name,client_id,type,active,sys_updated_on',
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
case 'list_credential_aliases': {
|
|
669
|
+
const parts = [];
|
|
670
|
+
if (args.type)
|
|
671
|
+
parts.push(`type=${args.type}`);
|
|
672
|
+
if (args.query)
|
|
673
|
+
parts.push(`nameCONTAINS${args.query}`);
|
|
674
|
+
return await client.queryRecords({
|
|
675
|
+
table: 'sys_alias',
|
|
676
|
+
query: parts.join('^') || undefined,
|
|
677
|
+
limit: args.limit ?? 25,
|
|
678
|
+
fields: 'sys_id,name,type,description,sys_updated_on',
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
default:
|
|
682
|
+
return null;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
//# sourceMappingURL=integration.js.map
|