@agiflowai/scaffold-mcp 1.0.21 → 1.0.22
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/dist/cli.cjs +23 -22
- package/dist/cli.mjs +6 -5
- package/dist/index.cjs +12 -11
- package/dist/index.mjs +2 -1
- package/dist/stdio-BqcCsHuC.mjs +331 -0
- package/dist/stdio-D8getFsj.cjs +350 -0
- package/dist/{stdio-Boc4SGGT.mjs → tools-DRfJ2LZc.mjs} +1 -330
- package/dist/{stdio-Bw7Hyv3X.cjs → tools-S18iKO9I.cjs} +0 -348
- package/dist/{useScaffoldMethod-BR3ESqor.cjs → useScaffoldMethod-CmnKY0Vu.cjs} +80 -40
- package/dist/{useScaffoldMethod-DlrzH-3H.mjs → useScaffoldMethod-blx199pL.mjs} +80 -40
- package/package.json +5 -5
- /package/dist/{phantomCodeCheck-BXQonrXo.mjs → phantomCodeCheck-BwQWRJ9Q.mjs} +0 -0
- /package/dist/{phantomCodeCheck-DNkWyMRE.cjs → phantomCodeCheck-DhzeymO-.cjs} +0 -0
- /package/dist/{useScaffoldMethod-DaAZTyIM.mjs → useScaffoldMethod-BE2tHUMc.mjs} +0 -0
- /package/dist/{useScaffoldMethod-CJG7ngkT.cjs → useScaffoldMethod-CejnYNDD.cjs} +0 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
const require_ListScaffoldingMethodsTool = require('./ListScaffoldingMethodsTool-Dnd3E5X_.cjs');
|
|
2
|
+
let node_crypto = require("node:crypto");
|
|
3
|
+
let __modelcontextprotocol_sdk_server_streamableHttp_js = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
4
|
+
let __modelcontextprotocol_sdk_types_js = require("@modelcontextprotocol/sdk/types.js");
|
|
5
|
+
let express = require("express");
|
|
6
|
+
express = require_ListScaffoldingMethodsTool.__toESM(express);
|
|
7
|
+
let __modelcontextprotocol_sdk_server_sse_js = require("@modelcontextprotocol/sdk/server/sse.js");
|
|
8
|
+
let __modelcontextprotocol_sdk_server_stdio_js = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
9
|
+
|
|
10
|
+
//#region src/transports/http.ts
|
|
11
|
+
/**
|
|
12
|
+
* HTTP session manager
|
|
13
|
+
*/
|
|
14
|
+
var HttpFullSessionManager = class {
|
|
15
|
+
sessions = /* @__PURE__ */ new Map();
|
|
16
|
+
getSession(sessionId) {
|
|
17
|
+
return this.sessions.get(sessionId);
|
|
18
|
+
}
|
|
19
|
+
setSession(sessionId, transport, server) {
|
|
20
|
+
this.sessions.set(sessionId, {
|
|
21
|
+
transport,
|
|
22
|
+
server
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
deleteSession(sessionId) {
|
|
26
|
+
const session = this.sessions.get(sessionId);
|
|
27
|
+
if (session) session.server.close();
|
|
28
|
+
this.sessions.delete(sessionId);
|
|
29
|
+
}
|
|
30
|
+
hasSession(sessionId) {
|
|
31
|
+
return this.sessions.has(sessionId);
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
for (const session of this.sessions.values()) session.server.close();
|
|
35
|
+
this.sessions.clear();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* HTTP transport handler using Streamable HTTP (protocol version 2025-03-26)
|
|
40
|
+
* Provides stateful session management with resumability support
|
|
41
|
+
*/
|
|
42
|
+
var HttpTransportHandler = class {
|
|
43
|
+
serverFactory;
|
|
44
|
+
app;
|
|
45
|
+
server = null;
|
|
46
|
+
sessionManager;
|
|
47
|
+
config;
|
|
48
|
+
constructor(serverFactory, config) {
|
|
49
|
+
this.serverFactory = typeof serverFactory === "function" ? serverFactory : () => serverFactory;
|
|
50
|
+
this.app = (0, express.default)();
|
|
51
|
+
this.sessionManager = new HttpFullSessionManager();
|
|
52
|
+
this.config = {
|
|
53
|
+
mode: config.mode,
|
|
54
|
+
port: config.port ?? 3e3,
|
|
55
|
+
host: config.host ?? "localhost"
|
|
56
|
+
};
|
|
57
|
+
this.setupMiddleware();
|
|
58
|
+
this.setupRoutes();
|
|
59
|
+
}
|
|
60
|
+
setupMiddleware() {
|
|
61
|
+
this.app.use(express.default.json());
|
|
62
|
+
}
|
|
63
|
+
setupRoutes() {
|
|
64
|
+
this.app.post("/mcp", async (req, res) => {
|
|
65
|
+
await this.handlePostRequest(req, res);
|
|
66
|
+
});
|
|
67
|
+
this.app.get("/mcp", async (req, res) => {
|
|
68
|
+
await this.handleGetRequest(req, res);
|
|
69
|
+
});
|
|
70
|
+
this.app.delete("/mcp", async (req, res) => {
|
|
71
|
+
await this.handleDeleteRequest(req, res);
|
|
72
|
+
});
|
|
73
|
+
this.app.get("/health", (_req, res) => {
|
|
74
|
+
res.json({
|
|
75
|
+
status: "ok",
|
|
76
|
+
transport: "http"
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async handlePostRequest(req, res) {
|
|
81
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
82
|
+
let transport;
|
|
83
|
+
if (sessionId && this.sessionManager.hasSession(sessionId)) transport = this.sessionManager.getSession(sessionId).transport;
|
|
84
|
+
else if (!sessionId && (0, __modelcontextprotocol_sdk_types_js.isInitializeRequest)(req.body)) {
|
|
85
|
+
const mcpServer = this.serverFactory();
|
|
86
|
+
transport = new __modelcontextprotocol_sdk_server_streamableHttp_js.StreamableHTTPServerTransport({
|
|
87
|
+
sessionIdGenerator: () => (0, node_crypto.randomUUID)(),
|
|
88
|
+
enableJsonResponse: true,
|
|
89
|
+
onsessioninitialized: (sessionId$1) => {
|
|
90
|
+
this.sessionManager.setSession(sessionId$1, transport, mcpServer);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
transport.onclose = () => {
|
|
94
|
+
if (transport.sessionId) this.sessionManager.deleteSession(transport.sessionId);
|
|
95
|
+
};
|
|
96
|
+
await mcpServer.connect(transport);
|
|
97
|
+
} else {
|
|
98
|
+
res.status(400).json({
|
|
99
|
+
jsonrpc: "2.0",
|
|
100
|
+
error: {
|
|
101
|
+
code: -32e3,
|
|
102
|
+
message: "Bad Request: No valid session ID provided"
|
|
103
|
+
},
|
|
104
|
+
id: null
|
|
105
|
+
});
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
await transport.handleRequest(req, res, req.body);
|
|
109
|
+
}
|
|
110
|
+
async handleGetRequest(req, res) {
|
|
111
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
112
|
+
if (!sessionId || !this.sessionManager.hasSession(sessionId)) {
|
|
113
|
+
res.status(400).send("Invalid or missing session ID");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
await this.sessionManager.getSession(sessionId).transport.handleRequest(req, res);
|
|
117
|
+
}
|
|
118
|
+
async handleDeleteRequest(req, res) {
|
|
119
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
120
|
+
if (!sessionId || !this.sessionManager.hasSession(sessionId)) {
|
|
121
|
+
res.status(400).send("Invalid or missing session ID");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
await this.sessionManager.getSession(sessionId).transport.handleRequest(req, res);
|
|
125
|
+
this.sessionManager.deleteSession(sessionId);
|
|
126
|
+
}
|
|
127
|
+
async start() {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
try {
|
|
130
|
+
this.server = this.app.listen(this.config.port, this.config.host, () => {
|
|
131
|
+
console.error(`Scaffolding MCP server started on http://${this.config.host}:${this.config.port}/mcp`);
|
|
132
|
+
console.error(`Health check: http://${this.config.host}:${this.config.port}/health`);
|
|
133
|
+
resolve();
|
|
134
|
+
});
|
|
135
|
+
this.server.on("error", (error) => {
|
|
136
|
+
reject(error);
|
|
137
|
+
});
|
|
138
|
+
} catch (error) {
|
|
139
|
+
reject(error);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async stop() {
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
if (this.server) {
|
|
146
|
+
this.sessionManager.clear();
|
|
147
|
+
this.server.close((err) => {
|
|
148
|
+
if (err) reject(err);
|
|
149
|
+
else {
|
|
150
|
+
this.server = null;
|
|
151
|
+
resolve();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
} else resolve();
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
getPort() {
|
|
158
|
+
return this.config.port;
|
|
159
|
+
}
|
|
160
|
+
getHost() {
|
|
161
|
+
return this.config.host;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/transports/sse.ts
|
|
167
|
+
/**
|
|
168
|
+
* Session manager for SSE transports
|
|
169
|
+
*/
|
|
170
|
+
var SseSessionManager = class {
|
|
171
|
+
sessions = /* @__PURE__ */ new Map();
|
|
172
|
+
getSession(sessionId) {
|
|
173
|
+
return this.sessions.get(sessionId)?.transport;
|
|
174
|
+
}
|
|
175
|
+
setSession(sessionId, transport, server) {
|
|
176
|
+
this.sessions.set(sessionId, {
|
|
177
|
+
transport,
|
|
178
|
+
server
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
deleteSession(sessionId) {
|
|
182
|
+
const session = this.sessions.get(sessionId);
|
|
183
|
+
if (session) session.server.close();
|
|
184
|
+
this.sessions.delete(sessionId);
|
|
185
|
+
}
|
|
186
|
+
hasSession(sessionId) {
|
|
187
|
+
return this.sessions.has(sessionId);
|
|
188
|
+
}
|
|
189
|
+
clear() {
|
|
190
|
+
for (const session of this.sessions.values()) session.server.close();
|
|
191
|
+
this.sessions.clear();
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* SSE (Server-Sent Events) transport handler
|
|
196
|
+
* Legacy transport for backwards compatibility (protocol version 2024-11-05)
|
|
197
|
+
* Uses separate endpoints: /sse for SSE stream (GET) and /messages for client messages (POST)
|
|
198
|
+
*/
|
|
199
|
+
var SseTransportHandler = class {
|
|
200
|
+
serverFactory;
|
|
201
|
+
app;
|
|
202
|
+
server = null;
|
|
203
|
+
sessionManager;
|
|
204
|
+
config;
|
|
205
|
+
constructor(serverFactory, config) {
|
|
206
|
+
this.serverFactory = typeof serverFactory === "function" ? serverFactory : () => serverFactory;
|
|
207
|
+
this.app = (0, express.default)();
|
|
208
|
+
this.sessionManager = new SseSessionManager();
|
|
209
|
+
this.config = {
|
|
210
|
+
mode: config.mode,
|
|
211
|
+
port: config.port ?? 3e3,
|
|
212
|
+
host: config.host ?? "localhost"
|
|
213
|
+
};
|
|
214
|
+
this.setupMiddleware();
|
|
215
|
+
this.setupRoutes();
|
|
216
|
+
}
|
|
217
|
+
setupMiddleware() {
|
|
218
|
+
this.app.use(express.default.json());
|
|
219
|
+
}
|
|
220
|
+
setupRoutes() {
|
|
221
|
+
this.app.get("/sse", async (req, res) => {
|
|
222
|
+
await this.handleSseConnection(req, res);
|
|
223
|
+
});
|
|
224
|
+
this.app.post("/messages", async (req, res) => {
|
|
225
|
+
await this.handlePostMessage(req, res);
|
|
226
|
+
});
|
|
227
|
+
this.app.get("/health", (_req, res) => {
|
|
228
|
+
res.json({
|
|
229
|
+
status: "ok",
|
|
230
|
+
transport: "sse"
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
async handleSseConnection(_req, res) {
|
|
235
|
+
try {
|
|
236
|
+
const mcpServer = this.serverFactory();
|
|
237
|
+
const transport = new __modelcontextprotocol_sdk_server_sse_js.SSEServerTransport("/messages", res);
|
|
238
|
+
this.sessionManager.setSession(transport.sessionId, transport, mcpServer);
|
|
239
|
+
res.on("close", () => {
|
|
240
|
+
this.sessionManager.deleteSession(transport.sessionId);
|
|
241
|
+
});
|
|
242
|
+
await mcpServer.connect(transport);
|
|
243
|
+
console.error(`SSE session established: ${transport.sessionId}`);
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.error("Error handling SSE connection:", error);
|
|
246
|
+
if (!res.headersSent) res.status(500).send("Internal Server Error");
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async handlePostMessage(req, res) {
|
|
250
|
+
const sessionId = req.query.sessionId;
|
|
251
|
+
if (!sessionId) {
|
|
252
|
+
res.status(400).send("Missing sessionId query parameter");
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const transport = this.sessionManager.getSession(sessionId);
|
|
256
|
+
if (!transport) {
|
|
257
|
+
res.status(404).send("No transport found for sessionId");
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
262
|
+
} catch (error) {
|
|
263
|
+
console.error("Error handling post message:", error);
|
|
264
|
+
if (!res.headersSent) res.status(500).send("Internal Server Error");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async start() {
|
|
268
|
+
return new Promise((resolve, reject) => {
|
|
269
|
+
try {
|
|
270
|
+
this.server = this.app.listen(this.config.port, this.config.host, () => {
|
|
271
|
+
console.error(`Scaffolding MCP server started with SSE transport on http://${this.config.host}:${this.config.port}`);
|
|
272
|
+
console.error(`SSE endpoint: http://${this.config.host}:${this.config.port}/sse`);
|
|
273
|
+
console.error(`Messages endpoint: http://${this.config.host}:${this.config.port}/messages`);
|
|
274
|
+
console.error(`Health check: http://${this.config.host}:${this.config.port}/health`);
|
|
275
|
+
resolve();
|
|
276
|
+
});
|
|
277
|
+
this.server.on("error", (error) => {
|
|
278
|
+
reject(error);
|
|
279
|
+
});
|
|
280
|
+
} catch (error) {
|
|
281
|
+
reject(error);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async stop() {
|
|
286
|
+
return new Promise((resolve, reject) => {
|
|
287
|
+
if (this.server) {
|
|
288
|
+
this.sessionManager.clear();
|
|
289
|
+
this.server.close((err) => {
|
|
290
|
+
if (err) reject(err);
|
|
291
|
+
else {
|
|
292
|
+
this.server = null;
|
|
293
|
+
resolve();
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
} else resolve();
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
getPort() {
|
|
300
|
+
return this.config.port;
|
|
301
|
+
}
|
|
302
|
+
getHost() {
|
|
303
|
+
return this.config.host;
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
//#endregion
|
|
308
|
+
//#region src/transports/stdio.ts
|
|
309
|
+
/**
|
|
310
|
+
* Stdio transport handler for MCP server
|
|
311
|
+
* Used for command-line and direct integrations
|
|
312
|
+
*/
|
|
313
|
+
var StdioTransportHandler = class {
|
|
314
|
+
server;
|
|
315
|
+
transport = null;
|
|
316
|
+
constructor(server) {
|
|
317
|
+
this.server = server;
|
|
318
|
+
}
|
|
319
|
+
async start() {
|
|
320
|
+
this.transport = new __modelcontextprotocol_sdk_server_stdio_js.StdioServerTransport();
|
|
321
|
+
await this.server.connect(this.transport);
|
|
322
|
+
console.error("Scaffolding MCP server started on stdio");
|
|
323
|
+
}
|
|
324
|
+
async stop() {
|
|
325
|
+
if (this.transport) {
|
|
326
|
+
await this.transport.close();
|
|
327
|
+
this.transport = null;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
//#endregion
|
|
333
|
+
Object.defineProperty(exports, 'HttpTransportHandler', {
|
|
334
|
+
enumerable: true,
|
|
335
|
+
get: function () {
|
|
336
|
+
return HttpTransportHandler;
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
Object.defineProperty(exports, 'SseTransportHandler', {
|
|
340
|
+
enumerable: true,
|
|
341
|
+
get: function () {
|
|
342
|
+
return SseTransportHandler;
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
Object.defineProperty(exports, 'StdioTransportHandler', {
|
|
346
|
+
enumerable: true,
|
|
347
|
+
get: function () {
|
|
348
|
+
return StdioTransportHandler;
|
|
349
|
+
}
|
|
350
|
+
});
|
|
@@ -8,12 +8,6 @@ import { jsonSchemaToZod } from "@composio/json-schema-to-zod";
|
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
import * as fs$1 from "node:fs/promises";
|
|
10
10
|
import * as os$1 from "node:os";
|
|
11
|
-
import { randomUUID } from "node:crypto";
|
|
12
|
-
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
13
|
-
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
14
|
-
import express from "express";
|
|
15
|
-
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
16
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
17
11
|
|
|
18
12
|
//#region src/services/BoilerplateGeneratorService.ts
|
|
19
13
|
/**
|
|
@@ -1524,327 +1518,4 @@ Parameters:
|
|
|
1524
1518
|
};
|
|
1525
1519
|
|
|
1526
1520
|
//#endregion
|
|
1527
|
-
|
|
1528
|
-
/**
|
|
1529
|
-
* HTTP session manager
|
|
1530
|
-
*/
|
|
1531
|
-
var HttpFullSessionManager = class {
|
|
1532
|
-
sessions = /* @__PURE__ */ new Map();
|
|
1533
|
-
getSession(sessionId) {
|
|
1534
|
-
return this.sessions.get(sessionId);
|
|
1535
|
-
}
|
|
1536
|
-
setSession(sessionId, transport, server) {
|
|
1537
|
-
this.sessions.set(sessionId, {
|
|
1538
|
-
transport,
|
|
1539
|
-
server
|
|
1540
|
-
});
|
|
1541
|
-
}
|
|
1542
|
-
deleteSession(sessionId) {
|
|
1543
|
-
const session = this.sessions.get(sessionId);
|
|
1544
|
-
if (session) session.server.close();
|
|
1545
|
-
this.sessions.delete(sessionId);
|
|
1546
|
-
}
|
|
1547
|
-
hasSession(sessionId) {
|
|
1548
|
-
return this.sessions.has(sessionId);
|
|
1549
|
-
}
|
|
1550
|
-
clear() {
|
|
1551
|
-
for (const session of this.sessions.values()) session.server.close();
|
|
1552
|
-
this.sessions.clear();
|
|
1553
|
-
}
|
|
1554
|
-
};
|
|
1555
|
-
/**
|
|
1556
|
-
* HTTP transport handler using Streamable HTTP (protocol version 2025-03-26)
|
|
1557
|
-
* Provides stateful session management with resumability support
|
|
1558
|
-
*/
|
|
1559
|
-
var HttpTransportHandler = class {
|
|
1560
|
-
serverFactory;
|
|
1561
|
-
app;
|
|
1562
|
-
server = null;
|
|
1563
|
-
sessionManager;
|
|
1564
|
-
config;
|
|
1565
|
-
constructor(serverFactory, config) {
|
|
1566
|
-
this.serverFactory = typeof serverFactory === "function" ? serverFactory : () => serverFactory;
|
|
1567
|
-
this.app = express();
|
|
1568
|
-
this.sessionManager = new HttpFullSessionManager();
|
|
1569
|
-
this.config = {
|
|
1570
|
-
mode: config.mode,
|
|
1571
|
-
port: config.port ?? 3e3,
|
|
1572
|
-
host: config.host ?? "localhost"
|
|
1573
|
-
};
|
|
1574
|
-
this.setupMiddleware();
|
|
1575
|
-
this.setupRoutes();
|
|
1576
|
-
}
|
|
1577
|
-
setupMiddleware() {
|
|
1578
|
-
this.app.use(express.json());
|
|
1579
|
-
}
|
|
1580
|
-
setupRoutes() {
|
|
1581
|
-
this.app.post("/mcp", async (req, res) => {
|
|
1582
|
-
await this.handlePostRequest(req, res);
|
|
1583
|
-
});
|
|
1584
|
-
this.app.get("/mcp", async (req, res) => {
|
|
1585
|
-
await this.handleGetRequest(req, res);
|
|
1586
|
-
});
|
|
1587
|
-
this.app.delete("/mcp", async (req, res) => {
|
|
1588
|
-
await this.handleDeleteRequest(req, res);
|
|
1589
|
-
});
|
|
1590
|
-
this.app.get("/health", (_req, res) => {
|
|
1591
|
-
res.json({
|
|
1592
|
-
status: "ok",
|
|
1593
|
-
transport: "http"
|
|
1594
|
-
});
|
|
1595
|
-
});
|
|
1596
|
-
}
|
|
1597
|
-
async handlePostRequest(req, res) {
|
|
1598
|
-
const sessionId = req.headers["mcp-session-id"];
|
|
1599
|
-
let transport;
|
|
1600
|
-
if (sessionId && this.sessionManager.hasSession(sessionId)) transport = this.sessionManager.getSession(sessionId).transport;
|
|
1601
|
-
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
1602
|
-
const mcpServer = this.serverFactory();
|
|
1603
|
-
transport = new StreamableHTTPServerTransport({
|
|
1604
|
-
sessionIdGenerator: () => randomUUID(),
|
|
1605
|
-
enableJsonResponse: true,
|
|
1606
|
-
onsessioninitialized: (sessionId$1) => {
|
|
1607
|
-
this.sessionManager.setSession(sessionId$1, transport, mcpServer);
|
|
1608
|
-
}
|
|
1609
|
-
});
|
|
1610
|
-
transport.onclose = () => {
|
|
1611
|
-
if (transport.sessionId) this.sessionManager.deleteSession(transport.sessionId);
|
|
1612
|
-
};
|
|
1613
|
-
await mcpServer.connect(transport);
|
|
1614
|
-
} else {
|
|
1615
|
-
res.status(400).json({
|
|
1616
|
-
jsonrpc: "2.0",
|
|
1617
|
-
error: {
|
|
1618
|
-
code: -32e3,
|
|
1619
|
-
message: "Bad Request: No valid session ID provided"
|
|
1620
|
-
},
|
|
1621
|
-
id: null
|
|
1622
|
-
});
|
|
1623
|
-
return;
|
|
1624
|
-
}
|
|
1625
|
-
await transport.handleRequest(req, res, req.body);
|
|
1626
|
-
}
|
|
1627
|
-
async handleGetRequest(req, res) {
|
|
1628
|
-
const sessionId = req.headers["mcp-session-id"];
|
|
1629
|
-
if (!sessionId || !this.sessionManager.hasSession(sessionId)) {
|
|
1630
|
-
res.status(400).send("Invalid or missing session ID");
|
|
1631
|
-
return;
|
|
1632
|
-
}
|
|
1633
|
-
await this.sessionManager.getSession(sessionId).transport.handleRequest(req, res);
|
|
1634
|
-
}
|
|
1635
|
-
async handleDeleteRequest(req, res) {
|
|
1636
|
-
const sessionId = req.headers["mcp-session-id"];
|
|
1637
|
-
if (!sessionId || !this.sessionManager.hasSession(sessionId)) {
|
|
1638
|
-
res.status(400).send("Invalid or missing session ID");
|
|
1639
|
-
return;
|
|
1640
|
-
}
|
|
1641
|
-
await this.sessionManager.getSession(sessionId).transport.handleRequest(req, res);
|
|
1642
|
-
this.sessionManager.deleteSession(sessionId);
|
|
1643
|
-
}
|
|
1644
|
-
async start() {
|
|
1645
|
-
return new Promise((resolve, reject) => {
|
|
1646
|
-
try {
|
|
1647
|
-
this.server = this.app.listen(this.config.port, this.config.host, () => {
|
|
1648
|
-
console.error(`Scaffolding MCP server started on http://${this.config.host}:${this.config.port}/mcp`);
|
|
1649
|
-
console.error(`Health check: http://${this.config.host}:${this.config.port}/health`);
|
|
1650
|
-
resolve();
|
|
1651
|
-
});
|
|
1652
|
-
this.server.on("error", (error) => {
|
|
1653
|
-
reject(error);
|
|
1654
|
-
});
|
|
1655
|
-
} catch (error) {
|
|
1656
|
-
reject(error);
|
|
1657
|
-
}
|
|
1658
|
-
});
|
|
1659
|
-
}
|
|
1660
|
-
async stop() {
|
|
1661
|
-
return new Promise((resolve, reject) => {
|
|
1662
|
-
if (this.server) {
|
|
1663
|
-
this.sessionManager.clear();
|
|
1664
|
-
this.server.close((err) => {
|
|
1665
|
-
if (err) reject(err);
|
|
1666
|
-
else {
|
|
1667
|
-
this.server = null;
|
|
1668
|
-
resolve();
|
|
1669
|
-
}
|
|
1670
|
-
});
|
|
1671
|
-
} else resolve();
|
|
1672
|
-
});
|
|
1673
|
-
}
|
|
1674
|
-
getPort() {
|
|
1675
|
-
return this.config.port;
|
|
1676
|
-
}
|
|
1677
|
-
getHost() {
|
|
1678
|
-
return this.config.host;
|
|
1679
|
-
}
|
|
1680
|
-
};
|
|
1681
|
-
|
|
1682
|
-
//#endregion
|
|
1683
|
-
//#region src/transports/sse.ts
|
|
1684
|
-
/**
|
|
1685
|
-
* Session manager for SSE transports
|
|
1686
|
-
*/
|
|
1687
|
-
var SseSessionManager = class {
|
|
1688
|
-
sessions = /* @__PURE__ */ new Map();
|
|
1689
|
-
getSession(sessionId) {
|
|
1690
|
-
return this.sessions.get(sessionId)?.transport;
|
|
1691
|
-
}
|
|
1692
|
-
setSession(sessionId, transport, server) {
|
|
1693
|
-
this.sessions.set(sessionId, {
|
|
1694
|
-
transport,
|
|
1695
|
-
server
|
|
1696
|
-
});
|
|
1697
|
-
}
|
|
1698
|
-
deleteSession(sessionId) {
|
|
1699
|
-
const session = this.sessions.get(sessionId);
|
|
1700
|
-
if (session) session.server.close();
|
|
1701
|
-
this.sessions.delete(sessionId);
|
|
1702
|
-
}
|
|
1703
|
-
hasSession(sessionId) {
|
|
1704
|
-
return this.sessions.has(sessionId);
|
|
1705
|
-
}
|
|
1706
|
-
clear() {
|
|
1707
|
-
for (const session of this.sessions.values()) session.server.close();
|
|
1708
|
-
this.sessions.clear();
|
|
1709
|
-
}
|
|
1710
|
-
};
|
|
1711
|
-
/**
|
|
1712
|
-
* SSE (Server-Sent Events) transport handler
|
|
1713
|
-
* Legacy transport for backwards compatibility (protocol version 2024-11-05)
|
|
1714
|
-
* Uses separate endpoints: /sse for SSE stream (GET) and /messages for client messages (POST)
|
|
1715
|
-
*/
|
|
1716
|
-
var SseTransportHandler = class {
|
|
1717
|
-
serverFactory;
|
|
1718
|
-
app;
|
|
1719
|
-
server = null;
|
|
1720
|
-
sessionManager;
|
|
1721
|
-
config;
|
|
1722
|
-
constructor(serverFactory, config) {
|
|
1723
|
-
this.serverFactory = typeof serverFactory === "function" ? serverFactory : () => serverFactory;
|
|
1724
|
-
this.app = express();
|
|
1725
|
-
this.sessionManager = new SseSessionManager();
|
|
1726
|
-
this.config = {
|
|
1727
|
-
mode: config.mode,
|
|
1728
|
-
port: config.port ?? 3e3,
|
|
1729
|
-
host: config.host ?? "localhost"
|
|
1730
|
-
};
|
|
1731
|
-
this.setupMiddleware();
|
|
1732
|
-
this.setupRoutes();
|
|
1733
|
-
}
|
|
1734
|
-
setupMiddleware() {
|
|
1735
|
-
this.app.use(express.json());
|
|
1736
|
-
}
|
|
1737
|
-
setupRoutes() {
|
|
1738
|
-
this.app.get("/sse", async (req, res) => {
|
|
1739
|
-
await this.handleSseConnection(req, res);
|
|
1740
|
-
});
|
|
1741
|
-
this.app.post("/messages", async (req, res) => {
|
|
1742
|
-
await this.handlePostMessage(req, res);
|
|
1743
|
-
});
|
|
1744
|
-
this.app.get("/health", (_req, res) => {
|
|
1745
|
-
res.json({
|
|
1746
|
-
status: "ok",
|
|
1747
|
-
transport: "sse"
|
|
1748
|
-
});
|
|
1749
|
-
});
|
|
1750
|
-
}
|
|
1751
|
-
async handleSseConnection(_req, res) {
|
|
1752
|
-
try {
|
|
1753
|
-
const mcpServer = this.serverFactory();
|
|
1754
|
-
const transport = new SSEServerTransport("/messages", res);
|
|
1755
|
-
this.sessionManager.setSession(transport.sessionId, transport, mcpServer);
|
|
1756
|
-
res.on("close", () => {
|
|
1757
|
-
this.sessionManager.deleteSession(transport.sessionId);
|
|
1758
|
-
});
|
|
1759
|
-
await mcpServer.connect(transport);
|
|
1760
|
-
console.error(`SSE session established: ${transport.sessionId}`);
|
|
1761
|
-
} catch (error) {
|
|
1762
|
-
console.error("Error handling SSE connection:", error);
|
|
1763
|
-
if (!res.headersSent) res.status(500).send("Internal Server Error");
|
|
1764
|
-
}
|
|
1765
|
-
}
|
|
1766
|
-
async handlePostMessage(req, res) {
|
|
1767
|
-
const sessionId = req.query.sessionId;
|
|
1768
|
-
if (!sessionId) {
|
|
1769
|
-
res.status(400).send("Missing sessionId query parameter");
|
|
1770
|
-
return;
|
|
1771
|
-
}
|
|
1772
|
-
const transport = this.sessionManager.getSession(sessionId);
|
|
1773
|
-
if (!transport) {
|
|
1774
|
-
res.status(404).send("No transport found for sessionId");
|
|
1775
|
-
return;
|
|
1776
|
-
}
|
|
1777
|
-
try {
|
|
1778
|
-
await transport.handlePostMessage(req, res, req.body);
|
|
1779
|
-
} catch (error) {
|
|
1780
|
-
console.error("Error handling post message:", error);
|
|
1781
|
-
if (!res.headersSent) res.status(500).send("Internal Server Error");
|
|
1782
|
-
}
|
|
1783
|
-
}
|
|
1784
|
-
async start() {
|
|
1785
|
-
return new Promise((resolve, reject) => {
|
|
1786
|
-
try {
|
|
1787
|
-
this.server = this.app.listen(this.config.port, this.config.host, () => {
|
|
1788
|
-
console.error(`Scaffolding MCP server started with SSE transport on http://${this.config.host}:${this.config.port}`);
|
|
1789
|
-
console.error(`SSE endpoint: http://${this.config.host}:${this.config.port}/sse`);
|
|
1790
|
-
console.error(`Messages endpoint: http://${this.config.host}:${this.config.port}/messages`);
|
|
1791
|
-
console.error(`Health check: http://${this.config.host}:${this.config.port}/health`);
|
|
1792
|
-
resolve();
|
|
1793
|
-
});
|
|
1794
|
-
this.server.on("error", (error) => {
|
|
1795
|
-
reject(error);
|
|
1796
|
-
});
|
|
1797
|
-
} catch (error) {
|
|
1798
|
-
reject(error);
|
|
1799
|
-
}
|
|
1800
|
-
});
|
|
1801
|
-
}
|
|
1802
|
-
async stop() {
|
|
1803
|
-
return new Promise((resolve, reject) => {
|
|
1804
|
-
if (this.server) {
|
|
1805
|
-
this.sessionManager.clear();
|
|
1806
|
-
this.server.close((err) => {
|
|
1807
|
-
if (err) reject(err);
|
|
1808
|
-
else {
|
|
1809
|
-
this.server = null;
|
|
1810
|
-
resolve();
|
|
1811
|
-
}
|
|
1812
|
-
});
|
|
1813
|
-
} else resolve();
|
|
1814
|
-
});
|
|
1815
|
-
}
|
|
1816
|
-
getPort() {
|
|
1817
|
-
return this.config.port;
|
|
1818
|
-
}
|
|
1819
|
-
getHost() {
|
|
1820
|
-
return this.config.host;
|
|
1821
|
-
}
|
|
1822
|
-
};
|
|
1823
|
-
|
|
1824
|
-
//#endregion
|
|
1825
|
-
//#region src/transports/stdio.ts
|
|
1826
|
-
/**
|
|
1827
|
-
* Stdio transport handler for MCP server
|
|
1828
|
-
* Used for command-line and direct integrations
|
|
1829
|
-
*/
|
|
1830
|
-
var StdioTransportHandler = class {
|
|
1831
|
-
server;
|
|
1832
|
-
transport = null;
|
|
1833
|
-
constructor(server) {
|
|
1834
|
-
this.server = server;
|
|
1835
|
-
}
|
|
1836
|
-
async start() {
|
|
1837
|
-
this.transport = new StdioServerTransport();
|
|
1838
|
-
await this.server.connect(this.transport);
|
|
1839
|
-
console.error("Scaffolding MCP server started on stdio");
|
|
1840
|
-
}
|
|
1841
|
-
async stop() {
|
|
1842
|
-
if (this.transport) {
|
|
1843
|
-
await this.transport.close();
|
|
1844
|
-
this.transport = null;
|
|
1845
|
-
}
|
|
1846
|
-
}
|
|
1847
|
-
};
|
|
1848
|
-
|
|
1849
|
-
//#endregion
|
|
1850
|
-
export { UseScaffoldMethodTool as a, GenerateFeatureScaffoldTool as c, ScaffoldGeneratorService as d, BoilerplateService as f, WriteToFileTool as i, GenerateBoilerplateTool as l, SseTransportHandler as n, UseBoilerplateTool as o, BoilerplateGeneratorService as p, HttpTransportHandler as r, ListBoilerplatesTool as s, StdioTransportHandler as t, GenerateBoilerplateFileTool as u };
|
|
1521
|
+
export { GenerateFeatureScaffoldTool as a, ScaffoldGeneratorService as c, ListBoilerplatesTool as i, BoilerplateService as l, UseScaffoldMethodTool as n, GenerateBoilerplateTool as o, UseBoilerplateTool as r, GenerateBoilerplateFileTool as s, WriteToFileTool as t, BoilerplateGeneratorService as u };
|