@gizmodata/gizmosql-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.js ADDED
@@ -0,0 +1,446 @@
1
+ // Transport-agnostic MCP server: tool + resource definitions for GizmoSQL.
2
+ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { z } from "zod";
4
+ import { GizmoConnection, QueryTimeoutError, redactedUri } from "./connection.js";
5
+ import { cellToJson, cellToText, escapeMarkdownCell, formatTable, resultFooter, toMarkdownTable, truncateText, } from "./format.js";
6
+ import { convertParams, paramsSchema, PARAMS_DESCRIPTION, ParameterError } from "./params.js";
7
+ import { runSsoLogin } from "./sso.js";
8
+ import { guardStatement, normalizeStatement, SqlGuardError, WRAPPER_ALIAS, wrapWithLimit, } from "./sql-guard.js";
9
+ import { PACKAGE_NAME, PACKAGE_VERSION } from "./version.js";
10
+ const SERVER_INSTRUCTIONS = "GizmoSQL is an Arrow Flight SQL server built on DuckDB, so DuckDB SQL syntax and functions apply. " +
11
+ "Start with list_catalogs / list_schemas / list_tables / describe_table to discover the schema, then " +
12
+ "use run_query for SELECT queries. Results are capped at a configurable number of rows; use LIMIT, " +
13
+ "aggregation, or WHERE filters to keep results small. Bind user-supplied literals with ? placeholders " +
14
+ "and the params argument instead of interpolating them into SQL. Unless GIZMOSQL_ALLOW_WRITES is " +
15
+ "enabled the server is read-only.";
16
+ function text(body, structured) {
17
+ const result = { content: [{ type: "text", text: body }] };
18
+ if (structured)
19
+ result.structuredContent = structured;
20
+ return result;
21
+ }
22
+ function errorResult(message) {
23
+ return { isError: true, content: [{ type: "text", text: `Error: ${message}` }] };
24
+ }
25
+ /** Converts a thrown error into a redacted, user-facing message. */
26
+ export function describeError(err, connection) {
27
+ if (err instanceof SqlGuardError || err instanceof ParameterError || err instanceof QueryTimeoutError) {
28
+ return connection.redact(err.message);
29
+ }
30
+ const raw = err instanceof Error ? err.message : String(err);
31
+ // Surface the server's message verbatim (minus credentials); strip the
32
+ // client's generic prefix so the DuckDB error is front and center.
33
+ const cleaned = raw.replace(/^Failed to execute (?:query|update): /u, "");
34
+ return connection.redact(cleaned);
35
+ }
36
+ const sqlArg = z.string().min(1).describe("A single SQL statement (DuckDB dialect).");
37
+ /** Identifier quoting for generated SQL (used only for DDL synthesis). */
38
+ function quoteIdent(name) {
39
+ return `"${name.replace(/"/g, '""')}"`;
40
+ }
41
+ /** Table/view DDL from DuckDB's catalog functions, or synthesized from information_schema. */
42
+ async function fetchDdl(connection, ref) {
43
+ const fromTables = await connection.query("SELECT sql FROM duckdb_tables() WHERE database_name = ? AND schema_name = ? AND table_name = ?", [ref.catalog, ref.schema, ref.table]);
44
+ if (fromTables.numRows > 0) {
45
+ const sql = fromTables.getChildAt(0)?.get(0);
46
+ if (typeof sql === "string" && sql.trim())
47
+ return sql;
48
+ }
49
+ const fromViews = await connection.query("SELECT sql FROM duckdb_views() WHERE database_name = ? AND schema_name = ? AND view_name = ?", [ref.catalog, ref.schema, ref.table]);
50
+ if (fromViews.numRows > 0) {
51
+ const sql = fromViews.getChildAt(0)?.get(0);
52
+ if (typeof sql === "string" && sql.trim())
53
+ return sql;
54
+ }
55
+ const cols = await connection.query("SELECT column_name, data_type, is_nullable FROM information_schema.columns " +
56
+ "WHERE table_catalog = ? AND table_schema = ? AND table_name = ? ORDER BY ordinal_position", [ref.catalog, ref.schema, ref.table]);
57
+ if (cols.numRows === 0)
58
+ return null;
59
+ const lines = [];
60
+ for (let i = 0; i < cols.numRows; i++) {
61
+ const name = String(cols.getChildAt(0)?.get(i));
62
+ const type = String(cols.getChildAt(1)?.get(i));
63
+ const nullable = String(cols.getChildAt(2)?.get(i)) !== "NO";
64
+ lines.push(` ${quoteIdent(name)} ${type}${nullable ? "" : " NOT NULL"}`);
65
+ }
66
+ return `CREATE TABLE ${quoteIdent(ref.catalog)}.${quoteIdent(ref.schema)}.${quoteIdent(ref.table)} (\n${lines.join(",\n")}\n);`;
67
+ }
68
+ /** Builds the McpServer with every tool/resource registered against `ctx`. */
69
+ export function createServer(ctx) {
70
+ const { connection, config } = ctx;
71
+ const server = new McpServer({ name: PACKAGE_NAME, version: PACKAGE_VERSION }, { instructions: SERVER_INSTRUCTIONS });
72
+ /** Wraps a tool body so every failure becomes a redacted isError result. */
73
+ const tool = (fn) => {
74
+ return async (args) => {
75
+ try {
76
+ return await fn(args);
77
+ }
78
+ catch (err) {
79
+ return errorResult(describeError(err, connection));
80
+ }
81
+ };
82
+ };
83
+ server.registerTool("list_catalogs", {
84
+ title: "List catalogs",
85
+ description: "Lists the catalogs (attached databases) visible to the connected GizmoSQL user.",
86
+ inputSchema: {},
87
+ annotations: { readOnlyHint: true, idempotentHint: true },
88
+ }, tool(async () => {
89
+ const catalogs = await connection.run((c) => c.getCatalogs());
90
+ const body = catalogs.length
91
+ ? catalogs.map((c) => `- ${c}`).join("\n")
92
+ : "(no catalogs visible)";
93
+ return text(body, { catalogs });
94
+ }));
95
+ server.registerTool("list_schemas", {
96
+ title: "List schemas",
97
+ description: "Lists schemas, optionally filtered to one catalog.",
98
+ inputSchema: {
99
+ catalog: z.string().optional().describe("Catalog name to filter by (exact match)."),
100
+ },
101
+ annotations: { readOnlyHint: true, idempotentHint: true },
102
+ }, tool(async ({ catalog }) => {
103
+ const schemas = await connection.run((c) => c.getSchemas(catalog));
104
+ const rows = schemas.map((s) => [escapeMarkdownCell(s.catalog), escapeMarkdownCell(s.schema)]);
105
+ const body = rows.length ? toMarkdownTable(["catalog", "schema"], rows) : "(no schemas found)";
106
+ return text(body, { schemas });
107
+ }));
108
+ server.registerTool("list_tables", {
109
+ title: "List tables",
110
+ description: "Lists tables and views with their type. Filters are optional; `like` is a SQL LIKE pattern " +
111
+ "on the table name (e.g. 'orders%').",
112
+ inputSchema: {
113
+ catalog: z.string().optional().describe("Catalog name (exact match)."),
114
+ schema: z.string().optional().describe("Schema name (SQL LIKE pattern, e.g. 'main')."),
115
+ like: z.string().optional().describe("Table-name LIKE pattern, e.g. 'cust%'."),
116
+ },
117
+ annotations: { readOnlyHint: true, idempotentHint: true },
118
+ }, tool(async ({ catalog, schema, like }) => {
119
+ const tables = await connection.run((c) => c.getTables(catalog, schema, like));
120
+ const rows = tables.map((t) => [
121
+ escapeMarkdownCell(t.catalog),
122
+ escapeMarkdownCell(t.schema),
123
+ escapeMarkdownCell(t.tableName),
124
+ escapeMarkdownCell(t.tableType),
125
+ ]);
126
+ const body = rows.length
127
+ ? toMarkdownTable(["catalog", "schema", "table", "type"], rows)
128
+ : "(no tables matched)";
129
+ return text(body, { tables });
130
+ }));
131
+ server.registerTool("describe_table", {
132
+ title: "Describe table",
133
+ description: "Describes a table or view: columns with types and nullability, constraints, and an " +
134
+ "estimated row count when it is cheap to obtain. Provide schema/catalog when the table " +
135
+ "name is ambiguous.",
136
+ inputSchema: {
137
+ table: z.string().min(1).describe("Table or view name (exact match)."),
138
+ schema: z.string().optional().describe("Schema name (exact match)."),
139
+ catalog: z.string().optional().describe("Catalog name (exact match)."),
140
+ },
141
+ annotations: { readOnlyHint: true, idempotentHint: true },
142
+ }, tool(async ({ table, schema, catalog }) => {
143
+ const filters = ["table_name = ?"];
144
+ const params = [table];
145
+ if (schema !== undefined) {
146
+ filters.push("table_schema = ?");
147
+ params.push(schema);
148
+ }
149
+ if (catalog !== undefined) {
150
+ filters.push("table_catalog = ?");
151
+ params.push(catalog);
152
+ }
153
+ const columns = await connection.query("SELECT table_catalog, table_schema, table_name, column_name, data_type, is_nullable, column_default " +
154
+ `FROM information_schema.columns WHERE ${filters.join(" AND ")} ORDER BY table_catalog, table_schema, ordinal_position`, params);
155
+ if (columns.numRows === 0) {
156
+ return errorResult(`Table "${table}" not found${schema ? ` in schema "${schema}"` : ""}${catalog ? ` (catalog "${catalog}")` : ""}. ` +
157
+ "Use list_tables to find the exact name.");
158
+ }
159
+ const locations = new Set();
160
+ for (let i = 0; i < columns.numRows; i++) {
161
+ locations.add(`${columns.getChildAt(0)?.get(i)}.${columns.getChildAt(1)?.get(i)}`);
162
+ }
163
+ if (locations.size > 1) {
164
+ return errorResult(`Table "${table}" exists in multiple locations: ${[...locations].join(", ")}. ` +
165
+ "Pass schema (and catalog) to disambiguate.");
166
+ }
167
+ const ref = {
168
+ catalog: String(columns.getChildAt(0)?.get(0)),
169
+ schema: String(columns.getChildAt(1)?.get(0)),
170
+ table,
171
+ };
172
+ const colRows = [];
173
+ const colJson = [];
174
+ for (let i = 0; i < columns.numRows; i++) {
175
+ const name = String(columns.getChildAt(3)?.get(i));
176
+ const type = String(columns.getChildAt(4)?.get(i));
177
+ const nullable = String(columns.getChildAt(5)?.get(i)) === "YES";
178
+ const def = columns.getChildAt(6)?.get(i);
179
+ colRows.push([
180
+ escapeMarkdownCell(name),
181
+ escapeMarkdownCell(type),
182
+ nullable ? "YES" : "NO",
183
+ escapeMarkdownCell(def === null || def === undefined ? "" : String(def)),
184
+ ]);
185
+ colJson.push({ name, type, nullable, default: def === undefined ? null : def });
186
+ }
187
+ const meta = await connection.query("SELECT 'BASE TABLE' AS kind, estimated_size FROM duckdb_tables() " +
188
+ "WHERE database_name = ? AND schema_name = ? AND table_name = ? " +
189
+ "UNION ALL SELECT 'VIEW', NULL FROM duckdb_views() " +
190
+ "WHERE database_name = ? AND schema_name = ? AND view_name = ?", [ref.catalog, ref.schema, ref.table, ref.catalog, ref.schema, ref.table]);
191
+ let kind = "TABLE";
192
+ let estimatedRows = null;
193
+ if (meta.numRows > 0) {
194
+ kind = String(meta.getChildAt(0)?.get(0));
195
+ const est = meta.getChildAt(1)?.get(0);
196
+ if (est !== null && est !== undefined)
197
+ estimatedRows = Number(est);
198
+ }
199
+ const constraints = await connection.query("SELECT constraint_type, constraint_column_names, constraint_text FROM duckdb_constraints() " +
200
+ "WHERE database_name = ? AND schema_name = ? AND table_name = ? " +
201
+ "AND constraint_type IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY', 'CHECK') " +
202
+ "ORDER BY constraint_index", [ref.catalog, ref.schema, ref.table]);
203
+ const constraintJson = [];
204
+ const constraintLines = [];
205
+ for (let i = 0; i < constraints.numRows; i++) {
206
+ const type = String(constraints.getChildAt(0)?.get(i));
207
+ const cols = cellToJson(constraints.getChildAt(1)?.get(i), constraints.schema.fields[1].type);
208
+ const ctext = String(constraints.getChildAt(2)?.get(i) ?? "");
209
+ constraintJson.push({ type, columns: cols, text: ctext });
210
+ constraintLines.push(`- ${type}: ${ctext || cellToText(cols)}`);
211
+ }
212
+ const header = `**${ref.catalog}.${ref.schema}.${ref.table}** (${kind})` +
213
+ (estimatedRows !== null ? ` · estimated rows: ${estimatedRows}` : "");
214
+ const parts = [header, "", toMarkdownTable(["column", "type", "nullable", "default"], colRows)];
215
+ if (constraintLines.length)
216
+ parts.push("", "Constraints:", ...constraintLines);
217
+ return text(parts.join("\n"), {
218
+ catalog: ref.catalog,
219
+ schema: ref.schema,
220
+ table: ref.table,
221
+ kind,
222
+ estimated_rows: estimatedRows,
223
+ columns: colJson,
224
+ constraints: constraintJson,
225
+ });
226
+ }));
227
+ server.registerTool("run_query", {
228
+ title: "Run query",
229
+ description: "Runs a SQL query against GizmoSQL (DuckDB dialect) and returns the rows as a Markdown table " +
230
+ `plus structured JSON. Results are capped at max_rows (default ${config.maxRows}, hard maximum ` +
231
+ `${config.maxRows}); long cells are truncated to ${config.maxCellChars} characters with …. ` +
232
+ (config.allowWrites
233
+ ? "Writes are enabled on this server; prefer execute_statement for DML/DDL."
234
+ : "This server is read-only: only SELECT/WITH/SHOW/DESCRIBE/SUMMARIZE/EXPLAIN/PRAGMA(read) statements are accepted."),
235
+ inputSchema: {
236
+ sql: sqlArg,
237
+ params: paramsSchema.optional().describe(PARAMS_DESCRIPTION),
238
+ max_rows: z
239
+ .number()
240
+ .int()
241
+ .min(1)
242
+ .optional()
243
+ .describe(`Row cap for this call (1..${config.maxRows}; default ${config.maxRows}).`),
244
+ },
245
+ outputSchema: {
246
+ columns: z.array(z.object({ name: z.string(), type: z.string() })),
247
+ rows: z.array(z.array(z.unknown())),
248
+ row_count: z.number(),
249
+ truncated: z.boolean(),
250
+ elapsed_ms: z.number(),
251
+ },
252
+ annotations: { readOnlyHint: !config.allowWrites, idempotentHint: !config.allowWrites },
253
+ }, tool(async ({ sql, params, max_rows }) => {
254
+ const guarded = guardStatement(sql, config.allowWrites);
255
+ const maxRows = Math.min(max_rows ?? config.maxRows, config.maxRows);
256
+ const bound = convertParams(params);
257
+ const effectiveSql = guarded.classification.wrappable
258
+ ? wrapWithLimit(guarded.sql, maxRows + 1)
259
+ : guarded.sql;
260
+ const started = Date.now();
261
+ let capped;
262
+ try {
263
+ capped = await connection.queryCapped(effectiveSql, bound, maxRows);
264
+ }
265
+ catch (err) {
266
+ if (guarded.classification.wrappable && !(err instanceof QueryTimeoutError)) {
267
+ throw new Error(`${describeError(err, connection)}\n(Note: to enforce max_rows the query was executed as ` +
268
+ `SELECT * FROM (<your query>) AS ${WRAPPER_ALIAS} LIMIT ${maxRows + 1}, so line numbers in the ` +
269
+ "server's message are offset by one.)");
270
+ }
271
+ throw err;
272
+ }
273
+ const elapsedMs = Date.now() - started;
274
+ const formatted = formatTable(capped.table, { maxRows, maxCellChars: config.maxCellChars });
275
+ const truncated = formatted.truncated || capped.truncated;
276
+ const footer = resultFooter({
277
+ rowCount: formatted.rowCount,
278
+ truncated,
279
+ maxRows,
280
+ elapsedMs,
281
+ });
282
+ const body = formatted.rowCount > 0 ? `${formatted.markdown}\n\n${footer}` : `(no rows)\n\n${footer}`;
283
+ return text(body, {
284
+ columns: formatted.columns,
285
+ rows: formatted.rows,
286
+ row_count: formatted.rowCount,
287
+ truncated,
288
+ elapsed_ms: elapsedMs,
289
+ });
290
+ }));
291
+ server.registerTool("explain_query", {
292
+ title: "Explain query",
293
+ description: "Returns DuckDB's EXPLAIN output (the physical plan) for a SQL statement without executing it.",
294
+ inputSchema: { sql: sqlArg },
295
+ annotations: { readOnlyHint: true, idempotentHint: true },
296
+ }, tool(async ({ sql }) => {
297
+ const guarded = guardStatement(sql, config.allowWrites);
298
+ const normalized = normalizeStatement(guarded.sql);
299
+ const explainSql = /^\s*EXPLAIN\b/iu.test(normalized) ? normalized : `EXPLAIN ${normalized}`;
300
+ const table = await connection.query(explainSql);
301
+ const sections = [];
302
+ const keyCol = table.schema.fields.findIndex((f) => f.name === "explain_key");
303
+ const valCol = table.schema.fields.findIndex((f) => f.name === "explain_value");
304
+ for (let i = 0; i < table.numRows; i++) {
305
+ const key = keyCol >= 0 ? String(table.getChildAt(keyCol)?.get(i)) : `row ${i + 1}`;
306
+ const value = valCol >= 0
307
+ ? String(table.getChildAt(valCol)?.get(i) ?? "")
308
+ : table.schema.fields.map((_, c) => String(table.getChildAt(c)?.get(i))).join(" ");
309
+ sections.push(`### ${key}\n\`\`\`\n${value.replace(/\s+$/u, "")}\n\`\`\``);
310
+ }
311
+ return text(sections.join("\n\n") || "(no plan returned)");
312
+ }));
313
+ if (config.allowWrites) {
314
+ server.registerTool("execute_statement", {
315
+ title: "Execute statement",
316
+ description: "Executes a DML/DDL statement (INSERT/UPDATE/DELETE/CREATE/...) with optional bound parameters " +
317
+ "and returns the affected-row count (-1 when the server does not report one).",
318
+ inputSchema: {
319
+ sql: sqlArg,
320
+ params: paramsSchema.optional().describe(PARAMS_DESCRIPTION),
321
+ },
322
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },
323
+ }, tool(async ({ sql, params }) => {
324
+ const guarded = guardStatement(sql, true);
325
+ const bound = convertParams(params);
326
+ const started = Date.now();
327
+ const affected = await connection.update(guarded.sql, bound);
328
+ const elapsedMs = Date.now() - started;
329
+ const count = affected < 0 ? "unknown" : String(affected);
330
+ return text(`Statement executed. Affected rows: ${count} · ${elapsedMs} ms`, {
331
+ affected_rows: affected,
332
+ elapsed_ms: elapsedMs,
333
+ });
334
+ }));
335
+ }
336
+ server.registerTool("server_info", {
337
+ title: "Server info",
338
+ description: "Reports the GizmoSQL and DuckDB versions, the connection (credentials redacted), the " +
339
+ "effective limits, and this MCP server's version.",
340
+ inputSchema: {},
341
+ annotations: { readOnlyHint: true, idempotentHint: true },
342
+ }, tool(async () => {
343
+ let gizmosqlVersion = "unknown";
344
+ let duckdbVersion = "unknown";
345
+ let user = "unknown";
346
+ let currentCatalog = "unknown";
347
+ let currentSchema = "unknown";
348
+ try {
349
+ const t = await connection.query("SELECT GIZMOSQL_VERSION() AS gv, version() AS dv, GIZMOSQL_USER() AS u, current_catalog() AS c, current_schema() AS s");
350
+ gizmosqlVersion = String(t.getChildAt(0)?.get(0));
351
+ duckdbVersion = String(t.getChildAt(1)?.get(0));
352
+ user = String(t.getChildAt(2)?.get(0));
353
+ currentCatalog = String(t.getChildAt(3)?.get(0));
354
+ currentSchema = String(t.getChildAt(4)?.get(0));
355
+ }
356
+ catch {
357
+ // Older servers lack GIZMOSQL_VERSION(); fall back to Flight SQL SqlInfo.
358
+ try {
359
+ const info = await connection.run((c) => c.getSqlInfo([0, 1]));
360
+ duckdbVersion = String(info.get(1) ?? "unknown");
361
+ gizmosqlVersion = `${info.get(0) ?? "gizmosql"} (version not reported)`;
362
+ }
363
+ catch {
364
+ // leave unknowns
365
+ }
366
+ }
367
+ const auth = connection.effectiveAuth();
368
+ const info = {
369
+ gizmosql_version: gizmosqlVersion,
370
+ duckdb_version: duckdbVersion,
371
+ connection_uri: redactedUri(config, auth.user),
372
+ auth_method: auth.method,
373
+ user,
374
+ tls: !config.plaintext,
375
+ tls_skip_verify: config.tlsSkipVerify,
376
+ current_catalog: currentCatalog,
377
+ current_schema: currentSchema,
378
+ allow_writes: config.allowWrites,
379
+ max_rows: config.maxRows,
380
+ max_cell_chars: config.maxCellChars,
381
+ query_timeout_seconds: config.queryTimeoutSeconds,
382
+ transport: ctx.transport,
383
+ mcp_server: `${PACKAGE_NAME} ${PACKAGE_VERSION}`,
384
+ session_warnings: connection.sessionWarnings(),
385
+ };
386
+ const lines = Object.entries(info).map(([k, v]) => `- ${k}: ${Array.isArray(v) ? (v.length ? v.join("; ") : "none") : String(v)}`);
387
+ return text(lines.join("\n"), info);
388
+ }));
389
+ if (config.enableSso) {
390
+ server.registerTool("login_sso", {
391
+ title: "Sign in with SSO",
392
+ description: "Signs in to GizmoSQL with the server's OAuth/SSO identity provider: opens the provider's " +
393
+ "login page in your browser, waits for you to finish, then reconnects with the identity " +
394
+ "token (kept in memory only). If the wait times out, call login_sso again to keep waiting.",
395
+ inputSchema: {
396
+ wait_seconds: z
397
+ .number()
398
+ .int()
399
+ .min(5)
400
+ .max(600)
401
+ .optional()
402
+ .describe("How long to wait for the browser login before returning (default 90)."),
403
+ },
404
+ annotations: { readOnlyHint: false, idempotentHint: true, openWorldHint: true },
405
+ }, tool(async ({ wait_seconds }) => {
406
+ const outcome = await runSsoLogin(connection, { waitSeconds: wait_seconds ?? 90 });
407
+ return text(outcome.message, { status: outcome.status, auth_url: outcome.authUrl ?? null });
408
+ }));
409
+ }
410
+ server.registerResource("table_schema", new ResourceTemplate("gizmosql://schema/{catalog}/{schema}/{table}", {
411
+ list: async () => {
412
+ const tables = await connection.run((c) => c.getTables());
413
+ return {
414
+ resources: tables.slice(0, 500).map((t) => ({
415
+ uri: `gizmosql://schema/${encodeURIComponent(t.catalog)}/${encodeURIComponent(t.schema)}/${encodeURIComponent(t.tableName)}`,
416
+ name: `${t.catalog}.${t.schema}.${t.tableName}`,
417
+ description: `${t.tableType} DDL`,
418
+ mimeType: "text/plain",
419
+ })),
420
+ };
421
+ },
422
+ }), {
423
+ title: "Table DDL",
424
+ description: "CREATE statement (DDL) for a table or view: gizmosql://schema/{catalog}/{schema}/{table}",
425
+ mimeType: "text/plain",
426
+ }, async (uri, variables) => {
427
+ const pick = (v) => decodeURIComponent(Array.isArray(v) ? v[0] : (v ?? ""));
428
+ const ref = {
429
+ catalog: pick(variables.catalog),
430
+ schema: pick(variables.schema),
431
+ table: pick(variables.table),
432
+ };
433
+ try {
434
+ const ddl = await fetchDdl(connection, ref);
435
+ const body = ddl ?? `-- ${ref.catalog}.${ref.schema}.${ref.table} not found`;
436
+ return { contents: [{ uri: uri.href, mimeType: "text/plain", text: truncateText(body, 100000) }] };
437
+ }
438
+ catch (err) {
439
+ return {
440
+ contents: [{ uri: uri.href, mimeType: "text/plain", text: `-- error: ${describeError(err, connection)}` }],
441
+ };
442
+ }
443
+ });
444
+ return server;
445
+ }
446
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export type StatementKind = "read" | "write" | "unknown";
2
+ export interface Classification {
3
+ /** Whether the statement is a read, a write, or could not be classified. */
4
+ kind: StatementKind;
5
+ /** The leading keyword that determined the classification (upper-cased). */
6
+ keyword: string;
7
+ /**
8
+ * Whether the statement can be wrapped as `SELECT * FROM (<sql>) LIMIT n`
9
+ * to enforce the row cap on the server side.
10
+ */
11
+ wrappable: boolean;
12
+ }
13
+ /**
14
+ * Removes SQL comments (`-- ...`, `/* ... *\/` with nesting) while
15
+ * preserving string literals, quoted identifiers and dollar-quoted
16
+ * strings. Comments are replaced by a single space so offsets stay
17
+ * meaningful for error messages.
18
+ */
19
+ export declare function stripComments(sql: string): string;
20
+ /**
21
+ * Splits SQL into top-level statements on semicolons that are outside
22
+ * strings, quoted identifiers and comments. Empty statements (e.g. from a
23
+ * trailing semicolon) are dropped.
24
+ */
25
+ export declare function splitStatements(sql: string): string[];
26
+ /**
27
+ * Returns the statement with comments removed and any trailing
28
+ * semicolons stripped, ready to be wrapped in a subquery.
29
+ */
30
+ export declare function normalizeStatement(sql: string): string;
31
+ /**
32
+ * Classifies a single SQL statement by its leading keyword, looking
33
+ * through leading parentheses and CTE lists to find the statement that
34
+ * actually executes.
35
+ */
36
+ export declare function classifyStatement(sql: string): Classification;
37
+ export declare class SqlGuardError extends Error {
38
+ constructor(message: string);
39
+ }
40
+ export interface GuardedStatement {
41
+ /** Comment-stripped statement without trailing semicolons. */
42
+ sql: string;
43
+ classification: Classification;
44
+ }
45
+ /**
46
+ * Validates that `sql` is exactly one statement and, when writes are
47
+ * disabled, that it is a read. Throws {@link SqlGuardError} otherwise.
48
+ */
49
+ export declare function guardStatement(sql: string, allowWrites: boolean): GuardedStatement;
50
+ /** Alias used by the query wrapper so it never collides with user aliases. */
51
+ export declare const WRAPPER_ALIAS = "gizmosql_mcp_q";
52
+ /**
53
+ * Wraps a read statement so the server enforces the row cap:
54
+ * `SELECT * FROM (<sql>) AS gizmosql_mcp_q LIMIT <limit>`.
55
+ * The caller must pass a normalized (comment-free, no trailing `;`) statement.
56
+ */
57
+ export declare function wrapWithLimit(sql: string, limit: number): string;