@hechtcarmel/vertica-mcp
Version:
MCP (Model Context Protocol) server for readonly Vertica database operations
73 lines • 2.78 kB
JavaScript
import { z } from "zod";
import { VerticaService } from "../services/vertica-service.js";
import { getDatabaseConfig } from "../config/database.js";
export default class ListIndexesTool {
name = "list_indexes";
description = "List indexes (projections) for a specific table in Vertica with column and uniqueness information";
inputSchema = {
type: "object",
properties: {
tableName: {
type: "string",
description: "Name of the table to list indexes for",
},
schemaName: {
type: "string",
description: "Schema name (optional, defaults to configured default schema)",
},
},
required: ["tableName"],
};
async execute(input) {
const parsed = this.parseInput(input);
let verticaService = null;
try {
const config = getDatabaseConfig();
verticaService = new VerticaService(config);
const indexes = await verticaService.listIndexes(parsed.tableName, parsed.schemaName);
return JSON.stringify({
success: true,
table: parsed.tableName,
schema: parsed.schemaName ?? config.defaultSchema ?? "public",
indexCount: indexes.length,
indexes: indexes.map((index) => ({
indexName: index.indexName,
columnName: index.columnName,
isUnique: index.isUnique,
indexType: index.indexType,
ordinalPosition: index.ordinalPosition,
})),
note: "In Vertica, indexes are implemented as projections which provide similar functionality",
queriedAt: new Date().toISOString(),
}, null, 2);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
return JSON.stringify({
success: false,
error: errorMessage,
tableName: parsed.tableName,
schemaName: parsed.schemaName,
queriedAt: new Date().toISOString(),
}, null, 2);
}
finally {
if (verticaService) {
try {
await verticaService.disconnect();
}
catch (error) {
console.warn("Warning during service cleanup:", error);
}
}
}
}
parseInput(input) {
const schema = z.object({
tableName: z.string(),
schemaName: z.string().optional(),
});
return schema.parse(input);
}
}
//# sourceMappingURL=list-indexes.js.map