mcp-from-openapi 2.0.0 → 2.1.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [2.1.0] - 2025-12-19
2
+
3
+ ### Added
4
+
5
+ - Introduced logger support within the OpenAPI adapter to improve observability.
6
+ - Expanded security handling with automatic auth type routing and enhanced documentation.
7
+
8
+ ### Changed
9
+
10
+ - Refined security resolver examples and guidance for broader authentication scheme coverage.
11
+
1
12
  ## [2.0.0] - 2025-12-11
2
13
 
3
14
  ### Breaking
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-from-openapi",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Production-ready library for converting OpenAPI specifications into MCP tool definitions",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "license": "Apache-2.0",
package/src/generator.js CHANGED
@@ -46,7 +46,10 @@ class OpenAPIToolGenerator {
46
46
  });
47
47
  clearTimeout(timeout);
48
48
  if (!response.ok) {
49
- throw new errors_1.LoadError(`Failed to fetch OpenAPI spec from URL: ${response.status} ${response.statusText}`, { url, status: response.status });
49
+ throw new errors_1.LoadError(`Failed to fetch OpenAPI spec from URL: ${response.status} ${response.statusText}`, {
50
+ url,
51
+ status: response.status,
52
+ });
50
53
  }
51
54
  const contentType = response.headers.get('content-type') || '';
52
55
  const text = await response.text();
@@ -189,7 +192,8 @@ class OpenAPIToolGenerator {
189
192
  tools.push(tool);
190
193
  }
191
194
  catch (error) {
192
- console.warn(`Failed to generate tool for ${method.toUpperCase()} ${pathStr}:`, error.message);
195
+ const errorMessage = error instanceof Error ? error.message : String(error);
196
+ console.warn(`Failed to generate tool for ${method.toUpperCase()} ${pathStr}:`, errorMessage);
193
197
  }
194
198
  }
195
199
  }
@@ -265,7 +269,7 @@ class OpenAPIToolGenerator {
265
269
  return options.filterFn({
266
270
  ...operation,
267
271
  path,
268
- method
272
+ method,
269
273
  });
270
274
  }
271
275
  return true;
@@ -296,16 +300,19 @@ class OpenAPIToolGenerator {
296
300
  path,
297
301
  method,
298
302
  operationId: operation.operationId,
303
+ operationSummary: operation.summary,
304
+ operationDescription: operation.description,
299
305
  tags: operation.tags,
300
306
  deprecated: operation.deprecated,
301
307
  };
302
308
  // Extract security requirements
303
309
  if (operation.security || document.security) {
304
- metadata.security = this.extractSecurityRequirements(operation.security ?? document.security, document);
310
+ metadata.security = this.extractSecurityRequirements((operation.security ?? document.security), document);
305
311
  }
306
312
  // Extract servers
307
- if (operation.servers || document.servers) {
308
- metadata.servers = (operation.servers ?? document.servers).map((server) => ({
313
+ const servers = operation.servers ?? document.servers;
314
+ if (servers) {
315
+ metadata.servers = servers.map((server) => ({
309
316
  url: this.options.baseUrl || server.url,
310
317
  description: server.description,
311
318
  variables: server.variables,
@@ -315,23 +322,27 @@ class OpenAPIToolGenerator {
315
322
  metadata.servers = [{ url: this.options.baseUrl }];
316
323
  }
317
324
  // Extract response status codes (preserve 0 for default responses)
318
- if (outputSchema && Array.isArray(outputSchema.oneOf)) {
319
- const codes = outputSchema.oneOf
325
+ const schemaObj = outputSchema;
326
+ if (schemaObj && Array.isArray(schemaObj['oneOf'])) {
327
+ const codes = schemaObj['oneOf']
320
328
  .map((schema) => schema['x-status-code'])
321
329
  .filter((code) => code !== undefined && code !== null);
322
330
  if (codes.length > 0) {
323
331
  metadata.responseStatusCodes = codes;
324
332
  }
325
333
  }
326
- else if (outputSchema &&
327
- outputSchema['x-status-code'] !== undefined &&
328
- outputSchema['x-status-code'] !== null) {
329
- metadata.responseStatusCodes = [outputSchema['x-status-code']];
334
+ else if (schemaObj && schemaObj['x-status-code'] !== undefined && schemaObj['x-status-code'] !== null) {
335
+ metadata.responseStatusCodes = [schemaObj['x-status-code']];
330
336
  }
331
337
  // External docs
332
338
  if (operation.externalDocs) {
333
339
  metadata.externalDocs = operation.externalDocs;
334
340
  }
341
+ // FrontMCP extension (x-frontmcp)
342
+ const operationWithExt = operation;
343
+ if (operationWithExt['x-frontmcp']) {
344
+ metadata.frontmcp = operationWithExt['x-frontmcp'];
345
+ }
335
346
  return metadata;
336
347
  }
337
348
  /**
@@ -353,9 +364,7 @@ class OpenAPIToolGenerator {
353
364
  type: securityScheme.type,
354
365
  scopes,
355
366
  name: 'name' in securityScheme ? securityScheme.name : undefined,
356
- in: apiKeyIn && (apiKeyIn === 'query' || apiKeyIn === 'header' || apiKeyIn === 'cookie')
357
- ? apiKeyIn
358
- : undefined,
367
+ in: apiKeyIn && (apiKeyIn === 'query' || apiKeyIn === 'header' || apiKeyIn === 'cookie') ? apiKeyIn : undefined,
359
368
  };
360
369
  // Add HTTP-specific metadata
361
370
  if (securityScheme.type === 'http') {
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as yaml from 'yaml';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport $RefParser from '@apidevtools/json-schema-ref-parser';\nimport type {\n OpenAPIDocument,\n LoadOptions,\n GenerateOptions,\n McpOpenAPITool,\n ValidationResult,\n HTTPMethod,\n ParameterObject,\n SecurityRequirement,\n SecuritySchemeObject,\n AuthType,\n} from './types';\nimport { isReferenceObject } from './types';\nimport { ParameterResolver } from './parameter-resolver';\nimport { ResponseBuilder } from './response-builder';\nimport { Validator } from './validator';\nimport { LoadError, ParseError } from './errors';\n\n/**\n * Main class for generating MCP tools from OpenAPI specifications\n */\nexport class OpenAPIToolGenerator {\n private document: OpenAPIDocument;\n private dereferencedDocument?: OpenAPIDocument;\n private options: Required<LoadOptions>;\n\n /**\n * Private constructor - use static factory methods to create instances\n */\n private constructor(document: OpenAPIDocument, options: LoadOptions = {}) {\n this.document = document;\n this.options = {\n dereference: options.dereference ?? true,\n baseUrl: options.baseUrl ?? '',\n headers: options.headers ?? {},\n timeout: options.timeout ?? 30000,\n validate: options.validate ?? true,\n followRedirects: options.followRedirects ?? true,\n };\n }\n\n /**\n * Create generator from a URL\n */\n static async fromURL(\n url: string,\n options: LoadOptions = {}\n ): Promise<OpenAPIToolGenerator> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeout ?? 30000);\n\n const response = await fetch(url, {\n headers: options.headers,\n signal: controller.signal,\n redirect: options.followRedirects ?? true ? 'follow' : 'manual',\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new LoadError(\n `Failed to fetch OpenAPI spec from URL: ${response.status} ${response.statusText}`,\n { url, status: response.status }\n );\n }\n\n const contentType = response.headers.get('content-type') || '';\n const text = await response.text();\n\n let document: OpenAPIDocument;\n if (contentType.includes('yaml') || contentType.includes('yml') || url.match(/\\.ya?ml$/i)) {\n document = yaml.parse(text);\n } else {\n document = JSON.parse(text);\n }\n\n return new OpenAPIToolGenerator(document, options);\n } catch (error: unknown) {\n if (error instanceof LoadError) {\n throw error;\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new LoadError(`Failed to load OpenAPI spec from URL: ${errorMessage}`, {\n url,\n originalError: error,\n });\n }\n }\n\n /**\n * Create generator from a file path\n */\n static async fromFile(\n filePath: string,\n options: LoadOptions = {}\n ): Promise<OpenAPIToolGenerator> {\n try {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n const content = await fs.readFile(absolutePath, 'utf-8');\n const ext = path.extname(filePath).toLowerCase();\n\n let document: OpenAPIDocument;\n if (ext === '.yaml' || ext === '.yml') {\n document = yaml.parse(content);\n } else if (ext === '.json') {\n document = JSON.parse(content);\n } else {\n // Try to parse as JSON first, then YAML\n try {\n document = JSON.parse(content);\n } catch {\n document = yaml.parse(content);\n }\n }\n\n return new OpenAPIToolGenerator(document, options);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new LoadError(`Failed to load OpenAPI spec from file: ${errorMessage}`, {\n filePath,\n originalError: error,\n });\n }\n }\n\n /**\n * Create generator from a YAML string\n */\n static async fromYAML(\n yamlString: string,\n options: LoadOptions = {}\n ): Promise<OpenAPIToolGenerator> {\n try {\n const document = yaml.parse(yamlString);\n return new OpenAPIToolGenerator(document, options);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ParseError(`Failed to parse YAML: ${errorMessage}`, {\n originalError: error,\n });\n }\n }\n\n /**\n * Create generator from a JSON object\n */\n static async fromJSON(\n json: object,\n options: LoadOptions = {}\n ): Promise<OpenAPIToolGenerator> {\n // Clone to avoid mutations\n const document = JSON.parse(JSON.stringify(json));\n return new OpenAPIToolGenerator(document, options);\n }\n\n /**\n * Get the OpenAPI document\n */\n getDocument(): OpenAPIDocument {\n return this.dereferencedDocument ?? this.document;\n }\n\n /**\n * Validate the OpenAPI document\n */\n async validate(): Promise<ValidationResult> {\n const validator = new Validator();\n return validator.validate(this.document);\n }\n\n /**\n * Initialize the generator (dereference if needed)\n */\n private async initialize(): Promise<void> {\n if (this.options.validate) {\n const result = await this.validate();\n if (!result.valid) {\n throw new ParseError('Invalid OpenAPI document', { errors: result.errors });\n }\n }\n\n if (this.options.dereference && !this.dereferencedDocument) {\n try {\n this.dereferencedDocument = (await $RefParser.dereference(\n JSON.parse(JSON.stringify(this.document))\n )) as OpenAPIDocument;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ParseError(`Failed to dereference OpenAPI document: ${errorMessage}`, {\n originalError: error,\n });\n }\n }\n }\n\n /**\n * Generate all tools from the OpenAPI specification\n */\n async generateTools(options: GenerateOptions = {}): Promise<McpOpenAPITool[]> {\n await this.initialize();\n\n const document = this.getDocument();\n const tools: McpOpenAPITool[] = [];\n\n if (!document.paths) {\n return tools;\n }\n\n for (const [pathStr, pathItem] of Object.entries(document.paths)) {\n if (!pathItem || '$ref' in pathItem) continue;\n\n const methods: HTTPMethod[] = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n // Apply filters\n if (!this.shouldIncludeOperation(operation, pathStr, method, options)) {\n continue;\n }\n\n try {\n const tool = await this.generateTool(pathStr, method, options);\n tools.push(tool);\n } catch (error: any) {\n console.warn(`Failed to generate tool for ${method.toUpperCase()} ${pathStr}:`, error.message);\n }\n }\n }\n\n return tools;\n }\n\n /**\n * Generate a specific tool for a path and method\n */\n async generateTool(\n pathStr: string,\n method: string,\n options: GenerateOptions = {}\n ): Promise<McpOpenAPITool> {\n await this.initialize();\n\n const document = this.getDocument();\n\n if (!document.paths) {\n throw new Error('No paths defined in OpenAPI document');\n }\n\n const pathItem = document.paths[pathStr];\n const operation = pathItem?.[method.toLowerCase() as HTTPMethod];\n\n if (!operation) {\n throw new Error(`Operation not found: ${method.toUpperCase()} ${pathStr}`);\n }\n\n // Resolve parameters\n const parameterResolver = new ParameterResolver(options.namingStrategy);\n\n // Filter out ReferenceObjects from parameters\n let pathParameters: ParameterObject[] | undefined = undefined;\n if (pathItem.parameters) {\n pathParameters = pathItem.parameters.filter(\n (p): p is ParameterObject => !isReferenceObject(p)\n ) as ParameterObject[];\n }\n\n // Extract security requirements\n let securityRequirements: SecurityRequirement[] | undefined = undefined;\n const securitySpec = operation.security ?? document.security;\n if (securitySpec) {\n securityRequirements = this.extractSecurityRequirements(\n securitySpec as Record<string, string[]>[],\n document\n );\n }\n\n const { inputSchema, mapper } = parameterResolver.resolve(\n operation,\n pathParameters,\n securityRequirements,\n options.includeSecurityInInput\n );\n\n // Build response schema\n const responseBuilder = new ResponseBuilder(options);\n const outputSchema = responseBuilder.build(operation.responses);\n\n // Generate tool name\n const name = this.generateToolName(pathStr, method as HTTPMethod, operation.operationId, options);\n\n // Generate description\n const description = operation.summary || operation.description || `${method.toUpperCase()} ${pathStr}`;\n\n // Extract metadata\n const metadata = this.extractMetadata(pathStr, method as HTTPMethod, operation, document, outputSchema);\n\n return {\n name,\n description,\n inputSchema,\n outputSchema,\n mapper,\n metadata,\n };\n }\n\n /**\n * Check if an operation should be included\n */\n private shouldIncludeOperation(\n operation: any,\n path: string,\n method: string,\n options: GenerateOptions\n ): boolean {\n // Check deprecated\n if (operation.deprecated && !options.includeDeprecated) {\n return false;\n }\n\n // Check operation ID filters\n if (options.includeOperations && operation.operationId) {\n if (!options.includeOperations.includes(operation.operationId)) {\n return false;\n }\n }\n\n if (options.excludeOperations && operation.operationId) {\n if (options.excludeOperations.includes(operation.operationId)) {\n return false;\n }\n }\n\n // Custom filter\n if (options.filterFn) {\n return options.filterFn({\n ...operation,\n path,\n method\n } as any);\n }\n\n return true;\n }\n\n /**\n * Generate a tool name\n */\n private generateToolName(\n path: string,\n method: HTTPMethod,\n operationId?: string,\n options: GenerateOptions = {}\n ): string {\n if (options.namingStrategy?.toolNameGenerator) {\n return options.namingStrategy.toolNameGenerator(path, method, operationId);\n }\n\n if (operationId) {\n return operationId;\n }\n\n // Generate from path and method\n const sanitized = path\n .replace(/\\{([^}]+)\\}/g, 'By_$1')\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n\n return `${method}_${sanitized}`;\n }\n\n /**\n * Extract metadata from operation\n */\n private extractMetadata(\n path: string,\n method: HTTPMethod,\n operation: any,\n document: OpenAPIDocument,\n outputSchema?: any\n ): any {\n const metadata: any = {\n path,\n method,\n operationId: operation.operationId,\n tags: operation.tags,\n deprecated: operation.deprecated,\n };\n\n // Extract security requirements\n if (operation.security || document.security) {\n metadata.security = this.extractSecurityRequirements(\n operation.security ?? document.security,\n document\n );\n }\n\n // Extract servers\n if (operation.servers || document.servers) {\n metadata.servers = (operation.servers ?? document.servers).map((server: any) => ({\n url: this.options.baseUrl || server.url,\n description: server.description,\n variables: server.variables,\n }));\n } else if (this.options.baseUrl) {\n metadata.servers = [{ url: this.options.baseUrl }];\n }\n\n // Extract response status codes (preserve 0 for default responses)\n if (outputSchema && Array.isArray((outputSchema as any).oneOf)) {\n const codes = (outputSchema as any).oneOf\n .map((schema: any) => (schema as any)['x-status-code'])\n .filter((code: unknown) => code !== undefined && code !== null);\n if (codes.length > 0) {\n metadata.responseStatusCodes = codes;\n }\n } else if (\n outputSchema &&\n (outputSchema as any)['x-status-code'] !== undefined &&\n (outputSchema as any)['x-status-code'] !== null\n ) {\n metadata.responseStatusCodes = [(outputSchema as any)['x-status-code']];\n }\n\n // External docs\n if (operation.externalDocs) {\n metadata.externalDocs = operation.externalDocs;\n }\n\n return metadata;\n }\n\n /**\n * Extract security requirements\n */\n private extractSecurityRequirements(\n security: Record<string, string[]>[],\n document: OpenAPIDocument\n ): SecurityRequirement[] {\n if (!security || !document.components?.securitySchemes) {\n return [];\n }\n\n return security.flatMap((req) =>\n Object.entries(req).map(([scheme, scopes]): SecurityRequirement => {\n const securityScheme = document.components!.securitySchemes![scheme];\n\n // Skip if it's a reference object\n if (isReferenceObject(securityScheme)) {\n return { scheme, type: 'http', scopes };\n }\n\n const apiKeyIn = 'in' in securityScheme ? securityScheme.in : undefined;\n const result: SecurityRequirement = {\n scheme,\n type: securityScheme.type as AuthType,\n scopes,\n name: 'name' in securityScheme ? securityScheme.name : undefined,\n in: apiKeyIn && (apiKeyIn === 'query' || apiKeyIn === 'header' || apiKeyIn === 'cookie')\n ? apiKeyIn\n : undefined,\n };\n\n // Add HTTP-specific metadata\n if (securityScheme.type === 'http') {\n result.httpScheme = 'scheme' in securityScheme ? securityScheme.scheme : undefined;\n result.bearerFormat = 'bearerFormat' in securityScheme ? securityScheme.bearerFormat : undefined;\n }\n\n // Add description if available\n result.description = 'description' in securityScheme ? securityScheme.description : undefined;\n\n return result;\n })\n );\n }\n}\n"]}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as yaml from 'yaml';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport $RefParser from '@apidevtools/json-schema-ref-parser';\nimport type {\n OpenAPIDocument,\n LoadOptions,\n GenerateOptions,\n McpOpenAPITool,\n ValidationResult,\n HTTPMethod,\n ParameterObject,\n SecurityRequirement,\n AuthType,\n OperationObject,\n OperationWithContext,\n ToolMetadata,\n ServerObject,\n} from './types';\nimport { isReferenceObject } from './types';\nimport { ParameterResolver } from './parameter-resolver';\nimport { ResponseBuilder } from './response-builder';\nimport { Validator } from './validator';\nimport { LoadError, ParseError } from './errors';\n\n/**\n * Main class for generating MCP tools from OpenAPI specifications\n */\nexport class OpenAPIToolGenerator {\n private document: OpenAPIDocument;\n private dereferencedDocument?: OpenAPIDocument;\n private options: Required<LoadOptions>;\n\n /**\n * Private constructor - use static factory methods to create instances\n */\n private constructor(document: OpenAPIDocument, options: LoadOptions = {}) {\n this.document = document;\n this.options = {\n dereference: options.dereference ?? true,\n baseUrl: options.baseUrl ?? '',\n headers: options.headers ?? {},\n timeout: options.timeout ?? 30000,\n validate: options.validate ?? true,\n followRedirects: options.followRedirects ?? true,\n };\n }\n\n /**\n * Create generator from a URL\n */\n static async fromURL(url: string, options: LoadOptions = {}): Promise<OpenAPIToolGenerator> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeout ?? 30000);\n\n const response = await fetch(url, {\n headers: options.headers,\n signal: controller.signal,\n redirect: options.followRedirects ?? true ? 'follow' : 'manual',\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new LoadError(`Failed to fetch OpenAPI spec from URL: ${response.status} ${response.statusText}`, {\n url,\n status: response.status,\n });\n }\n\n const contentType = response.headers.get('content-type') || '';\n const text = await response.text();\n\n let document: OpenAPIDocument;\n if (contentType.includes('yaml') || contentType.includes('yml') || url.match(/\\.ya?ml$/i)) {\n document = yaml.parse(text);\n } else {\n document = JSON.parse(text);\n }\n\n return new OpenAPIToolGenerator(document, options);\n } catch (error: unknown) {\n if (error instanceof LoadError) {\n throw error;\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new LoadError(`Failed to load OpenAPI spec from URL: ${errorMessage}`, {\n url,\n originalError: error,\n });\n }\n }\n\n /**\n * Create generator from a file path\n */\n static async fromFile(filePath: string, options: LoadOptions = {}): Promise<OpenAPIToolGenerator> {\n try {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n const content = await fs.readFile(absolutePath, 'utf-8');\n const ext = path.extname(filePath).toLowerCase();\n\n let document: OpenAPIDocument;\n if (ext === '.yaml' || ext === '.yml') {\n document = yaml.parse(content);\n } else if (ext === '.json') {\n document = JSON.parse(content);\n } else {\n // Try to parse as JSON first, then YAML\n try {\n document = JSON.parse(content);\n } catch {\n document = yaml.parse(content);\n }\n }\n\n return new OpenAPIToolGenerator(document, options);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new LoadError(`Failed to load OpenAPI spec from file: ${errorMessage}`, {\n filePath,\n originalError: error,\n });\n }\n }\n\n /**\n * Create generator from a YAML string\n */\n static async fromYAML(yamlString: string, options: LoadOptions = {}): Promise<OpenAPIToolGenerator> {\n try {\n const document = yaml.parse(yamlString);\n return new OpenAPIToolGenerator(document, options);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ParseError(`Failed to parse YAML: ${errorMessage}`, {\n originalError: error,\n });\n }\n }\n\n /**\n * Create generator from a JSON object\n */\n static async fromJSON(json: object, options: LoadOptions = {}): Promise<OpenAPIToolGenerator> {\n // Clone to avoid mutations\n const document = JSON.parse(JSON.stringify(json));\n return new OpenAPIToolGenerator(document, options);\n }\n\n /**\n * Get the OpenAPI document\n */\n getDocument(): OpenAPIDocument {\n return this.dereferencedDocument ?? this.document;\n }\n\n /**\n * Validate the OpenAPI document\n */\n async validate(): Promise<ValidationResult> {\n const validator = new Validator();\n return validator.validate(this.document);\n }\n\n /**\n * Initialize the generator (dereference if needed)\n */\n private async initialize(): Promise<void> {\n if (this.options.validate) {\n const result = await this.validate();\n if (!result.valid) {\n throw new ParseError('Invalid OpenAPI document', { errors: result.errors });\n }\n }\n\n if (this.options.dereference && !this.dereferencedDocument) {\n try {\n this.dereferencedDocument = (await $RefParser.dereference(\n JSON.parse(JSON.stringify(this.document)),\n )) as OpenAPIDocument;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ParseError(`Failed to dereference OpenAPI document: ${errorMessage}`, {\n originalError: error,\n });\n }\n }\n }\n\n /**\n * Generate all tools from the OpenAPI specification\n */\n async generateTools(options: GenerateOptions = {}): Promise<McpOpenAPITool[]> {\n await this.initialize();\n\n const document = this.getDocument();\n const tools: McpOpenAPITool[] = [];\n\n if (!document.paths) {\n return tools;\n }\n\n for (const [pathStr, pathItem] of Object.entries(document.paths)) {\n if (!pathItem || '$ref' in pathItem) continue;\n\n const methods: HTTPMethod[] = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n // Apply filters\n if (!this.shouldIncludeOperation(operation, pathStr, method, options)) {\n continue;\n }\n\n try {\n const tool = await this.generateTool(pathStr, method, options);\n tools.push(tool);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to generate tool for ${method.toUpperCase()} ${pathStr}:`, errorMessage);\n }\n }\n }\n\n return tools;\n }\n\n /**\n * Generate a specific tool for a path and method\n */\n async generateTool(pathStr: string, method: string, options: GenerateOptions = {}): Promise<McpOpenAPITool> {\n await this.initialize();\n\n const document = this.getDocument();\n\n if (!document.paths) {\n throw new Error('No paths defined in OpenAPI document');\n }\n\n const pathItem = document.paths[pathStr];\n const operation = pathItem?.[method.toLowerCase() as HTTPMethod];\n\n if (!operation) {\n throw new Error(`Operation not found: ${method.toUpperCase()} ${pathStr}`);\n }\n\n // Resolve parameters\n const parameterResolver = new ParameterResolver(options.namingStrategy);\n\n // Filter out ReferenceObjects from parameters\n let pathParameters: ParameterObject[] | undefined = undefined;\n if (pathItem.parameters) {\n pathParameters = pathItem.parameters.filter(\n (p): p is ParameterObject => !isReferenceObject(p),\n ) as ParameterObject[];\n }\n\n // Extract security requirements\n let securityRequirements: SecurityRequirement[] | undefined = undefined;\n const securitySpec = operation.security ?? document.security;\n if (securitySpec) {\n securityRequirements = this.extractSecurityRequirements(securitySpec as Record<string, string[]>[], document);\n }\n\n const { inputSchema, mapper } = parameterResolver.resolve(\n operation,\n pathParameters,\n securityRequirements,\n options.includeSecurityInInput,\n );\n\n // Build response schema\n const responseBuilder = new ResponseBuilder(options);\n const outputSchema = responseBuilder.build(operation.responses);\n\n // Generate tool name\n const name = this.generateToolName(pathStr, method as HTTPMethod, operation.operationId, options);\n\n // Generate description\n const description = operation.summary || operation.description || `${method.toUpperCase()} ${pathStr}`;\n\n // Extract metadata\n const metadata = this.extractMetadata(pathStr, method as HTTPMethod, operation, document, outputSchema);\n\n return {\n name,\n description,\n inputSchema,\n outputSchema,\n mapper,\n metadata,\n };\n }\n\n /**\n * Check if an operation should be included\n */\n private shouldIncludeOperation(\n operation: OperationObject,\n path: string,\n method: string,\n options: GenerateOptions,\n ): boolean {\n // Check deprecated\n if (operation.deprecated && !options.includeDeprecated) {\n return false;\n }\n\n // Check operation ID filters\n if (options.includeOperations && operation.operationId) {\n if (!options.includeOperations.includes(operation.operationId)) {\n return false;\n }\n }\n\n if (options.excludeOperations && operation.operationId) {\n if (options.excludeOperations.includes(operation.operationId)) {\n return false;\n }\n }\n\n // Custom filter\n if (options.filterFn) {\n return options.filterFn({\n ...operation,\n path,\n method,\n } as OperationWithContext);\n }\n\n return true;\n }\n\n /**\n * Generate a tool name\n */\n private generateToolName(\n path: string,\n method: HTTPMethod,\n operationId?: string,\n options: GenerateOptions = {},\n ): string {\n if (options.namingStrategy?.toolNameGenerator) {\n return options.namingStrategy.toolNameGenerator(path, method, operationId);\n }\n\n if (operationId) {\n return operationId;\n }\n\n // Generate from path and method\n const sanitized = path\n .replace(/\\{([^}]+)\\}/g, 'By_$1')\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n\n return `${method}_${sanitized}`;\n }\n\n /**\n * Extract metadata from operation\n */\n private extractMetadata(\n path: string,\n method: HTTPMethod,\n operation: OperationObject,\n document: OpenAPIDocument,\n outputSchema?: unknown,\n ): ToolMetadata {\n const metadata: ToolMetadata = {\n path,\n method,\n operationId: operation.operationId,\n operationSummary: operation.summary,\n operationDescription: operation.description,\n tags: operation.tags,\n deprecated: operation.deprecated,\n };\n\n // Extract security requirements\n if (operation.security || document.security) {\n metadata.security = this.extractSecurityRequirements(\n (operation.security ?? document.security) as Record<string, string[]>[],\n document,\n );\n }\n\n // Extract servers\n const servers = (operation as { servers?: ServerObject[] }).servers ?? document.servers;\n if (servers) {\n metadata.servers = servers.map((server: ServerObject) => ({\n url: this.options.baseUrl || server.url,\n description: server.description,\n variables: server.variables,\n }));\n } else if (this.options.baseUrl) {\n metadata.servers = [{ url: this.options.baseUrl }];\n }\n\n // Extract response status codes (preserve 0 for default responses)\n const schemaObj = outputSchema as Record<string, unknown> | undefined;\n if (schemaObj && Array.isArray(schemaObj['oneOf'])) {\n const codes = (schemaObj['oneOf'] as Record<string, unknown>[])\n .map((schema) => schema['x-status-code'])\n .filter((code): code is number => code !== undefined && code !== null);\n if (codes.length > 0) {\n metadata.responseStatusCodes = codes;\n }\n } else if (schemaObj && schemaObj['x-status-code'] !== undefined && schemaObj['x-status-code'] !== null) {\n metadata.responseStatusCodes = [schemaObj['x-status-code'] as number];\n }\n\n // External docs\n if (operation.externalDocs) {\n metadata.externalDocs = operation.externalDocs;\n }\n\n // FrontMCP extension (x-frontmcp)\n const operationWithExt = operation as Record<string, unknown>;\n if (operationWithExt['x-frontmcp']) {\n metadata.frontmcp = operationWithExt['x-frontmcp'] as ToolMetadata['frontmcp'];\n }\n\n return metadata;\n }\n\n /**\n * Extract security requirements\n */\n private extractSecurityRequirements(\n security: Record<string, string[]>[],\n document: OpenAPIDocument,\n ): SecurityRequirement[] {\n if (!security || !document.components?.securitySchemes) {\n return [];\n }\n\n return security.flatMap((req) =>\n Object.entries(req).map(([scheme, scopes]): SecurityRequirement => {\n const securityScheme = document.components!.securitySchemes![scheme];\n\n // Skip if it's a reference object\n if (isReferenceObject(securityScheme)) {\n return { scheme, type: 'http', scopes };\n }\n\n const apiKeyIn = 'in' in securityScheme ? securityScheme.in : undefined;\n const result: SecurityRequirement = {\n scheme,\n type: securityScheme.type as AuthType,\n scopes,\n name: 'name' in securityScheme ? securityScheme.name : undefined,\n in:\n apiKeyIn && (apiKeyIn === 'query' || apiKeyIn === 'header' || apiKeyIn === 'cookie') ? apiKeyIn : undefined,\n };\n\n // Add HTTP-specific metadata\n if (securityScheme.type === 'http') {\n result.httpScheme = 'scheme' in securityScheme ? securityScheme.scheme : undefined;\n result.bearerFormat = 'bearerFormat' in securityScheme ? securityScheme.bearerFormat : undefined;\n }\n\n // Add description if available\n result.description = 'description' in securityScheme ? securityScheme.description : undefined;\n\n return result;\n }),\n );\n }\n}\n"]}
package/src/index.d.ts CHANGED
@@ -5,6 +5,6 @@ export { ResponseBuilder } from './response-builder';
5
5
  export { Validator } from './validator';
6
6
  export { SecurityResolver, createSecurityContext } from './security-resolver';
7
7
  export { OpenAPIToolError, LoadError, ParseError, ValidationError, GenerationError, SchemaError } from './errors';
8
- export type { McpOpenAPITool, ParameterMapper, ToolMetadata, SerializationInfo, SecurityRequirement, SecurityParameterInfo, ServerInfo, LoadOptions, GenerateOptions, NamingStrategy, OperationWithContext, OpenAPIDocument, OpenAPIVersion, HTTPMethod, ParameterLocation, AuthType, OperationObject, ParameterObject, RequestBodyObject, ResponseObject, ResponsesObject, MediaTypeObject, HeaderObject, ExampleObject, PathItemObject, PathsObject, ServerObject, SecuritySchemeObject, ReferenceObject, TagObject, ExternalDocumentationObject, ServerVariableObject, EncodingObject, SecurityRequirementObject, SchemaObject, ValidationResult, ValidationErrorDetail, ValidationWarning, } from './types';
8
+ export type { McpOpenAPITool, ParameterMapper, ToolMetadata, FrontMcpExtensionData, SerializationInfo, SecurityRequirement, SecurityParameterInfo, ServerInfo, LoadOptions, GenerateOptions, NamingStrategy, OperationWithContext, OpenAPIDocument, OpenAPIVersion, HTTPMethod, ParameterLocation, AuthType, OperationObject, ParameterObject, RequestBodyObject, ResponseObject, ResponsesObject, MediaTypeObject, HeaderObject, ExampleObject, PathItemObject, PathsObject, ServerObject, SecuritySchemeObject, ReferenceObject, TagObject, ExternalDocumentationObject, ServerVariableObject, EncodingObject, SecurityRequirementObject, SchemaObject, ValidationResult, ValidationErrorDetail, ValidationWarning, } from './types';
9
9
  export type { SecurityContext, ResolvedSecurity, DigestAuthCredentials, ClientCertificate, AWSCredentials, SignatureData, } from './security-resolver';
10
10
  export { isReferenceObject, toJsonSchema } from './types';
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,yCAAmD;AAA1C,iHAAA,oBAAoB,OAAA;AAC7B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,yDAA8E;AAArE,qHAAA,gBAAgB,OAAA;AAAE,0HAAA,qBAAqB,OAAA;AAEhD,gBAAgB;AAChB,mCAAkH;AAAzG,0GAAA,gBAAgB,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,qGAAA,WAAW,OAAA;AA+D/F,kBAAkB;AAClB,iCAA0D;AAAjD,0GAAA,iBAAiB,OAAA;AAAE,qGAAA,YAAY,OAAA","sourcesContent":["// Main exports\nexport { OpenAPIToolGenerator } from './generator';\nexport { SchemaBuilder } from './schema-builder';\nexport { ParameterResolver } from './parameter-resolver';\nexport { ResponseBuilder } from './response-builder';\nexport { Validator } from './validator';\nexport { SecurityResolver, createSecurityContext } from './security-resolver';\n\n// Error exports\nexport { OpenAPIToolError, LoadError, ParseError, ValidationError, GenerationError, SchemaError } from './errors';\n\n// Type exports\nexport type {\n // Main MCP types\n McpOpenAPITool,\n ParameterMapper,\n ToolMetadata,\n SerializationInfo,\n SecurityRequirement,\n SecurityParameterInfo,\n ServerInfo,\n\n // Configuration types\n LoadOptions,\n GenerateOptions,\n NamingStrategy,\n OperationWithContext,\n\n // Basic types\n OpenAPIDocument,\n OpenAPIVersion,\n HTTPMethod,\n ParameterLocation,\n AuthType,\n\n // Re-exported OpenAPI types (from openapi-types package)\n OperationObject,\n ParameterObject,\n RequestBodyObject,\n ResponseObject,\n ResponsesObject,\n MediaTypeObject,\n HeaderObject,\n ExampleObject,\n PathItemObject,\n PathsObject,\n ServerObject,\n SecuritySchemeObject,\n ReferenceObject,\n TagObject,\n ExternalDocumentationObject,\n ServerVariableObject,\n EncodingObject,\n SecurityRequirementObject,\n SchemaObject,\n\n // Validation types\n ValidationResult,\n ValidationErrorDetail,\n ValidationWarning,\n} from './types';\n\n// Security resolver types\nexport type {\n SecurityContext,\n ResolvedSecurity,\n DigestAuthCredentials,\n ClientCertificate,\n AWSCredentials,\n SignatureData,\n} from './security-resolver';\n\n// Utility exports\nexport { isReferenceObject, toJsonSchema } from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,yCAAmD;AAA1C,iHAAA,oBAAoB,OAAA;AAC7B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,yDAA8E;AAArE,qHAAA,gBAAgB,OAAA;AAAE,0HAAA,qBAAqB,OAAA;AAEhD,gBAAgB;AAChB,mCAAkH;AAAzG,0GAAA,gBAAgB,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,qGAAA,WAAW,OAAA;AAgE/F,kBAAkB;AAClB,iCAA0D;AAAjD,0GAAA,iBAAiB,OAAA;AAAE,qGAAA,YAAY,OAAA","sourcesContent":["// Main exports\nexport { OpenAPIToolGenerator } from './generator';\nexport { SchemaBuilder } from './schema-builder';\nexport { ParameterResolver } from './parameter-resolver';\nexport { ResponseBuilder } from './response-builder';\nexport { Validator } from './validator';\nexport { SecurityResolver, createSecurityContext } from './security-resolver';\n\n// Error exports\nexport { OpenAPIToolError, LoadError, ParseError, ValidationError, GenerationError, SchemaError } from './errors';\n\n// Type exports\nexport type {\n // Main MCP types\n McpOpenAPITool,\n ParameterMapper,\n ToolMetadata,\n FrontMcpExtensionData,\n SerializationInfo,\n SecurityRequirement,\n SecurityParameterInfo,\n ServerInfo,\n\n // Configuration types\n LoadOptions,\n GenerateOptions,\n NamingStrategy,\n OperationWithContext,\n\n // Basic types\n OpenAPIDocument,\n OpenAPIVersion,\n HTTPMethod,\n ParameterLocation,\n AuthType,\n\n // Re-exported OpenAPI types (from openapi-types package)\n OperationObject,\n ParameterObject,\n RequestBodyObject,\n ResponseObject,\n ResponsesObject,\n MediaTypeObject,\n HeaderObject,\n ExampleObject,\n PathItemObject,\n PathsObject,\n ServerObject,\n SecuritySchemeObject,\n ReferenceObject,\n TagObject,\n ExternalDocumentationObject,\n ServerVariableObject,\n EncodingObject,\n SecurityRequirementObject,\n SchemaObject,\n\n // Validation types\n ValidationResult,\n ValidationErrorDetail,\n ValidationWarning,\n} from './types';\n\n// Security resolver types\nexport type {\n SecurityContext,\n ResolvedSecurity,\n DigestAuthCredentials,\n ClientCertificate,\n AWSCredentials,\n SignatureData,\n} from './security-resolver';\n\n// Utility exports\nexport { isReferenceObject, toJsonSchema } from './types';\n"]}
package/src/types.d.ts CHANGED
@@ -187,6 +187,14 @@ export interface ToolMetadata {
187
187
  * Operation ID from OpenAPI
188
188
  */
189
189
  operationId?: string;
190
+ /**
191
+ * Operation summary from OpenAPI (short description)
192
+ */
193
+ operationSummary?: string;
194
+ /**
195
+ * Operation description from OpenAPI (detailed description)
196
+ */
197
+ operationDescription?: string;
190
198
  /**
191
199
  * Tags from OpenAPI
192
200
  */
@@ -211,6 +219,57 @@ export interface ToolMetadata {
211
219
  * External documentation
212
220
  */
213
221
  externalDocs?: ExternalDocumentationObject;
222
+ /**
223
+ * FrontMCP extension data from x-frontmcp in the OpenAPI operation.
224
+ * Contains annotations, cache config, codecall config, tags, etc.
225
+ */
226
+ frontmcp?: FrontMcpExtensionData;
227
+ }
228
+ /**
229
+ * FrontMCP extension data extracted from x-frontmcp in OpenAPI operations.
230
+ * This provides declarative configuration for tools directly in the OpenAPI spec.
231
+ */
232
+ export interface FrontMcpExtensionData {
233
+ /**
234
+ * Tool annotations for AI behavior hints.
235
+ */
236
+ annotations?: {
237
+ title?: string;
238
+ readOnlyHint?: boolean;
239
+ destructiveHint?: boolean;
240
+ idempotentHint?: boolean;
241
+ openWorldHint?: boolean;
242
+ };
243
+ /**
244
+ * Cache configuration for response caching.
245
+ */
246
+ cache?: {
247
+ ttl?: number;
248
+ slideWindow?: boolean;
249
+ };
250
+ /**
251
+ * CodeCall-specific configuration.
252
+ */
253
+ codecall?: {
254
+ enabledInCodeCall?: boolean;
255
+ visibleInListTools?: boolean;
256
+ };
257
+ /**
258
+ * Tags/labels for categorization.
259
+ */
260
+ tags?: string[];
261
+ /**
262
+ * If true, hide tool from discovery.
263
+ */
264
+ hideFromDiscovery?: boolean;
265
+ /**
266
+ * Usage examples.
267
+ */
268
+ examples?: Array<{
269
+ description: string;
270
+ input: Record<string, unknown>;
271
+ output?: unknown;
272
+ }>;
214
273
  }
215
274
  /**
216
275
  * Security requirement definition
package/src/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema } from 'zod/v4/core';\n\n/** JSON Schema type from Zod v4 */\ntype JsonSchema = JSONSchema.JSONSchema;\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\n\n/**\n * OpenAPI specification version 3.0.x or 3.1.x\n */\nexport type OpenAPIVersion = '3.0.0' | '3.0.1' | '3.0.2' | '3.0.3' | '3.1.0';\n\n/**\n * Unified OpenAPI Document type (supports both 3.0 and 3.1)\n */\nexport type OpenAPIDocument = OpenAPIV3.Document | OpenAPIV3_1.Document;\n\n/**\n * HTTP methods supported by OpenAPI\n */\nexport type HTTPMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'head' | 'options' | 'trace';\n\n/**\n * Parameter location types\n */\nexport type ParameterLocation = 'path' | 'query' | 'header' | 'cookie' | 'body';\n\n/**\n * Authentication types supported\n */\nexport type AuthType = 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | 'mutualTLS';\n\n// Re-export OpenAPI types for convenience\nexport type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\nexport type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\nexport type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\nexport type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;\nexport type ResponsesObject = OpenAPIV3.ResponsesObject | OpenAPIV3_1.ResponsesObject;\nexport type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;\nexport type HeaderObject = OpenAPIV3.HeaderObject | OpenAPIV3_1.HeaderObject;\nexport type ExampleObject = OpenAPIV3.ExampleObject | OpenAPIV3_1.ExampleObject;\nexport type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;\nexport type PathsObject = OpenAPIV3.PathsObject | OpenAPIV3_1.PathsObject;\nexport type ServerObject = OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject;\nexport type SecuritySchemeObject = OpenAPIV3.SecuritySchemeObject | OpenAPIV3_1.SecuritySchemeObject;\nexport type ReferenceObject = OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject;\nexport type TagObject = OpenAPIV3.TagObject | OpenAPIV3_1.TagObject;\nexport type ExternalDocumentationObject =\n | OpenAPIV3.ExternalDocumentationObject\n | OpenAPIV3_1.ExternalDocumentationObject;\nexport type ServerVariableObject = OpenAPIV3.ServerVariableObject | OpenAPIV3_1.ServerVariableObject;\nexport type EncodingObject = OpenAPIV3.EncodingObject | OpenAPIV3_1.EncodingObject;\nexport type SecurityRequirementObject = OpenAPIV3.SecurityRequirementObject | OpenAPIV3_1.SecurityRequirementObject;\nexport type SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\n/**\n * Helper to check if an object is a ReferenceObject\n */\nexport function isReferenceObject(obj: any): obj is ReferenceObject {\n return obj && typeof obj === 'object' && '$ref' in obj;\n}\n\n/**\n * Convert OpenAPI schema to JsonSchema\n * Note: OpenAPI 3.0 uses a subset of JSON Schema Draft 4\n * OpenAPI 3.1 uses JSON Schema Draft 2020-12\n */\nexport function toJsonSchema(schema: SchemaObject | ReferenceObject): JsonSchema {\n if (isReferenceObject(schema)) {\n return { $ref: schema.$ref } as JsonSchema;\n }\n\n // Handle OpenAPI 3.0 boolean exclusiveMaximum/exclusiveMinimum\n // by converting them to JSON Schema Draft 7 numeric format\n const { exclusiveMaximum, exclusiveMinimum, maximum, minimum, ...rest } = schema;\n\n const result: Record<string, unknown> = { ...rest };\n\n // Handle exclusiveMaximum conversion\n if (typeof exclusiveMaximum === 'boolean') {\n if (exclusiveMaximum && maximum !== undefined) {\n // true + maximum present -> convert to numeric exclusiveMaximum\n result['exclusiveMaximum'] = maximum;\n } else if (maximum !== undefined) {\n // false or true without maximum -> keep maximum only\n result['maximum'] = maximum;\n }\n // Boolean exclusiveMaximum is never added (invalid in JSON Schema 7)\n } else if (exclusiveMaximum !== undefined) {\n // Already numeric (OpenAPI 3.1) - keep as is\n result['exclusiveMaximum'] = exclusiveMaximum;\n if (maximum !== undefined) {\n result['maximum'] = maximum;\n }\n } else if (maximum !== undefined) {\n // No exclusiveMaximum, just maximum\n result['maximum'] = maximum;\n }\n\n // Handle exclusiveMinimum conversion\n if (typeof exclusiveMinimum === 'boolean') {\n if (exclusiveMinimum && minimum !== undefined) {\n // true + minimum present -> convert to numeric exclusiveMinimum\n result['exclusiveMinimum'] = minimum;\n } else if (minimum !== undefined) {\n // false or true without minimum -> keep minimum only\n result['minimum'] = minimum;\n }\n // Boolean exclusiveMinimum is never added (invalid in JSON Schema 7)\n } else if (exclusiveMinimum !== undefined) {\n // Already numeric (OpenAPI 3.1) - keep as is\n result['exclusiveMinimum'] = exclusiveMinimum;\n if (minimum !== undefined) {\n result['minimum'] = minimum;\n }\n } else if (minimum !== undefined) {\n // No exclusiveMinimum, just minimum\n result['minimum'] = minimum;\n }\n\n // Recursively convert nested schemas to ensure all nested schemas are valid JsonSchema\n if (result['properties'] && typeof result['properties'] === 'object') {\n const props: Record<string, JsonSchema> = {};\n for (const [key, value] of Object.entries(result['properties'] as Record<string, SchemaObject | ReferenceObject>)) {\n props[key] = toJsonSchema(value);\n }\n result['properties'] = props;\n }\n\n if (result['items']) {\n if (Array.isArray(result['items'])) {\n result['items'] = (result['items'] as (SchemaObject | ReferenceObject)[]).map(toJsonSchema);\n } else {\n result['items'] = toJsonSchema(result['items'] as SchemaObject | ReferenceObject);\n }\n }\n\n if (result['additionalProperties'] && typeof result['additionalProperties'] === 'object') {\n result['additionalProperties'] = toJsonSchema(result['additionalProperties'] as SchemaObject | ReferenceObject);\n }\n\n for (const key of ['allOf', 'anyOf', 'oneOf'] as const) {\n if (result[key] && Array.isArray(result[key])) {\n result[key] = (result[key] as (SchemaObject | ReferenceObject)[]).map(toJsonSchema);\n }\n }\n\n if (result['not']) {\n result['not'] = toJsonSchema(result['not'] as SchemaObject | ReferenceObject);\n }\n\n return result as JsonSchema;\n}\n\n/**\n * Main MCP Tool definition generated from OpenAPI\n */\nexport interface McpOpenAPITool {\n /**\n * Unique tool name (from operationId or generated)\n */\n name: string;\n\n /**\n * Tool description (from operation summary/description)\n */\n description: string;\n\n /**\n * Combined input schema including all parameters\n * (path, query, header, cookie, body)\n */\n inputSchema: JsonSchema;\n\n /**\n * Output schema based on response definitions\n * Can be a union of multiple status codes\n */\n outputSchema?: JsonSchema;\n\n /**\n * Mapping from input schema properties to actual request parameters\n */\n mapper: ParameterMapper[];\n\n /**\n * Additional metadata about the tool\n */\n metadata: ToolMetadata;\n}\n\n/**\n * Maps input schema properties to their actual request locations\n */\nexport interface ParameterMapper {\n /**\n * Property name in the input schema\n */\n inputKey: string;\n\n /**\n * Where this parameter should be placed in the request\n */\n type: ParameterLocation;\n\n /**\n * Original parameter name (before conflict resolution)\n */\n key: string;\n\n /**\n * Whether this parameter is required\n */\n required?: boolean;\n\n /**\n * Parameter style (for path/query parameters)\n */\n style?: string;\n\n /**\n * Whether to explode arrays/objects\n */\n explode?: boolean;\n\n /**\n * Custom serialization info\n */\n serialization?: SerializationInfo;\n\n /**\n * Security scheme information (if this is an auth parameter)\n * This allows frameworks to resolve auth from context, env vars, etc.\n */\n security?: SecurityParameterInfo;\n}\n\n/**\n * Serialization information for complex parameters\n */\nexport interface SerializationInfo {\n /**\n * Content type for body parameters\n */\n contentType?: string;\n\n /**\n * Encoding rules\n */\n encoding?: Record<string, EncodingObject>;\n}\n\n/**\n * Security parameter information for framework-agnostic auth resolution\n */\nexport interface SecurityParameterInfo {\n /**\n * Security scheme name from OpenAPI (e.g., \"BearerAuth\")\n */\n scheme: string;\n\n /**\n * Security type (apiKey, http, oauth2, openIdConnect)\n */\n type: AuthType;\n\n /**\n * HTTP authentication scheme (for type: \"http\")\n * e.g., \"bearer\", \"basic\"\n */\n httpScheme?: string;\n\n /**\n * Bearer token format (e.g., \"JWT\")\n */\n bearerFormat?: string;\n\n /**\n * Required OAuth2 scopes\n */\n scopes?: string[];\n\n /**\n * API key parameter name (for type: \"apiKey\")\n */\n apiKeyName?: string;\n\n /**\n * API key location (for type: \"apiKey\")\n */\n apiKeyIn?: 'query' | 'header' | 'cookie';\n\n /**\n * Description of the security scheme\n */\n description?: string;\n}\n\n/**\n * Additional metadata about the generated tool\n */\nexport interface ToolMetadata {\n /**\n * Original OpenAPI path\n */\n path: string;\n\n /**\n * HTTP method\n */\n method: HTTPMethod;\n\n /**\n * Operation ID from OpenAPI\n */\n operationId?: string;\n\n /**\n * Tags from OpenAPI\n */\n tags?: string[];\n\n /**\n * Whether operation is deprecated\n */\n deprecated?: boolean;\n\n /**\n * Security requirements\n */\n security?: SecurityRequirement[];\n\n /**\n * Server information\n */\n servers?: ServerInfo[];\n\n /**\n * Response status codes included in output schema\n */\n responseStatusCodes?: number[];\n\n /**\n * External documentation\n */\n externalDocs?: ExternalDocumentationObject;\n}\n\n/**\n * Security requirement definition\n */\nexport interface SecurityRequirement {\n /**\n * Security scheme name\n */\n scheme: string;\n\n /**\n * Security type\n */\n type: AuthType;\n\n /**\n * Scopes required (for OAuth2/OpenID Connect)\n */\n scopes?: string[];\n\n /**\n * Parameter name (for API key)\n */\n name?: string;\n\n /**\n * Parameter location (for API key)\n */\n in?: 'query' | 'header' | 'cookie';\n\n /**\n * HTTP authentication scheme (for type: \"http\")\n * e.g., \"bearer\", \"basic\"\n */\n httpScheme?: string;\n\n /**\n * Bearer token format (e.g., \"JWT\")\n */\n bearerFormat?: string;\n\n /**\n * Description of the security scheme\n */\n description?: string;\n}\n\n/**\n * Server information\n */\nexport interface ServerInfo {\n /**\n * Server URL\n */\n url: string;\n\n /**\n * Server description\n */\n description?: string;\n\n /**\n * Server variables\n */\n variables?: Record<string, ServerVariableObject>;\n}\n\n/**\n * Options for loading OpenAPI specifications\n */\nexport interface LoadOptions {\n /**\n * Whether to dereference $refs in schemas\n * @default true\n */\n dereference?: boolean;\n\n /**\n * Base URL for API requests\n * Overrides servers in OpenAPI spec\n */\n baseUrl?: string;\n\n /**\n * Custom HTTP headers for loading from URL\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Whether to validate the OpenAPI document\n * @default true\n */\n validate?: boolean;\n\n /**\n * Whether to follow HTTP redirects\n * @default true\n */\n followRedirects?: boolean;\n}\n\n/**\n * Operation object with additional context for filtering\n */\nexport type OperationWithContext = OperationObject & {\n path: string;\n method: string;\n};\n\n/**\n * Options for generating tools\n */\nexport interface GenerateOptions {\n /**\n * Include only these operation IDs\n */\n includeOperations?: string[];\n\n /**\n * Exclude these operation IDs\n */\n excludeOperations?: string[];\n\n /**\n * Custom filter function\n */\n filterFn?: (operation: OperationWithContext) => boolean;\n\n /**\n * Naming strategy for resolving conflicts\n */\n namingStrategy?: NamingStrategy;\n\n /**\n * Preferred response status codes (in order of preference)\n * @default [200, 201, 204, 202, 203, 206]\n */\n preferredStatusCodes?: number[];\n\n /**\n * Whether to include deprecated operations\n * @default false\n */\n includeDeprecated?: boolean;\n\n /**\n * Whether to include all response codes in output schema\n * If false, only preferred status code is used\n * @default true\n */\n includeAllResponses?: boolean;\n\n /**\n * Maximum depth for dereferencing schemas\n * @default 10\n */\n maxSchemaDepth?: number;\n\n /**\n * Whether to include examples in schemas\n * @default false\n */\n includeExamples?: boolean;\n\n /**\n * Whether to include security requirements as input parameters\n * If false, security is only in mapper (frameworks resolve from context/env/etc.)\n * If true, security is added to inputSchema as explicit parameters\n * @default false\n */\n includeSecurityInInput?: boolean;\n}\n\n/**\n * Naming strategy for resolving parameter conflicts\n */\nexport interface NamingStrategy {\n /**\n * Resolver function for parameter name conflicts\n * @param paramName - Original parameter name\n * @param location - Parameter location\n * @param index - Index of conflicting parameter (0-based)\n * @returns New parameter name\n */\n conflictResolver: (paramName: string, location: ParameterLocation, index: number) => string;\n\n /**\n * Function to generate tool names\n * @param path - OpenAPI path\n * @param method - HTTP method\n * @param operationId - Operation ID if available\n * @returns Tool name\n */\n toolNameGenerator?: (path: string, method: HTTPMethod, operationId?: string) => string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n /**\n * Whether the document is valid\n */\n valid: boolean;\n\n /**\n * Validation errors\n */\n errors?: ValidationErrorDetail[];\n\n /**\n * Validation warnings\n */\n warnings?: ValidationWarning[];\n}\n\n/**\n * Validation error detail\n */\nexport interface ValidationErrorDetail {\n /**\n * Error message\n */\n message: string;\n\n /**\n * Error path (JSON pointer)\n */\n path?: string;\n\n /**\n * Error code\n */\n code?: string;\n}\n\n/**\n * Validation warning\n */\nexport interface ValidationWarning {\n /**\n * Warning message\n */\n message: string;\n\n /**\n * Warning path (JSON pointer)\n */\n path?: string;\n\n /**\n * Warning code\n */\n code?: string;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema } from 'zod/v4/core';\n\n/** JSON Schema type from Zod v4 */\ntype JsonSchema = JSONSchema.JSONSchema;\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\n\n/**\n * OpenAPI specification version 3.0.x or 3.1.x\n */\nexport type OpenAPIVersion = '3.0.0' | '3.0.1' | '3.0.2' | '3.0.3' | '3.1.0';\n\n/**\n * Unified OpenAPI Document type (supports both 3.0 and 3.1)\n */\nexport type OpenAPIDocument = OpenAPIV3.Document | OpenAPIV3_1.Document;\n\n/**\n * HTTP methods supported by OpenAPI\n */\nexport type HTTPMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'head' | 'options' | 'trace';\n\n/**\n * Parameter location types\n */\nexport type ParameterLocation = 'path' | 'query' | 'header' | 'cookie' | 'body';\n\n/**\n * Authentication types supported\n */\nexport type AuthType = 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | 'mutualTLS';\n\n// Re-export OpenAPI types for convenience\nexport type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\nexport type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\nexport type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\nexport type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;\nexport type ResponsesObject = OpenAPIV3.ResponsesObject | OpenAPIV3_1.ResponsesObject;\nexport type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;\nexport type HeaderObject = OpenAPIV3.HeaderObject | OpenAPIV3_1.HeaderObject;\nexport type ExampleObject = OpenAPIV3.ExampleObject | OpenAPIV3_1.ExampleObject;\nexport type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;\nexport type PathsObject = OpenAPIV3.PathsObject | OpenAPIV3_1.PathsObject;\nexport type ServerObject = OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject;\nexport type SecuritySchemeObject = OpenAPIV3.SecuritySchemeObject | OpenAPIV3_1.SecuritySchemeObject;\nexport type ReferenceObject = OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject;\nexport type TagObject = OpenAPIV3.TagObject | OpenAPIV3_1.TagObject;\nexport type ExternalDocumentationObject =\n | OpenAPIV3.ExternalDocumentationObject\n | OpenAPIV3_1.ExternalDocumentationObject;\nexport type ServerVariableObject = OpenAPIV3.ServerVariableObject | OpenAPIV3_1.ServerVariableObject;\nexport type EncodingObject = OpenAPIV3.EncodingObject | OpenAPIV3_1.EncodingObject;\nexport type SecurityRequirementObject = OpenAPIV3.SecurityRequirementObject | OpenAPIV3_1.SecurityRequirementObject;\nexport type SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\n/**\n * Helper to check if an object is a ReferenceObject\n */\nexport function isReferenceObject(obj: any): obj is ReferenceObject {\n return obj && typeof obj === 'object' && '$ref' in obj;\n}\n\n/**\n * Convert OpenAPI schema to JsonSchema\n * Note: OpenAPI 3.0 uses a subset of JSON Schema Draft 4\n * OpenAPI 3.1 uses JSON Schema Draft 2020-12\n */\nexport function toJsonSchema(schema: SchemaObject | ReferenceObject): JsonSchema {\n if (isReferenceObject(schema)) {\n return { $ref: schema.$ref } as JsonSchema;\n }\n\n // Handle OpenAPI 3.0 boolean exclusiveMaximum/exclusiveMinimum\n // by converting them to JSON Schema Draft 7 numeric format\n const { exclusiveMaximum, exclusiveMinimum, maximum, minimum, ...rest } = schema;\n\n const result: Record<string, unknown> = { ...rest };\n\n // Handle exclusiveMaximum conversion\n if (typeof exclusiveMaximum === 'boolean') {\n if (exclusiveMaximum && maximum !== undefined) {\n // true + maximum present -> convert to numeric exclusiveMaximum\n result['exclusiveMaximum'] = maximum;\n } else if (maximum !== undefined) {\n // false or true without maximum -> keep maximum only\n result['maximum'] = maximum;\n }\n // Boolean exclusiveMaximum is never added (invalid in JSON Schema 7)\n } else if (exclusiveMaximum !== undefined) {\n // Already numeric (OpenAPI 3.1) - keep as is\n result['exclusiveMaximum'] = exclusiveMaximum;\n if (maximum !== undefined) {\n result['maximum'] = maximum;\n }\n } else if (maximum !== undefined) {\n // No exclusiveMaximum, just maximum\n result['maximum'] = maximum;\n }\n\n // Handle exclusiveMinimum conversion\n if (typeof exclusiveMinimum === 'boolean') {\n if (exclusiveMinimum && minimum !== undefined) {\n // true + minimum present -> convert to numeric exclusiveMinimum\n result['exclusiveMinimum'] = minimum;\n } else if (minimum !== undefined) {\n // false or true without minimum -> keep minimum only\n result['minimum'] = minimum;\n }\n // Boolean exclusiveMinimum is never added (invalid in JSON Schema 7)\n } else if (exclusiveMinimum !== undefined) {\n // Already numeric (OpenAPI 3.1) - keep as is\n result['exclusiveMinimum'] = exclusiveMinimum;\n if (minimum !== undefined) {\n result['minimum'] = minimum;\n }\n } else if (minimum !== undefined) {\n // No exclusiveMinimum, just minimum\n result['minimum'] = minimum;\n }\n\n // Recursively convert nested schemas to ensure all nested schemas are valid JsonSchema\n if (result['properties'] && typeof result['properties'] === 'object') {\n const props: Record<string, JsonSchema> = {};\n for (const [key, value] of Object.entries(result['properties'] as Record<string, SchemaObject | ReferenceObject>)) {\n props[key] = toJsonSchema(value);\n }\n result['properties'] = props;\n }\n\n if (result['items']) {\n if (Array.isArray(result['items'])) {\n result['items'] = (result['items'] as (SchemaObject | ReferenceObject)[]).map(toJsonSchema);\n } else {\n result['items'] = toJsonSchema(result['items'] as SchemaObject | ReferenceObject);\n }\n }\n\n if (result['additionalProperties'] && typeof result['additionalProperties'] === 'object') {\n result['additionalProperties'] = toJsonSchema(result['additionalProperties'] as SchemaObject | ReferenceObject);\n }\n\n for (const key of ['allOf', 'anyOf', 'oneOf'] as const) {\n if (result[key] && Array.isArray(result[key])) {\n result[key] = (result[key] as (SchemaObject | ReferenceObject)[]).map(toJsonSchema);\n }\n }\n\n if (result['not']) {\n result['not'] = toJsonSchema(result['not'] as SchemaObject | ReferenceObject);\n }\n\n return result as JsonSchema;\n}\n\n/**\n * Main MCP Tool definition generated from OpenAPI\n */\nexport interface McpOpenAPITool {\n /**\n * Unique tool name (from operationId or generated)\n */\n name: string;\n\n /**\n * Tool description (from operation summary/description)\n */\n description: string;\n\n /**\n * Combined input schema including all parameters\n * (path, query, header, cookie, body)\n */\n inputSchema: JsonSchema;\n\n /**\n * Output schema based on response definitions\n * Can be a union of multiple status codes\n */\n outputSchema?: JsonSchema;\n\n /**\n * Mapping from input schema properties to actual request parameters\n */\n mapper: ParameterMapper[];\n\n /**\n * Additional metadata about the tool\n */\n metadata: ToolMetadata;\n}\n\n/**\n * Maps input schema properties to their actual request locations\n */\nexport interface ParameterMapper {\n /**\n * Property name in the input schema\n */\n inputKey: string;\n\n /**\n * Where this parameter should be placed in the request\n */\n type: ParameterLocation;\n\n /**\n * Original parameter name (before conflict resolution)\n */\n key: string;\n\n /**\n * Whether this parameter is required\n */\n required?: boolean;\n\n /**\n * Parameter style (for path/query parameters)\n */\n style?: string;\n\n /**\n * Whether to explode arrays/objects\n */\n explode?: boolean;\n\n /**\n * Custom serialization info\n */\n serialization?: SerializationInfo;\n\n /**\n * Security scheme information (if this is an auth parameter)\n * This allows frameworks to resolve auth from context, env vars, etc.\n */\n security?: SecurityParameterInfo;\n}\n\n/**\n * Serialization information for complex parameters\n */\nexport interface SerializationInfo {\n /**\n * Content type for body parameters\n */\n contentType?: string;\n\n /**\n * Encoding rules\n */\n encoding?: Record<string, EncodingObject>;\n}\n\n/**\n * Security parameter information for framework-agnostic auth resolution\n */\nexport interface SecurityParameterInfo {\n /**\n * Security scheme name from OpenAPI (e.g., \"BearerAuth\")\n */\n scheme: string;\n\n /**\n * Security type (apiKey, http, oauth2, openIdConnect)\n */\n type: AuthType;\n\n /**\n * HTTP authentication scheme (for type: \"http\")\n * e.g., \"bearer\", \"basic\"\n */\n httpScheme?: string;\n\n /**\n * Bearer token format (e.g., \"JWT\")\n */\n bearerFormat?: string;\n\n /**\n * Required OAuth2 scopes\n */\n scopes?: string[];\n\n /**\n * API key parameter name (for type: \"apiKey\")\n */\n apiKeyName?: string;\n\n /**\n * API key location (for type: \"apiKey\")\n */\n apiKeyIn?: 'query' | 'header' | 'cookie';\n\n /**\n * Description of the security scheme\n */\n description?: string;\n}\n\n/**\n * Additional metadata about the generated tool\n */\nexport interface ToolMetadata {\n /**\n * Original OpenAPI path\n */\n path: string;\n\n /**\n * HTTP method\n */\n method: HTTPMethod;\n\n /**\n * Operation ID from OpenAPI\n */\n operationId?: string;\n\n /**\n * Operation summary from OpenAPI (short description)\n */\n operationSummary?: string;\n\n /**\n * Operation description from OpenAPI (detailed description)\n */\n operationDescription?: string;\n\n /**\n * Tags from OpenAPI\n */\n tags?: string[];\n\n /**\n * Whether operation is deprecated\n */\n deprecated?: boolean;\n\n /**\n * Security requirements\n */\n security?: SecurityRequirement[];\n\n /**\n * Server information\n */\n servers?: ServerInfo[];\n\n /**\n * Response status codes included in output schema\n */\n responseStatusCodes?: number[];\n\n /**\n * External documentation\n */\n externalDocs?: ExternalDocumentationObject;\n\n /**\n * FrontMCP extension data from x-frontmcp in the OpenAPI operation.\n * Contains annotations, cache config, codecall config, tags, etc.\n */\n frontmcp?: FrontMcpExtensionData;\n}\n\n/**\n * FrontMCP extension data extracted from x-frontmcp in OpenAPI operations.\n * This provides declarative configuration for tools directly in the OpenAPI spec.\n */\nexport interface FrontMcpExtensionData {\n /**\n * Tool annotations for AI behavior hints.\n */\n annotations?: {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n };\n\n /**\n * Cache configuration for response caching.\n */\n cache?: {\n ttl?: number;\n slideWindow?: boolean;\n };\n\n /**\n * CodeCall-specific configuration.\n */\n codecall?: {\n enabledInCodeCall?: boolean;\n visibleInListTools?: boolean;\n };\n\n /**\n * Tags/labels for categorization.\n */\n tags?: string[];\n\n /**\n * If true, hide tool from discovery.\n */\n hideFromDiscovery?: boolean;\n\n /**\n * Usage examples.\n */\n examples?: Array<{\n description: string;\n input: Record<string, unknown>;\n output?: unknown;\n }>;\n}\n\n/**\n * Security requirement definition\n */\nexport interface SecurityRequirement {\n /**\n * Security scheme name\n */\n scheme: string;\n\n /**\n * Security type\n */\n type: AuthType;\n\n /**\n * Scopes required (for OAuth2/OpenID Connect)\n */\n scopes?: string[];\n\n /**\n * Parameter name (for API key)\n */\n name?: string;\n\n /**\n * Parameter location (for API key)\n */\n in?: 'query' | 'header' | 'cookie';\n\n /**\n * HTTP authentication scheme (for type: \"http\")\n * e.g., \"bearer\", \"basic\"\n */\n httpScheme?: string;\n\n /**\n * Bearer token format (e.g., \"JWT\")\n */\n bearerFormat?: string;\n\n /**\n * Description of the security scheme\n */\n description?: string;\n}\n\n/**\n * Server information\n */\nexport interface ServerInfo {\n /**\n * Server URL\n */\n url: string;\n\n /**\n * Server description\n */\n description?: string;\n\n /**\n * Server variables\n */\n variables?: Record<string, ServerVariableObject>;\n}\n\n/**\n * Options for loading OpenAPI specifications\n */\nexport interface LoadOptions {\n /**\n * Whether to dereference $refs in schemas\n * @default true\n */\n dereference?: boolean;\n\n /**\n * Base URL for API requests\n * Overrides servers in OpenAPI spec\n */\n baseUrl?: string;\n\n /**\n * Custom HTTP headers for loading from URL\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Whether to validate the OpenAPI document\n * @default true\n */\n validate?: boolean;\n\n /**\n * Whether to follow HTTP redirects\n * @default true\n */\n followRedirects?: boolean;\n}\n\n/**\n * Operation object with additional context for filtering\n */\nexport type OperationWithContext = OperationObject & {\n path: string;\n method: string;\n};\n\n/**\n * Options for generating tools\n */\nexport interface GenerateOptions {\n /**\n * Include only these operation IDs\n */\n includeOperations?: string[];\n\n /**\n * Exclude these operation IDs\n */\n excludeOperations?: string[];\n\n /**\n * Custom filter function\n */\n filterFn?: (operation: OperationWithContext) => boolean;\n\n /**\n * Naming strategy for resolving conflicts\n */\n namingStrategy?: NamingStrategy;\n\n /**\n * Preferred response status codes (in order of preference)\n * @default [200, 201, 204, 202, 203, 206]\n */\n preferredStatusCodes?: number[];\n\n /**\n * Whether to include deprecated operations\n * @default false\n */\n includeDeprecated?: boolean;\n\n /**\n * Whether to include all response codes in output schema\n * If false, only preferred status code is used\n * @default true\n */\n includeAllResponses?: boolean;\n\n /**\n * Maximum depth for dereferencing schemas\n * @default 10\n */\n maxSchemaDepth?: number;\n\n /**\n * Whether to include examples in schemas\n * @default false\n */\n includeExamples?: boolean;\n\n /**\n * Whether to include security requirements as input parameters\n * If false, security is only in mapper (frameworks resolve from context/env/etc.)\n * If true, security is added to inputSchema as explicit parameters\n * @default false\n */\n includeSecurityInInput?: boolean;\n}\n\n/**\n * Naming strategy for resolving parameter conflicts\n */\nexport interface NamingStrategy {\n /**\n * Resolver function for parameter name conflicts\n * @param paramName - Original parameter name\n * @param location - Parameter location\n * @param index - Index of conflicting parameter (0-based)\n * @returns New parameter name\n */\n conflictResolver: (paramName: string, location: ParameterLocation, index: number) => string;\n\n /**\n * Function to generate tool names\n * @param path - OpenAPI path\n * @param method - HTTP method\n * @param operationId - Operation ID if available\n * @returns Tool name\n */\n toolNameGenerator?: (path: string, method: HTTPMethod, operationId?: string) => string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n /**\n * Whether the document is valid\n */\n valid: boolean;\n\n /**\n * Validation errors\n */\n errors?: ValidationErrorDetail[];\n\n /**\n * Validation warnings\n */\n warnings?: ValidationWarning[];\n}\n\n/**\n * Validation error detail\n */\nexport interface ValidationErrorDetail {\n /**\n * Error message\n */\n message: string;\n\n /**\n * Error path (JSON pointer)\n */\n path?: string;\n\n /**\n * Error code\n */\n code?: string;\n}\n\n/**\n * Validation warning\n */\nexport interface ValidationWarning {\n /**\n * Warning message\n */\n message: string;\n\n /**\n * Warning path (JSON pointer)\n */\n path?: string;\n\n /**\n * Warning code\n */\n code?: string;\n}\n"]}