@robinmordasiewicz/f5xc-api-mcp 3.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/CHANGELOG.md +74 -0
- package/README.md +234 -0
- package/dist/auth/credential-manager.d.ts +116 -0
- package/dist/auth/credential-manager.d.ts.map +1 -0
- package/dist/auth/credential-manager.js +208 -0
- package/dist/auth/credential-manager.js.map +1 -0
- package/dist/auth/http-client.d.ts +81 -0
- package/dist/auth/http-client.d.ts.map +1 -0
- package/dist/auth/http-client.js +197 -0
- package/dist/auth/http-client.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +6 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/generator/index.d.ts +7 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +7 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/naming/acronyms.d.ts +81 -0
- package/dist/generator/naming/acronyms.d.ts.map +1 -0
- package/dist/generator/naming/acronyms.js +253 -0
- package/dist/generator/naming/acronyms.js.map +1 -0
- package/dist/generator/naming/index.d.ts +6 -0
- package/dist/generator/naming/index.d.ts.map +1 -0
- package/dist/generator/naming/index.js +6 -0
- package/dist/generator/naming/index.js.map +1 -0
- package/dist/generator/naming/volterra-mapping.d.ts +102 -0
- package/dist/generator/naming/volterra-mapping.d.ts.map +1 -0
- package/dist/generator/naming/volterra-mapping.js +259 -0
- package/dist/generator/naming/volterra-mapping.js.map +1 -0
- package/dist/generator/openapi-parser.d.ts +339 -0
- package/dist/generator/openapi-parser.d.ts.map +1 -0
- package/dist/generator/openapi-parser.js +463 -0
- package/dist/generator/openapi-parser.js.map +1 -0
- package/dist/generator/tool-generator.d.ts +74 -0
- package/dist/generator/tool-generator.d.ts.map +1 -0
- package/dist/generator/tool-generator.js +387 -0
- package/dist/generator/tool-generator.js.map +1 -0
- package/dist/generator/transformers/index.d.ts +7 -0
- package/dist/generator/transformers/index.d.ts.map +1 -0
- package/dist/generator/transformers/index.js +7 -0
- package/dist/generator/transformers/index.js.map +1 -0
- package/dist/generator/transformers/normalize-examples.d.ts +48 -0
- package/dist/generator/transformers/normalize-examples.d.ts.map +1 -0
- package/dist/generator/transformers/normalize-examples.js +66 -0
- package/dist/generator/transformers/normalize-examples.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +5 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/workflows.d.ts +59 -0
- package/dist/prompts/workflows.d.ts.map +1 -0
- package/dist/prompts/workflows.js +585 -0
- package/dist/prompts/workflows.js.map +1 -0
- package/dist/resources/handlers.d.ts +72 -0
- package/dist/resources/handlers.d.ts.map +1 -0
- package/dist/resources/handlers.js +279 -0
- package/dist/resources/handlers.js.map +1 -0
- package/dist/resources/index.d.ts +8 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +6 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/templates.d.ts +86 -0
- package/dist/resources/templates.d.ts.map +1 -0
- package/dist/resources/templates.js +248 -0
- package/dist/resources/templates.js.map +1 -0
- package/dist/server.d.ts +78 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +426 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/discovery/consolidate.d.ts +97 -0
- package/dist/tools/discovery/consolidate.d.ts.map +1 -0
- package/dist/tools/discovery/consolidate.js +200 -0
- package/dist/tools/discovery/consolidate.js.map +1 -0
- package/dist/tools/discovery/describe.d.ts +132 -0
- package/dist/tools/discovery/describe.d.ts.map +1 -0
- package/dist/tools/discovery/describe.js +206 -0
- package/dist/tools/discovery/describe.js.map +1 -0
- package/dist/tools/discovery/execute.d.ts +98 -0
- package/dist/tools/discovery/execute.d.ts.map +1 -0
- package/dist/tools/discovery/execute.js +251 -0
- package/dist/tools/discovery/execute.js.map +1 -0
- package/dist/tools/discovery/index-loader.d.ts +28 -0
- package/dist/tools/discovery/index-loader.d.ts.map +1 -0
- package/dist/tools/discovery/index-loader.js +69 -0
- package/dist/tools/discovery/index-loader.js.map +1 -0
- package/dist/tools/discovery/index.d.ts +185 -0
- package/dist/tools/discovery/index.d.ts.map +1 -0
- package/dist/tools/discovery/index.js +177 -0
- package/dist/tools/discovery/index.js.map +1 -0
- package/dist/tools/discovery/search.d.ts +41 -0
- package/dist/tools/discovery/search.d.ts.map +1 -0
- package/dist/tools/discovery/search.js +155 -0
- package/dist/tools/discovery/search.js.map +1 -0
- package/dist/tools/discovery/types.d.ts +70 -0
- package/dist/tools/discovery/types.d.ts.map +1 -0
- package/dist/tools/discovery/types.js +9 -0
- package/dist/tools/discovery/types.js.map +1 -0
- package/dist/tools/generated/ai_intelligence/index.d.ts +8 -0
- package/dist/tools/generated/ai_intelligence/index.d.ts.map +1 -0
- package/dist/tools/generated/ai_intelligence/index.js +282 -0
- package/dist/tools/generated/ai_intelligence/index.js.map +1 -0
- package/dist/tools/generated/api_security/index.d.ts +8 -0
- package/dist/tools/generated/api_security/index.d.ts.map +1 -0
- package/dist/tools/generated/api_security/index.js +1852 -0
- package/dist/tools/generated/api_security/index.js.map +1 -0
- package/dist/tools/generated/applications/index.d.ts +8 -0
- package/dist/tools/generated/applications/index.d.ts.map +1 -0
- package/dist/tools/generated/applications/index.js +1589 -0
- package/dist/tools/generated/applications/index.js.map +1 -0
- package/dist/tools/generated/bigip/index.d.ts +8 -0
- package/dist/tools/generated/bigip/index.d.ts.map +1 -0
- package/dist/tools/generated/bigip/index.js +1173 -0
- package/dist/tools/generated/bigip/index.js.map +1 -0
- package/dist/tools/generated/billing/index.d.ts +8 -0
- package/dist/tools/generated/billing/index.d.ts.map +1 -0
- package/dist/tools/generated/billing/index.js +759 -0
- package/dist/tools/generated/billing/index.js.map +1 -0
- package/dist/tools/generated/cdn/index.d.ts +8 -0
- package/dist/tools/generated/cdn/index.d.ts.map +1 -0
- package/dist/tools/generated/cdn/index.js +841 -0
- package/dist/tools/generated/cdn/index.js.map +1 -0
- package/dist/tools/generated/config/index.d.ts +8 -0
- package/dist/tools/generated/config/index.d.ts.map +1 -0
- package/dist/tools/generated/config/index.js +316 -0
- package/dist/tools/generated/config/index.js.map +1 -0
- package/dist/tools/generated/identity/index.d.ts +8 -0
- package/dist/tools/generated/identity/index.d.ts.map +1 -0
- package/dist/tools/generated/identity/index.js +5371 -0
- package/dist/tools/generated/identity/index.js.map +1 -0
- package/dist/tools/generated/infrastructure/index.d.ts +8 -0
- package/dist/tools/generated/infrastructure/index.d.ts.map +1 -0
- package/dist/tools/generated/infrastructure/index.js +5342 -0
- package/dist/tools/generated/infrastructure/index.js.map +1 -0
- package/dist/tools/generated/infrastructure_protection/index.d.ts +8 -0
- package/dist/tools/generated/infrastructure_protection/index.d.ts.map +1 -0
- package/dist/tools/generated/infrastructure_protection/index.js +2919 -0
- package/dist/tools/generated/infrastructure_protection/index.js.map +1 -0
- package/dist/tools/generated/integrations/index.d.ts +8 -0
- package/dist/tools/generated/integrations/index.d.ts.map +1 -0
- package/dist/tools/generated/integrations/index.js +1995 -0
- package/dist/tools/generated/integrations/index.js.map +1 -0
- package/dist/tools/generated/load_balancer/index.d.ts +8 -0
- package/dist/tools/generated/load_balancer/index.d.ts.map +1 -0
- package/dist/tools/generated/load_balancer/index.js +2269 -0
- package/dist/tools/generated/load_balancer/index.js.map +1 -0
- package/dist/tools/generated/networking/index.d.ts +8 -0
- package/dist/tools/generated/networking/index.d.ts.map +1 -0
- package/dist/tools/generated/networking/index.js +11289 -0
- package/dist/tools/generated/networking/index.js.map +1 -0
- package/dist/tools/generated/nginx/index.d.ts +8 -0
- package/dist/tools/generated/nginx/index.d.ts.map +1 -0
- package/dist/tools/generated/nginx/index.js +680 -0
- package/dist/tools/generated/nginx/index.js.map +1 -0
- package/dist/tools/generated/observability/index.d.ts +8 -0
- package/dist/tools/generated/observability/index.d.ts.map +1 -0
- package/dist/tools/generated/observability/index.js +6140 -0
- package/dist/tools/generated/observability/index.js.map +1 -0
- package/dist/tools/generated/operations/index.d.ts +8 -0
- package/dist/tools/generated/operations/index.d.ts.map +1 -0
- package/dist/tools/generated/operations/index.js +1759 -0
- package/dist/tools/generated/operations/index.js.map +1 -0
- package/dist/tools/generated/security/index.d.ts +8 -0
- package/dist/tools/generated/security/index.d.ts.map +1 -0
- package/dist/tools/generated/security/index.js +9111 -0
- package/dist/tools/generated/security/index.js.map +1 -0
- package/dist/tools/generated/service_mesh/index.d.ts +8 -0
- package/dist/tools/generated/service_mesh/index.d.ts.map +1 -0
- package/dist/tools/generated/service_mesh/index.js +1628 -0
- package/dist/tools/generated/service_mesh/index.js.map +1 -0
- package/dist/tools/generated/shape_security/index.d.ts +8 -0
- package/dist/tools/generated/shape_security/index.d.ts.map +1 -0
- package/dist/tools/generated/shape_security/index.js +4121 -0
- package/dist/tools/generated/shape_security/index.js.map +1 -0
- package/dist/tools/generated/subscriptions/index.d.ts +8 -0
- package/dist/tools/generated/subscriptions/index.d.ts.map +1 -0
- package/dist/tools/generated/subscriptions/index.js +778 -0
- package/dist/tools/generated/subscriptions/index.js.map +1 -0
- package/dist/tools/generated/tenant_management/index.d.ts +8 -0
- package/dist/tools/generated/tenant_management/index.d.ts.map +1 -0
- package/dist/tools/generated/tenant_management/index.js +2292 -0
- package/dist/tools/generated/tenant_management/index.js.map +1 -0
- package/dist/tools/generated/vpn/index.d.ts +8 -0
- package/dist/tools/generated/vpn/index.d.ts.map +1 -0
- package/dist/tools/generated/vpn/index.js +1183 -0
- package/dist/tools/generated/vpn/index.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +27 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +83 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/utils/error-handling.d.ts +109 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js +239 -0
- package/dist/utils/error-handling.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logging.d.ts +75 -0
- package/dist/utils/logging.d.ts.map +1 -0
- package/dist/utils/logging.js +131 -0
- package/dist/utils/logging.js.map +1 -0
- package/manifest.json +143 -0
- package/package.json +95 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI Specification Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses F5 Distributed Cloud OpenAPI specifications and extracts
|
|
5
|
+
* operation metadata for MCP tool generation.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, readdirSync, existsSync } from "fs";
|
|
8
|
+
import { join, extname, relative, basename } from "path";
|
|
9
|
+
import YAML from "yaml";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { transformText, extractDomainFromPath, extractResourceFromPath, methodToOperation, generateToolName, } from "./naming/index.js";
|
|
12
|
+
import { normalizeTitleAcronyms } from "./naming/acronyms.js";
|
|
13
|
+
import { normalizeExamples } from "./transformers/index.js";
|
|
14
|
+
import { logger } from "../utils/logging.js";
|
|
15
|
+
/**
|
|
16
|
+
* OpenAPI Schema Types
|
|
17
|
+
*/
|
|
18
|
+
const OpenApiParameterSchema = z.object({
|
|
19
|
+
name: z.string(),
|
|
20
|
+
in: z.enum(["path", "query", "header", "cookie"]),
|
|
21
|
+
required: z.boolean().optional(),
|
|
22
|
+
description: z.string().optional(),
|
|
23
|
+
schema: z.record(z.string(), z.unknown()).optional(),
|
|
24
|
+
});
|
|
25
|
+
const OpenApiRequestBodySchema = z.object({
|
|
26
|
+
required: z.boolean().optional(),
|
|
27
|
+
description: z.string().optional(),
|
|
28
|
+
content: z
|
|
29
|
+
.record(z.string(), z.object({
|
|
30
|
+
schema: z.record(z.string(), z.unknown()).optional(),
|
|
31
|
+
}))
|
|
32
|
+
.optional(),
|
|
33
|
+
});
|
|
34
|
+
const OpenApiResponseSchema = z.object({
|
|
35
|
+
description: z.string().optional(),
|
|
36
|
+
content: z
|
|
37
|
+
.record(z.string(), z.object({
|
|
38
|
+
schema: z.record(z.string(), z.unknown()).optional(),
|
|
39
|
+
}))
|
|
40
|
+
.optional(),
|
|
41
|
+
});
|
|
42
|
+
const OpenApiOperationSchema = z.object({
|
|
43
|
+
operationId: z.string().optional(),
|
|
44
|
+
summary: z.string().optional(),
|
|
45
|
+
description: z.string().optional(),
|
|
46
|
+
tags: z.array(z.string()).optional(),
|
|
47
|
+
parameters: z.array(OpenApiParameterSchema).optional(),
|
|
48
|
+
requestBody: OpenApiRequestBodySchema.optional(),
|
|
49
|
+
responses: z.record(z.string(), OpenApiResponseSchema).optional(),
|
|
50
|
+
security: z.array(z.record(z.string(), z.array(z.string()))).optional(),
|
|
51
|
+
"x-ves-proto-rpc": z.string().optional(),
|
|
52
|
+
});
|
|
53
|
+
const OpenApiPathItemSchema = z.object({
|
|
54
|
+
get: OpenApiOperationSchema.optional(),
|
|
55
|
+
post: OpenApiOperationSchema.optional(),
|
|
56
|
+
put: OpenApiOperationSchema.optional(),
|
|
57
|
+
delete: OpenApiOperationSchema.optional(),
|
|
58
|
+
patch: OpenApiOperationSchema.optional(),
|
|
59
|
+
parameters: z.array(OpenApiParameterSchema).optional(),
|
|
60
|
+
});
|
|
61
|
+
const OpenApiSpecSchema = z.object({
|
|
62
|
+
openapi: z.string().optional(),
|
|
63
|
+
swagger: z.string().optional(),
|
|
64
|
+
info: z.object({
|
|
65
|
+
title: z.string(),
|
|
66
|
+
version: z.string(),
|
|
67
|
+
description: z.string().optional(),
|
|
68
|
+
}),
|
|
69
|
+
paths: z.record(z.string(), OpenApiPathItemSchema).optional(),
|
|
70
|
+
components: z
|
|
71
|
+
.object({
|
|
72
|
+
schemas: z.record(z.string(), z.unknown()).optional(),
|
|
73
|
+
securitySchemes: z.record(z.string(), z.unknown()).optional(),
|
|
74
|
+
})
|
|
75
|
+
.optional(),
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
78
|
+
* Parse a single OpenAPI specification file
|
|
79
|
+
* @param filePath - Absolute path to the spec file
|
|
80
|
+
* @param basePath - Optional base path for creating relative sourceFile paths (for deterministic output)
|
|
81
|
+
* @deprecated Use parseDomainSpecFile() for pre-enriched domain specs from robinmordasiewicz/f5xc-api-enriched
|
|
82
|
+
*/
|
|
83
|
+
export function parseSpecFile(filePath, basePath) {
|
|
84
|
+
try {
|
|
85
|
+
const content = readFileSync(filePath, "utf-8");
|
|
86
|
+
const ext = extname(filePath).toLowerCase();
|
|
87
|
+
let rawSpec;
|
|
88
|
+
if (ext === ".yaml" || ext === ".yml") {
|
|
89
|
+
rawSpec = YAML.parse(content);
|
|
90
|
+
}
|
|
91
|
+
else if (ext === ".json") {
|
|
92
|
+
rawSpec = JSON.parse(content);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
logger.warn(`Unsupported file extension: ${ext}`, { file: filePath });
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Validate spec structure
|
|
99
|
+
const parseResult = OpenApiSpecSchema.safeParse(rawSpec);
|
|
100
|
+
if (!parseResult.success) {
|
|
101
|
+
logger.debug(`Invalid OpenAPI spec: ${filePath}`, {
|
|
102
|
+
errors: parseResult.error.issues,
|
|
103
|
+
});
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const spec = parseResult.data;
|
|
107
|
+
// Use relative path for sourceFile to ensure deterministic output across environments
|
|
108
|
+
const sourceFile = basePath ? relative(basePath, filePath) : filePath;
|
|
109
|
+
const operations = extractOperations(spec, sourceFile);
|
|
110
|
+
return {
|
|
111
|
+
filePath,
|
|
112
|
+
title: transformText(normalizeTitleAcronyms(spec.info.title)),
|
|
113
|
+
version: spec.info.version,
|
|
114
|
+
operations,
|
|
115
|
+
schemas: spec.components?.schemas ?? {},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
logger.error(`Failed to parse spec file: ${filePath}`, {
|
|
120
|
+
error: error instanceof Error ? error.message : String(error),
|
|
121
|
+
});
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Extract operations from parsed spec
|
|
127
|
+
*/
|
|
128
|
+
function extractOperations(spec, sourceFile) {
|
|
129
|
+
const operations = [];
|
|
130
|
+
if (!spec.paths) {
|
|
131
|
+
return operations;
|
|
132
|
+
}
|
|
133
|
+
const httpMethods = ["get", "post", "put", "delete", "patch"];
|
|
134
|
+
// Sort paths alphabetically for deterministic output (use < > for locale-independent sorting)
|
|
135
|
+
const sortedPaths = Object.entries(spec.paths).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
136
|
+
for (const [path, pathItem] of sortedPaths) {
|
|
137
|
+
// Check if path has a name parameter (indicates single resource operations)
|
|
138
|
+
const hasNameParam = path.includes("{name}") || path.includes("{id}");
|
|
139
|
+
// Get path-level parameters
|
|
140
|
+
const pathLevelParams = pathItem.parameters ?? [];
|
|
141
|
+
for (const method of httpMethods) {
|
|
142
|
+
const operation = pathItem[method];
|
|
143
|
+
if (!operation) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// Determine operation type and generate tool name
|
|
147
|
+
const operationType = methodToOperation(method, hasNameParam);
|
|
148
|
+
const domain = extractDomainFromPath(path);
|
|
149
|
+
const resource = extractResourceFromPath(path);
|
|
150
|
+
const toolName = generateToolName(domain, resource, operationType);
|
|
151
|
+
// Combine path and operation parameters
|
|
152
|
+
const allParams = [...pathLevelParams, ...(operation.parameters ?? [])];
|
|
153
|
+
const pathParameters = allParams.filter((p) => p.in === "path");
|
|
154
|
+
const queryParameters = allParams.filter((p) => p.in === "query");
|
|
155
|
+
// Extract request body schema
|
|
156
|
+
let requestBodySchema = null;
|
|
157
|
+
if (operation.requestBody?.content) {
|
|
158
|
+
const jsonContent = operation.requestBody.content["application/json"];
|
|
159
|
+
if (jsonContent?.schema) {
|
|
160
|
+
requestBodySchema = jsonContent.schema;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Extract response schema (from 200 or first success response)
|
|
164
|
+
let responseSchema = null;
|
|
165
|
+
if (operation.responses) {
|
|
166
|
+
const successResponse = operation.responses["200"] ?? operation.responses["201"];
|
|
167
|
+
if (successResponse?.content) {
|
|
168
|
+
const jsonContent = successResponse.content["application/json"];
|
|
169
|
+
if (jsonContent?.schema) {
|
|
170
|
+
responseSchema = jsonContent.schema;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Collect required parameters
|
|
175
|
+
const requiredParams = [];
|
|
176
|
+
for (const param of allParams) {
|
|
177
|
+
if (param.required) {
|
|
178
|
+
requiredParams.push(param.name);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (operation.requestBody?.required) {
|
|
182
|
+
requiredParams.push("body");
|
|
183
|
+
}
|
|
184
|
+
// Transform text content and normalize examples
|
|
185
|
+
const summary = transformText(normalizeTitleAcronyms(operation.summary ?? `${operationType} ${resource}`));
|
|
186
|
+
const description = normalizeExamples(transformText(operation.description ?? ""));
|
|
187
|
+
// Normalize parameter descriptions
|
|
188
|
+
const normalizedPathParams = pathParameters.map((p) => ({
|
|
189
|
+
...p,
|
|
190
|
+
description: p.description ? normalizeExamples(p.description) : p.description,
|
|
191
|
+
}));
|
|
192
|
+
const normalizedQueryParams = queryParameters.map((p) => ({
|
|
193
|
+
...p,
|
|
194
|
+
description: p.description ? normalizeExamples(p.description) : p.description,
|
|
195
|
+
}));
|
|
196
|
+
operations.push({
|
|
197
|
+
toolName,
|
|
198
|
+
method: method.toUpperCase(),
|
|
199
|
+
path,
|
|
200
|
+
operation: operationType,
|
|
201
|
+
domain,
|
|
202
|
+
resource,
|
|
203
|
+
summary,
|
|
204
|
+
description,
|
|
205
|
+
pathParameters: normalizedPathParams,
|
|
206
|
+
queryParameters: normalizedQueryParams,
|
|
207
|
+
requestBodySchema,
|
|
208
|
+
responseSchema,
|
|
209
|
+
requiredParams,
|
|
210
|
+
operationId: operation.operationId ?? null,
|
|
211
|
+
tags: operation.tags ?? [],
|
|
212
|
+
sourceFile,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return operations;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Parse all spec files in a directory
|
|
220
|
+
* @deprecated Use parseDomainsDirectory() for pre-enriched domain specs from robinmordasiewicz/f5xc-api-enriched
|
|
221
|
+
*/
|
|
222
|
+
export function parseSpecDirectory(dirPath) {
|
|
223
|
+
const specs = [];
|
|
224
|
+
if (!existsSync(dirPath)) {
|
|
225
|
+
logger.warn(`Spec directory does not exist: ${dirPath}`);
|
|
226
|
+
return specs;
|
|
227
|
+
}
|
|
228
|
+
// Use parent of dirPath as base for relative paths (makes paths like "raw/filename.json")
|
|
229
|
+
const basePath = join(dirPath, "..");
|
|
230
|
+
function scanDir(currentDir) {
|
|
231
|
+
const entries = readdirSync(currentDir, { withFileTypes: true });
|
|
232
|
+
// Sort entries alphabetically for deterministic output across different filesystems (locale-independent)
|
|
233
|
+
entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
234
|
+
for (const entry of entries) {
|
|
235
|
+
const fullPath = join(currentDir, entry.name);
|
|
236
|
+
if (entry.isDirectory()) {
|
|
237
|
+
scanDir(fullPath);
|
|
238
|
+
}
|
|
239
|
+
else if (entry.name.endsWith(".json") ||
|
|
240
|
+
entry.name.endsWith(".yaml") ||
|
|
241
|
+
entry.name.endsWith(".yml")) {
|
|
242
|
+
const spec = parseSpecFile(fullPath, basePath);
|
|
243
|
+
if (spec && spec.operations.length > 0) {
|
|
244
|
+
specs.push(spec);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
scanDir(dirPath);
|
|
250
|
+
logger.info(`Parsed ${specs.length} spec files`, {
|
|
251
|
+
totalOperations: specs.reduce((sum, s) => sum + s.operations.length, 0),
|
|
252
|
+
});
|
|
253
|
+
return specs;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get all unique operations across all specs
|
|
257
|
+
*/
|
|
258
|
+
export function getAllOperations(specs) {
|
|
259
|
+
const operationsMap = new Map();
|
|
260
|
+
for (const spec of specs) {
|
|
261
|
+
for (const operation of spec.operations) {
|
|
262
|
+
// Use tool name as unique key to deduplicate
|
|
263
|
+
if (!operationsMap.has(operation.toolName)) {
|
|
264
|
+
operationsMap.set(operation.toolName, operation);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Sort by toolName for deterministic output (locale-independent)
|
|
269
|
+
return Array.from(operationsMap.values()).sort((a, b) => a.toolName < b.toolName ? -1 : a.toolName > b.toolName ? 1 : 0);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Group operations by domain
|
|
273
|
+
*/
|
|
274
|
+
export function groupOperationsByDomain(operations) {
|
|
275
|
+
const grouped = new Map();
|
|
276
|
+
for (const operation of operations) {
|
|
277
|
+
const domain = operation.domain;
|
|
278
|
+
if (!grouped.has(domain)) {
|
|
279
|
+
grouped.set(domain, []);
|
|
280
|
+
}
|
|
281
|
+
grouped.get(domain).push(operation);
|
|
282
|
+
}
|
|
283
|
+
// Sort operations within each domain by toolName for deterministic output (locale-independent)
|
|
284
|
+
for (const ops of grouped.values()) {
|
|
285
|
+
ops.sort((a, b) => (a.toolName < b.toolName ? -1 : a.toolName > b.toolName ? 1 : 0));
|
|
286
|
+
}
|
|
287
|
+
// Return a new Map with sorted domain keys for deterministic iteration order
|
|
288
|
+
const sortedGrouped = new Map();
|
|
289
|
+
const sortedDomains = Array.from(grouped.keys()).sort();
|
|
290
|
+
for (const domain of sortedDomains) {
|
|
291
|
+
sortedGrouped.set(domain, grouped.get(domain));
|
|
292
|
+
}
|
|
293
|
+
return sortedGrouped;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Extract operations from an enriched domain spec (pre-normalized upstream)
|
|
297
|
+
* This skips transformation since enriched specs are already normalized
|
|
298
|
+
*/
|
|
299
|
+
function extractDomainOperations(spec, domain, sourceFile) {
|
|
300
|
+
const operations = [];
|
|
301
|
+
if (!spec.paths) {
|
|
302
|
+
return operations;
|
|
303
|
+
}
|
|
304
|
+
const httpMethods = ["get", "post", "put", "delete", "patch"];
|
|
305
|
+
// Sort paths alphabetically for deterministic output
|
|
306
|
+
const sortedPaths = Object.entries(spec.paths).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
307
|
+
for (const [path, pathItem] of sortedPaths) {
|
|
308
|
+
// Check if path has a name parameter (indicates single resource operations)
|
|
309
|
+
const hasNameParam = path.includes("{name}") || path.includes("{id}");
|
|
310
|
+
// Get path-level parameters
|
|
311
|
+
const pathLevelParams = pathItem.parameters ?? [];
|
|
312
|
+
for (const method of httpMethods) {
|
|
313
|
+
const operation = pathItem[method];
|
|
314
|
+
if (!operation) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
// Determine operation type and generate tool name
|
|
318
|
+
const operationType = methodToOperation(method, hasNameParam);
|
|
319
|
+
const resource = extractResourceFromPath(path);
|
|
320
|
+
const toolName = generateToolName(domain, resource, operationType);
|
|
321
|
+
// Combine path and operation parameters
|
|
322
|
+
const allParams = [...pathLevelParams, ...(operation.parameters ?? [])];
|
|
323
|
+
const pathParameters = allParams.filter((p) => p.in === "path");
|
|
324
|
+
const queryParameters = allParams.filter((p) => p.in === "query");
|
|
325
|
+
// Extract request body schema
|
|
326
|
+
let requestBodySchema = null;
|
|
327
|
+
if (operation.requestBody?.content) {
|
|
328
|
+
const jsonContent = operation.requestBody.content["application/json"];
|
|
329
|
+
if (jsonContent?.schema) {
|
|
330
|
+
requestBodySchema = jsonContent.schema;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Extract response schema (from 200 or first success response)
|
|
334
|
+
let responseSchema = null;
|
|
335
|
+
if (operation.responses) {
|
|
336
|
+
const successResponse = operation.responses["200"] ?? operation.responses["201"];
|
|
337
|
+
if (successResponse?.content) {
|
|
338
|
+
const jsonContent = successResponse.content["application/json"];
|
|
339
|
+
if (jsonContent?.schema) {
|
|
340
|
+
responseSchema = jsonContent.schema;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Collect required parameters
|
|
345
|
+
const requiredParams = [];
|
|
346
|
+
for (const param of allParams) {
|
|
347
|
+
if (param.required) {
|
|
348
|
+
requiredParams.push(param.name);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (operation.requestBody?.required) {
|
|
352
|
+
requiredParams.push("body");
|
|
353
|
+
}
|
|
354
|
+
// Use content as-is - enriched specs are already normalized
|
|
355
|
+
const summary = operation.summary ?? `${operationType} ${resource}`;
|
|
356
|
+
const description = operation.description ?? "";
|
|
357
|
+
operations.push({
|
|
358
|
+
toolName,
|
|
359
|
+
method: method.toUpperCase(),
|
|
360
|
+
path,
|
|
361
|
+
operation: operationType,
|
|
362
|
+
domain,
|
|
363
|
+
resource,
|
|
364
|
+
summary,
|
|
365
|
+
description,
|
|
366
|
+
pathParameters,
|
|
367
|
+
queryParameters,
|
|
368
|
+
requestBodySchema,
|
|
369
|
+
responseSchema,
|
|
370
|
+
requiredParams,
|
|
371
|
+
operationId: operation.operationId ?? null,
|
|
372
|
+
tags: operation.tags ?? [],
|
|
373
|
+
sourceFile,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return operations;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Parse a single enriched domain specification file
|
|
381
|
+
* Domain is derived from the filename (e.g., load_balancer.json → load_balancer)
|
|
382
|
+
*
|
|
383
|
+
* @param filePath - Absolute path to the domain spec file
|
|
384
|
+
* @param basePath - Optional base path for creating relative sourceFile paths
|
|
385
|
+
*/
|
|
386
|
+
export function parseDomainSpecFile(filePath, basePath) {
|
|
387
|
+
try {
|
|
388
|
+
const content = readFileSync(filePath, "utf-8");
|
|
389
|
+
const ext = extname(filePath).toLowerCase();
|
|
390
|
+
if (ext !== ".json") {
|
|
391
|
+
logger.warn(`Domain specs must be JSON: ${ext}`, { file: filePath });
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
const rawSpec = JSON.parse(content);
|
|
395
|
+
// Validate spec structure
|
|
396
|
+
const parseResult = OpenApiSpecSchema.safeParse(rawSpec);
|
|
397
|
+
if (!parseResult.success) {
|
|
398
|
+
logger.debug(`Invalid OpenAPI spec: ${filePath}`, {
|
|
399
|
+
errors: parseResult.error.issues,
|
|
400
|
+
});
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
const spec = parseResult.data;
|
|
404
|
+
// Derive domain from filename (load_balancer.json → load_balancer)
|
|
405
|
+
const filename = basename(filePath, ext);
|
|
406
|
+
const domain = filename.replace(/-/g, "_");
|
|
407
|
+
// Use relative path for sourceFile to ensure deterministic output
|
|
408
|
+
const sourceFile = basePath ? relative(basePath, filePath) : filePath;
|
|
409
|
+
// Extract operations using domain-specific function (no transformations)
|
|
410
|
+
const operations = extractDomainOperations(spec, domain, sourceFile);
|
|
411
|
+
// Title is already normalized in enriched specs
|
|
412
|
+
return {
|
|
413
|
+
filePath,
|
|
414
|
+
title: spec.info.title,
|
|
415
|
+
version: spec.info.version,
|
|
416
|
+
operations,
|
|
417
|
+
schemas: spec.components?.schemas ?? {},
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
logger.error(`Failed to parse domain spec file: ${filePath}`, {
|
|
422
|
+
error: error instanceof Error ? error.message : String(error),
|
|
423
|
+
});
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Parse all enriched domain specs from a directory
|
|
429
|
+
* This is the primary entry point for the new enriched spec format
|
|
430
|
+
*
|
|
431
|
+
* @param dirPath - Path to the domains directory (specs/domains/)
|
|
432
|
+
*/
|
|
433
|
+
export function parseDomainsDirectory(dirPath) {
|
|
434
|
+
const specs = [];
|
|
435
|
+
if (!existsSync(dirPath)) {
|
|
436
|
+
logger.warn(`Domains directory does not exist: ${dirPath}`);
|
|
437
|
+
return specs;
|
|
438
|
+
}
|
|
439
|
+
// Use parent of dirPath as base for relative paths (makes paths like "domains/filename.json")
|
|
440
|
+
const basePath = join(dirPath, "..");
|
|
441
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
442
|
+
// Sort entries alphabetically for deterministic output
|
|
443
|
+
entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
444
|
+
for (const entry of entries) {
|
|
445
|
+
if (entry.isDirectory()) {
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
if (!entry.name.endsWith(".json")) {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
const fullPath = join(dirPath, entry.name);
|
|
452
|
+
const spec = parseDomainSpecFile(fullPath, basePath);
|
|
453
|
+
if (spec && spec.operations.length > 0) {
|
|
454
|
+
specs.push(spec);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
logger.info(`Parsed ${specs.length} domain spec files`, {
|
|
458
|
+
totalOperations: specs.reduce((sum, s) => sum + s.operations.length, 0),
|
|
459
|
+
domains: specs.map((s) => basename(s.filePath, ".json")),
|
|
460
|
+
});
|
|
461
|
+
return specs;
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=openapi-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-parser.js","sourceRoot":"","sources":["../../src/generator/openapi-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates MCP tool definitions from parsed OpenAPI operations.
|
|
5
|
+
* Handles both documentation mode and execution mode tool behaviors.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
import { ParsedOperation } from "./openapi-parser.js";
|
|
9
|
+
import { CredentialManager } from "../auth/credential-manager.js";
|
|
10
|
+
import { HttpClient } from "../auth/http-client.js";
|
|
11
|
+
/**
|
|
12
|
+
* Tool response for documentation mode
|
|
13
|
+
*/
|
|
14
|
+
export interface DocumentationResponse {
|
|
15
|
+
mode: "documentation";
|
|
16
|
+
tool: string;
|
|
17
|
+
description: string;
|
|
18
|
+
httpMethod: string;
|
|
19
|
+
apiPath: string;
|
|
20
|
+
parameters: ParameterInfo[];
|
|
21
|
+
requestBody: RequestBodyInfo | null;
|
|
22
|
+
exampleRequest: Record<string, unknown> | null;
|
|
23
|
+
f5xcctlCommand: string;
|
|
24
|
+
terraformResource: string;
|
|
25
|
+
terraformExample: string;
|
|
26
|
+
prerequisites: string[];
|
|
27
|
+
subscriptionTier: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tool response for execution mode
|
|
31
|
+
*/
|
|
32
|
+
export interface ExecutionResponse {
|
|
33
|
+
mode: "execution";
|
|
34
|
+
tool: string;
|
|
35
|
+
status: "success" | "error";
|
|
36
|
+
response: unknown;
|
|
37
|
+
resourceUrl: string | null;
|
|
38
|
+
duration: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parameter information for documentation
|
|
42
|
+
*/
|
|
43
|
+
export interface ParameterInfo {
|
|
44
|
+
name: string;
|
|
45
|
+
location: "path" | "query" | "body";
|
|
46
|
+
type: string;
|
|
47
|
+
required: boolean;
|
|
48
|
+
description: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Request body information for documentation
|
|
52
|
+
*/
|
|
53
|
+
export interface RequestBodyInfo {
|
|
54
|
+
required: boolean;
|
|
55
|
+
contentType: string;
|
|
56
|
+
schema: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Subscription tier constants
|
|
60
|
+
*/
|
|
61
|
+
export declare const SUBSCRIPTION_TIERS: {
|
|
62
|
+
readonly NO_TIER: "NO_TIER";
|
|
63
|
+
readonly STANDARD: "STANDARD";
|
|
64
|
+
readonly ADVANCED: "ADVANCED";
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Register a tool on the MCP server
|
|
68
|
+
*/
|
|
69
|
+
export declare function registerTool(server: McpServer, operation: ParsedOperation, credentialManager: CredentialManager, httpClient: HttpClient | null): void;
|
|
70
|
+
/**
|
|
71
|
+
* Register all tools from parsed operations
|
|
72
|
+
*/
|
|
73
|
+
export declare function registerAllTools(server: McpServer, operations: ParsedOperation[], credentialManager: CredentialManager, httpClient: HttpClient | null): void;
|
|
74
|
+
//# sourceMappingURL=tool-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-generator.d.ts","sourceRoot":"","sources":["../../src/generator/tool-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAoB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAY,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAyTX;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,eAAe,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,GAAG,IAAI,GAC5B,IAAI,CAoGN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,eAAe,EAAE,EAC7B,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,GAAG,IAAI,GAC5B,IAAI,CAMN"}
|