@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.
Files changed (212) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +234 -0
  3. package/dist/auth/credential-manager.d.ts +116 -0
  4. package/dist/auth/credential-manager.d.ts.map +1 -0
  5. package/dist/auth/credential-manager.js +208 -0
  6. package/dist/auth/credential-manager.js.map +1 -0
  7. package/dist/auth/http-client.d.ts +81 -0
  8. package/dist/auth/http-client.d.ts.map +1 -0
  9. package/dist/auth/http-client.js +197 -0
  10. package/dist/auth/http-client.js.map +1 -0
  11. package/dist/auth/index.d.ts +8 -0
  12. package/dist/auth/index.d.ts.map +1 -0
  13. package/dist/auth/index.js +6 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/generator/index.d.ts +7 -0
  16. package/dist/generator/index.d.ts.map +1 -0
  17. package/dist/generator/index.js +7 -0
  18. package/dist/generator/index.js.map +1 -0
  19. package/dist/generator/naming/acronyms.d.ts +81 -0
  20. package/dist/generator/naming/acronyms.d.ts.map +1 -0
  21. package/dist/generator/naming/acronyms.js +253 -0
  22. package/dist/generator/naming/acronyms.js.map +1 -0
  23. package/dist/generator/naming/index.d.ts +6 -0
  24. package/dist/generator/naming/index.d.ts.map +1 -0
  25. package/dist/generator/naming/index.js +6 -0
  26. package/dist/generator/naming/index.js.map +1 -0
  27. package/dist/generator/naming/volterra-mapping.d.ts +102 -0
  28. package/dist/generator/naming/volterra-mapping.d.ts.map +1 -0
  29. package/dist/generator/naming/volterra-mapping.js +259 -0
  30. package/dist/generator/naming/volterra-mapping.js.map +1 -0
  31. package/dist/generator/openapi-parser.d.ts +339 -0
  32. package/dist/generator/openapi-parser.d.ts.map +1 -0
  33. package/dist/generator/openapi-parser.js +463 -0
  34. package/dist/generator/openapi-parser.js.map +1 -0
  35. package/dist/generator/tool-generator.d.ts +74 -0
  36. package/dist/generator/tool-generator.d.ts.map +1 -0
  37. package/dist/generator/tool-generator.js +387 -0
  38. package/dist/generator/tool-generator.js.map +1 -0
  39. package/dist/generator/transformers/index.d.ts +7 -0
  40. package/dist/generator/transformers/index.d.ts.map +1 -0
  41. package/dist/generator/transformers/index.js +7 -0
  42. package/dist/generator/transformers/index.js.map +1 -0
  43. package/dist/generator/transformers/normalize-examples.d.ts +48 -0
  44. package/dist/generator/transformers/normalize-examples.d.ts.map +1 -0
  45. package/dist/generator/transformers/normalize-examples.js +66 -0
  46. package/dist/generator/transformers/normalize-examples.js.map +1 -0
  47. package/dist/index.d.ts +21 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +70 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/prompts/index.d.ts +6 -0
  52. package/dist/prompts/index.d.ts.map +1 -0
  53. package/dist/prompts/index.js +5 -0
  54. package/dist/prompts/index.js.map +1 -0
  55. package/dist/prompts/workflows.d.ts +59 -0
  56. package/dist/prompts/workflows.d.ts.map +1 -0
  57. package/dist/prompts/workflows.js +585 -0
  58. package/dist/prompts/workflows.js.map +1 -0
  59. package/dist/resources/handlers.d.ts +72 -0
  60. package/dist/resources/handlers.d.ts.map +1 -0
  61. package/dist/resources/handlers.js +279 -0
  62. package/dist/resources/handlers.js.map +1 -0
  63. package/dist/resources/index.d.ts +8 -0
  64. package/dist/resources/index.d.ts.map +1 -0
  65. package/dist/resources/index.js +6 -0
  66. package/dist/resources/index.js.map +1 -0
  67. package/dist/resources/templates.d.ts +86 -0
  68. package/dist/resources/templates.d.ts.map +1 -0
  69. package/dist/resources/templates.js +248 -0
  70. package/dist/resources/templates.js.map +1 -0
  71. package/dist/server.d.ts +78 -0
  72. package/dist/server.d.ts.map +1 -0
  73. package/dist/server.js +426 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/tools/discovery/consolidate.d.ts +97 -0
  76. package/dist/tools/discovery/consolidate.d.ts.map +1 -0
  77. package/dist/tools/discovery/consolidate.js +200 -0
  78. package/dist/tools/discovery/consolidate.js.map +1 -0
  79. package/dist/tools/discovery/describe.d.ts +132 -0
  80. package/dist/tools/discovery/describe.d.ts.map +1 -0
  81. package/dist/tools/discovery/describe.js +206 -0
  82. package/dist/tools/discovery/describe.js.map +1 -0
  83. package/dist/tools/discovery/execute.d.ts +98 -0
  84. package/dist/tools/discovery/execute.d.ts.map +1 -0
  85. package/dist/tools/discovery/execute.js +251 -0
  86. package/dist/tools/discovery/execute.js.map +1 -0
  87. package/dist/tools/discovery/index-loader.d.ts +28 -0
  88. package/dist/tools/discovery/index-loader.d.ts.map +1 -0
  89. package/dist/tools/discovery/index-loader.js +69 -0
  90. package/dist/tools/discovery/index-loader.js.map +1 -0
  91. package/dist/tools/discovery/index.d.ts +185 -0
  92. package/dist/tools/discovery/index.d.ts.map +1 -0
  93. package/dist/tools/discovery/index.js +177 -0
  94. package/dist/tools/discovery/index.js.map +1 -0
  95. package/dist/tools/discovery/search.d.ts +41 -0
  96. package/dist/tools/discovery/search.d.ts.map +1 -0
  97. package/dist/tools/discovery/search.js +155 -0
  98. package/dist/tools/discovery/search.js.map +1 -0
  99. package/dist/tools/discovery/types.d.ts +70 -0
  100. package/dist/tools/discovery/types.d.ts.map +1 -0
  101. package/dist/tools/discovery/types.js +9 -0
  102. package/dist/tools/discovery/types.js.map +1 -0
  103. package/dist/tools/generated/ai_intelligence/index.d.ts +8 -0
  104. package/dist/tools/generated/ai_intelligence/index.d.ts.map +1 -0
  105. package/dist/tools/generated/ai_intelligence/index.js +282 -0
  106. package/dist/tools/generated/ai_intelligence/index.js.map +1 -0
  107. package/dist/tools/generated/api_security/index.d.ts +8 -0
  108. package/dist/tools/generated/api_security/index.d.ts.map +1 -0
  109. package/dist/tools/generated/api_security/index.js +1852 -0
  110. package/dist/tools/generated/api_security/index.js.map +1 -0
  111. package/dist/tools/generated/applications/index.d.ts +8 -0
  112. package/dist/tools/generated/applications/index.d.ts.map +1 -0
  113. package/dist/tools/generated/applications/index.js +1589 -0
  114. package/dist/tools/generated/applications/index.js.map +1 -0
  115. package/dist/tools/generated/bigip/index.d.ts +8 -0
  116. package/dist/tools/generated/bigip/index.d.ts.map +1 -0
  117. package/dist/tools/generated/bigip/index.js +1173 -0
  118. package/dist/tools/generated/bigip/index.js.map +1 -0
  119. package/dist/tools/generated/billing/index.d.ts +8 -0
  120. package/dist/tools/generated/billing/index.d.ts.map +1 -0
  121. package/dist/tools/generated/billing/index.js +759 -0
  122. package/dist/tools/generated/billing/index.js.map +1 -0
  123. package/dist/tools/generated/cdn/index.d.ts +8 -0
  124. package/dist/tools/generated/cdn/index.d.ts.map +1 -0
  125. package/dist/tools/generated/cdn/index.js +841 -0
  126. package/dist/tools/generated/cdn/index.js.map +1 -0
  127. package/dist/tools/generated/config/index.d.ts +8 -0
  128. package/dist/tools/generated/config/index.d.ts.map +1 -0
  129. package/dist/tools/generated/config/index.js +316 -0
  130. package/dist/tools/generated/config/index.js.map +1 -0
  131. package/dist/tools/generated/identity/index.d.ts +8 -0
  132. package/dist/tools/generated/identity/index.d.ts.map +1 -0
  133. package/dist/tools/generated/identity/index.js +5371 -0
  134. package/dist/tools/generated/identity/index.js.map +1 -0
  135. package/dist/tools/generated/infrastructure/index.d.ts +8 -0
  136. package/dist/tools/generated/infrastructure/index.d.ts.map +1 -0
  137. package/dist/tools/generated/infrastructure/index.js +5342 -0
  138. package/dist/tools/generated/infrastructure/index.js.map +1 -0
  139. package/dist/tools/generated/infrastructure_protection/index.d.ts +8 -0
  140. package/dist/tools/generated/infrastructure_protection/index.d.ts.map +1 -0
  141. package/dist/tools/generated/infrastructure_protection/index.js +2919 -0
  142. package/dist/tools/generated/infrastructure_protection/index.js.map +1 -0
  143. package/dist/tools/generated/integrations/index.d.ts +8 -0
  144. package/dist/tools/generated/integrations/index.d.ts.map +1 -0
  145. package/dist/tools/generated/integrations/index.js +1995 -0
  146. package/dist/tools/generated/integrations/index.js.map +1 -0
  147. package/dist/tools/generated/load_balancer/index.d.ts +8 -0
  148. package/dist/tools/generated/load_balancer/index.d.ts.map +1 -0
  149. package/dist/tools/generated/load_balancer/index.js +2269 -0
  150. package/dist/tools/generated/load_balancer/index.js.map +1 -0
  151. package/dist/tools/generated/networking/index.d.ts +8 -0
  152. package/dist/tools/generated/networking/index.d.ts.map +1 -0
  153. package/dist/tools/generated/networking/index.js +11289 -0
  154. package/dist/tools/generated/networking/index.js.map +1 -0
  155. package/dist/tools/generated/nginx/index.d.ts +8 -0
  156. package/dist/tools/generated/nginx/index.d.ts.map +1 -0
  157. package/dist/tools/generated/nginx/index.js +680 -0
  158. package/dist/tools/generated/nginx/index.js.map +1 -0
  159. package/dist/tools/generated/observability/index.d.ts +8 -0
  160. package/dist/tools/generated/observability/index.d.ts.map +1 -0
  161. package/dist/tools/generated/observability/index.js +6140 -0
  162. package/dist/tools/generated/observability/index.js.map +1 -0
  163. package/dist/tools/generated/operations/index.d.ts +8 -0
  164. package/dist/tools/generated/operations/index.d.ts.map +1 -0
  165. package/dist/tools/generated/operations/index.js +1759 -0
  166. package/dist/tools/generated/operations/index.js.map +1 -0
  167. package/dist/tools/generated/security/index.d.ts +8 -0
  168. package/dist/tools/generated/security/index.d.ts.map +1 -0
  169. package/dist/tools/generated/security/index.js +9111 -0
  170. package/dist/tools/generated/security/index.js.map +1 -0
  171. package/dist/tools/generated/service_mesh/index.d.ts +8 -0
  172. package/dist/tools/generated/service_mesh/index.d.ts.map +1 -0
  173. package/dist/tools/generated/service_mesh/index.js +1628 -0
  174. package/dist/tools/generated/service_mesh/index.js.map +1 -0
  175. package/dist/tools/generated/shape_security/index.d.ts +8 -0
  176. package/dist/tools/generated/shape_security/index.d.ts.map +1 -0
  177. package/dist/tools/generated/shape_security/index.js +4121 -0
  178. package/dist/tools/generated/shape_security/index.js.map +1 -0
  179. package/dist/tools/generated/subscriptions/index.d.ts +8 -0
  180. package/dist/tools/generated/subscriptions/index.d.ts.map +1 -0
  181. package/dist/tools/generated/subscriptions/index.js +778 -0
  182. package/dist/tools/generated/subscriptions/index.js.map +1 -0
  183. package/dist/tools/generated/tenant_management/index.d.ts +8 -0
  184. package/dist/tools/generated/tenant_management/index.d.ts.map +1 -0
  185. package/dist/tools/generated/tenant_management/index.js +2292 -0
  186. package/dist/tools/generated/tenant_management/index.js.map +1 -0
  187. package/dist/tools/generated/vpn/index.d.ts +8 -0
  188. package/dist/tools/generated/vpn/index.d.ts.map +1 -0
  189. package/dist/tools/generated/vpn/index.js +1183 -0
  190. package/dist/tools/generated/vpn/index.js.map +1 -0
  191. package/dist/tools/index.d.ts +7 -0
  192. package/dist/tools/index.d.ts.map +1 -0
  193. package/dist/tools/index.js +6 -0
  194. package/dist/tools/index.js.map +1 -0
  195. package/dist/tools/registry.d.ts +27 -0
  196. package/dist/tools/registry.d.ts.map +1 -0
  197. package/dist/tools/registry.js +83 -0
  198. package/dist/tools/registry.js.map +1 -0
  199. package/dist/utils/error-handling.d.ts +109 -0
  200. package/dist/utils/error-handling.d.ts.map +1 -0
  201. package/dist/utils/error-handling.js +239 -0
  202. package/dist/utils/error-handling.js.map +1 -0
  203. package/dist/utils/index.d.ts +7 -0
  204. package/dist/utils/index.d.ts.map +1 -0
  205. package/dist/utils/index.js +6 -0
  206. package/dist/utils/index.js.map +1 -0
  207. package/dist/utils/logging.d.ts +75 -0
  208. package/dist/utils/logging.d.ts.map +1 -0
  209. package/dist/utils/logging.js +131 -0
  210. package/dist/utils/logging.js.map +1 -0
  211. package/manifest.json +143 -0
  212. package/package.json +95 -0
@@ -0,0 +1,387 @@
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 { z } from "zod";
8
+ import { AuthMode } from "../auth/credential-manager.js";
9
+ import { formatErrorForMcp } from "../utils/error-handling.js";
10
+ import { logger } from "../utils/logging.js";
11
+ /**
12
+ * Subscription tier constants
13
+ */
14
+ export const SUBSCRIPTION_TIERS = {
15
+ NO_TIER: "NO_TIER",
16
+ STANDARD: "STANDARD",
17
+ ADVANCED: "ADVANCED",
18
+ };
19
+ /**
20
+ * Map resource types to subscription tiers
21
+ */
22
+ const RESOURCE_TIER_MAP = {
23
+ // Standard tier resources
24
+ http_loadbalancer: SUBSCRIPTION_TIERS.STANDARD,
25
+ origin_pool: SUBSCRIPTION_TIERS.STANDARD,
26
+ dns_zone: SUBSCRIPTION_TIERS.STANDARD,
27
+ healthcheck: SUBSCRIPTION_TIERS.STANDARD,
28
+ // Advanced tier resources
29
+ app_firewall: SUBSCRIPTION_TIERS.ADVANCED,
30
+ bot_defense: SUBSCRIPTION_TIERS.ADVANCED,
31
+ api_discovery: SUBSCRIPTION_TIERS.ADVANCED,
32
+ malicious_user_detection: SUBSCRIPTION_TIERS.ADVANCED,
33
+ // Core resources (no tier)
34
+ namespace: SUBSCRIPTION_TIERS.NO_TIER,
35
+ certificate: SUBSCRIPTION_TIERS.NO_TIER,
36
+ secret: SUBSCRIPTION_TIERS.NO_TIER,
37
+ };
38
+ /**
39
+ * Get subscription tier for a resource type
40
+ */
41
+ function getSubscriptionTier(resource) {
42
+ const normalizedResource = resource.toLowerCase().replace(/-/g, "_");
43
+ return RESOURCE_TIER_MAP[normalizedResource] ?? SUBSCRIPTION_TIERS.NO_TIER;
44
+ }
45
+ /**
46
+ * Generate f5xcctl equivalent command
47
+ */
48
+ function generateF5xcctlCommand(operation) {
49
+ const resource = operation.resource.replace(/-/g, "_");
50
+ switch (operation.operation) {
51
+ case "list":
52
+ return `f5xcctl get ${resource}s -n {namespace}`;
53
+ case "get":
54
+ return `f5xcctl get ${resource} {name} -n {namespace}`;
55
+ case "create":
56
+ return `f5xcctl apply -f ${resource}.yaml`;
57
+ case "update":
58
+ return `f5xcctl apply -f ${resource}.yaml`;
59
+ case "delete":
60
+ return `f5xcctl delete ${resource} {name} -n {namespace}`;
61
+ default:
62
+ return `f5xcctl ${operation.operation} ${resource}`;
63
+ }
64
+ }
65
+ /**
66
+ * Generate Terraform resource name
67
+ */
68
+ function generateTerraformResource(operation) {
69
+ const resource = operation.resource.replace(/-/g, "_");
70
+ return `volterra_${resource}`;
71
+ }
72
+ /**
73
+ * Generate Terraform example
74
+ */
75
+ function generateTerraformExample(operation) {
76
+ const resource = operation.resource.replace(/-/g, "_");
77
+ const terraformResource = `volterra_${resource}`;
78
+ if (operation.operation !== "create" && operation.operation !== "update") {
79
+ return `# Use data source for ${operation.operation} operations\ndata "${terraformResource}" "example" {\n name = "example"\n namespace = "default"\n}`;
80
+ }
81
+ return `resource "${terraformResource}" "example" {
82
+ name = "example"
83
+ namespace = "default"
84
+
85
+ # Add resource-specific configuration here
86
+ # See F5XC Terraform Provider documentation for details
87
+ }`;
88
+ }
89
+ /**
90
+ * Generate prerequisites based on resource type
91
+ */
92
+ function generatePrerequisites(operation) {
93
+ const prerequisites = [];
94
+ // Common prerequisites
95
+ if (operation.path.includes("{namespace}")) {
96
+ prerequisites.push("Namespace must exist");
97
+ }
98
+ // Resource-specific prerequisites
99
+ const resource = operation.resource.toLowerCase();
100
+ if (resource.includes("loadbalancer") || resource.includes("lb")) {
101
+ prerequisites.push("Origin pool required for backend configuration");
102
+ prerequisites.push("DNS zone required for automatic DNS management (optional)");
103
+ }
104
+ if (resource.includes("origin") && resource.includes("pool")) {
105
+ prerequisites.push("Backend servers must be accessible");
106
+ prerequisites.push("Health check configuration recommended");
107
+ }
108
+ if (resource.includes("site")) {
109
+ prerequisites.push("Cloud credentials must be configured");
110
+ prerequisites.push("VPC/VNet must exist in target cloud");
111
+ }
112
+ if (resource.includes("waf") || resource.includes("firewall")) {
113
+ prerequisites.push("WAAP subscription required");
114
+ }
115
+ return prerequisites;
116
+ }
117
+ /**
118
+ * Convert OpenAPI parameter to Zod schema
119
+ */
120
+ function parameterToZodSchema(param) {
121
+ const schema = param.schema;
122
+ const type = schema?.type;
123
+ let zodSchema;
124
+ switch (type) {
125
+ case "integer":
126
+ zodSchema = z.number().int();
127
+ break;
128
+ case "number":
129
+ zodSchema = z.number();
130
+ break;
131
+ case "boolean":
132
+ zodSchema = z.boolean();
133
+ break;
134
+ case "array":
135
+ zodSchema = z.array(z.unknown());
136
+ break;
137
+ case "object":
138
+ zodSchema = z.record(z.string(), z.unknown());
139
+ break;
140
+ default:
141
+ zodSchema = z.string();
142
+ }
143
+ if (!param.required) {
144
+ zodSchema = zodSchema.optional();
145
+ }
146
+ if (param.description) {
147
+ zodSchema = zodSchema.describe(param.description);
148
+ }
149
+ return zodSchema;
150
+ }
151
+ /**
152
+ * Build Zod schema for tool parameters
153
+ */
154
+ function buildToolSchema(operation) {
155
+ const shape = {};
156
+ // Add path parameters
157
+ for (const param of operation.pathParameters) {
158
+ shape[param.name] = parameterToZodSchema(param);
159
+ }
160
+ // Add query parameters
161
+ for (const param of operation.queryParameters) {
162
+ shape[param.name] = parameterToZodSchema(param);
163
+ }
164
+ // Add body parameter for create/update operations
165
+ if (operation.requestBodySchema &&
166
+ (operation.operation === "create" || operation.operation === "update")) {
167
+ shape["body"] = z
168
+ .record(z.string(), z.unknown())
169
+ .optional()
170
+ .describe("Request body (JSON object)");
171
+ }
172
+ return z.object(shape);
173
+ }
174
+ /**
175
+ * Build documentation response for a tool
176
+ */
177
+ function buildDocumentationResponse(operation) {
178
+ const parameters = [];
179
+ // Add path parameters
180
+ for (const param of operation.pathParameters) {
181
+ parameters.push({
182
+ name: param.name,
183
+ location: "path",
184
+ type: param.schema?.type ?? "string",
185
+ required: param.required ?? true,
186
+ description: param.description ?? "",
187
+ });
188
+ }
189
+ // Add query parameters
190
+ for (const param of operation.queryParameters) {
191
+ parameters.push({
192
+ name: param.name,
193
+ location: "query",
194
+ type: param.schema?.type ?? "string",
195
+ required: param.required ?? false,
196
+ description: param.description ?? "",
197
+ });
198
+ }
199
+ // Add body info
200
+ let requestBody = null;
201
+ if (operation.requestBodySchema) {
202
+ requestBody = {
203
+ required: operation.requiredParams.includes("body"),
204
+ contentType: "application/json",
205
+ schema: operation.requestBodySchema,
206
+ };
207
+ parameters.push({
208
+ name: "body",
209
+ location: "body",
210
+ type: "object",
211
+ required: operation.requiredParams.includes("body"),
212
+ description: "Request body as JSON object",
213
+ });
214
+ }
215
+ return {
216
+ mode: "documentation",
217
+ tool: operation.toolName,
218
+ description: operation.summary,
219
+ httpMethod: operation.method,
220
+ apiPath: operation.path,
221
+ parameters,
222
+ requestBody,
223
+ exampleRequest: generateExampleRequest(operation),
224
+ f5xcctlCommand: generateF5xcctlCommand(operation),
225
+ terraformResource: generateTerraformResource(operation),
226
+ terraformExample: generateTerraformExample(operation),
227
+ prerequisites: generatePrerequisites(operation),
228
+ subscriptionTier: getSubscriptionTier(operation.resource),
229
+ };
230
+ }
231
+ /**
232
+ * Generate example request for documentation
233
+ */
234
+ function generateExampleRequest(operation) {
235
+ if (operation.operation !== "create" && operation.operation !== "update") {
236
+ return null;
237
+ }
238
+ // Generate a basic example based on the resource type
239
+ const resource = operation.resource.toLowerCase();
240
+ if (resource.includes("loadbalancer") || resource.includes("lb")) {
241
+ return {
242
+ metadata: {
243
+ name: "example-lb",
244
+ namespace: "default",
245
+ },
246
+ spec: {
247
+ domains: ["app.example.com"],
248
+ default_route_pools: [
249
+ {
250
+ pool: {
251
+ tenant: "your-tenant",
252
+ namespace: "default",
253
+ name: "example-origin-pool",
254
+ },
255
+ },
256
+ ],
257
+ },
258
+ };
259
+ }
260
+ if (resource.includes("origin") && resource.includes("pool")) {
261
+ return {
262
+ metadata: {
263
+ name: "example-origin-pool",
264
+ namespace: "default",
265
+ },
266
+ spec: {
267
+ origin_servers: [
268
+ {
269
+ public_ip: {
270
+ ip: "10.0.0.1",
271
+ },
272
+ },
273
+ ],
274
+ port: 80,
275
+ no_tls: {},
276
+ },
277
+ };
278
+ }
279
+ // Generic example
280
+ return {
281
+ metadata: {
282
+ name: `example-${resource}`,
283
+ namespace: "default",
284
+ },
285
+ spec: {},
286
+ };
287
+ }
288
+ /**
289
+ * Register a tool on the MCP server
290
+ */
291
+ export function registerTool(server, operation, credentialManager, httpClient) {
292
+ const schema = buildToolSchema(operation);
293
+ const description = `${operation.summary}\n\nDomain: ${operation.domain}\nResource: ${operation.resource}\nHTTP: ${operation.method} ${operation.path}`;
294
+ server.tool(operation.toolName, description, schema.shape, async (params) => {
295
+ try {
296
+ // Check authentication mode
297
+ if (credentialManager.getAuthMode() === AuthMode.NONE || !httpClient) {
298
+ // Documentation mode - return API documentation
299
+ const docResponse = buildDocumentationResponse(operation);
300
+ return {
301
+ content: [
302
+ {
303
+ type: "text",
304
+ text: JSON.stringify(docResponse, null, 2),
305
+ },
306
+ ],
307
+ };
308
+ }
309
+ // Execution mode - make actual API call
310
+ const startTime = Date.now();
311
+ // Build API path with parameters
312
+ let apiPath = operation.path;
313
+ for (const param of operation.pathParameters) {
314
+ const value = params[param.name];
315
+ if (value !== undefined) {
316
+ apiPath = apiPath.replace(`{${param.name}}`, String(value));
317
+ }
318
+ }
319
+ // Build query string
320
+ const queryParams = new URLSearchParams();
321
+ for (const param of operation.queryParameters) {
322
+ const value = params[param.name];
323
+ if (value !== undefined) {
324
+ queryParams.append(param.name, String(value));
325
+ }
326
+ }
327
+ if (queryParams.toString()) {
328
+ apiPath += `?${queryParams.toString()}`;
329
+ }
330
+ // Execute request
331
+ let response;
332
+ const body = params["body"];
333
+ switch (operation.method) {
334
+ case "GET":
335
+ response = await httpClient.get(apiPath);
336
+ break;
337
+ case "POST":
338
+ response = await httpClient.post(apiPath, body);
339
+ break;
340
+ case "PUT":
341
+ response = await httpClient.put(apiPath, body);
342
+ break;
343
+ case "DELETE":
344
+ response = await httpClient.delete(apiPath);
345
+ break;
346
+ default:
347
+ throw new Error(`Unsupported HTTP method: ${operation.method}`);
348
+ }
349
+ const duration = Date.now() - startTime;
350
+ const tenant = credentialManager.getTenant();
351
+ const resourceUrl = tenant ? `https://${tenant}.console.ves.volterra.io${apiPath}` : null;
352
+ const execResponse = {
353
+ mode: "execution",
354
+ tool: operation.toolName,
355
+ status: "success",
356
+ response: response.data,
357
+ resourceUrl,
358
+ duration,
359
+ };
360
+ return {
361
+ content: [
362
+ {
363
+ type: "text",
364
+ text: JSON.stringify(execResponse, null, 2),
365
+ },
366
+ ],
367
+ };
368
+ }
369
+ catch (error) {
370
+ logger.error(`Tool execution failed: ${operation.toolName}`, {
371
+ error: error instanceof Error ? error.message : String(error),
372
+ });
373
+ return formatErrorForMcp(error);
374
+ }
375
+ });
376
+ logger.debug(`Registered tool: ${operation.toolName}`);
377
+ }
378
+ /**
379
+ * Register all tools from parsed operations
380
+ */
381
+ export function registerAllTools(server, operations, credentialManager, httpClient) {
382
+ for (const operation of operations) {
383
+ registerTool(server, operation, credentialManager, httpClient);
384
+ }
385
+ logger.info(`Registered ${operations.length} tools`);
386
+ }
387
+ //# sourceMappingURL=tool-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-generator.js","sourceRoot":"","sources":["../../src/generator/tool-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Transformers Module
3
+ *
4
+ * Exports text and schema transformation utilities for OpenAPI processing.
5
+ */
6
+ export { normalizeExamples, normalizeParameterExamples, hasMyPrefixExamples, } from "./normalize-examples.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generator/transformers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Transformers Module
3
+ *
4
+ * Exports text and schema transformation utilities for OpenAPI processing.
5
+ */
6
+ export { normalizeExamples, normalizeParameterExamples, hasMyPrefixExamples, } from "./normalize-examples.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generator/transformers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Example Normalization Transformer
3
+ *
4
+ * Normalizes example names in OpenAPI descriptions to follow
5
+ * the project's naming convention (using "example-" prefix).
6
+ *
7
+ * @deprecated Pre-enriched specs already have normalized examples.
8
+ * This module is only used by the deprecated parseSpecDirectory() function.
9
+ */
10
+ /**
11
+ * Normalize examples in a description string
12
+ *
13
+ * Replaces "my-" prefixed example names with "example-" prefix
14
+ * to maintain consistent naming conventions throughout the codebase.
15
+ *
16
+ * @param description - The description text to normalize
17
+ * @returns Normalized description with "example-" prefixes
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * normalizeExamples("my-file, shared/my-file, my-ns/my-file")
22
+ * // Returns: "example-file, shared/example-file, example-ns/example-file"
23
+ *
24
+ * normalizeExamples("Use namespace 'my-namespace' with resource 'my-lb'")
25
+ * // Returns: "Use namespace 'example-namespace' with resource 'example-lb'"
26
+ * ```
27
+ * @deprecated Pre-enriched specs already have normalized examples
28
+ */
29
+ export declare function normalizeExamples(description: string): string;
30
+ /**
31
+ * Normalize examples in a parameter object
32
+ *
33
+ * Creates a new parameter object with normalized description
34
+ *
35
+ * @param param - The parameter object to normalize
36
+ * @returns New parameter object with normalized description
37
+ */
38
+ export declare function normalizeParameterExamples<T extends {
39
+ description?: string;
40
+ }>(param: T): T;
41
+ /**
42
+ * Check if a string contains "my-" prefixed examples
43
+ *
44
+ * @param text - Text to check
45
+ * @returns True if "my-" prefixed examples are found
46
+ */
47
+ export declare function hasMyPrefixExamples(text: string): boolean;
48
+ //# sourceMappingURL=normalize-examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-examples.d.ts","sourceRoot":"","sources":["../../../src/generator/transformers/normalize-examples.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAQ1F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Example Normalization Transformer
3
+ *
4
+ * Normalizes example names in OpenAPI descriptions to follow
5
+ * the project's naming convention (using "example-" prefix).
6
+ *
7
+ * @deprecated Pre-enriched specs already have normalized examples.
8
+ * This module is only used by the deprecated parseSpecDirectory() function.
9
+ */
10
+ /**
11
+ * Pattern to match "my-" prefixed example names
12
+ * Matches whole words only to avoid partial replacements
13
+ */
14
+ const MY_PREFIX_PATTERN = /\bmy-(\w+)/g;
15
+ /**
16
+ * Normalize examples in a description string
17
+ *
18
+ * Replaces "my-" prefixed example names with "example-" prefix
19
+ * to maintain consistent naming conventions throughout the codebase.
20
+ *
21
+ * @param description - The description text to normalize
22
+ * @returns Normalized description with "example-" prefixes
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * normalizeExamples("my-file, shared/my-file, my-ns/my-file")
27
+ * // Returns: "example-file, shared/example-file, example-ns/example-file"
28
+ *
29
+ * normalizeExamples("Use namespace 'my-namespace' with resource 'my-lb'")
30
+ * // Returns: "Use namespace 'example-namespace' with resource 'example-lb'"
31
+ * ```
32
+ * @deprecated Pre-enriched specs already have normalized examples
33
+ */
34
+ export function normalizeExamples(description) {
35
+ if (!description) {
36
+ return description;
37
+ }
38
+ return description.replace(MY_PREFIX_PATTERN, "example-$1");
39
+ }
40
+ /**
41
+ * Normalize examples in a parameter object
42
+ *
43
+ * Creates a new parameter object with normalized description
44
+ *
45
+ * @param param - The parameter object to normalize
46
+ * @returns New parameter object with normalized description
47
+ */
48
+ export function normalizeParameterExamples(param) {
49
+ if (!param.description) {
50
+ return param;
51
+ }
52
+ return {
53
+ ...param,
54
+ description: normalizeExamples(param.description),
55
+ };
56
+ }
57
+ /**
58
+ * Check if a string contains "my-" prefixed examples
59
+ *
60
+ * @param text - Text to check
61
+ * @returns True if "my-" prefixed examples are found
62
+ */
63
+ export function hasMyPrefixExamples(text) {
64
+ return MY_PREFIX_PATTERN.test(text);
65
+ }
66
+ //# sourceMappingURL=normalize-examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-examples.js","sourceRoot":"","sources":["../../../src/generator/transformers/normalize-examples.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAqC,KAAQ;IACrF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * F5 Distributed Cloud API MCP Server
4
+ *
5
+ * Entry point for the MCP server that provides tools for interacting
6
+ * with F5 XC APIs via Model Context Protocol.
7
+ *
8
+ * Supports dual-mode operation:
9
+ * - Documentation mode: No credentials required - provides API documentation,
10
+ * f5xcctl equivalents, and Terraform examples
11
+ * - Execution mode: When F5XC credentials are provided, enables direct API calls
12
+ *
13
+ * Environment Variables:
14
+ * - F5XC_API_URL: Tenant URL (auto-normalized)
15
+ * - F5XC_API_TOKEN: API token for authentication
16
+ * - F5XC_P12_FILE: Path to P12 certificate file (alternative to token)
17
+ * - F5XC_P12_PASSWORD: Password for P12 certificate
18
+ */
19
+ /** Server version - synchronized with package.json */
20
+ export declare const VERSION = "0.1.0";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,sDAAsD;AACtD,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * F5 Distributed Cloud API MCP Server
4
+ *
5
+ * Entry point for the MCP server that provides tools for interacting
6
+ * with F5 XC APIs via Model Context Protocol.
7
+ *
8
+ * Supports dual-mode operation:
9
+ * - Documentation mode: No credentials required - provides API documentation,
10
+ * f5xcctl equivalents, and Terraform examples
11
+ * - Execution mode: When F5XC credentials are provided, enables direct API calls
12
+ *
13
+ * Environment Variables:
14
+ * - F5XC_API_URL: Tenant URL (auto-normalized)
15
+ * - F5XC_API_TOKEN: API token for authentication
16
+ * - F5XC_P12_FILE: Path to P12 certificate file (alternative to token)
17
+ * - F5XC_P12_PASSWORD: Password for P12 certificate
18
+ */
19
+ import { createServer } from "./server.js";
20
+ import { logger } from "./utils/logging.js";
21
+ /** Server version - synchronized with package.json */
22
+ export const VERSION = "0.1.0";
23
+ /**
24
+ * Main entry point
25
+ */
26
+ async function main() {
27
+ try {
28
+ const server = createServer();
29
+ await server.start();
30
+ // Handle graceful shutdown
31
+ const shutdown = async (signal) => {
32
+ logger.info(`Received ${signal}, shutting down gracefully`);
33
+ await server.stop();
34
+ process.exit(0);
35
+ };
36
+ process.on("SIGINT", () => void shutdown("SIGINT"));
37
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
38
+ // Handle uncaught errors
39
+ process.on("uncaughtException", (error) => {
40
+ logger.error("Uncaught exception", {
41
+ error: error.message,
42
+ stack: error.stack,
43
+ });
44
+ process.exit(1);
45
+ });
46
+ process.on("unhandledRejection", (reason) => {
47
+ logger.error("Unhandled rejection", {
48
+ reason: reason instanceof Error ? reason.message : String(reason),
49
+ });
50
+ process.exit(1);
51
+ });
52
+ }
53
+ catch (error) {
54
+ logger.error("Failed to start server", {
55
+ error: error instanceof Error ? error.message : String(error),
56
+ });
57
+ process.exit(1);
58
+ }
59
+ }
60
+ // Only run main when executed directly, not when imported (e.g., during tests)
61
+ const isMainModule = import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith("f5xc-api-mcp");
62
+ if (isMainModule) {
63
+ main().catch((error) => {
64
+ logger.error("Fatal error", {
65
+ error: error instanceof Error ? error.message : String(error),
66
+ });
67
+ process.exit(1);
68
+ });
69
+ }
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,sDAAsD;AACtD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACvD,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,4BAA4B,CAAC,CAAC;YAC5D,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAEtD,yBAAyB;QACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/C,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACjC,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;YACnD,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;gBAClC,MAAM,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;aAClE,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;YACrC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,YAAY,GAChB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;AAE/F,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC9B,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE;YAC1B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Prompts Module - Export all prompt utilities
3
+ */
4
+ export { WORKFLOW_PROMPTS, getWorkflowPrompt, processPromptTemplate, deployHttpLoadBalancerPrompt, configureWafPrompt, createMultiCloudSitePrompt, generateTerraformPrompt, } from "./workflows.js";
5
+ export type { WorkflowPrompt, WorkflowArgument } from "./workflows.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}