@emcy/openapi-to-mcp 0.2.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/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/__tests__/generator.test.d.ts +5 -0
- package/dist/__tests__/generator.test.d.ts.map +1 -0
- package/dist/__tests__/generator.test.js +236 -0
- package/dist/__tests__/generator.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +5 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +184 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/mapper.test.d.ts +5 -0
- package/dist/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/__tests__/mapper.test.js +250 -0
- package/dist/__tests__/mapper.test.js.map +1 -0
- package/dist/__tests__/parser.test.d.ts +5 -0
- package/dist/__tests__/parser.test.d.ts.map +1 -0
- package/dist/__tests__/parser.test.js +260 -0
- package/dist/__tests__/parser.test.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +235 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator.d.ts +9 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +595 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mapper.d.ts +17 -0
- package/dist/mapper.d.ts.map +1 -0
- package/dist/mapper.js +79 -0
- package/dist/mapper.js.map +1 -0
- package/dist/parser.d.ts +31 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +183 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +72 -0
package/dist/mapper.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Mapper - Maps OpenAPI endpoints to MCP tool definitions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Map OpenAPI endpoints to MCP tool definitions
|
|
6
|
+
*/
|
|
7
|
+
export function mapToMcpTools(endpoints, enabledPaths) {
|
|
8
|
+
return endpoints
|
|
9
|
+
.filter((endpoint) => {
|
|
10
|
+
if (!enabledPaths)
|
|
11
|
+
return true;
|
|
12
|
+
const key = `${endpoint.method}:${endpoint.path}`;
|
|
13
|
+
return enabledPaths.has(key);
|
|
14
|
+
})
|
|
15
|
+
.map((endpoint) => mapEndpointToTool(endpoint));
|
|
16
|
+
}
|
|
17
|
+
function mapEndpointToTool(endpoint) {
|
|
18
|
+
const inputSchema = buildInputSchema(endpoint);
|
|
19
|
+
// Build description from summary and path
|
|
20
|
+
let description = endpoint.summary || `Executes ${endpoint.method} ${endpoint.path}`;
|
|
21
|
+
if (endpoint.description && endpoint.description !== endpoint.summary) {
|
|
22
|
+
description += `\n\n${endpoint.description}`;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
name: endpoint.operationId,
|
|
26
|
+
description,
|
|
27
|
+
inputSchema,
|
|
28
|
+
httpMethod: endpoint.method.toLowerCase(),
|
|
29
|
+
pathTemplate: endpoint.path,
|
|
30
|
+
parameters: endpoint.parameters,
|
|
31
|
+
requestBodyContentType: endpoint.requestBody?.contentType,
|
|
32
|
+
securitySchemes: endpoint.securitySchemes,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function buildInputSchema(endpoint) {
|
|
36
|
+
const properties = {};
|
|
37
|
+
const required = [];
|
|
38
|
+
// Add parameters to schema
|
|
39
|
+
for (const param of endpoint.parameters) {
|
|
40
|
+
properties[param.name] = {
|
|
41
|
+
...param.schema,
|
|
42
|
+
description: param.description || param.schema.description,
|
|
43
|
+
};
|
|
44
|
+
if (param.required) {
|
|
45
|
+
required.push(param.name);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Add request body to schema
|
|
49
|
+
if (endpoint.requestBody) {
|
|
50
|
+
properties.requestBody = {
|
|
51
|
+
...endpoint.requestBody.schema,
|
|
52
|
+
description: "The JSON request body.",
|
|
53
|
+
};
|
|
54
|
+
if (endpoint.requestBody.required) {
|
|
55
|
+
required.push("requestBody");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const schema = {
|
|
59
|
+
type: "object",
|
|
60
|
+
properties,
|
|
61
|
+
};
|
|
62
|
+
if (required.length > 0) {
|
|
63
|
+
schema.required = required;
|
|
64
|
+
}
|
|
65
|
+
return schema;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate a unique key for an endpoint
|
|
69
|
+
*/
|
|
70
|
+
export function getEndpointKey(endpoint) {
|
|
71
|
+
return `${endpoint.method}:${endpoint.path}`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get all endpoint keys from a list of endpoints
|
|
75
|
+
*/
|
|
76
|
+
export function getAllEndpointKeys(endpoints) {
|
|
77
|
+
return endpoints.map(getEndpointKey);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI Parser - Parses OpenAPI 3.x specs and extracts endpoint information
|
|
3
|
+
*/
|
|
4
|
+
import type { ParsedOpenAPI } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Parse an OpenAPI specification from a string (JSON or YAML) or URL
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseOpenAPI(input: string | object): Promise<ParsedOpenAPI>;
|
|
9
|
+
/**
|
|
10
|
+
* Validate an OpenAPI specification
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateOpenAPI(input: string | object): Promise<{
|
|
13
|
+
valid: boolean;
|
|
14
|
+
errors?: string[];
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a consistent operationId from method and path.
|
|
18
|
+
*
|
|
19
|
+
* IMPORTANT: This function is duplicated in:
|
|
20
|
+
* - emcy/src/Emcy.Web/app/[lng]/components/wizard/actions.ts
|
|
21
|
+
*
|
|
22
|
+
* Both implementations MUST stay in sync! If you modify this function,
|
|
23
|
+
* update the wizard's generateOperationId() function as well.
|
|
24
|
+
*
|
|
25
|
+
* Examples:
|
|
26
|
+
* GET /users -> GetUsers
|
|
27
|
+
* GET /users/{id} -> GetUsersById
|
|
28
|
+
* POST /orders/{orderId}/items -> PostOrdersByOrderIdItems
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateOperationId(method: string, path: string): string;
|
|
31
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAmB,aAAa,EAAwE,MAAM,YAAY,CAAC;AAQvI;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAKjF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAQ5G;AAmJD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAcxE"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI Parser - Parses OpenAPI 3.x specs and extracts endpoint information
|
|
3
|
+
*/
|
|
4
|
+
import SwaggerParser from '@apidevtools/swagger-parser';
|
|
5
|
+
/**
|
|
6
|
+
* Parse an OpenAPI specification from a string (JSON or YAML) or URL
|
|
7
|
+
*/
|
|
8
|
+
export async function parseOpenAPI(input) {
|
|
9
|
+
// Dereference resolves all $ref pointers
|
|
10
|
+
const api = await SwaggerParser.dereference(input);
|
|
11
|
+
return extractFromSpec(api);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate an OpenAPI specification
|
|
15
|
+
*/
|
|
16
|
+
export async function validateOpenAPI(input) {
|
|
17
|
+
try {
|
|
18
|
+
await SwaggerParser.validate(input);
|
|
19
|
+
return { valid: true };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
23
|
+
return { valid: false, errors: [message] };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function extractFromSpec(api) {
|
|
27
|
+
const endpoints = [];
|
|
28
|
+
const securitySchemes = {};
|
|
29
|
+
// Extract security schemes
|
|
30
|
+
const components = api.components;
|
|
31
|
+
if (components?.securitySchemes) {
|
|
32
|
+
for (const [name, scheme] of Object.entries(components.securitySchemes)) {
|
|
33
|
+
if (!isReference(scheme)) {
|
|
34
|
+
securitySchemes[name] = extractSecurityScheme(scheme);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Extract base URL from servers
|
|
39
|
+
const baseUrl = api.servers?.[0]?.url || '';
|
|
40
|
+
// Extract endpoints from paths
|
|
41
|
+
if (api.paths) {
|
|
42
|
+
for (const [path, pathItem] of Object.entries(api.paths)) {
|
|
43
|
+
if (!pathItem || isReference(pathItem))
|
|
44
|
+
continue;
|
|
45
|
+
const methods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
|
|
46
|
+
for (const method of methods) {
|
|
47
|
+
const operation = pathItem[method];
|
|
48
|
+
if (!operation)
|
|
49
|
+
continue;
|
|
50
|
+
const endpoint = extractEndpoint(path, method.toUpperCase(), operation, pathItem.parameters);
|
|
51
|
+
endpoints.push(endpoint);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
title: api.info.title,
|
|
57
|
+
version: api.info.version,
|
|
58
|
+
description: api.info.description,
|
|
59
|
+
baseUrl,
|
|
60
|
+
endpoints,
|
|
61
|
+
securitySchemes,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function extractEndpoint(path, method, operation, pathParameters) {
|
|
65
|
+
const parameters = [];
|
|
66
|
+
// Combine path-level and operation-level parameters
|
|
67
|
+
const allParams = [...(pathParameters || []), ...(operation.parameters || [])];
|
|
68
|
+
for (const param of allParams) {
|
|
69
|
+
if (isReference(param))
|
|
70
|
+
continue;
|
|
71
|
+
parameters.push(extractParameter(param));
|
|
72
|
+
}
|
|
73
|
+
// Extract request body
|
|
74
|
+
let requestBody;
|
|
75
|
+
if (operation.requestBody && !isReference(operation.requestBody)) {
|
|
76
|
+
requestBody = extractRequestBody(operation.requestBody);
|
|
77
|
+
}
|
|
78
|
+
// Extract security requirements
|
|
79
|
+
const securitySchemes = [];
|
|
80
|
+
const security = operation.security || [];
|
|
81
|
+
for (const req of security) {
|
|
82
|
+
securitySchemes.push(...Object.keys(req));
|
|
83
|
+
}
|
|
84
|
+
// Generate operationId if not present
|
|
85
|
+
const operationId = operation.operationId || generateOperationId(method, path);
|
|
86
|
+
return {
|
|
87
|
+
operationId,
|
|
88
|
+
method,
|
|
89
|
+
path,
|
|
90
|
+
summary: operation.summary,
|
|
91
|
+
description: operation.description,
|
|
92
|
+
parameters,
|
|
93
|
+
requestBody,
|
|
94
|
+
securitySchemes,
|
|
95
|
+
tags: operation.tags || [],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function extractParameter(param) {
|
|
99
|
+
return {
|
|
100
|
+
name: param.name,
|
|
101
|
+
in: param.in,
|
|
102
|
+
required: param.required || false,
|
|
103
|
+
schema: param.schema || { type: 'string' },
|
|
104
|
+
description: param.description,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function extractRequestBody(body) {
|
|
108
|
+
const content = body.content;
|
|
109
|
+
// Prefer JSON content type
|
|
110
|
+
const jsonContent = content?.['application/json'];
|
|
111
|
+
if (jsonContent?.schema) {
|
|
112
|
+
return {
|
|
113
|
+
required: body.required || false,
|
|
114
|
+
contentType: 'application/json',
|
|
115
|
+
schema: jsonContent.schema,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Fallback to first available content type
|
|
119
|
+
const [contentType, mediaType] = Object.entries(content || {})[0] || [];
|
|
120
|
+
if (contentType && mediaType?.schema) {
|
|
121
|
+
return {
|
|
122
|
+
required: body.required || false,
|
|
123
|
+
contentType,
|
|
124
|
+
schema: mediaType.schema,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
function extractSecurityScheme(scheme) {
|
|
130
|
+
const result = {
|
|
131
|
+
type: scheme.type,
|
|
132
|
+
};
|
|
133
|
+
if (scheme.type === 'apiKey') {
|
|
134
|
+
result.name = scheme.name;
|
|
135
|
+
result.in = scheme.in;
|
|
136
|
+
}
|
|
137
|
+
else if (scheme.type === 'http') {
|
|
138
|
+
result.scheme = scheme.scheme;
|
|
139
|
+
result.bearerFormat = scheme.bearerFormat;
|
|
140
|
+
}
|
|
141
|
+
else if (scheme.type === 'oauth2' && 'flows' in scheme) {
|
|
142
|
+
result.flows = scheme.flows;
|
|
143
|
+
}
|
|
144
|
+
else if (scheme.type === 'openIdConnect' && 'openIdConnectUrl' in scheme) {
|
|
145
|
+
result.openIdConnectUrl = scheme.openIdConnectUrl;
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate a consistent operationId from method and path.
|
|
151
|
+
*
|
|
152
|
+
* IMPORTANT: This function is duplicated in:
|
|
153
|
+
* - emcy/src/Emcy.Web/app/[lng]/components/wizard/actions.ts
|
|
154
|
+
*
|
|
155
|
+
* Both implementations MUST stay in sync! If you modify this function,
|
|
156
|
+
* update the wizard's generateOperationId() function as well.
|
|
157
|
+
*
|
|
158
|
+
* Examples:
|
|
159
|
+
* GET /users -> GetUsers
|
|
160
|
+
* GET /users/{id} -> GetUsersById
|
|
161
|
+
* POST /orders/{orderId}/items -> PostOrdersByOrderIdItems
|
|
162
|
+
*/
|
|
163
|
+
export function generateOperationId(method, path) {
|
|
164
|
+
// Convert path like /users/{id}/posts to UsersByIdPosts
|
|
165
|
+
const pathParts = path
|
|
166
|
+
.split('/')
|
|
167
|
+
.filter(Boolean)
|
|
168
|
+
.map(part => {
|
|
169
|
+
if (part.startsWith('{') && part.endsWith('}')) {
|
|
170
|
+
return 'By' + capitalize(part.slice(1, -1));
|
|
171
|
+
}
|
|
172
|
+
return capitalize(part);
|
|
173
|
+
})
|
|
174
|
+
.join('');
|
|
175
|
+
return capitalize(method.toLowerCase()) + pathParts;
|
|
176
|
+
}
|
|
177
|
+
function capitalize(str) {
|
|
178
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
179
|
+
}
|
|
180
|
+
function isReference(obj) {
|
|
181
|
+
return typeof obj === 'object' && obj !== null && '$ref' in obj;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for OpenAPI to MCP conversion
|
|
3
|
+
*/
|
|
4
|
+
export interface OpenAPIEndpoint {
|
|
5
|
+
operationId: string;
|
|
6
|
+
method: string;
|
|
7
|
+
path: string;
|
|
8
|
+
summary?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
parameters: EndpointParameter[];
|
|
11
|
+
requestBody?: RequestBodySchema;
|
|
12
|
+
securitySchemes: string[];
|
|
13
|
+
tags: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface EndpointParameter {
|
|
16
|
+
name: string;
|
|
17
|
+
in: 'path' | 'query' | 'header' | 'cookie';
|
|
18
|
+
required: boolean;
|
|
19
|
+
schema: JSONSchemaType;
|
|
20
|
+
description?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface RequestBodySchema {
|
|
23
|
+
required: boolean;
|
|
24
|
+
contentType: string;
|
|
25
|
+
schema: JSONSchemaType;
|
|
26
|
+
}
|
|
27
|
+
export interface JSONSchemaType {
|
|
28
|
+
type?: string | string[];
|
|
29
|
+
format?: string;
|
|
30
|
+
properties?: Record<string, JSONSchemaType>;
|
|
31
|
+
items?: JSONSchemaType;
|
|
32
|
+
required?: string[];
|
|
33
|
+
enum?: unknown[];
|
|
34
|
+
description?: string;
|
|
35
|
+
default?: unknown;
|
|
36
|
+
additionalProperties?: boolean | JSONSchemaType;
|
|
37
|
+
oneOf?: JSONSchemaType[];
|
|
38
|
+
anyOf?: JSONSchemaType[];
|
|
39
|
+
allOf?: JSONSchemaType[];
|
|
40
|
+
$ref?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface McpToolDefinition {
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
inputSchema: JSONSchemaType;
|
|
46
|
+
httpMethod: string;
|
|
47
|
+
pathTemplate: string;
|
|
48
|
+
parameters: EndpointParameter[];
|
|
49
|
+
requestBodyContentType?: string;
|
|
50
|
+
securitySchemes: string[];
|
|
51
|
+
}
|
|
52
|
+
export interface ParsedOpenAPI {
|
|
53
|
+
title: string;
|
|
54
|
+
version: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
baseUrl?: string;
|
|
57
|
+
endpoints: OpenAPIEndpoint[];
|
|
58
|
+
securitySchemes: Record<string, SecurityScheme>;
|
|
59
|
+
}
|
|
60
|
+
export interface SecurityScheme {
|
|
61
|
+
type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect';
|
|
62
|
+
name?: string;
|
|
63
|
+
in?: 'header' | 'query' | 'cookie';
|
|
64
|
+
scheme?: string;
|
|
65
|
+
bearerFormat?: string;
|
|
66
|
+
flows?: OAuthFlows;
|
|
67
|
+
openIdConnectUrl?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface OAuthFlows {
|
|
70
|
+
implicit?: OAuthFlow;
|
|
71
|
+
password?: OAuthFlow;
|
|
72
|
+
clientCredentials?: OAuthFlow;
|
|
73
|
+
authorizationCode?: OAuthFlow;
|
|
74
|
+
}
|
|
75
|
+
export interface OAuthFlow {
|
|
76
|
+
authorizationUrl?: string;
|
|
77
|
+
tokenUrl?: string;
|
|
78
|
+
refreshUrl?: string;
|
|
79
|
+
scopes: Record<string, string>;
|
|
80
|
+
}
|
|
81
|
+
export interface GeneratorOptions {
|
|
82
|
+
name: string;
|
|
83
|
+
version?: string;
|
|
84
|
+
baseUrl: string;
|
|
85
|
+
enabledEndpoints?: Set<string>;
|
|
86
|
+
emcyEnabled?: boolean;
|
|
87
|
+
/**
|
|
88
|
+
* For local development: path to local @emcy/sdk package.
|
|
89
|
+
* When set, generated package.json will use "file:<path>" instead of npm version.
|
|
90
|
+
* Example: "../../packages/emcy-sdk" or "/absolute/path/to/emcy-sdk"
|
|
91
|
+
*/
|
|
92
|
+
localSdkPath?: string;
|
|
93
|
+
}
|
|
94
|
+
export interface GeneratedFiles {
|
|
95
|
+
[path: string]: string;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@emcy/openapi-to-mcp",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public",
|
|
6
|
+
"registry": "https://registry.npmjs.org/"
|
|
7
|
+
},
|
|
8
|
+
"description": "Convert OpenAPI specifications to MCP (Model Context Protocol) servers with optional Emcy telemetry",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"bin": {
|
|
13
|
+
"openapi-to-mcp": "./dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"dev": "tsc --watch",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"test:coverage": "vitest run --coverage",
|
|
33
|
+
"prepublishOnly": "npm run build && npm test"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"mcp",
|
|
37
|
+
"model-context-protocol",
|
|
38
|
+
"openapi",
|
|
39
|
+
"swagger",
|
|
40
|
+
"ai",
|
|
41
|
+
"claude",
|
|
42
|
+
"cursor",
|
|
43
|
+
"llm",
|
|
44
|
+
"tools",
|
|
45
|
+
"api",
|
|
46
|
+
"generator",
|
|
47
|
+
"emcy"
|
|
48
|
+
],
|
|
49
|
+
"author": "Emcy <hello@emcy.ai>",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/emcy-ai/openapi-to-mcp.git"
|
|
54
|
+
},
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/emcy-ai/openapi-to-mcp/issues"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://emcy.ai",
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": ">=20.0.0"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@apidevtools/swagger-parser": "^10.1.1",
|
|
64
|
+
"openapi-types": "^12.1.3",
|
|
65
|
+
"yaml": "^2.7.1"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@types/node": "^22.15.2",
|
|
69
|
+
"typescript": "^5.8.3",
|
|
70
|
+
"vitest": "^3.0.0"
|
|
71
|
+
}
|
|
72
|
+
}
|