@tyvm/swagger-mcp 0.0.7 → 0.0.10
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/client-generator.d.ts +7 -0
- package/dist/client-generator.d.ts.map +1 -0
- package/dist/client-generator.js +82 -0
- package/dist/client-generator.js.map +1 -0
- 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 +8 -2
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +87 -194
- package/dist/generator.js.map +1 -1
- package/dist/index.js +46 -58
- package/dist/index.js.map +1 -1
- package/dist/server-generator.d.ts +9 -0
- package/dist/server-generator.d.ts.map +1 -0
- package/dist/server-generator.js +142 -0
- package/dist/server-generator.js.map +1 -0
- 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":"client-generator.d.ts","sourceRoot":"","sources":["../src/client-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,EAAE,WAAW;IAIpC,uBAAuB,IAAI,MAAM;CA8ElC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClientGenerator = void 0;
|
|
4
|
+
class ClientGenerator {
|
|
5
|
+
constructor(swaggerSpec) {
|
|
6
|
+
this.swaggerSpec = swaggerSpec;
|
|
7
|
+
}
|
|
8
|
+
generateClientFunctions() {
|
|
9
|
+
let clientCode = `\
|
|
10
|
+
import axios, { AxiosInstance, AxiosResponse } from 'axios';
|
|
11
|
+
|
|
12
|
+
export class SwaggerClient {
|
|
13
|
+
private api: AxiosInstance;
|
|
14
|
+
private baseUrl: string;
|
|
15
|
+
|
|
16
|
+
constructor(baseUrl: string, headers: Record<string, string> = {}) {
|
|
17
|
+
this.baseUrl = baseUrl;
|
|
18
|
+
this.api = axios.create({
|
|
19
|
+
baseURL: baseUrl,
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
...headers
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private replacePathParams(path: string, params: Record<string, any>): string {
|
|
28
|
+
let result = path;
|
|
29
|
+
const pathParams = path.match(/{([^}]+)}/g);
|
|
30
|
+
|
|
31
|
+
if (pathParams) {
|
|
32
|
+
for (const param of pathParams) {
|
|
33
|
+
const paramName = param.slice(1, -1);
|
|
34
|
+
if (params[paramName] !== undefined) {
|
|
35
|
+
result = result.replace(param, params[paramName]);
|
|
36
|
+
delete params[paramName];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
`;
|
|
44
|
+
for (const [path, pathItem] of Object.entries(this.swaggerSpec.paths)) {
|
|
45
|
+
for (const [method, operation] of Object.entries(pathItem)) {
|
|
46
|
+
if (typeof operation !== "object" || !operation)
|
|
47
|
+
continue;
|
|
48
|
+
const operationId = operation.operationId ||
|
|
49
|
+
`${method}_${path.replace(/[^a-zA-Z0-9]/g, "_")}`;
|
|
50
|
+
const hasRequestBody = operation.requestBody !== undefined;
|
|
51
|
+
clientCode += `
|
|
52
|
+
async ${operationId}(params: Record<string, any> = {}): Promise<any> {
|
|
53
|
+
const path = this.replacePathParams('${path}', { ...params });
|
|
54
|
+
|
|
55
|
+
// Extract remaining params as query parameters
|
|
56
|
+
const queryParams = { ...params };`;
|
|
57
|
+
if (hasRequestBody) {
|
|
58
|
+
clientCode += `
|
|
59
|
+
const requestBody = queryParams.body;
|
|
60
|
+
delete queryParams.body;
|
|
61
|
+
|
|
62
|
+
const response = await this.api.${method}(path, requestBody);`;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
clientCode += `
|
|
66
|
+
const response = await this.api.${method}(path, { params: queryParams });`;
|
|
67
|
+
}
|
|
68
|
+
clientCode += `
|
|
69
|
+
|
|
70
|
+
return response.data;
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
clientCode += `
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
return clientCode;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.ClientGenerator = ClientGenerator;
|
|
82
|
+
//# sourceMappingURL=client-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-generator.js","sourceRoot":"","sources":["../src/client-generator.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAG1B,YAAY,WAAwB;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,uBAAuB;QACrB,IAAI,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCpB,CAAC;QAEE,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YACrE,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC1D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS;oBAAE,SAAS;gBAE1D,MAAM,WAAW,GACf,SAAS,CAAC,WAAW;oBACrB,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC;gBAE3D,UAAU,IAAI;UACZ,WAAW;2CACsB,IAAI;;;uCAGR,CAAC;gBAEhC,IAAI,cAAc,EAAE;oBAClB,UAAU,IAAI;;;;sCAIc,MAAM,sBAAsB,CAAC;iBAC1D;qBAAM;oBACL,UAAU,IAAI;sCACc,MAAM,kCAAkC,CAAC;iBACtE;gBAED,UAAU,IAAI;;;;CAIrB,CAAC;aACK;SACF;QAED,UAAU,IAAI;;CAEjB,CAAC;QAEE,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AArFD,0CAqFC"}
|
|
@@ -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,23 @@
|
|
|
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[];
|
|
14
18
|
generateClientFunctions(): string;
|
|
19
|
+
generateExpressComposition(): string;
|
|
20
|
+
generateServerFactory(): string;
|
|
15
21
|
generateMcpServer(): string;
|
|
16
22
|
saveGeneratedFiles(outputDir?: string): Promise<void>;
|
|
17
23
|
}
|
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;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AAItD,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,uBAAuB,IAAI,MAAM;IAKjC,0BAA0B,IAAI,MAAM;IAQpC,qBAAqB,IAAI,MAAM;IAS/B,iBAAiB,IAAI,MAAM;IAwCrB,kBAAkB,CAAC,SAAS,GAAE,MAAsB;CAiF3D"}
|
package/dist/generator.js
CHANGED
|
@@ -7,10 +7,14 @@ exports.SwaggerMcpGenerator = void 0;
|
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
const fs_1 = require("fs");
|
|
9
9
|
const path_1 = require("path");
|
|
10
|
+
const client_generator_1 = require("./client-generator");
|
|
11
|
+
const server_generator_1 = require("./server-generator");
|
|
10
12
|
class SwaggerMcpGenerator {
|
|
11
|
-
constructor(
|
|
13
|
+
constructor(swaggerSource, apiBaseUrl) {
|
|
12
14
|
this.headers = {};
|
|
13
|
-
this.
|
|
15
|
+
this.swaggerSource = swaggerSource;
|
|
16
|
+
// If apiBaseUrl is not provided, assume swaggerSource is also the API base URL
|
|
17
|
+
this.apiBaseUrl = apiBaseUrl || swaggerSource;
|
|
14
18
|
this.setupHeaders();
|
|
15
19
|
}
|
|
16
20
|
setupHeaders() {
|
|
@@ -26,16 +30,39 @@ class SwaggerMcpGenerator {
|
|
|
26
30
|
this.headers["Authorization"] = process.env.HEADER_AUTHORIZATION;
|
|
27
31
|
}
|
|
28
32
|
}
|
|
33
|
+
isUrl(input) {
|
|
34
|
+
try {
|
|
35
|
+
new URL(input);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
29
42
|
async loadSwaggerSpec() {
|
|
30
43
|
try {
|
|
31
|
-
console.log(`Loading Swagger spec from: ${this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
console.log(`Loading Swagger spec from: ${this.swaggerSource}`);
|
|
45
|
+
let specData;
|
|
46
|
+
if (this.isUrl(this.swaggerSource)) {
|
|
47
|
+
// Handle URL - use existing axios logic
|
|
48
|
+
const response = await axios_1.default.get(this.swaggerSource, {
|
|
49
|
+
headers: {
|
|
50
|
+
Accept: "application/json",
|
|
51
|
+
...this.headers,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
specData = response.data;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Handle filesystem path
|
|
58
|
+
const filePath = (0, path_1.isAbsolute)(this.swaggerSource)
|
|
59
|
+
? this.swaggerSource
|
|
60
|
+
: (0, path_1.resolve)(process.cwd(), this.swaggerSource);
|
|
61
|
+
console.log(`Reading Swagger spec from file: ${filePath}`);
|
|
62
|
+
const fileContent = (0, fs_1.readFileSync)(filePath, "utf8");
|
|
63
|
+
specData = JSON.parse(fileContent);
|
|
64
|
+
}
|
|
65
|
+
this.swaggerSpec = specData;
|
|
39
66
|
console.log(`Loaded Swagger spec: ${this.swaggerSpec.info.title} v${this.swaggerSpec.info.version}`);
|
|
40
67
|
return this.swaggerSpec;
|
|
41
68
|
}
|
|
@@ -44,9 +71,25 @@ class SwaggerMcpGenerator {
|
|
|
44
71
|
throw error;
|
|
45
72
|
}
|
|
46
73
|
}
|
|
74
|
+
// Public getter methods for express template generator
|
|
75
|
+
getApiBaseUrlPublic() {
|
|
76
|
+
return this.getApiBaseUrl();
|
|
77
|
+
}
|
|
78
|
+
getSwaggerSpec() {
|
|
79
|
+
return this.swaggerSpec;
|
|
80
|
+
}
|
|
47
81
|
getApiBaseUrl() {
|
|
48
|
-
//
|
|
49
|
-
|
|
82
|
+
// If apiBaseUrl is a file path, we need to get the base URL from the OpenAPI spec
|
|
83
|
+
if (!this.isUrl(this.apiBaseUrl)) {
|
|
84
|
+
// Extract base URL from OpenAPI spec servers array as fallback
|
|
85
|
+
if (this.swaggerSpec.servers && this.swaggerSpec.servers.length > 0) {
|
|
86
|
+
const firstServer = this.swaggerSpec.servers[0];
|
|
87
|
+
return firstServer.url || "http://localhost";
|
|
88
|
+
}
|
|
89
|
+
return "http://localhost";
|
|
90
|
+
}
|
|
91
|
+
// Extract the base URL from the API base URL (remove any swagger.json path if present)
|
|
92
|
+
const swaggerUrl = new URL(this.apiBaseUrl);
|
|
50
93
|
const baseUrl = `${swaggerUrl.protocol}//${swaggerUrl.host}`;
|
|
51
94
|
// Get the server path from the OpenAPI spec
|
|
52
95
|
let serverPath = "/";
|
|
@@ -113,13 +156,13 @@ class SwaggerMcpGenerator {
|
|
|
113
156
|
return toolProp;
|
|
114
157
|
}
|
|
115
158
|
resolveSchemaRef(ref) {
|
|
116
|
-
if (!ref.startsWith(
|
|
159
|
+
if (!ref.startsWith("#/")) {
|
|
117
160
|
return {}; // Only handle local refs for now
|
|
118
161
|
}
|
|
119
|
-
const path = ref.substring(2).split(
|
|
162
|
+
const path = ref.substring(2).split("/");
|
|
120
163
|
let current = this.swaggerSpec;
|
|
121
164
|
for (const segment of path) {
|
|
122
|
-
if (!current || typeof current !==
|
|
165
|
+
if (!current || typeof current !== "object") {
|
|
123
166
|
return {};
|
|
124
167
|
}
|
|
125
168
|
current = current[segment];
|
|
@@ -130,9 +173,9 @@ class SwaggerMcpGenerator {
|
|
|
130
173
|
// Handle allOf by merging all schemas
|
|
131
174
|
if (current.allOf) {
|
|
132
175
|
const merged = {
|
|
133
|
-
type:
|
|
176
|
+
type: "object",
|
|
134
177
|
properties: {},
|
|
135
|
-
required: []
|
|
178
|
+
required: [],
|
|
136
179
|
};
|
|
137
180
|
for (const item of current.allOf) {
|
|
138
181
|
let resolvedItem;
|
|
@@ -152,7 +195,7 @@ class SwaggerMcpGenerator {
|
|
|
152
195
|
merged.required = [...merged.required, ...resolvedItem.required];
|
|
153
196
|
}
|
|
154
197
|
// Merge other properties (type, etc.)
|
|
155
|
-
if (resolvedItem.type && resolvedItem.type !==
|
|
198
|
+
if (resolvedItem.type && resolvedItem.type !== "object") {
|
|
156
199
|
merged.type = resolvedItem.type;
|
|
157
200
|
}
|
|
158
201
|
}
|
|
@@ -263,7 +306,7 @@ class SwaggerMcpGenerator {
|
|
|
263
306
|
inputSchema: {
|
|
264
307
|
type: "object",
|
|
265
308
|
properties,
|
|
266
|
-
required:
|
|
309
|
+
required: Array.from(new Set(required)),
|
|
267
310
|
},
|
|
268
311
|
};
|
|
269
312
|
tools.push(tool);
|
|
@@ -272,103 +315,27 @@ class SwaggerMcpGenerator {
|
|
|
272
315
|
return tools;
|
|
273
316
|
}
|
|
274
317
|
generateClientFunctions() {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
export class SwaggerClient {
|
|
279
|
-
private api: AxiosInstance;
|
|
280
|
-
private baseUrl: string;
|
|
281
|
-
|
|
282
|
-
constructor(baseUrl: string, headers: Record<string, string> = {}) {
|
|
283
|
-
this.baseUrl = baseUrl;
|
|
284
|
-
this.api = axios.create({
|
|
285
|
-
baseURL: baseUrl,
|
|
286
|
-
headers: {
|
|
287
|
-
'Content-Type': 'application/json',
|
|
288
|
-
...headers
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
}
|
|
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
|
-
}
|
|
318
|
+
const clientGenerator = new client_generator_1.ClientGenerator(this.swaggerSpec);
|
|
319
|
+
return clientGenerator.generateClientFunctions();
|
|
305
320
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
`;
|
|
311
|
-
for (const [path, pathItem] of Object.entries(this.swaggerSpec.paths)) {
|
|
312
|
-
for (const [method, operation] of Object.entries(pathItem)) {
|
|
313
|
-
if (typeof operation !== "object" || !operation)
|
|
314
|
-
continue;
|
|
315
|
-
const operationId = operation.operationId ||
|
|
316
|
-
`${method}_${path.replace(/[^a-zA-Z0-9]/g, "_")}`;
|
|
317
|
-
const hasRequestBody = operation.requestBody !== undefined;
|
|
318
|
-
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
|
-
}
|
|
321
|
+
generateExpressComposition() {
|
|
322
|
+
// Import and use the Express composition template generator
|
|
323
|
+
const { generateExpressCompositionTemplate, } = require("./express-template-generator");
|
|
324
|
+
return generateExpressCompositionTemplate(this);
|
|
330
325
|
}
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
|
|
341
|
-
return response.data;
|
|
342
|
-
}
|
|
343
|
-
`;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
clientCode += `
|
|
347
|
-
}
|
|
348
|
-
`;
|
|
349
|
-
return clientCode;
|
|
326
|
+
generateServerFactory() {
|
|
327
|
+
const serverGenerator = new server_generator_1.ServerGenerator(this.getApiBaseUrl(), this.swaggerSpec, this.generateTools());
|
|
328
|
+
return serverGenerator.generateServerFactory();
|
|
350
329
|
}
|
|
351
330
|
generateMcpServer() {
|
|
352
|
-
const
|
|
353
|
-
const swaggerUrl = this.
|
|
331
|
+
const serverFactory = this.generateServerFactory();
|
|
332
|
+
const swaggerUrl = this.swaggerSource;
|
|
354
333
|
const apiBaseUrl = this.getApiBaseUrl();
|
|
355
334
|
return `#!/usr/bin/env node
|
|
356
335
|
|
|
357
336
|
import { SwaggerClient } from './client';
|
|
358
337
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
359
|
-
import {
|
|
360
|
-
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
361
|
-
|
|
362
|
-
const server = new Server({
|
|
363
|
-
name: '${this.swaggerSpec.info.title
|
|
364
|
-
.toLowerCase()
|
|
365
|
-
.replace(/[^a-z0-9]/g, "-")}-mcp',
|
|
366
|
-
version: '${this.swaggerSpec.info.version}'
|
|
367
|
-
}, {
|
|
368
|
-
capabilities: {
|
|
369
|
-
tools: {}
|
|
370
|
-
}
|
|
371
|
-
});
|
|
338
|
+
import { createMcpServer } from './server-factory';
|
|
372
339
|
|
|
373
340
|
// Setup headers from environment variables
|
|
374
341
|
const headers: Record<string, string> = {};
|
|
@@ -381,90 +348,7 @@ for (const [key, value] of Object.entries(process.env)) {
|
|
|
381
348
|
|
|
382
349
|
const swaggerUrl = '${swaggerUrl}';
|
|
383
350
|
const apiBaseUrl = '${apiBaseUrl}';
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
// Helper function to format responses consistently
|
|
389
|
-
const formatResponse = async (methodName: string, args: any) => {
|
|
390
|
-
try {
|
|
391
|
-
const result = await (client as any)[methodName](args || {});
|
|
392
|
-
return {
|
|
393
|
-
content: [{
|
|
394
|
-
type: 'text',
|
|
395
|
-
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2)
|
|
396
|
-
}]
|
|
397
|
-
};
|
|
398
|
-
} catch (error: any) {
|
|
399
|
-
let errorMessage = \`Error calling \${methodName}: \${error.message}\`;
|
|
400
|
-
|
|
401
|
-
// If it's an axios error, provide more detailed information
|
|
402
|
-
if (error.response) {
|
|
403
|
-
// The request was made and the server responded with a status code
|
|
404
|
-
// that falls out of the range of 2xx
|
|
405
|
-
errorMessage += \`\\n\\nHTTP Status: \${error.response.status} \${error.response.statusText || ''}\`;
|
|
406
|
-
|
|
407
|
-
if (error.response.headers) {
|
|
408
|
-
errorMessage += \`\\nResponse Headers: \${JSON.stringify(error.response.headers, null, 2)}\`;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
if (error.response.data) {
|
|
412
|
-
errorMessage += \`\\nResponse Body: \${typeof error.response.data === 'string' ? error.response.data : JSON.stringify(error.response.data, null, 2)}\`;
|
|
413
|
-
}
|
|
414
|
-
} else if (error.request) {
|
|
415
|
-
// The request was made but no response was received
|
|
416
|
-
errorMessage += \`\\n\\nNo response received from server\`;
|
|
417
|
-
errorMessage += \`\\nRequest details: \${JSON.stringify(error.request, null, 2)}\`;
|
|
418
|
-
} else {
|
|
419
|
-
// Something happened in setting up the request that triggered an Error
|
|
420
|
-
errorMessage += \`\\n\\nRequest setup error: \${error.message}\`;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
if (error.config) {
|
|
424
|
-
errorMessage += \`\\n\\nRequest config: \${JSON.stringify({
|
|
425
|
-
method: error.config.method,
|
|
426
|
-
url: error.config.url,
|
|
427
|
-
headers: error.config.headers,
|
|
428
|
-
timeout: error.config.timeout
|
|
429
|
-
}, null, 2)}\`;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
return {
|
|
433
|
-
content: [{
|
|
434
|
-
type: 'text',
|
|
435
|
-
text: errorMessage
|
|
436
|
-
}]
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
|
-
};
|
|
440
|
-
|
|
441
|
-
// Handle tool calls
|
|
442
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
443
|
-
const { name, arguments: args } = request.params as any;
|
|
444
|
-
|
|
445
|
-
switch (name) {
|
|
446
|
-
${tools
|
|
447
|
-
.map((tool) => ` case '${tool.name}':
|
|
448
|
-
return formatResponse('${tool.name}', args);`)
|
|
449
|
-
.join("\n")}
|
|
450
|
-
default:
|
|
451
|
-
throw new Error(\`Unknown tool: \${name}\`);
|
|
452
|
-
}
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
456
|
-
return {
|
|
457
|
-
tools: [
|
|
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
|
-
});
|
|
351
|
+
const server = createMcpServer(headers);
|
|
468
352
|
|
|
469
353
|
async function main() {
|
|
470
354
|
const transport = new StdioServerTransport();
|
|
@@ -472,7 +356,10 @@ async function main() {
|
|
|
472
356
|
console.error('${this.swaggerSpec.info.title.replace(/'/g, "\\'")} MCP Server running on stdio');
|
|
473
357
|
}
|
|
474
358
|
|
|
475
|
-
main()
|
|
359
|
+
// Only run main() if this file is being executed directly (not imported)
|
|
360
|
+
if (require.main === module) {
|
|
361
|
+
main().catch(console.error);
|
|
362
|
+
}
|
|
476
363
|
`;
|
|
477
364
|
}
|
|
478
365
|
async saveGeneratedFiles(outputDir = "./generated") {
|
|
@@ -488,6 +375,8 @@ main().catch(console.error);
|
|
|
488
375
|
const tools = this.generateTools();
|
|
489
376
|
const clientCode = this.generateClientFunctions();
|
|
490
377
|
const mcpServer = this.generateMcpServer();
|
|
378
|
+
const serverFactory = this.generateServerFactory();
|
|
379
|
+
const expressComposition = this.generateExpressComposition();
|
|
491
380
|
// Generate package.json for the output
|
|
492
381
|
const packageJson = {
|
|
493
382
|
name: `${this.swaggerSpec.info.title
|
|
@@ -501,6 +390,8 @@ main().catch(console.error);
|
|
|
501
390
|
},
|
|
502
391
|
dependencies: {
|
|
503
392
|
"@modelcontextprotocol/sdk": "^1.13.3",
|
|
393
|
+
express: "^4.18.0",
|
|
394
|
+
"@types/express": "^4.17.0",
|
|
504
395
|
axios: "^1.5.0",
|
|
505
396
|
},
|
|
506
397
|
devDependencies: {
|
|
@@ -529,13 +420,15 @@ main().catch(console.error);
|
|
|
529
420
|
(0, fs_1.writeFileSync)((0, path_1.join)(outputDir, "tsconfig.json"), JSON.stringify(tsConfig, null, 2));
|
|
530
421
|
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "client.ts"), clientCode);
|
|
531
422
|
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "mcp-server.ts"), mcpServer);
|
|
532
|
-
|
|
533
|
-
(0, fs_1.writeFileSync)((0, path_1.join)(
|
|
423
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "server-factory.ts"), serverFactory);
|
|
424
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, "express-app.ts"), expressComposition);
|
|
534
425
|
console.log(`Generated files saved to ${outputDir}/`);
|
|
535
426
|
console.log(`- package.json: Project configuration`);
|
|
536
427
|
console.log(`- tsconfig.json: TypeScript configuration`);
|
|
537
428
|
console.log(`- src/client.ts: HTTP client functions`);
|
|
429
|
+
console.log(`- src/server-factory.ts: Reusable MCP server factory`);
|
|
538
430
|
console.log(`- src/mcp-server.ts: Complete MCP server implementation`);
|
|
431
|
+
console.log(`- src/express-app.ts: Express app composition functions`);
|
|
539
432
|
console.log(`- mcp-server.ts: Complete MCP server implementation`);
|
|
540
433
|
}
|
|
541
434
|
}
|
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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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SwaggerSpec, Tool } from "./types";
|
|
2
|
+
export declare class ServerGenerator {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private swaggerSpec;
|
|
5
|
+
private tools;
|
|
6
|
+
constructor(baseUrl: string, swaggerSpec: SwaggerSpec, tools: Tool[]);
|
|
7
|
+
generateServerFactory(): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=server-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-generator.d.ts","sourceRoot":"","sources":["../src/server-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,eAAe;IAExB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,KAAK;gBAFL,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,IAAI,EAAE;IAGvB,qBAAqB,IAAI,MAAM;CAuIhC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServerGenerator = void 0;
|
|
4
|
+
class ServerGenerator {
|
|
5
|
+
constructor(baseUrl, swaggerSpec, tools) {
|
|
6
|
+
this.baseUrl = baseUrl;
|
|
7
|
+
this.swaggerSpec = swaggerSpec;
|
|
8
|
+
this.tools = tools;
|
|
9
|
+
}
|
|
10
|
+
generateServerFactory() {
|
|
11
|
+
const tools = this.tools;
|
|
12
|
+
const apiBaseUrl = this.baseUrl;
|
|
13
|
+
const serverName = this.swaggerSpec.info.title
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/[^a-z0-9]/g, "-");
|
|
16
|
+
const serverVersion = this.swaggerSpec.info.version;
|
|
17
|
+
return `import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
18
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
19
|
+
import { SwaggerClient } from './client';
|
|
20
|
+
|
|
21
|
+
// Setup headers from environment variables
|
|
22
|
+
function getHeaders(): Record<string, string> {
|
|
23
|
+
return Object.keys(process.env).filter(key => key.startsWith('HEADER_')).reduce((headers, key) => {
|
|
24
|
+
const headerName = key.substring(7).replace(/_/g, '-');
|
|
25
|
+
headers[headerName] = process.env[key]!;
|
|
26
|
+
return headers;
|
|
27
|
+
}, {} as Record<string, string>);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Merge environment headers with request headers, giving priority to request headers
|
|
31
|
+
// Handles Authorization header and other custom headers from environment variables
|
|
32
|
+
function mergeHeaders(requestHeaders?: Record<string, string>): Record<string, string> {
|
|
33
|
+
const envHeaders = getHeaders();
|
|
34
|
+
return {
|
|
35
|
+
...envHeaders,
|
|
36
|
+
...(requestHeaders || {})
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Creates and configures an MCP server with the specified headers (including Authorization)
|
|
42
|
+
* @param requestHeaders Optional headers to include in API requests
|
|
43
|
+
* @returns Configured MCP Server instance
|
|
44
|
+
*/
|
|
45
|
+
export function createMcpServer(headers?: Record<string, string>): Server {
|
|
46
|
+
const server = new Server({
|
|
47
|
+
name: '${serverName}-mcp',
|
|
48
|
+
version: '${serverVersion}'
|
|
49
|
+
}, {
|
|
50
|
+
capabilities: {
|
|
51
|
+
tools: {}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const apiBaseUrl = '${apiBaseUrl}';
|
|
56
|
+
|
|
57
|
+
// Helper function to format responses consistently
|
|
58
|
+
const formatResponse = async (methodName: string, args: any) => {
|
|
59
|
+
// Handle Authorization header and merge with environment headers
|
|
60
|
+
const envHeaders = getHeaders();
|
|
61
|
+
const mergedHeaders = { ...envHeaders, ...headers };
|
|
62
|
+
const client = new SwaggerClient(apiBaseUrl, mergedHeaders);
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
const result = await (client as any)[methodName](args || {});
|
|
66
|
+
return {
|
|
67
|
+
content: [{
|
|
68
|
+
type: 'text',
|
|
69
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2)
|
|
70
|
+
}]
|
|
71
|
+
};
|
|
72
|
+
} catch (error: any) {
|
|
73
|
+
let errorMessage = \`Error calling \${methodName}: \${error.message}\`;
|
|
74
|
+
|
|
75
|
+
// If it's an axios error, provide more detailed information
|
|
76
|
+
if (error.response) {
|
|
77
|
+
// The request was made and the server responded with a status code
|
|
78
|
+
// that falls out of the range of 2xx
|
|
79
|
+
errorMessage += \`\\n\\nHTTP Status: \${error.response.status} \${error.response.statusText || ''}\`;
|
|
80
|
+
|
|
81
|
+
if (error.response.data) {
|
|
82
|
+
errorMessage += \`\\nResponse Body: \${typeof error.response.data === 'string' ? error.response.data : JSON.stringify(error.response.data, null, 2)}\`;
|
|
83
|
+
}
|
|
84
|
+
} else if (error.request) {
|
|
85
|
+
// The request was made but no response was received
|
|
86
|
+
errorMessage += \`\\n\\nNo response received from server\`;
|
|
87
|
+
// Extract safe request details to avoid circular reference issues
|
|
88
|
+
const requestDetails = {
|
|
89
|
+
method: error.request.method,
|
|
90
|
+
path: error.request.path,
|
|
91
|
+
timeout: error.request.timeout
|
|
92
|
+
};
|
|
93
|
+
errorMessage += \`\\nRequest details: \${JSON.stringify(requestDetails, null, 2)}\`;
|
|
94
|
+
} else {
|
|
95
|
+
// Something happened in setting up the request that triggered an Error
|
|
96
|
+
errorMessage += \`\\nRequest setup error: \${error.message}\`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
content: [{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: errorMessage
|
|
103
|
+
}]
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Handle tool calls
|
|
109
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
110
|
+
const { name, arguments: args } = request.params as any;
|
|
111
|
+
|
|
112
|
+
switch (name) {
|
|
113
|
+
${tools
|
|
114
|
+
.map((tool) => ` case '${tool.name}':
|
|
115
|
+
return formatResponse('${tool.name}', args);`)
|
|
116
|
+
.join("\n")}
|
|
117
|
+
default:
|
|
118
|
+
throw new Error(\`Unknown tool: \${name}\`);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
123
|
+
return {
|
|
124
|
+
tools: [
|
|
125
|
+
${tools
|
|
126
|
+
.map((tool) => ` {
|
|
127
|
+
name: '${tool.name}',
|
|
128
|
+
description: '${tool.description}',
|
|
129
|
+
inputSchema: ${JSON.stringify(tool.inputSchema, null, 10)}
|
|
130
|
+
}`)
|
|
131
|
+
.join(",\n")}
|
|
132
|
+
]
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
return server;
|
|
137
|
+
}
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.ServerGenerator = ServerGenerator;
|
|
142
|
+
//# sourceMappingURL=server-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-generator.js","sourceRoot":"","sources":["../src/server-generator.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAC1B,YACU,OAAe,EACf,WAAwB,EACxB,KAAa;QAFb,YAAO,GAAP,OAAO,CAAQ;QACf,gBAAW,GAAX,WAAW,CAAa;QACxB,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,qBAAqB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK;aAC3C,WAAW,EAAE;aACb,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QAEpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8BE,UAAU;gBACP,aAAa;;;;;;;wBAOL,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DhC,KAAK;aACJ,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,IAAI,CAAC,IAAI;iCACL,IAAI,CAAC,IAAI,WAAW,CAClD;aACA,IAAI,CAAC,IAAI,CAAC;;;;;;;;;EASX,KAAK;aACJ,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CAAC;mBACK,IAAI,CAAC,IAAI;0BACF,IAAI,CAAC,WAAW;yBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;UACzD,CACP;aACA,IAAI,CAAC,KAAK,CAAC;;;;;;;CAOb,CAAC;IACA,CAAC;CACF;AA9ID,0CA8IC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tyvm/swagger-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
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/**/*",
|