@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 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,7 @@
1
+ import { SwaggerSpec } from "./types";
2
+ export declare class ClientGenerator {
3
+ private swaggerSpec;
4
+ constructor(swaggerSpec: SwaggerSpec);
5
+ generateClientFunctions(): string;
6
+ }
7
+ //# sourceMappingURL=client-generator.d.ts.map
@@ -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,3 @@
1
+ import { SwaggerMcpGenerator } from './generator';
2
+ export declare function generateExpressCompositionTemplate(generator: SwaggerMcpGenerator): string;
3
+ //# sourceMappingURL=express-template-generator.d.ts.map
@@ -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"}
@@ -1,17 +1,23 @@
1
1
  import { Tool, SwaggerSpec } from "./types";
2
2
  export declare class SwaggerMcpGenerator {
3
3
  private swaggerSpec;
4
- private baseUrl;
4
+ private swaggerSource;
5
+ private apiBaseUrl;
5
6
  private headers;
6
- constructor(swaggerUrl: string);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,UAAU,EAAE,MAAM;IAK9B,OAAO,CAAC,YAAY;IAed,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC;IAqB7C,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,4BAA4B;IA0DpC,OAAO,CAAC,gBAAgB;IA+DxB,OAAO,CAAC,oBAAoB;IAsB5B,aAAa,IAAI,IAAI,EAAE;IA0GvB,uBAAuB,IAAI,MAAM;IAqFjC,iBAAiB,IAAI,MAAM;IAwIrB,kBAAkB,CAAC,SAAS,GAAE,MAAsB;CA4E3D"}
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(swaggerUrl) {
13
+ constructor(swaggerSource, apiBaseUrl) {
12
14
  this.headers = {};
13
- this.baseUrl = swaggerUrl;
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.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;
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
- // Extract the base URL from the swagger URL (remove the swagger.json path)
49
- const swaggerUrl = new URL(this.baseUrl);
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 !== 'object') {
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: 'object',
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 !== 'object') {
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: [...new Set(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
- let clientCode = `
276
- import axios, { AxiosInstance } from 'axios';
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
- return result;
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
- ${hasRequestBody
333
- ? `
334
- const requestBody = { ...queryParams };
335
- const response = await this.api.${method}(path, requestBody);
336
- `
337
- : `
338
- const response = await this.api.${method}(path, { params: queryParams });
339
- `}
340
-
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 tools = this.generateTools();
353
- const swaggerUrl = this.baseUrl;
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 { Server } from '@modelcontextprotocol/sdk/server/index.js';
360
- import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
361
-
362
- const server = new Server({
363
- name: '${this.swaggerSpec.info.title
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 client = new SwaggerClient(apiBaseUrl, headers);
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().catch(console.error);
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
- // Also write the root-level mcp-server.ts for convenience
533
- (0, fs_1.writeFileSync)((0, path_1.join)(outputDir, "mcp-server.ts"), mcpServer);
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
  }
@@ -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(swaggerUrl, packageDir) {
9
+ function generateDomainBasedDir(swaggerSource, packageDir) {
9
10
  try {
10
- const url = new URL(swaggerUrl);
11
- // Extract hostname and convert to valid directory name
12
- const hostname = url.hostname;
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, fall back to generic generated directory
19
- console.warn('Failed to parse URL for domain-based directory, using generic "generated" directory');
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 args = process.argv.slice(2);
138
- if (args.length === 0) {
139
- console.error('Usage: npx @tyvm/swagger-mcp <swagger-url> [output-dir] [--start-stdio]');
140
- console.error('');
141
- console.error('Environment variables:');
142
- console.error(' HEADER_AUTHORIZATION=Bearer <token> - Set Authorization header');
143
- console.error(' HEADER_<NAME>=<value> - Set custom header');
144
- console.error('');
145
- console.error('Examples:');
146
- console.error(' npx @tyvm/swagger-mcp https://api.example.com/swagger.json');
147
- console.error(' npx @tyvm/swagger-mcp https://api.example.com/swagger.json --start-stdio');
148
- console.error(' npx @tyvm/swagger-mcp https://api.example.com/swagger.json ./my-output --start-stdio');
149
- console.error(' HEADER_AUTHORIZATION="Bearer abc123" npx @tyvm/swagger-mcp https://api.example.com/swagger.json');
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
- const { swaggerUrl, outputDir, startStdio } = parseArgs(args);
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
- const generator = new generator_1.SwaggerMcpGenerator(swaggerUrl);
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,iDAAsC;AACtC,+BAA8C;AAC9C,2BAAgC;AAChC,2CAAkD;AAElD,SAAS,sBAAsB,CAAC,aAAqB,EAAE,UAAkB;IACvE,IAAI;QACF,4BAA4B;QAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACnC,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACnE,OAAO,IAAA,WAAI,EAAC,UAAU,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;KACvD;IAAC,OAAO,KAAK,EAAE;QACd,wEAAwE;QACxE,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAClF,OAAO,IAAA,WAAI,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;KACtC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IAChD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,wEAAwE;IACxE,MAAM,iBAAiB,GAAG,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,8BAA8B,iBAAiB,EAAE,CAAC,CAAC;IAE/D,+BAA+B;IAC/B,MAAM,eAAe,GAAG,IAAA,WAAI,EAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,CAAC,IAAA,eAAU,EAAC,eAAe,CAAC,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,uCAAuC,eAAe,EAAE,CAAC,CAAC;KAC3E;IAED,kBAAkB;IAClB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;YAC3C,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,IAAI,KAAK,CAAC,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;gBACrD,OAAO,EAAE,CAAC;aACX;iBAAM;gBACL,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC3D;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;YAC9C,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5B,IAAI,IAAI,KAAK,CAAC,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,OAAO,EAAE,CAAC;aACX;iBAAM;gBACL,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC7D;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,iBAAiB,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;KAC5D;IAED,MAAM,aAAa,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;QAChD,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAClC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,oDAAoD;IACpD,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,IAAA,cAAO,EAAC,UAAU,CAAC,CAAC,CAAC;IAEhD,OAAO;SACJ,IAAI,CAAC,mBAAmB,CAAC;SACzB,WAAW,CAAC,0DAA0D,CAAC;SACvE,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,iBAAiB,EAAE,kFAAkF,CAAC;SAC7G,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;SACtE,MAAM,CAAC,oBAAoB,EAAE,2CAA2C,CAAC;SACzE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;SACtE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;sGAU4E,CAAC,CAAC;IAEtG,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,yCAAyC;IACzC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAElD,6BAA6B;IAC7B,IAAI,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,sBAAsB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;KAC7D;IAED,IAAI;QACF,oDAAoD;QACpD,MAAM,SAAS,GAAG,IAAI,+BAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACtE,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC;QAElC,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,MAAM,0BAA0B,CAAC,CAAC;QAEjE,MAAM,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YAEvD,2BAA2B;YAC3B,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;SACpC;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAEpC,oDAAoD;YACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,wBAAwB,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SAClB;KAEF;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAK,KAAa,CAAC,QAAQ,EAAE;YAC3B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAG,KAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,CAAC,KAAK,CAAC,eAAe,EAAG,KAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACjE;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;IAC3B,IAAI,EAAE,CAAC;CACR"}
@@ -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.7",
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.1.1",
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/**/*",