vite-plugin-swagger-mcp 0.0.7 → 0.0.9

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
@@ -24,9 +24,9 @@ __export(src_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(src_exports);
26
26
  var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
27
- var import_zod = require("zod");
28
27
  var import_streamableHttp = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
29
28
  var import_node_crypto = require("node:crypto");
29
+ var import_zod = require("zod");
30
30
  var SwaggerMcpServer = class {
31
31
  constructor(swaggerUrl, token) {
32
32
  this.swaggerUrl = swaggerUrl;
@@ -215,17 +215,36 @@ function vitePluginSwaggerMcp({
215
215
  "MCP server connected:",
216
216
  `http://localhost:${(_b = (_a = server.config) == null ? void 0 : _a.server) == null ? void 0 : _b.port}/_mcp/sse/swagger`
217
217
  );
218
+ const SSE_PATH = "/_mcp/sse/swagger";
219
+ const MESSAGES_PATH = "/_mcp/sse/swagger/messages";
218
220
  server.middlewares.use(
219
221
  async (req, res, next) => {
220
222
  var _a2;
221
- if (req.method === "POST" && ((_a2 = req.url) == null ? void 0 : _a2.startsWith("/_mcp/sse/swagger"))) {
222
- if (!req.headers["mcp-session-id"] && transport.sessionId) {
223
- req.headers["mcp-session-id"] = transport.sessionId;
223
+ const url = (_a2 = req.url) == null ? void 0 : _a2.split("?")[0];
224
+ if (url === SSE_PATH || url === MESSAGES_PATH) {
225
+ if (req.method === "GET") {
226
+ if (req.headers["accept"] !== "text/event-stream") {
227
+ res.statusCode = 405;
228
+ res.end("Method Not Allowed - Expected Accept: text/event-stream");
229
+ return;
230
+ }
231
+ res.setHeader("Content-Type", "text/event-stream");
232
+ res.setHeader("Cache-Control", "no-cache");
233
+ res.setHeader("Connection", "keep-alive");
234
+ res.setHeader("X-Accel-Buffering", "no");
235
+ }
236
+ try {
237
+ await transport.handleRequest(req, res);
238
+ } catch (err) {
239
+ console.error("MCP Transport Error:", err);
240
+ if (!res.headersSent) {
241
+ res.statusCode = 500;
242
+ res.end("Internal MCP Error");
243
+ }
224
244
  }
225
- await transport.handleRequest(req, res);
226
- } else {
227
- next();
245
+ return;
228
246
  }
247
+ next();
229
248
  }
230
249
  );
231
250
  } catch (error) {
package/dist/esm/index.js CHANGED
@@ -11,9 +11,9 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
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
13
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
- import { z } from "zod";
15
14
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
16
15
  import { randomUUID } from "node:crypto";
16
+ import { z } from "zod";
17
17
  export var SwaggerMcpServer = /*#__PURE__*/function () {
18
18
  function SwaggerMcpServer(swaggerUrl, token) {
19
19
  _classCallCheck(this, SwaggerMcpServer);
@@ -236,7 +236,7 @@ export default function vitePluginSwaggerMcp(_ref) {
236
236
  enforce: "pre",
237
237
  configureServer: function configureServer(server) {
238
238
  return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
239
- var _server$config, transport, swaggerServer, mcpServer;
239
+ var _server$config, transport, swaggerServer, mcpServer, SSE_PATH, MESSAGES_PATH;
240
240
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
241
241
  while (1) switch (_context9.prev = _context9.next) {
242
242
  case 0:
@@ -372,49 +372,80 @@ export default function vitePluginSwaggerMcp(_ref) {
372
372
  return mcpServer.connect(transport);
373
373
  case 10:
374
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
+
376
+ // 2. 定义 SSE 和消息路径
377
+ SSE_PATH = "/_mcp/sse/swagger";
378
+ MESSAGES_PATH = "/_mcp/sse/swagger/messages"; // 规范建议分开或明确指定
375
379
  server.middlewares.use( /*#__PURE__*/function () {
376
380
  var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(req, res, next) {
377
381
  var _req$url;
382
+ var url;
378
383
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
379
384
  while (1) switch (_context8.prev = _context8.next) {
380
385
  case 0:
381
- if (!(req.method === "POST" && (_req$url = req.url) !== null && _req$url !== void 0 && _req$url.startsWith("/_mcp/sse/swagger"))) {
382
- _context8.next = 6;
386
+ url = (_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.split("?")[0]; // 处理 SSE 建立连接 (GET) 和 消息接收 (POST)
387
+ if (!(url === SSE_PATH || url === MESSAGES_PATH)) {
388
+ _context8.next = 21;
383
389
  break;
384
390
  }
385
- if (!req.headers["mcp-session-id"] && transport.sessionId) {
386
- // 自动补充
387
- req.headers["mcp-session-id"] = transport.sessionId;
391
+ if (!(req.method === "GET")) {
392
+ _context8.next = 11;
393
+ break;
388
394
  }
389
- // Handle the request
390
- _context8.next = 4;
395
+ if (!(req.headers["accept"] !== "text/event-stream")) {
396
+ _context8.next = 7;
397
+ break;
398
+ }
399
+ res.statusCode = 405;
400
+ res.end("Method Not Allowed - Expected Accept: text/event-stream");
401
+ return _context8.abrupt("return");
402
+ case 7:
403
+ // 对应文档 2.2.3: 设置正确的 Content-Type
404
+ res.setHeader("Content-Type", "text/event-stream");
405
+ res.setHeader("Cache-Control", "no-cache");
406
+ res.setHeader("Connection", "keep-alive");
407
+ // 禁用某些代理的缓冲
408
+ res.setHeader("X-Accel-Buffering", "no");
409
+ case 11:
410
+ _context8.prev = 11;
411
+ _context8.next = 14;
391
412
  return transport.handleRequest(req, res);
392
- case 4:
393
- _context8.next = 7;
413
+ case 14:
414
+ _context8.next = 20;
394
415
  break;
395
- case 6:
416
+ case 16:
417
+ _context8.prev = 16;
418
+ _context8.t0 = _context8["catch"](11);
419
+ console.error("MCP Transport Error:", _context8.t0);
420
+ if (!res.headersSent) {
421
+ res.statusCode = 500;
422
+ res.end("Internal MCP Error");
423
+ }
424
+ case 20:
425
+ return _context8.abrupt("return");
426
+ case 21:
396
427
  next();
397
- case 7:
428
+ case 22:
398
429
  case "end":
399
430
  return _context8.stop();
400
431
  }
401
- }, _callee8);
432
+ }, _callee8, null, [[11, 16]]);
402
433
  }));
403
434
  return function (_x6, _x7, _x8) {
404
435
  return _ref6.apply(this, arguments);
405
436
  };
406
437
  }());
407
- _context9.next = 17;
438
+ _context9.next = 19;
408
439
  break;
409
- case 14:
410
- _context9.prev = 14;
440
+ case 16:
441
+ _context9.prev = 16;
411
442
  _context9.t0 = _context9["catch"](0);
412
443
  console.log("MCP server error", _context9.t0);
413
- case 17:
444
+ case 19:
414
445
  case "end":
415
446
  return _context9.stop();
416
447
  }
417
- }, _callee9, null, [[0, 14]]);
448
+ }, _callee9, null, [[0, 16]]);
418
449
  }))();
419
450
  }
420
451
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-swagger-mcp",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "vite plugin for swagger mcp",
5
5
  "homepage": "https://github.com/mmdctjj/vite-plugin-swagger-mcp",
6
6
  "repository": {