From f51a6a7d478ace06548f7c31251ee03be7b627b9 Mon Sep 17 00:00:00 2001 From: kamal Date: Tue, 3 Jun 2025 15:01:22 -0400 Subject: [PATCH 1/4] npm install --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b15961..561ae8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "openapi-mcp-generator", - "version": "3.1.0", + "version": "3.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openapi-mcp-generator", - "version": "3.1.0", + "version": "3.1.1", "license": "MIT", "dependencies": { "@apidevtools/swagger-parser": "^10.1.1", @@ -14,7 +14,7 @@ "openapi-types": "^12.1.3" }, "bin": { - "openapi-mcp-generator": "dist/index.js" + "openapi-mcp-generator": "bin/openapi-mcp-generator.js" }, "devDependencies": { "@types/node": "^22.15.2", From bf681ddc24fab8cd6b862ae70b63c6ee4c763a1a Mon Sep 17 00:00:00 2001 From: kamal Date: Tue, 3 Jun 2025 15:01:29 -0400 Subject: [PATCH 2/4] fix tsx --- src/api.ts | 2 +- src/index.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/api.ts b/src/api.ts index c884687..774e9c0 100644 --- a/src/api.ts +++ b/src/api.ts @@ -6,7 +6,7 @@ import SwaggerParser from '@apidevtools/swagger-parser'; import { OpenAPIV3 } from 'openapi-types'; import { extractToolsFromApi } from './parser/extract-tools.js'; -import { McpToolDefinition } from './types/index.js'; +import type { McpToolDefinition } from './types/index.js'; import { determineBaseUrl } from './utils/url.js'; /** diff --git a/src/index.ts b/src/index.ts index 54629d5..71abcb9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,7 +32,8 @@ import { import { CliOptions, TransportType } from './types/index.js'; // Export programmatic API -export { getToolsFromOpenApi, McpToolDefinition, GetToolsOptions } from './api.js'; +export { getToolsFromOpenApi } from './api.js'; +export type { McpToolDefinition, GetToolsOptions } from './api.js'; // Configure CLI const program = new Command(); From 7efaacc5b11625d6441f32e3f01b0bab4c8d9206 Mon Sep 17 00:00:00 2001 From: kamal Date: Tue, 3 Jun 2025 15:04:48 -0400 Subject: [PATCH 3/4] support direct execution w/o the bin stub --- src/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/index.ts b/src/index.ts index 71abcb9..b951b2c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -85,6 +85,11 @@ program // Export the program object for use in bin stub export { program }; +// Run the program if this file is executed directly +if (import.meta.url === `file://${process.argv[1]}`) { + program.parse(); +} + /** * Main function to run the generator */ From 22b1bcceda95bd393324930fbcfe53aeabadf0ff Mon Sep 17 00:00:00 2001 From: kamal Date: Tue, 3 Jun 2025 15:25:04 -0400 Subject: [PATCH 4/4] Consider Path Item-level params --- src/parser/extract-tools.ts | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/parser/extract-tools.ts b/src/parser/extract-tools.ts index 8816095..5521397 100644 --- a/src/parser/extract-tools.ts +++ b/src/parser/extract-tools.ts @@ -22,6 +22,8 @@ export function extractToolsFromApi(api: OpenAPIV3.Document): McpToolDefinition[ for (const [path, pathItem] of Object.entries(api.paths)) { if (!pathItem) continue; + const pathParameters = pathItem.parameters; + for (const method of Object.values(OpenAPIV3.HttpMethods)) { const operation = pathItem[method]; if (!operation) continue; @@ -48,8 +50,10 @@ export function extractToolsFromApi(api: OpenAPIV3.Document): McpToolDefinition[ operation.description || operation.summary || `Executes ${method.toUpperCase()} ${path}`; // Generate input schema and extract parameters - const { inputSchema, parameters, requestBodyContentType } = - generateInputSchemaAndDetails(operation); + const { inputSchema, parameters, requestBodyContentType } = generateInputSchemaAndDetails( + operation, + pathParameters + ); // Extract parameter details for execution const executionParameters = parameters.map((p) => ({ name: p.name, in: p.in })); @@ -83,7 +87,10 @@ export function extractToolsFromApi(api: OpenAPIV3.Document): McpToolDefinition[ * @param operation OpenAPI operation object * @returns Input schema, parameters, and request body content type */ -export function generateInputSchemaAndDetails(operation: OpenAPIV3.OperationObject): { +export function generateInputSchemaAndDetails( + operation: OpenAPIV3.OperationObject, + pathParameters?: (OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject)[] +): { inputSchema: JSONSchema7 | boolean; parameters: OpenAPIV3.ParameterObject[]; requestBodyContentType?: string; @@ -91,10 +98,17 @@ export function generateInputSchemaAndDetails(operation: OpenAPIV3.OperationObje const properties: { [key: string]: JSONSchema7 | boolean } = {}; const required: string[] = []; - // Process parameters - const allParameters: OpenAPIV3.ParameterObject[] = Array.isArray(operation.parameters) - ? operation.parameters.map((p) => p as OpenAPIV3.ParameterObject) - : []; + const allParameters: OpenAPIV3.ParameterObject[] = []; + + // Add Path Item-level params first so that if an Operation-level param with the same name + // exists, the Operation-level param overrides the Path Item-level param. + if (Array.isArray(pathParameters)) { + allParameters.push(...pathParameters.map((p) => p as OpenAPIV3.ParameterObject)); + } + + if (Array.isArray(operation.parameters)) { + allParameters.push(...operation.parameters.map((p) => p as OpenAPIV3.ParameterObject)); + } allParameters.forEach((param) => { if (!param.name || !param.schema) return;