@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.
@@ -0,0 +1,119 @@
1
+ // stdio and Streamable HTTP transports over the shared server definition.
2
+ import { timingSafeEqual } from "node:crypto";
3
+ import * as http from "node:http";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
6
+ import { GizmoConnection } from "./connection.js";
7
+ import { createServer } from "./server.js";
8
+ import { PACKAGE_NAME, PACKAGE_VERSION } from "./version.js";
9
+ const log = (message) => console.error(message);
10
+ function installShutdown(connection, extra) {
11
+ let closing = false;
12
+ const shutdown = async () => {
13
+ if (closing)
14
+ return;
15
+ closing = true;
16
+ try {
17
+ await extra?.();
18
+ await connection.close();
19
+ }
20
+ finally {
21
+ process.exit(0);
22
+ }
23
+ };
24
+ process.on("SIGINT", shutdown);
25
+ process.on("SIGTERM", shutdown);
26
+ }
27
+ /** Runs the server on stdio (Claude Desktop / `claude mcp add`). */
28
+ export async function startStdio(config) {
29
+ const connection = new GizmoConnection(config, log);
30
+ const server = createServer({ connection, config, transport: "stdio" });
31
+ const transport = new StdioServerTransport();
32
+ installShutdown(connection, () => server.close());
33
+ // When the client closes stdin the transport closes; exit cleanly.
34
+ transport.onclose = () => {
35
+ void connection.close().finally(() => process.exit(0));
36
+ };
37
+ await server.connect(transport);
38
+ log(`[gizmosql-mcp] ${PACKAGE_NAME} ${PACKAGE_VERSION} ready on stdio (${config.host}:${config.port}, writes ${config.allowWrites ? "enabled" : "disabled"})`);
39
+ }
40
+ function bearerMatches(header, expected) {
41
+ if (!header)
42
+ return false;
43
+ const m = /^Bearer\s+(.+)$/iu.exec(header.trim());
44
+ if (!m)
45
+ return false;
46
+ const a = Buffer.from(m[1]);
47
+ const b = Buffer.from(expected);
48
+ return a.length === b.length && timingSafeEqual(a, b);
49
+ }
50
+ /**
51
+ * Runs the server as stateless Streamable HTTP on `/mcp`. Every request
52
+ * gets its own McpServer + transport (the SDK's stateless pattern) while
53
+ * sharing the single GizmoSQL connection.
54
+ *
55
+ * Authentication: when GIZMOSQL_MCP_BEARER_TOKEN is set every request must
56
+ * carry `Authorization: Bearer <token>`. OAuth is a future extension point:
57
+ * replace `authorize()` with an OAuth token verifier.
58
+ */
59
+ export async function startHttp(config, options) {
60
+ const connection = new GizmoConnection(config, log);
61
+ const bearer = config.mcpBearerToken;
62
+ const authorize = (req) => {
63
+ if (!bearer)
64
+ return true;
65
+ return bearerMatches(req.headers.authorization, bearer);
66
+ };
67
+ const httpServer = http.createServer(async (req, res) => {
68
+ const url = new URL(req.url ?? "/", "http://localhost");
69
+ if (url.pathname === "/healthz") {
70
+ res.writeHead(200, { "content-type": "application/json" });
71
+ res.end(JSON.stringify({ ok: true, server: PACKAGE_NAME, version: PACKAGE_VERSION }));
72
+ return;
73
+ }
74
+ if (url.pathname !== "/mcp") {
75
+ res.writeHead(404, { "content-type": "text/plain" });
76
+ res.end("Not found. The MCP endpoint is /mcp.");
77
+ return;
78
+ }
79
+ if (!authorize(req)) {
80
+ res.writeHead(401, { "content-type": "application/json", "www-authenticate": "Bearer" });
81
+ res.end(JSON.stringify({ error: "unauthorized" }));
82
+ return;
83
+ }
84
+ if (req.method !== "POST" && req.method !== "GET" && req.method !== "DELETE") {
85
+ res.writeHead(405, { allow: "GET, POST, DELETE" });
86
+ res.end();
87
+ return;
88
+ }
89
+ const server = createServer({ connection, config, transport: "http" });
90
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
91
+ res.on("close", () => {
92
+ void transport.close();
93
+ void server.close();
94
+ });
95
+ try {
96
+ await server.connect(transport);
97
+ await transport.handleRequest(req, res);
98
+ }
99
+ catch (err) {
100
+ log(`[gizmosql-mcp] request error: ${connection.redact(err instanceof Error ? err.message : String(err))}`);
101
+ if (!res.headersSent) {
102
+ res.writeHead(500, { "content-type": "application/json" });
103
+ res.end(JSON.stringify({ error: "internal error" }));
104
+ }
105
+ }
106
+ });
107
+ installShutdown(connection, () => new Promise((resolve) => httpServer.close(() => resolve())));
108
+ await new Promise((resolve, reject) => {
109
+ httpServer.once("error", reject);
110
+ httpServer.listen(options.port, options.host, () => resolve());
111
+ });
112
+ const addr = httpServer.address();
113
+ const shown = typeof addr === "object" && addr ? `${addr.address}:${addr.port}` : `${options.host}:${options.port}`;
114
+ log(`[gizmosql-mcp] ${PACKAGE_NAME} ${PACKAGE_VERSION} listening on http://${shown}/mcp ` +
115
+ `(${config.host}:${config.port}, writes ${config.allowWrites ? "enabled" : "disabled"}, ` +
116
+ `auth ${bearer ? "bearer" : "none"})`);
117
+ return httpServer;
118
+ }
119
+ //# sourceMappingURL=transports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transports.js","sourceRoot":"","sources":["../src/transports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const PACKAGE_NAME: string;
2
+ export declare const PACKAGE_VERSION: string;
@@ -0,0 +1,8 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ // Works for both layouts: `dist/version.js` (npm package) and
4
+ // `server/version.js` (MCPB bundle) — package.json sits one level up.
5
+ const pkg = require("../package.json");
6
+ export const PACKAGE_NAME = pkg.name;
7
+ export const PACKAGE_VERSION = pkg.version;
8
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,8DAA8D;AAC9D,sEAAsE;AACtE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAE5E,MAAM,CAAC,MAAM,YAAY,GAAW,GAAG,CAAC,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAW,GAAG,CAAC,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@gizmodata/gizmosql-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Model Context Protocol (MCP) server and Claude Desktop extension for GizmoSQL",
5
+ "author": "GizmoData LLC",
6
+ "license": "Apache-2.0",
7
+ "type": "module",
8
+ "main": "./dist/server.js",
9
+ "types": "./dist/server.d.ts",
10
+ "bin": {
11
+ "gizmosql-mcp": "dist/cli.js"
12
+ },
13
+ "files": [
14
+ "dist/",
15
+ "README.md",
16
+ "LICENSE",
17
+ "CHANGELOG.md"
18
+ ],
19
+ "engines": {
20
+ "node": ">=22.0.0"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/gizmodata/gizmosql-mcp.git"
25
+ },
26
+ "homepage": "https://github.com/gizmodata/gizmosql-mcp#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/gizmodata/gizmosql-mcp/issues"
29
+ },
30
+ "keywords": [
31
+ "gizmosql",
32
+ "gizmodata",
33
+ "mcp",
34
+ "model-context-protocol",
35
+ "claude",
36
+ "arrow",
37
+ "flightsql",
38
+ "duckdb",
39
+ "sql"
40
+ ],
41
+ "scripts": {
42
+ "clean": "rm -rf dist",
43
+ "build": "npm run clean && tsc -p tsconfig.json",
44
+ "typecheck": "npm run build && tsc -p tsconfig.test.json --noEmit",
45
+ "lint": "eslint src test scripts --fix",
46
+ "lint:ci": "eslint src test scripts",
47
+ "test": "npm run build && node --test \"test/unit/**/*.test.ts\"",
48
+ "test:integration": "npm run build && node --test \"test/integration/**/*.test.ts\"",
49
+ "build:mcpb": "bash scripts/build-mcpb.sh",
50
+ "prepublishOnly": "npm run typecheck && npm run lint:ci && npm test"
51
+ },
52
+ "dependencies": {
53
+ "@gizmodata/gizmosql-client": "^2.2.0",
54
+ "@modelcontextprotocol/sdk": "^1.30.0",
55
+ "apache-arrow": "^21.0.0",
56
+ "zod": "^4.0.0"
57
+ },
58
+ "devDependencies": {
59
+ "@anthropic-ai/mcpb": "^2.1.2",
60
+ "@eslint/js": "^9.0.0",
61
+ "@types/node": "^24.0.0",
62
+ "eslint": "^9.0.0",
63
+ "typescript": "^5.9.0",
64
+ "typescript-eslint": "^8.0.0"
65
+ },
66
+ "allowScripts": {
67
+ "@gizmodata/gizmosql-client@2.2.0": true
68
+ }
69
+ }