@softtechai/quickmcp 1.0.8
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/README.md +553 -0
- package/dist/client/MCPClient.d.ts +24 -0
- package/dist/client/MCPClient.d.ts.map +1 -0
- package/dist/client/MCPClient.js +211 -0
- package/dist/client/MCPClient.js.map +1 -0
- package/dist/client/MCPClientUnified.d.ts +31 -0
- package/dist/client/MCPClientUnified.d.ts.map +1 -0
- package/dist/client/MCPClientUnified.js +275 -0
- package/dist/client/MCPClientUnified.js.map +1 -0
- package/dist/client/MCPTestRunner.d.ts +44 -0
- package/dist/client/MCPTestRunner.d.ts.map +1 -0
- package/dist/client/MCPTestRunner.js +220 -0
- package/dist/client/MCPTestRunner.js.map +1 -0
- package/dist/client/MCPTestRunnerUnified.d.ts +48 -0
- package/dist/client/MCPTestRunnerUnified.d.ts.map +1 -0
- package/dist/client/MCPTestRunnerUnified.js +183 -0
- package/dist/client/MCPTestRunnerUnified.js.map +1 -0
- package/dist/database/json-manager.d.ts +55 -0
- package/dist/database/json-manager.d.ts.map +1 -0
- package/dist/database/json-manager.js +128 -0
- package/dist/database/json-manager.js.map +1 -0
- package/dist/database/sqlite-manager.d.ts +53 -0
- package/dist/database/sqlite-manager.d.ts.map +1 -0
- package/dist/database/sqlite-manager.js +193 -0
- package/dist/database/sqlite-manager.js.map +1 -0
- package/dist/dynamic-mcp-executor.d.ts +14 -0
- package/dist/dynamic-mcp-executor.d.ts.map +1 -0
- package/dist/dynamic-mcp-executor.js +274 -0
- package/dist/dynamic-mcp-executor.js.map +1 -0
- package/dist/generators/MCPServerGenerator-new.d.ts +37 -0
- package/dist/generators/MCPServerGenerator-new.d.ts.map +1 -0
- package/dist/generators/MCPServerGenerator-new.js +287 -0
- package/dist/generators/MCPServerGenerator-new.js.map +1 -0
- package/dist/generators/MCPServerGenerator.d.ts +42 -0
- package/dist/generators/MCPServerGenerator.d.ts.map +1 -0
- package/dist/generators/MCPServerGenerator.js +494 -0
- package/dist/generators/MCPServerGenerator.js.map +1 -0
- package/dist/generators/database/sqlite-manager.d.ts +52 -0
- package/dist/generators/database/sqlite-manager.js +143 -0
- package/dist/generators/generators/MCPServerGenerator.d.ts +37 -0
- package/dist/generators/generators/MCPServerGenerator.js +396 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/integrated-mcp-server-new.d.ts +12 -0
- package/dist/integrated-mcp-server-new.d.ts.map +1 -0
- package/dist/integrated-mcp-server-new.js +253 -0
- package/dist/integrated-mcp-server-new.js.map +1 -0
- package/dist/integrated-mcp-server.d.ts +25 -0
- package/dist/integrated-mcp-server.d.ts.map +1 -0
- package/dist/integrated-mcp-server.js +541 -0
- package/dist/integrated-mcp-server.js.map +1 -0
- package/dist/mcp-inspector-server.d.ts +3 -0
- package/dist/mcp-inspector-server.d.ts.map +1 -0
- package/dist/mcp-inspector-server.js +119 -0
- package/dist/mcp-inspector-server.js.map +1 -0
- package/dist/mcp-sdk-server.d.ts +3 -0
- package/dist/mcp-sdk-server.d.ts.map +1 -0
- package/dist/mcp-sdk-server.js +90 -0
- package/dist/mcp-sdk-server.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +300 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/parsers/CsvParser.d.ts +7 -0
- package/dist/parsers/CsvParser.d.ts.map +1 -0
- package/dist/parsers/CsvParser.js +98 -0
- package/dist/parsers/CsvParser.js.map +1 -0
- package/dist/parsers/DatabaseParser.d.ts +18 -0
- package/dist/parsers/DatabaseParser.d.ts.map +1 -0
- package/dist/parsers/DatabaseParser.js +372 -0
- package/dist/parsers/DatabaseParser.js.map +1 -0
- package/dist/parsers/ExcelParser.d.ts +8 -0
- package/dist/parsers/ExcelParser.d.ts.map +1 -0
- package/dist/parsers/ExcelParser.js +119 -0
- package/dist/parsers/ExcelParser.js.map +1 -0
- package/dist/parsers/index.d.ts +13 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +88 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/parsers/ExcelParser.js +118 -0
- package/dist/parsers/types/index.js +2 -0
- package/dist/quickmcp-unified-bridge.d.ts +13 -0
- package/dist/quickmcp-unified-bridge.d.ts.map +1 -0
- package/dist/quickmcp-unified-bridge.js +176 -0
- package/dist/quickmcp-unified-bridge.js.map +1 -0
- package/dist/server/ServerManager.d.ts +37 -0
- package/dist/server/ServerManager.d.ts.map +1 -0
- package/dist/server/ServerManager.js +376 -0
- package/dist/server/ServerManager.js.map +1 -0
- package/dist/sqlite-manager.js +145 -0
- package/dist/start-new-server.d.ts +3 -0
- package/dist/start-new-server.d.ts.map +1 -0
- package/dist/start-new-server.js +10 -0
- package/dist/start-new-server.js.map +1 -0
- package/dist/test-app.d.ts +2 -0
- package/dist/test-app.d.ts.map +1 -0
- package/dist/test-app.js +119 -0
- package/dist/test-app.js.map +1 -0
- package/dist/test-new-architecture.d.ts +3 -0
- package/dist/test-new-architecture.d.ts.map +1 -0
- package/dist/test-new-architecture.js +72 -0
- package/dist/test-new-architecture.js.map +1 -0
- package/dist/transport/base-transport.d.ts +21 -0
- package/dist/transport/base-transport.d.ts.map +1 -0
- package/dist/transport/base-transport.js +16 -0
- package/dist/transport/base-transport.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +12 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/sse-transport.d.ts +13 -0
- package/dist/transport/sse-transport.d.ts.map +1 -0
- package/dist/transport/sse-transport.js +106 -0
- package/dist/transport/sse-transport.js.map +1 -0
- package/dist/transport/stdio-transport.d.ts +8 -0
- package/dist/transport/stdio-transport.d.ts.map +1 -0
- package/dist/transport/stdio-transport.js +53 -0
- package/dist/transport/stdio-transport.js.map +1 -0
- package/dist/transport/streamable-http-transport.d.ts +15 -0
- package/dist/transport/streamable-http-transport.d.ts.map +1 -0
- package/dist/transport/streamable-http-transport.js +151 -0
- package/dist/transport/streamable-http-transport.js.map +1 -0
- package/dist/types/index.d.ts +64 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/web/client/MCPClient.js +348 -0
- package/dist/web/client/MCPTestRunner.js +317 -0
- package/dist/web/database/json-manager.js +124 -0
- package/dist/web/database/sqlite-manager.js +146 -0
- package/dist/web/dynamic-mcp-executor.js +443 -0
- package/dist/web/generators/MCPServerGenerator-new.js +284 -0
- package/dist/web/generators/MCPServerGenerator.js +566 -0
- package/dist/web/integrated-mcp-server-new.js +394 -0
- package/dist/web/parsers/CsvParser.js +144 -0
- package/dist/web/parsers/DatabaseParser.js +637 -0
- package/dist/web/parsers/ExcelParser.js +180 -0
- package/dist/web/parsers/index.js +152 -0
- package/dist/web/server.d.ts +3 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +790 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/types/index.js +2 -0
- package/dist/web/web/server.js +860 -0
- package/package.json +68 -0
- package/quickmcp-direct-stdio.js +328 -0
- package/src/web/public/app.js +1795 -0
- package/src/web/public/database-tables.html +711 -0
- package/src/web/public/how-to-use.html +571 -0
- package/src/web/public/how-to-use.js +255 -0
- package/src/web/public/images/1-claude-quickmcp-stdio.png +0 -0
- package/src/web/public/images/2-claude-tools.png +0 -0
- package/src/web/public/images/3-claude-developer-settings.png +0 -0
- package/src/web/public/images/4-claude-config.png +0 -0
- package/src/web/public/images/5-claude-config-edit.png +0 -0
- package/src/web/public/index.html +626 -0
- package/src/web/public/manage-servers.html +198 -0
- package/src/web/public/modern-styles.css +946 -0
- package/src/web/public/shared-styles.css +2091 -0
- package/src/web/public/shared.js +93 -0
- package/src/web/public/test-servers.html +302 -0
package/dist/test-app.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const parsers_1 = require("./parsers");
|
|
37
|
+
const MCPServerGenerator_1 = require("./generators/MCPServerGenerator");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
async function testApplication() {
|
|
41
|
+
//console.log('🚀 Testing MCP Server Generator Application');
|
|
42
|
+
try {
|
|
43
|
+
// Test 1: Parse CSV data
|
|
44
|
+
//console.log('\n1. Testing CSV parsing...');
|
|
45
|
+
const parser = new parsers_1.DataSourceParser();
|
|
46
|
+
const dataSource = {
|
|
47
|
+
type: 'csv',
|
|
48
|
+
name: 'test-data',
|
|
49
|
+
filePath: path.join(__dirname, 'test-data.csv')
|
|
50
|
+
};
|
|
51
|
+
const parsedData = await parser.parse(dataSource);
|
|
52
|
+
console.log('✅ CSV parsing successful');
|
|
53
|
+
console.log(` - Found ${parsedData.length} table(s)`);
|
|
54
|
+
console.log(` - Headers: ${parsedData[0].headers.join(', ')}`);
|
|
55
|
+
console.log(` - Rows: ${parsedData[0].rows.length}`);
|
|
56
|
+
console.log(` - Data types: ${JSON.stringify(parsedData[0].metadata.dataTypes, null, 2)}`);
|
|
57
|
+
// Test 2: Generate MCP Server
|
|
58
|
+
console.log('\n2. Testing MCP server generation...');
|
|
59
|
+
const generator = new MCPServerGenerator_1.MCPServerGenerator();
|
|
60
|
+
const config = generator.generateConfigFromData('employee-data-server', 'MCP server for employee data analysis and querying', parsedData);
|
|
61
|
+
console.log('✅ MCP server config generated');
|
|
62
|
+
console.log(` - Tools: ${config.tools.length}`);
|
|
63
|
+
console.log(` - Resources: ${config.resources.length}`);
|
|
64
|
+
console.log(` - Prompts: ${config.prompts.length}`);
|
|
65
|
+
// Test 3: Generate server code
|
|
66
|
+
console.log('\n3. Testing server code generation...');
|
|
67
|
+
const serverCode = generator.generateServer(config, parsedData);
|
|
68
|
+
const packageJson = generator.generatePackageJson(config);
|
|
69
|
+
// Write generated files
|
|
70
|
+
const outputDir = './generated-test-server';
|
|
71
|
+
if (!fs.existsSync(outputDir)) {
|
|
72
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
fs.writeFileSync(path.join(outputDir, 'index.ts'), serverCode);
|
|
75
|
+
fs.writeFileSync(path.join(outputDir, 'package.json'), packageJson);
|
|
76
|
+
console.log('✅ Server code generated successfully');
|
|
77
|
+
console.log(` - Generated files in: ${outputDir}`);
|
|
78
|
+
console.log(` - index.ts: ${(serverCode.length / 1024).toFixed(1)}KB`);
|
|
79
|
+
// Test 4: Validate generated tools
|
|
80
|
+
console.log('\n4. Testing generated tools...');
|
|
81
|
+
const toolNames = config.tools.map(t => t.name);
|
|
82
|
+
const expectedTools = ['search_table_0', 'get_all_table_0', 'filter_table_0_by_name', 'filter_table_0_by_age', 'filter_table_0_by_city', 'filter_table_0_by_salary'];
|
|
83
|
+
const hasExpectedTools = expectedTools.every(tool => toolNames.some(t => t.includes(tool.split('_').slice(-1)[0])));
|
|
84
|
+
if (hasExpectedTools) {
|
|
85
|
+
console.log('✅ Generated tools validation passed');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log('❌ Generated tools validation failed');
|
|
89
|
+
console.log(` Expected tools containing: ${expectedTools.join(', ')}`);
|
|
90
|
+
console.log(` Generated tools: ${toolNames.join(', ')}`);
|
|
91
|
+
}
|
|
92
|
+
// Test 5: Validate generated resources
|
|
93
|
+
console.log('\n5. Testing generated resources...');
|
|
94
|
+
const resourceUris = config.resources.map(r => r.uri);
|
|
95
|
+
const expectedResources = ['schema://table_0', 'data://table_0/sample'];
|
|
96
|
+
const hasExpectedResources = expectedResources.every(uri => resourceUris.includes(uri));
|
|
97
|
+
if (hasExpectedResources) {
|
|
98
|
+
console.log('✅ Generated resources validation passed');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.log('❌ Generated resources validation failed');
|
|
102
|
+
console.log(` Expected: ${expectedResources.join(', ')}`);
|
|
103
|
+
console.log(` Generated: ${resourceUris.join(', ')}`);
|
|
104
|
+
}
|
|
105
|
+
console.log('\n🎉 All tests completed successfully!');
|
|
106
|
+
console.log('\nGenerated MCP Server Summary:');
|
|
107
|
+
console.log(` - Name: ${config.name}`);
|
|
108
|
+
console.log(` - Description: ${config.description}`);
|
|
109
|
+
console.log(` - Tools: ${config.tools.length}`);
|
|
110
|
+
console.log(` - Resources: ${config.resources.length}`);
|
|
111
|
+
console.log(` - Prompts: ${config.prompts.length}`);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error('❌ Test failed:', error);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
testApplication();
|
|
119
|
+
//# sourceMappingURL=test-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-app.js","sourceRoot":"","sources":["../src/test-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-new-architecture.d.ts","sourceRoot":"","sources":["../src/test-new-architecture.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const MCPServerGenerator_1 = require("./generators/MCPServerGenerator");
|
|
5
|
+
const integrated_mcp_server_new_1 = require("./integrated-mcp-server-new");
|
|
6
|
+
async function testNewArchitecture() {
|
|
7
|
+
try {
|
|
8
|
+
console.log('🚀 Testing new SQLite-based MCP architecture...\n');
|
|
9
|
+
// 1. Create generator and test server creation
|
|
10
|
+
console.log('1️⃣ Creating MCPServerGenerator...');
|
|
11
|
+
const generator = new MCPServerGenerator_1.MCPServerGenerator();
|
|
12
|
+
// 2. Create a test exception monitor server
|
|
13
|
+
console.log('2️⃣ Creating test exception server...');
|
|
14
|
+
const testData = {
|
|
15
|
+
exception_records: [
|
|
16
|
+
{ Id: 1, Application: 'TestApp', Message: 'Division by zero', Source: 'calc.cs', TimeCreated: '2024-01-01T10:00:00Z' },
|
|
17
|
+
{ Id: 2, Application: 'TestApp', Message: 'Null reference', Source: 'process.cs', TimeCreated: '2024-01-01T11:00:00Z' },
|
|
18
|
+
{ Id: 3, Application: 'WebApp', Message: 'Connection timeout', Source: 'db.cs', TimeCreated: '2024-01-01T12:00:00Z' }
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
const dbConfig = {
|
|
22
|
+
type: 'mssql',
|
|
23
|
+
server: 'localhost',
|
|
24
|
+
port: 1434,
|
|
25
|
+
database: 'exceptionmonitor',
|
|
26
|
+
username: 'sa',
|
|
27
|
+
password: 'StrongPassword123!',
|
|
28
|
+
encrypt: false,
|
|
29
|
+
trustServerCertificate: true
|
|
30
|
+
};
|
|
31
|
+
const result = await generator.generateServer('test-exceptions', 'Test Exception Monitor', testData, dbConfig);
|
|
32
|
+
if (result.success) {
|
|
33
|
+
console.log('✅ Server created successfully:', result.message);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log('❌ Server creation failed:', result.message);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// 3. Check stats
|
|
40
|
+
console.log('3️⃣ Checking stats...');
|
|
41
|
+
const stats = generator.getStats();
|
|
42
|
+
console.log(`📊 Stats: ${stats.servers} servers, ${stats.tools} tools, ${stats.resources} resources`);
|
|
43
|
+
// 4. List all tools
|
|
44
|
+
console.log('4️⃣ Listing all tools...');
|
|
45
|
+
const allTools = generator.getAllTools();
|
|
46
|
+
console.log(`🔧 Found ${allTools.length} tools:`);
|
|
47
|
+
allTools.forEach(tool => {
|
|
48
|
+
console.log(` - ${tool.name} (${tool.operation}): ${tool.description}`);
|
|
49
|
+
});
|
|
50
|
+
// 5. Start integrated MCP server
|
|
51
|
+
console.log('5️⃣ Starting IntegratedMCPServer...');
|
|
52
|
+
const integratedServer = new integrated_mcp_server_new_1.IntegratedMCPServer();
|
|
53
|
+
// Start server on port 3002 to avoid conflicts
|
|
54
|
+
setTimeout(async () => {
|
|
55
|
+
await integratedServer.start(3002);
|
|
56
|
+
}, 1000);
|
|
57
|
+
console.log('\n✅ New architecture test completed successfully!');
|
|
58
|
+
console.log('🌐 IntegratedMCPServer running on http://localhost:3002');
|
|
59
|
+
console.log('🔗 Bridge can now connect to /api/mcp-stdio endpoint');
|
|
60
|
+
console.log('\n📋 Summary:');
|
|
61
|
+
console.log(` • SQLite database: data/quickmcp.sqlite`);
|
|
62
|
+
console.log(` • Virtual servers: ${stats.servers}`);
|
|
63
|
+
console.log(` • Dynamic tools: ${stats.tools}`);
|
|
64
|
+
console.log(` • Dynamic resources: ${stats.resources}`);
|
|
65
|
+
console.log(` • No physical files generated! ✨`);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error('❌ Test failed:', error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
testNewArchitecture();
|
|
72
|
+
//# sourceMappingURL=test-new-architecture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-new-architecture.js","sourceRoot":"","sources":["../src/test-new-architecture.ts"],"names":[],"mappings":";;;AAEA,wEAAqE;AACrE,2EAAkE;AAElE,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAEjE,+CAA+C;QAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,uCAAkB,EAAE,CAAC;QAE3C,4CAA4C;QAC5C,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG;YACf,iBAAiB,EAAE;gBACjB,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBACtH,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBACvH,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE;aACtH;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,KAAK;YACd,sBAAsB,EAAE,IAAI;SAC7B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE/G,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,OAAO,aAAa,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,SAAS,YAAY,CAAC,CAAC;QAEtG,oBAAoB;QACpB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;QAClD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,gBAAgB,GAAG,IAAI,+CAAmB,EAAE,CAAC;QAEnD,+CAA+C;QAC/C,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAErD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface MCPMessage {
|
|
2
|
+
jsonrpc: string;
|
|
3
|
+
id?: number;
|
|
4
|
+
method?: string;
|
|
5
|
+
params?: any;
|
|
6
|
+
result?: any;
|
|
7
|
+
error?: {
|
|
8
|
+
code: number;
|
|
9
|
+
message: string;
|
|
10
|
+
data?: any;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare abstract class BaseTransport {
|
|
14
|
+
protected messageHandlers: Map<string, (message: MCPMessage) => void>;
|
|
15
|
+
abstract start(port?: number): Promise<void>;
|
|
16
|
+
abstract stop(): Promise<void>;
|
|
17
|
+
abstract sendMessage(message: MCPMessage): void;
|
|
18
|
+
onMessage(handler: (message: MCPMessage) => void): void;
|
|
19
|
+
protected notifyHandlers(message: MCPMessage): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=base-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-transport.d.ts","sourceRoot":"","sources":["../../src/transport/base-transport.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;CACH;AAED,8BAAsB,aAAa;IACjC,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,CAAa;IAElF,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5C,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAE/C,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAIvD,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAGpD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseTransport = void 0;
|
|
4
|
+
class BaseTransport {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.messageHandlers = new Map();
|
|
7
|
+
}
|
|
8
|
+
onMessage(handler) {
|
|
9
|
+
this.messageHandlers.set('default', handler);
|
|
10
|
+
}
|
|
11
|
+
notifyHandlers(message) {
|
|
12
|
+
this.messageHandlers.forEach(handler => handler(message));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.BaseTransport = BaseTransport;
|
|
16
|
+
//# sourceMappingURL=base-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-transport.js","sourceRoot":"","sources":["../../src/transport/base-transport.ts"],"names":[],"mappings":";;;AAaA,MAAsB,aAAa;IAAnC;QACY,oBAAe,GAA+C,IAAI,GAAG,EAAE,CAAC;IAapF,CAAC;IAPC,SAAS,CAAC,OAAsC;QAC9C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAES,cAAc,CAAC,OAAmB;QAC1C,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF;AAdD,sCAcC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { BaseTransport, MCPMessage } from './base-transport';
|
|
2
|
+
export { StdioTransport } from './stdio-transport';
|
|
3
|
+
export { SSETransport } from './sse-transport';
|
|
4
|
+
export { StreamableHTTPTransport } from './streamable-http-transport';
|
|
5
|
+
export type TransportType = 'stdio' | 'sse' | 'streamable-http';
|
|
6
|
+
export interface TransportConfig {
|
|
7
|
+
type: TransportType;
|
|
8
|
+
port?: number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,GAAG,iBAAiB,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StreamableHTTPTransport = exports.SSETransport = exports.StdioTransport = exports.BaseTransport = void 0;
|
|
4
|
+
var base_transport_1 = require("./base-transport");
|
|
5
|
+
Object.defineProperty(exports, "BaseTransport", { enumerable: true, get: function () { return base_transport_1.BaseTransport; } });
|
|
6
|
+
var stdio_transport_1 = require("./stdio-transport");
|
|
7
|
+
Object.defineProperty(exports, "StdioTransport", { enumerable: true, get: function () { return stdio_transport_1.StdioTransport; } });
|
|
8
|
+
var sse_transport_1 = require("./sse-transport");
|
|
9
|
+
Object.defineProperty(exports, "SSETransport", { enumerable: true, get: function () { return sse_transport_1.SSETransport; } });
|
|
10
|
+
var streamable_http_transport_1 = require("./streamable-http-transport");
|
|
11
|
+
Object.defineProperty(exports, "StreamableHTTPTransport", { enumerable: true, get: function () { return streamable_http_transport_1.StreamableHTTPTransport; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":";;;AAAA,mDAA6D;AAApD,+GAAA,aAAa,OAAA;AACtB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yEAAsE;AAA7D,oIAAA,uBAAuB,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseTransport, MCPMessage } from './base-transport';
|
|
2
|
+
export declare class SSETransport extends BaseTransport {
|
|
3
|
+
private app;
|
|
4
|
+
private server;
|
|
5
|
+
private clients;
|
|
6
|
+
private port;
|
|
7
|
+
constructor(port?: number);
|
|
8
|
+
private setupRoutes;
|
|
9
|
+
start(port?: number): Promise<void>;
|
|
10
|
+
stop(): Promise<void>;
|
|
11
|
+
sendMessage(message: MCPMessage): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sse-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-transport.d.ts","sourceRoot":"","sources":["../../src/transport/sse-transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG7D,qBAAa,YAAa,SAAQ,aAAa;IAC7C,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,IAAI,CAAgB;gBAEhB,IAAI,CAAC,EAAE,MAAM;IAOzB,OAAO,CAAC,WAAW;IA2Db,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAQvC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SSETransport = void 0;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const base_transport_1 = require("./base-transport");
|
|
9
|
+
class SSETransport extends base_transport_1.BaseTransport {
|
|
10
|
+
constructor(port) {
|
|
11
|
+
super();
|
|
12
|
+
this.server = null;
|
|
13
|
+
this.clients = new Set();
|
|
14
|
+
this.port = 3001;
|
|
15
|
+
this.port = port || 3001;
|
|
16
|
+
this.app = (0, express_1.default)();
|
|
17
|
+
this.setupRoutes();
|
|
18
|
+
}
|
|
19
|
+
setupRoutes() {
|
|
20
|
+
this.app.use(express_1.default.json());
|
|
21
|
+
// SSE endpoint for server-to-client communication
|
|
22
|
+
this.app.get('/sse', (req, res) => {
|
|
23
|
+
console.error('[SSE] Client connected to event stream');
|
|
24
|
+
res.writeHead(200, {
|
|
25
|
+
'Content-Type': 'text/event-stream',
|
|
26
|
+
'Cache-Control': 'no-cache',
|
|
27
|
+
'Connection': 'keep-alive',
|
|
28
|
+
'Access-Control-Allow-Origin': '*',
|
|
29
|
+
'Access-Control-Allow-Headers': 'Cache-Control'
|
|
30
|
+
});
|
|
31
|
+
this.clients.add(res);
|
|
32
|
+
// Send initial connection event
|
|
33
|
+
res.write(`data: ${JSON.stringify({ type: 'connected' })}\n\n`);
|
|
34
|
+
// Keep connection alive with heartbeat
|
|
35
|
+
const heartbeat = setInterval(() => {
|
|
36
|
+
res.write(`data: ${JSON.stringify({ type: 'heartbeat', timestamp: Date.now() })}\n\n`);
|
|
37
|
+
}, 30000);
|
|
38
|
+
req.on('close', () => {
|
|
39
|
+
console.error('[SSE] Client disconnected from event stream');
|
|
40
|
+
clearInterval(heartbeat);
|
|
41
|
+
this.clients.delete(res);
|
|
42
|
+
});
|
|
43
|
+
req.on('error', () => {
|
|
44
|
+
console.error('[SSE] Client connection error');
|
|
45
|
+
clearInterval(heartbeat);
|
|
46
|
+
this.clients.delete(res);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
// POST endpoint for client-to-server communication
|
|
50
|
+
this.app.post('/message', (req, res) => {
|
|
51
|
+
const message = req.body;
|
|
52
|
+
console.error(`[SSE] Received via POST: ${message.method || 'response'} (id: ${message.id})`);
|
|
53
|
+
// Process the message and get response
|
|
54
|
+
this.notifyHandlers(message);
|
|
55
|
+
// For MCP, just acknowledge receipt - actual response goes via SSE
|
|
56
|
+
res.json({ received: true });
|
|
57
|
+
});
|
|
58
|
+
// CORS preflight
|
|
59
|
+
this.app.options('/message', (req, res) => {
|
|
60
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
61
|
+
res.header('Access-Control-Allow-Methods', 'POST, OPTIONS');
|
|
62
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type');
|
|
63
|
+
res.sendStatus(200);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async start(port) {
|
|
67
|
+
if (port)
|
|
68
|
+
this.port = port;
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
this.server = this.app.listen(this.port, () => {
|
|
71
|
+
console.error(`[SSE] Transport started on port ${this.port}`);
|
|
72
|
+
console.error(`[SSE] Endpoints: GET /sse (event stream), POST /message (commands)`);
|
|
73
|
+
resolve();
|
|
74
|
+
});
|
|
75
|
+
this.server.on('error', reject);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async stop() {
|
|
79
|
+
return new Promise((resolve) => {
|
|
80
|
+
// Close all SSE connections
|
|
81
|
+
this.clients.forEach(client => {
|
|
82
|
+
client.write(`data: ${JSON.stringify({ type: 'closing' })}\n\n`);
|
|
83
|
+
client.end();
|
|
84
|
+
});
|
|
85
|
+
this.clients.clear();
|
|
86
|
+
if (this.server) {
|
|
87
|
+
this.server.close(() => {
|
|
88
|
+
console.error('[SSE] Transport stopped');
|
|
89
|
+
resolve();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
resolve();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
sendMessage(message) {
|
|
98
|
+
const eventData = `data: ${JSON.stringify(message)}\n\n`;
|
|
99
|
+
console.error(`[SSE] Broadcasting to ${this.clients.size} clients: ${message.result ? 'success' : message.error ? 'error' : 'request'}`);
|
|
100
|
+
this.clients.forEach(client => {
|
|
101
|
+
client.write(eventData);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.SSETransport = SSETransport;
|
|
106
|
+
//# sourceMappingURL=sse-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-transport.js","sourceRoot":"","sources":["../../src/transport/sse-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseTransport, MCPMessage } from './base-transport';
|
|
2
|
+
export declare class StdioTransport extends BaseTransport {
|
|
3
|
+
private buffer;
|
|
4
|
+
start(): Promise<void>;
|
|
5
|
+
stop(): Promise<void>;
|
|
6
|
+
sendMessage(message: MCPMessage): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=stdio-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-transport.d.ts","sourceRoot":"","sources":["../../src/transport/stdio-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE7D,qBAAa,cAAe,SAAQ,aAAa;IAC/C,OAAO,CAAC,MAAM,CAAM;IAEd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAIvC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StdioTransport = void 0;
|
|
4
|
+
const base_transport_1 = require("./base-transport");
|
|
5
|
+
class StdioTransport extends base_transport_1.BaseTransport {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.buffer = '';
|
|
9
|
+
}
|
|
10
|
+
async start() {
|
|
11
|
+
process.stdin.on('data', (data) => {
|
|
12
|
+
this.buffer += data.toString();
|
|
13
|
+
const lines = this.buffer.split('\n');
|
|
14
|
+
this.buffer = lines.pop() || '';
|
|
15
|
+
for (const line of lines) {
|
|
16
|
+
if (line.trim()) {
|
|
17
|
+
try {
|
|
18
|
+
const message = JSON.parse(line);
|
|
19
|
+
console.error(`[STDIO] Received: ${message.method || 'response'} (id: ${message.id})`);
|
|
20
|
+
this.notifyHandlers(message);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error('[STDIO] Error parsing message:', error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
process.stdin.on('end', () => {
|
|
29
|
+
console.error('[STDIO] STDIN ended');
|
|
30
|
+
process.exit(0);
|
|
31
|
+
});
|
|
32
|
+
process.on('SIGINT', () => {
|
|
33
|
+
console.error('[STDIO] Interrupted');
|
|
34
|
+
process.exit(0);
|
|
35
|
+
});
|
|
36
|
+
process.on('SIGTERM', () => {
|
|
37
|
+
console.error('[STDIO] Terminated');
|
|
38
|
+
process.exit(0);
|
|
39
|
+
});
|
|
40
|
+
process.stdin.resume();
|
|
41
|
+
console.error('[STDIO] Transport started');
|
|
42
|
+
}
|
|
43
|
+
async stop() {
|
|
44
|
+
process.stdin.pause();
|
|
45
|
+
console.error('[STDIO] Transport stopped');
|
|
46
|
+
}
|
|
47
|
+
sendMessage(message) {
|
|
48
|
+
console.error(`[STDIO] Sending: ${message.result ? 'success' : message.error ? 'error' : 'request'}`);
|
|
49
|
+
process.stdout.write(JSON.stringify(message) + '\n');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.StdioTransport = StdioTransport;
|
|
53
|
+
//# sourceMappingURL=stdio-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-transport.js","sourceRoot":"","sources":["../../src/transport/stdio-transport.ts"],"names":[],"mappings":";;;AAAA,qDAA6D;AAE7D,MAAa,cAAe,SAAQ,8BAAa;IAAjD;;QACU,WAAM,GAAG,EAAE,CAAC;IAiDtB,CAAC;IA/CC,KAAK,CAAC,KAAK;QACT,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACjC,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,MAAM,IAAI,UAAU,SAAS,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;wBACvF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC/B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,OAAmB;QAC7B,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACtG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;CACF;AAlDD,wCAkDC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseTransport, MCPMessage } from './base-transport';
|
|
2
|
+
export declare class StreamableHTTPTransport extends BaseTransport {
|
|
3
|
+
private app;
|
|
4
|
+
private server;
|
|
5
|
+
private port;
|
|
6
|
+
private sessions;
|
|
7
|
+
constructor(port?: number);
|
|
8
|
+
private setupRoutes;
|
|
9
|
+
private generateSessionId;
|
|
10
|
+
private processMessage;
|
|
11
|
+
start(port?: number): Promise<void>;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
sendMessage(message: MCPMessage): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=streamable-http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../src/transport/streamable-http-transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG7D,qBAAa,uBAAwB,SAAQ,aAAa;IACxD,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,IAAI,CAAC,EAAE,MAAM;IAOzB,OAAO,CAAC,WAAW;IAqFnB,OAAO,CAAC,iBAAiB;YAIX,cAAc;IAwBtB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAUvC"}
|