import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema } from "@modelcontextprotocol/sdk/types.js"; import pg from "pg"; const args = process.argv.slice(2); console.log("argv", args); if (args.length === 0) { console.error("missing DSN"); process.exit(1); } const databaseUrl = args[0]; console.log("dsn", databaseUrl); const server = new Server({ name: "debug", version: "0.0.0", }, { capabilities: { resources: {}, tools: {}, }, }); const pool = new pg.Pool({ connectionString: databaseUrl }); const SCHEMA_PATH = "schema"; server.onerror = (err) => { console.error("server transport error", err); }; server.setRequestHandler(ListResourcesRequestSchema, async () => { const client = await pool.connect(); try { const result = await client.query("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"); return { resources: result.rows.map((row) => ({ uri: row.table_name, mimeType: "application/json", name: row.table_name, })), }; } finally { client.release(); } }); server.setRequestHandler(ReadResourceRequestSchema, async () => ({ contents: [], })); server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [], })); server.setRequestHandler(CallToolRequestSchema, async () => ({ content: [], isError: false, })); process.on("exit", (code) => { console.log("process exit", code); }); process.on("beforeExit", (code) => { console.log("beforeExit", code); }); process.on("uncaughtException", (err) => { console.error("uncaughtException", err); }); process.on("unhandledRejection", (reason) => { console.error("unhandledRejection", reason); }); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.log("server connected"); } main().catch((err) => { console.error("main error", err); process.exit(1); });