# Swagger2OpenAPI ้ๆๅฎ็ฐๆนๆก
## 1. swagger2openapi ๅ
ไป็ป
### 1.1 ๅ
็ไฝ็จ
`swagger2openapi` ๆฏไธไธชไธ้จ็จไบๅฐ Swagger 2.0 (OpenAPI 2.0) ่ง่่ฝฌๆขไธบ OpenAPI 3.0.x ่ง่็ Node.js ๅ
ใๅฎๅ
ทๆไปฅไธไธป่ฆๅ่ฝ๏ผ
- **่ชๅจ่ฝฌๆข**๏ผๅฐ Swagger 2.0 ่ง่่ชๅจ่ฝฌๆขไธบ OpenAPI 3.0.x ๆ ผๅผ
- **ๅผ็จไฟๆค**๏ผ้ป่ฎคไฟ็ๅ ไนๆๆ็ `$ref` JSON ๅผ็จ๏ผไธไผ่งฃๅผ็จๆๆ้กน็ฎ
- **ๆจกๅผ่ฝฌๆข**๏ผ่ชๅจ"ไฟฎๅค"ไธๅ
ผๅฎน็ Swagger 2.0 ๆจกๅผ้ฎ้ข
- **้ช่ฏๅ่ฝ**๏ผๅ
็ฝฎ OpenAPI 3.0.x ้ช่ฏๅ่ฝ
- **ๅค็ง่พๅ
ฅๆบ**๏ผๆฏๆไปๆไปถใURLใๅญ็ฌฆไธฒ็ญๅค็งๆนๅผๅ ่ฝฝ่ง่
- **่ง่ๆฉๅฑ**๏ผๆฏๆๆ้็็ฐๅฎไธ็่ง่ๆฉๅฑ
### 1.2 ๆ ธๅฟ็นๆง
- **ๅผ็จไฟๆค**๏ผไฟๆ `$ref` ๅผ็จ่ไธๆฏๅฎๅ
จ่งฃๅผ็จ
- **้่ฏฏไฟฎๅค**๏ผ่ชๅจไฟฎๅคๅฐ้่ฏฏ๏ผpatch ๆจกๅผ๏ผ
- **็ตๆดป้
็ฝฎ**๏ผไธฐๅฏ็้
็ฝฎ้้กน
- **ๅคๆ ผๅผๆฏๆ**๏ผๆฏๆ JSON ๅ YAML ๆ ผๅผ
- **้ซๆง่ฝ**๏ผ็ป่ฟ 74,426 ไธช็ๅฎไธ็ Swagger 2.0 ๅฎไน็ๆต่ฏ
## 2. ๅจ mcp-swagger-parser ไธญ็ๅบ็จๅบๆฏ
### 2.1 ๅฝๅ็็น
- ่ฎธๅคไผ ็ป API ไป็ถไฝฟ็จ Swagger 2.0 ๆ ผๅผ
- ็ฐๆ็ `@apidevtools/swagger-parser` ไธป่ฆ้ๅฏน OpenAPI 3.0+
- ้่ฆๆๅจๅค็ Swagger 2.0 ๅฐ OpenAPI 3.0 ็่ฝฌๆข
### 2.2 ้ๆๆถ็
- **่ชๅจๅ
ผๅฎน**๏ผๆ ็ผๆฏๆ Swagger 2.0 ่ง่
- **้ๆ่ฝฌๆข**๏ผ็จๆทๆ ้ๅ
ณๅฟๅบๅฑ็ๆฌ่ฝฌๆข
- **ๅๅฐ้่ฏฏ**๏ผ่ชๅจไฟฎๅคๅธธ่ง็ Swagger 2.0 ้ฎ้ข
- **ๆๅไฝ้ช**๏ผ็ปไธ็ API ๆฅๅฃๅค็ไธค็งๆ ผๅผ
## 3. ๆๆฏๅฎ็ฐๆนๆก
### 3.1 ๆถๆ่ฎพ่ฎก
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ OpenAPIParser โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ URL Parser โ โ File Parser โ โ Text Parser โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Version Detection & Conversion โ โ
โ โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Swagger 2.0 โ โ OpenAPI 3.0+ โ โ โ
โ โ โ Detection โ โ Direct Parse โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ โ โ โ
โ โ โผ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโ โ โ โ
โ โ โ swagger2openapi โ โ โ โ
โ โ โ Conversion โ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโ โ โ โ
โ โ โ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ Validator โ โ Normalizer โ โ Transformer โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### 3.2 ๆ ธๅฟ็ปไปถๅฎ็ฐ
#### 3.2.1 ็ๆฌๆฃๆตๅจ (VersionDetector)
```typescript
export class VersionDetector {
static detect(spec: any): 'swagger2' | 'openapi3' | 'unknown' {
if (spec.swagger && spec.swagger.startsWith('2.')) {
return 'swagger2';
}
if (spec.openapi && spec.openapi.startsWith('3.')) {
return 'openapi3';
}
return 'unknown';
}
}
```
#### 3.2.2 Swagger2OpenAPI ่ฝฌๆขๅจ (Swagger2OpenAPIConverter)
```typescript
import * as swagger2openapi from 'swagger2openapi';
export class Swagger2OpenAPIConverter {
private options: swagger2openapi.Options;
constructor(options: ConversionOptions = {}) {
this.options = {
patch: true, // ไฟฎๅคๅฐ้่ฏฏ
warnOnly: false, // ้ๅฐ้่ฏฏๆถๆๅบๅผๅธธ
resolveInternal: false, // ไธ่งฃๆๅ
้จๅผ็จ
...options
};
}
async convert(swagger2Spec: any): Promise<OpenAPISpec> {
try {
const result = await swagger2openapi.convertObj(swagger2Spec, this.options);
return result.openapi;
} catch (error) {
throw new Swagger2OpenAPIConversionError(
`Failed to convert Swagger 2.0 to OpenAPI 3.0: ${error.message}`,
error
);
}
}
}
```
#### 3.2.3 ๅขๅผบ็่งฃๆๅจ (EnhancedParser)
```typescript
export class EnhancedParser extends OpenAPIParser {
private converter: Swagger2OpenAPIConverter;
constructor(config: ParserConfig = {}) {
super(config);
this.converter = new Swagger2OpenAPIConverter({
patch: config.autoFix !== false,
warnOnly: !config.strictMode
});
}
protected async processSpec(
spec: any,
metadata: Partial<ParseResult['metadata']>
): Promise<ParseResult> {
// ๆฃๆต็ๆฌ
const version = VersionDetector.detect(spec);
// ๅฆๆๆฏ Swagger 2.0๏ผๅ
่ฝฌๆขไธบ OpenAPI 3.0
if (version === 'swagger2') {
console.log('ๆฃๆตๅฐ Swagger 2.0 ่ง่๏ผๆญฃๅจ่ฝฌๆขไธบ OpenAPI 3.0...');
spec = await this.converter.convert(spec);
// ๆดๆฐๅ
ๆฐๆฎ
metadata.conversionPerformed = true;
metadata.originalVersion = 'swagger2';
metadata.targetVersion = 'openapi3';
}
// ่ฐ็จ็ถ็ฑปๅค็้ป่พ
return super.processSpec(spec, metadata);
}
}
```
### 3.3 ้
็ฝฎ้้กนๆฉๅฑ
#### 3.3.1 ๆฐๅข้
็ฝฎๆฅๅฃ
```typescript
export interface EnhancedParserConfig extends ParserConfig {
// Swagger 2.0 ่ฝฌๆข้้กน
swagger2Options?: {
patch?: boolean; // ๆฏๅฆไฟฎๅคๅฐ้่ฏฏ
warnOnly?: boolean; // ๆฏๅฆไป
่ญฆๅ่ไธๆๅบๅผๅธธ
resolveInternal?: boolean; // ๆฏๅฆ่งฃๆๅ
้จๅผ็จ
targetVersion?: string; // ็ฎๆ OpenAPI ็ๆฌ
preserveRefs?: boolean; // ๆฏๅฆไฟ็ๅผ็จ
};
// ่ชๅจๆฃๆตๅ่ฝฌๆข
autoConvert?: boolean; // ๆฏๅฆ่ชๅจ่ฝฌๆข Swagger 2.0
autoFix?: boolean; // ๆฏๅฆ่ชๅจไฟฎๅค้่ฏฏ
}
```
#### 3.3.2 ้ป่ฎค้
็ฝฎ
```typescript
export const ENHANCED_DEFAULT_CONFIG: Required<EnhancedParserConfig> = {
...DEFAULT_PARSER_CONFIG,
swagger2Options: {
patch: true,
warnOnly: false,
resolveInternal: false,
targetVersion: '3.0.0',
preserveRefs: true
},
autoConvert: true,
autoFix: true
};
```
### 3.4 ้่ฏฏๅค็ๅขๅผบ
#### 3.4.1 ๆฐๅข้่ฏฏ็ฑปๅ
```typescript
export class Swagger2OpenAPIConversionError extends OpenAPIParseError {
constructor(
message: string,
public originalError?: Error,
public conversionOptions?: any
) {
super(message, ERROR_CODES.CONVERSION_ERROR);
this.name = 'Swagger2OpenAPIConversionError';
}
}
export class UnsupportedVersionError extends OpenAPIParseError {
constructor(version: string) {
super(
`Unsupported API specification version: ${version}`,
ERROR_CODES.UNSUPPORTED_VERSION
);
this.name = 'UnsupportedVersionError';
}
}
```
#### 3.4.2 ้่ฏฏ็ ๆฉๅฑ
```typescript
export const ERROR_CODES = {
...existingErrorCodes,
CONVERSION_ERROR: 'CONVERSION_ERROR',
UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',
VERSION_DETECTION_FAILED: 'VERSION_DETECTION_FAILED'
};
```
### 3.5 ็ฑปๅๅฎไนๅขๅผบ
#### 3.5.1 ๅ
ๆฐๆฎๆฉๅฑ
```typescript
export interface EnhancedParseMetadata extends ParseMetadata {
conversionPerformed?: boolean;
originalVersion?: 'swagger2' | 'openapi3';
targetVersion?: string;
conversionDuration?: number;
patchesApplied?: number;
}
```
#### 3.5.2 ่งฃๆ็ปๆๆฉๅฑ
```typescript
export interface EnhancedParseResult extends ParseResult {
metadata: EnhancedParseMetadata;
conversionWarnings?: string[];
}
```
## 4. ๅฎ็ฐๆญฅ้ชค
### 4.1 Phase 1: ๅบ็ก้ๆ (Week 1)
1. **ๅฎ่ฃ
ไพ่ต**
```bash
npm install swagger2openapi @types/swagger2openapi
```
2. **ๅๅปบ็ๆฌๆฃๆตๅจ**
- ๅฎ็ฐ `VersionDetector` ็ฑป
- ๆทปๅ ็ๆฌๆฃๆต้ป่พ
- ็ผๅๅๅ
ๆต่ฏ
3. **ๅๅปบ่ฝฌๆขๅจ**
- ๅฎ็ฐ `Swagger2OpenAPIConverter` ็ฑป
- ้
็ฝฎ่ฝฌๆข้้กน
- ๅค็่ฝฌๆข้่ฏฏ
### 4.2 Phase 2: ่งฃๆๅจๅขๅผบ (Week 2)
1. **ๅขๅผบไธป่งฃๆๅจ**
- ไฟฎๆน `OpenAPIParser` ็ฑป
- ้ๆ็ๆฌๆฃๆตๅ่ฝฌๆข้ป่พ
- ๆดๆฐ้
็ฝฎๆฅๅฃ
2. **้่ฏฏๅค็ๅฎๅ**
- ๆทปๅ ๆฐ็้่ฏฏ็ฑปๅ
- ๅฎๅ้่ฏฏๆถๆฏๅๅ ๆ ่ท่ธช
- ๆทปๅ ้่ฏฏๆขๅคๆบๅถ
### 4.3 Phase 3: ๅ่ฝๅฎๅ (Week 3)
1. **้
็ฝฎ้้กนๆฉๅฑ**
- ๆฉๅฑ้
็ฝฎๆฅๅฃ
- ๅฎ็ฐ้
็ฝฎ้ช่ฏ
- ๆทปๅ ้
็ฝฎๆๆกฃ
2. **ๅ
ๆฐๆฎๅๆฅๅฟๅขๅผบ**
- ๆฉๅฑๅ
ๆฐๆฎไฟกๆฏ
- ๆทปๅ ่ฝฌๆข่ฟ็จๆฅๅฟ
- ๅฎ็ฐๆง่ฝ็ๆง
### 4.4 Phase 4: ๆต่ฏๅไผๅ (Week 4)
1. **ๅ
จ้ขๆต่ฏ**
- ๅๅ
ๆต่ฏ่ฆ็
- ้ๆๆต่ฏ
- ๆง่ฝๆต่ฏ
2. **ๆๆกฃๅ็คบไพ**
- ๆดๆฐ API ๆๆกฃ
- ๆทปๅ ไฝฟ็จ็คบไพ
- ็ผๅ่ฟ็งปๆๅ
## 5. ไฝฟ็จ็คบไพ
### 5.1 ๅบๆฌไฝฟ็จ
```typescript
import { parseAndTransform } from 'mcp-swagger-parser';
// ่ชๅจๆฃๆตๅ่ฝฌๆข Swagger 2.0
const tools = await parseAndTransform('swagger2-api.json', {
parserConfig: {
autoConvert: true,
swagger2Options: {
patch: true,
warnOnly: false
}
}
});
```
### 5.2 ้ซ็บง้
็ฝฎ
```typescript
const parser = new OpenAPIParser({
autoConvert: true,
swagger2Options: {
patch: true,
resolveInternal: false,
targetVersion: '3.0.3'
}
});
const result = await parser.parseFromUrl('https://api.example.com/swagger.json');
if (result.metadata.conversionPerformed) {
console.log(`่ฝฌๆขๅฎๆ: ${result.metadata.originalVersion} -> ${result.metadata.targetVersion}`);
console.log(`่ฝฌๆข่ๆถ: ${result.metadata.conversionDuration}ms`);
}
```
### 5.3 ้่ฏฏๅค็
```typescript
try {
const result = await parseFromFile('swagger2.yaml');
} catch (error) {
if (error instanceof Swagger2OpenAPIConversionError) {
console.error('Swagger 2.0 ่ฝฌๆขๅคฑ่ดฅ:', error.message);
console.error('ๅๅง้่ฏฏ:', error.originalError);
} else if (error instanceof UnsupportedVersionError) {
console.error('ไธๆฏๆ็็ๆฌ:', error.message);
}
}
```
## 6. ๅ
ผๅฎนๆง่่
### 6.1 ๅๅๅ
ผๅฎน
- ็ฐๆ API ไฟๆไธๅ
- ๆฐๅ่ฝ้่ฟ้
็ฝฎ้้กนๅฏ็จ
- ้ป่ฎค่กไธบไฟๆไธ่ด
### 6.2 ๆง่ฝๅฝฑๅ
- ่ฝฌๆขๆไฝไป
ๅจๆฃๆตๅฐ Swagger 2.0 ๆถๆง่ก
- ๅ
ๅญไฝฟ็จๅขๅ ็บฆ 10-20%
- ่งฃๆๆถ้ดๅขๅ ็บฆ 5-15%
### 6.3 ไพ่ต็ฎก็
- `swagger2openapi` ไฝไธบ็ดๆฅไพ่ต
- ็ๆฌ้ๅฎ็กฎไฟ็จณๅฎๆง
- ๅฎๆๆดๆฐๅๅฎๅ
จๆซๆ
## 7. ๆต่ฏ็ญ็ฅ
### 7.1 ๆต่ฏ่ฆ็
- ๅๅ
ๆต่ฏ๏ผ> 90%
- ้ๆๆต่ฏ๏ผไธป่ฆไฝฟ็จๅบๆฏ
- ๆง่ฝๆต่ฏ๏ผๅบๅๆต่ฏๅๅๅฝๆต่ฏ
### 7.2 ๆต่ฏๆฐๆฎ
- ็ๅฎไธ็็ Swagger 2.0 ่ง่
- ่พน็ผๆ
ๅตๅ้่ฏฏๆ
ๅต
- ๅคงๅๅคๆ่ง่็ๆง่ฝๆต่ฏ
### 7.3 ๆ็ปญ้ๆ
- ่ชๅจๅๆต่ฏๆตๆฐด็บฟ
- ๅค Node.js ็ๆฌๆต่ฏ
- ไพ่ตๅฎๅ
จๆซๆ
## 8. ้ฃ้ฉ่ฏไผฐ
### 8.1 ๆๆฏ้ฃ้ฉ
- **ไพ่ต้ฃ้ฉ**๏ผswagger2openapi ๅ
็ปดๆค็ถๆ
- **่ฝฌๆข้ฃ้ฉ**๏ผๅคๆ่ง่็่ฝฌๆขๅ็กฎๆง
- **ๆง่ฝ้ฃ้ฉ**๏ผๅคงๅ่ง่็ๅค็ๆง่ฝ
### 8.2 ็ผ่งฃ็ญ็ฅ
- ็ๆฌ้ๅฎๅๅฎๆ่ฏไผฐ
- ๅ
จ้ข็ๆต่ฏ่ฆ็
- ๆง่ฝ็ๆงๅไผๅ
## 9. ๆป็ป
้่ฟ้ๆ `swagger2openapi`๏ผ`mcp-swagger-parser` ๅฐ่ฝๅค๏ผ
1. **ๆ ็ผๆฏๆ** Swagger 2.0 ๅ OpenAPI 3.0+ ่ง่
2. **่ชๅจ่ฝฌๆข** ๆง็่ง่ๅฐๆฐ็ๆ ผๅผ
3. **ๆๅ็จๆทไฝ้ช** ้่ฟ็ปไธ็ API ๆฅๅฃ
4. **ๅขๅผบ้่ฏฏๅค็** ๅ่ฐ่ฏ่ฝๅ
5. **ไฟๆๅๅๅ
ผๅฎน** ็ฐๆๅ่ฝ
่ฟไธช้ๆๆนๆกๆข่ฝๆปก่ถณ็ฐๆ็จๆท้ๆฑ๏ผๅ่ฝๆฉๅฑๅฏนไผ ็ป API ็ๆฏๆ๏ผๆฏไธไธชๅนณ่กก็ๆๆฏๅณ็ญใ