mcp-from-openapi 0.0.1 → 1.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OpenAPIDocument, ValidationResult, ValidationErrorDetail, ValidationWarning } from './types';\nimport { ValidationError } from './errors';\n\n/**\n * Validates OpenAPI documents\n */\nexport class Validator {\n /**\n * Validate an OpenAPI document\n */\n async validate(document: OpenAPIDocument): Promise<ValidationResult> {\n const errors: ValidationErrorDetail[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check OpenAPI version\n if (!document.openapi) {\n errors.push({\n message: 'Missing required field: openapi',\n path: '/openapi',\n code: 'MISSING_OPENAPI_VERSION',\n });\n } else if (!this.isValidOpenAPIVersion(document.openapi)) {\n errors.push({\n message: `Unsupported OpenAPI version: ${document.openapi}. Expected 3.0.x or 3.1.x`,\n path: '/openapi',\n code: 'INVALID_OPENAPI_VERSION',\n });\n }\n\n // Check info\n if (!document.info) {\n errors.push({\n message: 'Missing required field: info',\n path: '/info',\n code: 'MISSING_INFO',\n });\n } else {\n if (!document.info.title) {\n errors.push({\n message: 'Missing required field: info.title',\n path: '/info/title',\n code: 'MISSING_TITLE',\n });\n }\n if (!document.info.version) {\n errors.push({\n message: 'Missing required field: info.version',\n path: '/info/version',\n code: 'MISSING_VERSION',\n });\n }\n }\n\n // Check paths\n if (!document.paths || Object.keys(document.paths).length === 0) {\n warnings.push({\n message: 'No paths defined in OpenAPI document',\n path: '/paths',\n code: 'NO_PATHS',\n });\n } else {\n this.validatePaths(document.paths, errors, warnings);\n }\n\n // Check servers\n if (!document.servers || document.servers.length === 0) {\n warnings.push({\n message: 'No servers defined. You may need to provide a baseUrl option.',\n path: '/servers',\n code: 'NO_SERVERS',\n });\n }\n\n // Check security schemes\n if (document.security && !document.components?.securitySchemes) {\n warnings.push({\n message: 'Security requirements defined but no security schemes found',\n path: '/security',\n code: 'NO_SECURITY_SCHEMES',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n /**\n * Check if OpenAPI version is valid\n */\n private isValidOpenAPIVersion(version: string): boolean {\n return /^3\\.[01]\\.\\d+$/.test(version);\n }\n\n /**\n * Validate paths\n */\n private validatePaths(\n paths: Record<string, any>,\n errors: ValidationErrorDetail[],\n warnings: ValidationWarning[],\n ): void {\n for (const [path, pathItem] of Object.entries(paths)) {\n if (!pathItem) continue;\n\n // Check path format\n if (!path.startsWith('/')) {\n errors.push({\n message: `Path must start with '/': ${path}`,\n path: `/paths/${path}`,\n code: 'INVALID_PATH_FORMAT',\n });\n }\n\n // Validate operations\n const methods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];\n let hasOperations = false;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (operation) {\n hasOperations = true;\n this.validateOperation(operation, path, method, errors, warnings);\n }\n }\n\n if (!hasOperations && !pathItem.$ref) {\n warnings.push({\n message: `Path has no operations: ${path}`,\n path: `/paths/${path}`,\n code: 'NO_OPERATIONS',\n });\n }\n }\n }\n\n /**\n * Validate an operation\n */\n private validateOperation(\n operation: any,\n path: string,\n method: string,\n errors: ValidationErrorDetail[],\n warnings: ValidationWarning[],\n ): void {\n const basePath = `/paths/${path}/${method}`;\n\n // Check for operationId\n if (!operation.operationId) {\n warnings.push({\n message: `Operation missing operationId: ${method.toUpperCase()} ${path}`,\n path: `${basePath}/operationId`,\n code: 'NO_OPERATION_ID',\n });\n }\n\n // Check for responses\n if (!operation.responses || Object.keys(operation.responses).length === 0) {\n errors.push({\n message: `Operation missing responses: ${method.toUpperCase()} ${path}`,\n path: `${basePath}/responses`,\n code: 'NO_RESPONSES',\n });\n }\n\n // Validate parameters\n if (operation.parameters) {\n this.validateParameters(operation.parameters, path, method, errors, warnings);\n }\n\n // Check for path parameters in path string\n const pathParams = path.match(/\\{([^}]+)\\}/g)?.map((p) => p.slice(1, -1)) ?? [];\n const definedPathParams = new Set(\n operation.parameters?.filter((p: any) => p.in === 'path').map((p: any) => p.name) ?? [],\n );\n\n for (const param of pathParams) {\n if (!definedPathParams.has(param)) {\n errors.push({\n message: `Path parameter '${param}' not defined in parameters: ${method.toUpperCase()} ${path}`,\n path: `${basePath}/parameters`,\n code: 'MISSING_PATH_PARAMETER',\n });\n }\n }\n }\n\n /**\n * Validate parameters\n */\n private validateParameters(\n parameters: any[],\n path: string,\n method: string,\n errors: ValidationErrorDetail[],\n warnings: ValidationWarning[],\n ): void {\n const basePath = `/paths/${path}/${method}/parameters`;\n\n for (let i = 0; i < parameters.length; i++) {\n const param = parameters[i];\n const paramPath = `${basePath}/${i}`;\n\n if (!param.name) {\n errors.push({\n message: 'Parameter missing name',\n path: `${paramPath}/name`,\n code: 'MISSING_PARAMETER_NAME',\n });\n }\n\n if (!param.in) {\n errors.push({\n message: 'Parameter missing \"in\" field',\n path: `${paramPath}/in`,\n code: 'MISSING_PARAMETER_IN',\n });\n } else if (!['path', 'query', 'header', 'cookie'].includes(param.in)) {\n errors.push({\n message: `Invalid parameter location: ${param.in}`,\n path: `${paramPath}/in`,\n code: 'INVALID_PARAMETER_IN',\n });\n }\n\n if (param.in === 'path' && !param.required) {\n errors.push({\n message: `Path parameter '${param.name}' must be required`,\n path: `${paramPath}/required`,\n code: 'PATH_PARAMETER_NOT_REQUIRED',\n });\n }\n\n if (!param.schema && !param.content) {\n errors.push({\n message: `Parameter '${param.name}' missing schema or content`,\n path: `${paramPath}`,\n code: 'MISSING_PARAMETER_SCHEMA',\n });\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OpenAPIDocument, ValidationResult, ValidationErrorDetail, ValidationWarning } from './types';\n\n/**\n * Validates OpenAPI documents\n */\nexport class Validator {\n /**\n * Validate an OpenAPI document\n */\n async validate(document: OpenAPIDocument): Promise<ValidationResult> {\n const errors: ValidationErrorDetail[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check OpenAPI version\n if (!document.openapi) {\n errors.push({\n message: 'Missing required field: openapi',\n path: '/openapi',\n code: 'MISSING_OPENAPI_VERSION',\n });\n } else if (!this.isValidOpenAPIVersion(document.openapi)) {\n errors.push({\n message: `Unsupported OpenAPI version: ${document.openapi}. Expected 3.0.x or 3.1.x`,\n path: '/openapi',\n code: 'INVALID_OPENAPI_VERSION',\n });\n }\n\n // Check info\n if (!document.info) {\n errors.push({\n message: 'Missing required field: info',\n path: '/info',\n code: 'MISSING_INFO',\n });\n } else {\n if (!document.info.title) {\n errors.push({\n message: 'Missing required field: info.title',\n path: '/info/title',\n code: 'MISSING_TITLE',\n });\n }\n if (!document.info.version) {\n errors.push({\n message: 'Missing required field: info.version',\n path: '/info/version',\n code: 'MISSING_VERSION',\n });\n }\n }\n\n // Check paths\n if (!document.paths || Object.keys(document.paths).length === 0) {\n warnings.push({\n message: 'No paths defined in OpenAPI document',\n path: '/paths',\n code: 'NO_PATHS',\n });\n } else {\n this.validatePaths(document.paths, errors, warnings);\n }\n\n // Check servers\n if (!document.servers || document.servers.length === 0) {\n warnings.push({\n message: 'No servers defined. You may need to provide a baseUrl option.',\n path: '/servers',\n code: 'NO_SERVERS',\n });\n }\n\n // Check security schemes\n if (document.security && !document.components?.securitySchemes) {\n warnings.push({\n message: 'Security requirements defined but no security schemes found',\n path: '/security',\n code: 'NO_SECURITY_SCHEMES',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n /**\n * Check if OpenAPI version is valid\n */\n private isValidOpenAPIVersion(version: string): boolean {\n return /^3\\.[01]\\.\\d+$/.test(version);\n }\n\n /**\n * Validate paths\n */\n private validatePaths(\n paths: Record<string, any>,\n errors: ValidationErrorDetail[],\n warnings: ValidationWarning[]\n ): void {\n for (const [path, pathItem] of Object.entries(paths)) {\n if (!pathItem) continue;\n\n // Check path format\n if (!path.startsWith('/')) {\n errors.push({\n message: `Path must start with '/': ${path}`,\n path: `/paths/${path}`,\n code: 'INVALID_PATH_FORMAT',\n });\n }\n\n // Validate operations\n const methods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];\n let hasOperations = false;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (operation) {\n hasOperations = true;\n this.validateOperation(operation, path, method, errors, warnings);\n }\n }\n\n if (!hasOperations && !pathItem.$ref) {\n warnings.push({\n message: `Path has no operations: ${path}`,\n path: `/paths/${path}`,\n code: 'NO_OPERATIONS',\n });\n }\n }\n }\n\n /**\n * Validate an operation\n */\n private validateOperation(\n operation: any,\n path: string,\n method: string,\n errors: ValidationErrorDetail[],\n warnings: ValidationWarning[]\n ): void {\n const basePath = `/paths/${path}/${method}`;\n\n // Check for operationId\n if (!operation.operationId) {\n warnings.push({\n message: `Operation missing operationId: ${method.toUpperCase()} ${path}`,\n path: `${basePath}/operationId`,\n code: 'NO_OPERATION_ID',\n });\n }\n\n // Check for responses\n if (!operation.responses || Object.keys(operation.responses).length === 0) {\n errors.push({\n message: `Operation missing responses: ${method.toUpperCase()} ${path}`,\n path: `${basePath}/responses`,\n code: 'NO_RESPONSES',\n });\n }\n\n // Validate parameters\n if (operation.parameters) {\n this.validateParameters(operation.parameters, path, method, errors, warnings);\n }\n\n // Check for path parameters in path string\n const pathParams = path.match(/\\{([^}]+)\\}/g)?.map((p) => p.slice(1, -1)) ?? [];\n const definedPathParams = new Set(\n operation.parameters\n ?.filter((p: any) => p.in === 'path')\n .map((p: any) => p.name) ?? []\n );\n\n for (const param of pathParams) {\n if (!definedPathParams.has(param)) {\n errors.push({\n message: `Path parameter '${param}' not defined in parameters: ${method.toUpperCase()} ${path}`,\n path: `${basePath}/parameters`,\n code: 'MISSING_PATH_PARAMETER',\n });\n }\n }\n }\n\n /**\n * Validate parameters\n */\n private validateParameters(\n parameters: any[],\n path: string,\n method: string,\n errors: ValidationErrorDetail[],\n warnings: ValidationWarning[]\n ): void {\n const basePath = `/paths/${path}/${method}/parameters`;\n\n for (let i = 0; i < parameters.length; i++) {\n const param = parameters[i];\n const paramPath = `${basePath}/${i}`;\n\n if (!param.name) {\n errors.push({\n message: 'Parameter missing name',\n path: `${paramPath}/name`,\n code: 'MISSING_PARAMETER_NAME',\n });\n }\n\n if (!param.in) {\n errors.push({\n message: 'Parameter missing \"in\" field',\n path: `${paramPath}/in`,\n code: 'MISSING_PARAMETER_IN',\n });\n } else if (!['path', 'query', 'header', 'cookie'].includes(param.in)) {\n errors.push({\n message: `Invalid parameter location: ${param.in}`,\n path: `${paramPath}/in`,\n code: 'INVALID_PARAMETER_IN',\n });\n }\n\n if (param.in === 'path' && !param.required) {\n errors.push({\n message: `Path parameter '${param.name}' must be required`,\n path: `${paramPath}/required`,\n code: 'PATH_PARAMETER_NOT_REQUIRED',\n });\n }\n\n if (!param.schema && !param.content) {\n errors.push({\n message: `Parameter '${param.name}' missing schema or content`,\n path: `${paramPath}`,\n code: 'MISSING_PARAMETER_SCHEMA',\n });\n }\n }\n }\n}\n"]}