@conte777/db-view-mcp 1.0.0 → 1.2.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/config.example.json +15 -3
- package/dist/config/loader.d.ts +1 -0
- package/dist/config/loader.js +25 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +53 -15
- package/dist/config/types.js +31 -14
- package/dist/config/types.js.map +1 -1
- package/dist/connectors/clickhouse.d.ts +2 -2
- package/dist/connectors/clickhouse.js +14 -3
- package/dist/connectors/clickhouse.js.map +1 -1
- package/dist/connectors/instrumented.d.ts +18 -0
- package/dist/connectors/instrumented.js +52 -0
- package/dist/connectors/instrumented.js.map +1 -0
- package/dist/connectors/interface.d.ts +2 -2
- package/dist/connectors/manager.d.ts +11 -0
- package/dist/connectors/manager.js +81 -5
- package/dist/connectors/manager.js.map +1 -1
- package/dist/connectors/postgresql.d.ts +2 -2
- package/dist/connectors/postgresql.js +57 -19
- package/dist/connectors/postgresql.js.map +1 -1
- package/dist/index.js +75 -16
- package/dist/index.js.map +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/readonly/explain.d.ts +2 -0
- package/dist/tools/readonly/explain.js +2 -1
- package/dist/tools/readonly/explain.js.map +1 -1
- package/dist/tools/readonly/performance.d.ts +1 -2
- package/dist/tools/readonly/performance.js +7 -9
- package/dist/tools/readonly/performance.js.map +1 -1
- package/dist/tools/readonly/schema.d.ts +2 -0
- package/dist/tools/readonly/schema.js +2 -1
- package/dist/tools/readonly/schema.js.map +1 -1
- package/dist/tools/registry.d.ts +1 -1
- package/dist/tools/registry.js +2 -2
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/write/transaction.d.ts +18 -0
- package/dist/tools/write/transaction.js +70 -13
- package/dist/tools/write/transaction.js.map +1 -1
- package/dist/transport/http.d.ts +2 -0
- package/dist/transport/http.js +28 -14
- package/dist/transport/http.js.map +1 -1
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sql-validator.js +39 -10
- package/dist/utils/sql-validator.js.map +1 -1
- package/package.json +15 -3
package/config.example.json
CHANGED
|
@@ -24,18 +24,30 @@
|
|
|
24
24
|
"database": "myapp",
|
|
25
25
|
"user": "admin",
|
|
26
26
|
"password": "secret123",
|
|
27
|
-
"
|
|
27
|
+
"ssl": true,
|
|
28
|
+
"sslCa": "/path/to/ca-certificate.pem",
|
|
29
|
+
"description": "Main PostgreSQL (host-based)",
|
|
28
30
|
"lazyConnection": true,
|
|
29
31
|
"maxRows": 200
|
|
30
32
|
},
|
|
33
|
+
{
|
|
34
|
+
"id": "main_pg_connstr",
|
|
35
|
+
"type": "postgresql",
|
|
36
|
+
"connectionString": "postgresql://admin:secret123@localhost:5432/myapp?sslmode=require",
|
|
37
|
+
"description": "Main PostgreSQL (connection string)"
|
|
38
|
+
},
|
|
31
39
|
{
|
|
32
40
|
"id": "analytics",
|
|
33
41
|
"type": "clickhouse",
|
|
34
|
-
"url": "
|
|
42
|
+
"url": "https://localhost:8443",
|
|
35
43
|
"database": "analytics",
|
|
36
44
|
"user": "default",
|
|
37
45
|
"password": "",
|
|
38
|
-
"
|
|
46
|
+
"tls": {
|
|
47
|
+
"ca": "/path/to/ca-certificate.pem",
|
|
48
|
+
"rejectUnauthorized": true
|
|
49
|
+
},
|
|
50
|
+
"description": "ClickHouse analytics with TLS"
|
|
39
51
|
}
|
|
40
52
|
]
|
|
41
53
|
}
|
package/dist/config/loader.d.ts
CHANGED
package/dist/config/loader.js
CHANGED
|
@@ -1,11 +1,35 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { AppConfigSchema } from "./types.js";
|
|
4
|
+
const ENV_VAR_PATTERN = /\$\{([^}]+)\}/g;
|
|
5
|
+
export function resolveEnvVariables(obj) {
|
|
6
|
+
if (typeof obj === "string") {
|
|
7
|
+
return obj.replace(ENV_VAR_PATTERN, (match, varName) => {
|
|
8
|
+
const value = process.env[varName];
|
|
9
|
+
if (value === undefined) {
|
|
10
|
+
throw new Error(`Environment variable "${varName}" is not defined (referenced as "${match}")`);
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(obj)) {
|
|
16
|
+
return obj.map((item) => resolveEnvVariables(item));
|
|
17
|
+
}
|
|
18
|
+
if (obj !== null && typeof obj === "object") {
|
|
19
|
+
const result = {};
|
|
20
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
21
|
+
result[key] = resolveEnvVariables(value);
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
4
27
|
export function loadConfig(configPath) {
|
|
5
28
|
const absolutePath = resolve(configPath);
|
|
6
29
|
const raw = readFileSync(absolutePath, "utf-8");
|
|
7
30
|
const json = JSON.parse(raw);
|
|
8
|
-
|
|
31
|
+
const resolved = resolveEnvVariables(json);
|
|
32
|
+
return AppConfigSchema.parse(resolved);
|
|
9
33
|
}
|
|
10
34
|
export function parseCliArgs(args) {
|
|
11
35
|
const configIndex = args.indexOf("--config");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAE7D,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,eAAe,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAE7D,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,oCAAoC,KAAK,IAAI,CAAC,CAAC;YACjG,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAyD;QACnE,UAAU,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;KAClC,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,CAAC,CAAC,IAAI,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,+BAA+B,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
declare const
|
|
2
|
+
declare const PostgresConfigBaseSchema: z.ZodObject<{
|
|
3
3
|
id: z.ZodString;
|
|
4
4
|
type: z.ZodLiteral<"postgresql">;
|
|
5
|
-
|
|
5
|
+
connectionString: z.ZodOptional<z.ZodString>;
|
|
6
|
+
host: z.ZodOptional<z.ZodString>;
|
|
6
7
|
port: z.ZodDefault<z.ZodNumber>;
|
|
7
|
-
database: z.ZodString
|
|
8
|
-
user: z.ZodString
|
|
8
|
+
database: z.ZodOptional<z.ZodString>;
|
|
9
|
+
user: z.ZodOptional<z.ZodString>;
|
|
9
10
|
password: z.ZodDefault<z.ZodString>;
|
|
10
11
|
ssl: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
sslRejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
sslCa: z.ZodOptional<z.ZodString>;
|
|
11
14
|
description: z.ZodOptional<z.ZodString>;
|
|
12
15
|
lazyConnection: z.ZodOptional<z.ZodBoolean>;
|
|
13
16
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
@@ -20,20 +23,27 @@ declare const ClickHouseConfigSchema: z.ZodObject<{
|
|
|
20
23
|
database: z.ZodString;
|
|
21
24
|
user: z.ZodDefault<z.ZodString>;
|
|
22
25
|
password: z.ZodDefault<z.ZodString>;
|
|
26
|
+
tls: z.ZodOptional<z.ZodObject<{
|
|
27
|
+
ca: z.ZodOptional<z.ZodString>;
|
|
28
|
+
rejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
|
|
29
|
+
}, z.core.$strip>>;
|
|
23
30
|
description: z.ZodOptional<z.ZodString>;
|
|
24
31
|
lazyConnection: z.ZodOptional<z.ZodBoolean>;
|
|
25
32
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
26
33
|
queryTimeout: z.ZodOptional<z.ZodNumber>;
|
|
27
34
|
}, z.core.$strip>;
|
|
28
|
-
declare const DatabaseConfigSchema: z.
|
|
35
|
+
declare const DatabaseConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
29
36
|
id: z.ZodString;
|
|
30
37
|
type: z.ZodLiteral<"postgresql">;
|
|
31
|
-
|
|
38
|
+
connectionString: z.ZodOptional<z.ZodString>;
|
|
39
|
+
host: z.ZodOptional<z.ZodString>;
|
|
32
40
|
port: z.ZodDefault<z.ZodNumber>;
|
|
33
|
-
database: z.ZodString
|
|
34
|
-
user: z.ZodString
|
|
41
|
+
database: z.ZodOptional<z.ZodString>;
|
|
42
|
+
user: z.ZodOptional<z.ZodString>;
|
|
35
43
|
password: z.ZodDefault<z.ZodString>;
|
|
36
44
|
ssl: z.ZodOptional<z.ZodBoolean>;
|
|
45
|
+
sslRejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
|
|
46
|
+
sslCa: z.ZodOptional<z.ZodString>;
|
|
37
47
|
description: z.ZodOptional<z.ZodString>;
|
|
38
48
|
lazyConnection: z.ZodOptional<z.ZodBoolean>;
|
|
39
49
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
@@ -45,22 +55,33 @@ declare const DatabaseConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
45
55
|
database: z.ZodString;
|
|
46
56
|
user: z.ZodDefault<z.ZodString>;
|
|
47
57
|
password: z.ZodDefault<z.ZodString>;
|
|
58
|
+
tls: z.ZodOptional<z.ZodObject<{
|
|
59
|
+
ca: z.ZodOptional<z.ZodString>;
|
|
60
|
+
rejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
|
|
61
|
+
}, z.core.$strip>>;
|
|
48
62
|
description: z.ZodOptional<z.ZodString>;
|
|
49
63
|
lazyConnection: z.ZodOptional<z.ZodBoolean>;
|
|
50
64
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
51
65
|
queryTimeout: z.ZodOptional<z.ZodNumber>;
|
|
52
|
-
}, z.core.$strip>]
|
|
66
|
+
}, z.core.$strip>]>;
|
|
53
67
|
declare const DefaultsSchema: z.ZodObject<{
|
|
54
68
|
maxRows: z.ZodDefault<z.ZodNumber>;
|
|
55
69
|
lazyConnection: z.ZodDefault<z.ZodBoolean>;
|
|
56
70
|
toolsPerDatabase: z.ZodDefault<z.ZodBoolean>;
|
|
57
71
|
queryTimeout: z.ZodDefault<z.ZodNumber>;
|
|
72
|
+
logLevel: z.ZodDefault<z.ZodEnum<{
|
|
73
|
+
debug: "debug";
|
|
74
|
+
info: "info";
|
|
75
|
+
warn: "warn";
|
|
76
|
+
error: "error";
|
|
77
|
+
}>>;
|
|
58
78
|
}, z.core.$strip>;
|
|
59
79
|
declare const HttpTransportConfigSchema: z.ZodObject<{
|
|
60
80
|
type: z.ZodLiteral<"http">;
|
|
61
81
|
port: z.ZodDefault<z.ZodNumber>;
|
|
62
82
|
host: z.ZodDefault<z.ZodString>;
|
|
63
83
|
stateless: z.ZodDefault<z.ZodBoolean>;
|
|
84
|
+
sessionTimeout: z.ZodDefault<z.ZodNumber>;
|
|
64
85
|
auth: z.ZodOptional<z.ZodObject<{
|
|
65
86
|
type: z.ZodLiteral<"bearer">;
|
|
66
87
|
token: z.ZodString;
|
|
@@ -73,6 +94,7 @@ declare const TransportConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
73
94
|
port: z.ZodDefault<z.ZodNumber>;
|
|
74
95
|
host: z.ZodDefault<z.ZodString>;
|
|
75
96
|
stateless: z.ZodDefault<z.ZodBoolean>;
|
|
97
|
+
sessionTimeout: z.ZodDefault<z.ZodNumber>;
|
|
76
98
|
auth: z.ZodOptional<z.ZodObject<{
|
|
77
99
|
type: z.ZodLiteral<"bearer">;
|
|
78
100
|
token: z.ZodString;
|
|
@@ -86,6 +108,7 @@ export declare const AppConfigSchema: z.ZodObject<{
|
|
|
86
108
|
port: z.ZodDefault<z.ZodNumber>;
|
|
87
109
|
host: z.ZodDefault<z.ZodString>;
|
|
88
110
|
stateless: z.ZodDefault<z.ZodBoolean>;
|
|
111
|
+
sessionTimeout: z.ZodDefault<z.ZodNumber>;
|
|
89
112
|
auth: z.ZodOptional<z.ZodObject<{
|
|
90
113
|
type: z.ZodLiteral<"bearer">;
|
|
91
114
|
token: z.ZodString;
|
|
@@ -96,26 +119,37 @@ export declare const AppConfigSchema: z.ZodObject<{
|
|
|
96
119
|
lazyConnection: z.ZodDefault<z.ZodBoolean>;
|
|
97
120
|
toolsPerDatabase: z.ZodDefault<z.ZodBoolean>;
|
|
98
121
|
queryTimeout: z.ZodDefault<z.ZodNumber>;
|
|
122
|
+
logLevel: z.ZodDefault<z.ZodEnum<{
|
|
123
|
+
debug: "debug";
|
|
124
|
+
info: "info";
|
|
125
|
+
warn: "warn";
|
|
126
|
+
error: "error";
|
|
127
|
+
}>>;
|
|
99
128
|
}, z.core.$strip>>, z.ZodTransform<{
|
|
100
129
|
maxRows: number;
|
|
101
130
|
lazyConnection: boolean;
|
|
102
131
|
toolsPerDatabase: boolean;
|
|
103
132
|
queryTimeout: number;
|
|
133
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
104
134
|
}, {
|
|
105
135
|
maxRows: number;
|
|
106
136
|
lazyConnection: boolean;
|
|
107
137
|
toolsPerDatabase: boolean;
|
|
108
138
|
queryTimeout: number;
|
|
139
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
109
140
|
} | undefined>>;
|
|
110
|
-
databases: z.ZodArray<z.
|
|
141
|
+
databases: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
111
142
|
id: z.ZodString;
|
|
112
143
|
type: z.ZodLiteral<"postgresql">;
|
|
113
|
-
|
|
144
|
+
connectionString: z.ZodOptional<z.ZodString>;
|
|
145
|
+
host: z.ZodOptional<z.ZodString>;
|
|
114
146
|
port: z.ZodDefault<z.ZodNumber>;
|
|
115
|
-
database: z.ZodString
|
|
116
|
-
user: z.ZodString
|
|
147
|
+
database: z.ZodOptional<z.ZodString>;
|
|
148
|
+
user: z.ZodOptional<z.ZodString>;
|
|
117
149
|
password: z.ZodDefault<z.ZodString>;
|
|
118
150
|
ssl: z.ZodOptional<z.ZodBoolean>;
|
|
151
|
+
sslRejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
|
|
152
|
+
sslCa: z.ZodOptional<z.ZodString>;
|
|
119
153
|
description: z.ZodOptional<z.ZodString>;
|
|
120
154
|
lazyConnection: z.ZodOptional<z.ZodBoolean>;
|
|
121
155
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
@@ -127,13 +161,17 @@ export declare const AppConfigSchema: z.ZodObject<{
|
|
|
127
161
|
database: z.ZodString;
|
|
128
162
|
user: z.ZodDefault<z.ZodString>;
|
|
129
163
|
password: z.ZodDefault<z.ZodString>;
|
|
164
|
+
tls: z.ZodOptional<z.ZodObject<{
|
|
165
|
+
ca: z.ZodOptional<z.ZodString>;
|
|
166
|
+
rejectUnauthorized: z.ZodDefault<z.ZodBoolean>;
|
|
167
|
+
}, z.core.$strip>>;
|
|
130
168
|
description: z.ZodOptional<z.ZodString>;
|
|
131
169
|
lazyConnection: z.ZodOptional<z.ZodBoolean>;
|
|
132
170
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
133
171
|
queryTimeout: z.ZodOptional<z.ZodNumber>;
|
|
134
|
-
}, z.core.$strip>]
|
|
172
|
+
}, z.core.$strip>]>>;
|
|
135
173
|
}, z.core.$strip>;
|
|
136
|
-
export type PostgresConfig = z.infer<typeof
|
|
174
|
+
export type PostgresConfig = z.infer<typeof PostgresConfigBaseSchema>;
|
|
137
175
|
export type ClickHouseConfig = z.infer<typeof ClickHouseConfigSchema>;
|
|
138
176
|
export type DatabaseConfig = z.infer<typeof DatabaseConfigSchema>;
|
|
139
177
|
export type Defaults = z.infer<typeof DefaultsSchema>;
|
package/dist/config/types.js
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
const
|
|
2
|
+
const PostgresConfigBaseSchema = z.object({
|
|
3
3
|
id: z.string(),
|
|
4
4
|
type: z.literal("postgresql"),
|
|
5
|
-
|
|
5
|
+
connectionString: z.string().optional(),
|
|
6
|
+
host: z.string().optional(),
|
|
6
7
|
port: z.number().default(5432),
|
|
7
|
-
database: z.string(),
|
|
8
|
-
user: z.string(),
|
|
8
|
+
database: z.string().optional(),
|
|
9
|
+
user: z.string().optional(),
|
|
9
10
|
password: z.string().default(""),
|
|
10
11
|
ssl: z.boolean().optional(),
|
|
12
|
+
sslRejectUnauthorized: z.boolean().default(true),
|
|
13
|
+
sslCa: z.string().optional(),
|
|
11
14
|
description: z.string().optional(),
|
|
12
15
|
lazyConnection: z.boolean().optional(),
|
|
13
16
|
maxRows: z.number().optional(),
|
|
14
17
|
queryTimeout: z.number().optional(),
|
|
15
18
|
});
|
|
19
|
+
const PostgresConfigSchema = PostgresConfigBaseSchema.superRefine((data, ctx) => {
|
|
20
|
+
if (!data.connectionString && (!data.host || !data.database || !data.user)) {
|
|
21
|
+
ctx.addIssue({
|
|
22
|
+
code: "custom",
|
|
23
|
+
message: "Either 'connectionString' or 'host' + 'database' + 'user' must be provided",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
16
27
|
const ClickHouseConfigSchema = z.object({
|
|
17
28
|
id: z.string(),
|
|
18
29
|
type: z.literal("clickhouse"),
|
|
@@ -20,38 +31,43 @@ const ClickHouseConfigSchema = z.object({
|
|
|
20
31
|
database: z.string(),
|
|
21
32
|
user: z.string().default("default"),
|
|
22
33
|
password: z.string().default(""),
|
|
34
|
+
tls: z
|
|
35
|
+
.object({
|
|
36
|
+
ca: z.string().optional(),
|
|
37
|
+
rejectUnauthorized: z.boolean().default(true),
|
|
38
|
+
})
|
|
39
|
+
.optional(),
|
|
23
40
|
description: z.string().optional(),
|
|
24
41
|
lazyConnection: z.boolean().optional(),
|
|
25
42
|
maxRows: z.number().optional(),
|
|
26
43
|
queryTimeout: z.number().optional(),
|
|
27
44
|
});
|
|
28
|
-
const DatabaseConfigSchema = z.
|
|
29
|
-
|
|
30
|
-
ClickHouseConfigSchema,
|
|
31
|
-
]);
|
|
45
|
+
const DatabaseConfigSchema = z.union([PostgresConfigSchema, ClickHouseConfigSchema]);
|
|
46
|
+
const LogLevelSchema = z.enum(["debug", "info", "warn", "error"]);
|
|
32
47
|
const DefaultsSchema = z.object({
|
|
33
48
|
maxRows: z.number().default(100),
|
|
34
49
|
lazyConnection: z.boolean().default(true),
|
|
35
50
|
toolsPerDatabase: z.boolean().default(false),
|
|
36
51
|
queryTimeout: z.number().default(30000),
|
|
52
|
+
logLevel: LogLevelSchema.default("info"),
|
|
37
53
|
});
|
|
38
54
|
const HttpTransportConfigSchema = z.object({
|
|
39
55
|
type: z.literal("http"),
|
|
40
56
|
port: z.number().default(3000),
|
|
41
57
|
host: z.string().default("127.0.0.1"),
|
|
42
58
|
stateless: z.boolean().default(false),
|
|
43
|
-
|
|
59
|
+
sessionTimeout: z.number().default(30 * 60 * 1000), // 30 minutes
|
|
60
|
+
auth: z
|
|
61
|
+
.object({
|
|
44
62
|
type: z.literal("bearer"),
|
|
45
63
|
token: z.string(),
|
|
46
|
-
})
|
|
64
|
+
})
|
|
65
|
+
.optional(),
|
|
47
66
|
});
|
|
48
67
|
const StdioTransportConfigSchema = z.object({
|
|
49
68
|
type: z.literal("stdio"),
|
|
50
69
|
});
|
|
51
|
-
const TransportConfigSchema = z.discriminatedUnion("type", [
|
|
52
|
-
StdioTransportConfigSchema,
|
|
53
|
-
HttpTransportConfigSchema,
|
|
54
|
-
]);
|
|
70
|
+
const TransportConfigSchema = z.discriminatedUnion("type", [StdioTransportConfigSchema, HttpTransportConfigSchema]);
|
|
55
71
|
export const AppConfigSchema = z.object({
|
|
56
72
|
transport: TransportConfigSchema.optional().default({ type: "stdio" }),
|
|
57
73
|
defaults: DefaultsSchema.optional().transform((v) => v ?? {
|
|
@@ -59,6 +75,7 @@ export const AppConfigSchema = z.object({
|
|
|
59
75
|
lazyConnection: true,
|
|
60
76
|
toolsPerDatabase: false,
|
|
61
77
|
queryTimeout: 30000,
|
|
78
|
+
logLevel: "info",
|
|
62
79
|
}),
|
|
63
80
|
databases: z.array(DatabaseConfigSchema).min(1),
|
|
64
81
|
});
|
package/dist/config/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ export declare class ClickHouseConnector implements Connector {
|
|
|
14
14
|
execute(sql: string, _params?: string[]): Promise<QueryResult>;
|
|
15
15
|
listTables(_schema?: string): Promise<TableInfo[]>;
|
|
16
16
|
describeTable(table: string, _schema?: string): Promise<ColumnInfo[]>;
|
|
17
|
-
getSchema(): Promise<string>;
|
|
18
|
-
explain(sql: string): Promise<ExplainResult>;
|
|
17
|
+
getSchema(_schema?: string): Promise<string>;
|
|
18
|
+
explain(sql: string, analyze?: boolean): Promise<ExplainResult>;
|
|
19
19
|
beginTransaction(): Promise<TransactionHandle>;
|
|
20
20
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createClient } from "@clickhouse/client";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
2
3
|
export class ClickHouseConnector {
|
|
3
4
|
type = "clickhouse";
|
|
4
5
|
client = null;
|
|
@@ -11,12 +12,21 @@ export class ClickHouseConnector {
|
|
|
11
12
|
this.maxRows = maxRows;
|
|
12
13
|
}
|
|
13
14
|
async connect() {
|
|
15
|
+
const tlsConfig = this.config.tls?.ca
|
|
16
|
+
? {
|
|
17
|
+
ca_cert: this.config.tls.ca.startsWith("-----BEGIN")
|
|
18
|
+
? Buffer.from(this.config.tls.ca)
|
|
19
|
+
: readFileSync(this.config.tls.ca),
|
|
20
|
+
reject_unauthorized: this.config.tls.rejectUnauthorized,
|
|
21
|
+
}
|
|
22
|
+
: undefined;
|
|
14
23
|
this.client = createClient({
|
|
15
24
|
url: this.config.url,
|
|
16
25
|
database: this.config.database,
|
|
17
26
|
username: this.config.user,
|
|
18
27
|
password: this.config.password,
|
|
19
28
|
request_timeout: this.queryTimeout,
|
|
29
|
+
...(tlsConfig && { tls: tlsConfig }),
|
|
20
30
|
});
|
|
21
31
|
await this.client.ping();
|
|
22
32
|
}
|
|
@@ -72,7 +82,7 @@ export class ClickHouseConnector {
|
|
|
72
82
|
isPrimaryKey: r.is_in_primary_key === 1,
|
|
73
83
|
}));
|
|
74
84
|
}
|
|
75
|
-
async getSchema() {
|
|
85
|
+
async getSchema(_schema) {
|
|
76
86
|
const result = await this.getClient().query({
|
|
77
87
|
query: `SELECT name, create_table_query FROM system.tables WHERE database = currentDatabase()`,
|
|
78
88
|
format: "JSONEachRow",
|
|
@@ -80,9 +90,10 @@ export class ClickHouseConnector {
|
|
|
80
90
|
const rows = (await result.json());
|
|
81
91
|
return rows.map((r) => r.create_table_query).join(";\n\n");
|
|
82
92
|
}
|
|
83
|
-
async explain(sql) {
|
|
93
|
+
async explain(sql, analyze = false) {
|
|
94
|
+
const prefix = analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
84
95
|
const result = await this.getClient().query({
|
|
85
|
-
query:
|
|
96
|
+
query: `${prefix} ${sql}`,
|
|
86
97
|
format: "JSONEachRow",
|
|
87
98
|
});
|
|
88
99
|
const rows = (await result.json());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/connectors/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/connectors/clickhouse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Connector, QueryResult, TableInfo, ColumnInfo, ExplainResult, TransactionHandle } from "./interface.js";
|
|
2
|
+
import type { PerformanceTracker } from "../tools/readonly/performance.js";
|
|
3
|
+
export declare class InstrumentedConnector implements Connector {
|
|
4
|
+
private inner;
|
|
5
|
+
private tracker;
|
|
6
|
+
private dbId;
|
|
7
|
+
readonly type: "postgresql" | "clickhouse";
|
|
8
|
+
constructor(inner: Connector, tracker: PerformanceTracker, dbId: string);
|
|
9
|
+
connect(): Promise<void>;
|
|
10
|
+
disconnect(): Promise<void>;
|
|
11
|
+
query(sql: string, params?: string[], maxRows?: number): Promise<QueryResult>;
|
|
12
|
+
execute(sql: string, params?: string[]): Promise<QueryResult>;
|
|
13
|
+
listTables(schema?: string): Promise<TableInfo[]>;
|
|
14
|
+
describeTable(table: string, schema?: string): Promise<ColumnInfo[]>;
|
|
15
|
+
getSchema(schema?: string): Promise<string>;
|
|
16
|
+
explain(sql: string, analyze?: boolean): Promise<ExplainResult>;
|
|
17
|
+
beginTransaction(): Promise<TransactionHandle>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class InstrumentedConnector {
|
|
2
|
+
inner;
|
|
3
|
+
tracker;
|
|
4
|
+
dbId;
|
|
5
|
+
type;
|
|
6
|
+
constructor(inner, tracker, dbId) {
|
|
7
|
+
this.inner = inner;
|
|
8
|
+
this.tracker = tracker;
|
|
9
|
+
this.dbId = dbId;
|
|
10
|
+
this.type = inner.type;
|
|
11
|
+
}
|
|
12
|
+
connect() {
|
|
13
|
+
return this.inner.connect();
|
|
14
|
+
}
|
|
15
|
+
disconnect() {
|
|
16
|
+
return this.inner.disconnect();
|
|
17
|
+
}
|
|
18
|
+
async query(sql, params, maxRows) {
|
|
19
|
+
const start = performance.now();
|
|
20
|
+
try {
|
|
21
|
+
return await this.inner.query(sql, params, maxRows);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
this.tracker.recordQuery(sql, performance.now() - start, this.dbId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async execute(sql, params) {
|
|
28
|
+
const start = performance.now();
|
|
29
|
+
try {
|
|
30
|
+
return await this.inner.execute(sql, params);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
this.tracker.recordQuery(sql, performance.now() - start, this.dbId);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
listTables(schema) {
|
|
37
|
+
return this.inner.listTables(schema);
|
|
38
|
+
}
|
|
39
|
+
describeTable(table, schema) {
|
|
40
|
+
return this.inner.describeTable(table, schema);
|
|
41
|
+
}
|
|
42
|
+
getSchema(schema) {
|
|
43
|
+
return this.inner.getSchema(schema);
|
|
44
|
+
}
|
|
45
|
+
explain(sql, analyze) {
|
|
46
|
+
return this.inner.explain(sql, analyze);
|
|
47
|
+
}
|
|
48
|
+
beginTransaction() {
|
|
49
|
+
return this.inner.beginTransaction();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=instrumented.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumented.js","sourceRoot":"","sources":["../../src/connectors/instrumented.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,qBAAqB;IAItB;IACA;IACA;IALD,IAAI,CAA8B;IAE3C,YACU,KAAgB,EAChB,OAA2B,EAC3B,IAAY;QAFZ,UAAK,GAAL,KAAK,CAAW;QAChB,YAAO,GAAP,OAAO,CAAoB;QAC3B,SAAI,GAAJ,IAAI,CAAQ;QAEpB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAiB,EAAE,OAAgB;QAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAiB;QAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAe;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,MAAe;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,MAAe;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,OAAiB;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -31,7 +31,7 @@ export interface Connector {
|
|
|
31
31
|
execute(sql: string, params?: string[]): Promise<QueryResult>;
|
|
32
32
|
listTables(schema?: string): Promise<TableInfo[]>;
|
|
33
33
|
describeTable(table: string, schema?: string): Promise<ColumnInfo[]>;
|
|
34
|
-
getSchema(): Promise<string>;
|
|
35
|
-
explain(sql: string): Promise<ExplainResult>;
|
|
34
|
+
getSchema(schema?: string): Promise<string>;
|
|
35
|
+
explain(sql: string, analyze?: boolean): Promise<ExplainResult>;
|
|
36
36
|
beginTransaction(): Promise<TransactionHandle>;
|
|
37
37
|
}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import type { Connector } from "./interface.js";
|
|
2
2
|
import type { ResolvedDatabaseConfig } from "../config/types.js";
|
|
3
|
+
import { PerformanceTracker } from "../tools/readonly/performance.js";
|
|
3
4
|
export declare class ConnectorManager {
|
|
4
5
|
private configs;
|
|
5
6
|
private connectors;
|
|
7
|
+
private rawConnectors;
|
|
8
|
+
private tracker;
|
|
6
9
|
constructor(databases: ResolvedDatabaseConfig[]);
|
|
7
10
|
getDatabaseIds(): string[];
|
|
8
11
|
getConfig(dbId: string): ResolvedDatabaseConfig | undefined;
|
|
9
12
|
getAllConfigs(): ResolvedDatabaseConfig[];
|
|
13
|
+
getPerformanceTracker(): PerformanceTracker;
|
|
10
14
|
getConnector(dbId: string): Promise<Connector>;
|
|
15
|
+
withConnector<T>(dbId: string, fn: (connector: Connector) => Promise<T>): Promise<T>;
|
|
16
|
+
invalidateConnector(dbId: string): void;
|
|
11
17
|
private createConnector;
|
|
18
|
+
updateDatabases(newConfigs: ResolvedDatabaseConfig[]): {
|
|
19
|
+
added: string[];
|
|
20
|
+
removed: string[];
|
|
21
|
+
changed: string[];
|
|
22
|
+
};
|
|
12
23
|
connectEager(): Promise<void>;
|
|
13
24
|
disconnectAll(): Promise<void>;
|
|
14
25
|
}
|