vite-plugin-swagger-mcp 0.0.16 → 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.
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +91 -102
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +263 -282
- package/package.json +1 -1
package/dist/cjs/index.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ export declare class SwaggerMcpServer {
|
|
|
42
42
|
method: string;
|
|
43
43
|
}>;
|
|
44
44
|
}
|
|
45
|
-
export default function vitePluginSwaggerMcp(
|
|
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
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
swaggerUrl,
|
|
140
|
-
token
|
|
141
|
-
}) {
|
|
148
|
+
function vitePluginSwaggerMcp(options) {
|
|
149
|
+
const transports = {};
|
|
142
150
|
return {
|
|
143
151
|
name: "vite-plugin-swagger-mcp",
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
console.log("body: ", json);
|
|
228
|
-
try {
|
|
229
|
-
if (sessionId && transports[sessionId]) {
|
|
230
|
-
transport = transports[sessionId];
|
|
231
|
-
await transport.handleRequest(req, res, json);
|
|
232
|
-
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))
|
|
233
203
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
res.
|
|
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
|
-
|
|
269
|
-
|
|
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
|
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ export declare class SwaggerMcpServer {
|
|
|
42
42
|
method: string;
|
|
43
43
|
}>;
|
|
44
44
|
}
|
|
45
|
-
export default function vitePluginSwaggerMcp(
|
|
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
|
|
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,292 +232,269 @@ export var SwaggerMcpServer = /*#__PURE__*/function () {
|
|
|
228
232
|
return SwaggerMcpServer;
|
|
229
233
|
}();
|
|
230
234
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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;
|
|
253
403
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
404
|
+
_context8.next = 26;
|
|
405
|
+
return _iterator.return();
|
|
406
|
+
case 26:
|
|
407
|
+
_context8.prev = 26;
|
|
408
|
+
if (!_didIteratorError) {
|
|
409
|
+
_context8.next = 29;
|
|
410
|
+
break;
|
|
258
411
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
+
}
|
|
432
|
+
transport = new StreamableHTTPServerTransport({
|
|
433
|
+
sessionIdGenerator: function sessionIdGenerator() {
|
|
434
|
+
return randomUUID();
|
|
435
|
+
},
|
|
436
|
+
onsessioninitialized: function onsessioninitialized(id) {
|
|
437
|
+
transports[id] = transport;
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
transport.onclose = function () {
|
|
441
|
+
if (transport.sessionId) {
|
|
442
|
+
delete transports[transport.sessionId];
|
|
286
443
|
}
|
|
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
|
-
_context9.next = 10;
|
|
372
|
-
return mcpServer.connect(transport);
|
|
373
|
-
case 10:
|
|
374
|
-
// Connect to the MCP mcpServer
|
|
375
|
-
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"));
|
|
376
|
-
server.middlewares.use('/_mcp/sse/swagger', /*#__PURE__*/function () {
|
|
377
|
-
var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(req, res) {
|
|
378
|
-
var _sessionId, body, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, json, _sessionId2, _req$headers$accept;
|
|
379
|
-
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
|
|
380
|
-
while (1) switch (_context8.prev = _context8.next) {
|
|
381
|
-
case 0:
|
|
382
|
-
if (!(req.method === 'POST')) {
|
|
383
|
-
_context8.next = 57;
|
|
384
|
-
break;
|
|
385
|
-
}
|
|
386
|
-
_sessionId = req.headers["mcp-session-id"];
|
|
387
|
-
body = '';
|
|
388
|
-
_iteratorAbruptCompletion = false;
|
|
389
|
-
_didIteratorError = false;
|
|
390
|
-
_context8.prev = 5;
|
|
391
|
-
_iterator = _asyncIterator(req);
|
|
392
|
-
case 7:
|
|
393
|
-
_context8.next = 9;
|
|
394
|
-
return _iterator.next();
|
|
395
|
-
case 9:
|
|
396
|
-
if (!(_iteratorAbruptCompletion = !(_step = _context8.sent).done)) {
|
|
397
|
-
_context8.next = 15;
|
|
398
|
-
break;
|
|
399
|
-
}
|
|
400
|
-
chunk = _step.value;
|
|
401
|
-
body += chunk;
|
|
402
|
-
case 12:
|
|
403
|
-
_iteratorAbruptCompletion = false;
|
|
404
|
-
_context8.next = 7;
|
|
405
|
-
break;
|
|
406
|
-
case 15:
|
|
407
|
-
_context8.next = 21;
|
|
408
|
-
break;
|
|
409
|
-
case 17:
|
|
410
|
-
_context8.prev = 17;
|
|
411
|
-
_context8.t0 = _context8["catch"](5);
|
|
412
|
-
_didIteratorError = true;
|
|
413
|
-
_iteratorError = _context8.t0;
|
|
414
|
-
case 21:
|
|
415
|
-
_context8.prev = 21;
|
|
416
|
-
_context8.prev = 22;
|
|
417
|
-
if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
|
|
418
|
-
_context8.next = 26;
|
|
419
|
-
break;
|
|
420
|
-
}
|
|
421
|
-
_context8.next = 26;
|
|
422
|
-
return _iterator.return();
|
|
423
|
-
case 26:
|
|
424
|
-
_context8.prev = 26;
|
|
425
|
-
if (!_didIteratorError) {
|
|
426
|
-
_context8.next = 29;
|
|
427
|
-
break;
|
|
428
|
-
}
|
|
429
|
-
throw _iteratorError;
|
|
430
|
-
case 29:
|
|
431
|
-
return _context8.finish(26);
|
|
432
|
-
case 30:
|
|
433
|
-
return _context8.finish(21);
|
|
434
|
-
case 31:
|
|
435
|
-
json = JSON.parse(body);
|
|
436
|
-
console.log("post request received");
|
|
437
|
-
console.log("body: ", json);
|
|
438
|
-
_context8.prev = 34;
|
|
439
|
-
if (!(_sessionId && transports[_sessionId])) {
|
|
440
|
-
_context8.next = 40;
|
|
441
|
-
break;
|
|
442
|
-
}
|
|
443
|
-
transport = transports[_sessionId];
|
|
444
|
-
_context8.next = 39;
|
|
445
|
-
return transport.handleRequest(req, res, json);
|
|
446
|
-
case 39:
|
|
447
|
-
return _context8.abrupt("return");
|
|
448
|
-
case 40:
|
|
449
|
-
if (_sessionId) {
|
|
450
|
-
_context8.next = 46;
|
|
451
|
-
break;
|
|
452
|
-
}
|
|
453
|
-
_context8.next = 43;
|
|
454
|
-
return transport.handleRequest(req, res, json);
|
|
455
|
-
case 43:
|
|
456
|
-
// session ID will only be available (if in not Stateless-Mode)
|
|
457
|
-
// after handling the first request
|
|
458
|
-
_sessionId2 = transport.sessionId;
|
|
459
|
-
if (_sessionId2) {
|
|
460
|
-
transports[_sessionId2] = transport;
|
|
461
|
-
}
|
|
462
|
-
return _context8.abrupt("return");
|
|
463
|
-
case 46:
|
|
464
|
-
res.statusCode = 400;
|
|
465
|
-
res.end("Bad Request: invalid session ID or method.");
|
|
466
|
-
return _context8.abrupt("return");
|
|
467
|
-
case 51:
|
|
468
|
-
_context8.prev = 51;
|
|
469
|
-
_context8.t1 = _context8["catch"](34);
|
|
470
|
-
console.error('Error handling MCP request:', _context8.t1);
|
|
471
|
-
res.statusCode = 500;
|
|
472
|
-
res.end("Internal server error.");
|
|
473
|
-
return _context8.abrupt("return");
|
|
474
|
-
case 57:
|
|
475
|
-
if (!(req.method === 'GET')) {
|
|
476
|
-
_context8.next = 64;
|
|
477
|
-
break;
|
|
478
|
-
}
|
|
479
|
-
if ((_req$headers$accept = req.headers.accept) !== null && _req$headers$accept !== void 0 && _req$headers$accept.includes('text/event-stream')) {
|
|
480
|
-
_context8.next = 61;
|
|
481
|
-
break;
|
|
482
|
-
}
|
|
483
|
-
res.writeHead(405);
|
|
484
|
-
return _context8.abrupt("return", res.end());
|
|
485
|
-
case 61:
|
|
486
|
-
res.writeHead(200, {
|
|
487
|
-
'Content-Type': 'text/event-stream',
|
|
488
|
-
'Cache-Control': 'no-cache',
|
|
489
|
-
Connection: 'keep-alive'
|
|
490
|
-
});
|
|
491
|
-
transport.onmessage = function (message) {
|
|
492
|
-
res.write(message);
|
|
493
|
-
};
|
|
494
|
-
return _context8.abrupt("return");
|
|
495
|
-
case 64:
|
|
496
|
-
case "end":
|
|
497
|
-
return _context8.stop();
|
|
498
|
-
}
|
|
499
|
-
}, _callee8, null, [[5, 17, 21, 31], [22,, 26, 30], [34, 51]]);
|
|
500
|
-
}));
|
|
501
|
-
return function (_x6, _x7) {
|
|
502
|
-
return _ref6.apply(this, arguments);
|
|
503
444
|
};
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
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"));
|
|
517
498
|
}
|
|
518
499
|
};
|
|
519
500
|
}
|