@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 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":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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
+ }