@tyvm/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/README.md +4 -3
- package/dist/express-template-generator.d.ts +3 -0
- package/dist/express-template-generator.d.ts.map +1 -0
- package/dist/express-template-generator.js +169 -0
- package/dist/express-template-generator.js.map +1 -0
- package/dist/generator.d.ts +9 -2
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +314 -169
- package/dist/generator.js.map +1 -1
- package/dist/index.js +46 -58
- package/dist/index.js.map +1 -1
- package/package.json +12 -3
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Generate MCP (Model Context Protocol) servers from Swagger/OpenAPI specification
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx @tyvm/swagger-mcp <swagger-url> [output-dir] [--start-stdio]
|
|
8
|
+
npx @tyvm/swagger-mcp --url <swagger-url> [--output output-dir] [--file input-file] [--start-stdio]
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
By default, the output directory is generated based on the domain name of the swagger URL. For example, `https://api.dev.knowhow.tyvm.ai/docs/` would create `./generated/api_dev_knowhow_tyvm_ai/`.
|
|
@@ -14,10 +14,10 @@ By default, the output directory is generated based on the domain name of the sw
|
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
# Generate and immediately start the server (creates ./generated/api_example_com/)
|
|
17
|
-
npx @tyvm/swagger-mcp https://api.example.com/swagger.json --start-stdio
|
|
17
|
+
npx @tyvm/swagger-mcp --url https://api.example.com/swagger.json --start-stdio
|
|
18
18
|
|
|
19
19
|
# Generate MCP server from Swagger spec (creates ./generated/api_example_com/)
|
|
20
|
-
npx @tyvm/swagger-mcp https://api.example.com/swagger.json
|
|
20
|
+
npx @tyvm/swagger-mcp --url https://api.example.com/swagger.json
|
|
21
21
|
|
|
22
22
|
```
|
|
23
23
|
|
|
@@ -54,6 +54,7 @@ The tool creates:
|
|
|
54
54
|
"args": [
|
|
55
55
|
"-y",
|
|
56
56
|
"@tyvm/swagger-mcp",
|
|
57
|
+
"--url",
|
|
57
58
|
"https://api.dev.knowhow.tyvm.ai/docs/swagger.json",
|
|
58
59
|
"--start-stdio"
|
|
59
60
|
],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-template-generator.d.ts","sourceRoot":"","sources":["../src/express-template-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAoKzF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateExpressCompositionTemplate = void 0;
|
|
4
|
+
function generateExpressCompositionTemplate(generator) {
|
|
5
|
+
const tools = generator.generateTools();
|
|
6
|
+
const apiBaseUrl = generator.getApiBaseUrlPublic();
|
|
7
|
+
const swaggerSpec = generator.getSwaggerSpec();
|
|
8
|
+
const serverName = swaggerSpec.info.title.toLowerCase().replace(/[^a-z0-9]/g, "-");
|
|
9
|
+
const serverVersion = swaggerSpec.info.version;
|
|
10
|
+
return `import express from 'express';
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
13
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
14
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
15
|
+
import { createMcpServer } from './server-factory';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Stateless Express app composition - creates new server instance for each request
|
|
19
|
+
* @param app Express app instance to compose with
|
|
20
|
+
* @param mcpPath Path for MCP endpoints (default: '/mcp')
|
|
21
|
+
* @returns The same Express app instance for chaining
|
|
22
|
+
*/
|
|
23
|
+
export function statelessApp(app: express.Application, mcpPath: string = '/mcp'): express.Application {
|
|
24
|
+
app.post(mcpPath, async (req: express.Request, res: express.Response) => {
|
|
25
|
+
try {
|
|
26
|
+
// Extract authorization header for API calls
|
|
27
|
+
const authHeader = req.headers.authorization;
|
|
28
|
+
const requestHeaders = authHeader ? { Authorization: authHeader } : undefined;
|
|
29
|
+
|
|
30
|
+
const server = createMcpServer(requestHeaders);
|
|
31
|
+
const transport = new StreamableHTTPServerTransport({
|
|
32
|
+
sessionIdGenerator: undefined,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
res.on('close', () => {
|
|
36
|
+
console.log('Request closed');
|
|
37
|
+
transport.close();
|
|
38
|
+
server.close();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await server.connect(transport);
|
|
42
|
+
await transport.handleRequest(req, res, req.body);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error('Error handling MCP request:', error);
|
|
45
|
+
if (!res.headersSent) {
|
|
46
|
+
res.status(500).json({
|
|
47
|
+
jsonrpc: '2.0',
|
|
48
|
+
error: {
|
|
49
|
+
code: -32603,
|
|
50
|
+
message: 'Internal server error',
|
|
51
|
+
},
|
|
52
|
+
id: null,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// SSE notifications not supported in stateless mode
|
|
59
|
+
app.get(mcpPath, async (req: express.Request, res: express.Response) => {
|
|
60
|
+
console.log('Received GET MCP request');
|
|
61
|
+
res.writeHead(405).end(JSON.stringify({
|
|
62
|
+
jsonrpc: "2.0",
|
|
63
|
+
error: {
|
|
64
|
+
code: -32000,
|
|
65
|
+
message: "Method not allowed."
|
|
66
|
+
},
|
|
67
|
+
id: null
|
|
68
|
+
}));
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Session termination not needed in stateless mode
|
|
72
|
+
app.delete(mcpPath, async (req: express.Request, res: express.Response) => {
|
|
73
|
+
console.log('Received DELETE MCP request');
|
|
74
|
+
res.writeHead(405).end(JSON.stringify({
|
|
75
|
+
jsonrpc: "2.0",
|
|
76
|
+
error: {
|
|
77
|
+
code: -32000,
|
|
78
|
+
message: "Method not allowed."
|
|
79
|
+
},
|
|
80
|
+
id: null
|
|
81
|
+
}));
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
return app;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Stateful Express app composition - maintains session state across requests
|
|
89
|
+
* @param app Express app instance to compose with
|
|
90
|
+
* @param mcpPath Path for MCP endpoints (default: '/mcp')
|
|
91
|
+
* @returns The same Express app instance for chaining
|
|
92
|
+
*/
|
|
93
|
+
export function statefulApp(app: express.Application, mcpPath: string = '/mcp'): express.Application {
|
|
94
|
+
// Map to store transports by session ID
|
|
95
|
+
const transports: { [sessionId: string]: StreamableHTTPServerTransport } = {};
|
|
96
|
+
|
|
97
|
+
// Handle POST requests for client-to-server communication
|
|
98
|
+
app.post(mcpPath, async (req: express.Request, res: express.Response) => {
|
|
99
|
+
// Extract authorization header for API calls
|
|
100
|
+
const authHeader = req.headers.authorization;
|
|
101
|
+
const requestHeaders = authHeader ? { Authorization: authHeader } : undefined;
|
|
102
|
+
|
|
103
|
+
// Check for existing session ID
|
|
104
|
+
const sessionId = req.headers['mcp-session-id'] as string | undefined;
|
|
105
|
+
let transport: StreamableHTTPServerTransport;
|
|
106
|
+
|
|
107
|
+
if (sessionId && transports[sessionId]) {
|
|
108
|
+
// Reuse existing transport
|
|
109
|
+
transport = transports[sessionId];
|
|
110
|
+
} else if (!sessionId && isInitializeRequest(req.body)) {
|
|
111
|
+
// New initialization request
|
|
112
|
+
transport = new StreamableHTTPServerTransport({
|
|
113
|
+
sessionIdGenerator: () => randomUUID(),
|
|
114
|
+
onsessioninitialized: (sessionId) => {
|
|
115
|
+
// Store the transport by session ID
|
|
116
|
+
transports[sessionId] = transport;
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Clean up transport when closed
|
|
121
|
+
transport.onclose = () => {
|
|
122
|
+
if (transport.sessionId) {
|
|
123
|
+
delete transports[transport.sessionId];
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const server = createMcpServer(requestHeaders);
|
|
128
|
+
await server.connect(transport);
|
|
129
|
+
} else {
|
|
130
|
+
// Invalid request
|
|
131
|
+
res.status(400).json({
|
|
132
|
+
jsonrpc: '2.0',
|
|
133
|
+
error: {
|
|
134
|
+
code: -32000,
|
|
135
|
+
message: 'Bad Request: No valid session ID provided',
|
|
136
|
+
},
|
|
137
|
+
id: null,
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Handle the request
|
|
143
|
+
await transport.handleRequest(req, res, req.body);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Reusable handler for GET and DELETE requests
|
|
147
|
+
const handleSessionRequest = async (req: express.Request, res: express.Response) => {
|
|
148
|
+
const sessionId = req.headers['mcp-session-id'] as string | undefined;
|
|
149
|
+
if (!sessionId || !transports[sessionId]) {
|
|
150
|
+
res.status(400).send('Invalid or missing session ID');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const transport = transports[sessionId];
|
|
155
|
+
await transport.handleRequest(req, res);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Handle GET requests for server-to-client notifications via SSE
|
|
159
|
+
app.get(mcpPath, handleSessionRequest);
|
|
160
|
+
|
|
161
|
+
// Handle DELETE requests for session termination
|
|
162
|
+
app.delete(mcpPath, handleSessionRequest);
|
|
163
|
+
|
|
164
|
+
return app;
|
|
165
|
+
}
|
|
166
|
+
`;
|
|
167
|
+
}
|
|
168
|
+
exports.generateExpressCompositionTemplate = generateExpressCompositionTemplate;
|
|
169
|
+
//# sourceMappingURL=express-template-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-template-generator.js","sourceRoot":"","sources":["../src/express-template-generator.ts"],"names":[],"mappings":";;;AAEA,SAAgB,kCAAkC,CAAC,SAA8B;IAC/E,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,SAAS,CAAC,mBAAmB,EAAE,CAAC;IACnD,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;IAE/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4JR,CAAC;AACF,CAAC;AApKD,gFAoKC"}
|
package/dist/generator.d.ts
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import { Tool, SwaggerSpec } from "./types";
|
|
2
2
|
export declare class SwaggerMcpGenerator {
|
|
3
3
|
private swaggerSpec;
|
|
4
|
-
private
|
|
4
|
+
private swaggerSource;
|
|
5
|
+
private apiBaseUrl;
|
|
5
6
|
private headers;
|
|
6
|
-
constructor(
|
|
7
|
+
constructor(swaggerSource: string, apiBaseUrl?: string);
|
|
7
8
|
private setupHeaders;
|
|
9
|
+
private isUrl;
|
|
8
10
|
loadSwaggerSpec(): Promise<SwaggerSpec>;
|
|
11
|
+
getApiBaseUrlPublic(): string;
|
|
12
|
+
getSwaggerSpec(): SwaggerSpec;
|
|
9
13
|
private getApiBaseUrl;
|
|
10
14
|
private convertSwaggerTypeToToolProp;
|
|
11
15
|
private resolveSchemaRef;
|
|
12
16
|
private resolveSchemaRefOnce;
|
|
13
17
|
generateTools(): Tool[];
|
|
18
|
+
private generateMethodParameters;
|
|
14
19
|
generateClientFunctions(): string;
|
|
20
|
+
generateExpressComposition(): string;
|
|
21
|
+
generateServerFactory(): string;
|
|
15
22
|
generateMcpServer(): string;
|
|
16
23
|
saveGeneratedFiles(outputDir?: string): Promise<void>;
|
|
17
24
|
}
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA8B;gBAEjC,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAOtD,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,KAAK;IASP,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC;IAqCtC,mBAAmB,IAAI,MAAM;IAI7B,cAAc,IAAI,WAAW;IAIpC,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,4BAA4B;IA0DpC,OAAO,CAAC,gBAAgB;IA+DxB,OAAO,CAAC,oBAAoB;IAsB5B,aAAa,IAAI,IAAI,EAAE;IA0GvB,OAAO,CAAC,wBAAwB;IAgEhC,uBAAuB,IAAI,MAAM;IA+FjC,0BAA0B,IAAI,MAAM;IAQpC,qBAAqB,IAAI,MAAM;IAwI/B,iBAAiB,IAAI,MAAM;IAwCrB,kBAAkB,CAAC,SAAS,GAAE,MAAsB;CAiF3D"}
|
package/dist/generator.js
CHANGED
|
@@ -8,9 +8,11 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
8
8
|
const fs_1 = require("fs");
|
|
9
9
|
const path_1 = require("path");
|
|
10
10
|
class SwaggerMcpGenerator {
|
|
11
|
-
constructor(
|
|
11
|
+
constructor(swaggerSource, apiBaseUrl) {
|
|
12
12
|
this.headers = {};
|
|
13
|
-
this.
|
|
13
|
+
this.swaggerSource = swaggerSource;
|
|
14
|
+
// If apiBaseUrl is not provided, assume swaggerSource is also the API base URL
|
|
15
|
+
this.apiBaseUrl = apiBaseUrl || swaggerSource;
|
|
14
16
|
this.setupHeaders();
|
|
15
17
|
}
|
|
16
18
|
setupHeaders() {
|
|
@@ -26,16 +28,39 @@ class SwaggerMcpGenerator {
|
|
|
26
28
|
this.headers["Authorization"] = process.env.HEADER_AUTHORIZATION;
|
|
27
29
|
}
|
|
28
30
|
}
|
|
31
|
+
isUrl(input) {
|
|
32
|
+
try {
|
|
33
|
+
new URL(input);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
29
40
|
async loadSwaggerSpec() {
|
|
30
41
|
try {
|
|
31
|
-
console.log(`Loading Swagger spec from: ${this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
console.log(`Loading Swagger spec from: ${this.swaggerSource}`);
|
|
43
|
+
let specData;
|
|
44
|
+
if (this.isUrl(this.swaggerSource)) {
|
|
45
|
+
// Handle URL - use existing axios logic
|
|
46
|
+
const response = await axios_1.default.get(this.swaggerSource, {
|
|
47
|
+
headers: {
|
|
48
|
+
Accept: "application/json",
|
|
49
|
+
...this.headers,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
specData = response.data;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Handle filesystem path
|
|
56
|
+
const filePath = (0, path_1.isAbsolute)(this.swaggerSource)
|
|
57
|
+
? this.swaggerSource
|
|
58
|
+
: (0, path_1.resolve)(process.cwd(), this.swaggerSource);
|
|
59
|
+
console.log(`Reading Swagger spec from file: ${filePath}`);
|
|
60
|
+
const fileContent = (0, fs_1.readFileSync)(filePath, "utf8");
|
|
61
|
+
specData = JSON.parse(fileContent);
|
|
62
|
+
}
|
|
63
|
+
this.swaggerSpec = specData;
|
|
39
64
|
console.log(`Loaded Swagger spec: ${this.swaggerSpec.info.title} v${this.swaggerSpec.info.version}`);
|
|
40
65
|
return this.swaggerSpec;
|
|
41
66
|
}
|
|
@@ -44,9 +69,25 @@ class SwaggerMcpGenerator {
|
|
|
44
69
|
throw error;
|
|
45
70
|
}
|
|
46
71
|
}
|
|
72
|
+
// Public getter methods for express template generator
|
|
73
|
+
getApiBaseUrlPublic() {
|
|
74
|
+
return this.getApiBaseUrl();
|
|
75
|
+
}
|
|
76
|
+
getSwaggerSpec() {
|
|
77
|
+
return this.swaggerSpec;
|
|
78
|
+
}
|
|
47
79
|
getApiBaseUrl() {
|
|
48
|
-
//
|
|
49
|
-
|
|
80
|
+
// If apiBaseUrl is a file path, we need to get the base URL from the OpenAPI spec
|
|
81
|
+
if (!this.isUrl(this.apiBaseUrl)) {
|
|
82
|
+
// Extract base URL from OpenAPI spec servers array as fallback
|
|
83
|
+
if (this.swaggerSpec.servers && this.swaggerSpec.servers.length > 0) {
|
|
84
|
+
const firstServer = this.swaggerSpec.servers[0];
|
|
85
|
+
return firstServer.url || 'http://localhost';
|
|
86
|
+
}
|
|
87
|
+
return 'http://localhost';
|
|
88
|
+
}
|
|
89
|
+
// Extract the base URL from the API base URL (remove any swagger.json path if present)
|
|
90
|
+
const swaggerUrl = new URL(this.apiBaseUrl);
|
|
50
91
|
const baseUrl = `${swaggerUrl.protocol}//${swaggerUrl.host}`;
|
|
51
92
|
// Get the server path from the OpenAPI spec
|
|
52
93
|
let serverPath = "/";
|
|
@@ -113,13 +154,13 @@ class SwaggerMcpGenerator {
|
|
|
113
154
|
return toolProp;
|
|
114
155
|
}
|
|
115
156
|
resolveSchemaRef(ref) {
|
|
116
|
-
if (!ref.startsWith(
|
|
157
|
+
if (!ref.startsWith("#/")) {
|
|
117
158
|
return {}; // Only handle local refs for now
|
|
118
159
|
}
|
|
119
|
-
const path = ref.substring(2).split(
|
|
160
|
+
const path = ref.substring(2).split("/");
|
|
120
161
|
let current = this.swaggerSpec;
|
|
121
162
|
for (const segment of path) {
|
|
122
|
-
if (!current || typeof current !==
|
|
163
|
+
if (!current || typeof current !== "object") {
|
|
123
164
|
return {};
|
|
124
165
|
}
|
|
125
166
|
current = current[segment];
|
|
@@ -130,9 +171,9 @@ class SwaggerMcpGenerator {
|
|
|
130
171
|
// Handle allOf by merging all schemas
|
|
131
172
|
if (current.allOf) {
|
|
132
173
|
const merged = {
|
|
133
|
-
type:
|
|
174
|
+
type: "object",
|
|
134
175
|
properties: {},
|
|
135
|
-
required: []
|
|
176
|
+
required: [],
|
|
136
177
|
};
|
|
137
178
|
for (const item of current.allOf) {
|
|
138
179
|
let resolvedItem;
|
|
@@ -152,7 +193,7 @@ class SwaggerMcpGenerator {
|
|
|
152
193
|
merged.required = [...merged.required, ...resolvedItem.required];
|
|
153
194
|
}
|
|
154
195
|
// Merge other properties (type, etc.)
|
|
155
|
-
if (resolvedItem.type && resolvedItem.type !==
|
|
196
|
+
if (resolvedItem.type && resolvedItem.type !== "object") {
|
|
156
197
|
merged.type = resolvedItem.type;
|
|
157
198
|
}
|
|
158
199
|
}
|
|
@@ -263,7 +304,7 @@ class SwaggerMcpGenerator {
|
|
|
263
304
|
inputSchema: {
|
|
264
305
|
type: "object",
|
|
265
306
|
properties,
|
|
266
|
-
required:
|
|
307
|
+
required: Array.from(new Set(required)),
|
|
267
308
|
},
|
|
268
309
|
};
|
|
269
310
|
tools.push(tool);
|
|
@@ -271,42 +312,72 @@ class SwaggerMcpGenerator {
|
|
|
271
312
|
}
|
|
272
313
|
return tools;
|
|
273
314
|
}
|
|
315
|
+
generateMethodParameters(path, operation) {
|
|
316
|
+
const pathParams = [];
|
|
317
|
+
const queryParams = [];
|
|
318
|
+
let bodyParam = false;
|
|
319
|
+
const paramParts = [];
|
|
320
|
+
// Extract path parameters from the path itself
|
|
321
|
+
const pathParamMatches = path.match(/{([^}]+)}/g);
|
|
322
|
+
if (pathParamMatches) {
|
|
323
|
+
for (const match of pathParamMatches) {
|
|
324
|
+
const paramName = match.slice(1, -1); // Remove { and }
|
|
325
|
+
pathParams.push(paramName);
|
|
326
|
+
// For path parameters, we'll assume they're strings/numbers based on common patterns
|
|
327
|
+
const paramType = paramName.toLowerCase().includes("id")
|
|
328
|
+
? "number"
|
|
329
|
+
: "string";
|
|
330
|
+
paramParts.push(`${paramName}: ${paramType}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Add query parameters from operation parameters
|
|
334
|
+
if (operation.parameters) {
|
|
335
|
+
for (const param of operation.parameters) {
|
|
336
|
+
if (param.in === "query") {
|
|
337
|
+
queryParams.push(param.name);
|
|
338
|
+
let paramType = "string";
|
|
339
|
+
// Determine parameter type from schema
|
|
340
|
+
const schema = param.schema || param;
|
|
341
|
+
if (schema.type === "array") {
|
|
342
|
+
paramType = "string[]";
|
|
343
|
+
}
|
|
344
|
+
else if (schema.type === "integer" || schema.type === "number") {
|
|
345
|
+
paramType = "number";
|
|
346
|
+
}
|
|
347
|
+
else if (schema.type === "boolean") {
|
|
348
|
+
paramType = "boolean";
|
|
349
|
+
}
|
|
350
|
+
paramParts.push(`${param.name}: ${paramType}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Add request body parameter
|
|
355
|
+
if (operation.requestBody) {
|
|
356
|
+
bodyParam = true;
|
|
357
|
+
paramParts.push("body: any");
|
|
358
|
+
}
|
|
359
|
+
// Add headers parameter
|
|
360
|
+
paramParts.push("headers?: Record<string, string>");
|
|
361
|
+
const signature = paramParts.join(", ");
|
|
362
|
+
return { signature, pathParams, queryParams, bodyParam };
|
|
363
|
+
}
|
|
274
364
|
generateClientFunctions() {
|
|
275
|
-
let clientCode =
|
|
276
|
-
import axios, { AxiosInstance } from 'axios';
|
|
365
|
+
let clientCode = `\
|
|
366
|
+
import axios, { AxiosInstance, AxiosResponse } from 'axios';
|
|
277
367
|
|
|
278
368
|
export class SwaggerClient {
|
|
279
|
-
private
|
|
369
|
+
private axiosInstance: AxiosInstance;
|
|
280
370
|
private baseUrl: string;
|
|
371
|
+
private headers: Record<string, string>;
|
|
281
372
|
|
|
282
|
-
constructor(baseUrl: string, headers
|
|
373
|
+
constructor(baseUrl: string, headers?: Record<string, string>) {
|
|
283
374
|
this.baseUrl = baseUrl;
|
|
284
|
-
this.
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
...headers
|
|
289
|
-
}
|
|
375
|
+
this.headers = headers || {};
|
|
376
|
+
this.axiosInstance = axios.create({
|
|
377
|
+
baseURL: this.baseUrl,
|
|
378
|
+
headers: this.headers
|
|
290
379
|
});
|
|
291
380
|
}
|
|
292
|
-
|
|
293
|
-
private replacePathParams(path: string, params: Record<string, any>): string {
|
|
294
|
-
let result = path;
|
|
295
|
-
const pathParams = path.match(/{([^}]+)}/g);
|
|
296
|
-
|
|
297
|
-
if (pathParams) {
|
|
298
|
-
for (const param of pathParams) {
|
|
299
|
-
const paramName = param.slice(1, -1);
|
|
300
|
-
if (params[paramName] !== undefined) {
|
|
301
|
-
result = result.replace(param, params[paramName]);
|
|
302
|
-
delete params[paramName];
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
return result;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
381
|
`;
|
|
311
382
|
for (const [path, pathItem] of Object.entries(this.swaggerSpec.paths)) {
|
|
312
383
|
for (const [method, operation] of Object.entries(pathItem)) {
|
|
@@ -314,29 +385,54 @@ export class SwaggerClient {
|
|
|
314
385
|
continue;
|
|
315
386
|
const operationId = operation.operationId ||
|
|
316
387
|
`${method}_${path.replace(/[^a-zA-Z0-9]/g, "_")}`;
|
|
317
|
-
const
|
|
388
|
+
const { signature, pathParams, queryParams, bodyParam } = this.generateMethodParameters(path, operation);
|
|
389
|
+
// Create URL with template literals for path parameters
|
|
390
|
+
let urlTemplate = path;
|
|
391
|
+
for (const pathParam of pathParams) {
|
|
392
|
+
urlTemplate = urlTemplate.replace(`{${pathParam}}`, `\${${pathParam}}`);
|
|
393
|
+
}
|
|
394
|
+
clientCode += `
|
|
395
|
+
async ${operationId}(${signature}): Promise<AxiosResponse<any>> {
|
|
396
|
+
const url = \`${urlTemplate}\`;`;
|
|
397
|
+
// Build query parameters object
|
|
398
|
+
if (queryParams.length > 0) {
|
|
399
|
+
clientCode += `
|
|
400
|
+
const queryParams = { ${queryParams.join(", ")} };`;
|
|
401
|
+
}
|
|
402
|
+
// Handle different HTTP method cases
|
|
403
|
+
if (bodyParam) {
|
|
404
|
+
// Methods with request body (POST, PUT, PATCH)
|
|
405
|
+
if (queryParams.length > 0) {
|
|
406
|
+
clientCode += `
|
|
407
|
+
const response = await this.axiosInstance.${method}(url, body, {
|
|
408
|
+
params: queryParams,
|
|
409
|
+
headers: { ...this.headers, ...headers }
|
|
410
|
+
});`;
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
clientCode += `
|
|
414
|
+
const response = await this.axiosInstance.${method}(url, body, {
|
|
415
|
+
headers: { ...this.headers, ...headers }
|
|
416
|
+
});`;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
// Methods without request body (GET, DELETE)
|
|
421
|
+
if (queryParams.length > 0) {
|
|
422
|
+
clientCode += `
|
|
423
|
+
const response = await this.axiosInstance.${method}(url, {
|
|
424
|
+
params: queryParams,
|
|
425
|
+
headers: { ...this.headers, ...headers }
|
|
426
|
+
});`;
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
clientCode += `
|
|
430
|
+
const response = await this.axiosInstance.${method}(url, {
|
|
431
|
+
headers: { ...this.headers, ...headers }
|
|
432
|
+
});`;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
318
435
|
clientCode += `
|
|
319
|
-
async ${operationId}(params: Record<string, any> = {}): Promise<any> {
|
|
320
|
-
const path = this.replacePathParams('${path}', { ...params });
|
|
321
|
-
const queryParams = { ...params };
|
|
322
|
-
|
|
323
|
-
// Remove path parameters from query params
|
|
324
|
-
const pathParamNames = '${path}'.match(/{([^}]+)}/g);
|
|
325
|
-
if (pathParamNames) {
|
|
326
|
-
for (const param of pathParamNames) {
|
|
327
|
-
const paramName = param.slice(1, -1);
|
|
328
|
-
delete queryParams[paramName];
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
${hasRequestBody
|
|
333
|
-
? `
|
|
334
|
-
const requestBody = { ...queryParams };
|
|
335
|
-
const response = await this.api.${method}(path, requestBody);
|
|
336
|
-
`
|
|
337
|
-
: `
|
|
338
|
-
const response = await this.api.${method}(path, { params: queryParams });
|
|
339
|
-
`}
|
|
340
436
|
|
|
341
437
|
return response.data;
|
|
342
438
|
}
|
|
@@ -348,123 +444,163 @@ export class SwaggerClient {
|
|
|
348
444
|
`;
|
|
349
445
|
return clientCode;
|
|
350
446
|
}
|
|
351
|
-
|
|
447
|
+
generateExpressComposition() {
|
|
448
|
+
// Import and use the Express composition template generator
|
|
449
|
+
const { generateExpressCompositionTemplate, } = require("./express-template-generator");
|
|
450
|
+
return generateExpressCompositionTemplate(this);
|
|
451
|
+
}
|
|
452
|
+
generateServerFactory() {
|
|
352
453
|
const tools = this.generateTools();
|
|
353
|
-
const swaggerUrl = this.baseUrl;
|
|
354
454
|
const apiBaseUrl = this.getApiBaseUrl();
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
import { SwaggerClient } from './client';
|
|
358
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
359
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
360
|
-
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
361
|
-
|
|
362
|
-
const server = new Server({
|
|
363
|
-
name: '${this.swaggerSpec.info.title
|
|
455
|
+
const serverName = this.swaggerSpec.info.title
|
|
364
456
|
.toLowerCase()
|
|
365
|
-
.replace(/[^a-z0-9]/g, "-")
|
|
366
|
-
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}
|
|
371
|
-
});
|
|
457
|
+
.replace(/[^a-z0-9]/g, "-");
|
|
458
|
+
const serverVersion = this.swaggerSpec.info.version;
|
|
459
|
+
return `import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
460
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
461
|
+
import { SwaggerClient } from './client';
|
|
372
462
|
|
|
373
463
|
// Setup headers from environment variables
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
headers
|
|
379
|
-
}
|
|
464
|
+
function getHeaders(): Record<string, string> {
|
|
465
|
+
return Object.keys(process.env).filter(key => key.startsWith('HEADER_')).reduce((headers, key) => {
|
|
466
|
+
const headerName = key.substring(7).replace(/_/g, '-');
|
|
467
|
+
headers[headerName] = process.env[key]!;
|
|
468
|
+
return headers;
|
|
469
|
+
}, {} as Record<string, string>);
|
|
380
470
|
}
|
|
381
471
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
472
|
+
// Merge environment headers with request headers, giving priority to request headers
|
|
473
|
+
// Handles Authorization header and other custom headers from environment variables
|
|
474
|
+
function mergeHeaders(requestHeaders?: Record<string, string>): Record<string, string> {
|
|
475
|
+
const envHeaders = getHeaders();
|
|
476
|
+
return {
|
|
477
|
+
...envHeaders,
|
|
478
|
+
...(requestHeaders || {})
|
|
479
|
+
};
|
|
480
|
+
}
|
|
385
481
|
|
|
482
|
+
/**
|
|
483
|
+
* Creates and configures an MCP server with the specified headers (including Authorization)
|
|
484
|
+
* @param requestHeaders Optional headers to include in API requests
|
|
485
|
+
* @returns Configured MCP Server instance
|
|
486
|
+
*/
|
|
487
|
+
export function createMcpServer(headers?: Record<string, string>): Server {
|
|
488
|
+
const server = new Server({
|
|
489
|
+
name: '${serverName}-mcp',
|
|
490
|
+
version: '${serverVersion}'
|
|
491
|
+
}, {
|
|
492
|
+
capabilities: {
|
|
493
|
+
tools: {}
|
|
494
|
+
}
|
|
495
|
+
});
|
|
386
496
|
|
|
497
|
+
const apiBaseUrl = '${apiBaseUrl}';
|
|
387
498
|
|
|
388
|
-
// Helper function to format responses consistently
|
|
389
|
-
const formatResponse = async (methodName: string, args: any) => {
|
|
390
|
-
|
|
391
|
-
const
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
if (error.response
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
499
|
+
// Helper function to format responses consistently
|
|
500
|
+
const formatResponse = async (methodName: string, args: any) => {
|
|
501
|
+
// Handle Authorization header and merge with environment headers
|
|
502
|
+
const envHeaders = getHeaders();
|
|
503
|
+
const mergedHeaders = { ...envHeaders, ...headers };
|
|
504
|
+
const client = new SwaggerClient(apiBaseUrl, mergedHeaders);
|
|
505
|
+
|
|
506
|
+
try {
|
|
507
|
+
const result = await (client as any)[methodName](args || {});
|
|
508
|
+
return {
|
|
509
|
+
content: [{
|
|
510
|
+
type: 'text',
|
|
511
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2)
|
|
512
|
+
}]
|
|
513
|
+
};
|
|
514
|
+
} catch (error: any) {
|
|
515
|
+
let errorMessage = \`Error calling \${methodName}: \${error.message}\`;
|
|
516
|
+
|
|
517
|
+
// If it's an axios error, provide more detailed information
|
|
518
|
+
if (error.response) {
|
|
519
|
+
// The request was made and the server responded with a status code
|
|
520
|
+
// that falls out of the range of 2xx
|
|
521
|
+
errorMessage += \`\\n\\nHTTP Status: \${error.response.status} \${error.response.statusText || ''}\`;
|
|
522
|
+
|
|
523
|
+
if (error.response.data) {
|
|
524
|
+
errorMessage += \`\\nResponse Body: \${typeof error.response.data === 'string' ? error.response.data : JSON.stringify(error.response.data, null, 2)}\`;
|
|
525
|
+
}
|
|
526
|
+
} else if (error.request) {
|
|
527
|
+
// The request was made but no response was received
|
|
528
|
+
errorMessage += \`\\n\\nNo response received from server\`;
|
|
529
|
+
// Extract safe request details to avoid circular reference issues
|
|
530
|
+
const requestDetails = {
|
|
531
|
+
method: error.request.method,
|
|
532
|
+
path: error.request.path,
|
|
533
|
+
timeout: error.request.timeout
|
|
534
|
+
};
|
|
535
|
+
errorMessage += \`\\nRequest details: \${JSON.stringify(requestDetails, null, 2)}\`;
|
|
536
|
+
} else {
|
|
537
|
+
// Something happened in setting up the request that triggered an Error
|
|
538
|
+
errorMessage += \`\\nRequest setup error: \${error.message}\`;
|
|
413
539
|
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
540
|
+
|
|
541
|
+
return {
|
|
542
|
+
content: [{
|
|
543
|
+
type: 'text',
|
|
544
|
+
text: errorMessage
|
|
545
|
+
}]
|
|
546
|
+
};
|
|
421
547
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
// Handle tool calls
|
|
551
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
552
|
+
const { name, arguments: args } = request.params as any;
|
|
553
|
+
|
|
554
|
+
switch (name) {
|
|
555
|
+
${tools
|
|
556
|
+
.map((tool) => ` case '${tool.name}':
|
|
557
|
+
return formatResponse('${tool.name}', args);`)
|
|
558
|
+
.join("\n")}
|
|
559
|
+
default:
|
|
560
|
+
throw new Error(\`Unknown tool: \${name}\`);
|
|
430
561
|
}
|
|
562
|
+
});
|
|
431
563
|
|
|
564
|
+
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
432
565
|
return {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
566
|
+
tools: [
|
|
567
|
+
${tools
|
|
568
|
+
.map((tool) => ` {
|
|
569
|
+
name: '${tool.name}',
|
|
570
|
+
description: '${tool.description}',
|
|
571
|
+
inputSchema: ${JSON.stringify(tool.inputSchema, null, 10)}
|
|
572
|
+
}`)
|
|
573
|
+
.join(",\n")}
|
|
574
|
+
]
|
|
437
575
|
};
|
|
438
|
-
}
|
|
439
|
-
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
return server;
|
|
579
|
+
}
|
|
580
|
+
`;
|
|
581
|
+
}
|
|
582
|
+
generateMcpServer() {
|
|
583
|
+
const serverFactory = this.generateServerFactory();
|
|
584
|
+
const swaggerUrl = this.swaggerSource;
|
|
585
|
+
const apiBaseUrl = this.getApiBaseUrl();
|
|
586
|
+
return `#!/usr/bin/env node
|
|
440
587
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
588
|
+
import { SwaggerClient } from './client';
|
|
589
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
590
|
+
import { createMcpServer } from './server-factory';
|
|
444
591
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
throw new Error(\`Unknown tool: \${name}\`);
|
|
592
|
+
// Setup headers from environment variables
|
|
593
|
+
const headers: Record<string, string> = {};
|
|
594
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
595
|
+
if (key.startsWith('HEADER_') && value) {
|
|
596
|
+
const headerName = key.substring(7);
|
|
597
|
+
headers[headerName] = value;
|
|
452
598
|
}
|
|
453
|
-
}
|
|
599
|
+
}
|
|
454
600
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
${tools
|
|
459
|
-
.map((tool) => ` {
|
|
460
|
-
name: '${tool.name}',
|
|
461
|
-
description: '${tool.description}',
|
|
462
|
-
inputSchema: ${JSON.stringify(tool.inputSchema, null, 8)}
|
|
463
|
-
}`)
|
|
464
|
-
.join(",\n")}
|
|
465
|
-
]
|
|
466
|
-
};
|
|
467
|
-
});
|
|
601
|
+
const swaggerUrl = '${swaggerUrl}';
|
|
602
|
+
const apiBaseUrl = '${apiBaseUrl}';
|
|
603
|
+
const server = createMcpServer(headers);
|
|
468
604
|
|
|
469
605
|
async function main() {
|
|
470
606
|
const transport = new StdioServerTransport();
|
|
@@ -472,7 +608,10 @@ async function main() {
|
|
|
472
608
|
console.error('${this.swaggerSpec.info.title.replace(/'/g, "\\'")} MCP Server running on stdio');
|
|
473
609
|
}
|
|
474
610
|
|
|
475
|
-
main()
|
|
611
|
+
// Only run main() if this file is being executed directly (not imported)
|
|
612
|
+
if (require.main === module) {
|
|
613
|
+
main().catch(console.error);
|
|
614
|
+
}
|
|
476
615
|
`;
|
|
477
616
|
}
|
|
478
617
|
async saveGeneratedFiles(outputDir = "./generated") {
|
|
@@ -488,6 +627,8 @@ main().catch(console.error);
|
|
|
488
627
|
const tools = this.generateTools();
|
|
489
628
|
const clientCode = this.generateClientFunctions();
|
|
490
629
|
const mcpServer = this.generateMcpServer();
|
|
630
|
+
const serverFactory = this.generateServerFactory();
|
|
631
|
+
const expressComposition = this.generateExpressComposition();
|
|
491
632
|
// Generate package.json for the output
|
|
492
633
|
const packageJson = {
|
|
493
634
|
name: `${this.swaggerSpec.info.title
|
|
@@ -501,6 +642,8 @@ main().catch(console.error);
|
|
|
501
642
|
},
|
|
502
643
|
dependencies: {
|
|
503
644
|
"@modelcontextprotocol/sdk": "^1.13.3",
|
|
645
|
+
express: "^4.18.0",
|
|
646
|
+
"@types/express": "^4.17.0",
|
|
504
647
|
axios: "^1.5.0",
|
|
505
648
|
},
|
|
506
649
|
devDependencies: {
|
|
@@ -529,13 +672,15 @@ main().catch(console.error);
|
|
|
529
672
|
(0, fs_1.writeFileSync)((0, path_1.join)(outputDir, "tsconfig.json"), JSON.stringify(tsConfig, null, 2));
|
|
530
673
|
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "client.ts"), clientCode);
|
|
531
674
|
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "mcp-server.ts"), mcpServer);
|
|
532
|
-
|
|
533
|
-
(0, fs_1.writeFileSync)((0, path_1.join)(
|
|
675
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "server-factory.ts"), serverFactory);
|
|
676
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "express-app.ts"), expressComposition);
|
|
534
677
|
console.log(`Generated files saved to ${outputDir}/`);
|
|
535
678
|
console.log(`- package.json: Project configuration`);
|
|
536
679
|
console.log(`- tsconfig.json: TypeScript configuration`);
|
|
537
680
|
console.log(`- src/client.ts: HTTP client functions`);
|
|
681
|
+
console.log(`- src/server-factory.ts: Reusable MCP server factory`);
|
|
538
682
|
console.log(`- src/mcp-server.ts: Complete MCP server implementation`);
|
|
683
|
+
console.log(`- src/express-app.ts: Express app composition functions`);
|
|
539
684
|
console.log(`- mcp-server.ts: Complete MCP server implementation`);
|
|
540
685
|
}
|
|
541
686
|
}
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,59 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
4
5
|
const child_process_1 = require("child_process");
|
|
5
6
|
const path_1 = require("path");
|
|
6
7
|
const fs_1 = require("fs");
|
|
7
8
|
const generator_1 = require("./generator");
|
|
8
|
-
function generateDomainBasedDir(
|
|
9
|
+
function generateDomainBasedDir(swaggerSource, packageDir) {
|
|
9
10
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
// Replace dots and other special characters with underscores
|
|
14
|
-
const sanitizedDomain = hostname.replace(/[^a-zA-Z0-9]/g, '_');
|
|
11
|
+
// Try to parse as URL first
|
|
12
|
+
const url = new URL(swaggerSource);
|
|
13
|
+
const sanitizedDomain = url.hostname.replace(/[^a-zA-Z0-9]/g, '_');
|
|
15
14
|
return (0, path_1.join)(packageDir, 'generated', sanitizedDomain);
|
|
16
15
|
}
|
|
17
16
|
catch (error) {
|
|
18
|
-
// If URL parsing fails,
|
|
19
|
-
console.warn('
|
|
17
|
+
// If URL parsing fails, it's likely a file path - use generic directory
|
|
18
|
+
console.warn('Using generic "generated" directory for file-based swagger source');
|
|
20
19
|
return (0, path_1.join)(packageDir, 'generated');
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
function parseArgs(args) {
|
|
24
|
-
// Get the directory where this package is installed
|
|
25
|
-
const packageDir = (0, path_1.dirname)((0, path_1.dirname)(__filename));
|
|
26
|
-
const parsed = {
|
|
27
|
-
swaggerUrl: '',
|
|
28
|
-
outputDir: '',
|
|
29
|
-
startStdio: false
|
|
30
|
-
};
|
|
31
|
-
// Filter out the --start-stdio flag first
|
|
32
|
-
const filteredArgs = args.filter(arg => {
|
|
33
|
-
if (arg === '--start-stdio') {
|
|
34
|
-
parsed.startStdio = true;
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
return true;
|
|
38
|
-
});
|
|
39
|
-
// Now parse the remaining arguments in order
|
|
40
|
-
for (let i = 0; i < filteredArgs.length; i++) {
|
|
41
|
-
if (!parsed.swaggerUrl) {
|
|
42
|
-
parsed.swaggerUrl = filteredArgs[i];
|
|
43
|
-
// Set default output directory based on the swagger URL
|
|
44
|
-
if (!parsed.outputDir) {
|
|
45
|
-
parsed.outputDir = generateDomainBasedDir(parsed.swaggerUrl, packageDir);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
// Second non-flag argument is the output directory
|
|
50
|
-
parsed.outputDir = filteredArgs[i];
|
|
51
|
-
break; // Only take the first two non-flag arguments
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
console.log(`Default output directory: ${parsed.outputDir}`);
|
|
55
|
-
return parsed;
|
|
56
|
-
}
|
|
57
22
|
async function buildAndRunServer(outputDir) {
|
|
58
23
|
console.log('\nšļø Building generated server...');
|
|
59
24
|
// Resolve the output directory to an absolute path to avoid duplication
|
|
@@ -134,30 +99,53 @@ async function buildAndRunServer(outputDir) {
|
|
|
134
99
|
return new Promise(() => { });
|
|
135
100
|
}
|
|
136
101
|
async function main() {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
102
|
+
const program = new commander_1.Command();
|
|
103
|
+
// Get the directory where this package is installed
|
|
104
|
+
const packageDir = (0, path_1.dirname)((0, path_1.dirname)(__filename));
|
|
105
|
+
program
|
|
106
|
+
.name('@tyvm/swagger-mcp')
|
|
107
|
+
.description('Generate MCP servers from Swagger/OpenAPI specifications')
|
|
108
|
+
.version('0.0.8')
|
|
109
|
+
.option('-u, --url <url>', 'Swagger/OpenAPI specification URL (required - used for API client configuration)')
|
|
110
|
+
.option('-f, --file <path>', 'Swagger/OpenAPI specification file path')
|
|
111
|
+
.option('-o, --output <dir>', 'Output directory for generated MCP server')
|
|
112
|
+
.option('--start-stdio', 'Build and start the server after generation')
|
|
113
|
+
.addHelpText('after', `
|
|
114
|
+
Environment variables:
|
|
115
|
+
HEADER_AUTHORIZATION=Bearer <token> - Set Authorization header
|
|
116
|
+
HEADER_<NAME>=<value> - Set custom header
|
|
117
|
+
|
|
118
|
+
Examples:
|
|
119
|
+
$ @tyvm/swagger-mcp --url https://api.example.com/swagger.json
|
|
120
|
+
$ @tyvm/swagger-mcp --url https://api.example.com --file ./swagger.json --output ./my-server
|
|
121
|
+
$ @tyvm/swagger-mcp --url https://api.example.com/swagger.json --start-stdio
|
|
122
|
+
$ @tyvm/swagger-mcp --url https://api.example.com --file ./local-swagger.json
|
|
123
|
+
$ HEADER_AUTHORIZATION="Bearer abc123" @tyvm/swagger-mcp --url https://api.example.com/swagger.json`);
|
|
124
|
+
program.parse();
|
|
125
|
+
const options = program.opts();
|
|
126
|
+
// Validate that --url is always required
|
|
127
|
+
if (!options.url) {
|
|
128
|
+
console.error('Error: --url is required (used for API client configuration)');
|
|
129
|
+
program.outputHelp();
|
|
150
130
|
process.exit(1);
|
|
151
131
|
}
|
|
152
|
-
|
|
132
|
+
// Determine the swagger source
|
|
133
|
+
const swaggerSource = options.file || options.url;
|
|
134
|
+
// Determine output directory
|
|
135
|
+
let outputDir = options.output;
|
|
136
|
+
if (!outputDir) {
|
|
137
|
+
outputDir = generateDomainBasedDir(swaggerSource, packageDir);
|
|
138
|
+
console.log(`Using default output directory: ${outputDir}`);
|
|
139
|
+
}
|
|
153
140
|
try {
|
|
154
|
-
|
|
141
|
+
// Pass both the swagger source and the API base URL
|
|
142
|
+
const generator = new generator_1.SwaggerMcpGenerator(swaggerSource, options.url);
|
|
155
143
|
await generator.loadSwaggerSpec();
|
|
156
144
|
const tools = generator.generateTools();
|
|
157
145
|
console.log(`Generated ${tools.length} tools from Swagger spec`);
|
|
158
146
|
await generator.saveGeneratedFiles(outputDir);
|
|
159
147
|
console.log('');
|
|
160
|
-
if (startStdio) {
|
|
148
|
+
if (options.startStdio) {
|
|
161
149
|
console.log('Generation complete! Starting server...');
|
|
162
150
|
// Build and run the server
|
|
163
151
|
await buildAndRunServer(outputDir);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,iDAAsC;AACtC,+BAA8C;AAC9C,2BAAgC;AAChC,2CAAkD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tyvm/swagger-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Generate MCP servers from Swagger/OpenAPI specifications",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"axios": "^1.5.0",
|
|
28
|
+
"commander": "^11.0.0",
|
|
28
29
|
"@modelcontextprotocol/sdk": "^1.13.3",
|
|
29
30
|
"zod": "^3.24.2"
|
|
30
31
|
},
|
|
@@ -32,8 +33,16 @@
|
|
|
32
33
|
"@types/node": "^20.6.3",
|
|
33
34
|
"typescript": "^4.6.3",
|
|
34
35
|
"ts-node": "^10.7.0",
|
|
35
|
-
"jest": "^29.
|
|
36
|
-
"@types/jest": "^29.5.13"
|
|
36
|
+
"jest": "^29.7.0",
|
|
37
|
+
"@types/jest": "^29.5.13",
|
|
38
|
+
"ts-jest": "^29.1.1",
|
|
39
|
+
"nock": "^13.3.8",
|
|
40
|
+
"express": "^4.18.0",
|
|
41
|
+
"@types/express": "^4.17.0",
|
|
42
|
+
"supertest": "^6.3.3",
|
|
43
|
+
"@types/supertest": "^6.0.2",
|
|
44
|
+
"express-session": "^1.17.3",
|
|
45
|
+
"@types/express-session": "^1.17.7"
|
|
37
46
|
},
|
|
38
47
|
"files": [
|
|
39
48
|
"dist/**/*",
|