@slbdn/mcp-tester 1.0.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.
@@ -0,0 +1,68 @@
1
+ import { CreateMessageRequestParams, Tool, Resource, Prompt, CallToolResult, ReadResourceResult, GetPromptResult, CreateMessageResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { LogLevel } from '../utils/logger.js';
3
+ export interface MCPServerConfig {
4
+ command: string;
5
+ args?: string[];
6
+ env?: Record<string, string | undefined>;
7
+ startupDelay?: number;
8
+ }
9
+ export interface MCPClientOptions {
10
+ name?: string;
11
+ version?: string;
12
+ timeout?: number;
13
+ logLevel?: LogLevel;
14
+ enableProtocolLogging?: boolean;
15
+ retries?: number;
16
+ retryDelay?: number;
17
+ startupDelay?: number;
18
+ }
19
+ export interface ToolCallOptions {
20
+ name: string;
21
+ arguments?: Record<string, unknown>;
22
+ timeout?: number;
23
+ retries?: number;
24
+ }
25
+ export interface NotificationHandler {
26
+ onLoggingMessage?: (level: string, data: string) => void;
27
+ onResourceListChanged?: () => void;
28
+ }
29
+ export interface RetryOptions {
30
+ maxAttempts: number;
31
+ baseDelay: number;
32
+ maxDelay: number;
33
+ backoffMultiplier: number;
34
+ }
35
+ export declare class MCPClient {
36
+ private client;
37
+ private transport;
38
+ private options;
39
+ private notificationHandlers;
40
+ private logger;
41
+ private retryOptions;
42
+ constructor(options?: MCPClientOptions);
43
+ start(config: MCPServerConfig): Promise<void>;
44
+ stop(): Promise<void>;
45
+ private setupNotificationHandlers;
46
+ listTools(): Promise<Tool[]>;
47
+ callTool(options: ToolCallOptions): Promise<CallToolResult>;
48
+ listResources(): Promise<Resource[]>;
49
+ readResource(uri: string): Promise<ReadResourceResult>;
50
+ listPrompts(): Promise<Prompt[]>;
51
+ getPrompt(name: string, args?: Record<string, string>): Promise<GetPromptResult>;
52
+ requestSampling(request: CreateMessageRequestParams): Promise<CreateMessageResult>;
53
+ setElicitationHandler(handler: (request: {
54
+ params: {
55
+ mode?: string;
56
+ [key: string]: unknown;
57
+ };
58
+ }) => Promise<{
59
+ action: 'accept' | 'decline' | 'cancel';
60
+ content?: Record<string, unknown>;
61
+ }>): Promise<void>;
62
+ setNotificationHandlers(handlers: NotificationHandler): void;
63
+ isConnected(): boolean;
64
+ setLogLevel(level: LogLevel): void;
65
+ private withRetry;
66
+ private sleep;
67
+ }
68
+ //# sourceMappingURL=MCPClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPClient.d.ts","sourceRoot":"","sources":["../../src/client/MCPClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,329 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ // Note: Server process is managed by StdioClientTransport, no manual spawn needed
4
+ import { ListToolsResultSchema, CallToolResultSchema, ListResourcesResultSchema, ReadResourceResultSchema, ListPromptsResultSchema, GetPromptResultSchema, ElicitRequestSchema, LoggingMessageNotificationSchema, ResourceListChangedNotificationSchema, CreateMessageResultSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { ConsoleLogger, NoOpLogger } from '../utils/logger.js';
6
+ import { mergeEnvironments } from '../utils/env.js';
7
+ import { MCPClientError, MCPNotStartedError, MCPAlreadyStartedError, MCPServerError, } from '../utils/errors.js';
8
+ const DEFAULT_RETRY_OPTIONS = {
9
+ maxAttempts: 3,
10
+ baseDelay: 1000,
11
+ maxDelay: 10000,
12
+ backoffMultiplier: 2,
13
+ };
14
+ export class MCPClient {
15
+ client = null;
16
+ transport = null;
17
+ options;
18
+ notificationHandlers;
19
+ logger;
20
+ retryOptions;
21
+ constructor(options = {}) {
22
+ this.options = {
23
+ name: options.name || 'mcp-test-client',
24
+ version: options.version || '1.0.0',
25
+ timeout: options.timeout || 30000,
26
+ logLevel: options.logLevel || 'info',
27
+ enableProtocolLogging: options.enableProtocolLogging || false,
28
+ retries: options.retries ?? 0,
29
+ retryDelay: options.retryDelay ?? 1000,
30
+ startupDelay: options.startupDelay ?? 500,
31
+ };
32
+ this.notificationHandlers = {};
33
+ this.retryOptions = {
34
+ ...DEFAULT_RETRY_OPTIONS,
35
+ maxAttempts: (this.options.retries ?? 0) > 0 ? (this.options.retries ?? 0) + 1 : 1,
36
+ baseDelay: this.options.retryDelay ?? DEFAULT_RETRY_OPTIONS.baseDelay,
37
+ };
38
+ this.logger =
39
+ this.options.logLevel === 'none'
40
+ ? new NoOpLogger()
41
+ : new ConsoleLogger({ level: this.options.logLevel, prefix: 'MCPClient' });
42
+ }
43
+ async start(config) {
44
+ if (this.client) {
45
+ throw new MCPAlreadyStartedError();
46
+ }
47
+ this.logger.info(`Starting MCP client: ${this.options.name} v${this.options.version}`);
48
+ this.logger.debug(`Server command: ${config.command}`, config.args || []);
49
+ const mergedEnv = mergeEnvironments(process.env, config.env);
50
+ try {
51
+ // Use StdioClientTransport to spawn the server process (single process)
52
+ this.transport = new StdioClientTransport({
53
+ command: config.command,
54
+ args: config.args || [],
55
+ env: mergedEnv,
56
+ });
57
+ this.client = new Client({
58
+ name: this.options.name || 'mcp-test-client',
59
+ version: this.options.version || '1.0.0',
60
+ }, {
61
+ capabilities: {
62
+ roots: {
63
+ listChanged: true,
64
+ },
65
+ sampling: {},
66
+ elicitation: {
67
+ form: {},
68
+ },
69
+ },
70
+ });
71
+ this.client.onerror = (error) => {
72
+ this.logger.error('Client error:', error);
73
+ };
74
+ this.setupNotificationHandlers();
75
+ await this.client.connect(this.transport);
76
+ this.logger.info('Successfully connected to MCP server');
77
+ }
78
+ catch (error) {
79
+ this.logger.error('Failed to start MCP client:', error);
80
+ if (this.transport) {
81
+ try {
82
+ await this.transport.close();
83
+ }
84
+ catch {
85
+ // ignore cleanup errors
86
+ }
87
+ this.transport = null;
88
+ }
89
+ this.client = null;
90
+ throw error;
91
+ }
92
+ }
93
+ async stop() {
94
+ this.logger.info('Stopping MCP client');
95
+ if (this.client) {
96
+ try {
97
+ await this.client.close();
98
+ }
99
+ catch (error) {
100
+ this.logger.warn('Error closing client:', error);
101
+ }
102
+ this.client = null;
103
+ }
104
+ if (this.transport) {
105
+ try {
106
+ await this.transport.close();
107
+ }
108
+ catch (error) {
109
+ this.logger.warn('Error closing transport:', error);
110
+ }
111
+ this.transport = null;
112
+ }
113
+ this.logger.info('MCP client stopped');
114
+ }
115
+ setupNotificationHandlers() {
116
+ if (!this.client)
117
+ return;
118
+ this.client.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {
119
+ if (this.notificationHandlers.onLoggingMessage) {
120
+ this.notificationHandlers.onLoggingMessage(notification.params.level, String(notification.params.data));
121
+ }
122
+ this.logger.debug(`[${notification.params.level}] ${String(notification.params.data).substring(0, 100)}`);
123
+ });
124
+ this.client.setNotificationHandler(ResourceListChangedNotificationSchema, async () => {
125
+ if (this.notificationHandlers.onResourceListChanged) {
126
+ this.notificationHandlers.onResourceListChanged();
127
+ }
128
+ this.logger.debug('Resource list changed notification received');
129
+ });
130
+ }
131
+ async listTools() {
132
+ if (!this.client) {
133
+ throw new MCPNotStartedError();
134
+ }
135
+ const request = {
136
+ method: 'tools/list',
137
+ params: {},
138
+ };
139
+ if (this.options.enableProtocolLogging) {
140
+ this.logger.debug('Request:', request);
141
+ }
142
+ try {
143
+ const result = await this.withRetry(async () => this.client.request(request, ListToolsResultSchema));
144
+ const tools = result.tools || [];
145
+ this.logger.debug(`Listed ${tools.length} tools`);
146
+ return tools;
147
+ }
148
+ catch (error) {
149
+ this.logger.error('Failed to list tools:', error);
150
+ throw new MCPServerError(`Failed to list tools: ${error instanceof Error ? error.message : String(error)}`);
151
+ }
152
+ }
153
+ async callTool(options) {
154
+ if (!this.client) {
155
+ throw new MCPNotStartedError();
156
+ }
157
+ const request = {
158
+ method: 'tools/call',
159
+ params: {
160
+ name: options.name,
161
+ arguments: options.arguments || {},
162
+ },
163
+ };
164
+ if (this.options.enableProtocolLogging) {
165
+ this.logger.debug(`Calling tool: ${options.name}`, options.arguments);
166
+ }
167
+ try {
168
+ const timeout = options.timeout ?? this.options.timeout;
169
+ const result = await this.withRetry(async () => this.client.request(request, CallToolResultSchema, { timeout }), options.retries);
170
+ this.logger.debug(`Tool ${options.name} executed successfully`);
171
+ return result;
172
+ }
173
+ catch (error) {
174
+ this.logger.error(`Failed to call tool ${options.name}:`, error);
175
+ throw new MCPServerError(`Failed to call tool ${options.name}: ${error instanceof Error ? error.message : String(error)}`);
176
+ }
177
+ }
178
+ async listResources() {
179
+ if (!this.client) {
180
+ throw new MCPNotStartedError();
181
+ }
182
+ const request = {
183
+ method: 'resources/list',
184
+ params: {},
185
+ };
186
+ if (this.options.enableProtocolLogging) {
187
+ this.logger.debug('Request:', request);
188
+ }
189
+ try {
190
+ const result = await this.withRetry(async () => this.client.request(request, ListResourcesResultSchema));
191
+ const resources = result.resources || [];
192
+ this.logger.debug(`Listed ${resources.length} resources`);
193
+ return resources;
194
+ }
195
+ catch (error) {
196
+ this.logger.error('Failed to list resources:', error);
197
+ throw new MCPServerError(`Failed to list resources: ${error instanceof Error ? error.message : String(error)}`);
198
+ }
199
+ }
200
+ async readResource(uri) {
201
+ if (!this.client) {
202
+ throw new MCPNotStartedError();
203
+ }
204
+ const request = {
205
+ method: 'resources/read',
206
+ params: { uri },
207
+ };
208
+ if (this.options.enableProtocolLogging) {
209
+ this.logger.debug(`Reading resource: ${uri}`);
210
+ }
211
+ try {
212
+ const result = await this.withRetry(async () => this.client.request(request, ReadResourceResultSchema));
213
+ this.logger.debug(`Resource ${uri} read successfully`);
214
+ return result;
215
+ }
216
+ catch (error) {
217
+ this.logger.error(`Failed to read resource ${uri}:`, error);
218
+ throw new MCPServerError(`Failed to read resource ${uri}: ${error instanceof Error ? error.message : String(error)}`);
219
+ }
220
+ }
221
+ async listPrompts() {
222
+ if (!this.client) {
223
+ throw new MCPNotStartedError();
224
+ }
225
+ const request = {
226
+ method: 'prompts/list',
227
+ params: {},
228
+ };
229
+ if (this.options.enableProtocolLogging) {
230
+ this.logger.debug('Request:', request);
231
+ }
232
+ try {
233
+ const result = await this.withRetry(async () => this.client.request(request, ListPromptsResultSchema));
234
+ const prompts = result.prompts || [];
235
+ this.logger.debug(`Listed ${prompts.length} prompts`);
236
+ return prompts;
237
+ }
238
+ catch (error) {
239
+ this.logger.error('Failed to list prompts:', error);
240
+ throw new MCPServerError(`Failed to list prompts: ${error instanceof Error ? error.message : String(error)}`);
241
+ }
242
+ }
243
+ async getPrompt(name, args) {
244
+ if (!this.client) {
245
+ throw new MCPNotStartedError();
246
+ }
247
+ const request = {
248
+ method: 'prompts/get',
249
+ params: {
250
+ name,
251
+ arguments: args || {},
252
+ },
253
+ };
254
+ if (this.options.enableProtocolLogging) {
255
+ this.logger.debug(`Getting prompt: ${name}`, args);
256
+ }
257
+ try {
258
+ const result = await this.withRetry(async () => this.client.request(request, GetPromptResultSchema));
259
+ this.logger.debug(`Prompt ${name} retrieved successfully`);
260
+ return result;
261
+ }
262
+ catch (error) {
263
+ this.logger.error(`Failed to get prompt ${name}:`, error);
264
+ throw new MCPServerError(`Failed to get prompt ${name}: ${error instanceof Error ? error.message : String(error)}`);
265
+ }
266
+ }
267
+ async requestSampling(request) {
268
+ if (!this.client) {
269
+ throw new MCPNotStartedError();
270
+ }
271
+ if (this.options.enableProtocolLogging) {
272
+ this.logger.debug('Sampling request:', request);
273
+ }
274
+ try {
275
+ const result = await this.withRetry(async () => this.client.request({
276
+ method: 'sampling/createMessage',
277
+ params: request,
278
+ }, CreateMessageResultSchema));
279
+ this.logger.debug('Sampling completed successfully');
280
+ return result;
281
+ }
282
+ catch (error) {
283
+ this.logger.error('Failed to request sampling:', error);
284
+ throw new MCPServerError(`Failed to request sampling: ${error instanceof Error ? error.message : String(error)}`);
285
+ }
286
+ }
287
+ async setElicitationHandler(handler) {
288
+ if (!this.client) {
289
+ return;
290
+ }
291
+ this.client.setRequestHandler(ElicitRequestSchema, handler);
292
+ this.logger.debug('Elicitation handler configured');
293
+ }
294
+ setNotificationHandlers(handlers) {
295
+ this.notificationHandlers = handlers;
296
+ this.setupNotificationHandlers();
297
+ this.logger.debug('Notification handlers updated');
298
+ }
299
+ isConnected() {
300
+ return this.client !== null && this.transport !== null;
301
+ }
302
+ setLogLevel(level) {
303
+ this.options.logLevel = level;
304
+ this.logger =
305
+ level === 'none' ? new NoOpLogger() : new ConsoleLogger({ level, prefix: 'MCPClient' });
306
+ this.logger.debug(`Log level changed to ${level}`);
307
+ }
308
+ async withRetry(operation, retries) {
309
+ const maxAttempts = retries !== undefined ? retries + 1 : this.retryOptions.maxAttempts;
310
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
311
+ try {
312
+ return await operation();
313
+ }
314
+ catch (error) {
315
+ if (attempt === maxAttempts) {
316
+ throw error;
317
+ }
318
+ const delay = Math.min(this.retryOptions.baseDelay * Math.pow(this.retryOptions.backoffMultiplier, attempt - 1), this.retryOptions.maxDelay);
319
+ this.logger.warn(`Attempt ${attempt} failed, retrying in ${delay}ms...`, error);
320
+ await this.sleep(delay);
321
+ }
322
+ }
323
+ throw new MCPClientError('Retry logic exhausted without result');
324
+ }
325
+ sleep(ms) {
326
+ return new Promise((resolve) => setTimeout(resolve, ms));
327
+ }
328
+ }
329
+ //# sourceMappingURL=MCPClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPClient.js","sourceRoot":"","sources":["../../src/client/MCPClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { MCPClient } from './MCPClient.js';
2
+ export type { MCPServerConfig, MCPClientOptions, ToolCallOptions, NotificationHandler, RetryOptions, } from './MCPClient.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MCPClient } from './MCPClient.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './client/index.js';
2
+ export { MCPClientError, MCPTimeoutError, MCPConnectionError, MCPNotStartedError, MCPAlreadyStartedError, MCPServerError, } from './utils/errors.js';
3
+ export type { Logger, LoggerOptions, LogLevel } from './utils/logger.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './client/index.js';
2
+ export { MCPClientError, MCPTimeoutError, MCPConnectionError, MCPNotStartedError, MCPAlreadyStartedError, MCPServerError, } from './utils/errors.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function filterEnvironmentVariables(env?: Record<string, string | undefined>): Record<string, string>;
2
+ export declare function sleep(ms: number): Promise<void>;
3
+ export declare function mergeEnvironments(base?: Record<string, string | undefined>, additional?: Record<string, string | undefined>): Record<string, string>;
4
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,wBAAgB,0BAA0B,CACxC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxB"}
@@ -0,0 +1,15 @@
1
+ export function filterEnvironmentVariables(env) {
2
+ if (!env)
3
+ return {};
4
+ return Object.fromEntries(Object.entries(env).filter(([_, value]) => value !== undefined));
5
+ }
6
+ export function sleep(ms) {
7
+ return new Promise((resolve) => setTimeout(resolve, ms));
8
+ }
9
+ export function mergeEnvironments(base, additional) {
10
+ return {
11
+ ...filterEnvironmentVariables(base),
12
+ ...filterEnvironmentVariables(additional),
13
+ };
14
+ }
15
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B,CACxC,GAAwC;IAExC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CACtC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAyC,EACzC,UAA+C;IAE/C,OAAO;QACL,GAAG,0BAA0B,CAAC,IAAI,CAAC;QACnC,GAAG,0BAA0B,CAAC,UAAU,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare class MCPClientError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code?: string);
4
+ }
5
+ export declare class MCPTimeoutError extends MCPClientError {
6
+ readonly timeout: number;
7
+ constructor(message: string, timeout: number);
8
+ }
9
+ export declare class MCPConnectionError extends MCPClientError {
10
+ constructor(message: string);
11
+ }
12
+ export declare class MCPNotStartedError extends MCPClientError {
13
+ constructor();
14
+ }
15
+ export declare class MCPAlreadyStartedError extends MCPClientError {
16
+ constructor();
17
+ }
18
+ export declare class MCPServerError extends MCPClientError {
19
+ constructor(message: string);
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAA2B;CAM/D;AAED,qBAAa,eAAgB,SAAQ,cAAc;IACjD,SAAgB,OAAO,EAAE,MAAM,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAM7C;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,kBAAmB,SAAQ,cAAc;;CAMrD;AAED,qBAAa,sBAAuB,SAAQ,cAAc;;CAMzD;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,EAAE,MAAM;CAK5B"}
@@ -0,0 +1,47 @@
1
+ export class MCPClientError extends Error {
2
+ code;
3
+ constructor(message, code = 'MCP_CLIENT_ERROR') {
4
+ super(message);
5
+ this.name = 'MCPClientError';
6
+ this.code = code;
7
+ Error.captureStackTrace(this, MCPClientError);
8
+ }
9
+ }
10
+ export class MCPTimeoutError extends MCPClientError {
11
+ timeout;
12
+ constructor(message, timeout) {
13
+ super(message, 'MCP_TIMEOUT_ERROR');
14
+ this.name = 'MCPTimeoutError';
15
+ this.timeout = timeout;
16
+ Error.captureStackTrace(this, MCPTimeoutError);
17
+ }
18
+ }
19
+ export class MCPConnectionError extends MCPClientError {
20
+ constructor(message) {
21
+ super(message, 'MCP_CONNECTION_ERROR');
22
+ this.name = 'MCPConnectionError';
23
+ Error.captureStackTrace(this, MCPConnectionError);
24
+ }
25
+ }
26
+ export class MCPNotStartedError extends MCPClientError {
27
+ constructor() {
28
+ super('Client not started. Call start() before using client methods.', 'MCP_NOT_STARTED');
29
+ this.name = 'MCPNotStartedError';
30
+ Error.captureStackTrace(this, MCPNotStartedError);
31
+ }
32
+ }
33
+ export class MCPAlreadyStartedError extends MCPClientError {
34
+ constructor() {
35
+ super('Client already started. Call stop() before starting again.', 'MCP_ALREADY_STARTED');
36
+ this.name = 'MCPAlreadyStartedError';
37
+ Error.captureStackTrace(this, MCPAlreadyStartedError);
38
+ }
39
+ }
40
+ export class MCPServerError extends MCPClientError {
41
+ constructor(message) {
42
+ super(message, 'MCP_SERVER_ERROR');
43
+ this.name = 'MCPServerError';
44
+ Error.captureStackTrace(this, MCPServerError);
45
+ }
46
+ }
47
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,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,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjC,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,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,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,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,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"}
@@ -0,0 +1,29 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
2
+ export interface LoggerOptions {
3
+ level?: LogLevel;
4
+ prefix?: string;
5
+ }
6
+ export interface Logger {
7
+ debug(...args: unknown[]): void;
8
+ info(...args: unknown[]): void;
9
+ warn(...args: unknown[]): void;
10
+ error(...args: unknown[]): void;
11
+ }
12
+ export declare class ConsoleLogger implements Logger {
13
+ private level;
14
+ private prefix;
15
+ constructor(options?: LoggerOptions);
16
+ private shouldLog;
17
+ private format;
18
+ debug(...args: unknown[]): void;
19
+ info(...args: unknown[]): void;
20
+ warn(...args: unknown[]): void;
21
+ error(...args: unknown[]): void;
22
+ }
23
+ export declare class NoOpLogger implements Logger {
24
+ debug(): void;
25
+ info(): void;
26
+ warn(): void;
27
+ error(): void;
28
+ }
29
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +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;IAM/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;CAKhC;AAED,qBAAa,UAAW,YAAW,MAAM;IACvC,KAAK,IAAI,IAAI;IACb,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;IACZ,KAAK,IAAI,IAAI;CACd"}
@@ -0,0 +1,49 @@
1
+ const LOG_LEVELS = {
2
+ debug: 0,
3
+ info: 1,
4
+ warn: 2,
5
+ error: 3,
6
+ none: 99,
7
+ };
8
+ export class ConsoleLogger {
9
+ level;
10
+ prefix;
11
+ constructor(options = {}) {
12
+ this.level = LOG_LEVELS[options.level || 'info'];
13
+ this.prefix = options.prefix || '';
14
+ }
15
+ shouldLog(messageLevel) {
16
+ return LOG_LEVELS[messageLevel] >= this.level;
17
+ }
18
+ format(level, args) {
19
+ const prefix = this.prefix ? `[${this.prefix}] ` : '';
20
+ return [`${prefix}${level.toUpperCase()}:`, ...args];
21
+ }
22
+ debug(...args) {
23
+ if (this.shouldLog('debug')) {
24
+ console.debug(...this.format('debug', args));
25
+ }
26
+ }
27
+ info(...args) {
28
+ if (this.shouldLog('info')) {
29
+ console.info(...this.format('info', args));
30
+ }
31
+ }
32
+ warn(...args) {
33
+ if (this.shouldLog('warn')) {
34
+ console.warn(...this.format('warn', args));
35
+ }
36
+ }
37
+ error(...args) {
38
+ if (this.shouldLog('error')) {
39
+ console.error(...this.format('error', args));
40
+ }
41
+ }
42
+ }
43
+ export class NoOpLogger {
44
+ debug() { }
45
+ info() { }
46
+ warn() { }
47
+ error() { }
48
+ }
49
+ //# sourceMappingURL=logger.js.map