@hechtcarmel/vertica-mcp
Version:
MCP (Model Context Protocol) server for readonly Vertica database operations
69 lines • 2.42 kB
JavaScript
import { z } from "zod";
import { VerticaService } from "../services/vertica-service.js";
import { getDatabaseConfig } from "../config/database.js";
import { formatQueryResult } from "../utils/response-formatter.js";
export default class ExecuteQueryTool {
name = "execute_query";
description = "Execute a readonly SQL query against the Vertica database. Supports SELECT, SHOW, DESCRIBE, EXPLAIN, and WITH queries.";
inputSchema = {
type: "object",
properties: {
sql: {
type: "string",
description: "SQL query to execute. Must be a readonly query (SELECT, SHOW, DESCRIBE, EXPLAIN, or WITH).",
},
params: {
type: "array",
items: {},
description: "Optional parameters for parameterized queries.",
},
},
required: ["sql"],
};
async execute(input) {
const parsed = this.parseInput(input);
let service = null;
try {
const config = getDatabaseConfig();
service = new VerticaService(config);
const result = await service.executeQuery(parsed.sql, parsed.params || []);
const formatted = formatQueryResult({
...result,
query: parsed.sql,
});
return JSON.stringify({
success: true,
...formatted,
query: parsed.sql,
executedAt: new Date().toISOString(),
}, null, 2);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
return JSON.stringify({
success: false,
error: errorMessage,
query: parsed.sql,
executedAt: new Date().toISOString(),
}, null, 2);
}
finally {
if (service) {
try {
await service.disconnect();
}
catch (error) {
console.warn("Warning during service cleanup:", error);
}
}
}
}
parseInput(input) {
const schema = z.object({
sql: z.string(),
params: z.array(z.unknown()).optional(),
});
return schema.parse(input);
}
}
//# sourceMappingURL=execute-query.js.map