@crashbytes/mcp-test-kit 0.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/LICENSE +21 -0
- package/README.md +655 -0
- package/dist/client/MCPTestClient.d.ts +62 -0
- package/dist/client/MCPTestClient.d.ts.map +1 -0
- package/dist/client/MCPTestClient.js +197 -0
- package/dist/client/MCPTestClient.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/matchers/index.d.ts +7 -0
- package/dist/matchers/index.d.ts.map +1 -0
- package/dist/matchers/index.js +7 -0
- package/dist/matchers/index.js.map +1 -0
- package/dist/matchers/vitest.d.ts +29 -0
- package/dist/matchers/vitest.d.ts.map +1 -0
- package/dist/matchers/vitest.js +201 -0
- package/dist/matchers/vitest.js.map +1 -0
- package/dist/mocks/MockServer.d.ts +93 -0
- package/dist/mocks/MockServer.d.ts.map +1 -0
- package/dist/mocks/MockServer.js +120 -0
- package/dist/mocks/MockServer.js.map +1 -0
- package/dist/mocks/index.d.ts +5 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +5 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/types/index.d.ts +193 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Test Client - Core testing client for MCP servers
|
|
3
|
+
*/
|
|
4
|
+
import type { MCPTestClientConfig, MCPTool, MCPResource, MCPPrompt, MCPToolResult, MCPResourceContent, MCPInitializeResult, IMCPTestClient } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Main test client for MCP servers
|
|
7
|
+
*/
|
|
8
|
+
export declare class MCPTestClient implements IMCPTestClient {
|
|
9
|
+
private client;
|
|
10
|
+
private transport;
|
|
11
|
+
private process;
|
|
12
|
+
private config;
|
|
13
|
+
private initialized;
|
|
14
|
+
constructor(config: MCPTestClientConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Connect to the MCP server
|
|
17
|
+
*/
|
|
18
|
+
connect(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Disconnect from the MCP server
|
|
21
|
+
*/
|
|
22
|
+
disconnect(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Ensure the client is connected
|
|
25
|
+
*/
|
|
26
|
+
private ensureConnected;
|
|
27
|
+
/**
|
|
28
|
+
* List available tools from the server
|
|
29
|
+
*/
|
|
30
|
+
listTools(): Promise<MCPTool[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Call a tool on the server
|
|
33
|
+
*/
|
|
34
|
+
callTool(name: string, args?: Record<string, unknown>): Promise<MCPToolResult>;
|
|
35
|
+
/**
|
|
36
|
+
* List available resources from the server
|
|
37
|
+
*/
|
|
38
|
+
listResources(): Promise<MCPResource[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Read a resource from the server
|
|
41
|
+
*/
|
|
42
|
+
readResource(uri: string): Promise<MCPResourceContent>;
|
|
43
|
+
/**
|
|
44
|
+
* List available prompts from the server
|
|
45
|
+
*/
|
|
46
|
+
listPrompts(): Promise<MCPPrompt[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get a prompt from the server
|
|
49
|
+
*/
|
|
50
|
+
getPrompt(name: string, args?: Record<string, string>): Promise<unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* Get server info and capabilities
|
|
53
|
+
*/
|
|
54
|
+
getServerInfo(): Promise<MCPInitializeResult>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a new MCP test client
|
|
58
|
+
* @param config - Client configuration
|
|
59
|
+
* @returns MCP test client instance
|
|
60
|
+
*/
|
|
61
|
+
export declare function createMCPTestClient(config: MCPTestClientConfig): Promise<MCPTestClient>;
|
|
62
|
+
//# sourceMappingURL=MCPTestClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPTestClient.d.ts","sourceRoot":"","sources":["../../src/client/MCPTestClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAe3B;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,mBAAmB;IAsBvC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAMrC;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAMxF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAM7C;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAM5D;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAMzC;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMlF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAcpD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAI7F"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Test Client - Core testing client for MCP servers
|
|
3
|
+
*/
|
|
4
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
5
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Filter out undefined values from environment object
|
|
9
|
+
*/
|
|
10
|
+
function cleanEnv(env) {
|
|
11
|
+
const cleaned = {};
|
|
12
|
+
for (const [key, value] of Object.entries(env)) {
|
|
13
|
+
if (value !== undefined) {
|
|
14
|
+
cleaned[key] = value;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return cleaned;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Main test client for MCP servers
|
|
21
|
+
*/
|
|
22
|
+
export class MCPTestClient {
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.transport = null;
|
|
25
|
+
this.process = null;
|
|
26
|
+
this.initialized = false;
|
|
27
|
+
this.config = {
|
|
28
|
+
command: config.command,
|
|
29
|
+
args: config.args || [],
|
|
30
|
+
env: config.env || {},
|
|
31
|
+
timeout: config.timeout || 5000,
|
|
32
|
+
transport: config.transport || 'stdio',
|
|
33
|
+
serverUrl: config.serverUrl || '',
|
|
34
|
+
debug: config.debug || false,
|
|
35
|
+
};
|
|
36
|
+
this.client = new Client({
|
|
37
|
+
name: 'mcp-test-kit',
|
|
38
|
+
version: '0.1.0',
|
|
39
|
+
}, {
|
|
40
|
+
capabilities: {},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Connect to the MCP server
|
|
45
|
+
*/
|
|
46
|
+
async connect() {
|
|
47
|
+
if (this.initialized) {
|
|
48
|
+
throw new Error('Client is already connected');
|
|
49
|
+
}
|
|
50
|
+
if (this.config.transport !== 'stdio') {
|
|
51
|
+
throw new Error(`Transport type '${this.config.transport}' not yet implemented. Only 'stdio' is currently supported.`);
|
|
52
|
+
}
|
|
53
|
+
// Prepare environment variables
|
|
54
|
+
const processEnv = cleanEnv({
|
|
55
|
+
...process.env,
|
|
56
|
+
...this.config.env,
|
|
57
|
+
});
|
|
58
|
+
// Spawn the server process
|
|
59
|
+
this.process = spawn(this.config.command, this.config.args, {
|
|
60
|
+
env: processEnv,
|
|
61
|
+
});
|
|
62
|
+
if (!this.process.stdout || !this.process.stdin) {
|
|
63
|
+
throw new Error('Failed to create process stdio streams');
|
|
64
|
+
}
|
|
65
|
+
// Set up error handling
|
|
66
|
+
this.process.on('error', (error) => {
|
|
67
|
+
if (this.config.debug) {
|
|
68
|
+
console.error('MCP Server process error:', error);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
this.process.stderr?.on('data', (data) => {
|
|
72
|
+
if (this.config.debug) {
|
|
73
|
+
console.error('MCP Server stderr:', data.toString());
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Create transport
|
|
77
|
+
this.transport = new StdioClientTransport({
|
|
78
|
+
command: this.config.command,
|
|
79
|
+
args: this.config.args,
|
|
80
|
+
env: processEnv,
|
|
81
|
+
});
|
|
82
|
+
// Connect the client
|
|
83
|
+
await this.client.connect(this.transport);
|
|
84
|
+
this.initialized = true;
|
|
85
|
+
if (this.config.debug) {
|
|
86
|
+
console.log('MCP Test Client connected successfully');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Disconnect from the MCP server
|
|
91
|
+
*/
|
|
92
|
+
async disconnect() {
|
|
93
|
+
if (!this.initialized) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
await this.client.close();
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (this.config.debug) {
|
|
101
|
+
console.error('Error closing client:', error);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (this.process) {
|
|
105
|
+
this.process.kill();
|
|
106
|
+
this.process = null;
|
|
107
|
+
}
|
|
108
|
+
this.transport = null;
|
|
109
|
+
this.initialized = false;
|
|
110
|
+
if (this.config.debug) {
|
|
111
|
+
console.log('MCP Test Client disconnected');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Ensure the client is connected
|
|
116
|
+
*/
|
|
117
|
+
ensureConnected() {
|
|
118
|
+
if (!this.initialized) {
|
|
119
|
+
throw new Error('Client is not connected. Call connect() first.');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* List available tools from the server
|
|
124
|
+
*/
|
|
125
|
+
async listTools() {
|
|
126
|
+
this.ensureConnected();
|
|
127
|
+
const response = await this.client.listTools();
|
|
128
|
+
return (response.tools || []);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Call a tool on the server
|
|
132
|
+
*/
|
|
133
|
+
async callTool(name, args = {}) {
|
|
134
|
+
this.ensureConnected();
|
|
135
|
+
const response = await this.client.callTool({ name, arguments: args });
|
|
136
|
+
return response;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* List available resources from the server
|
|
140
|
+
*/
|
|
141
|
+
async listResources() {
|
|
142
|
+
this.ensureConnected();
|
|
143
|
+
const response = await this.client.listResources();
|
|
144
|
+
return (response.resources || []);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Read a resource from the server
|
|
148
|
+
*/
|
|
149
|
+
async readResource(uri) {
|
|
150
|
+
this.ensureConnected();
|
|
151
|
+
const response = await this.client.readResource({ uri });
|
|
152
|
+
return response.contents?.[0];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* List available prompts from the server
|
|
156
|
+
*/
|
|
157
|
+
async listPrompts() {
|
|
158
|
+
this.ensureConnected();
|
|
159
|
+
const response = await this.client.listPrompts();
|
|
160
|
+
return (response.prompts || []);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get a prompt from the server
|
|
164
|
+
*/
|
|
165
|
+
async getPrompt(name, args = {}) {
|
|
166
|
+
this.ensureConnected();
|
|
167
|
+
const response = await this.client.getPrompt({ name, arguments: args });
|
|
168
|
+
return response;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get server info and capabilities
|
|
172
|
+
*/
|
|
173
|
+
async getServerInfo() {
|
|
174
|
+
this.ensureConnected();
|
|
175
|
+
// The server info is available after initialization
|
|
176
|
+
// We can access it from the client's internal state
|
|
177
|
+
return {
|
|
178
|
+
protocolVersion: '2024-11-05',
|
|
179
|
+
capabilities: {},
|
|
180
|
+
serverInfo: {
|
|
181
|
+
name: 'unknown',
|
|
182
|
+
version: 'unknown',
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create a new MCP test client
|
|
189
|
+
* @param config - Client configuration
|
|
190
|
+
* @returns MCP test client instance
|
|
191
|
+
*/
|
|
192
|
+
export async function createMCPTestClient(config) {
|
|
193
|
+
const client = new MCPTestClient(config);
|
|
194
|
+
await client.connect();
|
|
195
|
+
return client;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=MCPTestClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPTestClient.js","sourceRoot":"","sources":["../../src/client/MCPTestClient.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Test Kit - Testing framework for Model Context Protocol servers
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
export { MCPTestClient, createMCPTestClient } from './client/MCPTestClient.js';
|
|
7
|
+
export type { MCPTestClientConfig, TransportType, MCPTool, MCPResource, MCPPrompt, MCPToolResult, MCPResourceContent, MCPError, MCPProtocolVersion, MCPServerCapabilities, MCPInitializeResult, IMCPTestClient, MockToolHandler, MockResourceHandler, SnapshotOptions, } from './types/index.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAG/E,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,OAAO,EACP,WAAW,EACX,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Test Kit - Testing framework for Model Context Protocol servers
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
// Core client
|
|
7
|
+
export { MCPTestClient, createMCPTestClient } from './client/MCPTestClient.js';
|
|
8
|
+
// Mocks (exported separately via /mocks subpath)
|
|
9
|
+
// Matchers (exported separately via /matchers subpath)
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAqB/E,iDAAiD;AACjD,uDAAuD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/matchers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/matchers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Vitest matchers for MCP testing
|
|
3
|
+
*/
|
|
4
|
+
import type { MCPToolResult, MCPError } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Register all custom matchers with Vitest
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerVitestMatchers(): void;
|
|
9
|
+
declare module 'vitest' {
|
|
10
|
+
interface Assertion<T = any> {
|
|
11
|
+
toBeValidMCPTool(): T;
|
|
12
|
+
toBeValidMCPResource(): T;
|
|
13
|
+
toMatchMCPToolResponse(expected?: Partial<MCPToolResult>): T;
|
|
14
|
+
toMatchMCPError(expected: Partial<MCPError> & {
|
|
15
|
+
message?: string | RegExp;
|
|
16
|
+
}): T;
|
|
17
|
+
toHaveMCPProtocolVersion(version: string): T;
|
|
18
|
+
}
|
|
19
|
+
interface AsymmetricMatchersContaining {
|
|
20
|
+
toBeValidMCPTool(): any;
|
|
21
|
+
toBeValidMCPResource(): any;
|
|
22
|
+
toMatchMCPToolResponse(expected?: Partial<MCPToolResult>): any;
|
|
23
|
+
toMatchMCPError(expected: Partial<MCPError> & {
|
|
24
|
+
message?: string | RegExp;
|
|
25
|
+
}): any;
|
|
26
|
+
toHaveMCPProtocolVersion(version: string): any;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=vitest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/matchers/vitest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAwB,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA4NvF;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAQ7C;AAMD,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,SAAS,CAAC,CAAC,GAAG,GAAG;QACzB,gBAAgB,IAAI,CAAC,CAAC;QACtB,oBAAoB,IAAI,CAAC,CAAC;QAC1B,sBAAsB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC7D,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,GAAG,CAAC,CAAC;QAChF,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;KAC9C;IAED,UAAU,4BAA4B;QACpC,gBAAgB,IAAI,GAAG,CAAC;QACxB,oBAAoB,IAAI,GAAG,CAAC;QAC5B,sBAAsB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;QAC/D,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,GAAG,GAAG,CAAC;QAClF,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;KAChD;CACF"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Vitest matchers for MCP testing
|
|
3
|
+
*/
|
|
4
|
+
import { expect } from 'vitest';
|
|
5
|
+
/**
|
|
6
|
+
* Check if a tool is a valid MCP tool
|
|
7
|
+
*/
|
|
8
|
+
function toBeValidMCPTool(received) {
|
|
9
|
+
const tool = received;
|
|
10
|
+
if (!tool || typeof tool !== 'object') {
|
|
11
|
+
return {
|
|
12
|
+
pass: false,
|
|
13
|
+
message: () => `Expected a valid MCP tool object, but received ${typeof received}`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (typeof tool.name !== 'string' || tool.name.trim() === '') {
|
|
17
|
+
return {
|
|
18
|
+
pass: false,
|
|
19
|
+
message: () => `Expected tool to have a non-empty name, but received: ${tool.name}`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (!tool.inputSchema || typeof tool.inputSchema !== 'object') {
|
|
23
|
+
return {
|
|
24
|
+
pass: false,
|
|
25
|
+
message: () => `Expected tool to have an inputSchema object, but received: ${typeof tool.inputSchema}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (tool.inputSchema.type !== 'object') {
|
|
29
|
+
return {
|
|
30
|
+
pass: false,
|
|
31
|
+
message: () => `Expected inputSchema.type to be 'object', but received: ${tool.inputSchema?.type || 'undefined'}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
pass: true,
|
|
36
|
+
message: () => `Expected ${tool.name} not to be a valid MCP tool`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if a resource is a valid MCP resource
|
|
41
|
+
*/
|
|
42
|
+
function toBeValidMCPResource(received) {
|
|
43
|
+
const resource = received;
|
|
44
|
+
if (!resource || typeof resource !== 'object') {
|
|
45
|
+
return {
|
|
46
|
+
pass: false,
|
|
47
|
+
message: () => `Expected a valid MCP resource object, but received ${typeof received}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (typeof resource.uri !== 'string' || resource.uri.trim() === '') {
|
|
51
|
+
return {
|
|
52
|
+
pass: false,
|
|
53
|
+
message: () => `Expected resource to have a non-empty uri, but received: ${resource.uri}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (typeof resource.name !== 'string' || resource.name.trim() === '') {
|
|
57
|
+
return {
|
|
58
|
+
pass: false,
|
|
59
|
+
message: () => `Expected resource to have a non-empty name, but received: ${resource.name}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
pass: true,
|
|
64
|
+
message: () => `Expected ${resource.name} not to be a valid MCP resource`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a response matches the expected MCP tool response structure
|
|
69
|
+
*/
|
|
70
|
+
function toMatchMCPToolResponse(received, expected) {
|
|
71
|
+
const result = received;
|
|
72
|
+
if (!result || typeof result !== 'object') {
|
|
73
|
+
return {
|
|
74
|
+
pass: false,
|
|
75
|
+
message: () => `Expected a valid MCP tool result object, but received ${typeof received}`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (!Array.isArray(result.content)) {
|
|
79
|
+
return {
|
|
80
|
+
pass: false,
|
|
81
|
+
message: () => `Expected result.content to be an array, but received: ${typeof result.content}`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (result.content.length === 0) {
|
|
85
|
+
return {
|
|
86
|
+
pass: false,
|
|
87
|
+
message: () => 'Expected result.content to have at least one item, but received an empty array',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Check content items
|
|
91
|
+
for (const item of result.content) {
|
|
92
|
+
if (!item.type || !['text', 'image', 'resource'].includes(item.type)) {
|
|
93
|
+
return {
|
|
94
|
+
pass: false,
|
|
95
|
+
message: () => `Expected content item to have a valid type (text, image, or resource), but received: ${item.type}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// If expected values are provided, check them
|
|
100
|
+
if (expected) {
|
|
101
|
+
if (expected.isError !== undefined && result.isError !== expected.isError) {
|
|
102
|
+
return {
|
|
103
|
+
pass: false,
|
|
104
|
+
message: () => `Expected isError to be ${expected.isError}, but received: ${result.isError}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (expected.content && result.content) {
|
|
108
|
+
const expectedLength = expected.content.length;
|
|
109
|
+
const actualLength = result.content.length;
|
|
110
|
+
if (expectedLength !== actualLength) {
|
|
111
|
+
return {
|
|
112
|
+
pass: false,
|
|
113
|
+
message: () => `Expected ${expectedLength} content items, but received: ${actualLength}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
pass: true,
|
|
120
|
+
message: () => 'Expected result not to match MCP tool response structure',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if an error matches the expected MCP error
|
|
125
|
+
*/
|
|
126
|
+
function toMatchMCPError(received, expected) {
|
|
127
|
+
const error = received;
|
|
128
|
+
if (!error || typeof error !== 'object') {
|
|
129
|
+
return {
|
|
130
|
+
pass: false,
|
|
131
|
+
message: () => `Expected a valid MCP error object, but received ${typeof received}`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (expected.code !== undefined && error.code !== expected.code) {
|
|
135
|
+
return {
|
|
136
|
+
pass: false,
|
|
137
|
+
message: () => `Expected error code ${expected.code}, but received: ${error.code}`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (expected.message !== undefined) {
|
|
141
|
+
if (typeof expected.message === 'string') {
|
|
142
|
+
if (error.message !== expected.message) {
|
|
143
|
+
return {
|
|
144
|
+
pass: false,
|
|
145
|
+
message: () => `Expected error message "${expected.message}", but received: "${error.message}"`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Must be RegExp
|
|
151
|
+
const pattern = expected.message;
|
|
152
|
+
if (!pattern.test(error.message || '')) {
|
|
153
|
+
return {
|
|
154
|
+
pass: false,
|
|
155
|
+
message: () => `Expected error message to match ${pattern}, but received: "${error.message}"`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
pass: true,
|
|
162
|
+
message: () => 'Expected error not to match MCP error',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check if the protocol version matches
|
|
167
|
+
*/
|
|
168
|
+
function toHaveMCPProtocolVersion(received, expectedVersion) {
|
|
169
|
+
const obj = received;
|
|
170
|
+
if (!obj || typeof obj !== 'object') {
|
|
171
|
+
return {
|
|
172
|
+
pass: false,
|
|
173
|
+
message: () => `Expected an object with protocolVersion, but received ${typeof received}`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (obj.protocolVersion !== expectedVersion) {
|
|
177
|
+
return {
|
|
178
|
+
pass: false,
|
|
179
|
+
message: () => `Expected protocol version ${expectedVersion}, but received: ${obj.protocolVersion}`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
pass: true,
|
|
184
|
+
message: () => `Expected protocol version not to be ${expectedVersion}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Register all custom matchers with Vitest
|
|
189
|
+
*/
|
|
190
|
+
export function registerVitestMatchers() {
|
|
191
|
+
expect.extend({
|
|
192
|
+
toBeValidMCPTool,
|
|
193
|
+
toBeValidMCPResource,
|
|
194
|
+
toMatchMCPToolResponse,
|
|
195
|
+
toMatchMCPError,
|
|
196
|
+
toHaveMCPProtocolVersion,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Auto-register matchers when imported
|
|
200
|
+
registerVitestMatchers();
|
|
201
|
+
//# sourceMappingURL=vitest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/matchers/vitest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock MCP Server for testing
|
|
3
|
+
*/
|
|
4
|
+
import type { MockToolHandler, MockResourceHandler, MCPTool, MCPResource } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Mock tool definition
|
|
7
|
+
*/
|
|
8
|
+
export interface MockTool {
|
|
9
|
+
name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
inputSchema?: MCPTool['inputSchema'];
|
|
12
|
+
handler: MockToolHandler;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Mock resource definition
|
|
16
|
+
*/
|
|
17
|
+
export interface MockResource {
|
|
18
|
+
uri: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
mimeType?: string;
|
|
22
|
+
handler: MockResourceHandler;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Mock server configuration
|
|
26
|
+
*/
|
|
27
|
+
export interface MockServerConfig {
|
|
28
|
+
tools?: MockTool[];
|
|
29
|
+
resources?: MockResource[];
|
|
30
|
+
serverInfo?: {
|
|
31
|
+
name: string;
|
|
32
|
+
version: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a mock tool
|
|
37
|
+
*/
|
|
38
|
+
export declare function mockTool(name: string, handler: MockToolHandler, options?: {
|
|
39
|
+
description?: string;
|
|
40
|
+
inputSchema?: MCPTool['inputSchema'];
|
|
41
|
+
}): MockTool;
|
|
42
|
+
/**
|
|
43
|
+
* Create a mock resource
|
|
44
|
+
*/
|
|
45
|
+
export declare function mockResource(uri: string, name: string, handler: MockResourceHandler, options?: {
|
|
46
|
+
description?: string;
|
|
47
|
+
mimeType?: string;
|
|
48
|
+
}): MockResource;
|
|
49
|
+
/**
|
|
50
|
+
* Mock MCP Server class
|
|
51
|
+
*/
|
|
52
|
+
export declare class MockMCPServer {
|
|
53
|
+
private tools;
|
|
54
|
+
private resources;
|
|
55
|
+
private serverInfo;
|
|
56
|
+
constructor(config?: MockServerConfig);
|
|
57
|
+
/**
|
|
58
|
+
* Add a tool to the mock server
|
|
59
|
+
*/
|
|
60
|
+
addTool(tool: MockTool): void;
|
|
61
|
+
/**
|
|
62
|
+
* Add a resource to the mock server
|
|
63
|
+
*/
|
|
64
|
+
addResource(resource: MockResource): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get all tools
|
|
67
|
+
*/
|
|
68
|
+
getTools(): MCPTool[];
|
|
69
|
+
/**
|
|
70
|
+
* Get all resources
|
|
71
|
+
*/
|
|
72
|
+
getResources(): MCPResource[];
|
|
73
|
+
/**
|
|
74
|
+
* Call a tool
|
|
75
|
+
*/
|
|
76
|
+
callTool(name: string, args: Record<string, unknown>): Promise<import("../types/index.js").MCPToolResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Read a resource
|
|
79
|
+
*/
|
|
80
|
+
readResource(uri: string): Promise<import("../types/index.js").MCPResourceContent>;
|
|
81
|
+
/**
|
|
82
|
+
* Get server info
|
|
83
|
+
*/
|
|
84
|
+
getServerInfo(): {
|
|
85
|
+
name: string;
|
|
86
|
+
version: string;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a mock MCP server
|
|
91
|
+
*/
|
|
92
|
+
export declare function createMockMCPServer(config?: MockServerConfig): MockMCPServer;
|
|
93
|
+
//# sourceMappingURL=MockServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockServer.d.ts","sourceRoot":"","sources":["../../src/mocks/MockServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpG;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACtC,GACA,QAAQ,CAUV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,YAAY,CAQd;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,UAAU,CAAoC;gBAE1C,MAAM,GAAE,gBAAqB;IAqBzC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI7B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIzC;;OAEG;IACH,QAAQ,IAAI,OAAO,EAAE;IAQrB;;OAEG;IACH,YAAY,IAAI,WAAW,EAAE;IAS7B;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ1D;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM;IAQ9B;;OAEG;IACH,aAAa;cArFe,MAAM;iBAAW,MAAM;;CAwFpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,gBAAqB,GAAG,aAAa,CAEhF"}
|