exem-fe-swagger-parser-mcp-server 1.0.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 ADDED
@@ -0,0 +1,173 @@
1
+ # Swagger Parser MCP Server
2
+
3
+ Swagger/OpenAPI JSON 파일을 파싱하여 API 정보를 분석하는 MCP(Model Context Protocol) 서버입니다.
4
+
5
+ Claude와 함께 사용하여 API 문서를 쉽게 분석하고 이해할 수 있습니다.
6
+
7
+ ## 주요 기능
8
+
9
+ - ✅ 원하는 컨트롤러에 대한 path 리스트 조회
10
+ - ✅ JSON에서 컨트롤러(태그) 리스트 추출
11
+ - ✅ Path에 대한 parameters, requestBody, responseBody 정보 및 스키마 조회
12
+ - ✅ $ref로 참조된 스키마의 실제 타입 정보 제공 (자동 해결)
13
+
14
+ ## 프로젝트 구조
15
+
16
+ ```
17
+ swagger-parser-mcp-server/
18
+ ├── swagger-parser-server.ts # MCP 서버 메인 코드
19
+ ├── example-client.ts # 클라이언트 예제 코드
20
+ ├── package.json # 프로젝트 설정
21
+ ├── tsconfig.json # TypeScript 설정
22
+ ├── README.md # 이 파일
23
+ └── dist/ # 빌드된 파일 (빌드 후 생성)
24
+ ```
25
+
26
+ ## 설치 및 사용법
27
+
28
+ ### 방법 1: NPM 패키지 설치
29
+
30
+ #### 1. NPM 설치
31
+ ```bash
32
+ npm install swagger-parser-mcp-server
33
+ ```
34
+
35
+ #### 2. MCP 설정
36
+ MCP 설정 파일(`mcp.json` 또는 Claude 설정)에 다음 내용을 추가합니다:
37
+
38
+ ```json
39
+ {
40
+ "mcpServers": {
41
+ "swagger-parser": {
42
+ "command": "npx",
43
+ "args": ["swagger-parser-mcp-server"]
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ **Claude Code CLI 사용시:**
50
+ ```bash
51
+ claude mcp add swagger-parser npx swagger-parser-mcp-server
52
+ ```
53
+
54
+ ### 방법 2: 소스코드 직접 사용
55
+
56
+ #### 1. 소스코드 다운로드 및 빌드
57
+ ```bash
58
+ # 저장소 클론 또는 파일 다운로드 후
59
+ cd swagger-parser-mcp-server
60
+
61
+ # 의존성 설치
62
+ npm install
63
+
64
+ # TypeScript 빌드
65
+ npm run build
66
+ ```
67
+
68
+ #### 2. MCP 설정
69
+
70
+ MCP 설정 파일을 열어 다음 내용을 추가합니다:
71
+ ```json
72
+ {
73
+ "mcpServers": {
74
+ "swagger-parser": {
75
+ "command": "node",
76
+ "args": ["<프로젝트 절대경로>/dist/index.js"]
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+ **Claude Code CLI 사용시:**
83
+ ```bash
84
+ claude mcp add swagger-parser node <프로젝트 절대경로>/dist/index.js
85
+ ```
86
+ > IDE에서 ./dist/index.js 파일 우클릭 후 절대 경로 복사 가능합니다.
87
+
88
+ ### 3. Claude 재시작
89
+
90
+ 설정을 저장한 후 Claude Desktop/Cursor/Claude Code를 재시작합니다.
91
+
92
+ ## 사용 예시
93
+
94
+ ⚠️ JSON 형태 스웨거를 반환하는 URL을 줘야합니다. [참고](https://app.clickup.com/t/86etz9h2z)
95
+
96
+
97
+ Claude에서 다음과 같이 사용할 수 있습니다:
98
+
99
+ ```
100
+ # Swagger JSON 로드
101
+ 이 API 문서를 분석해줘: https://petstore.swagger.io/v2/swagger.json
102
+
103
+ # 컨트롤러 목록 보기
104
+ 어떤 컨트롤러들이 있는지 보여줘
105
+
106
+ # 특정 컨트롤러의 API 목록
107
+ pet 컨트롤러의 모든 API를 보여줘
108
+
109
+ # API 상세 정보
110
+ GET /pet/{petId} API의 파라미터와 응답 스키마를 자세히 보여줘
111
+
112
+ # 스키마 정보
113
+ Pet 모델의 전체 스키마 구조를 보여줘
114
+ ```
115
+
116
+ ## 개발 모드
117
+
118
+ 개발 중에는 TypeScript를 직접 실행할 수 있습니다:
119
+
120
+ ```bash
121
+ npm run dev
122
+ ```
123
+
124
+ ## 프로그래밍 방식으로 사용하기
125
+
126
+ MCP 클라이언트를 구현하여 프로그래밍 방식으로도 사용할 수 있습니다:
127
+
128
+ ```typescript
129
+ import { SwaggerParserClient } from './example-client.js';
130
+
131
+ const client = new SwaggerParserClient();
132
+ await client.connect();
133
+
134
+ const url = "https://your-api.com/swagger.json";
135
+ const controllers = await client.getControllers(url);
136
+ const paths = await client.getPathsByController(url, "users");
137
+
138
+ await client.disconnect();
139
+ ```
140
+
141
+ ## 지원하는 OpenAPI 버전
142
+
143
+ - ✅ Swagger 2.0
144
+ - ✅ OpenAPI 3.0.x
145
+
146
+ ## 문제 해결
147
+
148
+ ### "MCP 서버를 찾을 수 없습니다" 오류
149
+ 1. 설정 파일의 경로가 올바른지 확인하세요
150
+ 2. Node.js가 설치되어 있는지 확인하세요 (`node --version`)
151
+ 3. 프로젝트가 빌드되었는지 확인하세요 (`npm run build`)
152
+
153
+ ### 패키지 실행 오류
154
+ ```bash
155
+ # npx 캐시 클리어
156
+ npx clear-npx-cache
157
+
158
+ # 패키지 재설치
159
+ npm uninstall swagger-parser-mcp-server
160
+ npm install swagger-parser-mcp-server
161
+ ```
162
+
163
+ ### Swagger JSON 로드 실패
164
+ 1. URL이 CORS를 허용하는지 확인하세요
165
+ 2. JSON 형식이 올바른 Swagger/OpenAPI 형식인지 확인하세요
166
+
167
+ ## 라이선스
168
+
169
+ MIT
170
+
171
+ ## 기여하기
172
+
173
+ 이슈와 PR은 언제나 환영합니다!
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,378 @@
1
+ #!/usr/bin/env node
2
+ // swagger-parser-server.ts
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
6
+ import axios from "axios";
7
+ class SwaggerParserServer {
8
+ server;
9
+ swaggerCache = new Map();
10
+ constructor() {
11
+ this.server = new Server({
12
+ name: "swagger-parser-server",
13
+ version: "1.0.0",
14
+ }, {
15
+ capabilities: {
16
+ tools: {},
17
+ },
18
+ });
19
+ this.setupHandlers();
20
+ }
21
+ setupHandlers() {
22
+ // 도구 목록 제공
23
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
24
+ tools: [
25
+ {
26
+ name: "load_swagger",
27
+ description: "Swagger/OpenAPI JSON URL을 로드합니다",
28
+ inputSchema: {
29
+ type: "object",
30
+ properties: {
31
+ url: {
32
+ type: "string",
33
+ description: "Swagger JSON URL",
34
+ },
35
+ },
36
+ required: ["url"],
37
+ },
38
+ },
39
+ {
40
+ name: "get_controllers",
41
+ description: "모든 컨트롤러(태그) 목록을 가져옵니다",
42
+ inputSchema: {
43
+ type: "object",
44
+ properties: {
45
+ url: {
46
+ type: "string",
47
+ description: "Swagger JSON URL",
48
+ },
49
+ },
50
+ required: ["url"],
51
+ },
52
+ },
53
+ {
54
+ name: "get_paths_by_controller",
55
+ description: "특정 컨트롤러의 모든 path를 가져옵니다",
56
+ inputSchema: {
57
+ type: "object",
58
+ properties: {
59
+ url: {
60
+ type: "string",
61
+ description: "Swagger JSON URL",
62
+ },
63
+ controller: {
64
+ type: "string",
65
+ description: "컨트롤러 이름 (태그)",
66
+ },
67
+ },
68
+ required: ["url", "controller"],
69
+ },
70
+ },
71
+ {
72
+ name: "get_path_details",
73
+ description: "특정 path의 상세 정보를 가져옵니다",
74
+ inputSchema: {
75
+ type: "object",
76
+ properties: {
77
+ url: {
78
+ type: "string",
79
+ description: "Swagger JSON URL",
80
+ },
81
+ path: {
82
+ type: "string",
83
+ description: "API path (예: /users/{id})",
84
+ },
85
+ method: {
86
+ type: "string",
87
+ description: "HTTP method (get, post, put, delete 등)",
88
+ },
89
+ },
90
+ required: ["url", "path", "method"],
91
+ },
92
+ },
93
+ {
94
+ name: "resolve_schema",
95
+ description: "$ref를 해결하여 실제 스키마를 가져옵니다",
96
+ inputSchema: {
97
+ type: "object",
98
+ properties: {
99
+ url: {
100
+ type: "string",
101
+ description: "Swagger JSON URL",
102
+ },
103
+ ref: {
104
+ type: "string",
105
+ description: "$ref 경로 (예: #/components/schemas/User)",
106
+ },
107
+ },
108
+ required: ["url", "ref"],
109
+ },
110
+ },
111
+ ],
112
+ }));
113
+ // 도구 실행 핸들러
114
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
115
+ const { name, arguments: args } = request.params;
116
+ try {
117
+ switch (name) {
118
+ case "load_swagger":
119
+ return await this.loadSwagger(args?.url);
120
+ case "get_controllers":
121
+ return await this.getControllers(args?.url);
122
+ case "get_paths_by_controller":
123
+ return await this.getPathsByController(args?.url, args?.controller);
124
+ case "get_path_details":
125
+ return await this.getPathDetails(args?.url, args?.path, args?.method);
126
+ case "resolve_schema":
127
+ return await this.resolveSchema(args?.url, args?.ref);
128
+ default:
129
+ throw new Error(`Unknown tool: ${name}`);
130
+ }
131
+ }
132
+ catch (error) {
133
+ return {
134
+ content: [
135
+ {
136
+ type: "text",
137
+ text: `Error: ${error.message}`,
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ });
143
+ }
144
+ async loadSwagger(url) {
145
+ try {
146
+ const response = await axios.get(url);
147
+ const swagger = response.data;
148
+ this.swaggerCache.set(url, swagger);
149
+ return {
150
+ content: [
151
+ {
152
+ type: "text",
153
+ text: JSON.stringify({
154
+ success: true,
155
+ info: swagger.info,
156
+ pathCount: Object.keys(swagger.paths).length,
157
+ hasComponents: !!swagger.components,
158
+ }, null, 2),
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ catch (error) {
164
+ throw new Error(`Failed to load Swagger: ${error.message}`);
165
+ }
166
+ }
167
+ async getSwagger(url) {
168
+ if (!this.swaggerCache.has(url)) {
169
+ await this.loadSwagger(url);
170
+ }
171
+ return this.swaggerCache.get(url);
172
+ }
173
+ async getControllers(url) {
174
+ const swagger = await this.getSwagger(url);
175
+ const controllers = new Set();
176
+ Object.values(swagger.paths).forEach(pathItem => {
177
+ Object.values(pathItem).forEach((operation) => {
178
+ if (operation.tags) {
179
+ operation.tags.forEach((tag) => controllers.add(tag));
180
+ }
181
+ });
182
+ });
183
+ return {
184
+ content: [
185
+ {
186
+ type: "text",
187
+ text: JSON.stringify({
188
+ controllers: Array.from(controllers),
189
+ count: controllers.size,
190
+ }, null, 2),
191
+ },
192
+ ],
193
+ };
194
+ }
195
+ async getPathsByController(url, controller) {
196
+ const swagger = await this.getSwagger(url);
197
+ const paths = [];
198
+ Object.entries(swagger.paths).forEach(([path, pathItem]) => {
199
+ Object.entries(pathItem).forEach(([method, operation]) => {
200
+ if (operation.tags?.includes(controller)) {
201
+ paths.push({
202
+ path,
203
+ method,
204
+ operationId: operation.operationId,
205
+ summary: operation.summary,
206
+ description: operation.description,
207
+ });
208
+ }
209
+ });
210
+ });
211
+ return {
212
+ content: [
213
+ {
214
+ type: "text",
215
+ text: JSON.stringify({
216
+ controller,
217
+ paths,
218
+ count: paths.length,
219
+ }, null, 2),
220
+ },
221
+ ],
222
+ };
223
+ }
224
+ async getPathDetails(url, path, method) {
225
+ const swagger = await this.getSwagger(url);
226
+ const operation = swagger.paths[path]?.[method.toLowerCase()];
227
+ if (!operation) {
228
+ throw new Error(`Path ${method.toUpperCase()} ${path} not found`);
229
+ }
230
+ // 파라미터 정보 추출
231
+ const parameters = operation.parameters?.map(param => ({
232
+ name: param.name,
233
+ in: param.in,
234
+ required: param.required,
235
+ description: param.description,
236
+ schema: this.resolveSchemaReference(param.schema, swagger),
237
+ })) || [];
238
+ // Request Body 정보 추출
239
+ let requestBody = null;
240
+ if (operation.requestBody?.content) {
241
+ const content = operation.requestBody.content;
242
+ const mediaType = Object.keys(content)[0];
243
+ if (content[mediaType]?.schema) {
244
+ requestBody = {
245
+ required: operation.requestBody.required,
246
+ mediaType,
247
+ schema: this.resolveSchemaReference(content[mediaType].schema, swagger),
248
+ };
249
+ }
250
+ }
251
+ // Response 정보 추출
252
+ const responses = {};
253
+ if (operation.responses) {
254
+ Object.entries(operation.responses).forEach(([statusCode, response]) => {
255
+ if (response.content) {
256
+ const content = response.content;
257
+ const mediaType = Object.keys(content)[0];
258
+ if (content[mediaType]?.schema) {
259
+ responses[statusCode] = {
260
+ description: response.description,
261
+ mediaType,
262
+ schema: this.resolveSchemaReference(content[mediaType].schema, swagger),
263
+ };
264
+ }
265
+ }
266
+ else {
267
+ responses[statusCode] = {
268
+ description: response.description,
269
+ };
270
+ }
271
+ });
272
+ }
273
+ return {
274
+ content: [
275
+ {
276
+ type: "text",
277
+ text: JSON.stringify({
278
+ path,
279
+ method: method.toUpperCase(),
280
+ operationId: operation.operationId,
281
+ summary: operation.summary,
282
+ description: operation.description,
283
+ tags: operation.tags,
284
+ parameters,
285
+ requestBody,
286
+ responses,
287
+ }, null, 2),
288
+ },
289
+ ],
290
+ };
291
+ }
292
+ resolveSchemaReference(schema, swagger) {
293
+ if (!schema)
294
+ return null;
295
+ if (schema.$ref) {
296
+ const resolved = this.resolveRef(schema.$ref, swagger);
297
+ return {
298
+ $ref: schema.$ref,
299
+ resolved,
300
+ };
301
+ }
302
+ if (schema.type === "array" && schema.items) {
303
+ return {
304
+ type: "array",
305
+ items: this.resolveSchemaReference(schema.items, swagger),
306
+ };
307
+ }
308
+ if (schema.type === "object" && schema.properties) {
309
+ const properties = {};
310
+ Object.entries(schema.properties).forEach(([key, value]) => {
311
+ properties[key] = this.resolveSchemaReference(value, swagger);
312
+ });
313
+ return {
314
+ type: "object",
315
+ properties,
316
+ required: schema.required,
317
+ };
318
+ }
319
+ return schema;
320
+ }
321
+ resolveRef(ref, swagger) {
322
+ const parts = ref.split("/");
323
+ let current = swagger;
324
+ for (let i = 1; i < parts.length; i++) {
325
+ current = current[parts[i]];
326
+ if (!current) {
327
+ throw new Error(`Cannot resolve reference: ${ref}`);
328
+ }
329
+ }
330
+ // 재귀적으로 중첩된 $ref도 해결
331
+ if (current.$ref) {
332
+ return this.resolveRef(current.$ref, swagger);
333
+ }
334
+ // 객체 속성에 있는 $ref도 해결
335
+ if (current.type === "object" && current.properties) {
336
+ const resolvedProperties = {};
337
+ Object.entries(current.properties).forEach(([key, value]) => {
338
+ resolvedProperties[key] = this.resolveSchemaReference(value, swagger);
339
+ });
340
+ return {
341
+ ...current,
342
+ properties: resolvedProperties,
343
+ };
344
+ }
345
+ // 배열 아이템의 $ref도 해결
346
+ if (current.type === "array" && current.items) {
347
+ return {
348
+ ...current,
349
+ items: this.resolveSchemaReference(current.items, swagger),
350
+ };
351
+ }
352
+ return current;
353
+ }
354
+ async resolveSchema(url, ref) {
355
+ const swagger = await this.getSwagger(url);
356
+ const resolved = this.resolveRef(ref, swagger);
357
+ return {
358
+ content: [
359
+ {
360
+ type: "text",
361
+ text: JSON.stringify({
362
+ ref,
363
+ resolved,
364
+ }, null, 2),
365
+ },
366
+ ],
367
+ };
368
+ }
369
+ async run() {
370
+ const transport = new StdioServerTransport();
371
+ await this.server.connect(transport);
372
+ console.error("Swagger Parser MCP Server running on stdio");
373
+ }
374
+ }
375
+ // 서버 실행
376
+ const server = new SwaggerParserServer();
377
+ server.run().catch(console.error);
378
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,377 @@
1
+ // swagger-parser-server.ts
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import axios from "axios";
6
+ class SwaggerParserServer {
7
+ server;
8
+ swaggerCache = new Map();
9
+ constructor() {
10
+ this.server = new Server({
11
+ name: "swagger-parser-server",
12
+ version: "1.0.0",
13
+ }, {
14
+ capabilities: {
15
+ tools: {},
16
+ },
17
+ });
18
+ this.setupHandlers();
19
+ }
20
+ setupHandlers() {
21
+ // 도구 목록 제공
22
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
23
+ tools: [
24
+ {
25
+ name: "load_swagger",
26
+ description: "Swagger/OpenAPI JSON URL을 로드합니다",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {
30
+ url: {
31
+ type: "string",
32
+ description: "Swagger JSON URL",
33
+ },
34
+ },
35
+ required: ["url"],
36
+ },
37
+ },
38
+ {
39
+ name: "get_controllers",
40
+ description: "모든 컨트롤러(태그) 목록을 가져옵니다",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ url: {
45
+ type: "string",
46
+ description: "Swagger JSON URL",
47
+ },
48
+ },
49
+ required: ["url"],
50
+ },
51
+ },
52
+ {
53
+ name: "get_paths_by_controller",
54
+ description: "특정 컨트롤러의 모든 path를 가져옵니다",
55
+ inputSchema: {
56
+ type: "object",
57
+ properties: {
58
+ url: {
59
+ type: "string",
60
+ description: "Swagger JSON URL",
61
+ },
62
+ controller: {
63
+ type: "string",
64
+ description: "컨트롤러 이름 (태그)",
65
+ },
66
+ },
67
+ required: ["url", "controller"],
68
+ },
69
+ },
70
+ {
71
+ name: "get_path_details",
72
+ description: "특정 path의 상세 정보를 가져옵니다",
73
+ inputSchema: {
74
+ type: "object",
75
+ properties: {
76
+ url: {
77
+ type: "string",
78
+ description: "Swagger JSON URL",
79
+ },
80
+ path: {
81
+ type: "string",
82
+ description: "API path (예: /users/{id})",
83
+ },
84
+ method: {
85
+ type: "string",
86
+ description: "HTTP method (get, post, put, delete 등)",
87
+ },
88
+ },
89
+ required: ["url", "path", "method"],
90
+ },
91
+ },
92
+ {
93
+ name: "resolve_schema",
94
+ description: "$ref를 해결하여 실제 스키마를 가져옵니다",
95
+ inputSchema: {
96
+ type: "object",
97
+ properties: {
98
+ url: {
99
+ type: "string",
100
+ description: "Swagger JSON URL",
101
+ },
102
+ ref: {
103
+ type: "string",
104
+ description: "$ref 경로 (예: #/components/schemas/User)",
105
+ },
106
+ },
107
+ required: ["url", "ref"],
108
+ },
109
+ },
110
+ ],
111
+ }));
112
+ // 도구 실행 핸들러
113
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
114
+ const { name, arguments: args } = request.params;
115
+ try {
116
+ switch (name) {
117
+ case "load_swagger":
118
+ return await this.loadSwagger(args?.url);
119
+ case "get_controllers":
120
+ return await this.getControllers(args?.url);
121
+ case "get_paths_by_controller":
122
+ return await this.getPathsByController(args?.url, args?.controller);
123
+ case "get_path_details":
124
+ return await this.getPathDetails(args?.url, args?.path, args?.method);
125
+ case "resolve_schema":
126
+ return await this.resolveSchema(args?.url, args?.ref);
127
+ default:
128
+ throw new Error(`Unknown tool: ${name}`);
129
+ }
130
+ }
131
+ catch (error) {
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: `Error: ${error.message}`,
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ });
142
+ }
143
+ async loadSwagger(url) {
144
+ try {
145
+ const response = await axios.get(url);
146
+ const swagger = response.data;
147
+ this.swaggerCache.set(url, swagger);
148
+ return {
149
+ content: [
150
+ {
151
+ type: "text",
152
+ text: JSON.stringify({
153
+ success: true,
154
+ info: swagger.info,
155
+ pathCount: Object.keys(swagger.paths).length,
156
+ hasComponents: !!swagger.components,
157
+ }, null, 2),
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ catch (error) {
163
+ throw new Error(`Failed to load Swagger: ${error.message}`);
164
+ }
165
+ }
166
+ async getSwagger(url) {
167
+ if (!this.swaggerCache.has(url)) {
168
+ await this.loadSwagger(url);
169
+ }
170
+ return this.swaggerCache.get(url);
171
+ }
172
+ async getControllers(url) {
173
+ const swagger = await this.getSwagger(url);
174
+ const controllers = new Set();
175
+ Object.values(swagger.paths).forEach(pathItem => {
176
+ Object.values(pathItem).forEach((operation) => {
177
+ if (operation.tags) {
178
+ operation.tags.forEach((tag) => controllers.add(tag));
179
+ }
180
+ });
181
+ });
182
+ return {
183
+ content: [
184
+ {
185
+ type: "text",
186
+ text: JSON.stringify({
187
+ controllers: Array.from(controllers),
188
+ count: controllers.size,
189
+ }, null, 2),
190
+ },
191
+ ],
192
+ };
193
+ }
194
+ async getPathsByController(url, controller) {
195
+ const swagger = await this.getSwagger(url);
196
+ const paths = [];
197
+ Object.entries(swagger.paths).forEach(([path, pathItem]) => {
198
+ Object.entries(pathItem).forEach(([method, operation]) => {
199
+ if (operation.tags?.includes(controller)) {
200
+ paths.push({
201
+ path,
202
+ method,
203
+ operationId: operation.operationId,
204
+ summary: operation.summary,
205
+ description: operation.description,
206
+ });
207
+ }
208
+ });
209
+ });
210
+ return {
211
+ content: [
212
+ {
213
+ type: "text",
214
+ text: JSON.stringify({
215
+ controller,
216
+ paths,
217
+ count: paths.length,
218
+ }, null, 2),
219
+ },
220
+ ],
221
+ };
222
+ }
223
+ async getPathDetails(url, path, method) {
224
+ const swagger = await this.getSwagger(url);
225
+ const operation = swagger.paths[path]?.[method.toLowerCase()];
226
+ if (!operation) {
227
+ throw new Error(`Path ${method.toUpperCase()} ${path} not found`);
228
+ }
229
+ // 파라미터 정보 추출
230
+ const parameters = operation.parameters?.map(param => ({
231
+ name: param.name,
232
+ in: param.in,
233
+ required: param.required,
234
+ description: param.description,
235
+ schema: this.resolveSchemaReference(param.schema, swagger),
236
+ })) || [];
237
+ // Request Body 정보 추출
238
+ let requestBody = null;
239
+ if (operation.requestBody?.content) {
240
+ const content = operation.requestBody.content;
241
+ const mediaType = Object.keys(content)[0];
242
+ if (content[mediaType]?.schema) {
243
+ requestBody = {
244
+ required: operation.requestBody.required,
245
+ mediaType,
246
+ schema: this.resolveSchemaReference(content[mediaType].schema, swagger),
247
+ };
248
+ }
249
+ }
250
+ // Response 정보 추출
251
+ const responses = {};
252
+ if (operation.responses) {
253
+ Object.entries(operation.responses).forEach(([statusCode, response]) => {
254
+ if (response.content) {
255
+ const content = response.content;
256
+ const mediaType = Object.keys(content)[0];
257
+ if (content[mediaType]?.schema) {
258
+ responses[statusCode] = {
259
+ description: response.description,
260
+ mediaType,
261
+ schema: this.resolveSchemaReference(content[mediaType].schema, swagger),
262
+ };
263
+ }
264
+ }
265
+ else {
266
+ responses[statusCode] = {
267
+ description: response.description,
268
+ };
269
+ }
270
+ });
271
+ }
272
+ return {
273
+ content: [
274
+ {
275
+ type: "text",
276
+ text: JSON.stringify({
277
+ path,
278
+ method: method.toUpperCase(),
279
+ operationId: operation.operationId,
280
+ summary: operation.summary,
281
+ description: operation.description,
282
+ tags: operation.tags,
283
+ parameters,
284
+ requestBody,
285
+ responses,
286
+ }, null, 2),
287
+ },
288
+ ],
289
+ };
290
+ }
291
+ resolveSchemaReference(schema, swagger) {
292
+ if (!schema)
293
+ return null;
294
+ if (schema.$ref) {
295
+ const resolved = this.resolveRef(schema.$ref, swagger);
296
+ return {
297
+ $ref: schema.$ref,
298
+ resolved,
299
+ };
300
+ }
301
+ if (schema.type === "array" && schema.items) {
302
+ return {
303
+ type: "array",
304
+ items: this.resolveSchemaReference(schema.items, swagger),
305
+ };
306
+ }
307
+ if (schema.type === "object" && schema.properties) {
308
+ const properties = {};
309
+ Object.entries(schema.properties).forEach(([key, value]) => {
310
+ properties[key] = this.resolveSchemaReference(value, swagger);
311
+ });
312
+ return {
313
+ type: "object",
314
+ properties,
315
+ required: schema.required,
316
+ };
317
+ }
318
+ return schema;
319
+ }
320
+ resolveRef(ref, swagger) {
321
+ const parts = ref.split("/");
322
+ let current = swagger;
323
+ for (let i = 1; i < parts.length; i++) {
324
+ current = current[parts[i]];
325
+ if (!current) {
326
+ throw new Error(`Cannot resolve reference: ${ref}`);
327
+ }
328
+ }
329
+ // 재귀적으로 중첩된 $ref도 해결
330
+ if (current.$ref) {
331
+ return this.resolveRef(current.$ref, swagger);
332
+ }
333
+ // 객체 속성에 있는 $ref도 해결
334
+ if (current.type === "object" && current.properties) {
335
+ const resolvedProperties = {};
336
+ Object.entries(current.properties).forEach(([key, value]) => {
337
+ resolvedProperties[key] = this.resolveSchemaReference(value, swagger);
338
+ });
339
+ return {
340
+ ...current,
341
+ properties: resolvedProperties,
342
+ };
343
+ }
344
+ // 배열 아이템의 $ref도 해결
345
+ if (current.type === "array" && current.items) {
346
+ return {
347
+ ...current,
348
+ items: this.resolveSchemaReference(current.items, swagger),
349
+ };
350
+ }
351
+ return current;
352
+ }
353
+ async resolveSchema(url, ref) {
354
+ const swagger = await this.getSwagger(url);
355
+ const resolved = this.resolveRef(ref, swagger);
356
+ return {
357
+ content: [
358
+ {
359
+ type: "text",
360
+ text: JSON.stringify({
361
+ ref,
362
+ resolved,
363
+ }, null, 2),
364
+ },
365
+ ],
366
+ };
367
+ }
368
+ async run() {
369
+ const transport = new StdioServerTransport();
370
+ await this.server.connect(transport);
371
+ console.error("Swagger Parser MCP Server running on stdio");
372
+ }
373
+ }
374
+ // 서버 실행
375
+ const server = new SwaggerParserServer();
376
+ server.run().catch(console.error);
377
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "exem-fe-swagger-parser-mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for parsing Swagger/OpenAPI JSON files",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "swagger-parser-mcp-server": "dist/index.js"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "files": [
14
+ "dist/**/*",
15
+ "README.md",
16
+ "package.json"
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
+ "keywords": [
25
+ "mcp",
26
+ "swagger",
27
+ "openapi",
28
+ "parser",
29
+ "api",
30
+ "documentation",
31
+ "model-context-protocol"
32
+ ],
33
+ "author": "",
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@modelcontextprotocol/sdk": "^0.5.0",
37
+ "axios": "^1.6.0",
38
+ "zod": "^3.22.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^20.0.0",
42
+ "tsx": "^4.7.0",
43
+ "typescript": "^5.3.0"
44
+ }
45
+ }