@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
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - Transport Factory
|
|
3
|
+
*
|
|
4
|
+
* Central factory for creating transport instances
|
|
5
|
+
*/
|
|
6
|
+
import { createStdioTransport } from './stdio.js';
|
|
7
|
+
import { createHttpTransport } from './http.js';
|
|
8
|
+
import { createWebSocketTransport } from './websocket.js';
|
|
9
|
+
export { StdioTransport } from './stdio.js';
|
|
10
|
+
export { HttpTransport } from './http.js';
|
|
11
|
+
export { WebSocketTransport } from './websocket.js';
|
|
12
|
+
export function createTransport(type, logger, config) {
|
|
13
|
+
switch (type) {
|
|
14
|
+
case 'stdio':
|
|
15
|
+
return createStdioTransport(logger, config);
|
|
16
|
+
case 'http':
|
|
17
|
+
if (!config || !('host' in config) || !('port' in config)) {
|
|
18
|
+
throw new Error('HTTP transport requires host and port configuration');
|
|
19
|
+
}
|
|
20
|
+
return createHttpTransport(logger, {
|
|
21
|
+
host: config.host,
|
|
22
|
+
port: config.port,
|
|
23
|
+
...config,
|
|
24
|
+
});
|
|
25
|
+
case 'websocket':
|
|
26
|
+
if (!config || !('host' in config) || !('port' in config)) {
|
|
27
|
+
throw new Error('WebSocket transport requires host and port configuration');
|
|
28
|
+
}
|
|
29
|
+
return createWebSocketTransport(logger, {
|
|
30
|
+
host: config.host,
|
|
31
|
+
port: config.port,
|
|
32
|
+
...config,
|
|
33
|
+
});
|
|
34
|
+
case 'in-process':
|
|
35
|
+
return createInProcessTransport(logger);
|
|
36
|
+
default:
|
|
37
|
+
throw new Error(`Unknown transport type: ${type}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
class InProcessTransport {
|
|
41
|
+
logger;
|
|
42
|
+
type = 'in-process';
|
|
43
|
+
constructor(logger) {
|
|
44
|
+
this.logger = logger;
|
|
45
|
+
}
|
|
46
|
+
async start() {
|
|
47
|
+
this.logger.debug('In-process transport started');
|
|
48
|
+
}
|
|
49
|
+
async stop() {
|
|
50
|
+
this.logger.debug('In-process transport stopped');
|
|
51
|
+
}
|
|
52
|
+
onRequest() {
|
|
53
|
+
// No-op - requests are handled directly
|
|
54
|
+
}
|
|
55
|
+
onNotification() {
|
|
56
|
+
// No-op - notifications are handled directly
|
|
57
|
+
}
|
|
58
|
+
async getHealthStatus() {
|
|
59
|
+
return {
|
|
60
|
+
healthy: true,
|
|
61
|
+
metrics: {
|
|
62
|
+
latency: 0,
|
|
63
|
+
connections: 1,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function createInProcessTransport(logger) {
|
|
69
|
+
return new InProcessTransport(logger);
|
|
70
|
+
}
|
|
71
|
+
export class TransportManager {
|
|
72
|
+
logger;
|
|
73
|
+
transports = new Map();
|
|
74
|
+
running = false;
|
|
75
|
+
constructor(logger) {
|
|
76
|
+
this.logger = logger;
|
|
77
|
+
}
|
|
78
|
+
addTransport(name, transport) {
|
|
79
|
+
if (this.transports.has(name)) {
|
|
80
|
+
throw new Error(`Transport "${name}" already exists`);
|
|
81
|
+
}
|
|
82
|
+
this.transports.set(name, transport);
|
|
83
|
+
this.logger.debug('Transport added', { name, type: transport.type });
|
|
84
|
+
}
|
|
85
|
+
async removeTransport(name) {
|
|
86
|
+
const transport = this.transports.get(name);
|
|
87
|
+
if (!transport) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
await transport.stop();
|
|
91
|
+
this.transports.delete(name);
|
|
92
|
+
this.logger.debug('Transport removed', { name });
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
getTransport(name) {
|
|
96
|
+
return this.transports.get(name);
|
|
97
|
+
}
|
|
98
|
+
getTransportNames() {
|
|
99
|
+
return Array.from(this.transports.keys());
|
|
100
|
+
}
|
|
101
|
+
async startAll() {
|
|
102
|
+
if (this.running) {
|
|
103
|
+
throw new Error('TransportManager already running');
|
|
104
|
+
}
|
|
105
|
+
this.logger.info('Starting all transports', { count: this.transports.size });
|
|
106
|
+
const startPromises = Array.from(this.transports.entries()).map(async ([name, transport]) => {
|
|
107
|
+
try {
|
|
108
|
+
await transport.start();
|
|
109
|
+
this.logger.info('Transport started', { name, type: transport.type });
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
this.logger.error('Failed to start transport', { name, error });
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
await Promise.all(startPromises);
|
|
117
|
+
this.running = true;
|
|
118
|
+
this.logger.info('All transports started');
|
|
119
|
+
}
|
|
120
|
+
async stopAll() {
|
|
121
|
+
if (!this.running) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.logger.info('Stopping all transports');
|
|
125
|
+
const stopPromises = Array.from(this.transports.entries()).map(async ([name, transport]) => {
|
|
126
|
+
try {
|
|
127
|
+
await transport.stop();
|
|
128
|
+
this.logger.info('Transport stopped', { name });
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.logger.error('Error stopping transport', { name, error });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
await Promise.all(stopPromises);
|
|
135
|
+
this.running = false;
|
|
136
|
+
this.logger.info('All transports stopped');
|
|
137
|
+
}
|
|
138
|
+
async getHealthStatus() {
|
|
139
|
+
const results = {};
|
|
140
|
+
for (const [name, transport] of this.transports) {
|
|
141
|
+
try {
|
|
142
|
+
const status = await transport.getHealthStatus();
|
|
143
|
+
results[name] = { healthy: status.healthy, error: status.error };
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
results[name] = {
|
|
147
|
+
healthy: false,
|
|
148
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
isRunning() {
|
|
155
|
+
return this.running;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export function createTransportManager(logger) {
|
|
159
|
+
return new TransportManager(logger);
|
|
160
|
+
}
|
|
161
|
+
export const DEFAULT_TRANSPORT_CONFIGS = {
|
|
162
|
+
stdio: {},
|
|
163
|
+
http: {
|
|
164
|
+
host: 'localhost',
|
|
165
|
+
port: 3000,
|
|
166
|
+
corsEnabled: true,
|
|
167
|
+
corsOrigins: ['*'],
|
|
168
|
+
maxRequestSize: '10mb',
|
|
169
|
+
requestTimeout: 30000,
|
|
170
|
+
},
|
|
171
|
+
websocket: {
|
|
172
|
+
host: 'localhost',
|
|
173
|
+
port: 3001,
|
|
174
|
+
path: '/ws',
|
|
175
|
+
maxConnections: 100,
|
|
176
|
+
heartbeatInterval: 30000,
|
|
177
|
+
heartbeatTimeout: 10000,
|
|
178
|
+
maxMessageSize: 10 * 1024 * 1024,
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - Stdio Transport
|
|
3
|
+
*
|
|
4
|
+
* Standard I/O transport for MCP communication
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import type { ITransport, TransportType, MCPNotification, RequestHandler, NotificationHandler, TransportHealthStatus, ILogger } from '../types.js';
|
|
8
|
+
export interface StdioTransportConfig {
|
|
9
|
+
inputStream?: NodeJS.ReadableStream;
|
|
10
|
+
outputStream?: NodeJS.WritableStream;
|
|
11
|
+
maxMessageSize?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class StdioTransport extends EventEmitter implements ITransport {
|
|
14
|
+
private readonly logger;
|
|
15
|
+
readonly type: TransportType;
|
|
16
|
+
private requestHandler?;
|
|
17
|
+
private notificationHandler?;
|
|
18
|
+
private rl?;
|
|
19
|
+
private running;
|
|
20
|
+
private messagesReceived;
|
|
21
|
+
private messagesSent;
|
|
22
|
+
private errors;
|
|
23
|
+
private readonly inputStream;
|
|
24
|
+
private readonly outputStream;
|
|
25
|
+
private readonly maxMessageSize;
|
|
26
|
+
constructor(logger: ILogger, config?: StdioTransportConfig);
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
onRequest(handler: RequestHandler): void;
|
|
30
|
+
onNotification(handler: NotificationHandler): void;
|
|
31
|
+
getHealthStatus(): Promise<TransportHealthStatus>;
|
|
32
|
+
private handleLine;
|
|
33
|
+
private handleRequest;
|
|
34
|
+
private handleNotification;
|
|
35
|
+
private sendResponse;
|
|
36
|
+
private sendError;
|
|
37
|
+
sendNotification(notification: MCPNotification): Promise<void>;
|
|
38
|
+
private write;
|
|
39
|
+
private handleClose;
|
|
40
|
+
private handleError;
|
|
41
|
+
}
|
|
42
|
+
export declare function createStdioTransport(logger: ILogger, config?: StdioTransportConfig): StdioTransport;
|
|
43
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transport/stdio.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EAGb,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,OAAO,EACR,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,UAAU;IAiBlE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAhBzB,SAAgB,IAAI,EAAE,aAAa,CAAW;IAE9C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,EAAE,CAAC,CAAqB;IAChC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAGrB,MAAM,EAAE,OAAO,EAChC,MAAM,GAAE,oBAAyB;IAQ7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIxC,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAI5C,eAAe,IAAI,OAAO,CAAC,qBAAqB,CAAC;YAWzC,UAAU;YA0CV,aAAa;YA4Bb,kBAAkB;YAalB,YAAY;YAMZ,SAAS;IAUjB,gBAAgB,CAAC,YAAY,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpE,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;CAKpB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,MAAM,GAAE,oBAAyB,GAChC,cAAc,CAEhB"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - Stdio Transport
|
|
3
|
+
*
|
|
4
|
+
* Standard I/O transport for MCP communication
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import * as readline from 'readline';
|
|
8
|
+
export class StdioTransport extends EventEmitter {
|
|
9
|
+
logger;
|
|
10
|
+
type = 'stdio';
|
|
11
|
+
requestHandler;
|
|
12
|
+
notificationHandler;
|
|
13
|
+
rl;
|
|
14
|
+
running = false;
|
|
15
|
+
messagesReceived = 0;
|
|
16
|
+
messagesSent = 0;
|
|
17
|
+
errors = 0;
|
|
18
|
+
inputStream;
|
|
19
|
+
outputStream;
|
|
20
|
+
maxMessageSize;
|
|
21
|
+
constructor(logger, config = {}) {
|
|
22
|
+
super();
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
this.inputStream = config.inputStream || process.stdin;
|
|
25
|
+
this.outputStream = config.outputStream || process.stdout;
|
|
26
|
+
this.maxMessageSize = config.maxMessageSize || 10 * 1024 * 1024;
|
|
27
|
+
}
|
|
28
|
+
async start() {
|
|
29
|
+
if (this.running) {
|
|
30
|
+
throw new Error('Stdio transport already running');
|
|
31
|
+
}
|
|
32
|
+
this.logger.info('Starting stdio transport');
|
|
33
|
+
this.rl = readline.createInterface({
|
|
34
|
+
input: this.inputStream,
|
|
35
|
+
crlfDelay: Infinity,
|
|
36
|
+
});
|
|
37
|
+
this.rl.on('line', (line) => {
|
|
38
|
+
this.handleLine(line);
|
|
39
|
+
});
|
|
40
|
+
this.rl.on('close', () => {
|
|
41
|
+
this.handleClose();
|
|
42
|
+
});
|
|
43
|
+
this.inputStream.on('error', (error) => {
|
|
44
|
+
this.handleError(error);
|
|
45
|
+
});
|
|
46
|
+
this.running = true;
|
|
47
|
+
this.logger.info('Stdio transport started');
|
|
48
|
+
}
|
|
49
|
+
async stop() {
|
|
50
|
+
if (!this.running) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.logger.info('Stopping stdio transport');
|
|
54
|
+
this.running = false;
|
|
55
|
+
if (this.rl) {
|
|
56
|
+
this.rl.close();
|
|
57
|
+
this.rl = undefined;
|
|
58
|
+
}
|
|
59
|
+
this.logger.info('Stdio transport stopped');
|
|
60
|
+
}
|
|
61
|
+
onRequest(handler) {
|
|
62
|
+
this.requestHandler = handler;
|
|
63
|
+
}
|
|
64
|
+
onNotification(handler) {
|
|
65
|
+
this.notificationHandler = handler;
|
|
66
|
+
}
|
|
67
|
+
async getHealthStatus() {
|
|
68
|
+
return {
|
|
69
|
+
healthy: this.running,
|
|
70
|
+
metrics: {
|
|
71
|
+
messagesReceived: this.messagesReceived,
|
|
72
|
+
messagesSent: this.messagesSent,
|
|
73
|
+
errors: this.errors,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async handleLine(line) {
|
|
78
|
+
if (!line.trim()) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (line.length > this.maxMessageSize) {
|
|
82
|
+
this.logger.error('Message exceeds maximum size', {
|
|
83
|
+
size: line.length,
|
|
84
|
+
max: this.maxMessageSize,
|
|
85
|
+
});
|
|
86
|
+
this.errors++;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const message = JSON.parse(line);
|
|
91
|
+
this.messagesReceived++;
|
|
92
|
+
if (message.jsonrpc !== '2.0') {
|
|
93
|
+
this.logger.warn('Invalid JSON-RPC version', { received: message.jsonrpc });
|
|
94
|
+
await this.sendError(message.id, -32600, 'Invalid JSON-RPC version');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!message.method) {
|
|
98
|
+
this.logger.warn('Missing method in request');
|
|
99
|
+
await this.sendError(message.id, -32600, 'Missing method');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (message.id !== undefined) {
|
|
103
|
+
await this.handleRequest(message);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
await this.handleNotification(message);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.errors++;
|
|
111
|
+
this.logger.error('Failed to parse message', { error, line: line.substring(0, 100) });
|
|
112
|
+
await this.sendError(null, -32700, 'Parse error');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async handleRequest(request) {
|
|
116
|
+
if (!this.requestHandler) {
|
|
117
|
+
this.logger.warn('No request handler registered');
|
|
118
|
+
await this.sendError(request.id, -32603, 'No request handler');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const startTime = performance.now();
|
|
123
|
+
const response = await this.requestHandler(request);
|
|
124
|
+
const duration = performance.now() - startTime;
|
|
125
|
+
this.logger.debug('Request processed', {
|
|
126
|
+
method: request.method,
|
|
127
|
+
duration: `${duration.toFixed(2)}ms`,
|
|
128
|
+
});
|
|
129
|
+
await this.sendResponse(response);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
this.logger.error('Request handler error', { method: request.method, error });
|
|
133
|
+
await this.sendError(request.id, -32603, error instanceof Error ? error.message : 'Internal error');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async handleNotification(notification) {
|
|
137
|
+
if (!this.notificationHandler) {
|
|
138
|
+
this.logger.debug('Notification received but no handler', { method: notification.method });
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
await this.notificationHandler(notification);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
this.logger.error('Notification handler error', { method: notification.method, error });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async sendResponse(response) {
|
|
149
|
+
const json = JSON.stringify(response);
|
|
150
|
+
await this.write(json);
|
|
151
|
+
this.messagesSent++;
|
|
152
|
+
}
|
|
153
|
+
async sendError(id, code, message) {
|
|
154
|
+
const response = {
|
|
155
|
+
jsonrpc: '2.0',
|
|
156
|
+
id,
|
|
157
|
+
error: { code, message },
|
|
158
|
+
};
|
|
159
|
+
await this.sendResponse(response);
|
|
160
|
+
this.errors++;
|
|
161
|
+
}
|
|
162
|
+
async sendNotification(notification) {
|
|
163
|
+
const json = JSON.stringify(notification);
|
|
164
|
+
await this.write(json);
|
|
165
|
+
this.messagesSent++;
|
|
166
|
+
}
|
|
167
|
+
write(data) {
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
this.outputStream.write(data + '\n', (error) => {
|
|
170
|
+
if (error) {
|
|
171
|
+
this.errors++;
|
|
172
|
+
reject(error);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
resolve();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
handleClose() {
|
|
181
|
+
this.logger.info('Stdio stream closed');
|
|
182
|
+
this.running = false;
|
|
183
|
+
this.emit('close');
|
|
184
|
+
}
|
|
185
|
+
handleError(error) {
|
|
186
|
+
this.logger.error('Stdio stream error', error);
|
|
187
|
+
this.errors++;
|
|
188
|
+
this.emit('error', error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function createStdioTransport(logger, config = {}) {
|
|
192
|
+
return new StdioTransport(logger, config);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transport/stdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/mcp - WebSocket Transport
|
|
3
|
+
*
|
|
4
|
+
* Standalone WebSocket transport with heartbeat
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import { WebSocket } from 'ws';
|
|
8
|
+
import type { ITransport, TransportType, MCPNotification, RequestHandler, NotificationHandler, TransportHealthStatus, ILogger, AuthConfig } from '../types.js';
|
|
9
|
+
export interface WebSocketTransportConfig {
|
|
10
|
+
host: string;
|
|
11
|
+
port: number;
|
|
12
|
+
path?: string;
|
|
13
|
+
maxConnections?: number;
|
|
14
|
+
heartbeatInterval?: number;
|
|
15
|
+
heartbeatTimeout?: number;
|
|
16
|
+
maxMessageSize?: number;
|
|
17
|
+
auth?: AuthConfig;
|
|
18
|
+
enableBinaryMode?: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface ClientConnection {
|
|
21
|
+
id: string;
|
|
22
|
+
ws: WebSocket;
|
|
23
|
+
createdAt: Date;
|
|
24
|
+
lastActivity: Date;
|
|
25
|
+
messageCount: number;
|
|
26
|
+
isAlive: boolean;
|
|
27
|
+
isAuthenticated: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare class WebSocketTransport extends EventEmitter implements ITransport {
|
|
30
|
+
private readonly logger;
|
|
31
|
+
private readonly config;
|
|
32
|
+
readonly type: TransportType;
|
|
33
|
+
private requestHandler?;
|
|
34
|
+
private notificationHandler?;
|
|
35
|
+
private server?;
|
|
36
|
+
private wss?;
|
|
37
|
+
private clients;
|
|
38
|
+
private heartbeatTimer?;
|
|
39
|
+
private running;
|
|
40
|
+
private connectionCounter;
|
|
41
|
+
private messagesReceived;
|
|
42
|
+
private messagesSent;
|
|
43
|
+
private errors;
|
|
44
|
+
private totalConnections;
|
|
45
|
+
constructor(logger: ILogger, config: WebSocketTransportConfig);
|
|
46
|
+
start(): Promise<void>;
|
|
47
|
+
stop(): Promise<void>;
|
|
48
|
+
onRequest(handler: RequestHandler): void;
|
|
49
|
+
onNotification(handler: NotificationHandler): void;
|
|
50
|
+
getHealthStatus(): Promise<TransportHealthStatus>;
|
|
51
|
+
sendNotification(notification: MCPNotification): Promise<void>;
|
|
52
|
+
sendToClient(clientId: string, notification: MCPNotification): Promise<boolean>;
|
|
53
|
+
getClients(): string[];
|
|
54
|
+
getClientInfo(clientId: string): ClientConnection | undefined;
|
|
55
|
+
disconnectClient(clientId: string, reason?: string): boolean;
|
|
56
|
+
private setupWebSocketHandlers;
|
|
57
|
+
private handleMessage;
|
|
58
|
+
private parseMessage;
|
|
59
|
+
private serializeMessage;
|
|
60
|
+
private startHeartbeat;
|
|
61
|
+
private stopHeartbeat;
|
|
62
|
+
}
|
|
63
|
+
export declare function createWebSocketTransport(logger: ILogger, config: WebSocketTransportConfig): WebSocketTransport;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAmB,SAAS,EAAW,MAAM,IAAI,CAAC;AAEzD,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EAGb,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,OAAO,EACP,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,UAAU;IAkBtE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAlBzB,SAAgB,IAAI,EAAE,aAAa,CAAe;IAElD,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAE9B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,gBAAgB,CAAK;gBAGV,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,wBAAwB;IAK7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIxC,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAI5C,eAAe,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAajD,gBAAgB,CAAC,YAAY,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBrF,UAAU,IAAI,MAAM,EAAE;IAItB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI7D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAA2B,GAAG,OAAO;IAc9E,OAAO,CAAC,sBAAsB;YA0DhB,aAAa;IAuE3B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;CAMtB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,wBAAwB,GAC/B,kBAAkB,CAEpB"}
|