@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/CHANGELOG.md +39 -0
- package/LICENSE +201 -0
- package/README.md +295 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +107 -0
- package/dist/cli.js.map +1 -0
- package/dist/connection.d.ts +120 -0
- package/dist/connection.js +349 -0
- package/dist/connection.js.map +1 -0
- package/dist/format.d.ts +56 -0
- package/dist/format.js +240 -0
- package/dist/format.js.map +1 -0
- package/dist/params.d.ts +59 -0
- package/dist/params.js +160 -0
- package/dist/params.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.js +446 -0
- package/dist/server.js.map +1 -0
- package/dist/sql-guard.d.ts +57 -0
- package/dist/sql-guard.js +429 -0
- package/dist/sql-guard.js.map +1 -0
- package/dist/sso.d.ts +22 -0
- package/dist/sso.js +143 -0
- package/dist/sso.js.map +1 -0
- package/dist/transports.d.ts +18 -0
- package/dist/transports.js +119 -0
- package/dist/transports.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +69 -0
package/dist/format.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// Arrow -> Markdown / JSON rendering with cell truncation and row caps.
|
|
2
|
+
import { DataType, } from "apache-arrow";
|
|
3
|
+
const ELLIPSIS = "…";
|
|
4
|
+
/**
|
|
5
|
+
* Truncates `text` to `maxChars` Unicode code points (never splitting a
|
|
6
|
+
* surrogate pair), appending `…` when anything was removed.
|
|
7
|
+
*/
|
|
8
|
+
export function truncateText(text, maxChars) {
|
|
9
|
+
if (maxChars <= 0)
|
|
10
|
+
return text.length === 0 ? "" : ELLIPSIS;
|
|
11
|
+
const points = Array.from(text);
|
|
12
|
+
if (points.length <= maxChars)
|
|
13
|
+
return text;
|
|
14
|
+
return points.slice(0, maxChars).join("") + ELLIPSIS;
|
|
15
|
+
}
|
|
16
|
+
/** Escapes a cell for use inside a Markdown table row. */
|
|
17
|
+
export function escapeMarkdownCell(text) {
|
|
18
|
+
return text.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\r?\n/g, "\\n");
|
|
19
|
+
}
|
|
20
|
+
/** Renders a Markdown table. Cells must already be escaped/truncated strings. */
|
|
21
|
+
export function toMarkdownTable(headers, rows) {
|
|
22
|
+
const head = `| ${headers.map(escapeMarkdownCell).join(" | ")} |`;
|
|
23
|
+
const sep = `| ${headers.map(() => "---").join(" | ")} |`;
|
|
24
|
+
const body = rows.map((r) => `| ${r.join(" | ")} |`);
|
|
25
|
+
return [head, sep, ...body].join("\n");
|
|
26
|
+
}
|
|
27
|
+
const BIGINT_SAFE = (v) => v >= BigInt(Number.MIN_SAFE_INTEGER) && v <= BigInt(Number.MAX_SAFE_INTEGER)
|
|
28
|
+
? Number(v)
|
|
29
|
+
: v.toString();
|
|
30
|
+
function pad(n, width = 2) {
|
|
31
|
+
return String(n).padStart(width, "0");
|
|
32
|
+
}
|
|
33
|
+
function isoDate(ms) {
|
|
34
|
+
const d = new Date(ms);
|
|
35
|
+
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;
|
|
36
|
+
}
|
|
37
|
+
function isoTimestamp(ms, withZone) {
|
|
38
|
+
const d = new Date(ms);
|
|
39
|
+
if (Number.isNaN(d.getTime()))
|
|
40
|
+
return String(ms);
|
|
41
|
+
const base = `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}` +
|
|
42
|
+
`T${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;
|
|
43
|
+
const millis = d.getUTCMilliseconds();
|
|
44
|
+
const frac = millis ? `.${pad(millis, 3)}` : "";
|
|
45
|
+
return `${base}${frac}${withZone ? "Z" : ""}`;
|
|
46
|
+
}
|
|
47
|
+
/** Renders a Time value given the Arrow time unit (0=s,1=ms,2=us,3=ns). */
|
|
48
|
+
function isoTime(value, unit) {
|
|
49
|
+
const perSecond = [1n, 1000n, 1000000n, 1000000000n][unit] ?? 1n;
|
|
50
|
+
const v = typeof value === "bigint" ? value : BigInt(Math.trunc(value));
|
|
51
|
+
const totalSeconds = v / perSecond;
|
|
52
|
+
const fraction = v % perSecond;
|
|
53
|
+
const h = totalSeconds / 3600n;
|
|
54
|
+
const m = (totalSeconds % 3600n) / 60n;
|
|
55
|
+
const s = totalSeconds % 60n;
|
|
56
|
+
let out = `${pad(Number(h))}:${pad(Number(m))}:${pad(Number(s))}`;
|
|
57
|
+
if (fraction !== 0n) {
|
|
58
|
+
const digits = [0, 3, 6, 9][unit] ?? 0;
|
|
59
|
+
out += `.${fraction.toString().padStart(digits, "0").replace(/0+$/, "")}`;
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
/** Formats an unscaled decimal (as a decimal-digit string) with `scale` digits. */
|
|
64
|
+
export function formatDecimal(unscaled, scale) {
|
|
65
|
+
let digits = unscaled;
|
|
66
|
+
let sign = "";
|
|
67
|
+
if (digits.startsWith("-")) {
|
|
68
|
+
sign = "-";
|
|
69
|
+
digits = digits.slice(1);
|
|
70
|
+
}
|
|
71
|
+
if (scale <= 0)
|
|
72
|
+
return sign + digits;
|
|
73
|
+
digits = digits.padStart(scale + 1, "0");
|
|
74
|
+
const intPart = digits.slice(0, digits.length - scale);
|
|
75
|
+
const fracPart = digits.slice(digits.length - scale);
|
|
76
|
+
return `${sign}${intPart}.${fracPart}`;
|
|
77
|
+
}
|
|
78
|
+
/** Converts an Arrow decimal cell value (BigNum / bigint / number) to its unscaled digit string. */
|
|
79
|
+
function decimalUnscaled(value) {
|
|
80
|
+
if (typeof value === "bigint")
|
|
81
|
+
return value.toString();
|
|
82
|
+
if (typeof value === "number")
|
|
83
|
+
return BigInt(Math.trunc(value)).toString();
|
|
84
|
+
const asObj = value;
|
|
85
|
+
// apache-arrow BN objects stringify to their (signed) integer value.
|
|
86
|
+
if (asObj && typeof asObj.toString === "function") {
|
|
87
|
+
const s = asObj.toString();
|
|
88
|
+
if (/^-?\d+$/.test(s))
|
|
89
|
+
return s;
|
|
90
|
+
}
|
|
91
|
+
return String(value);
|
|
92
|
+
}
|
|
93
|
+
function bytesToBase64(bytes) {
|
|
94
|
+
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64");
|
|
95
|
+
}
|
|
96
|
+
function jsonReplacer(_key, v) {
|
|
97
|
+
if (typeof v === "bigint")
|
|
98
|
+
return BIGINT_SAFE(v);
|
|
99
|
+
if (v instanceof Uint8Array)
|
|
100
|
+
return bytesToBase64(v);
|
|
101
|
+
return v;
|
|
102
|
+
}
|
|
103
|
+
/** Recursively converts nested Arrow values (Vector / StructRow / MapRow) to plain JSON. */
|
|
104
|
+
function nestedToJson(value) {
|
|
105
|
+
if (value === null || value === undefined)
|
|
106
|
+
return null;
|
|
107
|
+
if (typeof value === "bigint")
|
|
108
|
+
return BIGINT_SAFE(value);
|
|
109
|
+
if (value instanceof Uint8Array)
|
|
110
|
+
return bytesToBase64(value);
|
|
111
|
+
if (value instanceof Date)
|
|
112
|
+
return value.toISOString();
|
|
113
|
+
if (typeof value !== "object")
|
|
114
|
+
return value;
|
|
115
|
+
const obj = value;
|
|
116
|
+
if (typeof obj.toJSON === "function") {
|
|
117
|
+
return nestedToJson(obj.toJSON());
|
|
118
|
+
}
|
|
119
|
+
if (Array.isArray(value))
|
|
120
|
+
return value.map(nestedToJson);
|
|
121
|
+
if (typeof obj.toArray === "function") {
|
|
122
|
+
return Array.from(obj.toArray(), nestedToJson);
|
|
123
|
+
}
|
|
124
|
+
const out = {};
|
|
125
|
+
for (const [k, v] of Object.entries(value)) {
|
|
126
|
+
out[k] = nestedToJson(v);
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Converts one Arrow cell to a JSON-safe value using the column type for
|
|
132
|
+
* temporal / decimal / binary rendering.
|
|
133
|
+
*/
|
|
134
|
+
export function cellToJson(value, type) {
|
|
135
|
+
if (value === null || value === undefined)
|
|
136
|
+
return null;
|
|
137
|
+
if (DataType.isDecimal(type)) {
|
|
138
|
+
return formatDecimal(decimalUnscaled(value), type.scale);
|
|
139
|
+
}
|
|
140
|
+
if (DataType.isDate(type)) {
|
|
141
|
+
const ms = typeof value === "bigint" ? Number(value) : value;
|
|
142
|
+
return isoDate(ms);
|
|
143
|
+
}
|
|
144
|
+
if (DataType.isTimestamp(type)) {
|
|
145
|
+
const ms = typeof value === "bigint" ? Number(value) : value;
|
|
146
|
+
return isoTimestamp(ms, Boolean(type.timezone));
|
|
147
|
+
}
|
|
148
|
+
if (DataType.isTime(type)) {
|
|
149
|
+
return isoTime(value, type.unit);
|
|
150
|
+
}
|
|
151
|
+
if (DataType.isInterval(type) || DataType.isDuration(type)) {
|
|
152
|
+
return intervalToString(value);
|
|
153
|
+
}
|
|
154
|
+
if (DataType.isBinary(type) || DataType.isLargeBinary(type) || DataType.isFixedSizeBinary(type)) {
|
|
155
|
+
return bytesToBase64(value);
|
|
156
|
+
}
|
|
157
|
+
if (typeof value === "bigint")
|
|
158
|
+
return BIGINT_SAFE(value);
|
|
159
|
+
if (typeof value === "number" || typeof value === "string" || typeof value === "boolean") {
|
|
160
|
+
return value;
|
|
161
|
+
}
|
|
162
|
+
return nestedToJson(value);
|
|
163
|
+
}
|
|
164
|
+
function intervalToString(value) {
|
|
165
|
+
// MONTH_DAY_NANO intervals arrive as Int32Array [months, days, nanosLo, nanosHi];
|
|
166
|
+
// DAY_TIME as [days, millis]; YEAR_MONTH as a number of months.
|
|
167
|
+
if (value instanceof Int32Array || Array.isArray(value)) {
|
|
168
|
+
const arr = Array.from(value);
|
|
169
|
+
if (arr.length === 4) {
|
|
170
|
+
const nanos = BigInt.asUintN(32, BigInt(arr[2])) + (BigInt(arr[3]) << 32n);
|
|
171
|
+
const seconds = Number(nanos) / 1e9;
|
|
172
|
+
return `${arr[0]} months ${arr[1]} days ${seconds} seconds`;
|
|
173
|
+
}
|
|
174
|
+
if (arr.length === 2) {
|
|
175
|
+
return `${arr[0]} days ${arr[1] / 1000} seconds`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (typeof value === "number")
|
|
179
|
+
return `${value} months`;
|
|
180
|
+
if (typeof value === "bigint")
|
|
181
|
+
return value.toString();
|
|
182
|
+
return nestedToJson(value) === null ? "NULL" : JSON.stringify(nestedToJson(value), jsonReplacer);
|
|
183
|
+
}
|
|
184
|
+
/** Renders a JSON-safe cell value as display text (no truncation). */
|
|
185
|
+
export function cellToText(json) {
|
|
186
|
+
if (json === null || json === undefined)
|
|
187
|
+
return "NULL";
|
|
188
|
+
if (typeof json === "string")
|
|
189
|
+
return json;
|
|
190
|
+
if (typeof json === "number" || typeof json === "boolean" || typeof json === "bigint") {
|
|
191
|
+
return String(json);
|
|
192
|
+
}
|
|
193
|
+
return JSON.stringify(json, jsonReplacer);
|
|
194
|
+
}
|
|
195
|
+
/** Human-readable Arrow type name for a field. */
|
|
196
|
+
export function fieldTypeName(field) {
|
|
197
|
+
return String(field.type);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Renders up to `maxRows` rows of an Arrow table as Markdown and JSON.
|
|
201
|
+
* Reads column vectors row-by-row and stops at the cap — it never
|
|
202
|
+
* materializes the whole table into JS objects.
|
|
203
|
+
*/
|
|
204
|
+
export function formatTable(table, options) {
|
|
205
|
+
const fields = table.schema.fields;
|
|
206
|
+
const columns = fields.map((f) => ({ name: f.name, type: fieldTypeName(f) }));
|
|
207
|
+
const total = table.numRows;
|
|
208
|
+
const limit = Math.max(0, Math.min(options.maxRows, total));
|
|
209
|
+
const vectors = fields.map((_, i) => table.getChildAt(i));
|
|
210
|
+
const rows = [];
|
|
211
|
+
const textRows = [];
|
|
212
|
+
for (let r = 0; r < limit; r++) {
|
|
213
|
+
const jsonRow = [];
|
|
214
|
+
const textRow = [];
|
|
215
|
+
for (let c = 0; c < fields.length; c++) {
|
|
216
|
+
const raw = vectors[c]?.get(r);
|
|
217
|
+
const json = cellToJson(raw, fields[c].type);
|
|
218
|
+
jsonRow.push(json);
|
|
219
|
+
textRow.push(escapeMarkdownCell(truncateText(cellToText(json), options.maxCellChars)));
|
|
220
|
+
}
|
|
221
|
+
rows.push(jsonRow);
|
|
222
|
+
textRows.push(textRow);
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
columns,
|
|
226
|
+
rows,
|
|
227
|
+
rowCount: rows.length,
|
|
228
|
+
truncated: total > limit,
|
|
229
|
+
markdown: toMarkdownTable(columns.map((c) => c.name), textRows),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/** Footer line appended to query results. */
|
|
233
|
+
export function resultFooter(input) {
|
|
234
|
+
const rows = `${input.rowCount} row${input.rowCount === 1 ? "" : "s"} returned`;
|
|
235
|
+
const trunc = input.truncated
|
|
236
|
+
? ` (truncated: more rows exist beyond max_rows=${input.maxRows})`
|
|
237
|
+
: "";
|
|
238
|
+
return `${rows}${trunc} · ${input.elapsedMs} ms`;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
|
package/dist/params.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { SqlParameterValue } from "@gizmodata/gizmosql-client";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare const TYPED_PARAM_TYPES: readonly ["string", "number", "bigint", "boolean", "date", "timestamp", "binary", "null"];
|
|
4
|
+
export type TypedParamType = (typeof TYPED_PARAM_TYPES)[number];
|
|
5
|
+
export declare const typedParamSchema: z.ZodObject<{
|
|
6
|
+
type: z.ZodEnum<{
|
|
7
|
+
string: "string";
|
|
8
|
+
number: "number";
|
|
9
|
+
bigint: "bigint";
|
|
10
|
+
boolean: "boolean";
|
|
11
|
+
binary: "binary";
|
|
12
|
+
date: "date";
|
|
13
|
+
timestamp: "timestamp";
|
|
14
|
+
null: "null";
|
|
15
|
+
}>;
|
|
16
|
+
value: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
export declare const paramValueSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodObject<{
|
|
19
|
+
type: z.ZodEnum<{
|
|
20
|
+
string: "string";
|
|
21
|
+
number: "number";
|
|
22
|
+
bigint: "bigint";
|
|
23
|
+
boolean: "boolean";
|
|
24
|
+
binary: "binary";
|
|
25
|
+
date: "date";
|
|
26
|
+
timestamp: "timestamp";
|
|
27
|
+
null: "null";
|
|
28
|
+
}>;
|
|
29
|
+
value: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
|
|
30
|
+
}, z.core.$strict>]>;
|
|
31
|
+
export declare const paramsSchema: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodObject<{
|
|
32
|
+
type: z.ZodEnum<{
|
|
33
|
+
string: "string";
|
|
34
|
+
number: "number";
|
|
35
|
+
bigint: "bigint";
|
|
36
|
+
boolean: "boolean";
|
|
37
|
+
binary: "binary";
|
|
38
|
+
date: "date";
|
|
39
|
+
timestamp: "timestamp";
|
|
40
|
+
null: "null";
|
|
41
|
+
}>;
|
|
42
|
+
value: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
|
|
43
|
+
}, z.core.$strict>]>>;
|
|
44
|
+
export type JsonParamValue = z.infer<typeof paramValueSchema>;
|
|
45
|
+
export declare class ParameterError extends Error {
|
|
46
|
+
constructor(message: string);
|
|
47
|
+
}
|
|
48
|
+
/** Parses an ISO-8601 date or timestamp string into a Date (UTC when no zone given). */
|
|
49
|
+
export declare function parseIsoDateTime(text: string): Date | undefined;
|
|
50
|
+
/** Converts one JSON parameter value into a bindable client value. */
|
|
51
|
+
export declare function convertParam(index: number, value: JsonParamValue): SqlParameterValue;
|
|
52
|
+
/**
|
|
53
|
+
* Converts the JSON `params` array from a tool call into the positional
|
|
54
|
+
* values bound by the client. Returns `undefined` when there is nothing
|
|
55
|
+
* to bind.
|
|
56
|
+
*/
|
|
57
|
+
export declare function convertParams(params: JsonParamValue[] | undefined): SqlParameterValue[] | undefined;
|
|
58
|
+
/** Documentation for the `params` argument, shared by run_query / execute_statement. */
|
|
59
|
+
export declare const PARAMS_DESCRIPTION: string;
|
package/dist/params.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// Conversion of JSON tool arguments into the typed values that
|
|
2
|
+
// @gizmodata/gizmosql-client binds to `?` / `$1` placeholders.
|
|
3
|
+
//
|
|
4
|
+
// Plain JSON values map as: string -> Utf8 (unless it is an ISO-8601
|
|
5
|
+
// date/timestamp, which becomes a Date -> Timestamp), number -> Int32/
|
|
6
|
+
// Int64/Float64, boolean -> Bool, null -> Null. A typed object form
|
|
7
|
+
// `{ "type": "...", "value": ... }` disambiguates the cases JSON cannot
|
|
8
|
+
// express (bigint, binary, a string that merely looks like a date).
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
export const TYPED_PARAM_TYPES = [
|
|
11
|
+
"string",
|
|
12
|
+
"number",
|
|
13
|
+
"bigint",
|
|
14
|
+
"boolean",
|
|
15
|
+
"date",
|
|
16
|
+
"timestamp",
|
|
17
|
+
"binary",
|
|
18
|
+
"null",
|
|
19
|
+
];
|
|
20
|
+
export const typedParamSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
type: z.enum(TYPED_PARAM_TYPES),
|
|
23
|
+
value: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),
|
|
24
|
+
})
|
|
25
|
+
.strict();
|
|
26
|
+
export const paramValueSchema = z.union([
|
|
27
|
+
z.string(),
|
|
28
|
+
z.number(),
|
|
29
|
+
z.boolean(),
|
|
30
|
+
z.null(),
|
|
31
|
+
typedParamSchema,
|
|
32
|
+
]);
|
|
33
|
+
export const paramsSchema = z.array(paramValueSchema);
|
|
34
|
+
export class ParameterError extends Error {
|
|
35
|
+
constructor(message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = "ParameterError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// YYYY-MM-DD
|
|
41
|
+
const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/u;
|
|
42
|
+
// YYYY-MM-DD[T ]HH:MM[:SS[.fraction]][Z|±HH[:MM]]
|
|
43
|
+
const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}(?::?\d{2})?)?$/u;
|
|
44
|
+
/** Parses an ISO-8601 date or timestamp string into a Date (UTC when no zone given). */
|
|
45
|
+
export function parseIsoDateTime(text) {
|
|
46
|
+
if (ISO_DATE.test(text)) {
|
|
47
|
+
const d = new Date(`${text}T00:00:00Z`);
|
|
48
|
+
return Number.isNaN(d.getTime()) ? undefined : d;
|
|
49
|
+
}
|
|
50
|
+
if (ISO_TIMESTAMP.test(text)) {
|
|
51
|
+
let normalized = text.replace(" ", "T");
|
|
52
|
+
// Treat zone-less timestamps as UTC so the bound value is deterministic.
|
|
53
|
+
if (!/(?:Z|[+-]\d{2}(?::?\d{2})?)$/u.test(normalized))
|
|
54
|
+
normalized += "Z";
|
|
55
|
+
// Trim fractions beyond milliseconds (Date only keeps ms).
|
|
56
|
+
normalized = normalized.replace(/(\.\d{3})\d+/u, "$1");
|
|
57
|
+
const d = new Date(normalized);
|
|
58
|
+
return Number.isNaN(d.getTime()) ? undefined : d;
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
function convertTyped(index, type, value) {
|
|
63
|
+
const where = `parameter ${index + 1} (type "${type}")`;
|
|
64
|
+
switch (type) {
|
|
65
|
+
case "null":
|
|
66
|
+
return null;
|
|
67
|
+
case "string":
|
|
68
|
+
if (value === null || value === undefined)
|
|
69
|
+
return null;
|
|
70
|
+
return String(value);
|
|
71
|
+
case "boolean":
|
|
72
|
+
if (typeof value === "boolean")
|
|
73
|
+
return value;
|
|
74
|
+
if (value === "true")
|
|
75
|
+
return true;
|
|
76
|
+
if (value === "false")
|
|
77
|
+
return false;
|
|
78
|
+
throw new ParameterError(`${where}: expected a boolean value.`);
|
|
79
|
+
case "number":
|
|
80
|
+
if (typeof value === "number")
|
|
81
|
+
return value;
|
|
82
|
+
if (typeof value === "string" && value.trim() !== "" && Number.isFinite(Number(value))) {
|
|
83
|
+
return Number(value);
|
|
84
|
+
}
|
|
85
|
+
throw new ParameterError(`${where}: expected a numeric value.`);
|
|
86
|
+
case "bigint": {
|
|
87
|
+
if (typeof value === "number") {
|
|
88
|
+
if (!Number.isSafeInteger(value)) {
|
|
89
|
+
throw new ParameterError(`${where}: ${value} is not a safe integer; pass the value as a decimal string.`);
|
|
90
|
+
}
|
|
91
|
+
return BigInt(value);
|
|
92
|
+
}
|
|
93
|
+
if (typeof value === "string" && /^-?\d+$/u.test(value.trim())) {
|
|
94
|
+
return BigInt(value.trim());
|
|
95
|
+
}
|
|
96
|
+
throw new ParameterError(`${where}: expected an integer or a decimal-digit string.`);
|
|
97
|
+
}
|
|
98
|
+
case "date":
|
|
99
|
+
case "timestamp": {
|
|
100
|
+
if (typeof value === "number")
|
|
101
|
+
return new Date(value);
|
|
102
|
+
if (typeof value === "string") {
|
|
103
|
+
const d = parseIsoDateTime(value) ?? new Date(value);
|
|
104
|
+
if (Number.isNaN(d.getTime())) {
|
|
105
|
+
throw new ParameterError(`${where}: "${value}" is not a valid ISO-8601 date/timestamp.`);
|
|
106
|
+
}
|
|
107
|
+
return d;
|
|
108
|
+
}
|
|
109
|
+
throw new ParameterError(`${where}: expected an ISO-8601 string or epoch milliseconds.`);
|
|
110
|
+
}
|
|
111
|
+
case "binary": {
|
|
112
|
+
if (typeof value !== "string") {
|
|
113
|
+
throw new ParameterError(`${where}: expected a base64 string.`);
|
|
114
|
+
}
|
|
115
|
+
return new Uint8Array(Buffer.from(value, "base64"));
|
|
116
|
+
}
|
|
117
|
+
default:
|
|
118
|
+
throw new ParameterError(`${where}: unsupported parameter type.`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Converts one JSON parameter value into a bindable client value. */
|
|
122
|
+
export function convertParam(index, value) {
|
|
123
|
+
if (value === null)
|
|
124
|
+
return null;
|
|
125
|
+
if (typeof value === "boolean")
|
|
126
|
+
return value;
|
|
127
|
+
if (typeof value === "number") {
|
|
128
|
+
if (Number.isInteger(value) && !Number.isSafeInteger(value)) {
|
|
129
|
+
throw new ParameterError(`parameter ${index + 1}: ${value} exceeds JavaScript's safe integer range; ` +
|
|
130
|
+
`pass it as {"type":"bigint","value":"<digits>"}.`);
|
|
131
|
+
}
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
if (typeof value === "string") {
|
|
135
|
+
return parseIsoDateTime(value) ?? value;
|
|
136
|
+
}
|
|
137
|
+
if (typeof value === "object" && value !== null && "type" in value) {
|
|
138
|
+
return convertTyped(index, value.type, value.value);
|
|
139
|
+
}
|
|
140
|
+
throw new ParameterError(`parameter ${index + 1}: unsupported value.`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Converts the JSON `params` array from a tool call into the positional
|
|
144
|
+
* values bound by the client. Returns `undefined` when there is nothing
|
|
145
|
+
* to bind.
|
|
146
|
+
*/
|
|
147
|
+
export function convertParams(params) {
|
|
148
|
+
if (!params || params.length === 0)
|
|
149
|
+
return undefined;
|
|
150
|
+
return params.map((v, i) => convertParam(i, v));
|
|
151
|
+
}
|
|
152
|
+
/** Documentation for the `params` argument, shared by run_query / execute_statement. */
|
|
153
|
+
export const PARAMS_DESCRIPTION = "Optional JSON array of values bound positionally to ? or $1, $2, ... placeholders in the SQL " +
|
|
154
|
+
"(typed Arrow parameters — never string interpolation). Use placeholders for any literal that " +
|
|
155
|
+
"comes from user input or data. Accepted values: string, number, boolean, null, and ISO-8601 " +
|
|
156
|
+
"date/timestamp strings (converted to TIMESTAMP). For explicit types use " +
|
|
157
|
+
'{"type":"bigint"|"date"|"timestamp"|"binary"|"string"|"number"|"boolean"|"null","value":...} ' +
|
|
158
|
+
'(binary values are base64). Note: a placeholder whose type the server cannot infer from ' +
|
|
159
|
+
"context (e.g. SELECT ?) must be cast, e.g. SELECT ?::INTEGER.";
|
|
160
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { GizmoConnection, type McpConfig } from "./connection.js";
|
|
3
|
+
export interface ServerContext {
|
|
4
|
+
connection: GizmoConnection;
|
|
5
|
+
config: McpConfig;
|
|
6
|
+
transport: "stdio" | "http";
|
|
7
|
+
}
|
|
8
|
+
/** Converts a thrown error into a redacted, user-facing message. */
|
|
9
|
+
export declare function describeError(err: unknown, connection: GizmoConnection): string;
|
|
10
|
+
/** Builds the McpServer with every tool/resource registered against `ctx`. */
|
|
11
|
+
export declare function createServer(ctx: ServerContext): McpServer;
|