import { z } from "zod";
import { ToolContext } from "../types.js";
import { isReadOnlyQuery } from "../utils/validators.js";
export const querySchema = {
description: "Ejecuta una consulta SELECT de solo lectura en la base de datos PostgreSQL. No permite operaciones de escritura.",
inputSchema: {
sql: z.string().describe("Consulta SQL SELECT a ejecutar (solo lectura)"),
limit: z.number().optional().default(100).describe("Límite de filas a retornar (por defecto: 100)"),
},
};
export async function queryHandler(
args: { sql: string; limit?: number },
context: ToolContext
) {
const sql = args.sql;
const limit = args.limit || 100;
// Validar que sea una query de solo lectura
if (!isReadOnlyQuery(sql)) {
throw new Error(
"Solo se permiten consultas SELECT. No se permiten operaciones de escritura."
);
}
// Agregar LIMIT si no existe
let finalQuery = sql.trim();
if (!finalQuery.toLowerCase().includes("limit")) {
finalQuery += ` LIMIT ${limit}`;
}
const result = await context.pool.query(finalQuery);
return {
content: [
{
type: "text" as const,
text: JSON.stringify(
{
rowCount: result.rowCount,
rows: result.rows,
},
null,
2
),
},
],
};
}