@confluentinc/mcp-confluent 1.1.0 → 1.2.1

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 (137) hide show
  1. package/README.md +507 -342
  2. package/dist/build-config.d.ts +2 -0
  3. package/dist/build-config.d.ts.map +1 -0
  4. package/dist/build-config.js +2 -0
  5. package/dist/build-config.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +10 -0
  9. package/dist/cli.js.map +1 -1
  10. package/dist/confluent/client-manager.d.ts +9 -0
  11. package/dist/confluent/client-manager.d.ts.map +1 -1
  12. package/dist/confluent/client-manager.js +35 -4
  13. package/dist/confluent/client-manager.js.map +1 -1
  14. package/dist/confluent/middleware.d.ts +3 -2
  15. package/dist/confluent/middleware.d.ts.map +1 -1
  16. package/dist/confluent/middleware.js +9 -2
  17. package/dist/confluent/middleware.js.map +1 -1
  18. package/dist/confluent/node-deps.d.ts +63 -0
  19. package/dist/confluent/node-deps.d.ts.map +1 -0
  20. package/dist/confluent/node-deps.js +14 -0
  21. package/dist/confluent/node-deps.js.map +1 -0
  22. package/dist/confluent/telemetry.d.ts +18 -0
  23. package/dist/confluent/telemetry.d.ts.map +1 -0
  24. package/dist/confluent/telemetry.js +101 -0
  25. package/dist/confluent/telemetry.js.map +1 -0
  26. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +11 -0
  27. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -0
  28. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +174 -0
  29. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -0
  30. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +77 -0
  31. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -0
  32. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +136 -0
  33. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -0
  34. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +11 -0
  35. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -0
  36. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js +111 -0
  37. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -0
  38. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +11 -0
  39. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -0
  40. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js +110 -0
  41. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -0
  42. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +11 -0
  43. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -0
  44. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js +74 -0
  45. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -0
  46. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +11 -0
  47. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -0
  48. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js +81 -0
  49. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -0
  50. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +11 -0
  51. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -0
  52. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js +90 -0
  53. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -0
  54. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +11 -0
  55. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -0
  56. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js +131 -0
  57. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -0
  58. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +11 -0
  59. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -0
  60. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +248 -0
  61. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -0
  62. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +88 -0
  63. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -0
  64. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js +443 -0
  65. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -0
  66. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +11 -0
  67. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -0
  68. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +398 -0
  69. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -0
  70. package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +23 -0
  71. package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -0
  72. package/dist/confluent/tools/handlers/flink/flink-sql-helper.js +133 -0
  73. package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -0
  74. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +11 -0
  75. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -0
  76. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js +72 -0
  77. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -0
  78. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts.map +1 -1
  79. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js +20 -3
  80. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
  81. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +1 -1
  82. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
  83. package/dist/confluent/tools/handlers/kafka/create-topics-handler.js +1 -1
  84. package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
  85. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js +1 -1
  86. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
  87. package/dist/confluent/tools/handlers/kafka/list-topics-handler.js +1 -1
  88. package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
  89. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js +1 -1
  90. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js.map +1 -1
  91. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts +11 -0
  92. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -0
  93. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +193 -0
  94. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -0
  95. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +11 -0
  96. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -0
  97. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +224 -0
  98. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -0
  99. package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +10 -0
  100. package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -0
  101. package/dist/confluent/tools/handlers/schema/delete-schema-handler.js +71 -0
  102. package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -0
  103. package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
  104. package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +1 -5
  105. package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
  106. package/dist/confluent/tools/tool-factory.d.ts.map +1 -1
  107. package/dist/confluent/tools/tool-factory.js +26 -0
  108. package/dist/confluent/tools/tool-factory.js.map +1 -1
  109. package/dist/confluent/tools/tool-name.d.ts +14 -1
  110. package/dist/confluent/tools/tool-name.d.ts.map +1 -1
  111. package/dist/confluent/tools/tool-name.js +13 -0
  112. package/dist/confluent/tools/tool-name.js.map +1 -1
  113. package/dist/env-schema.d.ts +7 -0
  114. package/dist/env-schema.d.ts.map +1 -1
  115. package/dist/env-schema.js +37 -2
  116. package/dist/env-schema.js.map +1 -1
  117. package/dist/env.d.ts +7 -0
  118. package/dist/env.d.ts.map +1 -1
  119. package/dist/index.js +67 -5
  120. package/dist/index.js.map +1 -1
  121. package/dist/mcp/transports/auth.d.ts +55 -0
  122. package/dist/mcp/transports/auth.d.ts.map +1 -0
  123. package/dist/mcp/transports/auth.js +127 -0
  124. package/dist/mcp/transports/auth.js.map +1 -0
  125. package/dist/mcp/transports/index.d.ts +1 -0
  126. package/dist/mcp/transports/index.d.ts.map +1 -1
  127. package/dist/mcp/transports/index.js +1 -0
  128. package/dist/mcp/transports/index.js.map +1 -1
  129. package/dist/mcp/transports/manager.d.ts +13 -1
  130. package/dist/mcp/transports/manager.d.ts.map +1 -1
  131. package/dist/mcp/transports/manager.js +20 -2
  132. package/dist/mcp/transports/manager.js.map +1 -1
  133. package/dist/mcp/transports/server.d.ts +10 -1
  134. package/dist/mcp/transports/server.d.ts.map +1 -1
  135. package/dist/mcp/transports/server.js +12 -2
  136. package/dist/mcp/transports/server.js.map +1 -1
  137. package/package.json +16 -7
@@ -0,0 +1,174 @@
1
+ import { BaseToolHandler, } from "../../../../confluent/tools/base-tools.js";
2
+ import { ToolName } from "../../../../confluent/tools/tool-name.js";
3
+ import env from "../../../../env.js";
4
+ import { logger } from "../../../../logger.js";
5
+ import { wrapAsPathBasedClient } from "openapi-fetch";
6
+ import { z } from "zod";
7
+ const listBillingCostsArguments = z.object({
8
+ baseUrl: z
9
+ .string()
10
+ .describe("The base URL of the Confluent Cloud REST API.")
11
+ .url()
12
+ .default(() => env.CONFLUENT_CLOUD_REST_ENDPOINT ?? "")
13
+ .optional(),
14
+ startDate: z
15
+ .string()
16
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format")
17
+ .describe("Start date for billing costs in YYYY-MM-DD format"),
18
+ endDate: z
19
+ .string()
20
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format")
21
+ .describe("End date for billing costs in YYYY-MM-DD format"),
22
+ pageSize: z
23
+ .number()
24
+ .int()
25
+ .positive()
26
+ .max(1000)
27
+ .optional()
28
+ .describe("Number of results per page (max 1000)"),
29
+ pageToken: z
30
+ .string()
31
+ .optional()
32
+ .describe("Token for the next page of results"),
33
+ });
34
+ /**
35
+ * Schema for validating billing cost line items
36
+ */
37
+ const costLineItemSchema = z.object({
38
+ start_date: z.string(),
39
+ end_date: z.string(),
40
+ product: z.string(),
41
+ type: z.string().optional(),
42
+ price: z.number().optional(),
43
+ unit: z.string().optional(),
44
+ quantity: z.number().optional(),
45
+ original_amount: z.number(),
46
+ discount_amount: z.number().optional(),
47
+ amount: z.number(),
48
+ network_access_type: z.string().optional(),
49
+ });
50
+ /**
51
+ * Schema for validating Confluent Cloud billing costs responses
52
+ */
53
+ const billingCostsSchema = z.object({
54
+ api_version: z.literal("v1"),
55
+ kind: z.literal("CostList"),
56
+ metadata: z
57
+ .object({
58
+ first: z.string().optional(),
59
+ last: z.string().optional(),
60
+ prev: z.string().optional(),
61
+ next: z.string().optional(),
62
+ total_size: z.number().optional(),
63
+ })
64
+ .optional(),
65
+ data: z.array(costLineItemSchema),
66
+ });
67
+ export class ListBillingCostsHandler extends BaseToolHandler {
68
+ async handle(clientManager, toolArguments) {
69
+ const { baseUrl, startDate, endDate, pageSize, pageToken } = listBillingCostsArguments.parse(toolArguments);
70
+ try {
71
+ if (baseUrl !== undefined && baseUrl !== "") {
72
+ clientManager.setConfluentCloudRestEndpoint(baseUrl);
73
+ }
74
+ const pathBasedClient = wrapAsPathBasedClient(clientManager.getConfluentCloudRestClient());
75
+ const { data: response, error } = await pathBasedClient["/billing/v1/costs"].GET({
76
+ params: {
77
+ query: {
78
+ start_date: startDate,
79
+ end_date: endDate,
80
+ page_size: pageSize,
81
+ page_token: pageToken,
82
+ },
83
+ },
84
+ });
85
+ if (error) {
86
+ logger.error({ error }, "API Error");
87
+ return this.createResponse(`Failed to fetch billing costs: ${JSON.stringify(error)}`, true, { error });
88
+ }
89
+ try {
90
+ const validatedResponse = billingCostsSchema.parse(response);
91
+ // Calculate totals and group by product
92
+ const productCosts = new Map();
93
+ let totalAmount = 0;
94
+ let totalOriginalAmount = 0;
95
+ let totalDiscountAmount = 0;
96
+ validatedResponse.data.forEach((item) => {
97
+ totalAmount += item.amount;
98
+ totalOriginalAmount += item.original_amount;
99
+ totalDiscountAmount += item.discount_amount || 0;
100
+ const currentProductCost = productCosts.get(item.product) || 0;
101
+ productCosts.set(item.product, currentProductCost + item.amount);
102
+ });
103
+ // Format cost details for display
104
+ const costSummary = `
105
+ Cost Summary (${startDate} to ${endDate}):
106
+ Total Amount: $${totalAmount.toFixed(2)}
107
+ Original Amount: $${totalOriginalAmount.toFixed(2)}
108
+ Total Discount: $${totalDiscountAmount.toFixed(2)}
109
+ Total Line Items: ${validatedResponse.data.length}
110
+ `;
111
+ const productBreakdown = productCosts.size > 0
112
+ ? `
113
+ Product Breakdown:
114
+ ${Array.from(productCosts.entries())
115
+ .sort((a, b) => b[1] - a[1])
116
+ .map(([product, amount]) => ` ${product}: $${amount.toFixed(2)}`)
117
+ .join("\n")}
118
+ `
119
+ : "";
120
+ const metadata = validatedResponse.metadata;
121
+ const paginationInfo = metadata
122
+ ? `
123
+ Pagination:${metadata.total_size ? `\n Total Items: ${metadata.total_size}` : ""}${metadata.first ? `\n First Page: ${metadata.first}` : ""}${metadata.last ? `\n Last Page: ${metadata.last}` : ""}${metadata.prev ? `\n Previous Page: ${metadata.prev}` : ""}${metadata.next ? `\n Next Page: ${metadata.next}` : ""}
124
+ `
125
+ : "";
126
+ return this.createResponse(`Successfully retrieved billing costs:\n${costSummary}${productBreakdown}${paginationInfo}`, false, {
127
+ costs: validatedResponse.data,
128
+ summary: {
129
+ total_amount: totalAmount,
130
+ original_amount: totalOriginalAmount,
131
+ discount_amount: totalDiscountAmount,
132
+ line_item_count: validatedResponse.data.length,
133
+ date_range: {
134
+ start: startDate,
135
+ end: endDate,
136
+ },
137
+ },
138
+ product_breakdown: Object.fromEntries(productCosts),
139
+ total: metadata?.total_size,
140
+ pagination: metadata
141
+ ? {
142
+ first: metadata.first,
143
+ last: metadata.last,
144
+ prev: metadata.prev,
145
+ next: metadata.next,
146
+ }
147
+ : undefined,
148
+ });
149
+ }
150
+ catch (validationError) {
151
+ logger.error({ error: validationError }, "Billing costs validation error");
152
+ return this.createResponse(`Invalid billing costs data: ${validationError instanceof Error ? validationError.message : String(validationError)}`, true, { error: validationError });
153
+ }
154
+ }
155
+ catch (error) {
156
+ logger.error({ error }, "Error in ListBillingCostsHandler");
157
+ return this.createResponse(`Failed to fetch billing costs: ${error instanceof Error ? error.message : String(error)}`, true, { error: error instanceof Error ? error.message : String(error) });
158
+ }
159
+ }
160
+ getToolConfig() {
161
+ return {
162
+ name: ToolName.LIST_BILLING_COSTS,
163
+ description: "Retrieve billing cost data for a Confluent Cloud organization within a specified date range with pagination support",
164
+ inputSchema: listBillingCostsArguments.shape,
165
+ };
166
+ }
167
+ getRequiredEnvVars() {
168
+ return ["CONFLUENT_CLOUD_API_KEY", "CONFLUENT_CLOUD_API_SECRET"];
169
+ }
170
+ isConfluentCloudOnly() {
171
+ return true;
172
+ }
173
+ }
174
+ //# sourceMappingURL=list-billing-costs-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-billing-costs-handler.js","sourceRoot":"","sources":["../../../../../src/confluent/tools/handlers/billing/list-billing-costs-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { ClientManager } from "../../../../../confluent/client-manager.js";
2
+ /**
3
+ * Resolves the Flink catalog name from various inputs.
4
+ *
5
+ * In Confluent Cloud Flink, the catalog name is always the environment ID (env-xxxxx).
6
+ * This function handles cases where a friendly name or invalid value is provided,
7
+ * falling back to the environment ID from config.
8
+ *
9
+ * Resolution order:
10
+ * 1. If catalogName is provided and looks like an env ID (starts with "env-"), use it
11
+ * 2. Otherwise, use FLINK_ENV_ID from environment
12
+ *
13
+ * @param catalogName - Optional catalog name from user/LLM input
14
+ * @returns The resolved catalog name (environment ID), or undefined if not resolvable
15
+ */
16
+ export declare function resolveCatalogName(catalogName?: string): string | undefined;
17
+ /**
18
+ * Resolves the Flink database name from various inputs.
19
+ *
20
+ * In Confluent Cloud Flink, the database name can be either:
21
+ * - A Kafka cluster ID (lkc-xxxxx)
22
+ * - A friendly database name (e.g., "standard_cluster")
23
+ *
24
+ * INFORMATION_SCHEMA.TABLES uses friendly names in TABLE_SCHEMA, not cluster IDs.
25
+ *
26
+ * Resolution order:
27
+ * 1. If databaseName is provided and non-empty, use it (could be cluster ID or friendly name)
28
+ * 2. Otherwise, use KAFKA_CLUSTER_ID from environment
29
+ *
30
+ * @param databaseName - Optional database name from user/LLM input
31
+ * @returns The resolved database name, or undefined if not resolvable
32
+ */
33
+ export declare function resolveDatabaseName(databaseName?: string): string | undefined;
34
+ export interface CatalogMapping {
35
+ catalogId: string;
36
+ catalogName: string;
37
+ }
38
+ export interface SchemaMapping {
39
+ schemaId: string;
40
+ schemaName: string;
41
+ }
42
+ /**
43
+ * Looks up catalog mappings from INFORMATION_SCHEMA.CATALOGS.
44
+ * Returns a 1:1 mapping between environment IDs (CATALOG_ID) and friendly names (CATALOG_NAME).
45
+ */
46
+ export declare function getCatalogMapping(clientManager: ClientManager, catalogName: string, options: {
47
+ organizationId: string;
48
+ environmentId: string;
49
+ computePoolId: string;
50
+ }): Promise<CatalogMapping[]>;
51
+ /**
52
+ * Resolves a catalog identifier (could be env ID or friendly name) to the friendly CATALOG_NAME.
53
+ *
54
+ * @param catalogInput - The catalog identifier (env-xxxxx or friendly name)
55
+ * @param mappings - The catalog mappings from getCatalogMapping()
56
+ * @returns The friendly CATALOG_NAME to use in queries, or the original input if no mapping found
57
+ */
58
+ export declare function resolveToCatalogName(catalogInput: string, mappings: CatalogMapping[]): string;
59
+ /**
60
+ * Looks up schema mappings from INFORMATION_SCHEMA.SCHEMATA.
61
+ * Returns a 1:1 mapping between cluster IDs (SCHEMA_ID) and friendly names (SCHEMA_NAME).
62
+ */
63
+ export declare function getSchemaMapping(clientManager: ClientManager, catalogName: string, options: {
64
+ organizationId: string;
65
+ environmentId: string;
66
+ computePoolId: string;
67
+ }): Promise<SchemaMapping[]>;
68
+ /**
69
+ * Resolves a database identifier (could be cluster ID or friendly name) to the friendly SCHEMA_NAME.
70
+ * INFORMATION_SCHEMA queries use SCHEMA_NAME (friendly name) in TABLE_SCHEMA, not SCHEMA_ID.
71
+ *
72
+ * @param databaseInput - The database identifier (lkc-xxxxx or friendly name)
73
+ * @param mappings - The schema mappings from getSchemaMapping()
74
+ * @returns The friendly SCHEMA_NAME to use in queries, or the original input if no mapping found
75
+ */
76
+ export declare function resolveToSchemaName(databaseInput: string, mappings: SchemaMapping[]): string;
77
+ //# sourceMappingURL=catalog-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-resolver.d.ts","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/catalog/catalog-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAIjE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ3E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ7E;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB3B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,cAAc,EAAE,GACzB,MAAM,CAWR;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB1B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,aAAa,EAAE,GACxB,MAAM,CAWR"}
@@ -0,0 +1,136 @@
1
+ import { executeFlinkSql } from "../../../../../confluent/tools/handlers/flink/flink-sql-helper.js";
2
+ import env from "../../../../../env.js";
3
+ /**
4
+ * Resolves the Flink catalog name from various inputs.
5
+ *
6
+ * In Confluent Cloud Flink, the catalog name is always the environment ID (env-xxxxx).
7
+ * This function handles cases where a friendly name or invalid value is provided,
8
+ * falling back to the environment ID from config.
9
+ *
10
+ * Resolution order:
11
+ * 1. If catalogName is provided and looks like an env ID (starts with "env-"), use it
12
+ * 2. Otherwise, use FLINK_ENV_ID from environment
13
+ *
14
+ * @param catalogName - Optional catalog name from user/LLM input
15
+ * @returns The resolved catalog name (environment ID), or undefined if not resolvable
16
+ */
17
+ export function resolveCatalogName(catalogName) {
18
+ // If provided value looks like an environment ID, use it
19
+ if (catalogName && catalogName.startsWith("env-")) {
20
+ return catalogName;
21
+ }
22
+ // Fall back to FLINK_ENV_ID (the actual environment ID)
23
+ return env.FLINK_ENV_ID;
24
+ }
25
+ /**
26
+ * Resolves the Flink database name from various inputs.
27
+ *
28
+ * In Confluent Cloud Flink, the database name can be either:
29
+ * - A Kafka cluster ID (lkc-xxxxx)
30
+ * - A friendly database name (e.g., "standard_cluster")
31
+ *
32
+ * INFORMATION_SCHEMA.TABLES uses friendly names in TABLE_SCHEMA, not cluster IDs.
33
+ *
34
+ * Resolution order:
35
+ * 1. If databaseName is provided and non-empty, use it (could be cluster ID or friendly name)
36
+ * 2. Otherwise, use KAFKA_CLUSTER_ID from environment
37
+ *
38
+ * @param databaseName - Optional database name from user/LLM input
39
+ * @returns The resolved database name, or undefined if not resolvable
40
+ */
41
+ export function resolveDatabaseName(databaseName) {
42
+ // If any non-empty value is provided, use it (could be lkc-* or friendly name)
43
+ if (databaseName && databaseName.trim()) {
44
+ return databaseName.trim();
45
+ }
46
+ // Fall back to KAFKA_CLUSTER_ID
47
+ return env.KAFKA_CLUSTER_ID;
48
+ }
49
+ /**
50
+ * Looks up catalog mappings from INFORMATION_SCHEMA.CATALOGS.
51
+ * Returns a 1:1 mapping between environment IDs (CATALOG_ID) and friendly names (CATALOG_NAME).
52
+ */
53
+ export async function getCatalogMapping(clientManager, catalogName, options) {
54
+ const sql = `SELECT \`CATALOG_ID\`, \`CATALOG_NAME\` FROM \`${catalogName}\`.\`INFORMATION_SCHEMA\`.\`CATALOGS\``;
55
+ const result = await executeFlinkSql(clientManager, sql, {
56
+ organizationId: options.organizationId,
57
+ environmentId: options.environmentId,
58
+ computePoolId: options.computePoolId,
59
+ });
60
+ if (!result.success || !result.data) {
61
+ return [];
62
+ }
63
+ const mappings = [];
64
+ for (const row of result.data) {
65
+ const r = row;
66
+ const catalogId = r?.CATALOG_ID;
67
+ const catalogNameValue = r?.CATALOG_NAME;
68
+ if (typeof catalogId === "string" && typeof catalogNameValue === "string") {
69
+ mappings.push({ catalogId, catalogName: catalogNameValue });
70
+ }
71
+ }
72
+ return mappings;
73
+ }
74
+ /**
75
+ * Resolves a catalog identifier (could be env ID or friendly name) to the friendly CATALOG_NAME.
76
+ *
77
+ * @param catalogInput - The catalog identifier (env-xxxxx or friendly name)
78
+ * @param mappings - The catalog mappings from getCatalogMapping()
79
+ * @returns The friendly CATALOG_NAME to use in queries, or the original input if no mapping found
80
+ */
81
+ export function resolveToCatalogName(catalogInput, mappings) {
82
+ // If it looks like an environment ID, look up the friendly name
83
+ if (catalogInput.startsWith("env-")) {
84
+ const mapping = mappings.find((m) => m.catalogId === catalogInput);
85
+ if (mapping) {
86
+ return mapping.catalogName;
87
+ }
88
+ }
89
+ // Otherwise, assume it's already a friendly name or return as-is
90
+ return catalogInput;
91
+ }
92
+ /**
93
+ * Looks up schema mappings from INFORMATION_SCHEMA.SCHEMATA.
94
+ * Returns a 1:1 mapping between cluster IDs (SCHEMA_ID) and friendly names (SCHEMA_NAME).
95
+ */
96
+ export async function getSchemaMapping(clientManager, catalogName, options) {
97
+ const sql = `SELECT \`SCHEMA_ID\`, \`SCHEMA_NAME\` FROM \`${catalogName}\`.\`INFORMATION_SCHEMA\`.\`SCHEMATA\` WHERE \`SCHEMA_NAME\` <> 'INFORMATION_SCHEMA'`;
98
+ const result = await executeFlinkSql(clientManager, sql, {
99
+ organizationId: options.organizationId,
100
+ environmentId: options.environmentId,
101
+ computePoolId: options.computePoolId,
102
+ });
103
+ if (!result.success || !result.data) {
104
+ return [];
105
+ }
106
+ const mappings = [];
107
+ for (const row of result.data) {
108
+ const r = row;
109
+ const schemaId = r?.SCHEMA_ID;
110
+ const schemaName = r?.SCHEMA_NAME;
111
+ if (typeof schemaId === "string" && typeof schemaName === "string") {
112
+ mappings.push({ schemaId, schemaName });
113
+ }
114
+ }
115
+ return mappings;
116
+ }
117
+ /**
118
+ * Resolves a database identifier (could be cluster ID or friendly name) to the friendly SCHEMA_NAME.
119
+ * INFORMATION_SCHEMA queries use SCHEMA_NAME (friendly name) in TABLE_SCHEMA, not SCHEMA_ID.
120
+ *
121
+ * @param databaseInput - The database identifier (lkc-xxxxx or friendly name)
122
+ * @param mappings - The schema mappings from getSchemaMapping()
123
+ * @returns The friendly SCHEMA_NAME to use in queries, or the original input if no mapping found
124
+ */
125
+ export function resolveToSchemaName(databaseInput, mappings) {
126
+ // If it looks like a cluster ID, look up the friendly name
127
+ if (databaseInput.startsWith("lkc-")) {
128
+ const mapping = mappings.find((m) => m.schemaId === databaseInput);
129
+ if (mapping) {
130
+ return mapping.schemaName;
131
+ }
132
+ }
133
+ // Otherwise, assume it's already a friendly name or return as-is
134
+ return databaseInput;
135
+ }
136
+ //# sourceMappingURL=catalog-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-resolver.js","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/catalog/catalog-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ClientManager } from "../../../../../confluent/client-manager.js";
2
+ import { CallToolResult } from "../../../../../confluent/schema.js";
3
+ import { BaseToolHandler, ToolConfig } from "../../../../../confluent/tools/base-tools.js";
4
+ import { EnvVar } from "../../../../../env-schema.js";
5
+ export declare class DescribeTableHandler extends BaseToolHandler {
6
+ handle(clientManager: ClientManager, toolArguments: Record<string, unknown> | undefined): Promise<CallToolResult>;
7
+ getToolConfig(): ToolConfig;
8
+ getRequiredEnvVars(): EnvVar[];
9
+ isConfluentCloudOnly(): boolean;
10
+ }
11
+ //# sourceMappingURL=describe-table-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-table-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/catalog/describe-table-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,UAAU,EACX,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA+C5C,qBAAa,oBAAqB,SAAQ,eAAe;IACjD,MAAM,CACV,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,cAAc,CAAC;IA0F1B,aAAa,IAAI,UAAU;IAS3B,kBAAkB,IAAI,MAAM,EAAE;IAI9B,oBAAoB,IAAI,OAAO;CAGhC"}
@@ -0,0 +1,111 @@
1
+ import { getEnsuredParam } from "../../../../../confluent/helpers.js";
2
+ import { BaseToolHandler, } from "../../../../../confluent/tools/base-tools.js";
3
+ import { resolveCatalogName, resolveDatabaseName, getSchemaMapping, resolveToSchemaName, } from "../../../../../confluent/tools/handlers/flink/catalog/catalog-resolver.js";
4
+ import { executeFlinkSql } from "../../../../../confluent/tools/handlers/flink/flink-sql-helper.js";
5
+ import { ToolName } from "../../../../../confluent/tools/tool-name.js";
6
+ import env from "../../../../../env.js";
7
+ import { z } from "zod";
8
+ const describeTableArguments = z.object({
9
+ baseUrl: z
10
+ .string()
11
+ .describe("The base URL of the Flink REST API.")
12
+ .url()
13
+ .default(() => env.FLINK_REST_ENDPOINT ?? "")
14
+ .optional(),
15
+ organizationId: z
16
+ .string()
17
+ .trim()
18
+ .optional()
19
+ .describe("The unique identifier for the organization."),
20
+ environmentId: z
21
+ .string()
22
+ .trim()
23
+ .optional()
24
+ .describe("The unique identifier for the environment."),
25
+ computePoolId: z
26
+ .string()
27
+ .trim()
28
+ .optional()
29
+ .describe("The id associated with the compute pool in context."),
30
+ catalogName: z
31
+ .string()
32
+ .trim()
33
+ .optional()
34
+ .describe("The Flink catalog name (environment ID, e.g., env-xxxxx). Omit to use defaults."),
35
+ databaseName: z
36
+ .string()
37
+ .trim()
38
+ .optional()
39
+ .describe("The database/schema name. Can be cluster ID (lkc-xxxxx) or friendly name. Optional."),
40
+ tableName: z
41
+ .string()
42
+ .trim()
43
+ .nonempty()
44
+ .describe("The name of the table to describe."),
45
+ });
46
+ export class DescribeTableHandler extends BaseToolHandler {
47
+ async handle(clientManager, toolArguments) {
48
+ const { organizationId, environmentId, computePoolId, catalogName, databaseName, tableName, baseUrl, } = describeTableArguments.parse(toolArguments);
49
+ const organization_id = getEnsuredParam("FLINK_ORG_ID", "Organization ID is required", organizationId);
50
+ const environment_id = getEnsuredParam("FLINK_ENV_ID", "Environment ID is required", environmentId);
51
+ const compute_pool_id = getEnsuredParam("FLINK_COMPUTE_POOL_ID", "Compute Pool ID is required", computePoolId);
52
+ // Smart resolution: only accept env-* format, otherwise fall back to FLINK_ENV_ID
53
+ const catalog_name = resolveCatalogName(catalogName);
54
+ if (!catalog_name) {
55
+ return this.createResponse("Catalog name could not be resolved. Set FLINK_ENV_ID or provide a valid environment ID (env-xxxxx).", true);
56
+ }
57
+ // Database name is optional - if provided, resolve it to friendly SCHEMA_NAME
58
+ const database_input = resolveDatabaseName(databaseName);
59
+ if (baseUrl !== undefined && baseUrl !== "") {
60
+ clientManager.setConfluentCloudFlinkEndpoint(baseUrl);
61
+ }
62
+ // If a database was specified, resolve cluster ID to friendly name
63
+ let schema_name;
64
+ if (database_input) {
65
+ const mappings = await getSchemaMapping(clientManager, catalog_name, {
66
+ organizationId: organization_id,
67
+ environmentId: environment_id,
68
+ computePoolId: compute_pool_id,
69
+ });
70
+ schema_name = resolveToSchemaName(database_input, mappings);
71
+ }
72
+ // Query INFORMATION_SCHEMA.COLUMNS for full schema details
73
+ // Must fully qualify with catalog and use backticks per Confluent Cloud requirements
74
+ // If schema_name is provided, filter by it; otherwise search all databases for the table
75
+ const schemaFilter = schema_name
76
+ ? ` AND \`TABLE_SCHEMA\` = '${schema_name}'`
77
+ : "";
78
+ const sql = `SELECT \`TABLE_SCHEMA\`, \`COLUMN_NAME\`, \`ORDINAL_POSITION\`, \`DATA_TYPE\`, \`FULL_DATA_TYPE\`, \`IS_NULLABLE\`, \`IS_HIDDEN\`, \`IS_GENERATED\`, \`GENERATION_EXPRESSION\`, \`IS_METADATA\`, \`METADATA_KEY\` FROM \`${catalog_name}\`.\`INFORMATION_SCHEMA\`.\`COLUMNS\` WHERE \`TABLE_NAME\` = '${tableName}' AND \`IS_HIDDEN\` = 'NO'${schemaFilter}`;
79
+ const result = await executeFlinkSql(clientManager, sql, {
80
+ organizationId: organization_id,
81
+ environmentId: environment_id,
82
+ computePoolId: compute_pool_id,
83
+ });
84
+ if (!result.success) {
85
+ return this.createResponse(`Failed to describe table: ${result.error}`, true);
86
+ }
87
+ const columns = result.data ?? [];
88
+ if (columns.length === 0) {
89
+ const scope = schema_name
90
+ ? `'${catalog_name}.${schema_name}.${tableName}'`
91
+ : `'${tableName}' in catalog '${catalog_name}'`;
92
+ return this.createResponse(`Table ${scope} not found or has no columns.`, true);
93
+ }
94
+ // Include TABLE_SCHEMA in response so user knows which database the table is in
95
+ return this.createResponse(`Table '${tableName}' schema:\n${JSON.stringify(columns, null, 2)}`);
96
+ }
97
+ getToolConfig() {
98
+ return {
99
+ name: ToolName.DESCRIBE_FLINK_TABLE,
100
+ description: "Get full schema details for a Flink table via INFORMATION_SCHEMA.COLUMNS. Returns column names, data types (including $rowtime), nullability, and metadata column info.",
101
+ inputSchema: describeTableArguments.shape,
102
+ };
103
+ }
104
+ getRequiredEnvVars() {
105
+ return ["FLINK_API_KEY", "FLINK_API_SECRET"];
106
+ }
107
+ isConfluentCloudOnly() {
108
+ return true;
109
+ }
110
+ }
111
+ //# sourceMappingURL=describe-table-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-table-handler.js","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/catalog/describe-table-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ClientManager } from "../../../../../confluent/client-manager.js";
2
+ import { CallToolResult } from "../../../../../confluent/schema.js";
3
+ import { BaseToolHandler, ToolConfig } from "../../../../../confluent/tools/base-tools.js";
4
+ import { EnvVar } from "../../../../../env-schema.js";
5
+ export declare class GetTableInfoHandler extends BaseToolHandler {
6
+ handle(clientManager: ClientManager, toolArguments: Record<string, unknown> | undefined): Promise<CallToolResult>;
7
+ getToolConfig(): ToolConfig;
8
+ getRequiredEnvVars(): EnvVar[];
9
+ isConfluentCloudOnly(): boolean;
10
+ }
11
+ //# sourceMappingURL=get-table-info-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-table-info-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/catalog/get-table-info-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,UAAU,EACX,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA+C5C,qBAAa,mBAAoB,SAAQ,eAAe;IAChD,MAAM,CACV,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,cAAc,CAAC;IAsF1B,aAAa,IAAI,UAAU;IAS3B,kBAAkB,IAAI,MAAM,EAAE;IAI9B,oBAAoB,IAAI,OAAO;CAGhC"}