@g1cloud/api-gen 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/.claude/settings.local.json +22 -0
- package/CLAUDE.md +63 -0
- package/README.md +379 -0
- package/dist/analyzer/controllerAnalyzer.d.ts +20 -0
- package/dist/analyzer/controllerAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/controllerAnalyzer.js +101 -0
- package/dist/analyzer/controllerAnalyzer.js.map +1 -0
- package/dist/analyzer/parameterAnalyzer.d.ts +19 -0
- package/dist/analyzer/parameterAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/parameterAnalyzer.js +207 -0
- package/dist/analyzer/parameterAnalyzer.js.map +1 -0
- package/dist/analyzer/responseAnalyzer.d.ts +12 -0
- package/dist/analyzer/responseAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/responseAnalyzer.js +116 -0
- package/dist/analyzer/responseAnalyzer.js.map +1 -0
- package/dist/analyzer/schemaGenerator.d.ts +6 -0
- package/dist/analyzer/schemaGenerator.d.ts.map +1 -0
- package/dist/analyzer/schemaGenerator.js +347 -0
- package/dist/analyzer/schemaGenerator.js.map +1 -0
- package/dist/analyzer/securityAnalyzer.d.ts +6 -0
- package/dist/analyzer/securityAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/securityAnalyzer.js +177 -0
- package/dist/analyzer/securityAnalyzer.js.map +1 -0
- package/dist/generator/openapiGenerator.d.ts +14 -0
- package/dist/generator/openapiGenerator.d.ts.map +1 -0
- package/dist/generator/openapiGenerator.js +340 -0
- package/dist/generator/openapiGenerator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +61 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +199 -0
- package/dist/lib.js.map +1 -0
- package/dist/mcp-server.d.ts +9 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +257 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-server.mjs +45586 -0
- package/dist/parser/astAnalyzer.d.ts +87 -0
- package/dist/parser/astAnalyzer.d.ts.map +1 -0
- package/dist/parser/astAnalyzer.js +321 -0
- package/dist/parser/astAnalyzer.js.map +1 -0
- package/dist/parser/javaParser.d.ts +10 -0
- package/dist/parser/javaParser.d.ts.map +1 -0
- package/dist/parser/javaParser.js +805 -0
- package/dist/parser/javaParser.js.map +1 -0
- package/dist/types/index.d.ts +217 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/examples/CreateUserRequest.java +80 -0
- package/examples/DepartmentDTO.java +45 -0
- package/examples/Filter.java +39 -0
- package/examples/PaginatedList.java +71 -0
- package/examples/ProductController.java +136 -0
- package/examples/ProductDTO.java +129 -0
- package/examples/RoleDTO.java +47 -0
- package/examples/SearchParam.java +55 -0
- package/examples/Sort.java +70 -0
- package/examples/UpdateUserRequest.java +74 -0
- package/examples/UserController.java +98 -0
- package/examples/UserDTO.java +119 -0
- package/package.json +51 -0
- package/prompt/01_Initial.md +358 -0
- package/prompt/02_/354/266/224/352/260/200.md +31 -0
- package/src/analyzer/controllerAnalyzer.ts +125 -0
- package/src/analyzer/parameterAnalyzer.ts +259 -0
- package/src/analyzer/responseAnalyzer.ts +142 -0
- package/src/analyzer/schemaGenerator.ts +412 -0
- package/src/analyzer/securityAnalyzer.ts +200 -0
- package/src/generator/openapiGenerator.ts +378 -0
- package/src/index.ts +212 -0
- package/src/lib.ts +240 -0
- package/src/mcp-server.ts +310 -0
- package/src/parser/astAnalyzer.ts +373 -0
- package/src/parser/javaParser.ts +901 -0
- package/src/types/index.ts +238 -0
- package/test-boolean.yaml +607 -0
- package/test-filter.yaml +576 -0
- package/test-inner.ts +59 -0
- package/test-output.yaml +650 -0
- package/test-paginated.yaml +585 -0
- package/tsconfig.json +20 -0
- package/tsup.config.ts +30 -0
package/dist/lib.js
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Library entry point for programmatic API generation
|
|
4
|
+
* This module exports the core functionality for use by MCP server and other integrations
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.generateOpenAPI = generateOpenAPI;
|
|
41
|
+
exports.generateOpenAPIPerController = generateOpenAPIPerController;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const yaml = __importStar(require("js-yaml"));
|
|
45
|
+
const javaParser_1 = require("./parser/javaParser");
|
|
46
|
+
const controllerAnalyzer_1 = require("./analyzer/controllerAnalyzer");
|
|
47
|
+
const openapiGenerator_1 = require("./generator/openapiGenerator");
|
|
48
|
+
/**
|
|
49
|
+
* Generate OpenAPI specification from Spring Boot Java source code
|
|
50
|
+
* Returns a single combined spec for all controllers
|
|
51
|
+
*/
|
|
52
|
+
async function generateOpenAPI(options) {
|
|
53
|
+
const sources = options.source;
|
|
54
|
+
if (sources.length === 0) {
|
|
55
|
+
throw new Error('At least one source path is required');
|
|
56
|
+
}
|
|
57
|
+
// Validate source paths exist
|
|
58
|
+
for (const src of sources) {
|
|
59
|
+
const sourcePath = path.resolve(src);
|
|
60
|
+
if (!fs.existsSync(sourcePath)) {
|
|
61
|
+
throw new Error(`Source path does not exist: ${sourcePath}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Parse Java files from all source directories
|
|
65
|
+
const javaClasses = new Map();
|
|
66
|
+
for (const src of sources) {
|
|
67
|
+
const sourcePath = path.resolve(src);
|
|
68
|
+
const classes = await (0, javaParser_1.parseJavaSource)(sourcePath);
|
|
69
|
+
for (const [name, cls] of classes) {
|
|
70
|
+
javaClasses.set(name, cls);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (javaClasses.size === 0) {
|
|
74
|
+
throw new Error('No Java files found in the specified directories');
|
|
75
|
+
}
|
|
76
|
+
// Initialize processing context
|
|
77
|
+
const apiSourcePath = options.apiSource ? path.resolve(options.apiSource) : undefined;
|
|
78
|
+
const context = {
|
|
79
|
+
javaClasses,
|
|
80
|
+
controllers: [],
|
|
81
|
+
dtoSchemas: new Map(),
|
|
82
|
+
referencedTypes: new Set(),
|
|
83
|
+
apiSourcePath,
|
|
84
|
+
};
|
|
85
|
+
// Analyze controllers
|
|
86
|
+
const controllers = (0, controllerAnalyzer_1.analyzeControllers)(context);
|
|
87
|
+
context.controllers = controllers;
|
|
88
|
+
if (controllers.length === 0) {
|
|
89
|
+
throw new Error('No REST controllers found in the source files');
|
|
90
|
+
}
|
|
91
|
+
// Generate OpenAPI spec
|
|
92
|
+
const cliOptions = {
|
|
93
|
+
source: sources,
|
|
94
|
+
apiSource: options.apiSource,
|
|
95
|
+
title: options.title || 'API Documentation',
|
|
96
|
+
version: options.version || '1.0.0',
|
|
97
|
+
basePath: options.basePath,
|
|
98
|
+
};
|
|
99
|
+
const spec = (0, openapiGenerator_1.generateOpenAPISpec)(controllers, context, cliOptions);
|
|
100
|
+
// Convert to YAML
|
|
101
|
+
const yamlContent = yaml.dump(spec, {
|
|
102
|
+
indent: 2,
|
|
103
|
+
lineWidth: -1,
|
|
104
|
+
noRefs: true,
|
|
105
|
+
sortKeys: false,
|
|
106
|
+
});
|
|
107
|
+
const totalEndpoints = controllers.reduce((sum, c) => sum + c.endpoints.length, 0);
|
|
108
|
+
return {
|
|
109
|
+
spec,
|
|
110
|
+
yaml: yamlContent,
|
|
111
|
+
summary: {
|
|
112
|
+
controllerCount: controllers.length,
|
|
113
|
+
endpointCount: totalEndpoints,
|
|
114
|
+
schemaCount: Object.keys(spec.components.schemas).length,
|
|
115
|
+
controllers: controllers.map(c => ({
|
|
116
|
+
name: c.className,
|
|
117
|
+
endpointCount: c.endpoints.length,
|
|
118
|
+
})),
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Generate separate OpenAPI specifications per controller
|
|
124
|
+
*/
|
|
125
|
+
async function generateOpenAPIPerController(options) {
|
|
126
|
+
const sources = options.source;
|
|
127
|
+
if (sources.length === 0) {
|
|
128
|
+
throw new Error('At least one source path is required');
|
|
129
|
+
}
|
|
130
|
+
// Validate source paths exist
|
|
131
|
+
for (const src of sources) {
|
|
132
|
+
const sourcePath = path.resolve(src);
|
|
133
|
+
if (!fs.existsSync(sourcePath)) {
|
|
134
|
+
throw new Error(`Source path does not exist: ${sourcePath}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Parse Java files from all source directories
|
|
138
|
+
const javaClasses = new Map();
|
|
139
|
+
for (const src of sources) {
|
|
140
|
+
const sourcePath = path.resolve(src);
|
|
141
|
+
const classes = await (0, javaParser_1.parseJavaSource)(sourcePath);
|
|
142
|
+
for (const [name, cls] of classes) {
|
|
143
|
+
javaClasses.set(name, cls);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (javaClasses.size === 0) {
|
|
147
|
+
throw new Error('No Java files found in the specified directories');
|
|
148
|
+
}
|
|
149
|
+
// Initialize processing context
|
|
150
|
+
const apiSourcePath = options.apiSource ? path.resolve(options.apiSource) : undefined;
|
|
151
|
+
const context = {
|
|
152
|
+
javaClasses,
|
|
153
|
+
controllers: [],
|
|
154
|
+
dtoSchemas: new Map(),
|
|
155
|
+
referencedTypes: new Set(),
|
|
156
|
+
apiSourcePath,
|
|
157
|
+
};
|
|
158
|
+
// Analyze controllers
|
|
159
|
+
const controllers = (0, controllerAnalyzer_1.analyzeControllers)(context);
|
|
160
|
+
context.controllers = controllers;
|
|
161
|
+
if (controllers.length === 0) {
|
|
162
|
+
throw new Error('No REST controllers found in the source files');
|
|
163
|
+
}
|
|
164
|
+
// Generate OpenAPI specs per controller
|
|
165
|
+
const cliOptions = {
|
|
166
|
+
source: sources,
|
|
167
|
+
apiSource: options.apiSource,
|
|
168
|
+
title: options.title || 'API Documentation',
|
|
169
|
+
version: options.version || '1.0.0',
|
|
170
|
+
basePath: options.basePath,
|
|
171
|
+
};
|
|
172
|
+
const specs = new Map();
|
|
173
|
+
const controllerSummaries = [];
|
|
174
|
+
for (const controller of controllers) {
|
|
175
|
+
const spec = (0, openapiGenerator_1.generateOpenAPISpecForController)(controller, context, cliOptions);
|
|
176
|
+
const yamlContent = yaml.dump(spec, {
|
|
177
|
+
indent: 2,
|
|
178
|
+
lineWidth: -1,
|
|
179
|
+
noRefs: true,
|
|
180
|
+
sortKeys: false,
|
|
181
|
+
});
|
|
182
|
+
specs.set(controller.className, { spec, yaml: yamlContent });
|
|
183
|
+
controllerSummaries.push({
|
|
184
|
+
name: controller.className,
|
|
185
|
+
endpointCount: controller.endpoints.length,
|
|
186
|
+
schemaCount: Object.keys(spec.components.schemas).length,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
const totalEndpoints = controllers.reduce((sum, c) => sum + c.endpoints.length, 0);
|
|
190
|
+
return {
|
|
191
|
+
specs,
|
|
192
|
+
summary: {
|
|
193
|
+
controllerCount: controllers.length,
|
|
194
|
+
totalEndpointCount: totalEndpoints,
|
|
195
|
+
controllers: controllerSummaries,
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* MCP Server for Spring Boot to OpenAPI generation
|
|
5
|
+
*
|
|
6
|
+
* This server exposes the API generation functionality as MCP tools
|
|
7
|
+
* that can be called by AI assistants.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
11
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
12
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
13
|
+
const lib_1 = require("./lib");
|
|
14
|
+
// Create MCP server
|
|
15
|
+
const server = new index_js_1.Server({
|
|
16
|
+
name: 'spring-to-openapi',
|
|
17
|
+
version: '1.0.0',
|
|
18
|
+
}, {
|
|
19
|
+
capabilities: {
|
|
20
|
+
tools: {},
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
// Define tool schemas
|
|
24
|
+
const tools = [
|
|
25
|
+
{
|
|
26
|
+
name: 'generate-openapi',
|
|
27
|
+
description: 'Generate OpenAPI v3 YAML specification from Spring Boot Java source code. Returns a single combined spec for all REST controllers found.',
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
source: {
|
|
32
|
+
type: 'array',
|
|
33
|
+
items: { type: 'string' },
|
|
34
|
+
description: 'Java source code directory path(s) to parse',
|
|
35
|
+
},
|
|
36
|
+
apiSource: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Optional: specific directory to search for RestControllers (defaults to first source)',
|
|
39
|
+
},
|
|
40
|
+
title: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
description: 'API title (default: "API Documentation")',
|
|
43
|
+
},
|
|
44
|
+
version: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'API version (default: "1.0.0")',
|
|
47
|
+
},
|
|
48
|
+
basePath: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'API base path (e.g., "/api/v1")',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
required: ['source'],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'generate-openapi-per-controller',
|
|
58
|
+
description: 'Generate separate OpenAPI v3 YAML specifications for each REST controller. Useful when you need individual API docs per controller.',
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
source: {
|
|
63
|
+
type: 'array',
|
|
64
|
+
items: { type: 'string' },
|
|
65
|
+
description: 'Java source code directory path(s) to parse',
|
|
66
|
+
},
|
|
67
|
+
apiSource: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
description: 'Optional: specific directory to search for RestControllers',
|
|
70
|
+
},
|
|
71
|
+
title: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
description: 'API title prefix',
|
|
74
|
+
},
|
|
75
|
+
version: {
|
|
76
|
+
type: 'string',
|
|
77
|
+
description: 'API version (default: "1.0.0")',
|
|
78
|
+
},
|
|
79
|
+
basePath: {
|
|
80
|
+
type: 'string',
|
|
81
|
+
description: 'API base path',
|
|
82
|
+
},
|
|
83
|
+
controllerName: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'Optional: only generate for specific controller name',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
required: ['source'],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'list-controllers',
|
|
93
|
+
description: 'List all REST controllers found in the Spring Boot source code without generating full specs. Useful for exploring the codebase first.',
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
properties: {
|
|
97
|
+
source: {
|
|
98
|
+
type: 'array',
|
|
99
|
+
items: { type: 'string' },
|
|
100
|
+
description: 'Java source code directory path(s) to parse',
|
|
101
|
+
},
|
|
102
|
+
apiSource: {
|
|
103
|
+
type: 'string',
|
|
104
|
+
description: 'Optional: specific directory to search for RestControllers',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
required: ['source'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
// Register tools list handler
|
|
112
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
113
|
+
return { tools };
|
|
114
|
+
});
|
|
115
|
+
// Register tool call handler
|
|
116
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
117
|
+
const { name, arguments: args } = request.params;
|
|
118
|
+
try {
|
|
119
|
+
switch (name) {
|
|
120
|
+
case 'generate-openapi': {
|
|
121
|
+
const { source, apiSource, title, version, basePath } = args;
|
|
122
|
+
const result = await (0, lib_1.generateOpenAPI)({
|
|
123
|
+
source,
|
|
124
|
+
apiSource,
|
|
125
|
+
title,
|
|
126
|
+
version,
|
|
127
|
+
basePath,
|
|
128
|
+
});
|
|
129
|
+
const summaryText = [
|
|
130
|
+
'## Generation Summary',
|
|
131
|
+
`- Controllers: ${result.summary.controllerCount}`,
|
|
132
|
+
`- Endpoints: ${result.summary.endpointCount}`,
|
|
133
|
+
`- Schemas: ${result.summary.schemaCount}`,
|
|
134
|
+
'',
|
|
135
|
+
'### Controllers:',
|
|
136
|
+
...result.summary.controllers.map((c) => `- ${c.name}: ${c.endpointCount} endpoint(s)`),
|
|
137
|
+
'',
|
|
138
|
+
'---',
|
|
139
|
+
'',
|
|
140
|
+
'## OpenAPI Specification (YAML)',
|
|
141
|
+
'',
|
|
142
|
+
'```yaml',
|
|
143
|
+
result.yaml,
|
|
144
|
+
'```',
|
|
145
|
+
].join('\n');
|
|
146
|
+
return {
|
|
147
|
+
content: [{ type: 'text', text: summaryText }],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
case 'generate-openapi-per-controller': {
|
|
151
|
+
const { source, apiSource, title, version, basePath, controllerName } = args;
|
|
152
|
+
const result = await (0, lib_1.generateOpenAPIPerController)({
|
|
153
|
+
source,
|
|
154
|
+
apiSource,
|
|
155
|
+
title,
|
|
156
|
+
version,
|
|
157
|
+
basePath,
|
|
158
|
+
});
|
|
159
|
+
if (controllerName) {
|
|
160
|
+
const spec = result.specs.get(controllerName);
|
|
161
|
+
if (!spec) {
|
|
162
|
+
const available = Array.from(result.specs.keys()).join(', ');
|
|
163
|
+
return {
|
|
164
|
+
content: [
|
|
165
|
+
{
|
|
166
|
+
type: 'text',
|
|
167
|
+
text: `Controller "${controllerName}" not found. Available controllers: ${available}`,
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
isError: true,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
content: [
|
|
175
|
+
{
|
|
176
|
+
type: 'text',
|
|
177
|
+
text: [
|
|
178
|
+
`## OpenAPI Specification for ${controllerName}`,
|
|
179
|
+
'',
|
|
180
|
+
'```yaml',
|
|
181
|
+
spec.yaml,
|
|
182
|
+
'```',
|
|
183
|
+
].join('\n'),
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const parts = [
|
|
189
|
+
'## Generation Summary',
|
|
190
|
+
`- Total Controllers: ${result.summary.controllerCount}`,
|
|
191
|
+
`- Total Endpoints: ${result.summary.totalEndpointCount}`,
|
|
192
|
+
'',
|
|
193
|
+
'### Controllers:',
|
|
194
|
+
...result.summary.controllers.map((c) => `- ${c.name}: ${c.endpointCount} endpoint(s), ${c.schemaCount} schema(s)`),
|
|
195
|
+
'',
|
|
196
|
+
'---',
|
|
197
|
+
'',
|
|
198
|
+
];
|
|
199
|
+
for (const [specName, spec] of result.specs) {
|
|
200
|
+
parts.push(`## ${specName}`);
|
|
201
|
+
parts.push('');
|
|
202
|
+
parts.push('```yaml');
|
|
203
|
+
parts.push(spec.yaml);
|
|
204
|
+
parts.push('```');
|
|
205
|
+
parts.push('');
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
content: [{ type: 'text', text: parts.join('\n') }],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
case 'list-controllers': {
|
|
212
|
+
const { source, apiSource } = args;
|
|
213
|
+
const result = await (0, lib_1.generateOpenAPI)({
|
|
214
|
+
source,
|
|
215
|
+
apiSource,
|
|
216
|
+
});
|
|
217
|
+
const parts = [
|
|
218
|
+
'## REST Controllers Found',
|
|
219
|
+
'',
|
|
220
|
+
`Total: ${result.summary.controllerCount} controller(s) with ${result.summary.endpointCount} endpoint(s)`,
|
|
221
|
+
'',
|
|
222
|
+
];
|
|
223
|
+
for (const controller of result.summary.controllers) {
|
|
224
|
+
parts.push(`### ${controller.name}`);
|
|
225
|
+
parts.push(`- Endpoints: ${controller.endpointCount}`);
|
|
226
|
+
parts.push('');
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
content: [{ type: 'text', text: parts.join('\n') }],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
default:
|
|
233
|
+
return {
|
|
234
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
235
|
+
isError: true,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
241
|
+
return {
|
|
242
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
243
|
+
isError: true,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// Start the server
|
|
248
|
+
async function main() {
|
|
249
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
250
|
+
await server.connect(transport);
|
|
251
|
+
console.error('Spring-to-OpenAPI MCP Server running on stdio');
|
|
252
|
+
}
|
|
253
|
+
main().catch((error) => {
|
|
254
|
+
console.error('Fatal error:', error);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;;AAEH,wEAAmE;AACnE,wEAAiF;AACjF,iEAG4C;AAC5C,+BAAsE;AAEtE,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,iBAAM,CACvB;IACE,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,sBAAsB;AACtB,MAAM,KAAK,GAAG;IACZ;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,0IAA0I;QAC5I,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,6CAA6C;iBAC3D;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,uFAAuF;iBAC1F;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0CAA0C;iBACxD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iCAAiC;iBAC/C;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,iCAAiC;QACvC,WAAW,EACT,qIAAqI;QACvI,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,6CAA6C;iBAC3D;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4DAA4D;iBAC1E;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kBAAkB;iBAChC;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,eAAe;iBAC7B;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sDAAsD;iBACpE;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,wIAAwI;QAC1I,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,6CAA6C;iBAC3D;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4DAA4D;iBAC1E;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;CACF,CAAC;AAEF,8BAA8B;AAC9B,MAAM,CAAC,iBAAiB,CAAC,iCAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,6BAA6B;AAC7B,MAAM,CAAC,iBAAiB,CAAC,gCAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAMvD,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,EAAC;oBACnC,MAAM;oBACN,SAAS;oBACT,KAAK;oBACL,OAAO;oBACP,QAAQ;iBACT,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG;oBAClB,uBAAuB;oBACvB,kBAAkB,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE;oBAClD,gBAAgB,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE;oBAC9C,cAAc,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;oBAC1C,EAAE;oBACF,kBAAkB;oBAClB,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,aAAa,cAAc,CACrD;oBACD,EAAE;oBACF,KAAK;oBACL,EAAE;oBACF,iCAAiC;oBACjC,EAAE;oBACF,SAAS;oBACT,MAAM,CAAC,IAAI;oBACX,KAAK;iBACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;iBAC/C,CAAC;YACJ,CAAC;YAED,KAAK,iCAAiC,CAAC,CAAC,CAAC;gBACvC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,GACnE,IAOC,CAAC;gBAEJ,MAAM,MAAM,GAAG,MAAM,IAAA,kCAA4B,EAAC;oBAChD,MAAM;oBACN,SAAS;oBACT,KAAK;oBACL,OAAO;oBACP,QAAQ;iBACT,CAAC,CAAC;gBAEH,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7D,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,eAAe,cAAc,uCAAuC,SAAS,EAAE;iCACtF;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBAED,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE;oCACJ,gCAAgC,cAAc,EAAE;oCAChD,EAAE;oCACF,SAAS;oCACT,IAAI,CAAC,IAAI;oCACT,KAAK;iCACN,CAAC,IAAI,CAAC,IAAI,CAAC;6BACb;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAa;oBACtB,uBAAuB;oBACvB,wBAAwB,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE;oBACxD,sBAAsB,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE;oBACzD,EAAE;oBACF,kBAAkB;oBAClB,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,aAAa,iBAAiB,CAAC,CAAC,WAAW,YAAY,CAC5E;oBACD,EAAE;oBACF,KAAK;oBACL,EAAE;iBACH,CAAC;gBAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC5C,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;YAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAG7B,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,EAAC;oBACnC,MAAM;oBACN,SAAS;iBACV,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAa;oBACtB,2BAA2B;oBAC3B,EAAE;oBACF,UAAU,MAAM,CAAC,OAAO,CAAC,eAAe,uBAAuB,MAAM,CAAC,OAAO,CAAC,aAAa,cAAc;oBACzG,EAAE;iBACH,CAAC;gBAEF,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;oBACpD,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrC,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;oBACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;YAED;gBACE,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;oBAC1D,OAAO,EAAE,IAAI;iBACd,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACjE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|