@slbdn/mcp-tester 1.0.2 → 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/CHANGELOG.md +70 -82
- package/README.md +230 -1437
- package/dist/assert.d.ts +75 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +250 -0
- package/dist/assert.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 +311 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/MCPClient.d.ts +316 -0
- package/dist/client/MCPClient.d.ts.map +1 -1
- package/dist/client/MCPClient.js +240 -9
- package/dist/client/MCPClient.js.map +1 -1
- package/dist/index.d.ts +32 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +262 -0
- package/dist/matchers.d.ts.map +1 -0
- package/dist/matchers.js +527 -0
- package/dist/matchers.js.map +1 -0
- package/dist/utils/errors.d.ts +38 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +38 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +57 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +32 -3
- package/dist/utils/logger.js.map +1 -1
- package/package.json +32 -5
- package/vitest.d.ts +51 -0
package/dist/utils/errors.js
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for MCPClient operations.
|
|
3
|
+
*
|
|
4
|
+
* All errors include a descriptive message, error code, and proper stack trace.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* try {
|
|
9
|
+
* await client.callTool({ name: 'invalid-tool', arguments: {} });
|
|
10
|
+
* } catch (error) {
|
|
11
|
+
* if (error instanceof MCPServerError) {
|
|
12
|
+
* console.error(`Server error: ${error.message}`);
|
|
13
|
+
* } else if (error instanceof MCPTimeoutError) {
|
|
14
|
+
* console.error(`Timeout after ${error.timeout}ms`);
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Base error class for all MCP client errors.
|
|
21
|
+
*/
|
|
1
22
|
export class MCPClientError extends Error {
|
|
23
|
+
/** Error code for programmatic error handling. */
|
|
2
24
|
code;
|
|
3
25
|
constructor(message, code = 'MCP_CLIENT_ERROR') {
|
|
4
26
|
super(message);
|
|
@@ -7,7 +29,11 @@ export class MCPClientError extends Error {
|
|
|
7
29
|
Error.captureStackTrace(this, MCPClientError);
|
|
8
30
|
}
|
|
9
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Error thrown when a request times out.
|
|
34
|
+
*/
|
|
10
35
|
export class MCPTimeoutError extends MCPClientError {
|
|
36
|
+
/** The timeout value in milliseconds. */
|
|
11
37
|
timeout;
|
|
12
38
|
constructor(message, timeout) {
|
|
13
39
|
super(message, 'MCP_TIMEOUT_ERROR');
|
|
@@ -16,6 +42,9 @@ export class MCPTimeoutError extends MCPClientError {
|
|
|
16
42
|
Error.captureStackTrace(this, MCPTimeoutError);
|
|
17
43
|
}
|
|
18
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Error thrown when the client fails to connect to the MCP server.
|
|
47
|
+
*/
|
|
19
48
|
export class MCPConnectionError extends MCPClientError {
|
|
20
49
|
constructor(message) {
|
|
21
50
|
super(message, 'MCP_CONNECTION_ERROR');
|
|
@@ -23,6 +52,9 @@ export class MCPConnectionError extends MCPClientError {
|
|
|
23
52
|
Error.captureStackTrace(this, MCPConnectionError);
|
|
24
53
|
}
|
|
25
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Error thrown when a client method is called before start().
|
|
57
|
+
*/
|
|
26
58
|
export class MCPNotStartedError extends MCPClientError {
|
|
27
59
|
constructor() {
|
|
28
60
|
super('Client not started. Call start() before using client methods.', 'MCP_NOT_STARTED');
|
|
@@ -30,6 +62,9 @@ export class MCPNotStartedError extends MCPClientError {
|
|
|
30
62
|
Error.captureStackTrace(this, MCPNotStartedError);
|
|
31
63
|
}
|
|
32
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Error thrown when start() is called on an already-started client.
|
|
67
|
+
*/
|
|
33
68
|
export class MCPAlreadyStartedError extends MCPClientError {
|
|
34
69
|
constructor() {
|
|
35
70
|
super('Client already started. Call stop() before starting again.', 'MCP_ALREADY_STARTED');
|
|
@@ -37,6 +72,9 @@ export class MCPAlreadyStartedError extends MCPClientError {
|
|
|
37
72
|
Error.captureStackTrace(this, MCPAlreadyStartedError);
|
|
38
73
|
}
|
|
39
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Error thrown when the MCP server returns an error response.
|
|
77
|
+
*/
|
|
40
78
|
export class MCPServerError extends MCPClientError {
|
|
41
79
|
constructor(message) {
|
|
42
80
|
super(message, 'MCP_SERVER_ERROR');
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,kDAAkD;IAClC,IAAI,CAAS;IAE7B,YAAY,OAAe,EAAE,OAAe,kBAAkB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAChD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,yCAAyC;IACzB,OAAO,CAAS;IAEhC,YAAY,OAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD;QACE,KAAK,CAAC,+DAA+D,EAAE,iBAAiB,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD;QACE,KAAK,CAAC,4DAA4D,EAAE,qBAAqB,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACxD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,cAAc;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAChD,CAAC;CACF"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,14 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utilities for MCP client.
|
|
3
|
+
*
|
|
4
|
+
* Provides configurable logging with multiple output levels and formats.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Supported log levels in order of verbosity.
|
|
8
|
+
*/
|
|
1
9
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
|
|
10
|
+
/**
|
|
11
|
+
* Options for configuring a Logger instance.
|
|
12
|
+
*/
|
|
2
13
|
export interface LoggerOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Minimum log level to output.
|
|
16
|
+
* @defaultValue "info"
|
|
17
|
+
*/
|
|
3
18
|
level?: LogLevel;
|
|
19
|
+
/**
|
|
20
|
+
* Prefix added to all log messages.
|
|
21
|
+
*/
|
|
4
22
|
prefix?: string;
|
|
5
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Logger interface for logging messages.
|
|
26
|
+
*/
|
|
6
27
|
export interface Logger {
|
|
28
|
+
/**
|
|
29
|
+
* Log a debug message.
|
|
30
|
+
* @param args - Message arguments to log
|
|
31
|
+
*/
|
|
7
32
|
debug(...args: unknown[]): void;
|
|
33
|
+
/**
|
|
34
|
+
* Log an info message.
|
|
35
|
+
* @param args - Message arguments to log
|
|
36
|
+
*/
|
|
8
37
|
info(...args: unknown[]): void;
|
|
38
|
+
/**
|
|
39
|
+
* Log a warning message.
|
|
40
|
+
* @param args - Message arguments to log
|
|
41
|
+
*/
|
|
9
42
|
warn(...args: unknown[]): void;
|
|
43
|
+
/**
|
|
44
|
+
* Log an error message.
|
|
45
|
+
* @param args - Message arguments to log
|
|
46
|
+
*/
|
|
10
47
|
error(...args: unknown[]): void;
|
|
11
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Logger implementation that outputs to stderr.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const logger = new ConsoleLogger({ level: 'debug', prefix: 'MyApp' });
|
|
55
|
+
* logger.info('Starting...'); // [MyApp] INFO: Starting...
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
12
58
|
export declare class ConsoleLogger implements Logger {
|
|
13
59
|
private level;
|
|
14
60
|
private prefix;
|
|
@@ -20,6 +66,17 @@ export declare class ConsoleLogger implements Logger {
|
|
|
20
66
|
warn(...args: unknown[]): void;
|
|
21
67
|
error(...args: unknown[]): void;
|
|
22
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* No-op logger that discards all log messages.
|
|
71
|
+
*
|
|
72
|
+
* Use this when you don't want any logging output.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const logger = new NoOpLogger();
|
|
77
|
+
* logger.info('This will be ignored');
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
23
80
|
export declare class NoOpLogger implements Logger {
|
|
24
81
|
debug(): void;
|
|
25
82
|
info(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAUD,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,aAAkB;IAKvC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,MAAM;IAKd,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAUD;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,aAAkB;IAKvC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,MAAM;IAKd,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAO/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAO9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAO9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;CAMhC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,KAAK,IAAI,IAAI;IACb,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;IACZ,KAAK,IAAI,IAAI;CACd"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utilities for MCP client.
|
|
3
|
+
*
|
|
4
|
+
* Provides configurable logging with multiple output levels and formats.
|
|
5
|
+
*/
|
|
1
6
|
const LOG_LEVELS = {
|
|
2
7
|
debug: 0,
|
|
3
8
|
info: 1,
|
|
@@ -5,6 +10,15 @@ const LOG_LEVELS = {
|
|
|
5
10
|
error: 3,
|
|
6
11
|
none: 99,
|
|
7
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Logger implementation that outputs to stderr.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const logger = new ConsoleLogger({ level: 'debug', prefix: 'MyApp' });
|
|
19
|
+
* logger.info('Starting...'); // [MyApp] INFO: Starting...
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
8
22
|
export class ConsoleLogger {
|
|
9
23
|
level;
|
|
10
24
|
prefix;
|
|
@@ -21,25 +35,40 @@ export class ConsoleLogger {
|
|
|
21
35
|
}
|
|
22
36
|
debug(...args) {
|
|
23
37
|
if (this.shouldLog('debug')) {
|
|
24
|
-
console
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.error(...this.format('debug', args));
|
|
25
40
|
}
|
|
26
41
|
}
|
|
27
42
|
info(...args) {
|
|
28
43
|
if (this.shouldLog('info')) {
|
|
29
|
-
console
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.error(...this.format('info', args));
|
|
30
46
|
}
|
|
31
47
|
}
|
|
32
48
|
warn(...args) {
|
|
33
49
|
if (this.shouldLog('warn')) {
|
|
34
|
-
console
|
|
50
|
+
// eslint-disable-next-line no-console
|
|
51
|
+
console.error(...this.format('warn', args));
|
|
35
52
|
}
|
|
36
53
|
}
|
|
37
54
|
error(...args) {
|
|
38
55
|
if (this.shouldLog('error')) {
|
|
56
|
+
// eslint-disable-next-line no-console
|
|
39
57
|
console.error(...this.format('error', args));
|
|
40
58
|
}
|
|
41
59
|
}
|
|
42
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* No-op logger that discards all log messages.
|
|
63
|
+
*
|
|
64
|
+
* Use this when you don't want any logging output.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const logger = new NoOpLogger();
|
|
69
|
+
* logger.info('This will be ignored');
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
43
72
|
export class NoOpLogger {
|
|
44
73
|
debug() { }
|
|
45
74
|
info() { }
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgDH,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,EAAE;CACT,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,CAAS;IACd,MAAM,CAAS;IAEvB,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACrC,CAAC;IAEO,SAAS,CAAC,YAAsB;QACtC,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,IAAe;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAU;IACrB,KAAK,KAAU,CAAC;IAChB,IAAI,KAAU,CAAC;IACf,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slbdn/mcp-tester",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Minimal MCP client implementation for CI/CD testing of MCP servers",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9,16 +9,27 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"dist/client",
|
|
11
11
|
"dist/utils",
|
|
12
|
+
"dist/cli",
|
|
12
13
|
"dist/index.js",
|
|
13
14
|
"dist/index.d.ts",
|
|
14
15
|
"dist/index.d.ts.map",
|
|
15
16
|
"dist/index.js.map",
|
|
17
|
+
"dist/assert.js",
|
|
18
|
+
"dist/assert.d.ts",
|
|
19
|
+
"dist/assert.d.ts.map",
|
|
20
|
+
"dist/assert.js.map",
|
|
21
|
+
"dist/matchers.js",
|
|
22
|
+
"dist/matchers.d.ts",
|
|
23
|
+
"dist/matchers.d.ts.map",
|
|
24
|
+
"dist/matchers.js.map",
|
|
25
|
+
"vitest.d.ts",
|
|
16
26
|
"LICENSE",
|
|
17
27
|
"README.md",
|
|
18
28
|
"CHANGELOG.md"
|
|
19
29
|
],
|
|
20
30
|
"scripts": {
|
|
21
31
|
"build": "tsc",
|
|
32
|
+
"docs": "typedoc",
|
|
22
33
|
"test": "jest",
|
|
23
34
|
"test:watch": "jest --watch",
|
|
24
35
|
"test:coverage": "jest --coverage",
|
|
@@ -27,20 +38,32 @@
|
|
|
27
38
|
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
28
39
|
"audit": "npm audit",
|
|
29
40
|
"audit:fix": "npm audit fix",
|
|
30
|
-
"prepublishOnly": "npm run build",
|
|
41
|
+
"prepublishOnly": "npm run build && npm run docs",
|
|
31
42
|
"release:patch": "npm version patch && npm run build",
|
|
32
43
|
"release:minor": "npm version minor && npm run build",
|
|
33
44
|
"release:major": "npm version major && npm run build",
|
|
34
45
|
"release:prerelease": "npm version prerelease && npm run build",
|
|
35
46
|
"release:commit": "git add package.json CHANGELOG.md && git commit -m \"chore: release $(node -p \"require('./package.json').version\")\"",
|
|
36
|
-
"prepare": "husky"
|
|
47
|
+
"prepare": "husky || true"
|
|
48
|
+
},
|
|
49
|
+
"bin": {
|
|
50
|
+
"mcp-tester": "dist/cli/index.js"
|
|
37
51
|
},
|
|
38
52
|
"keywords": [
|
|
39
53
|
"mcp",
|
|
40
54
|
"model-context-protocol",
|
|
55
|
+
"mcp-tester",
|
|
56
|
+
"mcp-client",
|
|
41
57
|
"testing",
|
|
58
|
+
"test",
|
|
42
59
|
"jest",
|
|
43
|
-
"
|
|
60
|
+
"vitest",
|
|
61
|
+
"assert",
|
|
62
|
+
"matchers",
|
|
63
|
+
"ci-cd",
|
|
64
|
+
"cli",
|
|
65
|
+
"typescript",
|
|
66
|
+
"esm"
|
|
44
67
|
],
|
|
45
68
|
"author": "Slobodan Ivkovic",
|
|
46
69
|
"license": "MIT",
|
|
@@ -53,9 +76,11 @@
|
|
|
53
76
|
},
|
|
54
77
|
"homepage": "https://github.com/islobodan/mcp-tester#readme",
|
|
55
78
|
"dependencies": {
|
|
56
|
-
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
79
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
80
|
+
"commander": "^14.0.3"
|
|
57
81
|
},
|
|
58
82
|
"devDependencies": {
|
|
83
|
+
"@modelcontextprotocol/server-everything": "^2026.1.26",
|
|
59
84
|
"@types/jest": "^29.5.0",
|
|
60
85
|
"@types/node": "^20.0.0",
|
|
61
86
|
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
|
@@ -66,6 +91,8 @@
|
|
|
66
91
|
"lint-staged": "^16.4.0",
|
|
67
92
|
"prettier": "^3.8.1",
|
|
68
93
|
"ts-jest": "^29.4.9",
|
|
94
|
+
"typedoc": "^0.28.19",
|
|
95
|
+
"typedoc-plugin-markdown": "^4.11.0",
|
|
69
96
|
"typescript": "^5.3.0"
|
|
70
97
|
},
|
|
71
98
|
"engines": {
|
package/vitest.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest type declarations for MCP Tester custom matchers.
|
|
3
|
+
*
|
|
4
|
+
* Add this file to your tsconfig.json includes or reference it
|
|
5
|
+
* in your Vitest setup file to get type-safe matcher autocompletion.
|
|
6
|
+
*
|
|
7
|
+
* Usage (in vitest.d.ts or your setup file):
|
|
8
|
+
* /// <reference types="@slbdn/mcp-tester/vitest" />
|
|
9
|
+
*
|
|
10
|
+
* Or add to tsconfig.json:
|
|
11
|
+
* "include": ["node_modules/@slbdn/mcp-tester/vitest.d.ts"]
|
|
12
|
+
*
|
|
13
|
+
* Then in your Vitest setup:
|
|
14
|
+
* import { setupVitestMatchers } from '@slbdn/mcp-tester';
|
|
15
|
+
* beforeAll(() => setupVitestMatchers());
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import 'vitest';
|
|
19
|
+
|
|
20
|
+
declare module 'vitest' {
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
|
+
interface Matchers<R = void, T = unknown> {
|
|
23
|
+
// Collection matchers
|
|
24
|
+
toHaveTool(toolName: string): R;
|
|
25
|
+
toHaveResource(uri: string): R;
|
|
26
|
+
toHavePrompt(promptName: string): R;
|
|
27
|
+
toHaveToolWithSchema(toolName: string): R;
|
|
28
|
+
toHaveToolCount(count: number): R;
|
|
29
|
+
toHaveResourceCount(count: number): R;
|
|
30
|
+
toHavePromptCount(count: number): R;
|
|
31
|
+
toHaveResourceByName(name: string): R;
|
|
32
|
+
toHavePromptWithArgs(promptName: string): R;
|
|
33
|
+
|
|
34
|
+
// Tool result matchers
|
|
35
|
+
toReturnText(expected?: string): R;
|
|
36
|
+
toReturnTextContaining(substring: string): R;
|
|
37
|
+
toReturnError(): R;
|
|
38
|
+
toReturnOk(): R;
|
|
39
|
+
toReturnJson(expected: unknown): R;
|
|
40
|
+
toReturnContentCount(count: number): R;
|
|
41
|
+
toReturnImage(): R;
|
|
42
|
+
|
|
43
|
+
// Resource result matchers
|
|
44
|
+
toReturnResourceText(expected?: string): R;
|
|
45
|
+
toReturnResourceTextContaining(substring: string): R;
|
|
46
|
+
|
|
47
|
+
// Prompt result matchers
|
|
48
|
+
toReturnPromptTextContaining(substring: string): R;
|
|
49
|
+
toReturnPromptMessageCount(count: number): R;
|
|
50
|
+
}
|
|
51
|
+
}
|