@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/dist/sampling.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - Sampling (Server-Initiated LLM)
|
|
3
|
+
*
|
|
4
|
+
* MCP 2025-11-25 compliant sampling for server-initiated LLM calls
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
defaultModelPreferences: {
|
|
9
|
+
intelligencePriority: 0.5,
|
|
10
|
+
speedPriority: 0.3,
|
|
11
|
+
costPriority: 0.2,
|
|
12
|
+
},
|
|
13
|
+
maxTokensLimit: 4096,
|
|
14
|
+
defaultTemperature: 0.7,
|
|
15
|
+
timeout: 30000,
|
|
16
|
+
enableLogging: true,
|
|
17
|
+
};
|
|
18
|
+
export class SamplingManager extends EventEmitter {
|
|
19
|
+
logger;
|
|
20
|
+
config;
|
|
21
|
+
providers = new Map();
|
|
22
|
+
defaultProvider;
|
|
23
|
+
requestCount = 0;
|
|
24
|
+
totalTokens = 0;
|
|
25
|
+
constructor(logger, config = {}) {
|
|
26
|
+
super();
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Register an LLM provider
|
|
32
|
+
*/
|
|
33
|
+
registerProvider(provider, isDefault = false) {
|
|
34
|
+
this.providers.set(provider.name, provider);
|
|
35
|
+
if (isDefault || !this.defaultProvider) {
|
|
36
|
+
this.defaultProvider = provider.name;
|
|
37
|
+
}
|
|
38
|
+
this.logger.info('LLM provider registered', { name: provider.name, isDefault });
|
|
39
|
+
this.emit('provider:registered', { name: provider.name });
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Unregister a provider
|
|
43
|
+
*/
|
|
44
|
+
unregisterProvider(name) {
|
|
45
|
+
const removed = this.providers.delete(name);
|
|
46
|
+
if (removed && this.defaultProvider === name) {
|
|
47
|
+
this.defaultProvider = this.providers.keys().next().value;
|
|
48
|
+
}
|
|
49
|
+
return removed;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a message (sampling/createMessage)
|
|
53
|
+
*/
|
|
54
|
+
async createMessage(request, context) {
|
|
55
|
+
const startTime = Date.now();
|
|
56
|
+
this.requestCount++;
|
|
57
|
+
// Validate request
|
|
58
|
+
this.validateRequest(request);
|
|
59
|
+
// Select provider
|
|
60
|
+
const provider = this.selectProvider(request.modelPreferences);
|
|
61
|
+
if (!provider) {
|
|
62
|
+
throw new Error('No LLM provider available');
|
|
63
|
+
}
|
|
64
|
+
// Apply defaults
|
|
65
|
+
const fullRequest = this.applyDefaults(request);
|
|
66
|
+
if (this.config.enableLogging) {
|
|
67
|
+
this.logger.debug('Sampling request', {
|
|
68
|
+
provider: provider.name,
|
|
69
|
+
messageCount: request.messages.length,
|
|
70
|
+
maxTokens: fullRequest.maxTokens,
|
|
71
|
+
sessionId: context?.sessionId,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
this.emit('sampling:start', { provider: provider.name, context });
|
|
75
|
+
try {
|
|
76
|
+
// Call provider with timeout
|
|
77
|
+
const result = await this.callWithTimeout(provider.createMessage(fullRequest), this.config.timeout);
|
|
78
|
+
const duration = Date.now() - startTime;
|
|
79
|
+
if (this.config.enableLogging) {
|
|
80
|
+
this.logger.info('Sampling complete', {
|
|
81
|
+
provider: provider.name,
|
|
82
|
+
duration: `${duration}ms`,
|
|
83
|
+
stopReason: result.stopReason,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
this.emit('sampling:complete', {
|
|
87
|
+
provider: provider.name,
|
|
88
|
+
duration,
|
|
89
|
+
result,
|
|
90
|
+
context,
|
|
91
|
+
});
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const duration = Date.now() - startTime;
|
|
96
|
+
this.logger.error('Sampling failed', {
|
|
97
|
+
provider: provider.name,
|
|
98
|
+
duration: `${duration}ms`,
|
|
99
|
+
error,
|
|
100
|
+
});
|
|
101
|
+
this.emit('sampling:error', {
|
|
102
|
+
provider: provider.name,
|
|
103
|
+
duration,
|
|
104
|
+
error,
|
|
105
|
+
context,
|
|
106
|
+
});
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if sampling is available
|
|
112
|
+
*/
|
|
113
|
+
async isAvailable() {
|
|
114
|
+
if (this.providers.size === 0) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
for (const provider of this.providers.values()) {
|
|
118
|
+
if (await provider.isAvailable()) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get available providers
|
|
126
|
+
*/
|
|
127
|
+
getProviders() {
|
|
128
|
+
return Array.from(this.providers.keys());
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get stats
|
|
132
|
+
*/
|
|
133
|
+
getStats() {
|
|
134
|
+
return {
|
|
135
|
+
requestCount: this.requestCount,
|
|
136
|
+
totalTokens: this.totalTokens,
|
|
137
|
+
providerCount: this.providers.size,
|
|
138
|
+
defaultProvider: this.defaultProvider,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Validate sampling request
|
|
143
|
+
*/
|
|
144
|
+
validateRequest(request) {
|
|
145
|
+
if (!request.messages || request.messages.length === 0) {
|
|
146
|
+
throw new Error('Messages are required');
|
|
147
|
+
}
|
|
148
|
+
if (request.maxTokens > this.config.maxTokensLimit) {
|
|
149
|
+
throw new Error(`maxTokens exceeds limit of ${this.config.maxTokensLimit}`);
|
|
150
|
+
}
|
|
151
|
+
if (request.temperature !== undefined && (request.temperature < 0 || request.temperature > 2)) {
|
|
152
|
+
throw new Error('Temperature must be between 0 and 2');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Select provider based on preferences
|
|
157
|
+
*/
|
|
158
|
+
selectProvider(preferences) {
|
|
159
|
+
// If hints provided, try to find matching provider
|
|
160
|
+
if (preferences?.hints) {
|
|
161
|
+
for (const hint of preferences.hints) {
|
|
162
|
+
if (hint.name && this.providers.has(hint.name)) {
|
|
163
|
+
return this.providers.get(hint.name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Use default provider
|
|
168
|
+
if (this.defaultProvider) {
|
|
169
|
+
return this.providers.get(this.defaultProvider);
|
|
170
|
+
}
|
|
171
|
+
// Return first available
|
|
172
|
+
return this.providers.values().next().value;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Apply default values to request
|
|
176
|
+
*/
|
|
177
|
+
applyDefaults(request) {
|
|
178
|
+
return {
|
|
179
|
+
...request,
|
|
180
|
+
modelPreferences: request.modelPreferences || this.config.defaultModelPreferences,
|
|
181
|
+
temperature: request.temperature ?? this.config.defaultTemperature,
|
|
182
|
+
maxTokens: Math.min(request.maxTokens, this.config.maxTokensLimit),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Call with timeout
|
|
187
|
+
*/
|
|
188
|
+
async callWithTimeout(promise, timeout) {
|
|
189
|
+
return Promise.race([
|
|
190
|
+
promise,
|
|
191
|
+
new Promise((_, reject) => {
|
|
192
|
+
setTimeout(() => reject(new Error('Sampling timeout')), timeout);
|
|
193
|
+
}),
|
|
194
|
+
]);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export function createSamplingManager(logger, config) {
|
|
198
|
+
return new SamplingManager(logger, config);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a mock LLM provider for testing
|
|
202
|
+
*/
|
|
203
|
+
export function createMockProvider(name = 'mock') {
|
|
204
|
+
return {
|
|
205
|
+
name,
|
|
206
|
+
async createMessage(request) {
|
|
207
|
+
// Simulate processing time
|
|
208
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
209
|
+
return {
|
|
210
|
+
role: 'assistant',
|
|
211
|
+
content: {
|
|
212
|
+
type: 'text',
|
|
213
|
+
text: `Mock response to: ${JSON.stringify(request.messages[0]?.content)}`,
|
|
214
|
+
},
|
|
215
|
+
model: `${name}-model`,
|
|
216
|
+
stopReason: 'endTurn',
|
|
217
|
+
};
|
|
218
|
+
},
|
|
219
|
+
async isAvailable() {
|
|
220
|
+
return true;
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Create an Anthropic provider (requires API key)
|
|
226
|
+
*/
|
|
227
|
+
export function createAnthropicProvider(apiKey) {
|
|
228
|
+
return {
|
|
229
|
+
name: 'anthropic',
|
|
230
|
+
async createMessage(request) {
|
|
231
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
232
|
+
method: 'POST',
|
|
233
|
+
headers: {
|
|
234
|
+
'Content-Type': 'application/json',
|
|
235
|
+
'x-api-key': apiKey,
|
|
236
|
+
'anthropic-version': '2023-06-01',
|
|
237
|
+
},
|
|
238
|
+
body: JSON.stringify({
|
|
239
|
+
model: 'claude-3-haiku-20240307',
|
|
240
|
+
max_tokens: request.maxTokens,
|
|
241
|
+
temperature: request.temperature,
|
|
242
|
+
system: request.systemPrompt,
|
|
243
|
+
messages: request.messages.map((m) => ({
|
|
244
|
+
role: m.role,
|
|
245
|
+
content: m.content.type === 'text' ? m.content.text : m.content,
|
|
246
|
+
})),
|
|
247
|
+
}),
|
|
248
|
+
});
|
|
249
|
+
if (!response.ok) {
|
|
250
|
+
throw new Error(`Anthropic API error: ${response.status}`);
|
|
251
|
+
}
|
|
252
|
+
const data = await response.json();
|
|
253
|
+
return {
|
|
254
|
+
role: 'assistant',
|
|
255
|
+
content: {
|
|
256
|
+
type: 'text',
|
|
257
|
+
text: data.content[0]?.text || '',
|
|
258
|
+
},
|
|
259
|
+
model: data.model,
|
|
260
|
+
stopReason: data.stop_reason === 'end_turn' ? 'endTurn' : 'maxTokens',
|
|
261
|
+
};
|
|
262
|
+
},
|
|
263
|
+
async isAvailable() {
|
|
264
|
+
return !!apiKey;
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=sampling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - JSON Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Lightweight JSON Schema validation for tool inputs
|
|
5
|
+
* Implements JSON Schema Draft 2020-12 subset
|
|
6
|
+
*/
|
|
7
|
+
import type { JSONSchema } from './types.js';
|
|
8
|
+
export interface ValidationError {
|
|
9
|
+
path: string;
|
|
10
|
+
message: string;
|
|
11
|
+
keyword: string;
|
|
12
|
+
params?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface ValidationResult {
|
|
15
|
+
valid: boolean;
|
|
16
|
+
errors: ValidationError[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate data against JSON Schema
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateSchema(data: unknown, schema: JSONSchema, path?: string): ValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* Format validation errors for display
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatValidationErrors(errors: ValidationError[]): string;
|
|
26
|
+
/**
|
|
27
|
+
* Create a validator function for a specific schema
|
|
28
|
+
*/
|
|
29
|
+
export declare function createValidator(schema: JSONSchema): (data: unknown) => ValidationResult;
|
|
30
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE,MAAW,GAChB,gBAAgB,CAuJlB;AAqBD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAEvF"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - JSON Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Lightweight JSON Schema validation for tool inputs
|
|
5
|
+
* Implements JSON Schema Draft 2020-12 subset
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validate data against JSON Schema
|
|
9
|
+
*/
|
|
10
|
+
export function validateSchema(data, schema, path = '') {
|
|
11
|
+
const errors = [];
|
|
12
|
+
// Type validation
|
|
13
|
+
if (schema.type) {
|
|
14
|
+
const typeValid = validateType(data, schema.type);
|
|
15
|
+
if (!typeValid) {
|
|
16
|
+
errors.push({
|
|
17
|
+
path: path || 'root',
|
|
18
|
+
message: `Expected type "${schema.type}", got "${typeof data}"`,
|
|
19
|
+
keyword: 'type',
|
|
20
|
+
params: { expected: schema.type, actual: typeof data },
|
|
21
|
+
});
|
|
22
|
+
return { valid: false, errors };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Null check
|
|
26
|
+
if (data === null || data === undefined) {
|
|
27
|
+
if (schema.type && schema.type !== 'null') {
|
|
28
|
+
errors.push({
|
|
29
|
+
path: path || 'root',
|
|
30
|
+
message: 'Value cannot be null or undefined',
|
|
31
|
+
keyword: 'type',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return { valid: errors.length === 0, errors };
|
|
35
|
+
}
|
|
36
|
+
// String validations
|
|
37
|
+
if (schema.type === 'string' && typeof data === 'string') {
|
|
38
|
+
if (schema.minLength !== undefined && data.length < schema.minLength) {
|
|
39
|
+
errors.push({
|
|
40
|
+
path,
|
|
41
|
+
message: `String length must be >= ${schema.minLength}`,
|
|
42
|
+
keyword: 'minLength',
|
|
43
|
+
params: { limit: schema.minLength, actual: data.length },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (schema.maxLength !== undefined && data.length > schema.maxLength) {
|
|
47
|
+
errors.push({
|
|
48
|
+
path,
|
|
49
|
+
message: `String length must be <= ${schema.maxLength}`,
|
|
50
|
+
keyword: 'maxLength',
|
|
51
|
+
params: { limit: schema.maxLength, actual: data.length },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (schema.pattern) {
|
|
55
|
+
const regex = new RegExp(schema.pattern);
|
|
56
|
+
if (!regex.test(data)) {
|
|
57
|
+
errors.push({
|
|
58
|
+
path,
|
|
59
|
+
message: `String must match pattern "${schema.pattern}"`,
|
|
60
|
+
keyword: 'pattern',
|
|
61
|
+
params: { pattern: schema.pattern },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (schema.enum && !schema.enum.includes(data)) {
|
|
66
|
+
errors.push({
|
|
67
|
+
path,
|
|
68
|
+
message: `Value must be one of: ${schema.enum.join(', ')}`,
|
|
69
|
+
keyword: 'enum',
|
|
70
|
+
params: { allowedValues: schema.enum },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Number validations
|
|
75
|
+
if ((schema.type === 'number' || schema.type === 'integer') && typeof data === 'number') {
|
|
76
|
+
if (schema.type === 'integer' && !Number.isInteger(data)) {
|
|
77
|
+
errors.push({
|
|
78
|
+
path,
|
|
79
|
+
message: 'Value must be an integer',
|
|
80
|
+
keyword: 'type',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (schema.minimum !== undefined && data < schema.minimum) {
|
|
84
|
+
errors.push({
|
|
85
|
+
path,
|
|
86
|
+
message: `Value must be >= ${schema.minimum}`,
|
|
87
|
+
keyword: 'minimum',
|
|
88
|
+
params: { limit: schema.minimum, actual: data },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (schema.maximum !== undefined && data > schema.maximum) {
|
|
92
|
+
errors.push({
|
|
93
|
+
path,
|
|
94
|
+
message: `Value must be <= ${schema.maximum}`,
|
|
95
|
+
keyword: 'maximum',
|
|
96
|
+
params: { limit: schema.maximum, actual: data },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Array validations
|
|
101
|
+
if (schema.type === 'array' && Array.isArray(data)) {
|
|
102
|
+
if (schema.items) {
|
|
103
|
+
for (let i = 0; i < data.length; i++) {
|
|
104
|
+
const itemResult = validateSchema(data[i], schema.items, `${path}[${i}]`);
|
|
105
|
+
errors.push(...itemResult.errors);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Object validations
|
|
110
|
+
if (schema.type === 'object' && typeof data === 'object' && !Array.isArray(data)) {
|
|
111
|
+
const obj = data;
|
|
112
|
+
// Required properties
|
|
113
|
+
if (schema.required) {
|
|
114
|
+
for (const requiredProp of schema.required) {
|
|
115
|
+
if (!(requiredProp in obj)) {
|
|
116
|
+
errors.push({
|
|
117
|
+
path: path ? `${path}.${requiredProp}` : requiredProp,
|
|
118
|
+
message: `Required property "${requiredProp}" is missing`,
|
|
119
|
+
keyword: 'required',
|
|
120
|
+
params: { missingProperty: requiredProp },
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Property validations
|
|
126
|
+
if (schema.properties) {
|
|
127
|
+
for (const [propName, propSchema] of Object.entries(schema.properties)) {
|
|
128
|
+
if (propName in obj) {
|
|
129
|
+
const propPath = path ? `${path}.${propName}` : propName;
|
|
130
|
+
const propResult = validateSchema(obj[propName], propSchema, propPath);
|
|
131
|
+
errors.push(...propResult.errors);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Additional properties check
|
|
136
|
+
if (schema.additionalProperties === false && schema.properties) {
|
|
137
|
+
const allowedProps = new Set(Object.keys(schema.properties));
|
|
138
|
+
for (const propName of Object.keys(obj)) {
|
|
139
|
+
if (!allowedProps.has(propName)) {
|
|
140
|
+
errors.push({
|
|
141
|
+
path: path ? `${path}.${propName}` : propName,
|
|
142
|
+
message: `Additional property "${propName}" is not allowed`,
|
|
143
|
+
keyword: 'additionalProperties',
|
|
144
|
+
params: { additionalProperty: propName },
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return { valid: errors.length === 0, errors };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Validate type
|
|
154
|
+
*/
|
|
155
|
+
function validateType(data, expectedType) {
|
|
156
|
+
if (expectedType === 'null') {
|
|
157
|
+
return data === null;
|
|
158
|
+
}
|
|
159
|
+
if (expectedType === 'array') {
|
|
160
|
+
return Array.isArray(data);
|
|
161
|
+
}
|
|
162
|
+
if (expectedType === 'integer') {
|
|
163
|
+
return typeof data === 'number' && Number.isInteger(data);
|
|
164
|
+
}
|
|
165
|
+
if (expectedType === 'object') {
|
|
166
|
+
return typeof data === 'object' && data !== null && !Array.isArray(data);
|
|
167
|
+
}
|
|
168
|
+
return typeof data === expectedType;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Format validation errors for display
|
|
172
|
+
*/
|
|
173
|
+
export function formatValidationErrors(errors) {
|
|
174
|
+
return errors.map((e) => `${e.path}: ${e.message}`).join('; ');
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Create a validator function for a specific schema
|
|
178
|
+
*/
|
|
179
|
+
export function createValidator(schema) {
|
|
180
|
+
return (data) => validateSchema(data, schema);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAa,EACb,MAAkB,EAClB,OAAe,EAAE;IAEjB,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,kBAAkB;IAClB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,IAAI,MAAM;gBACpB,OAAO,EAAE,kBAAkB,MAAM,CAAC,IAAI,WAAW,OAAO,IAAI,GAAG;gBAC/D,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;aACvD,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,IAAI,MAAM;gBACpB,OAAO,EAAE,mCAAmC;gBAC5C,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,4BAA4B,MAAM,CAAC,SAAS,EAAE;gBACvD,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;aACzD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,4BAA4B,MAAM,CAAC,SAAS,EAAE;gBACvD,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;aACzD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,OAAO,EAAE,8BAA8B,MAAM,CAAC,OAAO,GAAG;oBACxD,OAAO,EAAE,SAAS;oBAClB,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC1D,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,0BAA0B;gBACnC,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,oBAAoB,MAAM,CAAC,OAAO,EAAE;gBAC7C,OAAO,EAAE,SAAS;gBAClB,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,oBAAoB,MAAM,CAAC,OAAO,EAAE;gBAC7C,OAAO,EAAE,SAAS;gBAClB,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,MAAM,GAAG,GAAG,IAA+B,CAAC;QAE5C,sBAAsB;QACtB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3C,IAAI,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY;wBACrD,OAAO,EAAE,sBAAsB,YAAY,cAAc;wBACzD,OAAO,EAAE,UAAU;wBACnB,MAAM,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE;qBAC1C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvE,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;oBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACzD,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACvE,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,MAAM,CAAC,oBAAoB,KAAK,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ;wBAC7C,OAAO,EAAE,wBAAwB,QAAQ,kBAAkB;wBAC3D,OAAO,EAAE,sBAAsB;wBAC/B,MAAM,EAAE,EAAE,kBAAkB,EAAE,QAAQ,EAAE;qBACzC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAa,EAAE,YAAoB;IACvD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,IAAI,KAAK,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,IAAI,KAAK,YAAY,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,OAAO,CAAC,IAAa,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - MCP Server
|
|
3
|
+
*
|
|
4
|
+
* High-performance MCP server implementation
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import type { MCPServerConfig, MCPSession, MCPTool, MCPServerMetrics, ILogger } from './types.js';
|
|
8
|
+
import { ResourceRegistry } from './resource-registry.js';
|
|
9
|
+
import { PromptRegistry } from './prompt-registry.js';
|
|
10
|
+
import { TaskManager } from './task-manager.js';
|
|
11
|
+
import { RateLimiter } from './rate-limiter.js';
|
|
12
|
+
import { SamplingManager, type LLMProvider } from './sampling.js';
|
|
13
|
+
export interface IMCPServer {
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
stop(): Promise<void>;
|
|
16
|
+
registerTool(tool: MCPTool): boolean;
|
|
17
|
+
registerTools(tools: MCPTool[]): {
|
|
18
|
+
registered: number;
|
|
19
|
+
failed: string[];
|
|
20
|
+
};
|
|
21
|
+
getHealthStatus(): Promise<{
|
|
22
|
+
healthy: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
metrics?: Record<string, number>;
|
|
25
|
+
}>;
|
|
26
|
+
getMetrics(): MCPServerMetrics;
|
|
27
|
+
getSessions(): MCPSession[];
|
|
28
|
+
getSession(sessionId: string): MCPSession | undefined;
|
|
29
|
+
terminateSession(sessionId: string): boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare class MCPServer extends EventEmitter implements IMCPServer {
|
|
32
|
+
private readonly logger;
|
|
33
|
+
private readonly orchestrator?;
|
|
34
|
+
private readonly swarmCoordinator?;
|
|
35
|
+
private readonly config;
|
|
36
|
+
private readonly toolRegistry;
|
|
37
|
+
private readonly sessionManager;
|
|
38
|
+
private readonly resourceRegistry;
|
|
39
|
+
private readonly promptRegistry;
|
|
40
|
+
private readonly taskManager;
|
|
41
|
+
private readonly connectionPool?;
|
|
42
|
+
private readonly transportManager;
|
|
43
|
+
private readonly rateLimiter;
|
|
44
|
+
private readonly samplingManager;
|
|
45
|
+
private transport?;
|
|
46
|
+
private running;
|
|
47
|
+
private startTime?;
|
|
48
|
+
private startupDuration?;
|
|
49
|
+
private currentSession?;
|
|
50
|
+
private resourceSubscriptions;
|
|
51
|
+
private readonly serverInfo;
|
|
52
|
+
private readonly protocolVersion;
|
|
53
|
+
private capabilities;
|
|
54
|
+
private requestStats;
|
|
55
|
+
constructor(config: Partial<MCPServerConfig>, logger: ILogger, orchestrator?: unknown | undefined, swarmCoordinator?: unknown | undefined);
|
|
56
|
+
/**
|
|
57
|
+
* Get resource registry for external registration
|
|
58
|
+
*/
|
|
59
|
+
getResourceRegistry(): ResourceRegistry;
|
|
60
|
+
/**
|
|
61
|
+
* Get prompt registry for external registration
|
|
62
|
+
*/
|
|
63
|
+
getPromptRegistry(): PromptRegistry;
|
|
64
|
+
/**
|
|
65
|
+
* Get task manager for async operations
|
|
66
|
+
*/
|
|
67
|
+
getTaskManager(): TaskManager;
|
|
68
|
+
/**
|
|
69
|
+
* Get rate limiter for configuration
|
|
70
|
+
*/
|
|
71
|
+
getRateLimiter(): RateLimiter;
|
|
72
|
+
/**
|
|
73
|
+
* Get sampling manager for LLM provider registration
|
|
74
|
+
*/
|
|
75
|
+
getSamplingManager(): SamplingManager;
|
|
76
|
+
/**
|
|
77
|
+
* Register an LLM provider for sampling
|
|
78
|
+
*/
|
|
79
|
+
registerLLMProvider(provider: LLMProvider, isDefault?: boolean): void;
|
|
80
|
+
start(): Promise<void>;
|
|
81
|
+
stop(): Promise<void>;
|
|
82
|
+
registerTool(tool: MCPTool): boolean;
|
|
83
|
+
registerTools(tools: MCPTool[]): {
|
|
84
|
+
registered: number;
|
|
85
|
+
failed: string[];
|
|
86
|
+
};
|
|
87
|
+
unregisterTool(name: string): boolean;
|
|
88
|
+
getHealthStatus(): Promise<{
|
|
89
|
+
healthy: boolean;
|
|
90
|
+
error?: string;
|
|
91
|
+
metrics?: Record<string, number>;
|
|
92
|
+
}>;
|
|
93
|
+
getMetrics(): MCPServerMetrics;
|
|
94
|
+
getSessions(): MCPSession[];
|
|
95
|
+
getSession(sessionId: string): MCPSession | undefined;
|
|
96
|
+
terminateSession(sessionId: string): boolean;
|
|
97
|
+
private handleRequest;
|
|
98
|
+
private handleNotification;
|
|
99
|
+
private handleInitialize;
|
|
100
|
+
private routeRequest;
|
|
101
|
+
private handleToolsList;
|
|
102
|
+
private handleToolsCall;
|
|
103
|
+
private handleToolExecution;
|
|
104
|
+
private handleResourcesList;
|
|
105
|
+
private handleResourcesRead;
|
|
106
|
+
private handleResourcesSubscribe;
|
|
107
|
+
private handleResourcesUnsubscribe;
|
|
108
|
+
private handlePromptsList;
|
|
109
|
+
private handlePromptsGet;
|
|
110
|
+
private handleTasksStatus;
|
|
111
|
+
private handleTasksCancel;
|
|
112
|
+
private handleCompletion;
|
|
113
|
+
private handleLoggingSetLevel;
|
|
114
|
+
private handleSamplingCreateMessage;
|
|
115
|
+
private sendNotification;
|
|
116
|
+
private getOrCreateSession;
|
|
117
|
+
private createErrorResponse;
|
|
118
|
+
private registerBuiltInTools;
|
|
119
|
+
private setupEventHandlers;
|
|
120
|
+
}
|
|
121
|
+
export declare function createMCPServer(config: Partial<MCPServerConfig>, logger: ILogger, orchestrator?: unknown, swarmCoordinator?: unknown): MCPServer;
|
|
122
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|