@gizmodata/hardcharger-mcp 0.0.0 → 2.0.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,29 @@
1
+ import * as http from "node:http";
2
+ import { type McpConfig } from "./connection.js";
3
+ import { OAuthVerifier } from "./oauth.js";
4
+ /** Runs the server on stdio (Claude Desktop / `claude mcp add`). */
5
+ export declare function startStdio(config: McpConfig): Promise<void>;
6
+ export interface HttpOptions {
7
+ host: string;
8
+ port: number;
9
+ /** Test hook: replaces the OAuth verifier built from the config. */
10
+ verifier?: OAuthVerifier;
11
+ /** Test hook: disables the SIGINT/SIGTERM handlers. */
12
+ installSignalHandlers?: boolean;
13
+ }
14
+ /**
15
+ * Runs the server as stateless Streamable HTTP on `/mcp`. Every request
16
+ * gets its own McpServer + transport (the SDK's stateless pattern). With
17
+ * OAuth, each authenticated user also gets their own connection registry
18
+ * (a SessionStore entry) so session state never crosses users; otherwise
19
+ * one registry is shared by every client.
20
+ *
21
+ * Authentication, one of:
22
+ * - HARDCHARGER_MCP_OAUTH_ISSUER: the server is an OAuth 2.1 resource server.
23
+ * Bearer tokens are verified against the provider's JWKS; RFC 9728
24
+ * metadata is served under /.well-known/oauth-protected-resource so
25
+ * clients discover the provider; 401 responses carry the challenge.
26
+ * - HARDCHARGER_MCP_BEARER_TOKEN: a single static token compared in constant time.
27
+ * - neither: unauthenticated (local use only).
28
+ */
29
+ export declare function startHttp(config: McpConfig, options: HttpOptions): Promise<http.Server>;
@@ -0,0 +1,308 @@
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 { redactSecrets } from "./connection.js";
7
+ import { OAuthError, OAuthVerifier, OFFLINE_ACCESS_SCOPE, protectedResourceMetadataPaths } from "./oauth.js";
8
+ import { OAuthFacade, facadeMetadataPaths, facadeTokenPath } from "./oauth-facade.js";
9
+ import { ConnectionRegistry } from "./registry.js";
10
+ import { createServer } from "./server.js";
11
+ import { SessionStore } from "./sessions.js";
12
+ import { PACKAGE_NAME, PACKAGE_VERSION } from "./version.js";
13
+ const log = (message) => console.error(message);
14
+ /** "host:port" for one connection, or "name=host:port, ..." for several. */
15
+ function describeTargets(config) {
16
+ if (config.connections.length === 1) {
17
+ const c = config.connections[0];
18
+ return c.uri;
19
+ }
20
+ return config.connections.map((c) => `${c.name}=${c.uri}`).join(", ");
21
+ }
22
+ function installShutdown(closeAll, extra) {
23
+ let closing = false;
24
+ const shutdown = async () => {
25
+ if (closing)
26
+ return;
27
+ closing = true;
28
+ try {
29
+ await extra?.();
30
+ await closeAll();
31
+ }
32
+ finally {
33
+ process.exit(0);
34
+ }
35
+ };
36
+ process.on("SIGINT", shutdown);
37
+ process.on("SIGTERM", shutdown);
38
+ }
39
+ /** Runs the server on stdio (Claude Desktop / `claude mcp add`). */
40
+ export async function startStdio(config) {
41
+ const registry = new ConnectionRegistry(config, log);
42
+ const server = createServer({ registry, config, transport: "stdio" });
43
+ const transport = new StdioServerTransport();
44
+ installShutdown(() => registry.close(), () => server.close());
45
+ // When the client closes stdin the transport closes; exit cleanly.
46
+ transport.onclose = () => {
47
+ void registry.close().finally(() => process.exit(0));
48
+ };
49
+ await server.connect(transport);
50
+ log(`[hardcharger-mcp] ${PACKAGE_NAME} ${PACKAGE_VERSION} ready on stdio (${describeTargets(config)}, writes ${config.allowWrites ? "enabled" : "disabled"})`);
51
+ }
52
+ function bearerMatches(header, expected) {
53
+ if (!header)
54
+ return false;
55
+ const m = /^Bearer\s+(.+)$/iu.exec(header.trim());
56
+ if (!m)
57
+ return false;
58
+ const a = Buffer.from(m[1]);
59
+ const b = Buffer.from(expected);
60
+ return a.length === b.length && timingSafeEqual(a, b);
61
+ }
62
+ /** Largest JSON-RPC request body accepted on /mcp. */
63
+ const MAX_BODY_BYTES = 8 * 1024 * 1024;
64
+ function readBody(req) {
65
+ return new Promise((resolve, reject) => {
66
+ const chunks = [];
67
+ let size = 0;
68
+ req.on("data", (chunk) => {
69
+ size += chunk.length;
70
+ if (size > MAX_BODY_BYTES) {
71
+ reject(new Error(`request body exceeds ${MAX_BODY_BYTES} bytes`));
72
+ req.destroy();
73
+ return;
74
+ }
75
+ chunks.push(chunk);
76
+ });
77
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
78
+ req.on("error", reject);
79
+ });
80
+ }
81
+ /** One audit line per JSON-RPC request: who called which method (and tool). */
82
+ function describeRequest(body) {
83
+ const messages = Array.isArray(body) ? body : [body];
84
+ const out = [];
85
+ for (const m of messages) {
86
+ if (!m || typeof m !== "object")
87
+ continue;
88
+ const method = m.method;
89
+ const id = m.id;
90
+ if (typeof method !== "string" || id === undefined)
91
+ continue; // responses and notifications
92
+ if (method === "tools/call") {
93
+ const name = m.params?.name;
94
+ out.push(`tools/call ${typeof name === "string" ? name : "?"}`);
95
+ }
96
+ else if (method === "resources/read") {
97
+ const uri = m.params?.uri;
98
+ out.push(`resources/read ${typeof uri === "string" ? uri : "?"}`);
99
+ }
100
+ else {
101
+ out.push(method);
102
+ }
103
+ }
104
+ return out;
105
+ }
106
+ /** Session key: one session per subject at the issuer. */
107
+ function sessionKey(issuer, user) {
108
+ return `${issuer}#${user.subject || user.name}`;
109
+ }
110
+ /**
111
+ * Runs the server as stateless Streamable HTTP on `/mcp`. Every request
112
+ * gets its own McpServer + transport (the SDK's stateless pattern). With
113
+ * OAuth, each authenticated user also gets their own connection registry
114
+ * (a SessionStore entry) so session state never crosses users; otherwise
115
+ * one registry is shared by every client.
116
+ *
117
+ * Authentication, one of:
118
+ * - HARDCHARGER_MCP_OAUTH_ISSUER: the server is an OAuth 2.1 resource server.
119
+ * Bearer tokens are verified against the provider's JWKS; RFC 9728
120
+ * metadata is served under /.well-known/oauth-protected-resource so
121
+ * clients discover the provider; 401 responses carry the challenge.
122
+ * - HARDCHARGER_MCP_BEARER_TOKEN: a single static token compared in constant time.
123
+ * - neither: unauthenticated (local use only).
124
+ */
125
+ export async function startHttp(config, options) {
126
+ const bearer = config.mcpBearerToken;
127
+ const oauth = config.mcpOAuth;
128
+ const verifier = options.verifier ?? (oauth ? new OAuthVerifier(oauth, { log }) : undefined);
129
+ // Per-user sessions need an identity, so they exist only with OAuth.
130
+ const sessions = verifier
131
+ ? new SessionStore(config, { idleSeconds: config.mcpSessionIdleSeconds, maxSessions: config.mcpMaxSessions, log })
132
+ : undefined;
133
+ const sharedRegistry = sessions ? undefined : new ConnectionRegistry(config, log);
134
+ // Used only for redacting log lines; secrets are the same in every registry.
135
+ const redact = (t) => redactSecrets(t, sharedRegistry ? sharedRegistry.secrets() : config.connections.flatMap((c) => [c.password]));
136
+ const metadataPaths = new Set(oauth ? protectedResourceMetadataPaths(oauth.publicUrl) : []);
137
+ // Token-proxy facade: Claude is pointed at this server's copy of the
138
+ // provider metadata so refresh_token grants pass through handleToken.
139
+ const facade = oauth && verifier && oauth.tokenProxy
140
+ ? new OAuthFacade({ publicUrl: oauth.publicUrl, upstreamIssuer: oauth.issuer, scopes: oauth.scopes }, { log })
141
+ : undefined;
142
+ const facadePaths = new Set(facade ? facadeMetadataPaths() : []);
143
+ const authorize = async (req) => {
144
+ if (verifier) {
145
+ try {
146
+ return { ok: true, user: await verifier.verify(req.headers.authorization) };
147
+ }
148
+ catch (err) {
149
+ if (err instanceof OAuthError) {
150
+ return {
151
+ ok: false,
152
+ status: err.status,
153
+ error: err.code,
154
+ description: err.message,
155
+ challenge: err.code === "invalid_token" ? verifier.challenge(err.code, err.message) : "",
156
+ };
157
+ }
158
+ throw err;
159
+ }
160
+ }
161
+ if (bearer && !bearerMatches(req.headers.authorization, bearer)) {
162
+ return { ok: false, status: 401, error: "invalid_token", description: "Bearer token required", challenge: "Bearer" };
163
+ }
164
+ return { ok: true };
165
+ };
166
+ const httpServer = http.createServer(async (req, res) => {
167
+ const url = new URL(req.url ?? "/", "http://localhost");
168
+ if (url.pathname === "/healthz") {
169
+ res.writeHead(200, { "content-type": "application/json" });
170
+ res.end(JSON.stringify({ ok: true, server: PACKAGE_NAME, version: PACKAGE_VERSION }));
171
+ return;
172
+ }
173
+ if (verifier && metadataPaths.has(url.pathname.replace(/\/+$/u, "") || "/")) {
174
+ if (req.method !== "GET" && req.method !== "HEAD") {
175
+ res.writeHead(405, { allow: "GET" });
176
+ res.end();
177
+ return;
178
+ }
179
+ res.writeHead(200, { "content-type": "application/json", "cache-control": "public, max-age=300" });
180
+ res.end(JSON.stringify(verifier.protectedResourceMetadata(facade?.issuer)));
181
+ return;
182
+ }
183
+ if (facade) {
184
+ const path = url.pathname.replace(/\/+$/u, "");
185
+ if (facadePaths.has(path)) {
186
+ await facade.handleMetadata(req, res);
187
+ return;
188
+ }
189
+ if (path === facadeTokenPath()) {
190
+ await facade.handleToken(req, res);
191
+ return;
192
+ }
193
+ }
194
+ if (url.pathname !== "/mcp") {
195
+ res.writeHead(404, { "content-type": "text/plain" });
196
+ res.end("Not found. The MCP endpoint is /mcp.");
197
+ return;
198
+ }
199
+ if (req.method !== "POST" && req.method !== "GET" && req.method !== "DELETE") {
200
+ res.writeHead(405, { allow: "GET, POST, DELETE" });
201
+ res.end();
202
+ return;
203
+ }
204
+ let auth;
205
+ try {
206
+ auth = await authorize(req);
207
+ }
208
+ catch (err) {
209
+ log(`[hardcharger-mcp] auth error: ${redact(err instanceof Error ? err.message : String(err))}`);
210
+ res.writeHead(500, { "content-type": "application/json" });
211
+ res.end(JSON.stringify({ error: "internal error" }));
212
+ return;
213
+ }
214
+ if (!auth.ok) {
215
+ const headers = { "content-type": "application/json" };
216
+ if (auth.challenge)
217
+ headers["www-authenticate"] = auth.challenge;
218
+ res.writeHead(auth.status, headers);
219
+ res.end(JSON.stringify({ error: auth.error, error_description: auth.description }));
220
+ // 401s are logged too: an expired token with no refresh token behind it
221
+ // looks, from the client, like the connector silently dying.
222
+ log(`[hardcharger-mcp] ${auth.status === 403 ? "forbidden" : "unauthorized"}: ${auth.description}`);
223
+ return;
224
+ }
225
+ let parsedBody;
226
+ if (req.method === "POST") {
227
+ try {
228
+ const raw = await readBody(req);
229
+ parsedBody = raw === "" ? undefined : JSON.parse(raw);
230
+ }
231
+ catch (err) {
232
+ res.writeHead(400, { "content-type": "application/json" });
233
+ res.end(JSON.stringify({ error: "invalid_request", error_description: err instanceof Error ? err.message : String(err) }));
234
+ return;
235
+ }
236
+ const who = auth.user ? auth.user.name : "anonymous";
237
+ for (const line of describeRequest(parsedBody))
238
+ log(`[hardcharger-mcp] ${who}: ${line}`);
239
+ }
240
+ let registry;
241
+ let session;
242
+ if (sessions && verifier && auth.user) {
243
+ const acquired = sessions.acquire(sessionKey(verifier.config.issuer, auth.user), auth.user.name);
244
+ registry = acquired.registry;
245
+ session = acquired.info;
246
+ }
247
+ else {
248
+ registry = sharedRegistry;
249
+ }
250
+ const server = createServer({
251
+ registry,
252
+ config,
253
+ transport: "http",
254
+ user: auth.user,
255
+ session,
256
+ acknowledgeSessionReset: session ? () => sessions?.acknowledgeReset(session.key) : undefined,
257
+ });
258
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
259
+ res.on("close", () => {
260
+ void transport.close();
261
+ void server.close();
262
+ });
263
+ try {
264
+ await server.connect(transport);
265
+ await transport.handleRequest(req, res, parsedBody);
266
+ }
267
+ catch (err) {
268
+ log(`[hardcharger-mcp] request error: ${redact(err instanceof Error ? err.message : String(err))}`);
269
+ if (!res.headersSent) {
270
+ res.writeHead(500, { "content-type": "application/json" });
271
+ res.end(JSON.stringify({ error: "internal error" }));
272
+ }
273
+ }
274
+ });
275
+ const closeAll = async () => {
276
+ await sessions?.close();
277
+ await sharedRegistry?.close();
278
+ };
279
+ if (options.installSignalHandlers !== false) {
280
+ installShutdown(closeAll, () => new Promise((resolve) => httpServer.close(() => resolve())));
281
+ }
282
+ httpServer.once("close", () => void closeAll());
283
+ await new Promise((resolve, reject) => {
284
+ httpServer.once("error", reject);
285
+ httpServer.listen(options.port, options.host, () => resolve());
286
+ });
287
+ const addr = httpServer.address();
288
+ const shown = typeof addr === "object" && addr ? `${addr.address}:${addr.port}` : `${options.host}:${options.port}`;
289
+ const authMode = verifier
290
+ ? `oauth ${verifier.config.issuer}${facade ? ` via token proxy ${facade.issuer}` : ""}, per-user sessions (idle ${config.mcpSessionIdleSeconds}s, max ${config.mcpMaxSessions})`
291
+ : bearer
292
+ ? "bearer"
293
+ : "none";
294
+ log(`[hardcharger-mcp] ${PACKAGE_NAME} ${PACKAGE_VERSION} listening on http://${shown}/mcp ` +
295
+ `(${describeTargets(config)}, writes ${config.allowWrites ? "enabled" : "disabled"}, ` +
296
+ `auth ${authMode})`);
297
+ if (verifier && !facade && /(^|\.)login\.microsoftonline\.com$/u.test(new URL(verifier.config.issuer).hostname)) {
298
+ log("[hardcharger-mcp] warning: Microsoft Entra ID rejects Claude's refresh_token requests unless the API scope is " +
299
+ "re-sent (AADSTS90009); set HARDCHARGER_MCP_OAUTH_TOKEN_PROXY=true or users must reconnect every hour");
300
+ }
301
+ if (verifier && !verifier.config.scopes.includes(OFFLINE_ACCESS_SCOPE)) {
302
+ log(`[hardcharger-mcp] warning: HARDCHARGER_MCP_OAUTH_SCOPES does not include ${OFFLINE_ACCESS_SCOPE}; ` +
303
+ "providers such as Microsoft Entra ID then issue no refresh token, and clients lose access " +
304
+ "when the access token expires (about an hour) until the user reconnects the connector");
305
+ }
306
+ return httpServer;
307
+ }
308
+ //# 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 CHANGED
@@ -1,18 +1,74 @@
1
1
  {
2
2
  "name": "@gizmodata/hardcharger-mcp",
3
- "version": "0.0.0",
4
- "description": "Placeholder: Hardcharger MCP server: lets AI agents query a Hardcharger database. Coming soon.",
3
+ "version": "2.0.0",
4
+ "description": "Model Context Protocol (MCP) server and Claude Desktop extension for Hardcharger\u2122, GizmoData\u2122's DuckDB 2.0 server",
5
+ "author": "GizmoData LLC",
5
6
  "license": "Apache-2.0",
6
- "author": "GizmoData LLC <info@gizmodata.com>",
7
- "homepage": "https://gizmodata.com",
7
+ "type": "module",
8
+ "main": "./dist/server.js",
9
+ "types": "./dist/server.d.ts",
10
+ "bin": {
11
+ "hardcharger-mcp": "dist/cli.js"
12
+ },
13
+ "files": [
14
+ "dist/",
15
+ "README.md",
16
+ "LICENSE",
17
+ "CHANGELOG.md",
18
+ "NOTICE"
19
+ ],
20
+ "engines": {
21
+ "node": ">=22.19.0"
22
+ },
8
23
  "repository": {
9
24
  "type": "git",
10
- "url": "https://github.com/gizmodata/hardcharger-mcp.git"
25
+ "url": "git+https://github.com/gizmodata/hardcharger-mcp.git"
26
+ },
27
+ "homepage": "https://github.com/gizmodata/hardcharger-mcp#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/gizmodata/hardcharger-mcp/issues"
11
30
  },
31
+ "keywords": [
32
+ "hardcharger",
33
+ "gizmodata",
34
+ "warp-sql",
35
+ "mcp",
36
+ "model-context-protocol",
37
+ "claude",
38
+ "arrow",
39
+ "duckdb",
40
+ "sql"
41
+ ],
12
42
  "publishConfig": {
13
43
  "access": "public"
14
44
  },
15
- "files": [
16
- "README.md"
17
- ]
18
- }
45
+ "scripts": {
46
+ "clients": "scripts/install-clients.sh",
47
+ "clean": "rm -rf dist",
48
+ "build": "npm run clean && tsc -p tsconfig.json",
49
+ "typecheck": "npm run build && tsc -p tsconfig.test.json --noEmit",
50
+ "lint": "eslint src test scripts --fix",
51
+ "lint:ci": "eslint src test scripts && node scripts/check-lock.mjs",
52
+ "test": "npm run build && node --test \"test/unit/**/*.test.ts\"",
53
+ "test:live": "npm run build && node scripts/run-live.mjs",
54
+ "test:examples": "npm run build && node scripts/run-examples.mjs",
55
+ "build:mcpb": "bash scripts/build-mcpb.sh",
56
+ "prepublishOnly": "node scripts/guard-publish.mjs"
57
+ },
58
+ "dependencies": {
59
+ "@gizmodata/hardcharger": "^2.0.0",
60
+ "@modelcontextprotocol/sdk": "^1.32.1",
61
+ "apache-arrow": "^21.2.0",
62
+ "jose": "^6.2.12",
63
+ "zod": "^4.6.7"
64
+ },
65
+ "devDependencies": {
66
+ "@anthropic-ai/mcpb": "^2.1.2",
67
+ "@eslint/js": "^10.0.1",
68
+ "@types/node": "^26.6.5",
69
+ "ajv": "^8.20.0",
70
+ "eslint": "^10.13.0",
71
+ "typescript": "~6.0.3",
72
+ "typescript-eslint": "^8.71.2"
73
+ }
74
+ }