@claude-flow/mcp 3.0.0-alpha.1
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/.agentic-flow/intelligence.json +16 -0
- package/README.md +428 -0
- package/__tests__/integration.test.ts +449 -0
- package/__tests__/mcp.test.ts +641 -0
- package/dist/connection-pool.d.ts +36 -0
- package/dist/connection-pool.d.ts.map +1 -0
- package/dist/connection-pool.js +273 -0
- package/dist/connection-pool.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +146 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +318 -0
- package/dist/oauth.js.map +1 -0
- package/dist/prompt-registry.d.ts +90 -0
- package/dist/prompt-registry.d.ts.map +1 -0
- package/dist/prompt-registry.js +209 -0
- package/dist/prompt-registry.js.map +1 -0
- package/dist/rate-limiter.d.ts +86 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +197 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/resource-registry.d.ts +144 -0
- package/dist/resource-registry.d.ts.map +1 -0
- package/dist/resource-registry.js +405 -0
- package/dist/resource-registry.js.map +1 -0
- package/dist/sampling.d.ts +102 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +268 -0
- package/dist/sampling.js.map +1 -0
- package/dist/schema-validator.d.ts +30 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +182 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/server.d.ts +122 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +829 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +55 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +252 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/task-manager.d.ts +81 -0
- package/dist/task-manager.d.ts.map +1 -0
- package/dist/task-manager.js +337 -0
- package/dist/task-manager.js.map +1 -0
- package/dist/tool-registry.d.ts +88 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +353 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/transport/http.d.ts +55 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +446 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +50 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +181 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/stdio.d.ts +43 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +194 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/transport/websocket.d.ts +65 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +314 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types.d.ts +473 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +40 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
- package/src/connection-pool.ts +344 -0
- package/src/index.ts +253 -0
- package/src/oauth.ts +447 -0
- package/src/prompt-registry.ts +296 -0
- package/src/rate-limiter.ts +266 -0
- package/src/resource-registry.ts +530 -0
- package/src/sampling.ts +363 -0
- package/src/schema-validator.ts +213 -0
- package/src/server.ts +1134 -0
- package/src/session-manager.ts +339 -0
- package/src/task-manager.ts +427 -0
- package/src/tool-registry.ts +475 -0
- package/src/transport/http.ts +532 -0
- package/src/transport/index.ts +233 -0
- package/src/transport/stdio.ts +252 -0
- package/src/transport/websocket.ts +396 -0
- package/src/types.ts +664 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +13 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - Standalone Types
|
|
3
|
+
*
|
|
4
|
+
* Complete type definitions for MCP server implementation
|
|
5
|
+
* Zero external @claude-flow dependencies
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Core Protocol Types
|
|
10
|
+
// ============================================================================
|
|
11
|
+
|
|
12
|
+
export type JsonRpcVersion = '2.0';
|
|
13
|
+
|
|
14
|
+
export interface MCPProtocolVersion {
|
|
15
|
+
major: number;
|
|
16
|
+
minor: number;
|
|
17
|
+
patch: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type RequestId = string | number | null;
|
|
21
|
+
|
|
22
|
+
export interface MCPMessage {
|
|
23
|
+
jsonrpc: JsonRpcVersion;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface MCPRequest extends MCPMessage {
|
|
27
|
+
id: RequestId;
|
|
28
|
+
method: string;
|
|
29
|
+
params?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface MCPNotification extends MCPMessage {
|
|
33
|
+
method: string;
|
|
34
|
+
params?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MCPError {
|
|
38
|
+
code: number;
|
|
39
|
+
message: string;
|
|
40
|
+
data?: unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface MCPResponse extends MCPMessage {
|
|
44
|
+
id: RequestId;
|
|
45
|
+
result?: unknown;
|
|
46
|
+
error?: MCPError;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Server Configuration
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
export type TransportType = 'stdio' | 'http' | 'websocket' | 'in-process';
|
|
54
|
+
|
|
55
|
+
export type AuthMethod = 'token' | 'oauth' | 'api-key' | 'none';
|
|
56
|
+
|
|
57
|
+
export interface AuthConfig {
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
method: AuthMethod;
|
|
60
|
+
tokens?: string[];
|
|
61
|
+
apiKeys?: string[];
|
|
62
|
+
jwtSecret?: string;
|
|
63
|
+
oauth?: {
|
|
64
|
+
clientId: string;
|
|
65
|
+
clientSecret: string;
|
|
66
|
+
authorizationUrl: string;
|
|
67
|
+
tokenUrl: string;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface LoadBalancerConfig {
|
|
72
|
+
enabled: boolean;
|
|
73
|
+
maxConcurrentRequests: number;
|
|
74
|
+
rateLimit?: {
|
|
75
|
+
requestsPerSecond: number;
|
|
76
|
+
burstSize: number;
|
|
77
|
+
};
|
|
78
|
+
circuitBreaker?: {
|
|
79
|
+
failureThreshold: number;
|
|
80
|
+
resetTimeout: number;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface ConnectionPoolConfig {
|
|
85
|
+
maxConnections: number;
|
|
86
|
+
minConnections: number;
|
|
87
|
+
idleTimeout: number;
|
|
88
|
+
acquireTimeout: number;
|
|
89
|
+
maxWaitingClients: number;
|
|
90
|
+
evictionRunInterval: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface MCPServerConfig {
|
|
94
|
+
name: string;
|
|
95
|
+
version: string;
|
|
96
|
+
transport: TransportType;
|
|
97
|
+
host?: string;
|
|
98
|
+
port?: number;
|
|
99
|
+
tlsEnabled?: boolean;
|
|
100
|
+
tlsCert?: string;
|
|
101
|
+
tlsKey?: string;
|
|
102
|
+
auth?: AuthConfig;
|
|
103
|
+
loadBalancer?: LoadBalancerConfig;
|
|
104
|
+
connectionPool?: ConnectionPoolConfig;
|
|
105
|
+
corsEnabled?: boolean;
|
|
106
|
+
corsOrigins?: string[];
|
|
107
|
+
maxRequestSize?: number;
|
|
108
|
+
requestTimeout?: number;
|
|
109
|
+
enableMetrics?: boolean;
|
|
110
|
+
enableCaching?: boolean;
|
|
111
|
+
cacheTTL?: number;
|
|
112
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ============================================================================
|
|
116
|
+
// Session Types
|
|
117
|
+
// ============================================================================
|
|
118
|
+
|
|
119
|
+
export type SessionState = 'created' | 'initializing' | 'ready' | 'closing' | 'closed' | 'error';
|
|
120
|
+
|
|
121
|
+
export interface MCPSession {
|
|
122
|
+
id: string;
|
|
123
|
+
state: SessionState;
|
|
124
|
+
transport: TransportType;
|
|
125
|
+
createdAt: Date;
|
|
126
|
+
lastActivityAt: Date;
|
|
127
|
+
isInitialized: boolean;
|
|
128
|
+
isAuthenticated: boolean;
|
|
129
|
+
clientInfo?: MCPClientInfo;
|
|
130
|
+
protocolVersion?: MCPProtocolVersion;
|
|
131
|
+
capabilities?: MCPCapabilities;
|
|
132
|
+
metadata?: Record<string, unknown>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface MCPClientInfo {
|
|
136
|
+
name: string;
|
|
137
|
+
version: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Capability Types
|
|
142
|
+
// ============================================================================
|
|
143
|
+
|
|
144
|
+
export interface MCPCapabilities {
|
|
145
|
+
logging?: {
|
|
146
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
147
|
+
};
|
|
148
|
+
tools?: {
|
|
149
|
+
listChanged: boolean;
|
|
150
|
+
};
|
|
151
|
+
resources?: {
|
|
152
|
+
listChanged: boolean;
|
|
153
|
+
subscribe: boolean;
|
|
154
|
+
};
|
|
155
|
+
prompts?: {
|
|
156
|
+
listChanged: boolean;
|
|
157
|
+
};
|
|
158
|
+
sampling?: Record<string, unknown>;
|
|
159
|
+
experimental?: Record<string, unknown>;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export interface MCPInitializeParams {
|
|
163
|
+
protocolVersion: MCPProtocolVersion;
|
|
164
|
+
capabilities: MCPCapabilities;
|
|
165
|
+
clientInfo: MCPClientInfo;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface MCPInitializeResult {
|
|
169
|
+
protocolVersion: MCPProtocolVersion;
|
|
170
|
+
capabilities: MCPCapabilities;
|
|
171
|
+
serverInfo: {
|
|
172
|
+
name: string;
|
|
173
|
+
version: string;
|
|
174
|
+
};
|
|
175
|
+
instructions?: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// Tool Types
|
|
180
|
+
// ============================================================================
|
|
181
|
+
|
|
182
|
+
export interface JSONSchema {
|
|
183
|
+
type: string;
|
|
184
|
+
properties?: Record<string, JSONSchema>;
|
|
185
|
+
required?: string[];
|
|
186
|
+
items?: JSONSchema;
|
|
187
|
+
enum?: string[];
|
|
188
|
+
description?: string;
|
|
189
|
+
default?: unknown;
|
|
190
|
+
minimum?: number;
|
|
191
|
+
maximum?: number;
|
|
192
|
+
minLength?: number;
|
|
193
|
+
maxLength?: number;
|
|
194
|
+
pattern?: string;
|
|
195
|
+
additionalProperties?: boolean | JSONSchema;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface ToolContext {
|
|
199
|
+
sessionId: string;
|
|
200
|
+
requestId?: RequestId;
|
|
201
|
+
orchestrator?: unknown;
|
|
202
|
+
swarmCoordinator?: unknown;
|
|
203
|
+
agentManager?: unknown;
|
|
204
|
+
resourceManager?: unknown;
|
|
205
|
+
messageBus?: unknown;
|
|
206
|
+
monitor?: unknown;
|
|
207
|
+
metadata?: Record<string, unknown>;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export type ToolHandler<TInput = unknown, TOutput = unknown> = (
|
|
211
|
+
input: TInput,
|
|
212
|
+
context?: ToolContext
|
|
213
|
+
) => Promise<TOutput>;
|
|
214
|
+
|
|
215
|
+
export interface MCPTool<TInput = unknown, TOutput = unknown> {
|
|
216
|
+
name: string;
|
|
217
|
+
description: string;
|
|
218
|
+
inputSchema: JSONSchema;
|
|
219
|
+
handler: ToolHandler<TInput, TOutput>;
|
|
220
|
+
category?: string;
|
|
221
|
+
tags?: string[];
|
|
222
|
+
version?: string;
|
|
223
|
+
deprecated?: boolean;
|
|
224
|
+
cacheable?: boolean;
|
|
225
|
+
cacheTTL?: number;
|
|
226
|
+
timeout?: number;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export interface ToolCallResult {
|
|
230
|
+
content: Array<{
|
|
231
|
+
type: 'text' | 'image' | 'resource';
|
|
232
|
+
text?: string;
|
|
233
|
+
data?: string;
|
|
234
|
+
mimeType?: string;
|
|
235
|
+
}>;
|
|
236
|
+
isError: boolean;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export interface ToolRegistrationOptions {
|
|
240
|
+
override?: boolean;
|
|
241
|
+
validate?: boolean;
|
|
242
|
+
preload?: boolean;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// ============================================================================
|
|
246
|
+
// Resource Types (MCP 2025-11-25)
|
|
247
|
+
// ============================================================================
|
|
248
|
+
|
|
249
|
+
export interface MCPResource {
|
|
250
|
+
uri: string;
|
|
251
|
+
name: string;
|
|
252
|
+
description?: string;
|
|
253
|
+
mimeType?: string;
|
|
254
|
+
annotations?: ContentAnnotations;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export interface ResourceContent {
|
|
258
|
+
uri: string;
|
|
259
|
+
mimeType?: string;
|
|
260
|
+
text?: string;
|
|
261
|
+
blob?: string; // base64 encoded
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export interface ResourceTemplate {
|
|
265
|
+
uriTemplate: string;
|
|
266
|
+
name: string;
|
|
267
|
+
description?: string;
|
|
268
|
+
mimeType?: string;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export interface ResourceListResult {
|
|
272
|
+
resources: MCPResource[];
|
|
273
|
+
nextCursor?: string;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export interface ResourceReadResult {
|
|
277
|
+
contents: ResourceContent[];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// ============================================================================
|
|
281
|
+
// Prompt Types (MCP 2025-11-25)
|
|
282
|
+
// ============================================================================
|
|
283
|
+
|
|
284
|
+
export interface PromptArgument {
|
|
285
|
+
name: string;
|
|
286
|
+
description?: string;
|
|
287
|
+
required?: boolean;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export interface MCPPrompt {
|
|
291
|
+
name: string;
|
|
292
|
+
title?: string;
|
|
293
|
+
description?: string;
|
|
294
|
+
arguments?: PromptArgument[];
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export type PromptRole = 'user' | 'assistant';
|
|
298
|
+
|
|
299
|
+
export interface ContentAnnotations {
|
|
300
|
+
audience?: Array<'user' | 'assistant'>;
|
|
301
|
+
priority?: number;
|
|
302
|
+
createdAt?: string;
|
|
303
|
+
modifiedAt?: string;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export interface TextContent {
|
|
307
|
+
type: 'text';
|
|
308
|
+
text: string;
|
|
309
|
+
annotations?: ContentAnnotations;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export interface ImageContent {
|
|
313
|
+
type: 'image';
|
|
314
|
+
data: string; // base64
|
|
315
|
+
mimeType: string;
|
|
316
|
+
annotations?: ContentAnnotations;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export interface AudioContent {
|
|
320
|
+
type: 'audio';
|
|
321
|
+
data: string; // base64
|
|
322
|
+
mimeType: string;
|
|
323
|
+
annotations?: ContentAnnotations;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export interface EmbeddedResource {
|
|
327
|
+
type: 'resource';
|
|
328
|
+
resource: ResourceContent;
|
|
329
|
+
annotations?: ContentAnnotations;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
export type PromptContent = TextContent | ImageContent | AudioContent | EmbeddedResource;
|
|
333
|
+
|
|
334
|
+
export interface PromptMessage {
|
|
335
|
+
role: PromptRole;
|
|
336
|
+
content: PromptContent;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
export interface PromptListResult {
|
|
340
|
+
prompts: MCPPrompt[];
|
|
341
|
+
nextCursor?: string;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export interface PromptGetResult {
|
|
345
|
+
description?: string;
|
|
346
|
+
messages: PromptMessage[];
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// ============================================================================
|
|
350
|
+
// Task Types (MCP 2025-11-25 - Async Operations)
|
|
351
|
+
// ============================================================================
|
|
352
|
+
|
|
353
|
+
export type TaskState = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
354
|
+
|
|
355
|
+
export interface MCPTask {
|
|
356
|
+
id: string;
|
|
357
|
+
state: TaskState;
|
|
358
|
+
progress?: TaskProgress;
|
|
359
|
+
result?: unknown;
|
|
360
|
+
error?: MCPError;
|
|
361
|
+
createdAt: Date;
|
|
362
|
+
updatedAt: Date;
|
|
363
|
+
metadata?: Record<string, unknown>;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
export interface TaskProgress {
|
|
367
|
+
progress: number;
|
|
368
|
+
total?: number;
|
|
369
|
+
message?: string;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export interface TaskResult {
|
|
373
|
+
taskId: string;
|
|
374
|
+
state: TaskState;
|
|
375
|
+
progress?: TaskProgress;
|
|
376
|
+
result?: unknown;
|
|
377
|
+
error?: MCPError;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// ============================================================================
|
|
381
|
+
// Pagination Types (MCP 2025-11-25)
|
|
382
|
+
// ============================================================================
|
|
383
|
+
|
|
384
|
+
export interface PaginatedRequest {
|
|
385
|
+
cursor?: string;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
export interface PaginatedResult<T> {
|
|
389
|
+
items: T[];
|
|
390
|
+
nextCursor?: string;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// ============================================================================
|
|
394
|
+
// Progress & Cancellation Types (MCP 2025-11-25)
|
|
395
|
+
// ============================================================================
|
|
396
|
+
|
|
397
|
+
export interface ProgressNotification {
|
|
398
|
+
progressToken: string | number;
|
|
399
|
+
progress: number;
|
|
400
|
+
total?: number;
|
|
401
|
+
message?: string;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
export interface CancellationParams {
|
|
405
|
+
requestId: RequestId;
|
|
406
|
+
reason?: string;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// ============================================================================
|
|
410
|
+
// Sampling Types (MCP 2025-11-25 - Server-initiated LLM)
|
|
411
|
+
// ============================================================================
|
|
412
|
+
|
|
413
|
+
export interface SamplingMessage {
|
|
414
|
+
role: PromptRole;
|
|
415
|
+
content: PromptContent;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
export interface ModelPreferences {
|
|
419
|
+
hints?: Array<{ name?: string }>;
|
|
420
|
+
costPriority?: number;
|
|
421
|
+
speedPriority?: number;
|
|
422
|
+
intelligencePriority?: number;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
export interface CreateMessageRequest {
|
|
426
|
+
messages: SamplingMessage[];
|
|
427
|
+
modelPreferences?: ModelPreferences;
|
|
428
|
+
systemPrompt?: string;
|
|
429
|
+
includeContext?: 'none' | 'thisServer' | 'allServers';
|
|
430
|
+
temperature?: number;
|
|
431
|
+
maxTokens: number;
|
|
432
|
+
stopSequences?: string[];
|
|
433
|
+
metadata?: Record<string, unknown>;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
export interface CreateMessageResult {
|
|
437
|
+
role: 'assistant';
|
|
438
|
+
content: PromptContent;
|
|
439
|
+
model: string;
|
|
440
|
+
stopReason?: 'endTurn' | 'stopSequence' | 'maxTokens';
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// ============================================================================
|
|
444
|
+
// Roots Types (MCP 2025-11-25)
|
|
445
|
+
// ============================================================================
|
|
446
|
+
|
|
447
|
+
export interface Root {
|
|
448
|
+
uri: string;
|
|
449
|
+
name?: string;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export interface RootsListResult {
|
|
453
|
+
roots: Root[];
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// ============================================================================
|
|
457
|
+
// Logging Types (MCP 2025-11-25)
|
|
458
|
+
// ============================================================================
|
|
459
|
+
|
|
460
|
+
export type MCPLogLevel = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency';
|
|
461
|
+
|
|
462
|
+
export interface LoggingMessage {
|
|
463
|
+
level: MCPLogLevel;
|
|
464
|
+
logger?: string;
|
|
465
|
+
data?: unknown;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// ============================================================================
|
|
469
|
+
// Completion Types (MCP 2025-11-25)
|
|
470
|
+
// ============================================================================
|
|
471
|
+
|
|
472
|
+
export interface CompletionReference {
|
|
473
|
+
type: 'ref/prompt' | 'ref/resource';
|
|
474
|
+
name?: string;
|
|
475
|
+
uri?: string;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export interface CompletionArgument {
|
|
479
|
+
name: string;
|
|
480
|
+
value: string;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
export interface CompletionResult {
|
|
484
|
+
values: string[];
|
|
485
|
+
total?: number;
|
|
486
|
+
hasMore?: boolean;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// ============================================================================
|
|
490
|
+
// Transport Types
|
|
491
|
+
// ============================================================================
|
|
492
|
+
|
|
493
|
+
export type RequestHandler = (request: MCPRequest) => Promise<MCPResponse>;
|
|
494
|
+
|
|
495
|
+
export type NotificationHandler = (notification: MCPNotification) => Promise<void>;
|
|
496
|
+
|
|
497
|
+
export interface TransportHealthStatus {
|
|
498
|
+
healthy: boolean;
|
|
499
|
+
error?: string;
|
|
500
|
+
metrics?: Record<string, number>;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
export interface ITransport {
|
|
504
|
+
readonly type: TransportType;
|
|
505
|
+
start(): Promise<void>;
|
|
506
|
+
stop(): Promise<void>;
|
|
507
|
+
onRequest(handler: RequestHandler): void;
|
|
508
|
+
onNotification(handler: NotificationHandler): void;
|
|
509
|
+
sendNotification?(notification: MCPNotification): Promise<void>;
|
|
510
|
+
getHealthStatus(): Promise<TransportHealthStatus>;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// ============================================================================
|
|
514
|
+
// Connection Pool Types
|
|
515
|
+
// ============================================================================
|
|
516
|
+
|
|
517
|
+
export type ConnectionState = 'idle' | 'busy' | 'closing' | 'closed' | 'error';
|
|
518
|
+
|
|
519
|
+
export interface PooledConnection {
|
|
520
|
+
id: string;
|
|
521
|
+
state: ConnectionState;
|
|
522
|
+
createdAt: Date;
|
|
523
|
+
lastUsedAt: Date;
|
|
524
|
+
useCount: number;
|
|
525
|
+
transport: TransportType;
|
|
526
|
+
metadata?: Record<string, unknown>;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export interface ConnectionPoolStats {
|
|
530
|
+
totalConnections: number;
|
|
531
|
+
idleConnections: number;
|
|
532
|
+
busyConnections: number;
|
|
533
|
+
pendingRequests: number;
|
|
534
|
+
totalAcquired: number;
|
|
535
|
+
totalReleased: number;
|
|
536
|
+
totalCreated: number;
|
|
537
|
+
totalDestroyed: number;
|
|
538
|
+
avgAcquireTime: number;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
export interface IConnectionPool {
|
|
542
|
+
acquire(): Promise<PooledConnection>;
|
|
543
|
+
release(connection: PooledConnection): void;
|
|
544
|
+
destroy(connection: PooledConnection): void;
|
|
545
|
+
getStats(): ConnectionPoolStats;
|
|
546
|
+
drain(): Promise<void>;
|
|
547
|
+
clear(): Promise<void>;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// ============================================================================
|
|
551
|
+
// Metrics Types
|
|
552
|
+
// ============================================================================
|
|
553
|
+
|
|
554
|
+
export interface ToolCallMetrics {
|
|
555
|
+
toolName: string;
|
|
556
|
+
duration: number;
|
|
557
|
+
success: boolean;
|
|
558
|
+
timestamp: number;
|
|
559
|
+
transport: TransportType;
|
|
560
|
+
cached?: boolean;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
export interface MCPServerMetrics {
|
|
564
|
+
totalRequests: number;
|
|
565
|
+
successfulRequests: number;
|
|
566
|
+
failedRequests: number;
|
|
567
|
+
averageResponseTime: number;
|
|
568
|
+
activeSessions: number;
|
|
569
|
+
toolInvocations: Record<string, number>;
|
|
570
|
+
errors: Record<string, number>;
|
|
571
|
+
lastReset: Date;
|
|
572
|
+
startupTime?: number;
|
|
573
|
+
uptime?: number;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
export interface SessionMetrics {
|
|
577
|
+
total: number;
|
|
578
|
+
active: number;
|
|
579
|
+
authenticated: number;
|
|
580
|
+
expired: number;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
// ============================================================================
|
|
584
|
+
// Event Types
|
|
585
|
+
// ============================================================================
|
|
586
|
+
|
|
587
|
+
export type MCPEventType =
|
|
588
|
+
| 'server:started'
|
|
589
|
+
| 'server:stopped'
|
|
590
|
+
| 'server:error'
|
|
591
|
+
| 'session:created'
|
|
592
|
+
| 'session:initialized'
|
|
593
|
+
| 'session:closed'
|
|
594
|
+
| 'session:error'
|
|
595
|
+
| 'tool:registered'
|
|
596
|
+
| 'tool:unregistered'
|
|
597
|
+
| 'tool:called'
|
|
598
|
+
| 'tool:completed'
|
|
599
|
+
| 'tool:error'
|
|
600
|
+
| 'transport:connected'
|
|
601
|
+
| 'transport:disconnected'
|
|
602
|
+
| 'transport:error'
|
|
603
|
+
| 'pool:connection:acquired'
|
|
604
|
+
| 'pool:connection:released'
|
|
605
|
+
| 'pool:connection:created'
|
|
606
|
+
| 'pool:connection:destroyed';
|
|
607
|
+
|
|
608
|
+
export interface MCPEvent {
|
|
609
|
+
type: MCPEventType;
|
|
610
|
+
timestamp: Date;
|
|
611
|
+
data?: unknown;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export type EventHandler = (event: MCPEvent) => void;
|
|
615
|
+
|
|
616
|
+
// ============================================================================
|
|
617
|
+
// Logger Interface
|
|
618
|
+
// ============================================================================
|
|
619
|
+
|
|
620
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
621
|
+
|
|
622
|
+
export interface ILogger {
|
|
623
|
+
debug(message: string, data?: unknown): void;
|
|
624
|
+
info(message: string, data?: unknown): void;
|
|
625
|
+
warn(message: string, data?: unknown): void;
|
|
626
|
+
error(message: string, data?: unknown): void;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// ============================================================================
|
|
630
|
+
// Error Codes
|
|
631
|
+
// ============================================================================
|
|
632
|
+
|
|
633
|
+
export const ErrorCodes = {
|
|
634
|
+
PARSE_ERROR: -32700,
|
|
635
|
+
INVALID_REQUEST: -32600,
|
|
636
|
+
METHOD_NOT_FOUND: -32601,
|
|
637
|
+
INVALID_PARAMS: -32602,
|
|
638
|
+
INTERNAL_ERROR: -32603,
|
|
639
|
+
SERVER_NOT_INITIALIZED: -32002,
|
|
640
|
+
UNKNOWN_ERROR: -32001,
|
|
641
|
+
REQUEST_CANCELLED: -32800,
|
|
642
|
+
RATE_LIMITED: -32000,
|
|
643
|
+
AUTHENTICATION_REQUIRED: -32001,
|
|
644
|
+
AUTHORIZATION_FAILED: -32002,
|
|
645
|
+
} as const;
|
|
646
|
+
|
|
647
|
+
export class MCPServerError extends Error {
|
|
648
|
+
constructor(
|
|
649
|
+
message: string,
|
|
650
|
+
public code: number = ErrorCodes.INTERNAL_ERROR,
|
|
651
|
+
public data?: unknown
|
|
652
|
+
) {
|
|
653
|
+
super(message);
|
|
654
|
+
this.name = 'MCPServerError';
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
toMCPError(): MCPError {
|
|
658
|
+
return {
|
|
659
|
+
code: this.code,
|
|
660
|
+
message: this.message,
|
|
661
|
+
data: this.data,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"declarationMap": true,
|
|
8
|
+
"sourceMap": true,
|
|
9
|
+
"outDir": "./dist",
|
|
10
|
+
"rootDir": "./src",
|
|
11
|
+
"strict": true,
|
|
12
|
+
"esModuleInterop": true,
|
|
13
|
+
"skipLibCheck": true,
|
|
14
|
+
"forceConsistentCasingInFileNames": true,
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"isolatedModules": true
|
|
17
|
+
},
|
|
18
|
+
"include": ["src/**/*"],
|
|
19
|
+
"exclude": ["node_modules", "dist", "__tests__"]
|
|
20
|
+
}
|
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
test: {
|
|
5
|
+
globals: true,
|
|
6
|
+
environment: 'node',
|
|
7
|
+
include: ['__tests__/**/*.test.ts'],
|
|
8
|
+
coverage: {
|
|
9
|
+
provider: 'v8',
|
|
10
|
+
reporter: ['text', 'json', 'html'],
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
});
|