@tedorigawa001/servicenow-mcp 1.0.7 → 1.1.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.
- package/README.md +9 -4
- package/dist/cli/writers/index.d.ts.map +1 -1
- package/dist/cli/writers/index.js +7 -6
- package/dist/cli/writers/index.js.map +1 -1
- package/dist/server-http.d.ts +7 -1
- package/dist/server-http.d.ts.map +1 -1
- package/dist/server-http.js +68 -5
- package/dist/server-http.js.map +1 -1
- package/dist/server.d.ts +3 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +15 -11
- package/dist/server.js.map +1 -1
- package/dist/servicenow/client.d.ts.map +1 -1
- package/dist/servicenow/client.js +19 -1
- package/dist/servicenow/client.js.map +1 -1
- package/dist/servicenow/instances.d.ts +24 -1
- package/dist/servicenow/instances.d.ts.map +1 -1
- package/dist/servicenow/instances.js +43 -2
- package/dist/servicenow/instances.js.map +1 -1
- package/dist/tools/core.d.ts.map +1 -1
- package/dist/tools/core.js +5 -27
- package/dist/tools/core.js.map +1 -1
- package/dist/tools/deployment.d.ts.map +1 -1
- package/dist/tools/deployment.js +15 -3
- package/dist/tools/deployment.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +25 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/integration.d.ts +4 -1
- package/dist/tools/integration.d.ts.map +1 -1
- package/dist/tools/integration.js +12 -3
- package/dist/tools/integration.js.map +1 -1
- package/dist/tools/script.d.ts.map +1 -1
- package/dist/tools/script.js +32 -2
- package/dist/tools/script.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -480,8 +480,8 @@ claude mcp add servicenow node /path/to/servicenow-mcp/dist/server.js \
|
|
|
480
480
|
CI/CD からの呼び出しが必要な場合は **Streamable HTTP** トランスポートに切り替えられます。
|
|
481
481
|
|
|
482
482
|
```bash
|
|
483
|
-
# HTTP
|
|
484
|
-
MCP_TRANSPORT=http node dist/server.js
|
|
483
|
+
# HTTP トランスポートで起動(トークンはランダムな十分長い値を使用)
|
|
484
|
+
MCP_TRANSPORT=http MCP_HTTP_AUTH_TOKEN=replace-with-a-random-secret node dist/server.js
|
|
485
485
|
# → http://127.0.0.1:3000/mcp で待ち受け、GET /health でヘルスチェック
|
|
486
486
|
```
|
|
487
487
|
|
|
@@ -491,9 +491,13 @@ MCP_TRANSPORT=http node dist/server.js
|
|
|
491
491
|
| `MCP_HTTP_PORT` | `3000` | 待ち受けポート |
|
|
492
492
|
| `MCP_HTTP_HOST` | `127.0.0.1` | バインドアドレス(外部公開時は `0.0.0.0`)|
|
|
493
493
|
| `MCP_HTTP_PATH` | `/mcp` | MCP エンドポイントのパス |
|
|
494
|
+
| `MCP_HTTP_AUTH_TOKEN` | (必須) | MCP エンドポイント用 Bearer トークン。未設定時は `/mcp` への要求をすべて401で拒否 |
|
|
494
495
|
| `MCP_HTTP_CORS_ORIGIN` | `*` | CORS 許可オリジン |
|
|
495
496
|
| `MCP_HTTP_ALLOWED_HOSTS` | (なし) | カンマ区切り。指定すると DNS リバインディング保護を有効化 |
|
|
496
497
|
| `MCP_HTTP_ALLOWED_ORIGINS` | (なし) | カンマ区切り。Origin ヘッダの許可リスト |
|
|
498
|
+
| `MCP_HTTP_MAX_BODY_BYTES` | `1048576` | JSON-RPC 要求本文の最大バイト数 |
|
|
499
|
+
| `MCP_HTTP_MAX_SESSIONS` | `100` | 同時 HTTP MCP セッションの上限 |
|
|
500
|
+
| `MCP_HTTP_SESSION_IDLE_TIMEOUT_MS` | `1800000` | 未使用セッションを閉じるまでのミリ秒 |
|
|
497
501
|
|
|
498
502
|
セッションは MCP 仕様に従い、`initialize` 応答の `Mcp-Session-Id` ヘッダで払い出され、
|
|
499
503
|
以降のリクエストで再利用します(`DELETE /mcp` でセッション終了)。HTTP 接続するクライアント設定例:
|
|
@@ -502,13 +506,14 @@ MCP_TRANSPORT=http node dist/server.js
|
|
|
502
506
|
{
|
|
503
507
|
"mcpServers": {
|
|
504
508
|
"servicenow": {
|
|
505
|
-
|
|
509
|
+
"url": "http://localhost:3000/mcp",
|
|
510
|
+
"headers": { "Authorization": "Bearer replace-with-a-random-secret" }
|
|
506
511
|
}
|
|
507
512
|
}
|
|
508
513
|
}
|
|
509
514
|
```
|
|
510
515
|
|
|
511
|
-
> **セキュリティ注意**:
|
|
516
|
+
> **セキュリティ注意**: HTTP MCP は `MCP_HTTP_AUTH_TOKEN` を必須とします。デフォルトは loopback(`127.0.0.1`)バインドです。`MCP_HTTP_HOST=0.0.0.0`
|
|
512
517
|
> で外部公開する場合は、リバースプロキシでの TLS 終端・認証、および `MCP_HTTP_ALLOWED_HOSTS` /
|
|
513
518
|
> `MCP_HTTP_ALLOWED_ORIGINS` による保護を推奨します。
|
|
514
519
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/writers/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/writers/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AA0LD,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,WAAW,CAa/F"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
5
5
|
import { dirname, join } from 'path';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
|
-
import {
|
|
7
|
+
import { execFileSync } from 'child_process';
|
|
8
8
|
/** Build the env block that goes into any JSON-based MCP config. */
|
|
9
9
|
function buildEnvBlock(instance) {
|
|
10
10
|
const env = {
|
|
@@ -159,12 +159,13 @@ function writeVsCodeJson(client, instance) {
|
|
|
159
159
|
/** Run `claude mcp add` for Claude Code. */
|
|
160
160
|
function writeClaudeCode(_client, instance) {
|
|
161
161
|
const env = buildEnvBlock(instance);
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
.
|
|
165
|
-
|
|
162
|
+
const args = [
|
|
163
|
+
'mcp', 'add', 'servicenow-mcp', 'node', serverPath(),
|
|
164
|
+
...Object.entries(env).flatMap(([key, value]) => ['--env', `${key}=${value}`]),
|
|
165
|
+
];
|
|
166
166
|
try {
|
|
167
|
-
|
|
167
|
+
const command = process.platform === 'win32' ? 'claude.cmd' : 'claude';
|
|
168
|
+
execFileSync(command, args, { stdio: 'pipe' });
|
|
168
169
|
return { success: true, message: 'Added via `claude mcp add servicenow-mcp`' };
|
|
169
170
|
}
|
|
170
171
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/writers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/writers/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server-http.d.ts
CHANGED
|
@@ -18,6 +18,10 @@ export interface HttpConfig {
|
|
|
18
18
|
corsOrigin: string;
|
|
19
19
|
allowedHosts?: string[];
|
|
20
20
|
allowedOrigins?: string[];
|
|
21
|
+
authToken?: string;
|
|
22
|
+
maxBodyBytes: number;
|
|
23
|
+
maxSessions: number;
|
|
24
|
+
sessionIdleTimeoutMs: number;
|
|
21
25
|
}
|
|
22
26
|
/** Resolve HTTP transport configuration from environment variables. */
|
|
23
27
|
export declare function getHttpConfig(): HttpConfig;
|
|
@@ -28,7 +32,9 @@ export declare function closeAllSessions(): void;
|
|
|
28
32
|
/** Build a minimal JSON-RPC error payload. */
|
|
29
33
|
export declare function jsonRpcError(code: number, message: string, id?: string | number | null): string;
|
|
30
34
|
/** Read and JSON-parse the request body. Returns undefined for an empty body. */
|
|
31
|
-
export declare
|
|
35
|
+
export declare class RequestBodyTooLargeError extends Error {
|
|
36
|
+
}
|
|
37
|
+
export declare function readJsonBody(req: http.IncomingMessage, maxBodyBytes?: number): Promise<unknown>;
|
|
32
38
|
/**
|
|
33
39
|
* Handle a single MCP HTTP request. Exported for unit testing — the listener
|
|
34
40
|
* passed to `http.createServer` is a thin wrapper around this.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-http.d.ts","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"server-http.d.ts","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,uEAAuE;AACvE,wBAAgB,aAAa,IAAI,UAAU,CAmB1C;AAMD,kEAAkE;AAClE,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,IAAI,IAAI,CAOvC;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAE,MAAM,GAAG,MAAM,GAAG,IAAW,GAAG,MAAM,CAErG;AAwBD,iFAAiF;AACjF,qBAAa,wBAAyB,SAAQ,KAAK;CAAG;AAEtD,wBAAsB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,SAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAYxG;AAgDD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,GAAE,UAA4B,GAChC,OAAO,CAAC,IAAI,CAAC,CAkFf;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,UAA4B,GAAG,IAAI,CAAC,MAAM,CAI/E;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAwB5D"}
|
package/dist/server-http.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* requests reuse. GET opens the SSE notification stream; DELETE terminates a session.
|
|
12
12
|
*/
|
|
13
13
|
import http from 'node:http';
|
|
14
|
-
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { randomUUID, timingSafeEqual } from 'node:crypto';
|
|
15
15
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
16
16
|
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
17
17
|
import { createServer, isInstanceConfigured, SERVER_NAME } from './server.js';
|
|
@@ -33,10 +33,15 @@ export function getHttpConfig() {
|
|
|
33
33
|
corsOrigin: process.env.MCP_HTTP_CORS_ORIGIN || '*',
|
|
34
34
|
allowedHosts: splitList(process.env.MCP_HTTP_ALLOWED_HOSTS),
|
|
35
35
|
allowedOrigins: splitList(process.env.MCP_HTTP_ALLOWED_ORIGINS),
|
|
36
|
+
authToken: process.env.MCP_HTTP_AUTH_TOKEN,
|
|
37
|
+
maxBodyBytes: Number(process.env.MCP_HTTP_MAX_BODY_BYTES) || 1_048_576,
|
|
38
|
+
maxSessions: Number(process.env.MCP_HTTP_MAX_SESSIONS) || 100,
|
|
39
|
+
sessionIdleTimeoutMs: Number(process.env.MCP_HTTP_SESSION_IDLE_TIMEOUT_MS) || 1_800_000,
|
|
36
40
|
};
|
|
37
41
|
}
|
|
38
42
|
/** Active transports keyed by session id (stateful mode). */
|
|
39
43
|
const transports = new Map();
|
|
44
|
+
const sessionTimers = new Map();
|
|
40
45
|
/** Number of live sessions — exported for observability/tests. */
|
|
41
46
|
export function activeSessionCount() {
|
|
42
47
|
return transports.size;
|
|
@@ -47,6 +52,9 @@ export function closeAllSessions() {
|
|
|
47
52
|
void transport.close();
|
|
48
53
|
}
|
|
49
54
|
transports.clear();
|
|
55
|
+
for (const timer of sessionTimers.values())
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
sessionTimers.clear();
|
|
50
58
|
}
|
|
51
59
|
/** Build a minimal JSON-RPC error payload. */
|
|
52
60
|
export function jsonRpcError(code, message, id = null) {
|
|
@@ -60,11 +68,29 @@ function applyCors(res, cfg) {
|
|
|
60
68
|
// Browsers cannot read the session id unless it is explicitly exposed.
|
|
61
69
|
res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
|
|
62
70
|
}
|
|
71
|
+
/** Require an explicit bearer token before accepting an MCP HTTP request. */
|
|
72
|
+
function isAuthorized(req, cfg) {
|
|
73
|
+
if (!cfg.authToken)
|
|
74
|
+
return false;
|
|
75
|
+
const authorization = req.headers.authorization;
|
|
76
|
+
if (!authorization?.startsWith('Bearer '))
|
|
77
|
+
return false;
|
|
78
|
+
const supplied = Buffer.from(authorization.slice('Bearer '.length));
|
|
79
|
+
const expected = Buffer.from(cfg.authToken);
|
|
80
|
+
return supplied.length === expected.length && timingSafeEqual(supplied, expected);
|
|
81
|
+
}
|
|
63
82
|
/** Read and JSON-parse the request body. Returns undefined for an empty body. */
|
|
64
|
-
export
|
|
83
|
+
export class RequestBodyTooLargeError extends Error {
|
|
84
|
+
}
|
|
85
|
+
export async function readJsonBody(req, maxBodyBytes = 1_048_576) {
|
|
65
86
|
const chunks = [];
|
|
87
|
+
let size = 0;
|
|
66
88
|
for await (const chunk of req) {
|
|
67
|
-
|
|
89
|
+
const buffer = Buffer.from(chunk);
|
|
90
|
+
size += buffer.length;
|
|
91
|
+
if (size > maxBodyBytes)
|
|
92
|
+
throw new RequestBodyTooLargeError(`Request body exceeds ${maxBodyBytes} bytes.`);
|
|
93
|
+
chunks.push(buffer);
|
|
68
94
|
}
|
|
69
95
|
const raw = Buffer.concat(chunks).toString('utf8');
|
|
70
96
|
if (!raw.trim())
|
|
@@ -77,6 +103,7 @@ async function createSessionTransport(cfg) {
|
|
|
77
103
|
sessionIdGenerator: () => randomUUID(),
|
|
78
104
|
onsessioninitialized: (sessionId) => {
|
|
79
105
|
transports.set(sessionId, transport);
|
|
106
|
+
refreshSessionExpiry(sessionId, transport, cfg);
|
|
80
107
|
logger.info(`HTTP session opened: ${sessionId} [${transports.size} active]`);
|
|
81
108
|
},
|
|
82
109
|
...(cfg.allowedHosts || cfg.allowedOrigins
|
|
@@ -92,11 +119,28 @@ async function createSessionTransport(cfg) {
|
|
|
92
119
|
if (sid && transports.delete(sid)) {
|
|
93
120
|
logger.info(`HTTP session closed: ${sid} [${transports.size} active]`);
|
|
94
121
|
}
|
|
122
|
+
if (sid) {
|
|
123
|
+
const timer = sessionTimers.get(sid);
|
|
124
|
+
if (timer)
|
|
125
|
+
clearTimeout(timer);
|
|
126
|
+
sessionTimers.delete(sid);
|
|
127
|
+
}
|
|
95
128
|
};
|
|
96
129
|
const server = createServer();
|
|
97
130
|
await server.connect(transport);
|
|
98
131
|
return transport;
|
|
99
132
|
}
|
|
133
|
+
function refreshSessionExpiry(sessionId, transport, cfg) {
|
|
134
|
+
const existing = sessionTimers.get(sessionId);
|
|
135
|
+
if (existing)
|
|
136
|
+
clearTimeout(existing);
|
|
137
|
+
const timer = setTimeout(() => {
|
|
138
|
+
logger.info(`HTTP session expired: ${sessionId}`);
|
|
139
|
+
void transport.close();
|
|
140
|
+
}, cfg.sessionIdleTimeoutMs);
|
|
141
|
+
timer.unref();
|
|
142
|
+
sessionTimers.set(sessionId, timer);
|
|
143
|
+
}
|
|
100
144
|
/**
|
|
101
145
|
* Handle a single MCP HTTP request. Exported for unit testing — the listener
|
|
102
146
|
* passed to `http.createServer` is a thin wrapper around this.
|
|
@@ -119,15 +163,29 @@ export async function handleHttpRequest(req, res, cfg = getHttpConfig()) {
|
|
|
119
163
|
res.end(jsonRpcError(-32601, `Not found: ${url.pathname}`));
|
|
120
164
|
return;
|
|
121
165
|
}
|
|
166
|
+
if (!isAuthorized(req, cfg)) {
|
|
167
|
+
res.writeHead(401, {
|
|
168
|
+
'Content-Type': 'application/json',
|
|
169
|
+
'WWW-Authenticate': 'Bearer',
|
|
170
|
+
});
|
|
171
|
+
res.end(jsonRpcError(-32001, 'Unauthorized'));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
122
174
|
const sessionId = req.headers['mcp-session-id'];
|
|
123
175
|
try {
|
|
124
176
|
if (req.method === 'POST') {
|
|
125
|
-
const body = await readJsonBody(req);
|
|
177
|
+
const body = await readJsonBody(req, cfg.maxBodyBytes);
|
|
126
178
|
let transport;
|
|
127
179
|
if (sessionId && transports.has(sessionId)) {
|
|
128
180
|
transport = transports.get(sessionId);
|
|
181
|
+
refreshSessionExpiry(sessionId, transport, cfg);
|
|
129
182
|
}
|
|
130
183
|
else if (!sessionId && isInitializeRequest(body)) {
|
|
184
|
+
if (transports.size >= cfg.maxSessions) {
|
|
185
|
+
res.writeHead(429, { 'Content-Type': 'application/json' });
|
|
186
|
+
res.end(jsonRpcError(-32002, 'Too many active sessions'));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
131
189
|
transport = await createSessionTransport(cfg);
|
|
132
190
|
}
|
|
133
191
|
else {
|
|
@@ -144,6 +202,7 @@ export async function handleHttpRequest(req, res, cfg = getHttpConfig()) {
|
|
|
144
202
|
res.end(jsonRpcError(-32000, 'Bad Request: unknown or missing session id'));
|
|
145
203
|
return;
|
|
146
204
|
}
|
|
205
|
+
refreshSessionExpiry(sessionId, transports.get(sessionId), cfg);
|
|
147
206
|
await transports.get(sessionId).handleRequest(req, res);
|
|
148
207
|
return;
|
|
149
208
|
}
|
|
@@ -152,7 +211,11 @@ export async function handleHttpRequest(req, res, cfg = getHttpConfig()) {
|
|
|
152
211
|
}
|
|
153
212
|
catch (error) {
|
|
154
213
|
logger.error('HTTP request handling failed', error);
|
|
155
|
-
if (!res.headersSent) {
|
|
214
|
+
if (error instanceof RequestBodyTooLargeError && !res.headersSent) {
|
|
215
|
+
res.writeHead(413, { 'Content-Type': 'application/json' });
|
|
216
|
+
res.end(jsonRpcError(-32003, error.message));
|
|
217
|
+
}
|
|
218
|
+
else if (!res.headersSent) {
|
|
156
219
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
157
220
|
res.end(jsonRpcError(-32603, 'Internal server error'));
|
|
158
221
|
}
|
package/dist/server-http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-http.js","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server-http.js","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { type InstanceContext } from './servicenow/instances.js';
|
|
3
4
|
export declare const SERVER_NAME = "servicenow-mcp";
|
|
4
5
|
export declare const SERVER_VERSION: string;
|
|
5
6
|
/** True if at least one ServiceNow instance is configured via any supported method. */
|
|
@@ -12,7 +13,7 @@ export declare function handleCallTool(request: {
|
|
|
12
13
|
name: string;
|
|
13
14
|
arguments?: Record<string, unknown>;
|
|
14
15
|
};
|
|
15
|
-
}): Promise<{
|
|
16
|
+
}, instanceContext?: InstanceContext): Promise<{
|
|
16
17
|
content: {
|
|
17
18
|
type: "text";
|
|
18
19
|
text: string;
|
|
@@ -32,7 +33,7 @@ export declare function handleReadResource(request: {
|
|
|
32
33
|
params: {
|
|
33
34
|
uri: string;
|
|
34
35
|
};
|
|
35
|
-
}): Promise<{
|
|
36
|
+
}, instanceContext?: InstanceContext): Promise<{
|
|
36
37
|
contents: {
|
|
37
38
|
uri: string;
|
|
38
39
|
mimeType: string;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAWnE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AASlF,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAE5C,eAAO,MAAM,cAAc,QAEM,CAAC;AAElC,uFAAuF;AACvF,wBAAgB,oBAAoB,IAAI,OAAO,CAM9C;AAID,wBAAsB,eAAe;;GAEpC;AAID,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,EAAE,eAAe,GAAE,eAAwC;;;;;;;;;;;;GAiD3D;AAED,wBAAsB,mBAAmB;;GAExC;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAAE,eAAe,GAAE,eAAwC;;;;;;GAmBvI;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,CAwBrC;AAED,wBAAsB,IAAI,kBAiBzB"}
|
package/dist/server.js
CHANGED
|
@@ -17,16 +17,18 @@ export const SERVER_NAME = 'servicenow-mcp';
|
|
|
17
17
|
export const SERVER_VERSION = JSON.parse(readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8')).version;
|
|
18
18
|
/** True if at least one ServiceNow instance is configured via any supported method. */
|
|
19
19
|
export function isInstanceConfigured() {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
// InstanceManager owns all supported configuration sources, including the
|
|
21
|
+
// setup wizard's ~/.config/servicenow-mcp/instances.json store. Keeping the
|
|
22
|
+
// startup check on that same source of truth prevents valid wizard setups
|
|
23
|
+
// from being rejected when no environment variables are present.
|
|
24
|
+
return instanceManager.listNames().length > 0;
|
|
24
25
|
}
|
|
25
26
|
// ─── Request handlers (exported for unit testing) ─────────────────────────────
|
|
26
27
|
export async function handleListTools() {
|
|
27
28
|
return { tools: getTools() };
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
+
const defaultInstanceContext = instanceManager.createContext();
|
|
31
|
+
export async function handleCallTool(request, instanceContext = defaultInstanceContext) {
|
|
30
32
|
const { name, arguments: args } = request.params;
|
|
31
33
|
logger.info(`Tool called: ${name}`);
|
|
32
34
|
try {
|
|
@@ -35,8 +37,9 @@ export async function handleCallTool(request) {
|
|
|
35
37
|
throw new ServiceNowError(`Unknown tool: ${name}`, 'UNKNOWN_TOOL');
|
|
36
38
|
}
|
|
37
39
|
const instanceName = args?.['instance'];
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
+
const instanceTools = new Set(['switch_instance', 'list_instances', 'get_current_instance']);
|
|
41
|
+
const client = instanceTools.has(name) ? undefined : instanceContext.getClient(instanceName);
|
|
42
|
+
const result = await executeTool(client, name, args || {}, instanceContext);
|
|
40
43
|
return {
|
|
41
44
|
content: [
|
|
42
45
|
{
|
|
@@ -73,10 +76,10 @@ export async function handleCallTool(request) {
|
|
|
73
76
|
export async function handleListResources() {
|
|
74
77
|
return { resources: getResources() };
|
|
75
78
|
}
|
|
76
|
-
export async function handleReadResource(request) {
|
|
79
|
+
export async function handleReadResource(request, instanceContext = defaultInstanceContext) {
|
|
77
80
|
const { uri } = request.params;
|
|
78
81
|
try {
|
|
79
|
-
const client =
|
|
82
|
+
const client = instanceContext.getClient();
|
|
80
83
|
const content = await readResource(client, uri);
|
|
81
84
|
return {
|
|
82
85
|
contents: [
|
|
@@ -107,6 +110,7 @@ export async function handleGetPrompt(request) {
|
|
|
107
110
|
// ─── Server wiring ────────────────────────────────────────────────────────────
|
|
108
111
|
/** Build the MCP server with all request handlers registered. */
|
|
109
112
|
export function createServer() {
|
|
113
|
+
const instanceContext = instanceManager.createContext();
|
|
110
114
|
const server = new Server({
|
|
111
115
|
name: SERVER_NAME,
|
|
112
116
|
version: SERVER_VERSION,
|
|
@@ -118,9 +122,9 @@ export function createServer() {
|
|
|
118
122
|
},
|
|
119
123
|
});
|
|
120
124
|
server.setRequestHandler(ListToolsRequestSchema, handleListTools);
|
|
121
|
-
server.setRequestHandler(CallToolRequestSchema, handleCallTool);
|
|
125
|
+
server.setRequestHandler(CallToolRequestSchema, (request) => handleCallTool(request, instanceContext));
|
|
122
126
|
server.setRequestHandler(ListResourcesRequestSchema, handleListResources);
|
|
123
|
-
server.setRequestHandler(ReadResourceRequestSchema, handleReadResource);
|
|
127
|
+
server.setRequestHandler(ReadResourceRequestSchema, (request) => handleReadResource(request, instanceContext));
|
|
124
128
|
server.setRequestHandler(ListPromptsRequestSchema, handleListPrompts);
|
|
125
129
|
server.setRequestHandler(GetPromptRequestSchema, handleGetPrompt);
|
|
126
130
|
return server;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/servicenow/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EAGpB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAgEpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAS;IAEjC,sEAAsE;IACtE,OAAO,CAAC,oBAAoB,CAAC,CAAS;IACtC,yEAAyE;IACzE,OAAO,CAAC,kBAAkB,CAAC,CAAS;IAEpC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,MAAM,EAAE,gBAAgB;IAapC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB;IAc7E;;;;;OAKG;YACW,YAAY;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/servicenow/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EAGpB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAgEpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAS;IAEjC,sEAAsE;IACtE,OAAO,CAAC,oBAAoB,CAAC,CAAS;IACtC,yEAAyE;IACzE,OAAO,CAAC,kBAAkB,CAAC,CAAS;IAEpC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,MAAM,EAAE,gBAAgB;IAapC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB;IAc7E;;;;;OAKG;YACW,YAAY;IA8E1B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAqBrB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;YACW,OAAO;IAqGrB;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA6E7E;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyCrD;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4BzF;;OAEG;IACG,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgChE;;OAEG;IACG,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8BlE;;OAEG;IACG,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgCrF;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI5E;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA2BtD;;OAEG;IACG,sBAAsB,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IA0BvE;;OAEG;IACG,cAAc,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IA0B/D;;OAEG;IACG,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgCzF;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC;IAmDzC;;OAEG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAgC/D;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyBjE;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBvF;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBtG;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/D;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAsB3E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBhD;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsBnH;;OAEG;IACG,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAe5E;;;OAGG;IACG,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC;IAiDf;;;;OAIG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuCtD;;OAEG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAUhF"}
|
|
@@ -97,6 +97,15 @@ export class ServiceNowClient {
|
|
|
97
97
|
* - password: when username + password are also provided
|
|
98
98
|
*/
|
|
99
99
|
async authenticate() {
|
|
100
|
+
// Per-user requests must never silently obtain a service-account token.
|
|
101
|
+
// Validate at use time so configured instances can still be discovered and
|
|
102
|
+
// callers receive an error that identifies the unusable instance.
|
|
103
|
+
if (this.authMode === 'per-user') {
|
|
104
|
+
if (!this.perUserBearerToken) {
|
|
105
|
+
throw new ServiceNowError(`Per-user mode for ${this.baseUrl} requires a bound bearer token for the current user.`, 'AUTHENTICATION_FAILED');
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
100
109
|
// Check if we have a valid token
|
|
101
110
|
if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {
|
|
102
111
|
return;
|
|
@@ -153,7 +162,10 @@ export class ServiceNowClient {
|
|
|
153
162
|
*/
|
|
154
163
|
getAuthHeader() {
|
|
155
164
|
// Per-user: use the individual user's token (highest precedence)
|
|
156
|
-
if (this.authMode === 'per-user'
|
|
165
|
+
if (this.authMode === 'per-user') {
|
|
166
|
+
if (!this.perUserBearerToken) {
|
|
167
|
+
throw new ServiceNowError(`Per-user mode for ${this.baseUrl} requires a bound bearer token for the current user.`, 'AUTHENTICATION_FAILED');
|
|
168
|
+
}
|
|
157
169
|
return `Bearer ${this.perUserBearerToken}`;
|
|
158
170
|
}
|
|
159
171
|
if (!this.accessToken) {
|
|
@@ -441,6 +453,8 @@ export class ServiceNowClient {
|
|
|
441
453
|
* Search CMDB configuration items
|
|
442
454
|
*/
|
|
443
455
|
async searchCmdbCi(query, limit = 10) {
|
|
456
|
+
if (query)
|
|
457
|
+
validateQuery(query);
|
|
444
458
|
await this.authenticate();
|
|
445
459
|
const queryParams = new URLSearchParams();
|
|
446
460
|
if (query) {
|
|
@@ -540,6 +554,8 @@ export class ServiceNowClient {
|
|
|
540
554
|
* List active events
|
|
541
555
|
*/
|
|
542
556
|
async listActiveEvents(query, limit = 10) {
|
|
557
|
+
if (query)
|
|
558
|
+
validateQuery(query);
|
|
543
559
|
await this.authenticate();
|
|
544
560
|
const queryParams = new URLSearchParams();
|
|
545
561
|
if (query) {
|
|
@@ -763,6 +779,8 @@ export class ServiceNowClient {
|
|
|
763
779
|
await this.authenticate();
|
|
764
780
|
validateTableName(table);
|
|
765
781
|
validateOrderByField(groupBy);
|
|
782
|
+
if (query)
|
|
783
|
+
validateQuery(query);
|
|
766
784
|
const params = new URLSearchParams();
|
|
767
785
|
params.set('sysparm_group_by', groupBy);
|
|
768
786
|
if (query)
|