swagger-parser-mcp-server 1.0.6 → 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/dist/index.js +126 -206
- package/dist/index.js.map +1 -1
- package/dist/schemas.d.ts +58 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +32 -0
- package/dist/schemas.js.map +1 -0
- package/dist/tests/edgeCases.test.d.ts +2 -0
- package/dist/tests/edgeCases.test.d.ts.map +1 -0
- package/dist/tests/edgeCases.test.js +364 -0
- package/dist/tests/edgeCases.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +382 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/realWorldValidation.test.d.ts +2 -0
- package/dist/tests/realWorldValidation.test.d.ts.map +1 -0
- package/dist/tests/realWorldValidation.test.js +398 -0
- package/dist/tests/realWorldValidation.test.js.map +1 -0
- package/dist/tests/schemaResolver.test.d.ts +2 -0
- package/dist/tests/schemaResolver.test.d.ts.map +1 -0
- package/dist/tests/schemaResolver.test.js +322 -0
- package/dist/tests/schemaResolver.test.js.map +1 -0
- package/dist/utils/schemaResolver.d.ts +34 -0
- package/dist/utils/schemaResolver.d.ts.map +1 -0
- package/dist/utils/schemaResolver.js +255 -0
- package/dist/utils/schemaResolver.js.map +1 -0
- package/dist/utils/swaggerCache.d.ts +53 -0
- package/dist/utils/swaggerCache.d.ts.map +1 -0
- package/dist/utils/swaggerCache.js +146 -0
- package/dist/utils/swaggerCache.js.map +1 -0
- package/dist/utils/types.d.ts +73 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +20 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +31 -9
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { OpenAPIDocument } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cache manager for OpenAPI documents
|
|
4
|
+
*/
|
|
5
|
+
export declare class SwaggerCache {
|
|
6
|
+
private cache;
|
|
7
|
+
private loadingPromises;
|
|
8
|
+
/**
|
|
9
|
+
* Loads and caches an OpenAPI document from URL
|
|
10
|
+
*/
|
|
11
|
+
load(url: string): Promise<OpenAPIDocument>;
|
|
12
|
+
/**
|
|
13
|
+
* Gets a cached OpenAPI document
|
|
14
|
+
*/
|
|
15
|
+
get(url: string): OpenAPIDocument | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Checks if a URL is cached
|
|
18
|
+
*/
|
|
19
|
+
has(url: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Gets an OpenAPI document, loading it if not cached
|
|
22
|
+
*/
|
|
23
|
+
getOrLoad(url: string): Promise<OpenAPIDocument>;
|
|
24
|
+
/**
|
|
25
|
+
* Clears a specific URL from cache
|
|
26
|
+
*/
|
|
27
|
+
clear(url: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Clears all cached documents
|
|
30
|
+
*/
|
|
31
|
+
clearAll(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Gets cache statistics
|
|
34
|
+
*/
|
|
35
|
+
getStats(): {
|
|
36
|
+
cacheSize: number;
|
|
37
|
+
loadingPromises: number;
|
|
38
|
+
cachedUrls: string[];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Preloads multiple URLs concurrently
|
|
42
|
+
*/
|
|
43
|
+
preload(urls: string[]): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Validates that a cached document is a valid OpenAPI document
|
|
46
|
+
*/
|
|
47
|
+
private validateOpenAPIDocument;
|
|
48
|
+
/**
|
|
49
|
+
* Fetches OpenAPI document from URL with validation
|
|
50
|
+
*/
|
|
51
|
+
private fetchSwagger;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=swaggerCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swaggerCache.d.ts","sourceRoot":"","sources":["../../src/utils/swaggerCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,eAAe,CAAoD;IAE3E;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BjD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI7C;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQtD;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI3B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,QAAQ;;;;;IAQR;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;YACW,YAAY;CA0B3B"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* Cache manager for OpenAPI documents
|
|
4
|
+
*/
|
|
5
|
+
export class SwaggerCache {
|
|
6
|
+
cache = new Map();
|
|
7
|
+
loadingPromises = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* Loads and caches an OpenAPI document from URL
|
|
10
|
+
*/
|
|
11
|
+
async load(url) {
|
|
12
|
+
// Return cached document if available
|
|
13
|
+
if (this.cache.has(url)) {
|
|
14
|
+
const cached = this.cache.get(url);
|
|
15
|
+
if (cached)
|
|
16
|
+
return cached;
|
|
17
|
+
}
|
|
18
|
+
// If already loading, return the existing promise
|
|
19
|
+
if (this.loadingPromises.has(url)) {
|
|
20
|
+
const loadingPromise = this.loadingPromises.get(url);
|
|
21
|
+
if (loadingPromise)
|
|
22
|
+
return loadingPromise;
|
|
23
|
+
}
|
|
24
|
+
// Create loading promise
|
|
25
|
+
const loadingPromise = this.fetchSwagger(url);
|
|
26
|
+
this.loadingPromises.set(url, loadingPromise);
|
|
27
|
+
try {
|
|
28
|
+
const swagger = await loadingPromise;
|
|
29
|
+
this.cache.set(url, swagger);
|
|
30
|
+
return swagger;
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
// Clean up loading promise
|
|
34
|
+
this.loadingPromises.delete(url);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets a cached OpenAPI document
|
|
39
|
+
*/
|
|
40
|
+
get(url) {
|
|
41
|
+
return this.cache.get(url);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if a URL is cached
|
|
45
|
+
*/
|
|
46
|
+
has(url) {
|
|
47
|
+
return this.cache.has(url);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Gets an OpenAPI document, loading it if not cached
|
|
51
|
+
*/
|
|
52
|
+
async getOrLoad(url) {
|
|
53
|
+
if (this.has(url)) {
|
|
54
|
+
const cached = this.get(url);
|
|
55
|
+
if (cached)
|
|
56
|
+
return cached;
|
|
57
|
+
}
|
|
58
|
+
return this.load(url);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Clears a specific URL from cache
|
|
62
|
+
*/
|
|
63
|
+
clear(url) {
|
|
64
|
+
return this.cache.delete(url);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Clears all cached documents
|
|
68
|
+
*/
|
|
69
|
+
clearAll() {
|
|
70
|
+
this.cache.clear();
|
|
71
|
+
this.loadingPromises.clear();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Gets cache statistics
|
|
75
|
+
*/
|
|
76
|
+
getStats() {
|
|
77
|
+
return {
|
|
78
|
+
cacheSize: this.cache.size,
|
|
79
|
+
loadingPromises: this.loadingPromises.size,
|
|
80
|
+
cachedUrls: Array.from(this.cache.keys()),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Preloads multiple URLs concurrently
|
|
85
|
+
*/
|
|
86
|
+
async preload(urls) {
|
|
87
|
+
const promises = urls.map(url => this.load(url).catch(error => {
|
|
88
|
+
// NOTE: error might not have message property, so we use safe access
|
|
89
|
+
console.error(`Failed to preload ${url}:`, error.message || error);
|
|
90
|
+
return null;
|
|
91
|
+
}));
|
|
92
|
+
await Promise.all(promises);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validates that a cached document is a valid OpenAPI document
|
|
96
|
+
*/
|
|
97
|
+
validateOpenAPIDocument(data, url) {
|
|
98
|
+
if (!data || typeof data !== 'object') {
|
|
99
|
+
throw new Error(`Invalid OpenAPI document: not an object (${url})`);
|
|
100
|
+
}
|
|
101
|
+
const doc = data;
|
|
102
|
+
if (!doc.openapi && !doc.swagger) {
|
|
103
|
+
throw new Error(`Invalid OpenAPI document: missing openapi/swagger version (${url})`);
|
|
104
|
+
}
|
|
105
|
+
if (!doc.info) {
|
|
106
|
+
throw new Error(`Invalid OpenAPI document: missing info section (${url})`);
|
|
107
|
+
}
|
|
108
|
+
if (!doc.paths || typeof doc.paths !== 'object') {
|
|
109
|
+
throw new Error(`Invalid OpenAPI document: missing or invalid paths section (${url})`);
|
|
110
|
+
}
|
|
111
|
+
return data;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Fetches OpenAPI document from URL with validation
|
|
115
|
+
*/
|
|
116
|
+
async fetchSwagger(url) {
|
|
117
|
+
try {
|
|
118
|
+
const response = await axios.get(url, {
|
|
119
|
+
timeout: 30000, // 30 second timeout
|
|
120
|
+
headers: {
|
|
121
|
+
Accept: 'application/json, application/yaml, text/yaml',
|
|
122
|
+
'User-Agent': 'swagger-parser-mcp-server/1.0.0',
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
return this.validateOpenAPIDocument(response.data, url);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (error && typeof error === 'object' && 'response' in error) {
|
|
129
|
+
const axiosError = error;
|
|
130
|
+
throw new Error(`HTTP ${axiosError.response.status}: ${axiosError.response.statusText} (${url})`);
|
|
131
|
+
}
|
|
132
|
+
else if (error && typeof error === 'object' && 'request' in error) {
|
|
133
|
+
throw new Error(`Network error: Unable to fetch ${url}`);
|
|
134
|
+
}
|
|
135
|
+
else if (error && typeof error === 'object' && 'code' in error && error.code === 'ECONNABORTED') {
|
|
136
|
+
const timeoutError = error;
|
|
137
|
+
throw new Error(`Failed to load OpenAPI document: ${timeoutError.message} (${url})`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
141
|
+
throw new Error(`Failed to load OpenAPI document: ${errorMessage} (${url})`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=swaggerCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swaggerCache.js","sourceRoot":"","sources":["../../src/utils/swaggerCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,GAAiC,IAAI,GAAG,EAAE,CAAC;IAChD,eAAe,GAA0C,IAAI,GAAG,EAAE,CAAC;IAE3E;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,sCAAsC;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,cAAc;gBAAE,OAAO,cAAc,CAAC;QAC5C,CAAC;QAED,yBAAyB;QACzB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,OAAO,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,2BAA2B;YAC3B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAW;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC1B,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;YAC1C,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC3B,qEAAqE;YACrE,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,IAAa,EAAE,GAAW;QACxD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4CAA4C,GAAG,GAAG,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,GAAG,GAAG,IAA+B,CAAC;QAE5C,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,8DAA8D,GAAG,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,+DAA+D,GAAG,GAAG,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,IAAuB,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,GAAW;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,OAAO,EAAE,KAAK,EAAE,oBAAoB;gBACpC,OAAO,EAAE;oBACP,MAAM,EAAE,+CAA+C;oBACvD,YAAY,EAAE,iCAAiC;iBAChD;aACF,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;gBAC9D,MAAM,UAAU,GAAG,KAA6D,CAAC;gBACjF,MAAM,IAAI,KAAK,CAAC,QAAQ,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,GAAG,CAAC,CAAC;YACpG,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAClG,MAAM,YAAY,GAAG,KAAuC,CAAC;gBAC7D,MAAM,IAAI,KAAK,CAAC,oCAAoC,YAAY,CAAC,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;gBACvF,MAAM,IAAI,KAAK,CAAC,oCAAoC,YAAY,KAAK,GAAG,GAAG,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
2
|
+
export type OpenAPIDocument = OpenAPIV3.Document;
|
|
3
|
+
export type Operation = OpenAPIV3.OperationObject;
|
|
4
|
+
export type Parameter = OpenAPIV3.ParameterObject;
|
|
5
|
+
export type Response = OpenAPIV3.ResponseObject;
|
|
6
|
+
export type Schema = OpenAPIV3.SchemaObject;
|
|
7
|
+
export type PathItem = OpenAPIV3.PathItemObject;
|
|
8
|
+
export type MediaType = OpenAPIV3.MediaTypeObject;
|
|
9
|
+
export type RequestBody = OpenAPIV3.RequestBodyObject;
|
|
10
|
+
export type ResponsesObject = OpenAPIV3.ResponsesObject;
|
|
11
|
+
export type SwaggerSpec = OpenAPIV3.Document;
|
|
12
|
+
export type HTTPMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' | 'options';
|
|
13
|
+
export interface PathOperation {
|
|
14
|
+
path: string;
|
|
15
|
+
method: HTTPMethod;
|
|
16
|
+
operationId?: string;
|
|
17
|
+
summary?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedParameter {
|
|
21
|
+
name: string;
|
|
22
|
+
in: 'query' | 'header' | 'path' | 'cookie';
|
|
23
|
+
required?: boolean;
|
|
24
|
+
description?: string;
|
|
25
|
+
schema: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface ResolvedRequestBody {
|
|
28
|
+
required?: boolean;
|
|
29
|
+
mediaType: string;
|
|
30
|
+
schema: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface ResolvedResponse {
|
|
33
|
+
description: string;
|
|
34
|
+
mediaType?: string;
|
|
35
|
+
schema?: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface PathDetails {
|
|
38
|
+
path: string;
|
|
39
|
+
method: string;
|
|
40
|
+
operationId?: string;
|
|
41
|
+
summary?: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
tags?: string[];
|
|
44
|
+
parameters: ResolvedParameter[];
|
|
45
|
+
requestBody?: ResolvedRequestBody;
|
|
46
|
+
responses: Record<string, ResolvedResponse>;
|
|
47
|
+
}
|
|
48
|
+
export interface SchemaResolutionContext {
|
|
49
|
+
visitedRefs: Set<string>;
|
|
50
|
+
maxDepth: number;
|
|
51
|
+
currentDepth: number;
|
|
52
|
+
}
|
|
53
|
+
export interface ResolvedSchema {
|
|
54
|
+
$ref?: string;
|
|
55
|
+
resolved: any;
|
|
56
|
+
isCircular?: boolean;
|
|
57
|
+
circularRef?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface SchemaResolverOptions {
|
|
60
|
+
maxDepth?: number;
|
|
61
|
+
includeCircularRefs?: boolean;
|
|
62
|
+
circularRefPlaceholder?: string;
|
|
63
|
+
}
|
|
64
|
+
export declare class CircularReferenceError extends Error {
|
|
65
|
+
constructor(ref: string, path: string[]);
|
|
66
|
+
}
|
|
67
|
+
export declare class MaxDepthExceededError extends Error {
|
|
68
|
+
constructor(maxDepth: number, ref: string);
|
|
69
|
+
}
|
|
70
|
+
export declare class InvalidReferenceError extends Error {
|
|
71
|
+
constructor(ref: string);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Error types
|
|
2
|
+
export class CircularReferenceError extends Error {
|
|
3
|
+
constructor(ref, path) {
|
|
4
|
+
super(`Circular reference detected: ${ref} (path: ${path.join(' -> ')})`);
|
|
5
|
+
this.name = 'CircularReferenceError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class MaxDepthExceededError extends Error {
|
|
9
|
+
constructor(maxDepth, ref) {
|
|
10
|
+
super(`Maximum resolution depth (${maxDepth}) exceeded for reference: ${ref}`);
|
|
11
|
+
this.name = 'MaxDepthExceededError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class InvalidReferenceError extends Error {
|
|
15
|
+
constructor(ref) {
|
|
16
|
+
super(`Invalid reference: ${ref}`);
|
|
17
|
+
this.name = 'InvalidReferenceError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAyFA,cAAc;AACd,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,GAAW,EAAE,IAAc;QACrC,KAAK,CAAC,gCAAgC,GAAG,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,QAAgB,EAAE,GAAW;QACvC,KAAK,CAAC,6BAA6B,QAAQ,6BAA6B,GAAG,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,GAAW;QACrB,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "swagger-parser-mcp-server",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "MCP server for parsing Swagger/OpenAPI JSON files",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -15,12 +15,6 @@
|
|
|
15
15
|
"README.md",
|
|
16
16
|
"package.json"
|
|
17
17
|
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"dev": "tsx src/index.ts",
|
|
21
|
-
"start": "node dist/index.js",
|
|
22
|
-
"prepublishOnly": "npm run build"
|
|
23
|
-
},
|
|
24
18
|
"keywords": [
|
|
25
19
|
"mcp",
|
|
26
20
|
"swagger",
|
|
@@ -35,11 +29,39 @@
|
|
|
35
29
|
"dependencies": {
|
|
36
30
|
"@modelcontextprotocol/sdk": "^0.5.0",
|
|
37
31
|
"axios": "^1.6.0",
|
|
32
|
+
"openapi-types": "^12.1.3",
|
|
33
|
+
"swagger-schema-official": "2.0.0-bab6bed",
|
|
38
34
|
"zod": "^3.22.0"
|
|
39
35
|
},
|
|
40
36
|
"devDependencies": {
|
|
37
|
+
"@eslint/js": "^9.32.0",
|
|
38
|
+
"@types/jest": "^29.5.0",
|
|
41
39
|
"@types/node": "^20.0.0",
|
|
40
|
+
"@types/swagger-schema-official": "^2.0.25",
|
|
41
|
+
"eslint": "^9.32.0",
|
|
42
|
+
"eslint-config-prettier": "^10.1.8",
|
|
43
|
+
"eslint-plugin-prettier": "^5.5.3",
|
|
44
|
+
"globals": "^16.3.0",
|
|
45
|
+
"jest": "^29.7.0",
|
|
46
|
+
"prettier": "^3.6.2",
|
|
47
|
+
"ts-jest": "^29.1.0",
|
|
42
48
|
"tsx": "^4.7.0",
|
|
43
|
-
"typescript": "^5.3.0"
|
|
49
|
+
"typescript": "^5.3.0",
|
|
50
|
+
"typescript-eslint": "^8.38.0"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc",
|
|
54
|
+
"dev": "tsx src/index.ts",
|
|
55
|
+
"start": "node dist/index.js",
|
|
56
|
+
"test": "jest",
|
|
57
|
+
"test:watch": "jest --watch",
|
|
58
|
+
"test:coverage": "jest --coverage",
|
|
59
|
+
"lint": "eslint .",
|
|
60
|
+
"lint:fix": "eslint . --fix",
|
|
61
|
+
"format": "prettier --write .",
|
|
62
|
+
"format:check": "prettier --check .",
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"check-all": "pnpm run typecheck && pnpm run lint && pnpm run format:check",
|
|
65
|
+
"preinstall": "npx only-allow pnpm"
|
|
44
66
|
}
|
|
45
|
-
}
|
|
67
|
+
}
|