import { z } from "zod";
import { ToolContext } from "../types.js";
export const describeTableSchema = {
description: "Muestra la estructura completa de una tabla: columnas, tipos de datos, constraints, índices",
inputSchema: {
table_name: z.string().describe("Nombre de la tabla a describir"),
schema: z.string().optional().describe("Nombre del schema (por defecto: 'public')"),
},
};
export async function describeTableHandler(
args: { table_name: string; schema?: string },
context: ToolContext
) {
const tableName = args.table_name;
const schema = args.schema || context.defaultSchema;
// Obtener columnas y tipos
const columnsResult = await context.pool.query(
`SELECT
column_name,
data_type,
character_maximum_length,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_schema = $1 AND table_name = $2
ORDER BY ordinal_position`,
[schema, tableName]
);
// Obtener constraints
const constraintsResult = await context.pool.query(
`SELECT
tc.constraint_name,
tc.constraint_type,
kcu.column_name
FROM information_schema.table_constraints tc
LEFT JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
WHERE tc.table_schema = $1 AND tc.table_name = $2`,
[schema, tableName]
);
// Obtener índices
const indexesResult = await context.pool.query(
`SELECT
indexname,
indexdef
FROM pg_indexes
WHERE schemaname = $1 AND tablename = $2`,
[schema, tableName]
);
const description = {
table: `${schema}.${tableName}`,
columns: columnsResult.rows,
constraints: constraintsResult.rows,
indexes: indexesResult.rows,
};
return {
content: [
{
type: "text" as const,
text: JSON.stringify(description, null, 2),
},
],
};
}