@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,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP transport for the ServiceNow MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Complements the default stdio transport (see `server.ts`) so the same tool set
|
|
5
|
+
* can be reached over HTTP — enabling browser-based clients (Claude.ai), Docker
|
|
6
|
+
* deployments, shared server instances, and CI/CD callers.
|
|
7
|
+
*
|
|
8
|
+
* Transport selection is driven by `MCP_TRANSPORT=http`. The HTTP server uses the
|
|
9
|
+
* MCP Streamable HTTP spec with per-session transports: an `initialize` request
|
|
10
|
+
* mints a session id (returned via the `Mcp-Session-Id` header) which subsequent
|
|
11
|
+
* requests reuse. GET opens the SSE notification stream; DELETE terminates a session.
|
|
12
|
+
*/
|
|
13
|
+
import http from 'node:http';
|
|
14
|
+
import { randomUUID } from 'node:crypto';
|
|
15
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
16
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
17
|
+
import { createServer, isInstanceConfigured, SERVER_NAME } from './server.js';
|
|
18
|
+
import { getTools } from './tools/index.js';
|
|
19
|
+
import { logger } from './utils/logging.js';
|
|
20
|
+
/** Resolve HTTP transport configuration from environment variables. */
|
|
21
|
+
export function getHttpConfig() {
|
|
22
|
+
const splitList = (v) => {
|
|
23
|
+
if (!v)
|
|
24
|
+
return undefined;
|
|
25
|
+
const parts = v.split(',').map(s => s.trim()).filter(Boolean);
|
|
26
|
+
return parts.length ? parts : undefined;
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
port: Number(process.env.MCP_HTTP_PORT) || 3000,
|
|
30
|
+
// Bind to loopback by default; set MCP_HTTP_HOST=0.0.0.0 to expose externally.
|
|
31
|
+
host: process.env.MCP_HTTP_HOST || '127.0.0.1',
|
|
32
|
+
path: process.env.MCP_HTTP_PATH || '/mcp',
|
|
33
|
+
corsOrigin: process.env.MCP_HTTP_CORS_ORIGIN || '*',
|
|
34
|
+
allowedHosts: splitList(process.env.MCP_HTTP_ALLOWED_HOSTS),
|
|
35
|
+
allowedOrigins: splitList(process.env.MCP_HTTP_ALLOWED_ORIGINS),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Active transports keyed by session id (stateful mode). */
|
|
39
|
+
const transports = new Map();
|
|
40
|
+
/** Number of live sessions — exported for observability/tests. */
|
|
41
|
+
export function activeSessionCount() {
|
|
42
|
+
return transports.size;
|
|
43
|
+
}
|
|
44
|
+
/** Close and forget every active session (used on shutdown / in tests). */
|
|
45
|
+
export function closeAllSessions() {
|
|
46
|
+
for (const transport of transports.values()) {
|
|
47
|
+
void transport.close();
|
|
48
|
+
}
|
|
49
|
+
transports.clear();
|
|
50
|
+
}
|
|
51
|
+
/** Build a minimal JSON-RPC error payload. */
|
|
52
|
+
export function jsonRpcError(code, message, id = null) {
|
|
53
|
+
return JSON.stringify({ jsonrpc: '2.0', error: { code, message }, id });
|
|
54
|
+
}
|
|
55
|
+
/** Apply permissive CORS headers so browser clients can connect. */
|
|
56
|
+
function applyCors(res, cfg) {
|
|
57
|
+
res.setHeader('Access-Control-Allow-Origin', cfg.corsOrigin);
|
|
58
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
59
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID');
|
|
60
|
+
// Browsers cannot read the session id unless it is explicitly exposed.
|
|
61
|
+
res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
|
|
62
|
+
}
|
|
63
|
+
/** Read and JSON-parse the request body. Returns undefined for an empty body. */
|
|
64
|
+
export async function readJsonBody(req) {
|
|
65
|
+
const chunks = [];
|
|
66
|
+
for await (const chunk of req) {
|
|
67
|
+
chunks.push(chunk);
|
|
68
|
+
}
|
|
69
|
+
const raw = Buffer.concat(chunks).toString('utf8');
|
|
70
|
+
if (!raw.trim())
|
|
71
|
+
return undefined;
|
|
72
|
+
return JSON.parse(raw);
|
|
73
|
+
}
|
|
74
|
+
/** Create a new per-session transport wired to a fresh MCP server. */
|
|
75
|
+
async function createSessionTransport(cfg) {
|
|
76
|
+
const transport = new StreamableHTTPServerTransport({
|
|
77
|
+
sessionIdGenerator: () => randomUUID(),
|
|
78
|
+
onsessioninitialized: (sessionId) => {
|
|
79
|
+
transports.set(sessionId, transport);
|
|
80
|
+
logger.info(`HTTP session opened: ${sessionId} [${transports.size} active]`);
|
|
81
|
+
},
|
|
82
|
+
...(cfg.allowedHosts || cfg.allowedOrigins
|
|
83
|
+
? {
|
|
84
|
+
enableDnsRebindingProtection: true,
|
|
85
|
+
allowedHosts: cfg.allowedHosts,
|
|
86
|
+
allowedOrigins: cfg.allowedOrigins,
|
|
87
|
+
}
|
|
88
|
+
: {}),
|
|
89
|
+
});
|
|
90
|
+
transport.onclose = () => {
|
|
91
|
+
const sid = transport.sessionId;
|
|
92
|
+
if (sid && transports.delete(sid)) {
|
|
93
|
+
logger.info(`HTTP session closed: ${sid} [${transports.size} active]`);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const server = createServer();
|
|
97
|
+
await server.connect(transport);
|
|
98
|
+
return transport;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Handle a single MCP HTTP request. Exported for unit testing — the listener
|
|
102
|
+
* passed to `http.createServer` is a thin wrapper around this.
|
|
103
|
+
*/
|
|
104
|
+
export async function handleHttpRequest(req, res, cfg = getHttpConfig()) {
|
|
105
|
+
applyCors(res, cfg);
|
|
106
|
+
if (req.method === 'OPTIONS') {
|
|
107
|
+
res.writeHead(204).end();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
111
|
+
// Lightweight health probe for load balancers / container orchestration.
|
|
112
|
+
if (req.method === 'GET' && url.pathname === '/health') {
|
|
113
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
114
|
+
res.end(JSON.stringify({ status: 'ok', server: SERVER_NAME, tools: getTools().length, sessions: transports.size }));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (url.pathname !== cfg.path) {
|
|
118
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
119
|
+
res.end(jsonRpcError(-32601, `Not found: ${url.pathname}`));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
123
|
+
try {
|
|
124
|
+
if (req.method === 'POST') {
|
|
125
|
+
const body = await readJsonBody(req);
|
|
126
|
+
let transport;
|
|
127
|
+
if (sessionId && transports.has(sessionId)) {
|
|
128
|
+
transport = transports.get(sessionId);
|
|
129
|
+
}
|
|
130
|
+
else if (!sessionId && isInitializeRequest(body)) {
|
|
131
|
+
transport = await createSessionTransport(cfg);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
135
|
+
res.end(jsonRpcError(-32000, 'Bad Request: no valid session id (initialize first)'));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
await transport.handleRequest(req, res, body);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (req.method === 'GET' || req.method === 'DELETE') {
|
|
142
|
+
if (!sessionId || !transports.has(sessionId)) {
|
|
143
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
144
|
+
res.end(jsonRpcError(-32000, 'Bad Request: unknown or missing session id'));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
await transports.get(sessionId).handleRequest(req, res);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
151
|
+
res.end(jsonRpcError(-32601, `Method not allowed: ${req.method}`));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
logger.error('HTTP request handling failed', error);
|
|
155
|
+
if (!res.headersSent) {
|
|
156
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
157
|
+
res.end(jsonRpcError(-32603, 'Internal server error'));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** Build the Node HTTP server (without listening). Exported for tests. */
|
|
162
|
+
export function createHttpServer(cfg = getHttpConfig()) {
|
|
163
|
+
return http.createServer((req, res) => {
|
|
164
|
+
void handleHttpRequest(req, res, cfg);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/** Start the Streamable HTTP server, listening on the configured host/port. */
|
|
168
|
+
export async function startHttpServer() {
|
|
169
|
+
if (!isInstanceConfigured()) {
|
|
170
|
+
logger.error('No ServiceNow instance configured. Set SERVICENOW_INSTANCE_URL or SN_INSTANCES_CONFIG.');
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
const cfg = getHttpConfig();
|
|
174
|
+
const server = createHttpServer(cfg);
|
|
175
|
+
await new Promise((resolve) => server.listen(cfg.port, cfg.host, resolve));
|
|
176
|
+
logger.info(`${SERVER_NAME} server running on http://${cfg.host}:${cfg.port}${cfg.path} ` +
|
|
177
|
+
`[${getTools().length} tools]`);
|
|
178
|
+
const shutdown = () => {
|
|
179
|
+
logger.info('Shutting down HTTP server...');
|
|
180
|
+
closeAllSessions();
|
|
181
|
+
server.close(() => process.exit(0));
|
|
182
|
+
};
|
|
183
|
+
process.on('SIGINT', shutdown);
|
|
184
|
+
process.on('SIGTERM', shutdown);
|
|
185
|
+
return server;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=server-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-http.js","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
export declare const SERVER_NAME = "servicenow-mcp";
|
|
4
|
+
export declare const SERVER_VERSION = "1.0.2";
|
|
5
|
+
/** True if at least one ServiceNow instance is configured via any supported method. */
|
|
6
|
+
export declare function isInstanceConfigured(): boolean;
|
|
7
|
+
export declare function handleListTools(): Promise<{
|
|
8
|
+
tools: Record<string, any>[];
|
|
9
|
+
}>;
|
|
10
|
+
export declare function handleCallTool(request: {
|
|
11
|
+
params: {
|
|
12
|
+
name: string;
|
|
13
|
+
arguments?: Record<string, unknown>;
|
|
14
|
+
};
|
|
15
|
+
}): Promise<{
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
isError?: undefined;
|
|
21
|
+
} | {
|
|
22
|
+
content: {
|
|
23
|
+
type: "text";
|
|
24
|
+
text: string;
|
|
25
|
+
}[];
|
|
26
|
+
isError: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function handleListResources(): Promise<{
|
|
29
|
+
resources: import("./resources/index.js").McpResource[];
|
|
30
|
+
}>;
|
|
31
|
+
export declare function handleReadResource(request: {
|
|
32
|
+
params: {
|
|
33
|
+
uri: string;
|
|
34
|
+
};
|
|
35
|
+
}): Promise<{
|
|
36
|
+
contents: {
|
|
37
|
+
uri: string;
|
|
38
|
+
mimeType: string;
|
|
39
|
+
text: string;
|
|
40
|
+
}[];
|
|
41
|
+
}>;
|
|
42
|
+
export declare function handleListPrompts(): Promise<{
|
|
43
|
+
prompts: import("./prompts/index.js").McpPrompt[];
|
|
44
|
+
}>;
|
|
45
|
+
export declare function handleGetPrompt(request: {
|
|
46
|
+
params: {
|
|
47
|
+
name: string;
|
|
48
|
+
arguments?: Record<string, string>;
|
|
49
|
+
};
|
|
50
|
+
}): Promise<any>;
|
|
51
|
+
/** Build the MCP server with all request handlers registered. */
|
|
52
|
+
export declare function createServer(): Server;
|
|
53
|
+
export declare function main(): Promise<void>;
|
|
54
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAoBnE,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAC5C,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,uFAAuF;AACvF,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAID,wBAAsB,eAAe;;GAEpC;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC/D;;;;;;;;;;;;GAiDA;AAED,wBAAsB,mBAAmB;;GAExC;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;;;;;;GAmB5E;AAED,wBAAsB,iBAAiB;;GAEtC;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CAC9D,GAAG,OAAO,CAAC,GAAG,CAAC,CASf;AAID,iEAAiE;AACjE,wBAAgB,YAAY,IAAI,MAAM,CAuBrC;AAED,wBAAsB,IAAI,kBAiBzB"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { CallToolRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import dotenv from 'dotenv';
|
|
7
|
+
import { instanceManager } from './servicenow/instances.js';
|
|
8
|
+
import { getTools, executeTool } from './tools/index.js';
|
|
9
|
+
import { getResources, readResource } from './resources/index.js';
|
|
10
|
+
import { getPrompts, resolvePrompt } from './prompts/index.js';
|
|
11
|
+
import { logger } from './utils/logging.js';
|
|
12
|
+
import { ServiceNowError } from './utils/errors.js';
|
|
13
|
+
dotenv.config();
|
|
14
|
+
export const SERVER_NAME = 'servicenow-mcp';
|
|
15
|
+
export const SERVER_VERSION = '1.0.2';
|
|
16
|
+
/** True if at least one ServiceNow instance is configured via any supported method. */
|
|
17
|
+
export function isInstanceConfigured() {
|
|
18
|
+
const hasLegacy = !!process.env.SERVICENOW_INSTANCE_URL;
|
|
19
|
+
const hasMulti = Object.keys(process.env).some(k => /^SN_INSTANCE_[A-Z0-9_]+_URL$/.test(k));
|
|
20
|
+
const hasConfig = !!process.env.SN_INSTANCES_CONFIG;
|
|
21
|
+
return hasLegacy || hasMulti || hasConfig;
|
|
22
|
+
}
|
|
23
|
+
// ─── Request handlers (exported for unit testing) ─────────────────────────────
|
|
24
|
+
export async function handleListTools() {
|
|
25
|
+
return { tools: getTools() };
|
|
26
|
+
}
|
|
27
|
+
export async function handleCallTool(request) {
|
|
28
|
+
const { name, arguments: args } = request.params;
|
|
29
|
+
logger.info(`Tool called: ${name}`);
|
|
30
|
+
try {
|
|
31
|
+
const known = getTools().some(t => t.name === name);
|
|
32
|
+
if (!known) {
|
|
33
|
+
throw new ServiceNowError(`Unknown tool: ${name}`, 'UNKNOWN_TOOL');
|
|
34
|
+
}
|
|
35
|
+
const instanceName = args?.['instance'];
|
|
36
|
+
const client = instanceManager.getClient(instanceName);
|
|
37
|
+
const result = await executeTool(client, name, args || {});
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
logger.error(`Tool execution error: ${name}`, error);
|
|
49
|
+
if (error instanceof ServiceNowError) {
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: 'text',
|
|
54
|
+
text: `Error: ${error.message} (Code: ${error.code})`,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
isError: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
{
|
|
63
|
+
type: 'text',
|
|
64
|
+
text: `Error executing tool: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
isError: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function handleListResources() {
|
|
72
|
+
return { resources: getResources() };
|
|
73
|
+
}
|
|
74
|
+
export async function handleReadResource(request) {
|
|
75
|
+
const { uri } = request.params;
|
|
76
|
+
try {
|
|
77
|
+
const client = instanceManager.getClient();
|
|
78
|
+
const content = await readResource(client, uri);
|
|
79
|
+
return {
|
|
80
|
+
contents: [
|
|
81
|
+
{
|
|
82
|
+
uri,
|
|
83
|
+
mimeType: 'application/json',
|
|
84
|
+
text: JSON.stringify(content, null, 2),
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.error(`Resource read error: ${uri}`, error);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export async function handleListPrompts() {
|
|
95
|
+
return { prompts: getPrompts() };
|
|
96
|
+
}
|
|
97
|
+
export async function handleGetPrompt(request) {
|
|
98
|
+
const { name, arguments: args } = request.params;
|
|
99
|
+
const result = resolvePrompt(name, args);
|
|
100
|
+
if (!result) {
|
|
101
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
// ─── Server wiring ────────────────────────────────────────────────────────────
|
|
106
|
+
/** Build the MCP server with all request handlers registered. */
|
|
107
|
+
export function createServer() {
|
|
108
|
+
const server = new Server({
|
|
109
|
+
name: SERVER_NAME,
|
|
110
|
+
version: SERVER_VERSION,
|
|
111
|
+
}, {
|
|
112
|
+
capabilities: {
|
|
113
|
+
tools: {},
|
|
114
|
+
resources: {},
|
|
115
|
+
prompts: {},
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
server.setRequestHandler(ListToolsRequestSchema, handleListTools);
|
|
119
|
+
server.setRequestHandler(CallToolRequestSchema, handleCallTool);
|
|
120
|
+
server.setRequestHandler(ListResourcesRequestSchema, handleListResources);
|
|
121
|
+
server.setRequestHandler(ReadResourceRequestSchema, handleReadResource);
|
|
122
|
+
server.setRequestHandler(ListPromptsRequestSchema, handleListPrompts);
|
|
123
|
+
server.setRequestHandler(GetPromptRequestSchema, handleGetPrompt);
|
|
124
|
+
return server;
|
|
125
|
+
}
|
|
126
|
+
export async function main() {
|
|
127
|
+
// MCP_TRANSPORT=http switches to the Streamable HTTP transport (see server-http.ts).
|
|
128
|
+
if ((process.env.MCP_TRANSPORT || 'stdio').toLowerCase() === 'http') {
|
|
129
|
+
const { startHttpServer } = await import('./server-http.js');
|
|
130
|
+
await startHttpServer();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!isInstanceConfigured()) {
|
|
134
|
+
logger.error('No ServiceNow instance configured. Set SERVICENOW_INSTANCE_URL or SN_INSTANCES_CONFIG.');
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
const server = createServer();
|
|
138
|
+
const transport = new StdioServerTransport();
|
|
139
|
+
await server.connect(transport);
|
|
140
|
+
logger.info(`${SERVER_NAME} server running on stdio [${getTools().length} tools]`);
|
|
141
|
+
}
|
|
142
|
+
// Run only when executed directly (not when imported by tests).
|
|
143
|
+
const isDirectRun = !!process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];
|
|
144
|
+
if (isDirectRun) {
|
|
145
|
+
main().catch((error) => {
|
|
146
|
+
logger.error('Server startup failed', error);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { ServiceNowConfig, QueryRecordsParams, QueryRecordsResponse, ServiceNowRecord } from './types.js';
|
|
2
|
+
export declare class ServiceNowClient {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private authMode;
|
|
5
|
+
private oauthConfig;
|
|
6
|
+
private maxRetries;
|
|
7
|
+
private retryDelayMs;
|
|
8
|
+
private requestTimeoutMs;
|
|
9
|
+
/** For impersonation mode: user sys_id to pass in X-Sn-Impersonate */
|
|
10
|
+
private impersonateUserSysId?;
|
|
11
|
+
/** For per-user mode: pre-loaded token overrides service-account auth */
|
|
12
|
+
private perUserBearerToken?;
|
|
13
|
+
private accessToken?;
|
|
14
|
+
private tokenExpiry?;
|
|
15
|
+
constructor(config: ServiceNowConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Return a copy of this client configured to run as a specific user.
|
|
18
|
+
* Used for per-request user context switching without mutating the shared client.
|
|
19
|
+
*/
|
|
20
|
+
withUser(options: {
|
|
21
|
+
sysId?: string;
|
|
22
|
+
bearerToken?: string;
|
|
23
|
+
}): ServiceNowClient;
|
|
24
|
+
/**
|
|
25
|
+
* Authenticate with ServiceNow using OAuth.
|
|
26
|
+
* Automatically selects grant type:
|
|
27
|
+
* - client_credentials: when only clientId + clientSecret are configured (recommended)
|
|
28
|
+
* - password: when username + password are also provided
|
|
29
|
+
*/
|
|
30
|
+
private authenticate;
|
|
31
|
+
/**
|
|
32
|
+
* Get authorization header for requests.
|
|
33
|
+
* Per-user mode returns the user's own Bearer token directly.
|
|
34
|
+
* Impersonation and service-account modes use the configured service account.
|
|
35
|
+
*/
|
|
36
|
+
private getAuthHeader;
|
|
37
|
+
/**
|
|
38
|
+
* Returns the X-Sn-Impersonate header value if impersonation mode is active.
|
|
39
|
+
* ServiceNow executes the request in the context of the named user's roles/ACLs.
|
|
40
|
+
*/
|
|
41
|
+
private getImpersonateHeader;
|
|
42
|
+
/**
|
|
43
|
+
* Make HTTP request with retry logic
|
|
44
|
+
*/
|
|
45
|
+
private request;
|
|
46
|
+
/**
|
|
47
|
+
* Query records from a ServiceNow table
|
|
48
|
+
*/
|
|
49
|
+
queryRecords(params: QueryRecordsParams): Promise<QueryRecordsResponse>;
|
|
50
|
+
/**
|
|
51
|
+
* Get table schema/structure
|
|
52
|
+
*/
|
|
53
|
+
getTableSchema(tableName: string): Promise<any>;
|
|
54
|
+
/**
|
|
55
|
+
* Get a single record by sys_id
|
|
56
|
+
*/
|
|
57
|
+
getRecord(table: string, sysId: string, fields?: string): Promise<ServiceNowRecord>;
|
|
58
|
+
/**
|
|
59
|
+
* Get user details by email or username
|
|
60
|
+
*/
|
|
61
|
+
getUser(userIdentifier: string): Promise<ServiceNowRecord>;
|
|
62
|
+
/**
|
|
63
|
+
* Get group details by name or sys_id
|
|
64
|
+
*/
|
|
65
|
+
getGroup(groupIdentifier: string): Promise<ServiceNowRecord>;
|
|
66
|
+
/**
|
|
67
|
+
* Search CMDB configuration items
|
|
68
|
+
*/
|
|
69
|
+
searchCmdbCi(query?: string, limit?: number): Promise<QueryRecordsResponse>;
|
|
70
|
+
/**
|
|
71
|
+
* Get a specific CMDB configuration item
|
|
72
|
+
*/
|
|
73
|
+
getCmdbCi(ciSysId: string, fields?: string): Promise<ServiceNowRecord>;
|
|
74
|
+
/**
|
|
75
|
+
* List relationships for a CI
|
|
76
|
+
*/
|
|
77
|
+
listRelationships(ciSysId: string): Promise<any>;
|
|
78
|
+
/**
|
|
79
|
+
* List discovery schedules
|
|
80
|
+
*/
|
|
81
|
+
listDiscoverySchedules(activeOnly?: boolean): Promise<any>;
|
|
82
|
+
/**
|
|
83
|
+
* List MID servers
|
|
84
|
+
*/
|
|
85
|
+
listMidServers(activeOnly?: boolean): Promise<any>;
|
|
86
|
+
/**
|
|
87
|
+
* List active events
|
|
88
|
+
*/
|
|
89
|
+
listActiveEvents(query?: string, limit?: number): Promise<QueryRecordsResponse>;
|
|
90
|
+
/**
|
|
91
|
+
* Get CMDB health dashboard metrics
|
|
92
|
+
*/
|
|
93
|
+
cmdbHealthDashboard(): Promise<any>;
|
|
94
|
+
/**
|
|
95
|
+
* Get service mapping summary
|
|
96
|
+
*/
|
|
97
|
+
serviceMappingSummary(serviceSysId: string): Promise<any>;
|
|
98
|
+
/**
|
|
99
|
+
* Create a change request
|
|
100
|
+
*/
|
|
101
|
+
createChangeRequest(params: any): Promise<ServiceNowRecord>;
|
|
102
|
+
/**
|
|
103
|
+
* Create a record in any ServiceNow table
|
|
104
|
+
*/
|
|
105
|
+
createRecord(table: string, data: Record<string, any>): Promise<ServiceNowRecord>;
|
|
106
|
+
/**
|
|
107
|
+
* Update a record in any ServiceNow table
|
|
108
|
+
*/
|
|
109
|
+
updateRecord(table: string, sysId: string, data: Record<string, any>): Promise<ServiceNowRecord>;
|
|
110
|
+
/**
|
|
111
|
+
* Delete a record from any ServiceNow table
|
|
112
|
+
*/
|
|
113
|
+
deleteRecord(table: string, sysId: string): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Call Now Assist / Generative AI endpoints (latest release)
|
|
116
|
+
*/
|
|
117
|
+
callNowAssist(endpoint: string, payload: Record<string, any>): Promise<any>;
|
|
118
|
+
callApiGet(endpoint: string): Promise<any>;
|
|
119
|
+
/**
|
|
120
|
+
* Run aggregate/stats query on a table (ServiceNow Reporting API)
|
|
121
|
+
*/
|
|
122
|
+
runAggregateQuery(table: string, groupBy: string, _aggregate?: string, query?: string): Promise<any>;
|
|
123
|
+
/**
|
|
124
|
+
* Natural language search (simplified implementation)
|
|
125
|
+
*/
|
|
126
|
+
naturalLanguageSearch(query: string, limit?: number): Promise<any>;
|
|
127
|
+
/**
|
|
128
|
+
* Upload a file attachment to a ServiceNow record via the Attachment API.
|
|
129
|
+
* Accepts base64-encoded content and uploads it as a multipart form.
|
|
130
|
+
*/
|
|
131
|
+
uploadAttachment(table: string, recordSysId: string, fileName: string, contentType: string, contentBase64: string): Promise<any>;
|
|
132
|
+
/**
|
|
133
|
+
* Natural language update (simplified implementation)
|
|
134
|
+
*/
|
|
135
|
+
naturalLanguageUpdate(_instruction: string, _table: string): Promise<any>;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/servicenow/client.ts"],"names":[],"mappings":"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"}
|