@frontmcp/testing 0.7.1 → 0.8.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/auth/index.d.ts +2 -0
- package/auth/index.d.ts.map +1 -1
- package/auth/mock-cimd-server.d.ts +174 -0
- package/auth/mock-cimd-server.d.ts.map +1 -0
- package/auth/mock-oauth-server.d.ts +136 -6
- package/auth/mock-oauth-server.d.ts.map +1 -1
- package/auth/token-factory.d.ts.map +1 -1
- package/client/index.d.ts +1 -1
- package/client/index.d.ts.map +1 -1
- package/client/mcp-test-client.builder.d.ts +12 -0
- package/client/mcp-test-client.builder.d.ts.map +1 -1
- package/client/mcp-test-client.d.ts +48 -2
- package/client/mcp-test-client.d.ts.map +1 -1
- package/client/mcp-test-client.types.d.ts +60 -0
- package/client/mcp-test-client.types.d.ts.map +1 -1
- package/esm/fixtures/index.mjs +661 -83
- package/esm/index.mjs +3245 -219
- package/esm/package.json +5 -4
- package/esm/perf/index.mjs +4334 -0
- package/esm/perf/perf-setup.mjs +31 -0
- package/fixtures/fixture-types.d.ts +10 -1
- package/fixtures/fixture-types.d.ts.map +1 -1
- package/fixtures/index.js +661 -93
- package/fixtures/test-fixture.d.ts +1 -1
- package/fixtures/test-fixture.d.ts.map +1 -1
- package/index.d.ts +5 -1
- package/index.d.ts.map +1 -1
- package/index.js +3271 -219
- package/interceptor/interceptor-chain.d.ts +1 -0
- package/interceptor/interceptor-chain.d.ts.map +1 -1
- package/package.json +5 -4
- package/perf/baseline-store.d.ts +67 -0
- package/perf/baseline-store.d.ts.map +1 -0
- package/perf/index.d.ts +44 -0
- package/perf/index.d.ts.map +1 -0
- package/perf/index.js +4404 -0
- package/perf/jest-perf-reporter.d.ts +6 -0
- package/perf/jest-perf-reporter.d.ts.map +1 -0
- package/perf/leak-detector.d.ts +81 -0
- package/perf/leak-detector.d.ts.map +1 -0
- package/perf/metrics-collector.d.ts +83 -0
- package/perf/metrics-collector.d.ts.map +1 -0
- package/perf/perf-fixtures.d.ts +107 -0
- package/perf/perf-fixtures.d.ts.map +1 -0
- package/perf/perf-setup.d.ts +9 -0
- package/perf/perf-setup.d.ts.map +1 -0
- package/perf/perf-setup.js +50 -0
- package/perf/perf-test.d.ts +69 -0
- package/perf/perf-test.d.ts.map +1 -0
- package/perf/regression-detector.d.ts +55 -0
- package/perf/regression-detector.d.ts.map +1 -0
- package/perf/report-generator.d.ts +66 -0
- package/perf/report-generator.d.ts.map +1 -0
- package/perf/types.d.ts +439 -0
- package/perf/types.d.ts.map +1 -0
- package/platform/platform-client-info.d.ts +18 -0
- package/platform/platform-client-info.d.ts.map +1 -1
- package/server/index.d.ts +2 -0
- package/server/index.d.ts.map +1 -1
- package/server/port-registry.d.ts +179 -0
- package/server/port-registry.d.ts.map +1 -0
- package/server/test-server.d.ts +9 -5
- package/server/test-server.d.ts.map +1 -1
- package/transport/streamable-http.transport.d.ts +26 -0
- package/transport/streamable-http.transport.d.ts.map +1 -1
- package/transport/transport.interface.d.ts +9 -1
- package/transport/transport.interface.d.ts.map +1 -1
package/server/test-server.d.ts
CHANGED
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
* @description Test server management for E2E testing
|
|
4
4
|
*/
|
|
5
5
|
export interface TestServerOptions {
|
|
6
|
-
/** Port to run the server on (default:
|
|
6
|
+
/** Port to run the server on (default: from project range or random) */
|
|
7
7
|
port?: number;
|
|
8
|
+
/** E2E project name for port range allocation */
|
|
9
|
+
project?: string;
|
|
8
10
|
/** Command to start the server */
|
|
9
11
|
command?: string;
|
|
10
12
|
/** Working directory */
|
|
@@ -53,6 +55,7 @@ export declare class TestServer {
|
|
|
53
55
|
private readonly options;
|
|
54
56
|
private _info;
|
|
55
57
|
private logs;
|
|
58
|
+
private portRelease;
|
|
56
59
|
private constructor();
|
|
57
60
|
/**
|
|
58
61
|
* Start a test server with custom command
|
|
@@ -91,14 +94,15 @@ export declare class TestServer {
|
|
|
91
94
|
*/
|
|
92
95
|
clearLogs(): void;
|
|
93
96
|
private startProcess;
|
|
97
|
+
/**
|
|
98
|
+
* Print server logs on failure for debugging
|
|
99
|
+
*/
|
|
100
|
+
private printLogsOnFailure;
|
|
94
101
|
/**
|
|
95
102
|
* Wait for server to be ready, but also detect early process exit
|
|
96
103
|
*/
|
|
97
104
|
private waitForReadyWithExitDetection;
|
|
98
105
|
private log;
|
|
99
106
|
}
|
|
100
|
-
|
|
101
|
-
* Find an available port
|
|
102
|
-
*/
|
|
103
|
-
export declare function findAvailablePort(): Promise<number>;
|
|
107
|
+
export { reservePort, getProjectPort, getProjectPorts, getPortRange, releaseAllPorts, getReservedPorts, findAvailablePort, E2E_PORT_RANGES, type E2EProject, } from './port-registry';
|
|
104
108
|
//# sourceMappingURL=test-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-server.d.ts","sourceRoot":"","sources":["../../src/server/test-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"test-server.d.ts","sourceRoot":"","sources":["../../src/server/test-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,iBAAiB;IAChC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsE;IAC9F,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,WAAW,CAAsC;IAEzD,OAAO;IAmBP;;OAEG;WACU,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBnE;;OAEG;WACU,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgCpG;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAoB3C;;OAEG;IACH,IAAI,IAAI,IAAI,cAAc,CAEzB;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B;;OAEG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE;IAInB;;OAEG;IACH,SAAS,IAAI,IAAI;YAQH,YAAY;IAoG1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;YACW,6BAA6B;IAmE3C,OAAO,CAAC,GAAG;CAKZ;AAcD,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,KAAK,UAAU,GAChB,MAAM,iBAAiB,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { McpTransport, TransportConfig, TransportState, JsonRpcRequest, JsonRpcResponse } from './transport.interface';
|
|
6
6
|
import type { InterceptorChain } from '../interceptor';
|
|
7
|
+
import type { ElicitationHandler } from '../client/mcp-test-client.types';
|
|
7
8
|
/**
|
|
8
9
|
* StreamableHTTP transport for MCP communication
|
|
9
10
|
*
|
|
@@ -20,6 +21,7 @@ export declare class StreamableHttpTransport implements McpTransport {
|
|
|
20
21
|
private lastRequestHeaders;
|
|
21
22
|
private interceptors?;
|
|
22
23
|
private readonly publicMode;
|
|
24
|
+
private elicitationHandler?;
|
|
23
25
|
constructor(config: TransportConfig);
|
|
24
26
|
connect(): Promise<void>;
|
|
25
27
|
/**
|
|
@@ -40,11 +42,35 @@ export declare class StreamableHttpTransport implements McpTransport {
|
|
|
40
42
|
setTimeout(ms: number): void;
|
|
41
43
|
setInterceptors(interceptors: InterceptorChain): void;
|
|
42
44
|
getInterceptors(): InterceptorChain | undefined;
|
|
45
|
+
setElicitationHandler(handler: ElicitationHandler | undefined): void;
|
|
43
46
|
getConnectionCount(): number;
|
|
44
47
|
getReconnectCount(): number;
|
|
45
48
|
getLastRequestHeaders(): Record<string, string>;
|
|
46
49
|
simulateDisconnect(): Promise<void>;
|
|
47
50
|
waitForReconnect(timeoutMs: number): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Handle SSE response with elicitation support.
|
|
53
|
+
*
|
|
54
|
+
* Streams the SSE response, detects elicitation/create requests, and handles them
|
|
55
|
+
* by calling the registered handler and sending the response back to the server.
|
|
56
|
+
*/
|
|
57
|
+
private handleSSEResponseWithElicitation;
|
|
58
|
+
/**
|
|
59
|
+
* Parse SSE event text into structured events
|
|
60
|
+
*/
|
|
61
|
+
private parseSSEEvents;
|
|
62
|
+
/**
|
|
63
|
+
* Handle a single SSE event, including elicitation requests
|
|
64
|
+
*/
|
|
65
|
+
private handleSSEEvent;
|
|
66
|
+
/**
|
|
67
|
+
* Handle an elicitation/create request from the server
|
|
68
|
+
*/
|
|
69
|
+
private handleElicitationRequest;
|
|
70
|
+
/**
|
|
71
|
+
* Send an elicitation response back to the server
|
|
72
|
+
*/
|
|
73
|
+
private sendElicitationResponse;
|
|
48
74
|
private buildHeaders;
|
|
49
75
|
private ensureConnected;
|
|
50
76
|
private log;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamable-http.transport.d.ts","sourceRoot":"","sources":["../../src/transport/streamable-http.transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"streamable-http.transport.d.ts","sourceRoot":"","sources":["../../src/transport/streamable-http.transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAc,kBAAkB,EAA4B,MAAM,iCAAiC,CAAC;AAIhH;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGrB;IACF,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,YAAY,CAAC,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,kBAAkB,CAAC,CAAqB;gBAEpC,MAAM,EAAE,eAAe;IAiB7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;OAGG;YACW,qBAAqB;IAqC7B,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG;QAAE,MAAM,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;IA8HxF,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC9C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAmD/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,WAAW,IAAI,OAAO;IAItB,QAAQ,IAAI,cAAc;IAI1B,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,eAAe,CAAC,YAAY,EAAE,gBAAgB,GAAG,IAAI;IAIrD,eAAe,IAAI,gBAAgB,GAAG,SAAS;IAI/C,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI;IAIpE,kBAAkB,IAAI,MAAM;IAI5B,iBAAiB,IAAI,MAAM;IAI3B,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIzC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxD;;;;;OAKG;YACW,gCAAgC;IA+F9C;;OAEG;IACH,OAAO,CAAC,cAAc;IAiDtB;;OAEG;YACW,cAAc;IAuC5B;;OAEG;YACW,wBAAwB;IAqCtC;;OAEG;YACW,uBAAuB;IA8BrC,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,GAAG;IAMX;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,2BAA2B;CAsDpC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file transport.interface.ts
|
|
3
3
|
* @description Interface for MCP transport implementations
|
|
4
4
|
*/
|
|
5
|
-
import type { ClientInfo } from '../client/mcp-test-client.types';
|
|
5
|
+
import type { ClientInfo, ElicitationHandler } from '../client/mcp-test-client.types';
|
|
6
6
|
export interface JsonRpcRequest {
|
|
7
7
|
jsonrpc: '2.0';
|
|
8
8
|
id?: string | number;
|
|
@@ -98,6 +98,12 @@ export interface McpTransport {
|
|
|
98
98
|
* Get the current interceptor chain
|
|
99
99
|
*/
|
|
100
100
|
getInterceptors?(): import('../interceptor').InterceptorChain | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Set the elicitation handler for server→client elicit requests.
|
|
103
|
+
* When the server sends an elicitation/create request during tool execution,
|
|
104
|
+
* this handler is called to provide the user's response.
|
|
105
|
+
*/
|
|
106
|
+
setElicitationHandler?(handler: ElicitationHandler | undefined): void;
|
|
101
107
|
}
|
|
102
108
|
/**
|
|
103
109
|
* Configuration for transport implementations
|
|
@@ -124,5 +130,7 @@ export interface TransportConfig {
|
|
|
124
130
|
interceptors?: import('../interceptor').InterceptorChain;
|
|
125
131
|
/** Client info for User-Agent header (enables platform detection on server) */
|
|
126
132
|
clientInfo?: ClientInfo;
|
|
133
|
+
/** Handler for server→client elicitation requests during tool execution */
|
|
134
|
+
elicitationHandler?: ElicitationHandler;
|
|
127
135
|
}
|
|
128
136
|
//# sourceMappingURL=transport.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../src/transport/transport.interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../src/transport/transport.interface.ts"],"names":[],"mappings":"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"}
|