@slbdn/mcp-tester 1.2.0 → 1.4.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/CHANGELOG.md +108 -0
- package/README.md +160 -7
- package/dist/cli/index.js +382 -62
- package/dist/cli/index.js.map +1 -1
- package/dist/client/MCPClient.d.ts +187 -10
- package/dist/client/MCPClient.d.ts.map +1 -1
- package/dist/client/MCPClient.js +270 -50
- package/dist/client/MCPClient.js.map +1 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/validation.d.ts +52 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +326 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +8 -6
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { CreateMessageRequestParams, Tool, Resource, Prompt, CallToolResult, ReadResourceResult, GetPromptResult, CreateMessageResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
import { LogLevel } from '../utils/logger.js';
|
|
3
|
+
import { type TransportType } from '../utils/validation.js';
|
|
3
4
|
/**
|
|
4
|
-
* Configuration for starting an MCP server connection.
|
|
5
|
+
* Configuration for starting an MCP server connection via **stdio** transport.
|
|
6
|
+
*
|
|
7
|
+
* This is the default transport — spawns a local server process and communicates
|
|
8
|
+
* over stdin/stdout.
|
|
5
9
|
*/
|
|
6
|
-
export interface
|
|
10
|
+
export interface StdioServerConfig {
|
|
11
|
+
/**
|
|
12
|
+
* Transport type. Always `'stdio'`. Can be omitted (stdio is the default).
|
|
13
|
+
*/
|
|
14
|
+
transport?: 'stdio';
|
|
7
15
|
/**
|
|
8
16
|
* The command to execute the MCP server (e.g., "node", "python").
|
|
9
17
|
*/
|
|
@@ -22,6 +30,53 @@ export interface MCPServerConfig {
|
|
|
22
30
|
*/
|
|
23
31
|
startupDelay?: number;
|
|
24
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for connecting to a remote MCP server via **Streamable HTTP** transport.
|
|
35
|
+
*
|
|
36
|
+
* Uses HTTP POST for sending messages and Server-Sent Events (GET) for receiving.
|
|
37
|
+
* This is the recommended transport for remote servers (MCP spec 2025-03-26+).
|
|
38
|
+
*/
|
|
39
|
+
export interface StreamableHttpServerConfig {
|
|
40
|
+
/** Always `'http'`. */
|
|
41
|
+
transport: 'http';
|
|
42
|
+
/** The MCP server endpoint URL (e.g. `http://localhost:3000/mcp`). */
|
|
43
|
+
url: string;
|
|
44
|
+
/** Additional HTTP headers to send (e.g. `{ Authorization: 'Bearer token' }`). */
|
|
45
|
+
headers?: Record<string, string>;
|
|
46
|
+
/** Existing session ID to resume. If omitted, a new session is created. */
|
|
47
|
+
sessionId?: string;
|
|
48
|
+
/** Custom `RequestInit` for low-level fetch control. */
|
|
49
|
+
requestInit?: RequestInit;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Configuration for connecting to a remote MCP server via **SSE** transport.
|
|
53
|
+
*
|
|
54
|
+
* Uses Server-Sent Events for receiving and HTTP POST for sending.
|
|
55
|
+
* @deprecated Prefer {@link StreamableHttpServerConfig} (`'http'`) for new servers.
|
|
56
|
+
* SSE is kept for backward compatibility with older MCP servers.
|
|
57
|
+
*/
|
|
58
|
+
export interface SseServerConfig {
|
|
59
|
+
/** Always `'sse'`. */
|
|
60
|
+
transport: 'sse';
|
|
61
|
+
/** The SSE endpoint URL (e.g. `http://localhost:3000/sse`). */
|
|
62
|
+
url: string;
|
|
63
|
+
/** Additional HTTP headers to send. */
|
|
64
|
+
headers?: Record<string, string>;
|
|
65
|
+
/** Custom `RequestInit` for low-level fetch control. */
|
|
66
|
+
requestInit?: RequestInit;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Union of all supported server transport configurations.
|
|
70
|
+
*
|
|
71
|
+
* - `StdioServerConfig` (default) — local process via stdin/stdout
|
|
72
|
+
* - `StreamableHttpServerConfig` — modern HTTP transport
|
|
73
|
+
* - `SseServerConfig` — legacy SSE transport
|
|
74
|
+
*/
|
|
75
|
+
export type ServerConfig = StdioServerConfig | StreamableHttpServerConfig | SseServerConfig;
|
|
76
|
+
/**
|
|
77
|
+
* @deprecated Use {@link StdioServerConfig} instead. Kept as an alias for backward compatibility.
|
|
78
|
+
*/
|
|
79
|
+
export type MCPServerConfig = StdioServerConfig;
|
|
25
80
|
/**
|
|
26
81
|
* Options for configuring the MCPClient instance.
|
|
27
82
|
*/
|
|
@@ -160,13 +215,44 @@ export interface RetryOptions {
|
|
|
160
215
|
*
|
|
161
216
|
* @see {@link https://spec.modelcontextprotocol.io | MCP Specification}
|
|
162
217
|
*/
|
|
218
|
+
/**
|
|
219
|
+
* Health status of an MCP server connection.
|
|
220
|
+
*/
|
|
221
|
+
export interface HealthStatus {
|
|
222
|
+
/** Whether the server is healthy and responsive. */
|
|
223
|
+
healthy: boolean;
|
|
224
|
+
/** Timestamp of the health check. */
|
|
225
|
+
checkedAt: number;
|
|
226
|
+
/** Round-trip latency in ms, or -1 if the check failed. */
|
|
227
|
+
latencyMs: number;
|
|
228
|
+
/** Server PID, or null if not available. */
|
|
229
|
+
pid: number | null;
|
|
230
|
+
/** Human-readable status message. */
|
|
231
|
+
message: string;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Options for periodic health monitoring.
|
|
235
|
+
*/
|
|
236
|
+
export interface HealthMonitorOptions {
|
|
237
|
+
/** Interval between health checks in ms. @defaultValue 5000 */
|
|
238
|
+
interval?: number;
|
|
239
|
+
/** Called when the server becomes unhealthy. */
|
|
240
|
+
onUnhealthy?: (status: HealthStatus) => void;
|
|
241
|
+
/** Called when a previously unhealthy server recovers. */
|
|
242
|
+
onRecovery?: (status: HealthStatus) => void;
|
|
243
|
+
/** Called on every health check (healthy or not). */
|
|
244
|
+
onCheck?: (status: HealthStatus) => void;
|
|
245
|
+
}
|
|
163
246
|
export declare class MCPClient {
|
|
164
247
|
private client;
|
|
165
248
|
private transport;
|
|
249
|
+
private transportType;
|
|
166
250
|
private options;
|
|
167
251
|
private notificationHandlers;
|
|
168
252
|
private logger;
|
|
169
253
|
private retryOptions;
|
|
254
|
+
private healthMonitorTimer;
|
|
255
|
+
private lastHealthStatus;
|
|
170
256
|
/**
|
|
171
257
|
* Creates a new MCPClient instance.
|
|
172
258
|
*
|
|
@@ -185,22 +271,44 @@ export declare class MCPClient {
|
|
|
185
271
|
/**
|
|
186
272
|
* Starts the client and connects to the MCP server.
|
|
187
273
|
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
274
|
+
* Supports three transport types:
|
|
275
|
+
* - **stdio** (default): Spawns a local server process
|
|
276
|
+
* - **http**: Connects to a Streamable HTTP endpoint
|
|
277
|
+
* - **sse**: Connects to a legacy SSE endpoint
|
|
190
278
|
*
|
|
191
|
-
* @param config - Server configuration
|
|
279
|
+
* @param config - Server configuration (stdio, http, or sse)
|
|
192
280
|
* @throws `MCPAlreadyStartedError` if client is already started
|
|
193
|
-
* @throws
|
|
194
|
-
*
|
|
281
|
+
* @throws `MCPConnectionError` if the connection fails
|
|
282
|
+
*
|
|
283
|
+
* @example Stdio (default)
|
|
195
284
|
* ```typescript
|
|
196
285
|
* await client.start({
|
|
197
286
|
* command: 'node',
|
|
198
|
-
* args: ['./server.js'
|
|
199
|
-
*
|
|
287
|
+
* args: ['./server.js'],
|
|
288
|
+
* });
|
|
289
|
+
* ```
|
|
290
|
+
*
|
|
291
|
+
* @example Streamable HTTP
|
|
292
|
+
* ```typescript
|
|
293
|
+
* await client.start({
|
|
294
|
+
* transport: 'http',
|
|
295
|
+
* url: 'http://localhost:3000/mcp',
|
|
296
|
+
* });
|
|
297
|
+
* ```
|
|
298
|
+
*
|
|
299
|
+
* @example SSE (legacy)
|
|
300
|
+
* ```typescript
|
|
301
|
+
* await client.start({
|
|
302
|
+
* transport: 'sse',
|
|
303
|
+
* url: 'http://localhost:3000/sse',
|
|
200
304
|
* });
|
|
201
305
|
* ```
|
|
202
306
|
*/
|
|
203
|
-
start(config:
|
|
307
|
+
start(config: ServerConfig): Promise<void>;
|
|
308
|
+
/**
|
|
309
|
+
* Creates the appropriate transport instance based on the config type.
|
|
310
|
+
*/
|
|
311
|
+
private createTransport;
|
|
204
312
|
/**
|
|
205
313
|
* Stops the client and disconnects from the MCP server.
|
|
206
314
|
*
|
|
@@ -367,6 +475,75 @@ export declare class MCPClient {
|
|
|
367
475
|
* ```
|
|
368
476
|
*/
|
|
369
477
|
isConnected(): boolean;
|
|
478
|
+
/**
|
|
479
|
+
* Check if the server is alive and responsive.
|
|
480
|
+
*
|
|
481
|
+
* Sends a lightweight request to verify the server process is running
|
|
482
|
+
* and the MCP connection is functional. Detects zombie processes by
|
|
483
|
+
* checking if the PID is still alive.
|
|
484
|
+
*
|
|
485
|
+
* @returns A {@link HealthStatus} object with health info
|
|
486
|
+
*
|
|
487
|
+
* @example
|
|
488
|
+
* ```typescript
|
|
489
|
+
* const health = await client.isHealthy();
|
|
490
|
+
* if (!health.healthy) {
|
|
491
|
+
* console.error(`Server unhealthy: ${health.message}`);
|
|
492
|
+
* console.error(`PID ${health.pid}, latency: ${health.latencyMs}ms`);
|
|
493
|
+
* }
|
|
494
|
+
* ```
|
|
495
|
+
*/
|
|
496
|
+
isHealthy(): Promise<HealthStatus>;
|
|
497
|
+
/**
|
|
498
|
+
* Get the last health check result without performing a new check.
|
|
499
|
+
*
|
|
500
|
+
* @returns The last {@link HealthStatus}, or null if never checked
|
|
501
|
+
*/
|
|
502
|
+
getLastHealthStatus(): HealthStatus | null;
|
|
503
|
+
/**
|
|
504
|
+
* Get the server process PID.
|
|
505
|
+
*
|
|
506
|
+
* Only applicable to stdio transport. Returns null for HTTP/SSE transports
|
|
507
|
+
* (no local process).
|
|
508
|
+
*
|
|
509
|
+
* @returns The PID, or null if not connected / not a stdio transport
|
|
510
|
+
*/
|
|
511
|
+
getServerPid(): number | null;
|
|
512
|
+
/**
|
|
513
|
+
* Get the PID from a stdio transport, or null for other transports.
|
|
514
|
+
*/
|
|
515
|
+
private getStdioPid;
|
|
516
|
+
/**
|
|
517
|
+
* Start periodic health monitoring.
|
|
518
|
+
*
|
|
519
|
+
* Runs {@link isHealthy} at the specified interval and calls
|
|
520
|
+
* the provided callbacks on status changes.
|
|
521
|
+
*
|
|
522
|
+
* @param options - Monitoring configuration
|
|
523
|
+
*
|
|
524
|
+
* @example
|
|
525
|
+
* ```typescript
|
|
526
|
+
* client.startHealthMonitor({
|
|
527
|
+
* interval: 3000,
|
|
528
|
+
* onUnhealthy: (status) => console.error('Server down:', status.message),
|
|
529
|
+
* onRecovery: (status) => console.log('Server recovered:', status.message),
|
|
530
|
+
* });
|
|
531
|
+
*
|
|
532
|
+
* // Later...
|
|
533
|
+
* client.stopHealthMonitor();
|
|
534
|
+
* ```
|
|
535
|
+
*/
|
|
536
|
+
startHealthMonitor(options?: HealthMonitorOptions): void;
|
|
537
|
+
/**
|
|
538
|
+
* Stop periodic health monitoring.
|
|
539
|
+
*/
|
|
540
|
+
stopHealthMonitor(): void;
|
|
541
|
+
/**
|
|
542
|
+
* Get the transport type in use.
|
|
543
|
+
*
|
|
544
|
+
* @returns `'stdio'`, `'http'`, `'sse'`, or null if not connected
|
|
545
|
+
*/
|
|
546
|
+
getTransportType(): TransportType | null;
|
|
370
547
|
/**
|
|
371
548
|
* Sets the logging level for the client.
|
|
372
549
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MCPClient.d.ts","sourceRoot":"","sources":["../../src/client/MCPClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MCPClient.d.ts","sourceRoot":"","sources":["../../src/client/MCPClient.ts"],"names":[],"mappings":"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"}
|