vite-plugin-swagger-mcp 0.0.15 → 0.0.17

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.
@@ -42,7 +42,7 @@ export declare class SwaggerMcpServer {
42
42
  method: string;
43
43
  }>;
44
44
  }
45
- export default function vitePluginSwaggerMcp({ swaggerUrl, token, }: {
45
+ export default function vitePluginSwaggerMcp(options: {
46
46
  swaggerUrl: string;
47
47
  token?: string;
48
48
  }): Plugin;
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,8 @@
1
+ var __create = Object.create;
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
4
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
7
  var __export = (target, all) => {
6
8
  for (var name in all)
@@ -14,6 +16,14 @@ var __copyProps = (to, from, except, desc) => {
14
16
  }
15
17
  return to;
16
18
  };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
17
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
28
 
19
29
  // src/index.ts
@@ -24,9 +34,10 @@ __export(src_exports, {
24
34
  });
25
35
  module.exports = __toCommonJS(src_exports);
26
36
  var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
27
- var import_streamableHttp = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
28
37
  var import_node_crypto = require("node:crypto");
29
- var import_zod = require("zod");
38
+ var z = __toESM(require("zod"));
39
+ var import_streamableHttp = require("@modelcontextprotocol/sdk/server/streamableHttp");
40
+ var import_types = require("@modelcontextprotocol/sdk/types");
30
41
  var SwaggerMcpServer = class {
31
42
  constructor(swaggerUrl, token) {
32
43
  this.swaggerUrl = swaggerUrl;
@@ -134,34 +145,22 @@ var SwaggerMcpServer = class {
134
145
  };
135
146
  }
136
147
  };
137
- var transports = {};
138
- function vitePluginSwaggerMcp({
139
- swaggerUrl,
140
- token
141
- }) {
148
+ function vitePluginSwaggerMcp(options) {
149
+ const transports = {};
142
150
  return {
143
151
  name: "vite-plugin-swagger-mcp",
144
- enforce: "pre",
145
- async configureServer(server) {
146
- var _a, _b;
147
- try {
148
- let transport = new import_streamableHttp.StreamableHTTPServerTransport({
149
- sessionIdGenerator: () => (0, import_node_crypto.randomUUID)(),
150
- onsessioninitialized: (sessionId) => {
151
- transports[sessionId] = transport;
152
- }
153
- });
154
- transport.onclose = () => {
155
- if (transport.sessionId) {
156
- delete transports[transport.sessionId];
157
- }
158
- };
159
- const swaggerServer = new SwaggerMcpServer(swaggerUrl, token);
160
- const mcpServer = new import_mcp.McpServer({
152
+ configureServer(vite) {
153
+ var _a;
154
+ const swaggerServer = new SwaggerMcpServer(
155
+ options.swaggerUrl,
156
+ options.token
157
+ );
158
+ const createMcpServer = () => {
159
+ const server = new import_mcp.McpServer({
161
160
  name: "swagger-mcp-server",
162
161
  version: "0.1.0"
163
162
  });
164
- mcpServer.tool("getModules", "获取模块列表", async () => {
163
+ server.tool("getModules", "获取模块列表", async () => {
165
164
  const res = await swaggerServer.getModules();
166
165
  return {
167
166
  content: [
@@ -172,33 +171,10 @@ function vitePluginSwaggerMcp({
172
171
  ]
173
172
  };
174
173
  });
175
- mcpServer.tool(
176
- "getModuleApis",
177
- "获取特定模块下的所有接口及返回值类型",
178
- {
179
- module: import_zod.z.string().describe("模块名称")
180
- },
181
- async ({ module: module2 }) => {
182
- if (!module2) {
183
- return {
184
- content: [
185
- {
186
- type: "text",
187
- text: JSON.stringify({ error: "模块名称不能为空" })
188
- }
189
- ]
190
- };
191
- }
192
- const res = await swaggerServer.getModuleApis(module2);
193
- return {
194
- content: [{ type: "text", text: JSON.stringify(res) }]
195
- };
196
- }
197
- );
198
- mcpServer.tool(
174
+ server.tool(
199
175
  "getApiTypes",
200
176
  "获取特定接口的参数及返回值类型",
201
- { path: import_zod.z.string(), method: import_zod.z.string() },
177
+ { path: z.string(), method: z.string() },
202
178
  async (args) => ({
203
179
  content: [
204
180
  {
@@ -210,64 +186,77 @@ function vitePluginSwaggerMcp({
210
186
  ]
211
187
  })
212
188
  );
213
- console.log(
214
- "MCP server connected:",
215
- `http://localhost:${(_b = (_a = server.config) == null ? void 0 : _a.server) == null ? void 0 : _b.port}/_mcp/sse/swagger`
216
- );
217
- server.middlewares.use("/_mcp/sse/swagger", async (req, res) => {
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;
189
+ server.registerTool(
190
+ "getApiTypes",
191
+ {
192
+ description: "获取接口类型定义",
193
+ inputSchema: {
194
+ path: z.string(),
195
+ method: z.string()
196
+ }
197
+ },
198
+ async ({ path, method }) => ({
199
+ content: [
200
+ {
201
+ type: "text",
202
+ text: JSON.stringify(await swaggerServer.getApiTypes(path, method))
232
203
  }
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;
204
+ ]
205
+ })
206
+ );
207
+ return server;
208
+ };
209
+ vite.middlewares.use("/_mcp/swagger", async (req, res) => {
210
+ const sessionId = req.headers["mcp-session-id"];
211
+ if (req.method === "POST") {
212
+ let body = "";
213
+ for await (const chunk of req)
214
+ body += chunk;
215
+ const json = JSON.parse(body);
216
+ try {
217
+ let transport;
218
+ if (sessionId && transports[sessionId]) {
219
+ transport = transports[sessionId];
220
+ } else if (!sessionId && (0, import_types.isInitializeRequest)(json)) {
221
+ transport = new import_streamableHttp.StreamableHTTPServerTransport({
222
+ sessionIdGenerator: () => (0, import_node_crypto.randomUUID)(),
223
+ onsessioninitialized(id) {
224
+ transports[id] = transport;
239
225
  }
240
- return;
241
- }
226
+ });
227
+ transport.onclose = () => {
228
+ if (transport.sessionId) {
229
+ delete transports[transport.sessionId];
230
+ }
231
+ };
232
+ const mcpServer = createMcpServer();
233
+ await mcpServer.connect(transport);
234
+ } else {
242
235
  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);
247
- res.statusCode = 500;
248
- res.end("Internal server error.");
249
- return;
236
+ return res.end("Bad Request");
250
237
  }
238
+ await transport.handleRequest(req, res, json);
239
+ } catch (err) {
240
+ console.error(err);
241
+ res.statusCode = 500;
242
+ res.end("Internal Error");
251
243
  }
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;
244
+ return;
245
+ }
246
+ if (req.method === "GET") {
247
+ if (!sessionId || !transports[sessionId]) {
248
+ res.statusCode = 400;
249
+ return res.end("Missing session");
266
250
  }
267
- });
268
- } catch (error) {
269
- console.log("MCP server error", error);
270
- }
251
+ await transports[sessionId].handleRequest(req, res);
252
+ return;
253
+ }
254
+ res.statusCode = 405;
255
+ res.end();
256
+ });
257
+ console.log(
258
+ `Swagger MCP ready: http://localhost:${(_a = vite.config.server) == null ? void 0 : _a.port}/_mcp/swagger`
259
+ );
271
260
  }
272
261
  };
273
262
  }
@@ -42,7 +42,7 @@ export declare class SwaggerMcpServer {
42
42
  method: string;
43
43
  }>;
44
44
  }
45
- export default function vitePluginSwaggerMcp({ swaggerUrl, token, }: {
45
+ export default function vitePluginSwaggerMcp(options: {
46
46
  swaggerUrl: string;
47
47
  token?: string;
48
48
  }): Plugin;
package/dist/esm/index.js CHANGED
@@ -13,9 +13,13 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
13
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
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); }
15
15
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
16
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
17
16
  import { randomUUID } from "node:crypto";
18
- import { z } from "zod";
17
+ import * as z from "zod";
18
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp";
19
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types";
20
+ /* =========================
21
+ * Swagger MCP Server
22
+ * ========================= */
19
23
  export var SwaggerMcpServer = /*#__PURE__*/function () {
20
24
  function SwaggerMcpServer(swaggerUrl, token) {
21
25
  _classCallCheck(this, SwaggerMcpServer);
@@ -228,290 +232,269 @@ export var SwaggerMcpServer = /*#__PURE__*/function () {
228
232
  return SwaggerMcpServer;
229
233
  }();
230
234
 
231
- // Map to store transports by session ID
232
- var transports = {};
233
- export default function vitePluginSwaggerMcp(_ref) {
234
- var swaggerUrl = _ref.swaggerUrl,
235
- token = _ref.token;
235
+ /* =========================
236
+ * Vite Plugin
237
+ * ========================= */
238
+
239
+ export default function vitePluginSwaggerMcp(options) {
240
+ var transports = {};
236
241
  return {
237
242
  name: "vite-plugin-swagger-mcp",
238
- enforce: "pre",
239
- configureServer: function configureServer(server) {
240
- return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
241
- var _server$config, transport, swaggerServer, mcpServer;
242
- return _regeneratorRuntime().wrap(function _callee9$(_context9) {
243
- while (1) switch (_context9.prev = _context9.next) {
244
- case 0:
245
- try {
243
+ configureServer: function configureServer(vite) {
244
+ var _vite$config$server;
245
+ var swaggerServer = new SwaggerMcpServer(options.swaggerUrl, options.token);
246
+
247
+ /** 创建 MCP Server(每个 session 共享一个 definition) */
248
+ var createMcpServer = function createMcpServer() {
249
+ var server = new McpServer({
250
+ name: "swagger-mcp-server",
251
+ version: "0.1.0"
252
+ });
253
+
254
+ /***
255
+ * 获取模块列表
256
+ */
257
+ server.tool("getModules", "获取模块列表", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
258
+ var res;
259
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
260
+ while (1) switch (_context5.prev = _context5.next) {
261
+ case 0:
262
+ _context5.next = 2;
263
+ return swaggerServer.getModules();
264
+ case 2:
265
+ res = _context5.sent;
266
+ return _context5.abrupt("return", {
267
+ content: [{
268
+ type: "text",
269
+ text: JSON.stringify(res)
270
+ }]
271
+ });
272
+ case 4:
273
+ case "end":
274
+ return _context5.stop();
275
+ }
276
+ }, _callee5);
277
+ })));
278
+
279
+ /***
280
+ * 获取特定接口的参数及返回值类型
281
+ */
282
+ server.tool("getApiTypes", "获取特定接口的参数及返回值类型", {
283
+ path: z.string(),
284
+ method: z.string()
285
+ }, /*#__PURE__*/function () {
286
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(args) {
287
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
288
+ while (1) switch (_context6.prev = _context6.next) {
289
+ case 0:
290
+ _context6.t0 = JSON;
291
+ _context6.next = 3;
292
+ return swaggerServer.getApiTypes(args.path, args.method);
293
+ case 3:
294
+ _context6.t1 = _context6.sent;
295
+ _context6.t2 = _context6.t0.stringify.call(_context6.t0, _context6.t1);
296
+ _context6.t3 = {
297
+ type: "text",
298
+ text: _context6.t2
299
+ };
300
+ _context6.t4 = [_context6.t3];
301
+ return _context6.abrupt("return", {
302
+ content: _context6.t4
303
+ });
304
+ case 8:
305
+ case "end":
306
+ return _context6.stop();
307
+ }
308
+ }, _callee6);
309
+ }));
310
+ return function (_x4) {
311
+ return _ref2.apply(this, arguments);
312
+ };
313
+ }());
314
+ server.registerTool("getApiTypes", {
315
+ description: "获取接口类型定义",
316
+ inputSchema: {
317
+ path: z.string(),
318
+ method: z.string()
319
+ }
320
+ }, /*#__PURE__*/function () {
321
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(_ref3) {
322
+ var path, method;
323
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
324
+ while (1) switch (_context7.prev = _context7.next) {
325
+ case 0:
326
+ path = _ref3.path, method = _ref3.method;
327
+ _context7.t0 = JSON;
328
+ _context7.next = 4;
329
+ return swaggerServer.getApiTypes(path, method);
330
+ case 4:
331
+ _context7.t1 = _context7.sent;
332
+ _context7.t2 = _context7.t0.stringify.call(_context7.t0, _context7.t1);
333
+ _context7.t3 = {
334
+ type: "text",
335
+ text: _context7.t2
336
+ };
337
+ _context7.t4 = [_context7.t3];
338
+ return _context7.abrupt("return", {
339
+ content: _context7.t4
340
+ });
341
+ case 9:
342
+ case "end":
343
+ return _context7.stop();
344
+ }
345
+ }, _callee7);
346
+ }));
347
+ return function (_x5) {
348
+ return _ref4.apply(this, arguments);
349
+ };
350
+ }());
351
+ return server;
352
+ };
353
+
354
+ /* =========================
355
+ * MCP HTTP Endpoint
356
+ * ========================= */
357
+
358
+ vite.middlewares.use("/_mcp/swagger", /*#__PURE__*/function () {
359
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(req, res) {
360
+ var sessionId, body, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, json, transport, mcpServer;
361
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
362
+ while (1) switch (_context8.prev = _context8.next) {
363
+ case 0:
364
+ sessionId = req.headers["mcp-session-id"];
365
+ /* ---------- POST (JSON-RPC) ---------- */
366
+ if (!(req.method === "POST")) {
367
+ _context8.next = 57;
368
+ break;
369
+ }
370
+ body = "";
371
+ _iteratorAbruptCompletion = false;
372
+ _didIteratorError = false;
373
+ _context8.prev = 5;
374
+ _iterator = _asyncIterator(req);
375
+ case 7:
376
+ _context8.next = 9;
377
+ return _iterator.next();
378
+ case 9:
379
+ if (!(_iteratorAbruptCompletion = !(_step = _context8.sent).done)) {
380
+ _context8.next = 15;
381
+ break;
382
+ }
383
+ chunk = _step.value;
384
+ body += chunk;
385
+ case 12:
386
+ _iteratorAbruptCompletion = false;
387
+ _context8.next = 7;
388
+ break;
389
+ case 15:
390
+ _context8.next = 21;
391
+ break;
392
+ case 17:
393
+ _context8.prev = 17;
394
+ _context8.t0 = _context8["catch"](5);
395
+ _didIteratorError = true;
396
+ _iteratorError = _context8.t0;
397
+ case 21:
398
+ _context8.prev = 21;
399
+ _context8.prev = 22;
400
+ if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
401
+ _context8.next = 26;
402
+ break;
403
+ }
404
+ _context8.next = 26;
405
+ return _iterator.return();
406
+ case 26:
407
+ _context8.prev = 26;
408
+ if (!_didIteratorError) {
409
+ _context8.next = 29;
410
+ break;
411
+ }
412
+ throw _iteratorError;
413
+ case 29:
414
+ return _context8.finish(26);
415
+ case 30:
416
+ return _context8.finish(21);
417
+ case 31:
418
+ json = JSON.parse(body);
419
+ _context8.prev = 32;
420
+ if (!(sessionId && transports[sessionId])) {
421
+ _context8.next = 37;
422
+ break;
423
+ }
424
+ transport = transports[sessionId];
425
+ _context8.next = 47;
426
+ break;
427
+ case 37:
428
+ if (!(!sessionId && isInitializeRequest(json))) {
429
+ _context8.next = 45;
430
+ break;
431
+ }
246
432
  transport = new StreamableHTTPServerTransport({
247
433
  sessionIdGenerator: function sessionIdGenerator() {
248
434
  return randomUUID();
249
435
  },
250
- onsessioninitialized: function onsessioninitialized(sessionId) {
251
- // Store the transport by session ID
252
- transports[sessionId] = transport;
436
+ onsessioninitialized: function onsessioninitialized(id) {
437
+ transports[id] = transport;
253
438
  }
254
- }); // Clean up transport when closed
439
+ });
255
440
  transport.onclose = function () {
256
441
  if (transport.sessionId) {
257
442
  delete transports[transport.sessionId];
258
443
  }
259
444
  };
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) {
272
- case 0:
273
- _context5.next = 2;
274
- return swaggerServer.getModules();
275
- case 2:
276
- res = _context5.sent;
277
- return _context5.abrupt("return", {
278
- content: [{
279
- type: "text",
280
- text: JSON.stringify(res)
281
- }]
282
- });
283
- case 4:
284
- case "end":
285
- return _context5.stop();
286
- }
287
- }, _callee5);
288
- })));
289
-
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
- }());
335
-
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);
472
- res.statusCode = 500;
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:
510
- case "end":
511
- return _context9.stop();
512
- }
513
- }, _callee9);
514
- }))();
445
+ mcpServer = createMcpServer();
446
+ _context8.next = 43;
447
+ return mcpServer.connect(transport);
448
+ case 43:
449
+ _context8.next = 47;
450
+ break;
451
+ case 45:
452
+ res.statusCode = 400;
453
+ return _context8.abrupt("return", res.end("Bad Request"));
454
+ case 47:
455
+ _context8.next = 49;
456
+ return transport.handleRequest(req, res, json);
457
+ case 49:
458
+ _context8.next = 56;
459
+ break;
460
+ case 51:
461
+ _context8.prev = 51;
462
+ _context8.t1 = _context8["catch"](32);
463
+ console.error(_context8.t1);
464
+ res.statusCode = 500;
465
+ res.end("Internal Error");
466
+ case 56:
467
+ return _context8.abrupt("return");
468
+ case 57:
469
+ if (!(req.method === "GET")) {
470
+ _context8.next = 64;
471
+ break;
472
+ }
473
+ if (!(!sessionId || !transports[sessionId])) {
474
+ _context8.next = 61;
475
+ break;
476
+ }
477
+ res.statusCode = 400;
478
+ return _context8.abrupt("return", res.end("Missing session"));
479
+ case 61:
480
+ _context8.next = 63;
481
+ return transports[sessionId].handleRequest(req, res);
482
+ case 63:
483
+ return _context8.abrupt("return");
484
+ case 64:
485
+ res.statusCode = 405;
486
+ res.end();
487
+ case 66:
488
+ case "end":
489
+ return _context8.stop();
490
+ }
491
+ }, _callee8, null, [[5, 17, 21, 31], [22,, 26, 30], [32, 51]]);
492
+ }));
493
+ return function (_x6, _x7) {
494
+ return _ref5.apply(this, arguments);
495
+ };
496
+ }());
497
+ console.log("Swagger MCP ready: http://localhost:".concat((_vite$config$server = vite.config.server) === null || _vite$config$server === void 0 ? void 0 : _vite$config$server.port, "/_mcp/swagger"));
515
498
  }
516
499
  };
517
500
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-swagger-mcp",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "vite plugin for swagger mcp",
5
5
  "homepage": "https://github.com/mmdctjj/vite-plugin-swagger-mcp",
6
6
  "repository": {