@tyvm/swagger-mcp 0.0.1
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 +91 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +393 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +177 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Swagger MCP Generator
|
|
2
|
+
|
|
3
|
+
Generate MCP (Model Context Protocol) servers from Swagger/OpenAPI specifications.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx swagger-mcp-generator <swagger-url> [output-dir] [--start-stdio]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Examples
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Generate MCP server from Swagger spec
|
|
15
|
+
npx swagger-mcp-generator https://api.example.com/swagger.json
|
|
16
|
+
|
|
17
|
+
# Generate with custom output directory
|
|
18
|
+
npx swagger-mcp-generator https://api.example.com/swagger.json ./my-mcp-server
|
|
19
|
+
|
|
20
|
+
# Generate and immediately start the server
|
|
21
|
+
npx swagger-mcp-generator https://api.example.com/swagger.json --start-stdio
|
|
22
|
+
|
|
23
|
+
# Generate with custom output directory and start the server
|
|
24
|
+
npx swagger-mcp-generator https://api.example.com/swagger.json ./my-mcp-server --start-stdio
|
|
25
|
+
|
|
26
|
+
# Generate with authentication headers
|
|
27
|
+
HEADER_AUTHORIZATION="Bearer abc123" npx swagger-mcp-generator https://api.example.com/swagger.json
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Options
|
|
31
|
+
|
|
32
|
+
- `--start-stdio` - Automatically build and start the generated MCP server after generation
|
|
33
|
+
- This will run `npm install`, `npm run build`, and then start the server
|
|
34
|
+
|
|
35
|
+
## Environment Variables
|
|
36
|
+
|
|
37
|
+
Set custom headers for API access:
|
|
38
|
+
|
|
39
|
+
- `HEADER_AUTHORIZATION` - Sets the Authorization header
|
|
40
|
+
- `HEADER_<NAME>` - Sets any custom header (e.g., `HEADER_X_API_KEY`)
|
|
41
|
+
|
|
42
|
+
## Generated Files
|
|
43
|
+
|
|
44
|
+
The tool creates:
|
|
45
|
+
|
|
46
|
+
1. **package.json** - Project configuration with dependencies
|
|
47
|
+
2. **tsconfig.json** - TypeScript configuration
|
|
48
|
+
3. **src/client.ts** - HTTP client functions for each API endpoint
|
|
49
|
+
4. **src/mcp-server.ts** - Complete MCP server implementation
|
|
50
|
+
5. **mcp-server.ts** - Root-level MCP server for direct use
|
|
51
|
+
|
|
52
|
+
## Using the Generated MCP Server
|
|
53
|
+
|
|
54
|
+
After generation:
|
|
55
|
+
|
|
56
|
+
1. Install dependencies: `npm install`
|
|
57
|
+
2. Build the project: `npm run build`
|
|
58
|
+
3. Add to your MCP client configuration:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"servers": {
|
|
63
|
+
"my-api": {
|
|
64
|
+
"command": "node",
|
|
65
|
+
"args": ["./path/to/generated/dist/mcp-server.js", "https://api.example.com/swagger.json"],
|
|
66
|
+
"env": {
|
|
67
|
+
"HEADER_AUTHORIZATION": "Bearer your-token-here"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Features
|
|
75
|
+
|
|
76
|
+
- ✅ Generates MCP tools for all Swagger endpoints
|
|
77
|
+
- ✅ Supports authentication headers via environment variables
|
|
78
|
+
- ✅ Proper TypeScript types and validation
|
|
79
|
+
- ✅ Error handling and logging
|
|
80
|
+
- ✅ Compatible with MCP SDK v1.13.3
|
|
81
|
+
- ✅ Handles query parameters, path parameters, and request bodies
|
|
82
|
+
- ✅ Supports complex object types and arrays
|
|
83
|
+
|
|
84
|
+
## Requirements
|
|
85
|
+
|
|
86
|
+
- Node.js 18+
|
|
87
|
+
- Internet access to fetch Swagger specifications
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Tool, SwaggerSpec } from './types';
|
|
2
|
+
export declare class SwaggerMcpGenerator {
|
|
3
|
+
private swaggerSpec;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
private headers;
|
|
6
|
+
constructor(swaggerUrl: string);
|
|
7
|
+
private setupHeaders;
|
|
8
|
+
loadSwaggerSpec(): Promise<SwaggerSpec>;
|
|
9
|
+
private convertSwaggerTypeToToolProp;
|
|
10
|
+
private resolveSchemaRef;
|
|
11
|
+
generateTools(): Tool[];
|
|
12
|
+
generateClientFunctions(): string;
|
|
13
|
+
generateMcpServer(): string;
|
|
14
|
+
saveGeneratedFiles(outputDir?: string): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +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;IACxB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,UAAU,EAAE,MAAM;IAK9B,OAAO,CAAC,YAAY;IAed,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC;IAmB7C,OAAO,CAAC,4BAA4B;IAqCpC,OAAO,CAAC,gBAAgB;IAgBxB,aAAa,IAAI,IAAI,EAAE;IAkGvB,uBAAuB,IAAI,MAAM;IA+EjC,iBAAiB,IAAI,MAAM;IAqFrB,kBAAkB,CAAC,SAAS,GAAE,MAAsB;CAiE3D"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SwaggerMcpGenerator = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
class SwaggerMcpGenerator {
|
|
11
|
+
constructor(swaggerUrl) {
|
|
12
|
+
this.headers = {};
|
|
13
|
+
this.baseUrl = swaggerUrl;
|
|
14
|
+
this.setupHeaders();
|
|
15
|
+
}
|
|
16
|
+
setupHeaders() {
|
|
17
|
+
// Parse environment variables for headers starting with HEADER_
|
|
18
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
19
|
+
if (key.startsWith('HEADER_')) {
|
|
20
|
+
const headerName = key.substring(7); // Remove 'HEADER_' prefix
|
|
21
|
+
this.headers[headerName] = value || '';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Special handling for HEADER_AUTHORIZATION
|
|
25
|
+
if (process.env.HEADER_AUTHORIZATION) {
|
|
26
|
+
this.headers['Authorization'] = process.env.HEADER_AUTHORIZATION;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async loadSwaggerSpec() {
|
|
30
|
+
try {
|
|
31
|
+
console.log(`Loading Swagger spec from: ${this.baseUrl}`);
|
|
32
|
+
const response = await axios_1.default.get(this.baseUrl, {
|
|
33
|
+
headers: {
|
|
34
|
+
'Accept': 'application/json',
|
|
35
|
+
...this.headers
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
this.swaggerSpec = response.data;
|
|
39
|
+
console.log(`Loaded Swagger spec: ${this.swaggerSpec.info.title} v${this.swaggerSpec.info.version}`);
|
|
40
|
+
return this.swaggerSpec;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('Failed to load Swagger spec:', error.message);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
convertSwaggerTypeToToolProp(swaggerType) {
|
|
48
|
+
if (!swaggerType) {
|
|
49
|
+
return { type: 'string' };
|
|
50
|
+
}
|
|
51
|
+
const toolProp = {
|
|
52
|
+
type: swaggerType.type || 'string',
|
|
53
|
+
description: swaggerType.description
|
|
54
|
+
};
|
|
55
|
+
if (swaggerType.enum) {
|
|
56
|
+
toolProp.enum = swaggerType.enum;
|
|
57
|
+
}
|
|
58
|
+
if (swaggerType.type === 'array' && swaggerType.items) {
|
|
59
|
+
toolProp.items = {
|
|
60
|
+
type: swaggerType.items.type || 'string'
|
|
61
|
+
};
|
|
62
|
+
if (swaggerType.items.properties) {
|
|
63
|
+
toolProp.items.properties = {};
|
|
64
|
+
for (const [key, value] of Object.entries(swaggerType.items.properties)) {
|
|
65
|
+
toolProp.items.properties[key] = this.convertSwaggerTypeToToolProp(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (swaggerType.type === 'object' && swaggerType.properties) {
|
|
70
|
+
toolProp.properties = {};
|
|
71
|
+
for (const [key, value] of Object.entries(swaggerType.properties)) {
|
|
72
|
+
toolProp.properties[key] = this.convertSwaggerTypeToToolProp(value);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return toolProp;
|
|
76
|
+
}
|
|
77
|
+
resolveSchemaRef(ref) {
|
|
78
|
+
// Handle OpenAPI 3.0 format
|
|
79
|
+
if (ref.startsWith('#/components/schemas/')) {
|
|
80
|
+
const schemaName = ref.replace('#/components/schemas/', '');
|
|
81
|
+
return this.swaggerSpec.components?.schemas?.[schemaName] || { type: 'string' };
|
|
82
|
+
}
|
|
83
|
+
// Handle Swagger 2.0 format
|
|
84
|
+
if (ref.startsWith('#/definitions/')) {
|
|
85
|
+
const schemaName = ref.replace('#/definitions/', '');
|
|
86
|
+
return this.swaggerSpec.definitions?.[schemaName] || { type: 'string' };
|
|
87
|
+
}
|
|
88
|
+
return { type: 'string' };
|
|
89
|
+
}
|
|
90
|
+
generateTools() {
|
|
91
|
+
const tools = [];
|
|
92
|
+
for (const [path, pathItem] of Object.entries(this.swaggerSpec.paths)) {
|
|
93
|
+
for (const [method, operation] of Object.entries(pathItem)) {
|
|
94
|
+
if (typeof operation !== 'object' || !operation)
|
|
95
|
+
continue;
|
|
96
|
+
const operationId = operation.operationId || `${method}_${path.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
97
|
+
const summary = operation.summary || `${method.toUpperCase()} ${path}`;
|
|
98
|
+
const description = operation.description || summary;
|
|
99
|
+
const properties = {};
|
|
100
|
+
const required = [];
|
|
101
|
+
// Add path parameters
|
|
102
|
+
const pathParams = path.match(/{([^}]+)}/g);
|
|
103
|
+
if (pathParams) {
|
|
104
|
+
for (const param of pathParams) {
|
|
105
|
+
const paramName = param.slice(1, -1); // Remove { and }
|
|
106
|
+
properties[paramName] = {
|
|
107
|
+
type: 'string',
|
|
108
|
+
description: `Path parameter: ${paramName}`
|
|
109
|
+
};
|
|
110
|
+
required.push(paramName);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Add query parameters
|
|
114
|
+
if (operation.parameters) {
|
|
115
|
+
for (const param of operation.parameters) {
|
|
116
|
+
if (param.in === 'query') {
|
|
117
|
+
// Handle OpenAPI 3.0 format (has schema property)
|
|
118
|
+
let schema = param.schema || param;
|
|
119
|
+
if (schema && schema.$ref) {
|
|
120
|
+
schema = this.resolveSchemaRef(schema.$ref);
|
|
121
|
+
}
|
|
122
|
+
else if (!schema || !schema.type) {
|
|
123
|
+
// Swagger 2.0 format (properties directly on param)
|
|
124
|
+
schema = {
|
|
125
|
+
type: param.type || 'string',
|
|
126
|
+
description: param.description
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
properties[param.name] = this.convertSwaggerTypeToToolProp(schema);
|
|
130
|
+
if (!properties[param.name].description) {
|
|
131
|
+
properties[param.name].description = param.description || `Query parameter: ${param.name}`;
|
|
132
|
+
}
|
|
133
|
+
if (param.required) {
|
|
134
|
+
required.push(param.name);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Add request body properties
|
|
140
|
+
if (operation.requestBody) {
|
|
141
|
+
const content = operation.requestBody.content;
|
|
142
|
+
const jsonContent = content['application/json'];
|
|
143
|
+
if (jsonContent && jsonContent.schema) {
|
|
144
|
+
let schema = jsonContent.schema;
|
|
145
|
+
if (schema.$ref) {
|
|
146
|
+
schema = this.resolveSchemaRef(schema.$ref);
|
|
147
|
+
}
|
|
148
|
+
if (schema.properties) {
|
|
149
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
150
|
+
properties[key] = this.convertSwaggerTypeToToolProp(value);
|
|
151
|
+
}
|
|
152
|
+
if (schema.required) {
|
|
153
|
+
required.push(...schema.required);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const tool = {
|
|
159
|
+
type: 'function',
|
|
160
|
+
function: {
|
|
161
|
+
name: operationId,
|
|
162
|
+
description: description,
|
|
163
|
+
parameters: {
|
|
164
|
+
type: 'object',
|
|
165
|
+
properties,
|
|
166
|
+
required
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
tools.push(tool);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return tools;
|
|
174
|
+
}
|
|
175
|
+
generateClientFunctions() {
|
|
176
|
+
let clientCode = `
|
|
177
|
+
import axios, { AxiosInstance } from 'axios';
|
|
178
|
+
|
|
179
|
+
export class SwaggerClient {
|
|
180
|
+
private api: AxiosInstance;
|
|
181
|
+
private baseUrl: string;
|
|
182
|
+
|
|
183
|
+
constructor(baseUrl: string, headers: Record<string, string> = {}) {
|
|
184
|
+
this.baseUrl = baseUrl;
|
|
185
|
+
this.api = axios.create({
|
|
186
|
+
baseURL: baseUrl,
|
|
187
|
+
headers: {
|
|
188
|
+
'Content-Type': 'application/json',
|
|
189
|
+
...headers
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private replacePathParams(path: string, params: Record<string, any>): string {
|
|
195
|
+
let result = path;
|
|
196
|
+
const pathParams = path.match(/{([^}]+)}/g);
|
|
197
|
+
|
|
198
|
+
if (pathParams) {
|
|
199
|
+
for (const param of pathParams) {
|
|
200
|
+
const paramName = param.slice(1, -1);
|
|
201
|
+
if (params[paramName] !== undefined) {
|
|
202
|
+
result = result.replace(param, params[paramName]);
|
|
203
|
+
delete params[paramName];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return result;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
`;
|
|
212
|
+
for (const [path, pathItem] of Object.entries(this.swaggerSpec.paths)) {
|
|
213
|
+
for (const [method, operation] of Object.entries(pathItem)) {
|
|
214
|
+
if (typeof operation !== 'object' || !operation)
|
|
215
|
+
continue;
|
|
216
|
+
const operationId = operation.operationId || `${method}_${path.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
217
|
+
const hasRequestBody = operation.requestBody !== undefined;
|
|
218
|
+
clientCode += `
|
|
219
|
+
async ${operationId}(params: Record<string, any> = {}): Promise<any> {
|
|
220
|
+
const path = this.replacePathParams('${path}', { ...params });
|
|
221
|
+
const queryParams = { ...params };
|
|
222
|
+
|
|
223
|
+
// Remove path parameters from query params
|
|
224
|
+
const pathParamNames = '${path}'.match(/{([^}]+)}/g);
|
|
225
|
+
if (pathParamNames) {
|
|
226
|
+
for (const param of pathParamNames) {
|
|
227
|
+
const paramName = param.slice(1, -1);
|
|
228
|
+
delete queryParams[paramName];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
${hasRequestBody ? `
|
|
233
|
+
const requestBody = { ...queryParams };
|
|
234
|
+
const response = await this.api.${method}(path, requestBody);
|
|
235
|
+
` : `
|
|
236
|
+
const response = await this.api.${method}(path, { params: queryParams });
|
|
237
|
+
`}
|
|
238
|
+
|
|
239
|
+
return response.data;
|
|
240
|
+
}
|
|
241
|
+
`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
clientCode += `
|
|
245
|
+
}
|
|
246
|
+
`;
|
|
247
|
+
return clientCode;
|
|
248
|
+
}
|
|
249
|
+
generateMcpServer() {
|
|
250
|
+
const tools = this.generateTools();
|
|
251
|
+
return `#!/usr/bin/env node
|
|
252
|
+
|
|
253
|
+
import { SwaggerClient } from './client';
|
|
254
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
255
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
256
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
257
|
+
|
|
258
|
+
const server = new Server({
|
|
259
|
+
name: '${this.swaggerSpec.info.title.toLowerCase().replace(/[^a-z0-9]/g, '-')}-mcp',
|
|
260
|
+
version: '${this.swaggerSpec.info.version}'
|
|
261
|
+
}, {
|
|
262
|
+
capabilities: {
|
|
263
|
+
tools: {}
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// Setup headers from environment variables
|
|
268
|
+
const headers: Record<string, string> = {};
|
|
269
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
270
|
+
if (key.startsWith('HEADER_') && value) {
|
|
271
|
+
const headerName = key.substring(7);
|
|
272
|
+
headers[headerName] = value;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const swaggerUrl = process.argv[2];
|
|
277
|
+
if (!swaggerUrl) {
|
|
278
|
+
console.error('Usage: node mcp-server.js <swagger-url>');
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const baseUrl = swaggerUrl.replace(/\\/swagger\\.json$/, '').replace(/\\/docs$/, '');
|
|
283
|
+
const client = new SwaggerClient(baseUrl, headers);
|
|
284
|
+
|
|
285
|
+
// Helper function to format responses consistently
|
|
286
|
+
const formatResponse = async (methodName: string, args: any) => {
|
|
287
|
+
try {
|
|
288
|
+
const result = await (client as any)[methodName](args || {});
|
|
289
|
+
return {
|
|
290
|
+
content: [{
|
|
291
|
+
type: 'text',
|
|
292
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2)
|
|
293
|
+
}]
|
|
294
|
+
};
|
|
295
|
+
} catch (error: any) {
|
|
296
|
+
return {
|
|
297
|
+
content: [{
|
|
298
|
+
type: 'text',
|
|
299
|
+
text: \`Error calling \${methodName}: \${error.message}\`
|
|
300
|
+
}]
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// Handle tool calls
|
|
306
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
307
|
+
const { name, arguments: args } = request.params as any;
|
|
308
|
+
|
|
309
|
+
switch (name) {
|
|
310
|
+
${tools.map(tool => ` case '${tool.function.name}':
|
|
311
|
+
return formatResponse('${tool.function.name}', args);`).join('\n')}
|
|
312
|
+
default:
|
|
313
|
+
throw new Error(\`Unknown tool: \${name}\`);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
318
|
+
return {
|
|
319
|
+
tools: ${JSON.stringify(tools, null, 2)}
|
|
320
|
+
};
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
async function main() {
|
|
324
|
+
const transport = new StdioServerTransport();
|
|
325
|
+
await server.connect(transport);
|
|
326
|
+
console.error('${this.swaggerSpec.info.title.replace(/'/g, "\\'")} MCP Server running on stdio');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
main().catch(console.error);
|
|
330
|
+
`;
|
|
331
|
+
}
|
|
332
|
+
async saveGeneratedFiles(outputDir = './generated') {
|
|
333
|
+
// Create output directory if it doesn't exist
|
|
334
|
+
if (!(0, fs_1.existsSync)(outputDir)) {
|
|
335
|
+
(0, fs_1.mkdirSync)(outputDir, { recursive: true });
|
|
336
|
+
}
|
|
337
|
+
// Create src directory
|
|
338
|
+
const srcDir = (0, path_1.join)(outputDir, 'src');
|
|
339
|
+
if (!(0, fs_1.existsSync)(srcDir)) {
|
|
340
|
+
(0, fs_1.mkdirSync)(srcDir, { recursive: true });
|
|
341
|
+
}
|
|
342
|
+
const tools = this.generateTools();
|
|
343
|
+
const clientCode = this.generateClientFunctions();
|
|
344
|
+
const mcpServer = this.generateMcpServer();
|
|
345
|
+
// Generate package.json for the output
|
|
346
|
+
const packageJson = {
|
|
347
|
+
name: `${this.swaggerSpec.info.title.toLowerCase().replace(/[^a-z0-9]/g, '-')}-mcp`,
|
|
348
|
+
version: '1.0.0',
|
|
349
|
+
main: 'dist/mcp-server.js',
|
|
350
|
+
scripts: {
|
|
351
|
+
start: 'node dist/mcp-server.js',
|
|
352
|
+
build: 'tsc'
|
|
353
|
+
},
|
|
354
|
+
dependencies: {
|
|
355
|
+
'@modelcontextprotocol/sdk': '^1.13.3',
|
|
356
|
+
'axios': '^1.5.0'
|
|
357
|
+
},
|
|
358
|
+
devDependencies: {
|
|
359
|
+
'@types/node': '^20.6.3',
|
|
360
|
+
'typescript': '^4.6.3'
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
// Generate TypeScript config
|
|
364
|
+
const tsConfig = {
|
|
365
|
+
compilerOptions: {
|
|
366
|
+
target: 'es2020',
|
|
367
|
+
module: 'commonjs',
|
|
368
|
+
lib: ['es2020'],
|
|
369
|
+
outDir: './dist',
|
|
370
|
+
rootDir: './src',
|
|
371
|
+
strict: true,
|
|
372
|
+
esModuleInterop: true,
|
|
373
|
+
skipLibCheck: true,
|
|
374
|
+
forceConsistentCasingInFileNames: true
|
|
375
|
+
},
|
|
376
|
+
include: ['src/**/*'],
|
|
377
|
+
exclude: ['node_modules', 'dist']
|
|
378
|
+
};
|
|
379
|
+
// Save all files
|
|
380
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(outputDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
381
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(outputDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));
|
|
382
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, 'client.ts'), clientCode);
|
|
383
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(srcDir, 'mcp-server.ts'), mcpServer);
|
|
384
|
+
console.log(`Generated files saved to ${outputDir}/`);
|
|
385
|
+
console.log(`- package.json: Project configuration`);
|
|
386
|
+
console.log(`- tsconfig.json: TypeScript configuration`);
|
|
387
|
+
console.log(`- src/client.ts: HTTP client functions`);
|
|
388
|
+
console.log(`- src/mcp-server.ts: Complete MCP server implementation`);
|
|
389
|
+
console.log(`- mcp-server.ts: Complete MCP server implementation`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
exports.SwaggerMcpGenerator = SwaggerMcpGenerator;
|
|
393
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,2BAA0D;AAC1D,+BAA4B;AAG5B,MAAa,mBAAmB;IAK9B,YAAY,UAAkB;QAFtB,YAAO,GAA2B,EAAE,CAAC;QAG3C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,YAAY;QAClB,gEAAgE;QAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;gBAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;gBAC/D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;aACxC;SACF;QAED,4CAA4C;QAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;SAClE;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI;YACF,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;gBAC7C,OAAO,EAAE;oBACP,QAAQ,EAAE,kBAAkB;oBAC5B,GAAG,IAAI,CAAC,OAAO;iBAChB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACrG,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YACxE,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IAEO,4BAA4B,CAAC,WAAgB;QACnD,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SAC3B;QAED,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,QAAQ;YAClC,WAAW,EAAE,WAAW,CAAC,WAAW;SACrC,CAAC;QAEF,IAAI,WAAW,CAAC,IAAI,EAAE;YACpB,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;SAClC;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE;YACrD,QAAQ,CAAC,KAAK,GAAG;gBACf,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ;aACzC,CAAC;YAEF,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE;gBAChC,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;oBACvE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;iBAC3E;aACF;SACF;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,EAAE;YAC3D,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;gBACjE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;aACrE;SACF;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,gBAAgB,CAAC,GAAW;QAClC,4BAA4B;QAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE;YAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SACjF;QAED,4BAA4B;QAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;YACpC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACrD,OAAQ,IAAI,CAAC,WAAmB,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SAClF;QAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,MAAM,KAAK,GAAW,EAAE,CAAC;QAEzB,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,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/F,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;gBACvE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,OAAO,CAAC;gBAErD,MAAM,UAAU,GAAgC,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;gBAE9B,sBAAsB;gBACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC5C,IAAI,UAAU,EAAE;oBACd,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;wBAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;wBACvD,UAAU,CAAC,SAAS,CAAC,GAAG;4BACtB,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mBAAmB,SAAS,EAAE;yBAC5C,CAAC;wBACF,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;qBAC1B;iBACF;gBAED,uBAAuB;gBACvB,IAAI,SAAS,CAAC,UAAU,EAAE;oBACxB,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,EAAE;wBACxC,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE;4BACxB,kDAAkD;4BAClD,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;4BACnC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;gCACzB,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;6BAC7C;iCAAM,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gCAClC,oDAAoD;gCACpD,MAAM,GAAG;oCACP,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;oCAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;iCAC/B,CAAC;6BACH;4BAED,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;4BACnE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;gCACvC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,oBAAoB,KAAK,CAAC,IAAI,EAAE,CAAC;6BAC5F;4BAED,IAAI,KAAK,CAAC,QAAQ,EAAE;gCAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;6BAC3B;yBACF;qBACF;iBACF;gBAED,8BAA8B;gBAC9B,IAAI,SAAS,CAAC,WAAW,EAAE;oBACzB,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;oBAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;oBAEhD,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE;wBACrC,IAAI,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;wBAChC,IAAI,MAAM,CAAC,IAAI,EAAE;4BACf,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;yBAC7C;wBAED,IAAI,MAAM,CAAC,UAAU,EAAE;4BACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;gCAC5D,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;6BAC5D;4BAED,IAAI,MAAM,CAAC,QAAQ,EAAE;gCACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;6BACnC;yBACF;qBACF;iBACF;gBAED,MAAM,IAAI,GAAS;oBACjB,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR,IAAI,EAAE,WAAW;wBACjB,WAAW,EAAE,WAAW;wBACxB,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,UAAU;4BACV,QAAQ;yBACT;qBACF;iBACF,CAAC;gBAEF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClB;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uBAAuB;QACrB,IAAI,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCpB,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,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/F,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC;gBAE3D,UAAU,IAAI;UACZ,WAAW;2CACsB,IAAI;;;;8BAIjB,IAAI;;;;;;;;MAQ5B,cAAc,CAAC,CAAC,CAAC;;sCAEe,MAAM;KACvC,CAAC,CAAC,CAAC;sCAC8B,MAAM;KACvC;;;;CAIJ,CAAC;aACK;SACF;QAED,UAAU,IAAI;;CAEjB,CAAC;QAEE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,iBAAiB;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAEnC,OAAO;;;;;;;;WAQA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;cACjE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDzC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,IAAI;+BACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;aAQ3D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;mBAOxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;CAIlE,CAAC;IACA,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,YAAoB,aAAa;QACxD,8CAA8C;QAC9C,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE;YAC1B,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;SAC3C;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC,EAAE;YACvB,IAAA,cAAS,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;SACxC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE3C,uCAAuC;QACvC,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM;YACnF,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE;gBACP,KAAK,EAAE,yBAAyB;gBAChC,KAAK,EAAE,KAAK;aACb;YACD,YAAY,EAAE;gBACZ,2BAA2B,EAAE,SAAS;gBACtC,OAAO,EAAE,QAAQ;aAClB;YACD,eAAe,EAAE;gBACf,aAAa,EAAE,SAAS;gBACxB,YAAY,EAAE,QAAQ;aACvB;SACF,CAAC;QAEF,6BAA6B;QAC7B,MAAM,QAAQ,GAAG;YACf,eAAe,EAAE;gBACf,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,UAAU;gBAClB,GAAG,EAAE,CAAC,QAAQ,CAAC;gBACf,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,IAAI;gBACZ,eAAe,EAAE,IAAI;gBACrB,YAAY,EAAE,IAAI;gBAClB,gCAAgC,EAAE,IAAI;aACvC;YACD,OAAO,EAAE,CAAC,UAAU,CAAC;YACrB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;SAClC,CAAC;QAEF,iBAAiB;QACjB,IAAA,kBAAa,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrF,IAAA,kBAAa,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnF,IAAA,kBAAa,EAAC,IAAA,WAAI,EAAC,MAAM,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;QACrD,IAAA,kBAAa,EAAC,IAAA,WAAI,EAAC,MAAM,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;QAExD,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;CACF;AAxaD,kDAwaC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const generator_1 = require("./generator");
|
|
8
|
+
function parseArgs(args) {
|
|
9
|
+
const parsed = {
|
|
10
|
+
swaggerUrl: '',
|
|
11
|
+
outputDir: './generated',
|
|
12
|
+
startStdio: false
|
|
13
|
+
};
|
|
14
|
+
// Filter out the --start-stdio flag first
|
|
15
|
+
const filteredArgs = args.filter(arg => {
|
|
16
|
+
if (arg === '--start-stdio') {
|
|
17
|
+
parsed.startStdio = true;
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
});
|
|
22
|
+
// Now parse the remaining arguments in order
|
|
23
|
+
for (let i = 0; i < filteredArgs.length; i++) {
|
|
24
|
+
if (!parsed.swaggerUrl) {
|
|
25
|
+
parsed.swaggerUrl = filteredArgs[i];
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Second non-flag argument is the output directory
|
|
29
|
+
parsed.outputDir = filteredArgs[i];
|
|
30
|
+
break; // Only take the first two non-flag arguments
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return parsed;
|
|
34
|
+
}
|
|
35
|
+
async function buildAndRunServer(outputDir, swaggerUrl) {
|
|
36
|
+
console.log('\n🏗️ Building generated server...');
|
|
37
|
+
// Resolve the output directory to an absolute path to avoid duplication
|
|
38
|
+
const resolvedOutputDir = (0, path_1.resolve)(outputDir);
|
|
39
|
+
console.log(`Resolved output directory: ${resolvedOutputDir}`);
|
|
40
|
+
// Check if package.json exists
|
|
41
|
+
const packageJsonPath = (0, path_1.join)(resolvedOutputDir, 'package.json');
|
|
42
|
+
if (!(0, fs_1.existsSync)(packageJsonPath)) {
|
|
43
|
+
throw new Error(`Generated package.json not found at ${packageJsonPath}`);
|
|
44
|
+
}
|
|
45
|
+
// Run npm install
|
|
46
|
+
await new Promise((resolve, reject) => {
|
|
47
|
+
console.log('Installing dependencies...');
|
|
48
|
+
const npmInstall = (0, child_process_1.spawn)('npm', ['install'], {
|
|
49
|
+
cwd: resolvedOutputDir,
|
|
50
|
+
stdio: 'inherit'
|
|
51
|
+
});
|
|
52
|
+
npmInstall.on('close', (code) => {
|
|
53
|
+
if (code === 0) {
|
|
54
|
+
console.log('✅ Dependencies installed successfully');
|
|
55
|
+
resolve();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
reject(new Error(`npm install failed with code ${code}`));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
npmInstall.on('error', (error) => {
|
|
62
|
+
reject(new Error(`Failed to start npm install: ${error.message}`));
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// Run npm run build
|
|
66
|
+
await new Promise((resolve, reject) => {
|
|
67
|
+
console.log('Building TypeScript...');
|
|
68
|
+
const npmBuild = (0, child_process_1.spawn)('npm', ['run', 'build'], {
|
|
69
|
+
cwd: resolvedOutputDir,
|
|
70
|
+
stdio: 'inherit'
|
|
71
|
+
});
|
|
72
|
+
npmBuild.on('close', (code) => {
|
|
73
|
+
if (code === 0) {
|
|
74
|
+
console.log('✅ Build completed successfully');
|
|
75
|
+
resolve();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
reject(new Error(`npm run build failed with code ${code}`));
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
npmBuild.on('error', (error) => {
|
|
82
|
+
reject(new Error(`Failed to start npm build: ${error.message}`));
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
// Run the MCP server
|
|
86
|
+
console.log('\n🚀 Starting MCP server...');
|
|
87
|
+
console.log('Press Ctrl+C to stop the server');
|
|
88
|
+
const serverPath = (0, path_1.join)(resolvedOutputDir, 'dist', 'mcp-server.js');
|
|
89
|
+
console.log(`Looking for server at: ${serverPath}`);
|
|
90
|
+
if (!(0, fs_1.existsSync)(serverPath)) {
|
|
91
|
+
throw new Error(`Built server not found at ${serverPath}`);
|
|
92
|
+
}
|
|
93
|
+
const serverProcess = (0, child_process_1.spawn)('node', [serverPath, swaggerUrl], {
|
|
94
|
+
cwd: resolvedOutputDir,
|
|
95
|
+
stdio: 'inherit'
|
|
96
|
+
});
|
|
97
|
+
// Handle process termination
|
|
98
|
+
process.on('SIGINT', () => {
|
|
99
|
+
console.log('\n🛑 Stopping MCP server...');
|
|
100
|
+
serverProcess.kill('SIGINT');
|
|
101
|
+
process.exit(0);
|
|
102
|
+
});
|
|
103
|
+
serverProcess.on('close', (code) => {
|
|
104
|
+
console.log(`MCP server exited with code ${code}`);
|
|
105
|
+
process.exit(code || 0);
|
|
106
|
+
});
|
|
107
|
+
serverProcess.on('error', (error) => {
|
|
108
|
+
console.error('Failed to start MCP server:', error);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
});
|
|
111
|
+
// Keep the process alive
|
|
112
|
+
return new Promise(() => { });
|
|
113
|
+
}
|
|
114
|
+
async function main() {
|
|
115
|
+
const args = process.argv.slice(2);
|
|
116
|
+
if (args.length === 0) {
|
|
117
|
+
console.error('Usage: npx swagger-mcp-generator <swagger-url> [output-dir] [--start-stdio]');
|
|
118
|
+
console.error('');
|
|
119
|
+
console.error('Environment variables:');
|
|
120
|
+
console.error(' HEADER_AUTHORIZATION=Bearer <token> - Set Authorization header');
|
|
121
|
+
console.error(' HEADER_<NAME>=<value> - Set custom header');
|
|
122
|
+
console.error('');
|
|
123
|
+
console.error('Examples:');
|
|
124
|
+
console.error(' npx swagger-mcp-generator https://api.example.com/swagger.json');
|
|
125
|
+
console.error(' npx swagger-mcp-generator https://api.example.com/swagger.json --start-stdio');
|
|
126
|
+
console.error(' npx swagger-mcp-generator https://api.example.com/swagger.json ./my-output --start-stdio');
|
|
127
|
+
console.error(' HEADER_AUTHORIZATION="Bearer abc123" npx swagger-mcp-generator https://api.example.com/swagger.json');
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
const { swaggerUrl, outputDir, startStdio } = parseArgs(args);
|
|
131
|
+
try {
|
|
132
|
+
const generator = new generator_1.SwaggerMcpGenerator(swaggerUrl);
|
|
133
|
+
await generator.loadSwaggerSpec();
|
|
134
|
+
const tools = generator.generateTools();
|
|
135
|
+
console.log(`Generated ${tools.length} tools from Swagger spec`);
|
|
136
|
+
await generator.saveGeneratedFiles(outputDir);
|
|
137
|
+
console.log('');
|
|
138
|
+
if (startStdio) {
|
|
139
|
+
console.log('Generation complete! Starting server...');
|
|
140
|
+
// Build and run the server
|
|
141
|
+
await buildAndRunServer(outputDir, swaggerUrl);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
console.log('Generation complete!');
|
|
145
|
+
// Only show instructions if not starting the server
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log('To use the generated MCP server:');
|
|
148
|
+
console.log(`1. cd ${outputDir}`);
|
|
149
|
+
console.log('2. npm install');
|
|
150
|
+
console.log('3. npm run build');
|
|
151
|
+
console.log('4. Add to your MCP client config:');
|
|
152
|
+
console.log('{');
|
|
153
|
+
console.log(' "servers": {');
|
|
154
|
+
console.log(' "my-api": {');
|
|
155
|
+
console.log(' "command": "node",');
|
|
156
|
+
console.log(` "args": ["${outputDir}/dist/mcp-server.js", "${swaggerUrl}"],`);
|
|
157
|
+
console.log(' "env": {');
|
|
158
|
+
console.log(' "HEADER_AUTHORIZATION": "Bearer your-token-here"');
|
|
159
|
+
console.log(' }');
|
|
160
|
+
console.log(' }');
|
|
161
|
+
console.log(' }');
|
|
162
|
+
console.log('}');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error('Generation failed:', error.message);
|
|
167
|
+
if (error.response) {
|
|
168
|
+
console.error('HTTP Status:', error.response.status);
|
|
169
|
+
console.error('HTTP Headers:', error.response.headers);
|
|
170
|
+
}
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (require.main === module) {
|
|
175
|
+
main();
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface ToolProp {
|
|
2
|
+
type: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
enum?: string[];
|
|
5
|
+
items?: {
|
|
6
|
+
type: string;
|
|
7
|
+
properties?: {
|
|
8
|
+
[key: string]: ToolProp;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
properties?: {
|
|
12
|
+
[key: string]: ToolProp;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface Tool {
|
|
16
|
+
type: 'function';
|
|
17
|
+
function: {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
parameters: {
|
|
21
|
+
type: 'object';
|
|
22
|
+
properties: {
|
|
23
|
+
[key: string]: ToolProp;
|
|
24
|
+
};
|
|
25
|
+
required: string[];
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface SwaggerSpec {
|
|
30
|
+
info: {
|
|
31
|
+
title: string;
|
|
32
|
+
version: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
};
|
|
35
|
+
paths: {
|
|
36
|
+
[path: string]: {
|
|
37
|
+
[method: string]: {
|
|
38
|
+
operationId?: string;
|
|
39
|
+
summary?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
parameters?: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
in: string;
|
|
44
|
+
required?: boolean;
|
|
45
|
+
schema?: any;
|
|
46
|
+
type?: string;
|
|
47
|
+
description?: string;
|
|
48
|
+
}>;
|
|
49
|
+
requestBody?: {
|
|
50
|
+
content: {
|
|
51
|
+
[mediaType: string]: {
|
|
52
|
+
schema: any;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
components?: {
|
|
60
|
+
schemas?: {
|
|
61
|
+
[name: string]: any;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
definitions?: {
|
|
65
|
+
[name: string]: any;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;SAAE,CAAC;KAC1C,CAAC;IACF,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ,CAAC;YACf,UAAU,EAAE;gBAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;aAAE,CAAC;YACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,CAAC,MAAM,EAAE,MAAM,GAAG;gBAChB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,UAAU,CAAC,EAAE,KAAK,CAAC;oBACjB,IAAI,EAAE,MAAM,CAAC;oBACb,EAAE,EAAE,MAAM,CAAC;oBACX,QAAQ,CAAC,EAAE,OAAO,CAAC;oBACnB,MAAM,CAAC,EAAE,GAAG,CAAC;oBACb,IAAI,CAAC,EAAE,MAAM,CAAC;oBACd,WAAW,CAAC,EAAE,MAAM,CAAC;iBACtB,CAAC,CAAC;gBACH,WAAW,CAAC,EAAE;oBACZ,OAAO,EAAE;wBACP,CAAC,SAAS,EAAE,MAAM,GAAG;4BACnB,MAAM,EAAE,GAAG,CAAC;yBACb,CAAC;qBACH,CAAC;iBACH,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE;YACR,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;SACrB,CAAC;KACH,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;KACrB,CAAC;CACH"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tyvm/swagger-mcp",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Generate MCP servers from Swagger/OpenAPI specifications",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"swagger-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"dev": "ts-node src/index.ts",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"swagger",
|
|
18
|
+
"openapi",
|
|
19
|
+
"mcp",
|
|
20
|
+
"model-context-protocol",
|
|
21
|
+
"api",
|
|
22
|
+
"generator"
|
|
23
|
+
],
|
|
24
|
+
"author": "Micah Riggan",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"axios": "^1.5.0",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.13.3",
|
|
29
|
+
"zod": "^3.24.2"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.6.3",
|
|
33
|
+
"typescript": "^4.6.3",
|
|
34
|
+
"ts-node": "^10.7.0",
|
|
35
|
+
"jest": "^29.1.1",
|
|
36
|
+
"@types/jest": "^29.5.13"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist/**/*",
|
|
40
|
+
"README.md",
|
|
41
|
+
"package.json"
|
|
42
|
+
],
|
|
43
|
+
"types": "./dist/index.d.ts"
|
|
44
|
+
}
|