@conte777/db-view-mcp 1.2.1 → 1.3.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/README.md +34 -250
- package/config.example.json +3 -1
- package/dist/config/types.d.ts +14 -4
- package/dist/config/types.js +5 -10
- package/dist/config/types.js.map +1 -1
- package/dist/connectors/clickhouse.d.ts +1 -1
- package/dist/connectors/clickhouse.js +11 -3
- package/dist/connectors/clickhouse.js.map +1 -1
- package/dist/connectors/manager.d.ts +7 -2
- package/dist/connectors/manager.js +38 -35
- package/dist/connectors/manager.js.map +1 -1
- package/dist/connectors/postgresql.d.ts +1 -1
- package/dist/connectors/postgresql.js +61 -11
- package/dist/connectors/postgresql.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.js +6 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/readonly/describe-table.d.ts +1 -3
- package/dist/tools/readonly/describe-table.js +5 -5
- package/dist/tools/readonly/describe-table.js.map +1 -1
- package/dist/tools/readonly/explain.d.ts +1 -3
- package/dist/tools/readonly/explain.js +6 -6
- package/dist/tools/readonly/explain.js.map +1 -1
- package/dist/tools/readonly/list-tables.d.ts +1 -3
- package/dist/tools/readonly/list-tables.js +5 -5
- package/dist/tools/readonly/list-tables.js.map +1 -1
- package/dist/tools/readonly/performance.d.ts +1 -3
- package/dist/tools/readonly/performance.js +9 -6
- package/dist/tools/readonly/performance.js.map +1 -1
- package/dist/tools/readonly/query.d.ts +1 -3
- package/dist/tools/readonly/query.js +14 -7
- package/dist/tools/readonly/query.js.map +1 -1
- package/dist/tools/readonly/schema.d.ts +1 -3
- package/dist/tools/readonly/schema.js +5 -5
- package/dist/tools/readonly/schema.js.map +1 -1
- package/dist/tools/write/execute.d.ts +5 -3
- package/dist/tools/write/execute.js +14 -6
- package/dist/tools/write/execute.js.map +1 -1
- package/dist/tools/write/transaction.d.ts +3 -4
- package/dist/tools/write/transaction.js +33 -24
- package/dist/tools/write/transaction.js.map +1 -1
- package/dist/transport/http.d.ts +2 -2
- package/dist/transport/http.js +23 -9
- package/dist/transport/http.js.map +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/resolve-db.d.ts +5 -0
- package/dist/utils/resolve-db.js +61 -0
- package/dist/utils/resolve-db.js.map +1 -0
- package/dist/utils/response.d.ts +12 -0
- package/dist/utils/response.js +130 -3
- package/dist/utils/response.js.map +1 -1
- package/dist/utils/sql-validator.d.ts +16 -0
- package/dist/utils/sql-validator.js +157 -4
- package/dist/utils/sql-validator.js.map +1 -1
- package/package.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/connectors/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/connectors/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Connector, QueryResult, TableInfo, ColumnInfo, ExplainResult, TransactionHandle } from "./interface.js";
|
|
2
1
|
import type { PostgresConfig } from "../config/types.js";
|
|
2
|
+
import type { ColumnInfo, Connector, ExplainResult, QueryResult, TableInfo, TransactionHandle } from "./interface.js";
|
|
3
3
|
export declare class PostgresConnector implements Connector {
|
|
4
4
|
readonly type: "postgresql";
|
|
5
5
|
private pool;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import pg from "pg";
|
|
2
1
|
import { randomUUID } from "node:crypto";
|
|
3
2
|
import { readFileSync } from "node:fs";
|
|
3
|
+
import pg from "pg";
|
|
4
|
+
import { wrapReadonlyQuery } from "../utils/sql-validator.js";
|
|
4
5
|
export class PostgresConnector {
|
|
5
6
|
type = "postgresql";
|
|
6
7
|
pool = null;
|
|
@@ -29,6 +30,8 @@ export class PostgresConnector {
|
|
|
29
30
|
ssl: sslConfig,
|
|
30
31
|
max: 10,
|
|
31
32
|
query_timeout: this.queryTimeout,
|
|
33
|
+
// query_timeout only rejects client-side; statement_timeout makes the server cancel the query too
|
|
34
|
+
statement_timeout: this.queryTimeout,
|
|
32
35
|
}
|
|
33
36
|
: {
|
|
34
37
|
host: this.config.host,
|
|
@@ -39,6 +42,7 @@ export class PostgresConnector {
|
|
|
39
42
|
ssl: sslConfig,
|
|
40
43
|
max: 10,
|
|
41
44
|
query_timeout: this.queryTimeout,
|
|
45
|
+
statement_timeout: this.queryTimeout,
|
|
42
46
|
};
|
|
43
47
|
this.pool = new pg.Pool(poolOptions);
|
|
44
48
|
// Verify connection
|
|
@@ -58,9 +62,22 @@ export class PostgresConnector {
|
|
|
58
62
|
}
|
|
59
63
|
async query(sql, params, maxRows) {
|
|
60
64
|
const limit = maxRows ?? this.maxRows;
|
|
61
|
-
const wrappedSql =
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
const wrappedSql = wrapReadonlyQuery(sql, limit, "postgresql");
|
|
66
|
+
// READ ONLY blocks writes/temp-table tricks, but not pg_terminate_backend/pg_read_file — those are guarded by the sql-validator deny-list
|
|
67
|
+
const client = await this.getPool().connect();
|
|
68
|
+
try {
|
|
69
|
+
await client.query("BEGIN TRANSACTION READ ONLY");
|
|
70
|
+
const result = await client.query(wrappedSql, params);
|
|
71
|
+
await client.query("COMMIT");
|
|
72
|
+
return { rows: result.rows, rowCount: result.rows.length };
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
await client.query("ROLLBACK").catch(() => { });
|
|
76
|
+
throw err;
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
client.release();
|
|
80
|
+
}
|
|
64
81
|
}
|
|
65
82
|
async execute(sql, params) {
|
|
66
83
|
const result = await this.getPool().query(sql, params);
|
|
@@ -132,9 +149,23 @@ export class PostgresConnector {
|
|
|
132
149
|
}
|
|
133
150
|
async explain(sql, analyze = false) {
|
|
134
151
|
const prefix = analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
152
|
+
// EXPLAIN ANALYZE actually runs the statement, so mirror query()'s READ ONLY transaction as a
|
|
153
|
+
// DB-level backstop to the validator rather than executing directly on the pool.
|
|
154
|
+
const client = await this.getPool().connect();
|
|
155
|
+
try {
|
|
156
|
+
await client.query("BEGIN TRANSACTION READ ONLY");
|
|
157
|
+
const result = await client.query(`${prefix} ${sql}`);
|
|
158
|
+
await client.query("COMMIT");
|
|
159
|
+
const plan = result.rows.map((r) => r["QUERY PLAN"]).join("\n");
|
|
160
|
+
return { plan };
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
await client.query("ROLLBACK").catch(() => { });
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
client.release();
|
|
168
|
+
}
|
|
138
169
|
}
|
|
139
170
|
async beginTransaction() {
|
|
140
171
|
const client = await this.getPool().connect();
|
|
@@ -146,26 +177,45 @@ export class PostgresConnector {
|
|
|
146
177
|
throw err;
|
|
147
178
|
}
|
|
148
179
|
const id = randomUUID();
|
|
180
|
+
let released = false;
|
|
181
|
+
const releaseOnce = (err) => {
|
|
182
|
+
if (!released) {
|
|
183
|
+
released = true;
|
|
184
|
+
client.release(err);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
149
187
|
return {
|
|
150
188
|
id,
|
|
151
189
|
async execute(sql, params) {
|
|
190
|
+
if (released)
|
|
191
|
+
throw new Error("Transaction already finalized");
|
|
152
192
|
const result = await client.query(sql, params);
|
|
153
193
|
return { rows: result.rows ?? [], rowCount: result.rowCount ?? 0 };
|
|
154
194
|
},
|
|
155
195
|
async commit() {
|
|
196
|
+
if (released)
|
|
197
|
+
throw new Error("Transaction already finalized");
|
|
156
198
|
try {
|
|
157
199
|
await client.query("COMMIT");
|
|
200
|
+
releaseOnce();
|
|
158
201
|
}
|
|
159
|
-
|
|
160
|
-
|
|
202
|
+
catch (err) {
|
|
203
|
+
// Hand the (possibly poisoned) connection back with the error so pg destroys it
|
|
204
|
+
// instead of returning a half-transactional client to the pool.
|
|
205
|
+
releaseOnce(err);
|
|
206
|
+
throw err;
|
|
161
207
|
}
|
|
162
208
|
},
|
|
163
209
|
async rollback() {
|
|
210
|
+
if (released)
|
|
211
|
+
throw new Error("Transaction already finalized");
|
|
164
212
|
try {
|
|
165
213
|
await client.query("ROLLBACK");
|
|
214
|
+
releaseOnce();
|
|
166
215
|
}
|
|
167
|
-
|
|
168
|
-
|
|
216
|
+
catch (err) {
|
|
217
|
+
releaseOnce(err);
|
|
218
|
+
throw err;
|
|
169
219
|
}
|
|
170
220
|
},
|
|
171
221
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../src/connectors/postgresql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../src/connectors/postgresql.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import { ConnectorManager } from "./connectors/manager.js";
|
|
3
2
|
import { type AppConfig } from "./config/types.js";
|
|
3
|
+
import { ConnectorManager } from "./connectors/manager.js";
|
|
4
4
|
export declare function createConnectorManager(config: AppConfig): ConnectorManager;
|
|
5
5
|
export declare function createMcpServerInstance(manager: ConnectorManager, config: AppConfig): McpServer;
|
|
6
6
|
export declare function createServer(config: AppConfig): Promise<{
|
package/dist/server.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { resolveDbConfig } from "./config/types.js";
|
|
2
4
|
import { ConnectorManager } from "./connectors/manager.js";
|
|
3
5
|
import { registerTools } from "./tools/registry.js";
|
|
4
|
-
import {
|
|
6
|
+
import { setRowFormat } from "./utils/response.js";
|
|
7
|
+
const { version } = createRequire(import.meta.url)("../package.json");
|
|
5
8
|
export function createConnectorManager(config) {
|
|
6
9
|
const resolvedDbs = config.databases.map((db) => resolveDbConfig(db, config.defaults));
|
|
7
10
|
return new ConnectorManager(resolvedDbs);
|
|
@@ -9,8 +12,9 @@ export function createConnectorManager(config) {
|
|
|
9
12
|
export function createMcpServerInstance(manager, config) {
|
|
10
13
|
const server = new McpServer({
|
|
11
14
|
name: "db-view-mcp",
|
|
12
|
-
version
|
|
15
|
+
version,
|
|
13
16
|
});
|
|
17
|
+
setRowFormat(config.defaults.rowFormat);
|
|
14
18
|
registerTools(server, manager, config.defaults);
|
|
15
19
|
return server;
|
|
16
20
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAkB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAC;AAE7F,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAyB,EAAE,MAAiB;IAClF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO;KACR,CAAC,CAAC;IACH,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAiB;IAClD,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;IAE7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
3
|
export declare function createDescribeTableParams(dbIds: string[]): {
|
|
4
|
-
database: z.
|
|
5
|
-
[x: string]: string;
|
|
6
|
-
}>;
|
|
4
|
+
database: z.ZodString;
|
|
7
5
|
table: z.ZodString;
|
|
8
6
|
schema: z.ZodOptional<z.ZodString>;
|
|
9
7
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { formatCaughtError, formatSuccess } from "../../utils/response.js";
|
|
3
3
|
export function createDescribeTableParams(dbIds) {
|
|
4
4
|
return {
|
|
5
|
-
database: z.
|
|
5
|
+
database: z.string().describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
6
6
|
table: z.string().describe("Table name"),
|
|
7
7
|
schema: z.string().optional().describe("Schema name (default: public for PostgreSQL)"),
|
|
8
8
|
};
|
|
@@ -10,12 +10,12 @@ export function createDescribeTableParams(dbIds) {
|
|
|
10
10
|
export function describeTableHandler(manager) {
|
|
11
11
|
return async (params) => {
|
|
12
12
|
try {
|
|
13
|
-
const connector = await manager.
|
|
13
|
+
const { id: database, connector } = await manager.acquire(params.database);
|
|
14
14
|
const columns = await connector.describeTable(params.table, params.schema);
|
|
15
|
-
return formatSuccess({ data: columns, database
|
|
15
|
+
return formatSuccess({ data: columns, database });
|
|
16
16
|
}
|
|
17
17
|
catch (err) {
|
|
18
|
-
return
|
|
18
|
+
return formatCaughtError(err);
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe-table.js","sourceRoot":"","sources":["../../../src/tools/readonly/describe-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"describe-table.js","sourceRoot":"","sources":["../../../src/tools/readonly/describe-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,UAAU,yBAAyB,CAAC,KAAe;IACvD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,OAAO,KAAK,EAAE,MAA4D,EAAE,EAAE;QAC5E,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3E,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
3
|
export declare function createExplainParams(dbIds: string[]): {
|
|
4
|
-
database: z.
|
|
5
|
-
[x: string]: string;
|
|
6
|
-
}>;
|
|
4
|
+
database: z.ZodString;
|
|
7
5
|
sql: z.ZodString;
|
|
8
6
|
analyze: z.ZodOptional<z.ZodBoolean>;
|
|
9
7
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { formatCaughtError, formatError, formatSuccess } from "../../utils/response.js";
|
|
3
3
|
import { validateReadonlySql } from "../../utils/sql-validator.js";
|
|
4
4
|
export function createExplainParams(dbIds) {
|
|
5
5
|
return {
|
|
6
|
-
database: z.
|
|
6
|
+
database: z.string().describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
7
7
|
sql: z.string().describe("SQL query to explain"),
|
|
8
8
|
analyze: z.boolean().optional().describe("Run EXPLAIN ANALYZE (actually executes the query). Default: false"),
|
|
9
9
|
};
|
|
@@ -15,12 +15,12 @@ export function explainHandler(manager) {
|
|
|
15
15
|
return formatError(validation.error, "READONLY_VIOLATION");
|
|
16
16
|
}
|
|
17
17
|
try {
|
|
18
|
-
const connector = await manager.
|
|
19
|
-
const result = await connector.explain(params.sql, params.analyze ?? false);
|
|
20
|
-
return formatSuccess({ data: result.plan, database
|
|
18
|
+
const { id: database, connector } = await manager.acquire(params.database);
|
|
19
|
+
const result = await connector.explain(validation.normalizedSql ?? params.sql, params.analyze ?? false);
|
|
20
|
+
return formatSuccess({ data: result.plan, database });
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
23
|
-
return
|
|
23
|
+
return formatCaughtError(err);
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../src/tools/readonly/explain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../src/tools/readonly/explain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAChD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;KAC9G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,OAAO,KAAK,EAAE,MAA4D,EAAE,EAAE;QAC5E,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,WAAW,CAAC,UAAU,CAAC,KAAM,EAAE,oBAAoB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;YACxG,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
3
|
export declare function createListTablesParams(dbIds: string[]): {
|
|
4
|
-
database: z.
|
|
5
|
-
[x: string]: string;
|
|
6
|
-
}>;
|
|
4
|
+
database: z.ZodString;
|
|
7
5
|
schema: z.ZodOptional<z.ZodString>;
|
|
8
6
|
};
|
|
9
7
|
export declare function listTablesHandler(manager: ConnectorManager): (params: {
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { formatCaughtError, formatSuccess } from "../../utils/response.js";
|
|
3
3
|
export function createListTablesParams(dbIds) {
|
|
4
4
|
return {
|
|
5
|
-
database: z.
|
|
5
|
+
database: z.string().describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
6
6
|
schema: z.string().optional().describe("Schema name (default: public for PostgreSQL)"),
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
9
|
export function listTablesHandler(manager) {
|
|
10
10
|
return async (params) => {
|
|
11
11
|
try {
|
|
12
|
-
const connector = await manager.
|
|
12
|
+
const { id: database, connector } = await manager.acquire(params.database);
|
|
13
13
|
const tables = await connector.listTables(params.schema);
|
|
14
|
-
return formatSuccess({ data: tables, database
|
|
14
|
+
return formatSuccess({ data: tables, database });
|
|
15
15
|
}
|
|
16
16
|
catch (err) {
|
|
17
|
-
return
|
|
17
|
+
return formatCaughtError(err);
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tables.js","sourceRoot":"","sources":["../../../src/tools/readonly/list-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list-tables.js","sourceRoot":"","sources":["../../../src/tools/readonly/list-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,UAAU,sBAAsB,CAAC,KAAe;IACpD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAyB;IACzD,OAAO,KAAK,EAAE,MAA6C,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -16,9 +16,7 @@ export declare class PerformanceTracker {
|
|
|
16
16
|
reset(): void;
|
|
17
17
|
}
|
|
18
18
|
export declare function createPerformanceParams(dbIds: string[]): {
|
|
19
|
-
database: z.
|
|
20
|
-
[x: string]: string;
|
|
21
|
-
}>;
|
|
19
|
+
database: z.ZodString;
|
|
22
20
|
action: z.ZodEnum<{
|
|
23
21
|
getSlowQueries: "getSlowQueries";
|
|
24
22
|
getMetrics: "getMetrics";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { formatCaughtError, formatError, formatSuccess } from "../../utils/response.js";
|
|
3
3
|
export class PerformanceTracker {
|
|
4
4
|
slowQueries = [];
|
|
5
5
|
threshold = 1000; // ms
|
|
@@ -26,7 +26,7 @@ export class PerformanceTracker {
|
|
|
26
26
|
}
|
|
27
27
|
export function createPerformanceParams(dbIds) {
|
|
28
28
|
return {
|
|
29
|
-
database: z.
|
|
29
|
+
database: z.string().describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
30
30
|
action: z.enum(["getSlowQueries", "getMetrics", "reset", "setThreshold"]).describe("Performance action"),
|
|
31
31
|
threshold: z.number().optional().describe("Slow query threshold in ms (for setThreshold)"),
|
|
32
32
|
limit: z.number().optional().describe("Max results (for getSlowQueries)"),
|
|
@@ -36,11 +36,14 @@ export function performanceHandler(manager) {
|
|
|
36
36
|
const tracker = manager.getPerformanceTracker();
|
|
37
37
|
return async (params) => {
|
|
38
38
|
try {
|
|
39
|
+
// resolveId (not acquire) on purpose: this tool reads in-memory metrics and must keep
|
|
40
|
+
// working even when the target database is down or lazily unconnected.
|
|
41
|
+
const database = manager.resolveId(params.database);
|
|
39
42
|
switch (params.action) {
|
|
40
43
|
case "getSlowQueries":
|
|
41
44
|
return formatSuccess({
|
|
42
|
-
data: tracker.getSlowQueries(
|
|
43
|
-
database
|
|
45
|
+
data: tracker.getSlowQueries(database, params.limit),
|
|
46
|
+
database,
|
|
44
47
|
});
|
|
45
48
|
case "getMetrics":
|
|
46
49
|
return formatSuccess({
|
|
@@ -48,7 +51,7 @@ export function performanceHandler(manager) {
|
|
|
48
51
|
slowQueryThreshold: tracker.getThreshold(),
|
|
49
52
|
connectedDatabases: manager.getDatabaseIds(),
|
|
50
53
|
},
|
|
51
|
-
database
|
|
54
|
+
database,
|
|
52
55
|
});
|
|
53
56
|
case "reset":
|
|
54
57
|
tracker.reset();
|
|
@@ -63,7 +66,7 @@ export function performanceHandler(manager) {
|
|
|
63
66
|
}
|
|
64
67
|
}
|
|
65
68
|
catch (err) {
|
|
66
|
-
return
|
|
69
|
+
return formatCaughtError(err);
|
|
67
70
|
}
|
|
68
71
|
};
|
|
69
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/tools/readonly/performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/tools/readonly/performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
3
|
export declare function createQueryToolParams(dbIds: string[]): {
|
|
4
|
-
database: z.
|
|
5
|
-
[x: string]: string;
|
|
6
|
-
}>;
|
|
4
|
+
database: z.ZodString;
|
|
7
5
|
sql: z.ZodString;
|
|
8
6
|
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
9
7
|
};
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { formatCaughtError, formatError, formatRows } from "../../utils/response.js";
|
|
3
3
|
import { validateReadonlySql } from "../../utils/sql-validator.js";
|
|
4
4
|
export function createQueryToolParams(dbIds) {
|
|
5
5
|
return {
|
|
6
|
-
database: z.
|
|
6
|
+
database: z.string().describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
7
7
|
sql: z.string().describe("SELECT query to execute"),
|
|
8
|
-
maxRows: z
|
|
8
|
+
maxRows: z
|
|
9
|
+
.number()
|
|
10
|
+
.int()
|
|
11
|
+
.positive()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Maximum number of rows to return. Can only lower the configured cap, not raise it."),
|
|
9
14
|
};
|
|
10
15
|
}
|
|
11
16
|
export function queryToolHandler(manager) {
|
|
@@ -15,12 +20,14 @@ export function queryToolHandler(manager) {
|
|
|
15
20
|
return formatError(validation.error, "READONLY_VIOLATION");
|
|
16
21
|
}
|
|
17
22
|
try {
|
|
18
|
-
const connector = await manager.
|
|
19
|
-
const
|
|
20
|
-
|
|
23
|
+
const { id: database, connector } = await manager.acquire(params.database);
|
|
24
|
+
const cap = manager.getConfig(database).maxRows;
|
|
25
|
+
const effective = Math.min(params.maxRows ?? cap, cap);
|
|
26
|
+
const result = await connector.query(validation.normalizedSql ?? params.sql, undefined, effective);
|
|
27
|
+
return formatRows(result.rows, database);
|
|
21
28
|
}
|
|
22
29
|
catch (err) {
|
|
23
|
-
return
|
|
30
|
+
return formatCaughtError(err);
|
|
24
31
|
}
|
|
25
32
|
};
|
|
26
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/tools/readonly/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/tools/readonly/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACnD,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,EAAE;aACV,QAAQ,CAAC,oFAAoF,CAAC;KAClG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,OAAO,KAAK,EAAE,MAA2D,EAAE,EAAE;QAC3E,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,WAAW,CAAC,UAAU,CAAC,KAAM,EAAE,oBAAoB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,OAAO,CAAC;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACnG,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
3
|
export declare function createSchemaParams(dbIds: string[]): {
|
|
4
|
-
database: z.
|
|
5
|
-
[x: string]: string;
|
|
6
|
-
}>;
|
|
4
|
+
database: z.ZodString;
|
|
7
5
|
schema: z.ZodOptional<z.ZodString>;
|
|
8
6
|
};
|
|
9
7
|
export declare function schemaHandler(manager: ConnectorManager): (params: {
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { formatCaughtError, formatSuccess } from "../../utils/response.js";
|
|
3
3
|
export function createSchemaParams(dbIds) {
|
|
4
4
|
return {
|
|
5
|
-
database: z.
|
|
5
|
+
database: z.string().describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
6
6
|
schema: z.string().optional().describe("Schema name (default: 'public' for PostgreSQL, ignored for ClickHouse)"),
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
9
|
export function schemaHandler(manager) {
|
|
10
10
|
return async (params) => {
|
|
11
11
|
try {
|
|
12
|
-
const connector = await manager.
|
|
12
|
+
const { id: database, connector } = await manager.acquire(params.database);
|
|
13
13
|
const ddl = await connector.getSchema(params.schema);
|
|
14
|
-
return formatSuccess({ data: ddl, database
|
|
14
|
+
return formatSuccess({ data: ddl, database });
|
|
15
15
|
}
|
|
16
16
|
catch (err) {
|
|
17
|
-
return
|
|
17
|
+
return formatCaughtError(err);
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/readonly/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/readonly/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,UAAU,kBAAkB,CAAC,KAAe;IAChD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;KACjH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,OAAO,KAAK,EAAE,MAA6C,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3E,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
|
+
export declare function capRows<T>(rows: T[], max: number): {
|
|
4
|
+
rows: T[];
|
|
5
|
+
truncated: boolean;
|
|
6
|
+
};
|
|
3
7
|
export declare function createExecuteParams(dbIds: string[]): {
|
|
4
|
-
database: z.
|
|
5
|
-
[x: string]: string;
|
|
6
|
-
}>;
|
|
8
|
+
database: z.ZodString;
|
|
7
9
|
statement: z.ZodString;
|
|
8
10
|
params: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
11
|
};
|