@vinkius-core/mcp-fusion-openapi-gen 1.0.0 → 1.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/README.md +71 -106
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/parser/OpenApiParser.d.ts +5 -2
- package/dist/parser/OpenApiParser.d.ts.map +1 -1
- package/dist/parser/OpenApiParser.js +13 -5
- package/dist/parser/OpenApiParser.js.map +1 -1
- package/dist/parser/Swagger2Converter.d.ts +30 -0
- package/dist/parser/Swagger2Converter.d.ts.map +1 -0
- package/dist/parser/Swagger2Converter.js +197 -0
- package/dist/parser/Swagger2Converter.js.map +1 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<h1 align="center">@vinkius-core/mcp-fusion-openapi-gen</h1>
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>OpenAPI 3.x / Swagger 2.0 → MCP Fusion Server Generator</strong> — Parse any spec, generate a complete MCP server
|
|
5
|
+
</p>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://www.npmjs.com/package/@vinkius-core/mcp-fusion-openapi-gen"><img src="https://img.shields.io/npm/v/@vinkius-core/mcp-fusion-openapi-gen?color=blue" alt="npm" /></a>
|
|
10
|
+
<a href="https://github.com/vinkius-labs/mcp-fusion/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-green" alt="License" /></a>
|
|
11
|
+
<img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node" />
|
|
12
|
+
</p>
|
|
10
13
|
|
|
11
14
|
---
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
> Parse any **OpenAPI 3.x** or **Swagger 2.0** spec and generate a **complete, ready-to-run MCP Server** powered by MCP Fusion — with Presenters, Tools, ToolRegistry, and server bootstrap. All features configurable via YAML.
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
## What It Generates
|
|
16
19
|
|
|
17
20
|
```
|
|
18
21
|
output/
|
|
@@ -29,36 +32,23 @@ output/
|
|
|
29
32
|
└── index.ts # ToolRegistry + registerAll barrel
|
|
30
33
|
```
|
|
31
34
|
|
|
32
|
-
Every file follows the **
|
|
33
|
-
|
|
34
|
-
## Installation
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
npm install @vinkius-core/mcp-fusion-openapi-gen
|
|
38
|
-
```
|
|
35
|
+
Every file follows the **MVA Convention** — the standard directory structure for MCP Fusion projects.
|
|
39
36
|
|
|
40
37
|
## Quick Start
|
|
41
38
|
|
|
42
|
-
### 1. Generate from OpenAPI spec
|
|
43
|
-
|
|
44
39
|
```bash
|
|
40
|
+
# 1. Generate from OpenAPI spec
|
|
45
41
|
npx openapi-gen --input ./petstore.yaml --output ./generated
|
|
46
|
-
```
|
|
47
42
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
```bash
|
|
43
|
+
# 2. Run the generated server
|
|
51
44
|
API_BASE_URL=https://api.example.com npx tsx ./generated/server.ts
|
|
52
45
|
```
|
|
53
46
|
|
|
54
|
-
That's it — you have a fully functional MCP Server.
|
|
55
|
-
|
|
56
47
|
## Configuration
|
|
57
48
|
|
|
58
|
-
Create an `openapi-gen.yaml` file in your project root
|
|
49
|
+
Create an `openapi-gen.yaml` file in your project root:
|
|
59
50
|
|
|
60
51
|
```yaml
|
|
61
|
-
# openapi-gen.yaml
|
|
62
52
|
input: ./specs/petstore.yaml
|
|
63
53
|
output: ./generated
|
|
64
54
|
|
|
@@ -67,36 +57,18 @@ features:
|
|
|
67
57
|
annotations: true # Infer readOnly, destructive, idempotent from HTTP method
|
|
68
58
|
presenters: true # Generate Presenter files with response schemas
|
|
69
59
|
descriptions: true # Include summaries/descriptions on actions
|
|
70
|
-
toonDescription: false # Enable TOON-optimized descriptions
|
|
71
60
|
serverFile: true # Generate server.ts bootstrap
|
|
72
61
|
deprecated: comment # 'include' | 'skip' | 'comment'
|
|
73
62
|
|
|
74
63
|
naming:
|
|
75
64
|
style: snake_case # 'snake_case' | 'camelCase'
|
|
76
|
-
deduplication: true # Auto-suffix duplicates
|
|
65
|
+
deduplication: true # Auto-suffix duplicates
|
|
77
66
|
|
|
78
67
|
server:
|
|
79
68
|
name: petstore-mcp
|
|
80
69
|
version: 1.0.0
|
|
81
|
-
transport: stdio
|
|
82
|
-
toolExposition: flat
|
|
83
|
-
actionSeparator: '_' # Flat mode delimiter: pet_get_by_id
|
|
84
|
-
|
|
85
|
-
context:
|
|
86
|
-
import: '../types.js#AppCtx' # Custom context type
|
|
87
|
-
|
|
88
|
-
# Tag filtering
|
|
89
|
-
includeTags:
|
|
90
|
-
- pet
|
|
91
|
-
- store
|
|
92
|
-
excludeTags:
|
|
93
|
-
- internal
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Auto-detected when present, or pass explicitly:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
npx openapi-gen --config ./openapi-gen.yaml
|
|
70
|
+
transport: stdio # 'stdio' | 'sse'
|
|
71
|
+
toolExposition: flat # 'flat' | 'grouped'
|
|
100
72
|
```
|
|
101
73
|
|
|
102
74
|
## CLI Options
|
|
@@ -105,84 +77,65 @@ npx openapi-gen --config ./openapi-gen.yaml
|
|
|
105
77
|
|------|-------------|---------|
|
|
106
78
|
| `--input <path>` | Path to OpenAPI YAML/JSON spec | From config |
|
|
107
79
|
| `--output <dir>` | Output directory | `./generated` |
|
|
108
|
-
| `--config <path>` | Path to config file | Auto-detect
|
|
80
|
+
| `--config <path>` | Path to config file | Auto-detect |
|
|
109
81
|
| `--base-url <expr>` | Base URL expression for fetch calls | `ctx.baseUrl` |
|
|
110
82
|
| `--server-name <name>` | MCP Server name | `openapi-mcp-server` |
|
|
111
83
|
| `--context <import>` | Custom context type import | Default `ApiContext` |
|
|
112
84
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
## Generated Code Features
|
|
116
|
-
|
|
117
|
-
### Annotations (from HTTP Method)
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
// GET → readOnly: true
|
|
121
|
-
// DELETE → destructive: true
|
|
122
|
-
// PUT → idempotent: true
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Coerced Path/Query Parameters
|
|
85
|
+
## Programmatic API
|
|
126
86
|
|
|
127
87
|
```typescript
|
|
128
|
-
|
|
129
|
-
petId: z.coerce.number().int().describe('ID of pet to return')
|
|
130
|
-
```
|
|
88
|
+
import { parseOpenAPI, mapEndpoints, emitFiles, mergeConfig } from '@vinkius-core/mcp-fusion-openapi-gen';
|
|
131
89
|
|
|
132
|
-
|
|
90
|
+
const spec = parseOpenAPI(yamlString);
|
|
91
|
+
const mapped = mapEndpoints(spec);
|
|
92
|
+
const config = mergeConfig({ features: { tags: true }, includeTags: ['pet'] });
|
|
93
|
+
const files = emitFiles(mapped, config);
|
|
133
94
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
get_pet_by_id: {
|
|
137
|
-
returns: PetPresenter,
|
|
138
|
-
// ...
|
|
95
|
+
for (const file of files) {
|
|
96
|
+
writeFileSync(`./out/${file.path}`, file.content);
|
|
139
97
|
}
|
|
140
98
|
```
|
|
141
99
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
Only generate tools for the tags you need:
|
|
145
|
-
|
|
146
|
-
```yaml
|
|
147
|
-
includeTags: [pet] # Only pet tools
|
|
148
|
-
excludeTags: [internal] # Everything except internal
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Custom Context
|
|
100
|
+
## Swagger 2.0 Support
|
|
152
101
|
|
|
153
|
-
|
|
102
|
+
Swagger 2.0 specs are **automatically detected and converted** to OpenAPI 3.0 internally. No extra configuration needed — just point to your spec:
|
|
154
103
|
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
|
|
104
|
+
```bash
|
|
105
|
+
# Works with Swagger 2.0 specs out of the box
|
|
106
|
+
npx openapi-gen --input ./petstore-v2.json --output ./generated
|
|
158
107
|
```
|
|
159
108
|
|
|
160
|
-
|
|
109
|
+
The converter handles:
|
|
161
110
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
111
|
+
| Swagger 2.0 | → OpenAPI 3.0 |
|
|
112
|
+
|---|---|
|
|
113
|
+
| `host` + `basePath` + `schemes` | `servers` array |
|
|
114
|
+
| `definitions` | `components.schemas` |
|
|
115
|
+
| `parameters[in: body]` | `requestBody` |
|
|
116
|
+
| `parameters[in: formData]` | `requestBody` (multipart) |
|
|
117
|
+
| `#/definitions/Pet` | `#/components/schemas/Pet` |
|
|
118
|
+
| `produces` / `consumes` | Per-operation `content` types |
|
|
166
119
|
|
|
167
|
-
|
|
120
|
+
Runtime mode (`loadOpenAPI()`) also accepts Swagger 2.0:
|
|
168
121
|
|
|
169
122
|
```typescript
|
|
170
|
-
import {
|
|
171
|
-
|
|
172
|
-
const spec = parseOpenAPI(yamlString);
|
|
173
|
-
const mapped = mapEndpoints(spec);
|
|
174
|
-
const config = mergeConfig({ features: { tags: true }, includeTags: ['pet'] });
|
|
175
|
-
const files = emitFiles(mapped, config);
|
|
123
|
+
import { loadOpenAPI } from '@vinkius-core/mcp-fusion-openapi-gen';
|
|
176
124
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
125
|
+
// Swagger 2.0 JSON — auto-converted internally
|
|
126
|
+
const tools = loadOpenAPI(swagger2Json, { baseUrl: 'https://petstore.swagger.io/v2' });
|
|
127
|
+
registry.registerAll(...tools);
|
|
180
128
|
```
|
|
181
129
|
|
|
182
130
|
## Pipeline
|
|
183
131
|
|
|
184
132
|
```
|
|
185
|
-
OpenAPI 3.x Spec (YAML/JSON)
|
|
133
|
+
OpenAPI 3.x / Swagger 2.0 Spec (YAML/JSON)
|
|
134
|
+
│
|
|
135
|
+
▼
|
|
136
|
+
┌──────────────────┐
|
|
137
|
+
│ Swagger2Converter │ → Auto-detect & convert 2.0 → 3.0 (if needed)
|
|
138
|
+
└──────────────────┘
|
|
186
139
|
│
|
|
187
140
|
▼
|
|
188
141
|
┌─────────────┐
|
|
@@ -200,12 +153,24 @@ OpenAPI 3.x Spec (YAML/JSON)
|
|
|
200
153
|
└────────────┘
|
|
201
154
|
```
|
|
202
155
|
|
|
156
|
+
## Installation
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npm install @vinkius-core/mcp-fusion-openapi-gen
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Peer Dependencies
|
|
163
|
+
|
|
164
|
+
| Package | Version |
|
|
165
|
+
|---------|---------|
|
|
166
|
+
| `@vinkius-core/mcp-fusion` | `^2.0.0` |
|
|
167
|
+
| `zod` | `^3.25.1 \|\| ^4.0.0` |
|
|
168
|
+
|
|
203
169
|
## Requirements
|
|
204
170
|
|
|
205
|
-
- Node.js ≥ 18
|
|
206
|
-
-
|
|
207
|
-
- `zod` ^3.25.1 || ^4.0.0 (peer dependency)
|
|
171
|
+
- **Node.js** ≥ 18.0.0
|
|
172
|
+
- **MCP Fusion** ≥ 2.0.0 (peer dependency)
|
|
208
173
|
|
|
209
174
|
## License
|
|
210
175
|
|
|
211
|
-
Apache-2.0
|
|
176
|
+
[Apache-2.0](https://github.com/vinkius-labs/mcp-fusion/blob/main/LICENSE)
|
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export type { CliOverrides } from './config/ConfigLoader.js';
|
|
|
21
21
|
export { parseOpenAPI } from './parser/OpenApiParser.js';
|
|
22
22
|
export type { ApiSpec, ApiGroup, ApiAction, ApiParam, ApiResponseSchema, ApiServer, SchemaNode, } from './parser/types.js';
|
|
23
23
|
export { resolveRefs } from './parser/RefResolver.js';
|
|
24
|
+
export { isSwagger2, convertSwagger2ToV3 } from './parser/Swagger2Converter.js';
|
|
24
25
|
export { compileZod, compileInputSchema, compileResponseSchema } from './schema/ZodCompiler.js';
|
|
25
26
|
export { mapEndpoints, inferAnnotations } from './mapper/EndpointMapper.js';
|
|
26
27
|
export { emitFiles } from './emitter/CodeEmitter.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC1E,YAAY,EACR,eAAe,EAAE,YAAY,EAAE,YAAY,EAC3C,aAAa,EAAE,YAAY,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EACR,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EACtC,iBAAiB,EAAE,SAAS,EAAE,UAAU,GAC3C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC1E,YAAY,EACR,eAAe,EAAE,YAAY,EAAE,YAAY,EAC3C,aAAa,EAAE,YAAY,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EACR,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EACtC,iBAAiB,EAAE,SAAS,EAAE,UAAU,GAC3C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGhF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhG,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG5E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGtF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,7 @@ export { loadConfig, applyCliOverrides } from './config/ConfigLoader.js';
|
|
|
20
20
|
// ── Parser ───────────────────────────────────────────────
|
|
21
21
|
export { parseOpenAPI } from './parser/OpenApiParser.js';
|
|
22
22
|
export { resolveRefs } from './parser/RefResolver.js';
|
|
23
|
+
export { isSwagger2, convertSwagger2ToV3 } from './parser/Swagger2Converter.js';
|
|
23
24
|
// ── Zod Compiler ─────────────────────────────────────────
|
|
24
25
|
export { compileZod, compileInputSchema, compileResponseSchema } from './schema/ZodCompiler.js';
|
|
25
26
|
// ── Endpoint Mapper ──────────────────────────────────────
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAK1E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGzE,4DAA4D;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAK1E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGzE,4DAA4D;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,4DAA4D;AAC5D,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhG,4DAA4D;AAC5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE5E,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,4DAA4D;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEtF,4DAA4D;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { ApiSpec, ApiGroup, ApiAction, ApiParam, ApiResponseSchema, ApiServer, SchemaNode } from './types.js';
|
|
2
2
|
export type { ApiSpec, ApiGroup, ApiAction, ApiParam, ApiResponseSchema, ApiServer, SchemaNode };
|
|
3
3
|
/**
|
|
4
|
-
* Parse an OpenAPI 3.x specification into the normalized IR.
|
|
4
|
+
* Parse an OpenAPI 3.x or Swagger 2.0 specification into the normalized IR.
|
|
5
|
+
*
|
|
6
|
+
* Swagger 2.0 documents are automatically converted to OpenAPI 3.0
|
|
7
|
+
* format before processing.
|
|
5
8
|
*
|
|
6
9
|
* @param input - YAML string, JSON string, or pre-parsed object
|
|
7
10
|
* @returns Normalized {@link ApiSpec}
|
|
8
|
-
* @throws If the input is not a valid OpenAPI
|
|
11
|
+
* @throws If the input is not a valid OpenAPI document
|
|
9
12
|
*/
|
|
10
13
|
export declare function parseOpenAPI(input: string | object): ApiSpec;
|
|
11
14
|
//# sourceMappingURL=OpenApiParser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenApiParser.d.ts","sourceRoot":"","sources":["../../src/parser/OpenApiParser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OpenApiParser.d.ts","sourceRoot":"","sources":["../../src/parser/OpenApiParser.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACR,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EACtC,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAC3C,MAAM,YAAY,CAAC;AAIpB,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AAiDjG;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAyG5D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenApiParser — OpenAPI 3.x → IR Converter
|
|
2
|
+
* OpenApiParser — OpenAPI 3.x / Swagger 2.0 → IR Converter
|
|
3
3
|
*
|
|
4
4
|
* Accepts YAML or JSON input (string or pre-parsed object) and produces
|
|
5
5
|
* a normalized {@link ApiSpec} intermediate representation. Resolves all
|
|
@@ -10,21 +10,29 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { parse as parseYaml } from 'yaml';
|
|
12
12
|
import { resolveRefs } from './RefResolver.js';
|
|
13
|
+
import { isSwagger2, convertSwagger2ToV3 } from './Swagger2Converter.js';
|
|
13
14
|
// ── HTTP Methods ─────────────────────────────────────────
|
|
14
15
|
const HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']);
|
|
15
16
|
// ── Parser ───────────────────────────────────────────────
|
|
16
17
|
/**
|
|
17
|
-
* Parse an OpenAPI 3.x specification into the normalized IR.
|
|
18
|
+
* Parse an OpenAPI 3.x or Swagger 2.0 specification into the normalized IR.
|
|
19
|
+
*
|
|
20
|
+
* Swagger 2.0 documents are automatically converted to OpenAPI 3.0
|
|
21
|
+
* format before processing.
|
|
18
22
|
*
|
|
19
23
|
* @param input - YAML string, JSON string, or pre-parsed object
|
|
20
24
|
* @returns Normalized {@link ApiSpec}
|
|
21
|
-
* @throws If the input is not a valid OpenAPI
|
|
25
|
+
* @throws If the input is not a valid OpenAPI document
|
|
22
26
|
*/
|
|
23
27
|
export function parseOpenAPI(input) {
|
|
24
|
-
|
|
28
|
+
let raw = typeof input === 'string' ? parseInput(input) : input;
|
|
29
|
+
// Auto-convert Swagger 2.0 → OpenAPI 3.0
|
|
30
|
+
if (isSwagger2(raw)) {
|
|
31
|
+
raw = convertSwagger2ToV3(raw);
|
|
32
|
+
}
|
|
25
33
|
// Validate OpenAPI version
|
|
26
34
|
if (!raw.openapi?.startsWith('3.')) {
|
|
27
|
-
throw new Error(`Unsupported OpenAPI version: "${raw.openapi ?? 'missing'}".
|
|
35
|
+
throw new Error(`Unsupported OpenAPI version: "${raw.openapi ?? 'missing'}". OpenAPI 3.x or Swagger 2.0 required.`);
|
|
28
36
|
}
|
|
29
37
|
// Resolve all $ref pointers in-place
|
|
30
38
|
resolveRefs(raw);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenApiParser.js","sourceRoot":"","sources":["../../src/parser/OpenApiParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenApiParser.js","sourceRoot":"","sources":["../../src/parser/OpenApiParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swagger2Converter — Swagger 2.0 → OpenAPI 3.0 Adapter
|
|
3
|
+
*
|
|
4
|
+
* Converts a Swagger 2.0 document into an OpenAPI 3.0-compatible
|
|
5
|
+
* structure so the existing parser can handle both versions.
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - `host` + `basePath` + `schemes` → `servers`
|
|
9
|
+
* - `definitions` → `components.schemas`
|
|
10
|
+
* - `parameters` with `in: body` → `requestBody`
|
|
11
|
+
* - `produces`/`consumes` → per-operation `content` types
|
|
12
|
+
* - `$ref` prefix rewrite (`#/definitions/` → `#/components/schemas/`)
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
type AnyObj = Record<string, any>;
|
|
17
|
+
/**
|
|
18
|
+
* Returns `true` if the input looks like a Swagger 2.0 document.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isSwagger2(raw: Record<string, unknown>): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Convert a Swagger 2.0 document into an OpenAPI 3.0-equivalent object.
|
|
23
|
+
*
|
|
24
|
+
* The output is NOT a valid 3.0 spec in every edge case, but it is
|
|
25
|
+
* structurally close enough for the existing parser to produce a
|
|
26
|
+
* correct {@link ApiSpec} IR.
|
|
27
|
+
*/
|
|
28
|
+
export declare function convertSwagger2ToV3(raw: Record<string, unknown>): AnyObj;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=Swagger2Converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Swagger2Converter.d.ts","sourceRoot":"","sources":["../../src/parser/Swagger2Converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgDH,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAIlC;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGhE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAiBxE"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swagger2Converter — Swagger 2.0 → OpenAPI 3.0 Adapter
|
|
3
|
+
*
|
|
4
|
+
* Converts a Swagger 2.0 document into an OpenAPI 3.0-compatible
|
|
5
|
+
* structure so the existing parser can handle both versions.
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - `host` + `basePath` + `schemes` → `servers`
|
|
9
|
+
* - `definitions` → `components.schemas`
|
|
10
|
+
* - `parameters` with `in: body` → `requestBody`
|
|
11
|
+
* - `produces`/`consumes` → per-operation `content` types
|
|
12
|
+
* - `$ref` prefix rewrite (`#/definitions/` → `#/components/schemas/`)
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
// ── Public ───────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Returns `true` if the input looks like a Swagger 2.0 document.
|
|
19
|
+
*/
|
|
20
|
+
export function isSwagger2(raw) {
|
|
21
|
+
const ver = raw['swagger'];
|
|
22
|
+
return typeof ver === 'string' && ver.startsWith('2.');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Convert a Swagger 2.0 document into an OpenAPI 3.0-equivalent object.
|
|
26
|
+
*
|
|
27
|
+
* The output is NOT a valid 3.0 spec in every edge case, but it is
|
|
28
|
+
* structurally close enough for the existing parser to produce a
|
|
29
|
+
* correct {@link ApiSpec} IR.
|
|
30
|
+
*/
|
|
31
|
+
export function convertSwagger2ToV3(raw) {
|
|
32
|
+
const doc = raw;
|
|
33
|
+
const v3 = {
|
|
34
|
+
openapi: '3.0.0',
|
|
35
|
+
info: doc.info ?? { title: 'Untitled', version: '0.0.0' },
|
|
36
|
+
servers: buildServers(doc),
|
|
37
|
+
paths: convertPaths(doc.paths ?? {}, doc.consumes, doc.produces),
|
|
38
|
+
tags: doc.tags,
|
|
39
|
+
};
|
|
40
|
+
// Move definitions → components.schemas
|
|
41
|
+
if (doc.definitions) {
|
|
42
|
+
v3['components'] = { schemas: doc.definitions };
|
|
43
|
+
}
|
|
44
|
+
return v3;
|
|
45
|
+
}
|
|
46
|
+
// ── Internals ────────────────────────────────────────────
|
|
47
|
+
function buildServers(doc) {
|
|
48
|
+
const host = doc.host ?? 'localhost';
|
|
49
|
+
const basePath = doc.basePath ?? '/';
|
|
50
|
+
const schemes = doc.schemes ?? ['https'];
|
|
51
|
+
return schemes.map(s => ({ url: `${s}://${host}${basePath}`.replace(/\/+$/, '') }));
|
|
52
|
+
}
|
|
53
|
+
function convertPaths(paths, globalConsumes, globalProduces) {
|
|
54
|
+
const converted = {};
|
|
55
|
+
const httpMethods = new Set(['get', 'post', 'put', 'patch', 'delete', 'head', 'options']);
|
|
56
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
57
|
+
if (!pathItem || typeof pathItem !== 'object')
|
|
58
|
+
continue;
|
|
59
|
+
const newPathItem = {};
|
|
60
|
+
for (const [key, value] of Object.entries(pathItem)) {
|
|
61
|
+
if (!httpMethods.has(key)) {
|
|
62
|
+
// Copy non-HTTP keys (e.g. path-level parameters)
|
|
63
|
+
if (key === 'parameters') {
|
|
64
|
+
newPathItem[key] = convertNonBodyParams(value);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
newPathItem[key] = value;
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const op = value;
|
|
72
|
+
const newOp = {
|
|
73
|
+
operationId: op.operationId,
|
|
74
|
+
summary: op.summary,
|
|
75
|
+
description: op.description,
|
|
76
|
+
tags: op.tags,
|
|
77
|
+
deprecated: op.deprecated,
|
|
78
|
+
};
|
|
79
|
+
// Split parameters into body vs non-body
|
|
80
|
+
const rawParams = op.parameters ?? [];
|
|
81
|
+
const bodyParam = rawParams.find(p => p.in === 'body');
|
|
82
|
+
const formParams = rawParams.filter(p => p.in === 'formData');
|
|
83
|
+
const otherParams = rawParams.filter(p => p.in !== 'body' && p.in !== 'formData');
|
|
84
|
+
// Convert non-body params (add schema wrapper for v2 type→schema)
|
|
85
|
+
newOp['parameters'] = convertNonBodyParams(otherParams);
|
|
86
|
+
// body → requestBody
|
|
87
|
+
if (bodyParam) {
|
|
88
|
+
const consumes = op.consumes ?? globalConsumes ?? ['application/json'];
|
|
89
|
+
const content = {};
|
|
90
|
+
for (const mime of consumes) {
|
|
91
|
+
content[mime] = { schema: rewriteRefs(bodyParam.schema ?? {}) };
|
|
92
|
+
}
|
|
93
|
+
newOp['requestBody'] = {
|
|
94
|
+
required: bodyParam.required ?? false,
|
|
95
|
+
...(bodyParam.description ? { description: bodyParam.description } : {}),
|
|
96
|
+
content,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// formData → requestBody (multipart or urlencoded)
|
|
100
|
+
if (!bodyParam && formParams.length > 0) {
|
|
101
|
+
const consumes = op.consumes ?? globalConsumes ?? ['application/x-www-form-urlencoded'];
|
|
102
|
+
const properties = {};
|
|
103
|
+
const required = [];
|
|
104
|
+
for (const fp of formParams) {
|
|
105
|
+
properties[fp.name] = { type: fp.type ?? 'string' };
|
|
106
|
+
if (fp.description)
|
|
107
|
+
properties[fp.name]['description'] = fp.description;
|
|
108
|
+
if (fp.required)
|
|
109
|
+
required.push(fp.name);
|
|
110
|
+
}
|
|
111
|
+
const schema = { type: 'object', properties };
|
|
112
|
+
if (required.length > 0)
|
|
113
|
+
schema['required'] = required;
|
|
114
|
+
const content = {};
|
|
115
|
+
for (const mime of consumes) {
|
|
116
|
+
content[mime] = { schema };
|
|
117
|
+
}
|
|
118
|
+
newOp['requestBody'] = { content };
|
|
119
|
+
}
|
|
120
|
+
// Convert responses
|
|
121
|
+
if (op.responses) {
|
|
122
|
+
const produces = op.produces ?? globalProduces ?? ['application/json'];
|
|
123
|
+
const newResponses = {};
|
|
124
|
+
for (const [code, resp] of Object.entries(op.responses)) {
|
|
125
|
+
const newResp = {};
|
|
126
|
+
if (resp.description)
|
|
127
|
+
newResp['description'] = resp.description;
|
|
128
|
+
if (resp.schema) {
|
|
129
|
+
newResp['content'] = {};
|
|
130
|
+
for (const mime of produces) {
|
|
131
|
+
newResp['content'][mime] = { schema: rewriteRefs(resp.schema) };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
newResponses[code] = newResp;
|
|
135
|
+
}
|
|
136
|
+
newOp['responses'] = newResponses;
|
|
137
|
+
}
|
|
138
|
+
newPathItem[key] = newOp;
|
|
139
|
+
}
|
|
140
|
+
converted[path] = newPathItem;
|
|
141
|
+
}
|
|
142
|
+
return converted;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Convert v2 parameters (which embed type directly) to v3 format (schema wrapper).
|
|
146
|
+
*/
|
|
147
|
+
function convertNonBodyParams(params) {
|
|
148
|
+
return params.map(p => {
|
|
149
|
+
if (p.schema)
|
|
150
|
+
return p; // Already has schema (v3 style)
|
|
151
|
+
const schema = {};
|
|
152
|
+
if (p.type)
|
|
153
|
+
schema['type'] = p.type;
|
|
154
|
+
if (p.format)
|
|
155
|
+
schema['format'] = p.format;
|
|
156
|
+
if (p.enum)
|
|
157
|
+
schema['enum'] = p.enum;
|
|
158
|
+
if (p.default !== undefined)
|
|
159
|
+
schema['default'] = p.default;
|
|
160
|
+
if (p.items)
|
|
161
|
+
schema['items'] = p.items;
|
|
162
|
+
const converted = {
|
|
163
|
+
name: p.name,
|
|
164
|
+
in: p.in,
|
|
165
|
+
schema,
|
|
166
|
+
};
|
|
167
|
+
if (p.required !== undefined)
|
|
168
|
+
converted['required'] = p.required;
|
|
169
|
+
if (p.description)
|
|
170
|
+
converted['description'] = p.description;
|
|
171
|
+
return converted;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Deep-rewrite `$ref` paths from v2 format to v3 format.
|
|
176
|
+
* `#/definitions/Pet` → `#/components/schemas/Pet`
|
|
177
|
+
*/
|
|
178
|
+
function rewriteRefs(obj) {
|
|
179
|
+
if (obj === null || obj === undefined)
|
|
180
|
+
return obj;
|
|
181
|
+
if (typeof obj !== 'object')
|
|
182
|
+
return obj;
|
|
183
|
+
if (Array.isArray(obj)) {
|
|
184
|
+
return obj.map(item => rewriteRefs(item));
|
|
185
|
+
}
|
|
186
|
+
const result = {};
|
|
187
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
188
|
+
if (key === '$ref' && typeof value === 'string') {
|
|
189
|
+
result[key] = value.replace('#/definitions/', '#/components/schemas/');
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
result[key] = rewriteRefs(value);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=Swagger2Converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Swagger2Converter.js","sourceRoot":"","sources":["../../src/parser/Swagger2Converter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vinkius-core/mcp-fusion-openapi-gen",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "OpenAPI-to-MCP Fusion Server Generator. Parses OpenAPI 3.x specs and generates a complete, ready-to-run MCP Server with full MVA tool stacks (Presenters, Tools, Registry, Server) — all features configurable via YAML.",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "OpenAPI-to-MCP Fusion Server Generator. Parses OpenAPI 3.x and Swagger 2.0 specs and generates a complete, ready-to-run MCP Server with full MVA tool stacks (Presenters, Tools, Registry, Server) — all features configurable via YAML.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"license": "Apache-2.0",
|
|
65
65
|
"devDependencies": {
|
|
66
|
-
"@types/node": "^25.3.0"
|
|
66
|
+
"@types/node": "^25.3.0",
|
|
67
|
+
"@vinkius-core/mcp-fusion": ">=2.14.0"
|
|
67
68
|
}
|
|
68
69
|
}
|