mcp-from-openapi 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Base error class for all library errors
3
+ */
4
+ export declare class OpenAPIToolError extends Error {
5
+ readonly context?: Record<string, any>;
6
+ constructor(message: string, context?: Record<string, any>);
7
+ }
8
+ /**
9
+ * Error thrown when loading an OpenAPI specification fails
10
+ */
11
+ export declare class LoadError extends OpenAPIToolError {
12
+ constructor(message: string, context?: Record<string, any>);
13
+ }
14
+ /**
15
+ * Error thrown when parsing an OpenAPI specification fails
16
+ */
17
+ export declare class ParseError extends OpenAPIToolError {
18
+ constructor(message: string, context?: Record<string, any>);
19
+ }
20
+ /**
21
+ * Error thrown when validating an OpenAPI specification fails
22
+ */
23
+ export declare class ValidationError extends OpenAPIToolError {
24
+ readonly errors?: any[];
25
+ constructor(message: string, context?: Record<string, any>);
26
+ }
27
+ /**
28
+ * Error thrown when generating a tool fails
29
+ */
30
+ export declare class GenerationError extends OpenAPIToolError {
31
+ constructor(message: string, context?: Record<string, any>);
32
+ }
33
+ /**
34
+ * Error thrown when a schema is invalid
35
+ */
36
+ export declare class SchemaError extends OpenAPIToolError {
37
+ constructor(message: string, context?: Record<string, any>);
38
+ }
package/src/errors.js ADDED
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemaError = exports.GenerationError = exports.ValidationError = exports.ParseError = exports.LoadError = exports.OpenAPIToolError = void 0;
4
+ /**
5
+ * Base error class for all library errors
6
+ */
7
+ class OpenAPIToolError extends Error {
8
+ constructor(message, context) {
9
+ super(message);
10
+ this.name = this.constructor.name;
11
+ this.context = context;
12
+ Error.captureStackTrace(this, this.constructor);
13
+ }
14
+ }
15
+ exports.OpenAPIToolError = OpenAPIToolError;
16
+ /**
17
+ * Error thrown when loading an OpenAPI specification fails
18
+ */
19
+ class LoadError extends OpenAPIToolError {
20
+ constructor(message, context) {
21
+ super(message, context);
22
+ }
23
+ }
24
+ exports.LoadError = LoadError;
25
+ /**
26
+ * Error thrown when parsing an OpenAPI specification fails
27
+ */
28
+ class ParseError extends OpenAPIToolError {
29
+ constructor(message, context) {
30
+ super(message, context);
31
+ }
32
+ }
33
+ exports.ParseError = ParseError;
34
+ /**
35
+ * Error thrown when validating an OpenAPI specification fails
36
+ */
37
+ class ValidationError extends OpenAPIToolError {
38
+ constructor(message, context) {
39
+ super(message, context);
40
+ this.errors = context?.['errors'];
41
+ }
42
+ }
43
+ exports.ValidationError = ValidationError;
44
+ /**
45
+ * Error thrown when generating a tool fails
46
+ */
47
+ class GenerationError extends OpenAPIToolError {
48
+ constructor(message, context) {
49
+ super(message, context);
50
+ }
51
+ }
52
+ exports.GenerationError = GenerationError;
53
+ /**
54
+ * Error thrown when a schema is invalid
55
+ */
56
+ class SchemaError extends OpenAPIToolError {
57
+ constructor(message, context) {
58
+ super(message, context);
59
+ }
60
+ }
61
+ exports.SchemaError = SchemaError;
62
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,gBAAiB,SAAQ,KAAK;IAGzC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AATD,4CASC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,gBAAgB;IAC7C,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,UAAW,SAAQ,gBAAgB;IAC9C,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAJD,gCAIC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,gBAAgB;IAGnD,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF;AAPD,0CAOC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,gBAAgB;IACnD,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAJD,0CAIC;AAED;;GAEG;AACH,MAAa,WAAY,SAAQ,gBAAgB;IAC/C,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF;AAJD,kCAIC","sourcesContent":["/**\n * Base error class for all library errors\n */\nexport class OpenAPIToolError extends Error {\n public readonly context?: Record<string, any>;\n\n constructor(message: string, context?: Record<string, any>) {\n super(message);\n this.name = this.constructor.name;\n this.context = context;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when loading an OpenAPI specification fails\n */\nexport class LoadError extends OpenAPIToolError {\n constructor(message: string, context?: Record<string, any>) {\n super(message, context);\n }\n}\n\n/**\n * Error thrown when parsing an OpenAPI specification fails\n */\nexport class ParseError extends OpenAPIToolError {\n constructor(message: string, context?: Record<string, any>) {\n super(message, context);\n }\n}\n\n/**\n * Error thrown when validating an OpenAPI specification fails\n */\nexport class ValidationError extends OpenAPIToolError {\n public readonly errors?: any[];\n\n constructor(message: string, context?: Record<string, any>) {\n super(message, context);\n this.errors = context?.['errors'];\n }\n}\n\n/**\n * Error thrown when generating a tool fails\n */\nexport class GenerationError extends OpenAPIToolError {\n constructor(message: string, context?: Record<string, any>) {\n super(message, context);\n }\n}\n\n/**\n * Error thrown when a schema is invalid\n */\nexport class SchemaError extends OpenAPIToolError {\n constructor(message: string, context?: Record<string, any>) {\n super(message, context);\n }\n}\n"]}
@@ -0,0 +1,65 @@
1
+ import type { OpenAPIDocument, LoadOptions, GenerateOptions, McpOpenAPITool, ValidationResult } from './types';
2
+ /**
3
+ * Main class for generating MCP tools from OpenAPI specifications
4
+ */
5
+ export declare class OpenAPIToolGenerator {
6
+ private document;
7
+ private dereferencedDocument?;
8
+ private options;
9
+ /**
10
+ * Private constructor - use static factory methods to create instances
11
+ */
12
+ private constructor();
13
+ /**
14
+ * Create generator from a URL
15
+ */
16
+ static fromURL(url: string, options?: LoadOptions): Promise<OpenAPIToolGenerator>;
17
+ /**
18
+ * Create generator from a file path
19
+ */
20
+ static fromFile(filePath: string, options?: LoadOptions): Promise<OpenAPIToolGenerator>;
21
+ /**
22
+ * Create generator from a YAML string
23
+ */
24
+ static fromYAML(yamlString: string, options?: LoadOptions): Promise<OpenAPIToolGenerator>;
25
+ /**
26
+ * Create generator from a JSON object
27
+ */
28
+ static fromJSON(json: object, options?: LoadOptions): Promise<OpenAPIToolGenerator>;
29
+ /**
30
+ * Get the OpenAPI document
31
+ */
32
+ getDocument(): OpenAPIDocument;
33
+ /**
34
+ * Validate the OpenAPI document
35
+ */
36
+ validate(): Promise<ValidationResult>;
37
+ /**
38
+ * Initialize the generator (dereference if needed)
39
+ */
40
+ private initialize;
41
+ /**
42
+ * Generate all tools from the OpenAPI specification
43
+ */
44
+ generateTools(options?: GenerateOptions): Promise<McpOpenAPITool[]>;
45
+ /**
46
+ * Generate a specific tool for a path and method
47
+ */
48
+ generateTool(pathStr: string, method: string, options?: GenerateOptions): Promise<McpOpenAPITool>;
49
+ /**
50
+ * Check if an operation should be included
51
+ */
52
+ private shouldIncludeOperation;
53
+ /**
54
+ * Generate a tool name
55
+ */
56
+ private generateToolName;
57
+ /**
58
+ * Extract metadata from operation
59
+ */
60
+ private extractMetadata;
61
+ /**
62
+ * Extract security requirements
63
+ */
64
+ private extractSecurityRequirements;
65
+ }
@@ -0,0 +1,348 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAPIToolGenerator = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const yaml = tslib_1.__importStar(require("yaml"));
6
+ const fs = tslib_1.__importStar(require("fs/promises"));
7
+ const path = tslib_1.__importStar(require("path"));
8
+ const json_schema_ref_parser_1 = tslib_1.__importDefault(require("@apidevtools/json-schema-ref-parser"));
9
+ const types_1 = require("./types");
10
+ const parameter_resolver_1 = require("./parameter-resolver");
11
+ const response_builder_1 = require("./response-builder");
12
+ const validator_1 = require("./validator");
13
+ const errors_1 = require("./errors");
14
+ /**
15
+ * Main class for generating MCP tools from OpenAPI specifications
16
+ */
17
+ class OpenAPIToolGenerator {
18
+ /**
19
+ * Private constructor - use static factory methods to create instances
20
+ */
21
+ constructor(document, options = {}) {
22
+ this.document = document;
23
+ this.options = {
24
+ dereference: options.dereference ?? true,
25
+ baseUrl: options.baseUrl ?? '',
26
+ headers: options.headers ?? {},
27
+ timeout: options.timeout ?? 30000,
28
+ validate: options.validate ?? true,
29
+ followRedirects: options.followRedirects ?? true,
30
+ };
31
+ }
32
+ /**
33
+ * Create generator from a URL
34
+ */
35
+ static async fromURL(url, options = {}) {
36
+ try {
37
+ const controller = new AbortController();
38
+ const timeout = setTimeout(() => controller.abort(), options.timeout ?? 30000);
39
+ const response = await fetch(url, {
40
+ headers: options.headers,
41
+ signal: controller.signal,
42
+ redirect: options.followRedirects ?? true ? 'follow' : 'manual',
43
+ });
44
+ clearTimeout(timeout);
45
+ if (!response.ok) {
46
+ throw new errors_1.LoadError(`Failed to fetch OpenAPI spec from URL: ${response.status} ${response.statusText}`, {
47
+ url,
48
+ status: response.status,
49
+ });
50
+ }
51
+ const contentType = response.headers.get('content-type') || '';
52
+ const text = await response.text();
53
+ let document;
54
+ if (contentType.includes('yaml') || contentType.includes('yml') || url.match(/\.ya?ml$/i)) {
55
+ document = yaml.parse(text);
56
+ }
57
+ else {
58
+ document = JSON.parse(text);
59
+ }
60
+ return new OpenAPIToolGenerator(document, options);
61
+ }
62
+ catch (error) {
63
+ if (error instanceof errors_1.LoadError) {
64
+ throw error;
65
+ }
66
+ const errorMessage = error instanceof Error ? error.message : String(error);
67
+ throw new errors_1.LoadError(`Failed to load OpenAPI spec from URL: ${errorMessage}`, {
68
+ url,
69
+ originalError: error,
70
+ });
71
+ }
72
+ }
73
+ /**
74
+ * Create generator from a file path
75
+ */
76
+ static async fromFile(filePath, options = {}) {
77
+ try {
78
+ const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
79
+ const content = await fs.readFile(absolutePath, 'utf-8');
80
+ const ext = path.extname(filePath).toLowerCase();
81
+ let document;
82
+ if (ext === '.yaml' || ext === '.yml') {
83
+ document = yaml.parse(content);
84
+ }
85
+ else if (ext === '.json') {
86
+ document = JSON.parse(content);
87
+ }
88
+ else {
89
+ // Try to parse as JSON first, then YAML
90
+ try {
91
+ document = JSON.parse(content);
92
+ }
93
+ catch {
94
+ document = yaml.parse(content);
95
+ }
96
+ }
97
+ return new OpenAPIToolGenerator(document, options);
98
+ }
99
+ catch (error) {
100
+ const errorMessage = error instanceof Error ? error.message : String(error);
101
+ throw new errors_1.LoadError(`Failed to load OpenAPI spec from file: ${errorMessage}`, {
102
+ filePath,
103
+ originalError: error,
104
+ });
105
+ }
106
+ }
107
+ /**
108
+ * Create generator from a YAML string
109
+ */
110
+ static async fromYAML(yamlString, options = {}) {
111
+ try {
112
+ const document = yaml.parse(yamlString);
113
+ return new OpenAPIToolGenerator(document, options);
114
+ }
115
+ catch (error) {
116
+ const errorMessage = error instanceof Error ? error.message : String(error);
117
+ throw new errors_1.ParseError(`Failed to parse YAML: ${errorMessage}`, {
118
+ originalError: error,
119
+ });
120
+ }
121
+ }
122
+ /**
123
+ * Create generator from a JSON object
124
+ */
125
+ static async fromJSON(json, options = {}) {
126
+ // Clone to avoid mutations
127
+ const document = JSON.parse(JSON.stringify(json));
128
+ return new OpenAPIToolGenerator(document, options);
129
+ }
130
+ /**
131
+ * Get the OpenAPI document
132
+ */
133
+ getDocument() {
134
+ return this.dereferencedDocument ?? this.document;
135
+ }
136
+ /**
137
+ * Validate the OpenAPI document
138
+ */
139
+ async validate() {
140
+ const validator = new validator_1.Validator();
141
+ return validator.validate(this.document);
142
+ }
143
+ /**
144
+ * Initialize the generator (dereference if needed)
145
+ */
146
+ async initialize() {
147
+ if (this.options.validate) {
148
+ const result = await this.validate();
149
+ if (!result.valid) {
150
+ throw new errors_1.ParseError('Invalid OpenAPI document', { errors: result.errors });
151
+ }
152
+ }
153
+ if (this.options.dereference && !this.dereferencedDocument) {
154
+ try {
155
+ this.dereferencedDocument = (await json_schema_ref_parser_1.default.dereference(JSON.parse(JSON.stringify(this.document))));
156
+ }
157
+ catch (error) {
158
+ const errorMessage = error instanceof Error ? error.message : String(error);
159
+ throw new errors_1.ParseError(`Failed to dereference OpenAPI document: ${errorMessage}`, {
160
+ originalError: error,
161
+ });
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * Generate all tools from the OpenAPI specification
167
+ */
168
+ async generateTools(options = {}) {
169
+ await this.initialize();
170
+ const document = this.getDocument();
171
+ const tools = [];
172
+ if (!document.paths) {
173
+ return tools;
174
+ }
175
+ for (const [pathStr, pathItem] of Object.entries(document.paths)) {
176
+ if (!pathItem || '$ref' in pathItem)
177
+ continue;
178
+ const methods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'];
179
+ for (const method of methods) {
180
+ const operation = pathItem[method];
181
+ if (!operation)
182
+ continue;
183
+ // Apply filters
184
+ if (!this.shouldIncludeOperation(operation, pathStr, method, options)) {
185
+ continue;
186
+ }
187
+ try {
188
+ const tool = await this.generateTool(pathStr, method, options);
189
+ tools.push(tool);
190
+ }
191
+ catch (error) {
192
+ console.warn(`Failed to generate tool for ${method.toUpperCase()} ${pathStr}:`, error.message);
193
+ }
194
+ }
195
+ }
196
+ return tools;
197
+ }
198
+ /**
199
+ * Generate a specific tool for a path and method
200
+ */
201
+ async generateTool(pathStr, method, options = {}) {
202
+ await this.initialize();
203
+ const document = this.getDocument();
204
+ if (!document.paths) {
205
+ throw new Error('No paths defined in OpenAPI document');
206
+ }
207
+ const pathItem = document.paths[pathStr];
208
+ const operation = pathItem?.[method.toLowerCase()];
209
+ if (!operation) {
210
+ throw new Error(`Operation not found: ${method.toUpperCase()} ${pathStr}`);
211
+ }
212
+ // Resolve parameters
213
+ const parameterResolver = new parameter_resolver_1.ParameterResolver(options.namingStrategy);
214
+ // Filter out ReferenceObjects from parameters
215
+ let pathParameters = undefined;
216
+ if (pathItem.parameters) {
217
+ pathParameters = pathItem.parameters.filter((p) => !(0, types_1.isReferenceObject)(p));
218
+ }
219
+ const { inputSchema, mapper } = parameterResolver.resolve(operation, pathParameters);
220
+ // Build response schema
221
+ const responseBuilder = new response_builder_1.ResponseBuilder(options);
222
+ const outputSchema = responseBuilder.build(operation.responses);
223
+ // Generate tool name
224
+ const name = this.generateToolName(pathStr, method, operation.operationId, options);
225
+ // Generate description
226
+ const description = operation.summary || operation.description || `${method.toUpperCase()} ${pathStr}`;
227
+ // Extract metadata
228
+ const metadata = this.extractMetadata(pathStr, method, operation, document, outputSchema);
229
+ return {
230
+ name,
231
+ description,
232
+ inputSchema,
233
+ outputSchema,
234
+ mapper,
235
+ metadata,
236
+ };
237
+ }
238
+ /**
239
+ * Check if an operation should be included
240
+ */
241
+ shouldIncludeOperation(operation, path, method, options) {
242
+ // Check deprecated
243
+ if (operation.deprecated && !options.includeDeprecated) {
244
+ return false;
245
+ }
246
+ // Check operation ID filters
247
+ if (options.includeOperations && operation.operationId) {
248
+ if (!options.includeOperations.includes(operation.operationId)) {
249
+ return false;
250
+ }
251
+ }
252
+ if (options.excludeOperations && operation.operationId) {
253
+ if (options.excludeOperations.includes(operation.operationId)) {
254
+ return false;
255
+ }
256
+ }
257
+ // Custom filter
258
+ if (options.filterFn) {
259
+ return options.filterFn({
260
+ ...operation,
261
+ path,
262
+ method,
263
+ });
264
+ }
265
+ return true;
266
+ }
267
+ /**
268
+ * Generate a tool name
269
+ */
270
+ generateToolName(path, method, operationId, options = {}) {
271
+ if (options.namingStrategy?.toolNameGenerator) {
272
+ return options.namingStrategy.toolNameGenerator(path, method, operationId);
273
+ }
274
+ if (operationId) {
275
+ return operationId;
276
+ }
277
+ // Generate from path and method
278
+ const sanitized = path
279
+ .replace(/\{([^}]+)\}/g, 'By_$1')
280
+ .replace(/[^a-zA-Z0-9_]/g, '_')
281
+ .replace(/_+/g, '_')
282
+ .replace(/^_|_$/g, '');
283
+ return `${method}_${sanitized}`;
284
+ }
285
+ /**
286
+ * Extract metadata from operation
287
+ */
288
+ extractMetadata(path, method, operation, document, outputSchema) {
289
+ const metadata = {
290
+ path,
291
+ method,
292
+ operationId: operation.operationId,
293
+ tags: operation.tags,
294
+ deprecated: operation.deprecated,
295
+ };
296
+ // Extract security requirements
297
+ if (operation.security || document.security) {
298
+ metadata.security = this.extractSecurityRequirements(operation.security ?? document.security, document);
299
+ }
300
+ // Extract servers
301
+ if (operation.servers || document.servers) {
302
+ metadata.servers = (operation.servers ?? document.servers).map((server) => ({
303
+ url: this.options.baseUrl || server.url,
304
+ description: server.description,
305
+ variables: server.variables,
306
+ }));
307
+ }
308
+ else if (this.options.baseUrl) {
309
+ metadata.servers = [{ url: this.options.baseUrl }];
310
+ }
311
+ // Extract response status codes
312
+ if (outputSchema && outputSchema.oneOf) {
313
+ metadata.responseStatusCodes = outputSchema.oneOf.map((schema) => schema['x-status-code']).filter(Boolean);
314
+ }
315
+ else if (outputSchema?.['x-status-code']) {
316
+ metadata.responseStatusCodes = [outputSchema['x-status-code']];
317
+ }
318
+ // External docs
319
+ if (operation.externalDocs) {
320
+ metadata.externalDocs = operation.externalDocs;
321
+ }
322
+ return metadata;
323
+ }
324
+ /**
325
+ * Extract security requirements
326
+ */
327
+ extractSecurityRequirements(security, document) {
328
+ if (!security || !document.components?.securitySchemes) {
329
+ return [];
330
+ }
331
+ return security.flatMap((req) => Object.entries(req).map(([scheme, scopes]) => {
332
+ const securityScheme = document.components.securitySchemes[scheme];
333
+ // Skip if it's a reference object
334
+ if ((0, types_1.isReferenceObject)(securityScheme)) {
335
+ return { scheme, type: 'unknown', scopes };
336
+ }
337
+ return {
338
+ scheme,
339
+ type: securityScheme.type,
340
+ scopes,
341
+ name: 'name' in securityScheme ? securityScheme.name : undefined,
342
+ in: 'in' in securityScheme ? securityScheme.in : undefined,
343
+ };
344
+ }));
345
+ }
346
+ }
347
+ exports.OpenAPIToolGenerator = OpenAPIToolGenerator;
348
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +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} 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: 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(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 const { inputSchema, mapper } = parameterResolver.resolve(operation, pathParameters);\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(operation: any, path: string, method: string, options: GenerateOptions): 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(operation.security ?? document.security, document);\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\n if (outputSchema && outputSchema.oneOf) {\n metadata.responseStatusCodes = outputSchema.oneOf.map((schema: any) => schema['x-status-code']).filter(Boolean);\n } else if (outputSchema?.['x-status-code']) {\n metadata.responseStatusCodes = [outputSchema['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(security: Record<string, string[]>[], document: OpenAPIDocument): any[] {\n if (!security || !document.components?.securitySchemes) {\n return [];\n }\n\n return security.flatMap((req) =>\n Object.entries(req).map(([scheme, scopes]) => {\n const securityScheme = document.components!.securitySchemes![scheme];\n\n // Skip if it's a reference object\n if (isReferenceObject(securityScheme)) {\n return { scheme, type: 'unknown' as any, scopes };\n }\n\n return {\n scheme,\n type: securityScheme.type,\n scopes,\n name: 'name' in securityScheme ? securityScheme.name : undefined,\n in: 'in' in securityScheme ? securityScheme.in : undefined,\n };\n }),\n );\n }\n}\n"]}
package/src/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export { OpenAPIToolGenerator } from './generator';
2
+ export { SchemaBuilder } from './schema-builder';
3
+ export { ParameterResolver } from './parameter-resolver';
4
+ export { ResponseBuilder } from './response-builder';
5
+ export { Validator } from './validator';
6
+ export { OpenAPIToolError, LoadError, ParseError, ValidationError, GenerationError, SchemaError, } from './errors';
7
+ export type { McpOpenAPITool, ParameterMapper, ToolMetadata, SerializationInfo, SecurityRequirement, 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 { isReferenceObject, toJSONSchema7 } from './types';
package/src/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toJSONSchema7 = exports.isReferenceObject = exports.SchemaError = exports.GenerationError = exports.ValidationError = exports.ParseError = exports.LoadError = exports.OpenAPIToolError = exports.Validator = exports.ResponseBuilder = exports.ParameterResolver = exports.SchemaBuilder = exports.OpenAPIToolGenerator = void 0;
4
+ // Main exports
5
+ var generator_1 = require("./generator");
6
+ Object.defineProperty(exports, "OpenAPIToolGenerator", { enumerable: true, get: function () { return generator_1.OpenAPIToolGenerator; } });
7
+ var schema_builder_1 = require("./schema-builder");
8
+ Object.defineProperty(exports, "SchemaBuilder", { enumerable: true, get: function () { return schema_builder_1.SchemaBuilder; } });
9
+ var parameter_resolver_1 = require("./parameter-resolver");
10
+ Object.defineProperty(exports, "ParameterResolver", { enumerable: true, get: function () { return parameter_resolver_1.ParameterResolver; } });
11
+ var response_builder_1 = require("./response-builder");
12
+ Object.defineProperty(exports, "ResponseBuilder", { enumerable: true, get: function () { return response_builder_1.ResponseBuilder; } });
13
+ var validator_1 = require("./validator");
14
+ Object.defineProperty(exports, "Validator", { enumerable: true, get: function () { return validator_1.Validator; } });
15
+ // Error exports
16
+ var errors_1 = require("./errors");
17
+ Object.defineProperty(exports, "OpenAPIToolError", { enumerable: true, get: function () { return errors_1.OpenAPIToolError; } });
18
+ Object.defineProperty(exports, "LoadError", { enumerable: true, get: function () { return errors_1.LoadError; } });
19
+ Object.defineProperty(exports, "ParseError", { enumerable: true, get: function () { return errors_1.ParseError; } });
20
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
21
+ Object.defineProperty(exports, "GenerationError", { enumerable: true, get: function () { return errors_1.GenerationError; } });
22
+ Object.defineProperty(exports, "SchemaError", { enumerable: true, get: function () { return errors_1.SchemaError; } });
23
+ // Utility exports
24
+ var types_1 = require("./types");
25
+ Object.defineProperty(exports, "isReferenceObject", { enumerable: true, get: function () { return types_1.isReferenceObject; } });
26
+ Object.defineProperty(exports, "toJSONSchema7", { enumerable: true, get: function () { return types_1.toJSONSchema7; } });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;AAElB,gBAAgB;AAChB,mCAOkB;AANhB,0GAAA,gBAAgB,OAAA;AAChB,mGAAA,SAAS,OAAA;AACT,oGAAA,UAAU,OAAA;AACV,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,qGAAA,WAAW,OAAA;AAqDb,kBAAkB;AAClB,iCAA2D;AAAlD,0GAAA,iBAAiB,OAAA;AAAE,sGAAA,aAAa,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';\n\n// Error exports\nexport {\n OpenAPIToolError,\n LoadError,\n ParseError,\n ValidationError,\n GenerationError,\n SchemaError,\n} from './errors';\n\n// Type exports\nexport type {\n // Main MCP types\n McpOpenAPITool,\n ParameterMapper,\n ToolMetadata,\n SerializationInfo,\n SecurityRequirement,\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// Utility exports\nexport { isReferenceObject, toJSONSchema7 } from './types';\n"]}
@@ -0,0 +1,32 @@
1
+ import type { JSONSchema7 } from 'json-schema';
2
+ import type { ParameterMapper, ParameterObject, NamingStrategy } from './types';
3
+ /**
4
+ * Resolves parameters and handles naming conflicts
5
+ */
6
+ export declare class ParameterResolver {
7
+ private namingStrategy;
8
+ constructor(namingStrategy?: NamingStrategy);
9
+ /**
10
+ * Default conflict resolver: prefix with location
11
+ */
12
+ private defaultConflictResolver;
13
+ /**
14
+ * Resolve all parameters for an operation
15
+ */
16
+ resolve(operation: any, pathParameters?: ParameterObject[]): {
17
+ inputSchema: JSONSchema7;
18
+ mapper: ParameterMapper[];
19
+ };
20
+ /**
21
+ * Extract parameters from request body schema
22
+ */
23
+ private extractBodyParameters;
24
+ /**
25
+ * Build JSON Schema for a parameter
26
+ */
27
+ private buildParameterSchema;
28
+ /**
29
+ * Select the most appropriate content type
30
+ */
31
+ private selectContentType;
32
+ }