vite-plugin-swagger-mcp 0.0.13 → 0.0.15

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/cjs/index.js CHANGED
@@ -210,21 +210,60 @@ function vitePluginSwaggerMcp({
210
210
  ]
211
211
  })
212
212
  );
213
- await mcpServer.connect(transport);
214
213
  console.log(
215
214
  "MCP server connected:",
216
215
  `http://localhost:${(_b = (_a = server.config) == null ? void 0 : _a.server) == null ? void 0 : _b.port}/_mcp/sse/swagger`
217
216
  );
218
217
  server.middlewares.use("/_mcp/sse/swagger", async (req, res) => {
219
- try {
220
- await transport.handleRequest(req, res);
221
- } catch (err) {
222
- console.error("[MCP]", err);
223
- if (!res.headersSent) {
218
+ var _a2;
219
+ if (req.method === "POST") {
220
+ const sessionId = req.headers["mcp-session-id"];
221
+ let body = "";
222
+ for await (const chunk of req)
223
+ body += chunk;
224
+ const json = JSON.parse(body);
225
+ console.log("post request received");
226
+ console.log("body: ", json);
227
+ try {
228
+ if (sessionId && transports[sessionId]) {
229
+ transport = transports[sessionId];
230
+ await transport.handleRequest(req, res, json);
231
+ return;
232
+ }
233
+ if (!sessionId) {
234
+ await mcpServer.connect(transport);
235
+ await transport.handleRequest(req, res, json);
236
+ const sessionId2 = transport.sessionId;
237
+ if (sessionId2) {
238
+ transports[sessionId2] = transport;
239
+ }
240
+ return;
241
+ }
242
+ res.statusCode = 400;
243
+ res.end("Bad Request: invalid session ID or method.");
244
+ return;
245
+ } catch (error) {
246
+ console.error("Error handling MCP request:", error);
224
247
  res.statusCode = 500;
225
- res.end();
248
+ res.end("Internal server error.");
249
+ return;
226
250
  }
227
251
  }
252
+ if (req.method === "GET") {
253
+ if (!((_a2 = req.headers.accept) == null ? void 0 : _a2.includes("text/event-stream"))) {
254
+ res.writeHead(405);
255
+ return res.end();
256
+ }
257
+ res.writeHead(200, {
258
+ "Content-Type": "text/event-stream",
259
+ "Cache-Control": "no-cache",
260
+ Connection: "keep-alive"
261
+ });
262
+ transport.onmessage = (message) => {
263
+ res.write(message);
264
+ };
265
+ return;
266
+ }
228
267
  });
229
268
  } catch (error) {
230
269
  console.log("MCP server error", error);
package/dist/esm/index.js CHANGED
@@ -10,6 +10,8 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
10
10
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
11
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
12
12
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
+ function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
14
+ function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(r) { var n = this.s.return; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, throw: function _throw(r) { var n = this.s.return; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
13
15
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
16
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
15
17
  import { randomUUID } from "node:crypto";
@@ -240,178 +242,275 @@ export default function vitePluginSwaggerMcp(_ref) {
240
242
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
241
243
  while (1) switch (_context9.prev = _context9.next) {
242
244
  case 0:
243
- _context9.prev = 0;
244
- transport = new StreamableHTTPServerTransport({
245
- sessionIdGenerator: function sessionIdGenerator() {
246
- return randomUUID();
247
- },
248
- onsessioninitialized: function onsessioninitialized(sessionId) {
249
- // Store the transport by session ID
250
- transports[sessionId] = transport;
251
- }
252
- }); // Clean up transport when closed
253
- transport.onclose = function () {
254
- if (transport.sessionId) {
255
- delete transports[transport.sessionId];
256
- }
257
- };
258
- swaggerServer = new SwaggerMcpServer(swaggerUrl, token); // 实例化 MCP Server
259
- mcpServer = new McpServer({
260
- name: "swagger-mcp-server",
261
- version: "0.1.0"
262
- }); // 注册工具
263
- /***
264
- * 获取模块列表
265
- */
266
- mcpServer.tool("getModules", "获取模块列表", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
267
- var res;
268
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
269
- while (1) switch (_context5.prev = _context5.next) {
270
- case 0:
271
- _context5.next = 2;
272
- return swaggerServer.getModules();
273
- case 2:
274
- res = _context5.sent;
275
- return _context5.abrupt("return", {
276
- content: [{
277
- type: "text",
278
- text: JSON.stringify(res)
279
- }]
280
- });
281
- case 4:
282
- case "end":
283
- return _context5.stop();
245
+ try {
246
+ transport = new StreamableHTTPServerTransport({
247
+ sessionIdGenerator: function sessionIdGenerator() {
248
+ return randomUUID();
249
+ },
250
+ onsessioninitialized: function onsessioninitialized(sessionId) {
251
+ // Store the transport by session ID
252
+ transports[sessionId] = transport;
284
253
  }
285
- }, _callee5);
286
- })));
287
-
288
- /***
289
- * 获取特定模块下的所有接口及返回值类型
290
- */
291
- mcpServer.tool("getModuleApis", "获取特定模块下的所有接口及返回值类型", {
292
- module: z.string().describe("模块名称")
293
- }, /*#__PURE__*/function () {
294
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(_ref3) {
295
- var module, res;
296
- return _regeneratorRuntime().wrap(function _callee6$(_context6) {
297
- while (1) switch (_context6.prev = _context6.next) {
254
+ }); // Clean up transport when closed
255
+ transport.onclose = function () {
256
+ if (transport.sessionId) {
257
+ delete transports[transport.sessionId];
258
+ }
259
+ };
260
+ swaggerServer = new SwaggerMcpServer(swaggerUrl, token); // 实例化 MCP Server
261
+ mcpServer = new McpServer({
262
+ name: "swagger-mcp-server",
263
+ version: "0.1.0"
264
+ }); // 注册工具
265
+ /***
266
+ * 获取模块列表
267
+ */
268
+ mcpServer.tool("getModules", "获取模块列表", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
269
+ var res;
270
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
271
+ while (1) switch (_context5.prev = _context5.next) {
298
272
  case 0:
299
- module = _ref3.module;
300
- if (module) {
301
- _context6.next = 3;
302
- break;
303
- }
304
- return _context6.abrupt("return", {
305
- content: [{
306
- type: "text",
307
- text: JSON.stringify({
308
- error: "模块名称不能为空"
309
- })
310
- }]
311
- });
312
- case 3:
313
- _context6.next = 5;
314
- return swaggerServer.getModuleApis(module);
315
- case 5:
316
- res = _context6.sent;
317
- return _context6.abrupt("return", {
273
+ _context5.next = 2;
274
+ return swaggerServer.getModules();
275
+ case 2:
276
+ res = _context5.sent;
277
+ return _context5.abrupt("return", {
318
278
  content: [{
319
279
  type: "text",
320
280
  text: JSON.stringify(res)
321
281
  }]
322
282
  });
323
- case 7:
283
+ case 4:
324
284
  case "end":
325
- return _context6.stop();
285
+ return _context5.stop();
326
286
  }
327
- }, _callee6);
328
- }));
329
- return function (_x4) {
330
- return _ref4.apply(this, arguments);
331
- };
332
- }());
287
+ }, _callee5);
288
+ })));
333
289
 
334
- /***
335
- * 获取特定接口的参数及返回值类型
336
- */
337
- mcpServer.tool("getApiTypes", "获取特定接口的参数及返回值类型", {
338
- path: z.string(),
339
- method: z.string()
340
- }, /*#__PURE__*/function () {
341
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(args) {
342
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
343
- while (1) switch (_context7.prev = _context7.next) {
344
- case 0:
345
- _context7.t0 = JSON;
346
- _context7.next = 3;
347
- return swaggerServer.getApiTypes(args.path, args.method);
348
- case 3:
349
- _context7.t1 = _context7.sent;
350
- _context7.t2 = _context7.t0.stringify.call(_context7.t0, _context7.t1);
351
- _context7.t3 = {
352
- type: "text",
353
- text: _context7.t2
354
- };
355
- _context7.t4 = [_context7.t3];
356
- return _context7.abrupt("return", {
357
- content: _context7.t4
358
- });
359
- case 8:
360
- case "end":
361
- return _context7.stop();
362
- }
363
- }, _callee7);
364
- }));
365
- return function (_x5) {
366
- return _ref5.apply(this, arguments);
367
- };
368
- }());
290
+ /***
291
+ * 获取特定模块下的所有接口及返回值类型
292
+ */
293
+ mcpServer.tool("getModuleApis", "获取特定模块下的所有接口及返回值类型", {
294
+ module: z.string().describe("模块名称")
295
+ }, /*#__PURE__*/function () {
296
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(_ref3) {
297
+ var module, res;
298
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
299
+ while (1) switch (_context6.prev = _context6.next) {
300
+ case 0:
301
+ module = _ref3.module;
302
+ if (module) {
303
+ _context6.next = 3;
304
+ break;
305
+ }
306
+ return _context6.abrupt("return", {
307
+ content: [{
308
+ type: "text",
309
+ text: JSON.stringify({
310
+ error: "模块名称不能为空"
311
+ })
312
+ }]
313
+ });
314
+ case 3:
315
+ _context6.next = 5;
316
+ return swaggerServer.getModuleApis(module);
317
+ case 5:
318
+ res = _context6.sent;
319
+ return _context6.abrupt("return", {
320
+ content: [{
321
+ type: "text",
322
+ text: JSON.stringify(res)
323
+ }]
324
+ });
325
+ case 7:
326
+ case "end":
327
+ return _context6.stop();
328
+ }
329
+ }, _callee6);
330
+ }));
331
+ return function (_x4) {
332
+ return _ref4.apply(this, arguments);
333
+ };
334
+ }());
369
335
 
370
- // Connect to the MCP mcpServer
371
- _context9.next = 10;
372
- return mcpServer.connect(transport);
373
- case 10:
374
- console.log("MCP server connected:", "http://localhost:".concat((_server$config = server.config) === null || _server$config === void 0 || (_server$config = _server$config.server) === null || _server$config === void 0 ? void 0 : _server$config.port, "/_mcp/sse/swagger"));
375
- server.middlewares.use('/_mcp/sse/swagger', /*#__PURE__*/function () {
376
- var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(req, res) {
377
- return _regeneratorRuntime().wrap(function _callee8$(_context8) {
378
- while (1) switch (_context8.prev = _context8.next) {
379
- case 0:
380
- _context8.prev = 0;
381
- _context8.next = 3;
382
- return transport.handleRequest(req, res);
383
- case 3:
384
- _context8.next = 9;
385
- break;
386
- case 5:
387
- _context8.prev = 5;
388
- _context8.t0 = _context8["catch"](0);
389
- console.error('[MCP]', _context8.t0);
390
- if (!res.headersSent) {
336
+ /***
337
+ * 获取特定接口的参数及返回值类型
338
+ */
339
+ mcpServer.tool("getApiTypes", "获取特定接口的参数及返回值类型", {
340
+ path: z.string(),
341
+ method: z.string()
342
+ }, /*#__PURE__*/function () {
343
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(args) {
344
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
345
+ while (1) switch (_context7.prev = _context7.next) {
346
+ case 0:
347
+ _context7.t0 = JSON;
348
+ _context7.next = 3;
349
+ return swaggerServer.getApiTypes(args.path, args.method);
350
+ case 3:
351
+ _context7.t1 = _context7.sent;
352
+ _context7.t2 = _context7.t0.stringify.call(_context7.t0, _context7.t1);
353
+ _context7.t3 = {
354
+ type: "text",
355
+ text: _context7.t2
356
+ };
357
+ _context7.t4 = [_context7.t3];
358
+ return _context7.abrupt("return", {
359
+ content: _context7.t4
360
+ });
361
+ case 8:
362
+ case "end":
363
+ return _context7.stop();
364
+ }
365
+ }, _callee7);
366
+ }));
367
+ return function (_x5) {
368
+ return _ref5.apply(this, arguments);
369
+ };
370
+ }());
371
+
372
+ // Connect to the MCP mcpServer
373
+ console.log("MCP server connected:", "http://localhost:".concat((_server$config = server.config) === null || _server$config === void 0 || (_server$config = _server$config.server) === null || _server$config === void 0 ? void 0 : _server$config.port, "/_mcp/sse/swagger"));
374
+ server.middlewares.use('/_mcp/sse/swagger', /*#__PURE__*/function () {
375
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(req, res) {
376
+ var _sessionId, body, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, json, _sessionId2, _req$headers$accept;
377
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
378
+ while (1) switch (_context8.prev = _context8.next) {
379
+ case 0:
380
+ if (!(req.method === 'POST')) {
381
+ _context8.next = 59;
382
+ break;
383
+ }
384
+ _sessionId = req.headers["mcp-session-id"];
385
+ body = '';
386
+ _iteratorAbruptCompletion = false;
387
+ _didIteratorError = false;
388
+ _context8.prev = 5;
389
+ _iterator = _asyncIterator(req);
390
+ case 7:
391
+ _context8.next = 9;
392
+ return _iterator.next();
393
+ case 9:
394
+ if (!(_iteratorAbruptCompletion = !(_step = _context8.sent).done)) {
395
+ _context8.next = 15;
396
+ break;
397
+ }
398
+ chunk = _step.value;
399
+ body += chunk;
400
+ case 12:
401
+ _iteratorAbruptCompletion = false;
402
+ _context8.next = 7;
403
+ break;
404
+ case 15:
405
+ _context8.next = 21;
406
+ break;
407
+ case 17:
408
+ _context8.prev = 17;
409
+ _context8.t0 = _context8["catch"](5);
410
+ _didIteratorError = true;
411
+ _iteratorError = _context8.t0;
412
+ case 21:
413
+ _context8.prev = 21;
414
+ _context8.prev = 22;
415
+ if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
416
+ _context8.next = 26;
417
+ break;
418
+ }
419
+ _context8.next = 26;
420
+ return _iterator.return();
421
+ case 26:
422
+ _context8.prev = 26;
423
+ if (!_didIteratorError) {
424
+ _context8.next = 29;
425
+ break;
426
+ }
427
+ throw _iteratorError;
428
+ case 29:
429
+ return _context8.finish(26);
430
+ case 30:
431
+ return _context8.finish(21);
432
+ case 31:
433
+ json = JSON.parse(body);
434
+ console.log("post request received");
435
+ console.log("body: ", json);
436
+ _context8.prev = 34;
437
+ if (!(_sessionId && transports[_sessionId])) {
438
+ _context8.next = 40;
439
+ break;
440
+ }
441
+ transport = transports[_sessionId];
442
+ _context8.next = 39;
443
+ return transport.handleRequest(req, res, json);
444
+ case 39:
445
+ return _context8.abrupt("return");
446
+ case 40:
447
+ if (_sessionId) {
448
+ _context8.next = 48;
449
+ break;
450
+ }
451
+ _context8.next = 43;
452
+ return mcpServer.connect(transport);
453
+ case 43:
454
+ _context8.next = 45;
455
+ return transport.handleRequest(req, res, json);
456
+ case 45:
457
+ // session ID will only be available (if in not Stateless-Mode)
458
+ // after handling the first request
459
+ _sessionId2 = transport.sessionId;
460
+ if (_sessionId2) {
461
+ transports[_sessionId2] = transport;
462
+ }
463
+ return _context8.abrupt("return");
464
+ case 48:
465
+ res.statusCode = 400;
466
+ res.end("Bad Request: invalid session ID or method.");
467
+ return _context8.abrupt("return");
468
+ case 53:
469
+ _context8.prev = 53;
470
+ _context8.t1 = _context8["catch"](34);
471
+ console.error('Error handling MCP request:', _context8.t1);
391
472
  res.statusCode = 500;
392
- res.end();
393
- }
394
- case 9:
395
- case "end":
396
- return _context8.stop();
397
- }
398
- }, _callee8, null, [[0, 5]]);
399
- }));
400
- return function (_x6, _x7) {
401
- return _ref6.apply(this, arguments);
402
- };
403
- }());
404
- _context9.next = 17;
405
- break;
406
- case 14:
407
- _context9.prev = 14;
408
- _context9.t0 = _context9["catch"](0);
409
- console.log("MCP server error", _context9.t0);
410
- case 17:
473
+ res.end("Internal server error.");
474
+ return _context8.abrupt("return");
475
+ case 59:
476
+ if (!(req.method === 'GET')) {
477
+ _context8.next = 66;
478
+ break;
479
+ }
480
+ if ((_req$headers$accept = req.headers.accept) !== null && _req$headers$accept !== void 0 && _req$headers$accept.includes('text/event-stream')) {
481
+ _context8.next = 63;
482
+ break;
483
+ }
484
+ res.writeHead(405);
485
+ return _context8.abrupt("return", res.end());
486
+ case 63:
487
+ res.writeHead(200, {
488
+ 'Content-Type': 'text/event-stream',
489
+ 'Cache-Control': 'no-cache',
490
+ Connection: 'keep-alive'
491
+ });
492
+ transport.onmessage = function (message) {
493
+ res.write(message);
494
+ };
495
+ return _context8.abrupt("return");
496
+ case 66:
497
+ case "end":
498
+ return _context8.stop();
499
+ }
500
+ }, _callee8, null, [[5, 17, 21, 31], [22,, 26, 30], [34, 53]]);
501
+ }));
502
+ return function (_x6, _x7) {
503
+ return _ref6.apply(this, arguments);
504
+ };
505
+ }());
506
+ } catch (error) {
507
+ console.log("MCP server error", error);
508
+ }
509
+ case 1:
411
510
  case "end":
412
511
  return _context9.stop();
413
512
  }
414
- }, _callee9, null, [[0, 14]]);
513
+ }, _callee9);
415
514
  }))();
416
515
  }
417
516
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-swagger-mcp",
3
- "version": "0.0.13",
3
+ "version": "0.0.15",
4
4
  "description": "vite plugin for swagger mcp",
5
5
  "homepage": "https://github.com/mmdctjj/vite-plugin-swagger-mcp",
6
6
  "repository": {