snowflake-analytics-mcp-server 0.2.0 → 0.2.1
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/index.js +1 -1
- package/dist/snowflake.d.ts.map +1 -1
- package/dist/snowflake.js +29 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { registerTools } from "./tools/index.js";
|
|
|
12
12
|
async function main() {
|
|
13
13
|
const server = new McpServer({
|
|
14
14
|
name: "snowflake-analytics-mcp-server",
|
|
15
|
-
version: "0.2.
|
|
15
|
+
version: "0.2.1",
|
|
16
16
|
title: "Snowflake Analytics MCP Server",
|
|
17
17
|
});
|
|
18
18
|
registerTools(server);
|
package/dist/snowflake.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snowflake.d.ts","sourceRoot":"","sources":["../src/snowflake.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"snowflake.d.ts","sourceRoot":"","sources":["../src/snowflake.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAkCD,wBAAgB,UAAU,IAAI,eAAe,CAgD5C;AAKD,wBAAgB,SAAS,IAAI,eAAe,CAG3C;AAiCD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,OAAO,EAAO,GACpB,OAAO,CAAC,WAAW,CAAC,CAoBtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CASR;AAMD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAchE;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAWrF;AAKD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
package/dist/snowflake.js
CHANGED
|
@@ -28,20 +28,45 @@ function req(name) {
|
|
|
28
28
|
}
|
|
29
29
|
return v.trim();
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Normalize a private key into valid PEM regardless of how it survived transport.
|
|
33
|
+
* Handles: proper multi-line PEM, PEM with literal `\n`, PEM flattened onto one
|
|
34
|
+
* line (newlines stripped by a single-line form field), and a bare base64 body
|
|
35
|
+
* with no header/footer at all. Preserves the header type (e.g. ENCRYPTED).
|
|
36
|
+
*/
|
|
37
|
+
function normalizePrivateKey(raw) {
|
|
38
|
+
let k = raw.trim().replace(/\\n/g, "\n");
|
|
39
|
+
const bodyMatch = k.match(/-----BEGIN ([A-Z0-9 ]*PRIVATE KEY)-----([\s\S]*?)-----END [A-Z0-9 ]*PRIVATE KEY-----/);
|
|
40
|
+
let header = "PRIVATE KEY";
|
|
41
|
+
let body;
|
|
42
|
+
if (bodyMatch) {
|
|
43
|
+
header = bodyMatch[1].trim();
|
|
44
|
+
body = bodyMatch[2].replace(/\s+/g, "");
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// No header present — treat the whole value as the base64 body.
|
|
48
|
+
body = k.replace(/\s+/g, "");
|
|
49
|
+
}
|
|
50
|
+
const wrapped = body.match(/.{1,64}/g)?.join("\n") ?? body;
|
|
51
|
+
return `-----BEGIN ${header}-----\n${wrapped}\n-----END ${header}-----\n`;
|
|
52
|
+
}
|
|
31
53
|
export function loadConfig() {
|
|
32
|
-
const
|
|
54
|
+
const hasKey = !!(process.env.SNOWFLAKE_PRIVATE_KEY || process.env.SNOWFLAKE_PRIVATE_KEY_PATH);
|
|
55
|
+
// Auto-select key-pair auth when a private key is provided, so callers don't
|
|
56
|
+
// have to set SNOWFLAKE_AUTHENTICATOR explicitly. An explicit value still wins.
|
|
57
|
+
const authenticator = (process.env.SNOWFLAKE_AUTHENTICATOR || (hasKey ? "SNOWFLAKE_JWT" : "SNOWFLAKE"))
|
|
33
58
|
.trim()
|
|
34
59
|
.toUpperCase();
|
|
35
60
|
let privateKey;
|
|
36
61
|
if (authenticator === "SNOWFLAKE_JWT") {
|
|
37
62
|
if (process.env.SNOWFLAKE_PRIVATE_KEY) {
|
|
38
|
-
privateKey = process.env.SNOWFLAKE_PRIVATE_KEY;
|
|
63
|
+
privateKey = normalizePrivateKey(process.env.SNOWFLAKE_PRIVATE_KEY);
|
|
39
64
|
}
|
|
40
65
|
else if (process.env.SNOWFLAKE_PRIVATE_KEY_PATH) {
|
|
41
|
-
privateKey = readFileSync(process.env.SNOWFLAKE_PRIVATE_KEY_PATH.trim(), "utf8");
|
|
66
|
+
privateKey = normalizePrivateKey(readFileSync(process.env.SNOWFLAKE_PRIVATE_KEY_PATH.trim(), "utf8"));
|
|
42
67
|
}
|
|
43
68
|
else {
|
|
44
|
-
throw new Error("
|
|
69
|
+
throw new Error("Key-pair auth requires SNOWFLAKE_PRIVATE_KEY or SNOWFLAKE_PRIVATE_KEY_PATH");
|
|
45
70
|
}
|
|
46
71
|
}
|
|
47
72
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snowflake-analytics-mcp-server",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Snowflake MCP server for the Analytics Model platform. Table discovery, SQL query, and Cortex AI tools over stdio, runnable via npx.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|