@conte777/db-view-mcp 1.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.
- package/LICENSE +21 -0
- package/README.md +341 -0
- package/config.example.json +41 -0
- package/dist/config/loader.d.ts +6 -0
- package/dist/config/loader.js +28 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +149 -0
- package/dist/config/types.js +73 -0
- package/dist/config/types.js.map +1 -0
- package/dist/connectors/clickhouse.d.ts +20 -0
- package/dist/connectors/clickhouse.js +95 -0
- package/dist/connectors/clickhouse.js.map +1 -0
- package/dist/connectors/interface.d.ts +37 -0
- package/dist/connectors/interface.js +2 -0
- package/dist/connectors/interface.js.map +1 -0
- package/dist/connectors/manager.d.ts +14 -0
- package/dist/connectors/manager.js +51 -0
- package/dist/connectors/manager.js.map +1 -0
- package/dist/connectors/postgresql.d.ts +20 -0
- package/dist/connectors/postgresql.js +138 -0
- package/dist/connectors/postgresql.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/readonly/describe-table.d.ts +19 -0
- package/dist/tools/readonly/describe-table.js +22 -0
- package/dist/tools/readonly/describe-table.js.map +1 -0
- package/dist/tools/readonly/explain.d.ts +17 -0
- package/dist/tools/readonly/explain.js +26 -0
- package/dist/tools/readonly/explain.js.map +1 -0
- package/dist/tools/readonly/list-databases.d.ts +7 -0
- package/dist/tools/readonly/list-databases.js +12 -0
- package/dist/tools/readonly/list-databases.js.map +1 -0
- package/dist/tools/readonly/list-tables.d.ts +17 -0
- package/dist/tools/readonly/list-tables.js +21 -0
- package/dist/tools/readonly/list-tables.js.map +1 -0
- package/dist/tools/readonly/performance.d.ts +43 -0
- package/dist/tools/readonly/performance.js +72 -0
- package/dist/tools/readonly/performance.js.map +1 -0
- package/dist/tools/readonly/query.d.ts +19 -0
- package/dist/tools/readonly/query.js +27 -0
- package/dist/tools/readonly/query.js.map +1 -0
- package/dist/tools/readonly/schema.d.ts +15 -0
- package/dist/tools/readonly/schema.js +20 -0
- package/dist/tools/readonly/schema.js.map +1 -0
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.js +56 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/write/execute.d.ts +19 -0
- package/dist/tools/write/execute.js +26 -0
- package/dist/tools/write/execute.js.map +1 -0
- package/dist/tools/write/transaction.d.ts +28 -0
- package/dist/tools/write/transaction.js +76 -0
- package/dist/tools/write/transaction.js.map +1 -0
- package/dist/transport/http.d.ts +15 -0
- package/dist/transport/http.js +96 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/utils/response.d.ts +31 -0
- package/dist/utils/response.js +25 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/sql-validator.d.ts +5 -0
- package/dist/utils/sql-validator.js +36 -0
- package/dist/utils/sql-validator.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatSuccess, formatError } from "../../utils/response.js";
|
|
3
|
+
export function createListTablesParams(dbIds) {
|
|
4
|
+
return {
|
|
5
|
+
database: z.enum(dbIds).describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
6
|
+
schema: z.string().optional().describe("Schema name (default: public for PostgreSQL)"),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function listTablesHandler(manager) {
|
|
10
|
+
return async (params) => {
|
|
11
|
+
try {
|
|
12
|
+
const connector = await manager.getConnector(params.database);
|
|
13
|
+
const tables = await connector.listTables(params.schema);
|
|
14
|
+
return formatSuccess({ data: tables, database: params.database });
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
return formatError(String(err));
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=list-tables.js.map
|
|
@@ -0,0 +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,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,UAAU,sBAAsB,CAAC,KAAe;IACpD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAA8B,CAAC,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,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,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
|
+
interface SlowQuery {
|
|
4
|
+
sql: string;
|
|
5
|
+
duration: number;
|
|
6
|
+
timestamp: Date;
|
|
7
|
+
database: string;
|
|
8
|
+
}
|
|
9
|
+
declare class PerformanceTracker {
|
|
10
|
+
private slowQueries;
|
|
11
|
+
private threshold;
|
|
12
|
+
recordQuery(sql: string, duration: number, database: string): void;
|
|
13
|
+
getSlowQueries(database?: string, limit?: number): SlowQuery[];
|
|
14
|
+
setThreshold(ms: number): void;
|
|
15
|
+
getThreshold(): number;
|
|
16
|
+
reset(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare const performanceTracker: PerformanceTracker;
|
|
19
|
+
export declare function createPerformanceParams(dbIds: string[]): {
|
|
20
|
+
database: z.ZodEnum<{
|
|
21
|
+
[x: string]: string;
|
|
22
|
+
}>;
|
|
23
|
+
action: z.ZodEnum<{
|
|
24
|
+
getSlowQueries: "getSlowQueries";
|
|
25
|
+
getMetrics: "getMetrics";
|
|
26
|
+
reset: "reset";
|
|
27
|
+
setThreshold: "setThreshold";
|
|
28
|
+
}>;
|
|
29
|
+
threshold: z.ZodOptional<z.ZodNumber>;
|
|
30
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
};
|
|
32
|
+
export declare function performanceHandler(manager: ConnectorManager): (params: {
|
|
33
|
+
database: string;
|
|
34
|
+
action: string;
|
|
35
|
+
threshold?: number;
|
|
36
|
+
limit?: number;
|
|
37
|
+
}) => Promise<{
|
|
38
|
+
content: {
|
|
39
|
+
type: "text";
|
|
40
|
+
text: string;
|
|
41
|
+
}[];
|
|
42
|
+
}>;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatSuccess, formatError } from "../../utils/response.js";
|
|
3
|
+
class PerformanceTracker {
|
|
4
|
+
slowQueries = [];
|
|
5
|
+
threshold = 1000; // ms
|
|
6
|
+
recordQuery(sql, duration, database) {
|
|
7
|
+
if (duration >= this.threshold) {
|
|
8
|
+
this.slowQueries.push({ sql, duration, timestamp: new Date(), database });
|
|
9
|
+
if (this.slowQueries.length > 100)
|
|
10
|
+
this.slowQueries.shift();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
getSlowQueries(database, limit = 20) {
|
|
14
|
+
const filtered = database
|
|
15
|
+
? this.slowQueries.filter((q) => q.database === database)
|
|
16
|
+
: this.slowQueries;
|
|
17
|
+
return filtered.slice(-limit);
|
|
18
|
+
}
|
|
19
|
+
setThreshold(ms) {
|
|
20
|
+
this.threshold = ms;
|
|
21
|
+
}
|
|
22
|
+
getThreshold() {
|
|
23
|
+
return this.threshold;
|
|
24
|
+
}
|
|
25
|
+
reset() {
|
|
26
|
+
this.slowQueries = [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export const performanceTracker = new PerformanceTracker();
|
|
30
|
+
export function createPerformanceParams(dbIds) {
|
|
31
|
+
return {
|
|
32
|
+
database: z.enum(dbIds).describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
33
|
+
action: z.enum(["getSlowQueries", "getMetrics", "reset", "setThreshold"]).describe("Performance action"),
|
|
34
|
+
threshold: z.number().optional().describe("Slow query threshold in ms (for setThreshold)"),
|
|
35
|
+
limit: z.number().optional().describe("Max results (for getSlowQueries)"),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function performanceHandler(manager) {
|
|
39
|
+
return async (params) => {
|
|
40
|
+
try {
|
|
41
|
+
switch (params.action) {
|
|
42
|
+
case "getSlowQueries":
|
|
43
|
+
return formatSuccess({
|
|
44
|
+
data: performanceTracker.getSlowQueries(params.database, params.limit),
|
|
45
|
+
database: params.database,
|
|
46
|
+
});
|
|
47
|
+
case "getMetrics":
|
|
48
|
+
return formatSuccess({
|
|
49
|
+
data: {
|
|
50
|
+
slowQueryThreshold: performanceTracker.getThreshold(),
|
|
51
|
+
connectedDatabases: manager.getDatabaseIds(),
|
|
52
|
+
},
|
|
53
|
+
database: params.database,
|
|
54
|
+
});
|
|
55
|
+
case "reset":
|
|
56
|
+
performanceTracker.reset();
|
|
57
|
+
return formatSuccess({ data: "Performance metrics reset" });
|
|
58
|
+
case "setThreshold":
|
|
59
|
+
if (!params.threshold)
|
|
60
|
+
return formatError("threshold is required for setThreshold");
|
|
61
|
+
performanceTracker.setThreshold(params.threshold);
|
|
62
|
+
return formatSuccess({ data: `Threshold set to ${params.threshold}ms` });
|
|
63
|
+
default:
|
|
64
|
+
return formatError(`Unknown action: ${params.action}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
return formatError(String(err));
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/tools/readonly/performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
|
+
export declare function createQueryToolParams(dbIds: string[]): {
|
|
4
|
+
database: z.ZodEnum<{
|
|
5
|
+
[x: string]: string;
|
|
6
|
+
}>;
|
|
7
|
+
sql: z.ZodString;
|
|
8
|
+
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
};
|
|
10
|
+
export declare function queryToolHandler(manager: ConnectorManager): (params: {
|
|
11
|
+
database: string;
|
|
12
|
+
sql: string;
|
|
13
|
+
maxRows?: number;
|
|
14
|
+
}) => Promise<{
|
|
15
|
+
content: {
|
|
16
|
+
type: "text";
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatRows, formatError } from "../../utils/response.js";
|
|
3
|
+
import { validateReadonlySql } from "../../utils/sql-validator.js";
|
|
4
|
+
export function createQueryToolParams(dbIds) {
|
|
5
|
+
return {
|
|
6
|
+
database: z.enum(dbIds).describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
7
|
+
sql: z.string().describe("SELECT query to execute"),
|
|
8
|
+
maxRows: z.number().optional().describe("Maximum number of rows to return"),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function queryToolHandler(manager) {
|
|
12
|
+
return async (params) => {
|
|
13
|
+
const validation = validateReadonlySql(params.sql);
|
|
14
|
+
if (!validation.valid) {
|
|
15
|
+
return formatError(validation.error, "READONLY_VIOLATION");
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const connector = await manager.getConnector(params.database);
|
|
19
|
+
const result = await connector.query(params.sql, undefined, params.maxRows);
|
|
20
|
+
return formatRows(result.rows, params.database);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return formatError(String(err));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +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,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAA8B,CAAC,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACnD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC5E,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,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5E,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
|
+
export declare function createSchemaParams(dbIds: string[]): {
|
|
4
|
+
database: z.ZodEnum<{
|
|
5
|
+
[x: string]: string;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
export declare function schemaHandler(manager: ConnectorManager): (params: {
|
|
9
|
+
database: string;
|
|
10
|
+
}) => Promise<{
|
|
11
|
+
content: {
|
|
12
|
+
type: "text";
|
|
13
|
+
text: string;
|
|
14
|
+
}[];
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatSuccess, formatError } from "../../utils/response.js";
|
|
3
|
+
export function createSchemaParams(dbIds) {
|
|
4
|
+
return {
|
|
5
|
+
database: z.enum(dbIds).describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function schemaHandler(manager) {
|
|
9
|
+
return async (params) => {
|
|
10
|
+
try {
|
|
11
|
+
const connector = await manager.getConnector(params.database);
|
|
12
|
+
const ddl = await connector.getSchema();
|
|
13
|
+
return formatSuccess({ data: ddl, database: params.database });
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
return formatError(String(err));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +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,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,UAAU,kBAAkB,CAAC,KAAe;IAChD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAA8B,CAAC,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;KACzG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,OAAO,KAAK,EAAE,MAA4B,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ConnectorManager } from "../connectors/manager.js";
|
|
3
|
+
import type { Defaults } from "../config/types.js";
|
|
4
|
+
export declare function registerTools(server: McpServer, manager: ConnectorManager, defaults: Defaults): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createQueryToolParams, queryToolHandler } from "./readonly/query.js";
|
|
2
|
+
import { listDatabasesHandler } from "./readonly/list-databases.js";
|
|
3
|
+
import { createListTablesParams, listTablesHandler } from "./readonly/list-tables.js";
|
|
4
|
+
import { createDescribeTableParams, describeTableHandler } from "./readonly/describe-table.js";
|
|
5
|
+
import { createSchemaParams, schemaHandler } from "./readonly/schema.js";
|
|
6
|
+
import { createExplainParams, explainHandler } from "./readonly/explain.js";
|
|
7
|
+
import { createPerformanceParams, performanceHandler } from "./readonly/performance.js";
|
|
8
|
+
import { createExecuteParams, executeHandler } from "./write/execute.js";
|
|
9
|
+
import { createTransactionParams, transactionHandler } from "./write/transaction.js";
|
|
10
|
+
export function registerTools(server, manager, defaults) {
|
|
11
|
+
const dbIds = manager.getDatabaseIds();
|
|
12
|
+
if (defaults.toolsPerDatabase) {
|
|
13
|
+
registerPerDatabaseTools(server, manager, dbIds);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
registerParameterTools(server, manager, dbIds);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function registerParameterTools(server, manager, dbIds) {
|
|
20
|
+
server.tool("query", `Execute a read-only SQL query. Available databases: ${dbIds.join(", ")}`, createQueryToolParams(dbIds), queryToolHandler(manager));
|
|
21
|
+
server.tool("list_databases", "List all configured databases", {}, listDatabasesHandler(manager));
|
|
22
|
+
server.tool("list_tables", `List tables in a database. Available databases: ${dbIds.join(", ")}`, createListTablesParams(dbIds), listTablesHandler(manager));
|
|
23
|
+
server.tool("describe_table", `Describe table structure. Available databases: ${dbIds.join(", ")}`, createDescribeTableParams(dbIds), describeTableHandler(manager));
|
|
24
|
+
server.tool("schema", `Get full database schema (DDL). Available databases: ${dbIds.join(", ")}`, createSchemaParams(dbIds), schemaHandler(manager));
|
|
25
|
+
server.tool("explain_query", `Run EXPLAIN ANALYZE on a query. Available databases: ${dbIds.join(", ")}`, createExplainParams(dbIds), explainHandler(manager));
|
|
26
|
+
server.tool("performance", `View performance metrics and slow queries. Available databases: ${dbIds.join(", ")}`, createPerformanceParams(dbIds), performanceHandler(manager));
|
|
27
|
+
server.tool("execute", `Execute a write SQL statement (INSERT, UPDATE, DELETE, DDL). Available databases: ${dbIds.join(", ")}`, createExecuteParams(dbIds), executeHandler(manager));
|
|
28
|
+
server.tool("transaction", `Manage database transactions (begin, execute, commit, rollback). Available databases: ${dbIds.join(", ")}`, createTransactionParams(dbIds), transactionHandler(manager));
|
|
29
|
+
}
|
|
30
|
+
function registerPerDatabaseTools(server, manager, dbIds) {
|
|
31
|
+
for (const dbId of dbIds) {
|
|
32
|
+
const singleDbIds = [dbId];
|
|
33
|
+
const config = manager.getConfig(dbId);
|
|
34
|
+
const desc = config.description ? ` (${config.description})` : "";
|
|
35
|
+
server.tool(`query_${dbId}`, `Execute a read-only SQL query on ${dbId}${desc}`, { sql: createQueryToolParams(singleDbIds).sql, maxRows: createQueryToolParams(singleDbIds).maxRows }, async (params) => queryToolHandler(manager)({ database: dbId, ...params }));
|
|
36
|
+
server.tool(`list_tables_${dbId}`, `List tables on ${dbId}${desc}`, { schema: createListTablesParams(singleDbIds).schema }, async (params) => listTablesHandler(manager)({ database: dbId, ...params }));
|
|
37
|
+
server.tool(`describe_table_${dbId}`, `Describe table structure on ${dbId}${desc}`, { table: createDescribeTableParams(singleDbIds).table, schema: createDescribeTableParams(singleDbIds).schema }, async (params) => describeTableHandler(manager)({ database: dbId, ...params }));
|
|
38
|
+
server.tool(`schema_${dbId}`, `Get full schema of ${dbId}${desc}`, {}, async () => schemaHandler(manager)({ database: dbId }));
|
|
39
|
+
server.tool(`explain_query_${dbId}`, `Run EXPLAIN on ${dbId}${desc}`, { sql: createExplainParams(singleDbIds).sql }, async (params) => explainHandler(manager)({ database: dbId, ...params }));
|
|
40
|
+
server.tool(`performance_${dbId}`, `Performance metrics for ${dbId}${desc}`, {
|
|
41
|
+
action: createPerformanceParams(singleDbIds).action,
|
|
42
|
+
threshold: createPerformanceParams(singleDbIds).threshold,
|
|
43
|
+
limit: createPerformanceParams(singleDbIds).limit,
|
|
44
|
+
}, async (params) => performanceHandler(manager)({ database: dbId, ...params }));
|
|
45
|
+
server.tool(`execute_${dbId}`, `Execute write SQL on ${dbId}${desc}`, { statement: createExecuteParams(singleDbIds).statement, params: createExecuteParams(singleDbIds).params }, async (params) => executeHandler(manager)({ database: dbId, ...params }));
|
|
46
|
+
server.tool(`transaction_${dbId}`, `Manage transactions on ${dbId}${desc}`, {
|
|
47
|
+
action: createTransactionParams(singleDbIds).action,
|
|
48
|
+
transactionId: createTransactionParams(singleDbIds).transactionId,
|
|
49
|
+
statement: createTransactionParams(singleDbIds).statement,
|
|
50
|
+
params: createTransactionParams(singleDbIds).params,
|
|
51
|
+
}, async (params) => transactionHandler(manager)({ database: dbId, ...params }));
|
|
52
|
+
}
|
|
53
|
+
// list_databases is always global
|
|
54
|
+
server.tool("list_databases", "List all configured databases", {}, listDatabasesHandler(manager));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAErF,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,OAAyB,EACzB,QAAkB;IAElB,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAEvC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9B,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAiB,EACjB,OAAyB,EACzB,KAAe;IAEf,MAAM,CAAC,IAAI,CACT,OAAO,EACP,uDAAuD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACzE,qBAAqB,CAAC,KAAK,CAAC,EAC5B,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,+BAA+B,EAC/B,EAAE,EACF,oBAAoB,CAAC,OAAO,CAAC,CAC9B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,mDAAmD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACrE,sBAAsB,CAAC,KAAK,CAAC,EAC7B,iBAAiB,CAAC,OAAO,CAAC,CAC3B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,kDAAkD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACpE,yBAAyB,CAAC,KAAK,CAAC,EAChC,oBAAoB,CAAC,OAAO,CAAC,CAC9B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,wDAAwD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC1E,kBAAkB,CAAC,KAAK,CAAC,EACzB,aAAa,CAAC,OAAO,CAAC,CACvB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,wDAAwD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC1E,mBAAmB,CAAC,KAAK,CAAC,EAC1B,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,mEAAmE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACrF,uBAAuB,CAAC,KAAK,CAAC,EAC9B,kBAAkB,CAAC,OAAO,CAAC,CAC5B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,SAAS,EACT,qFAAqF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACvG,mBAAmB,CAAC,KAAK,CAAC,EAC1B,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,yFAAyF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3G,uBAAuB,CAAC,KAAK,CAAC,EAC9B,kBAAkB,CAAC,OAAO,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,MAAiB,EACjB,OAAyB,EACzB,KAAe;IAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,MAAM,CAAC,IAAI,CACT,SAAS,IAAI,EAAE,EACf,oCAAoC,IAAI,GAAG,IAAI,EAAE,EACjD,EAAE,GAAG,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,EACpG,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAC3E,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,eAAe,IAAI,EAAE,EACrB,kBAAkB,IAAI,GAAG,IAAI,EAAE,EAC/B,EAAE,MAAM,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EACtD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAC5E,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,IAAI,EAAE,EACxB,+BAA+B,IAAI,GAAG,IAAI,EAAE,EAC5C,EAAE,KAAK,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAC9G,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAC/E,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,UAAU,IAAI,EAAE,EAChB,sBAAsB,IAAI,GAAG,IAAI,EAAE,EACnC,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CACvD,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,IAAI,EAAE,EACvB,kBAAkB,IAAI,GAAG,IAAI,EAAE,EAC/B,EAAE,GAAG,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,EAC7C,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CACzE,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,eAAe,IAAI,EAAE,EACrB,2BAA2B,IAAI,GAAG,IAAI,EAAE,EACxC;YACE,MAAM,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,MAAM;YACnD,SAAS,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,SAAS;YACzD,KAAK,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,KAAK;SAClD,EACD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAC7E,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,WAAW,IAAI,EAAE,EACjB,wBAAwB,IAAI,GAAG,IAAI,EAAE,EACrC,EAAE,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAC1G,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CACzE,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,eAAe,IAAI,EAAE,EACrB,0BAA0B,IAAI,GAAG,IAAI,EAAE,EACvC;YACE,MAAM,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,MAAM;YACnD,aAAa,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,aAAa;YACjE,SAAS,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,SAAS;YACzD,MAAM,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,MAAM;SACpD,EACD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAC7E,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,+BAA+B,EAC/B,EAAE,EACF,oBAAoB,CAAC,OAAO,CAAC,CAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
|
+
export declare function createExecuteParams(dbIds: string[]): {
|
|
4
|
+
database: z.ZodEnum<{
|
|
5
|
+
[x: string]: string;
|
|
6
|
+
}>;
|
|
7
|
+
statement: z.ZodString;
|
|
8
|
+
params: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
};
|
|
10
|
+
export declare function executeHandler(manager: ConnectorManager): (params: {
|
|
11
|
+
database: string;
|
|
12
|
+
statement: string;
|
|
13
|
+
params?: string[];
|
|
14
|
+
}) => Promise<{
|
|
15
|
+
content: {
|
|
16
|
+
type: "text";
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatSuccess, formatError } from "../../utils/response.js";
|
|
3
|
+
export function createExecuteParams(dbIds) {
|
|
4
|
+
return {
|
|
5
|
+
database: z.enum(dbIds).describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
6
|
+
statement: z.string().describe("SQL statement to execute (INSERT, UPDATE, DELETE, DDL, etc.)"),
|
|
7
|
+
params: z.array(z.string()).optional().describe("Query parameters"),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function executeHandler(manager) {
|
|
11
|
+
return async (params) => {
|
|
12
|
+
try {
|
|
13
|
+
const connector = await manager.getConnector(params.database);
|
|
14
|
+
const result = await connector.execute(params.statement, params.params);
|
|
15
|
+
return formatSuccess({
|
|
16
|
+
rows: result.rows,
|
|
17
|
+
count: result.rowCount,
|
|
18
|
+
database: params.database,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return formatError(String(err));
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/tools/write/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAA8B,CAAC,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QAC9F,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,OAAO,KAAK,EAAE,MAAkE,EAAE,EAAE;QAClF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACxE,OAAO,aAAa,CAAC;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,QAAQ;gBACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ConnectorManager } from "../../connectors/manager.js";
|
|
3
|
+
export declare function createTransactionParams(dbIds: string[]): {
|
|
4
|
+
database: z.ZodEnum<{
|
|
5
|
+
[x: string]: string;
|
|
6
|
+
}>;
|
|
7
|
+
action: z.ZodEnum<{
|
|
8
|
+
execute: "execute";
|
|
9
|
+
commit: "commit";
|
|
10
|
+
rollback: "rollback";
|
|
11
|
+
begin: "begin";
|
|
12
|
+
}>;
|
|
13
|
+
transactionId: z.ZodOptional<z.ZodString>;
|
|
14
|
+
statement: z.ZodOptional<z.ZodString>;
|
|
15
|
+
params: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
16
|
+
};
|
|
17
|
+
export declare function transactionHandler(manager: ConnectorManager): (params: {
|
|
18
|
+
database: string;
|
|
19
|
+
action: string;
|
|
20
|
+
transactionId?: string;
|
|
21
|
+
statement?: string;
|
|
22
|
+
params?: string[];
|
|
23
|
+
}) => Promise<{
|
|
24
|
+
content: {
|
|
25
|
+
type: "text";
|
|
26
|
+
text: string;
|
|
27
|
+
}[];
|
|
28
|
+
}>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatSuccess, formatError } from "../../utils/response.js";
|
|
3
|
+
const activeTransactions = new Map();
|
|
4
|
+
export function createTransactionParams(dbIds) {
|
|
5
|
+
return {
|
|
6
|
+
database: z.enum(dbIds).describe(`Database ID. Available: ${dbIds.join(", ")}`),
|
|
7
|
+
action: z.enum(["begin", "commit", "rollback", "execute"]).describe("Transaction action"),
|
|
8
|
+
transactionId: z.string().optional().describe("Transaction ID (required for commit, rollback, execute)"),
|
|
9
|
+
statement: z.string().optional().describe("SQL statement (required for execute)"),
|
|
10
|
+
params: z.array(z.string()).optional().describe("Query parameters (for execute)"),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function transactionHandler(manager) {
|
|
14
|
+
return async (params) => {
|
|
15
|
+
try {
|
|
16
|
+
switch (params.action) {
|
|
17
|
+
case "begin": {
|
|
18
|
+
const connector = await manager.getConnector(params.database);
|
|
19
|
+
const tx = await connector.beginTransaction();
|
|
20
|
+
activeTransactions.set(tx.id, tx);
|
|
21
|
+
return formatSuccess({
|
|
22
|
+
data: { transactionId: tx.id, message: "Transaction started" },
|
|
23
|
+
database: params.database,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
case "execute": {
|
|
27
|
+
if (!params.transactionId)
|
|
28
|
+
return formatError("transactionId is required for execute");
|
|
29
|
+
if (!params.statement)
|
|
30
|
+
return formatError("statement is required for execute");
|
|
31
|
+
const tx = activeTransactions.get(params.transactionId);
|
|
32
|
+
if (!tx)
|
|
33
|
+
return formatError(`Transaction not found: ${params.transactionId}`, "TX_NOT_FOUND");
|
|
34
|
+
const result = await tx.execute(params.statement, params.params);
|
|
35
|
+
return formatSuccess({
|
|
36
|
+
rows: result.rows,
|
|
37
|
+
count: result.rowCount,
|
|
38
|
+
database: params.database,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
case "commit": {
|
|
42
|
+
if (!params.transactionId)
|
|
43
|
+
return formatError("transactionId is required for commit");
|
|
44
|
+
const tx = activeTransactions.get(params.transactionId);
|
|
45
|
+
if (!tx)
|
|
46
|
+
return formatError(`Transaction not found: ${params.transactionId}`, "TX_NOT_FOUND");
|
|
47
|
+
await tx.commit();
|
|
48
|
+
activeTransactions.delete(params.transactionId);
|
|
49
|
+
return formatSuccess({
|
|
50
|
+
data: { message: "Transaction committed" },
|
|
51
|
+
database: params.database,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
case "rollback": {
|
|
55
|
+
if (!params.transactionId)
|
|
56
|
+
return formatError("transactionId is required for rollback");
|
|
57
|
+
const tx = activeTransactions.get(params.transactionId);
|
|
58
|
+
if (!tx)
|
|
59
|
+
return formatError(`Transaction not found: ${params.transactionId}`, "TX_NOT_FOUND");
|
|
60
|
+
await tx.rollback();
|
|
61
|
+
activeTransactions.delete(params.transactionId);
|
|
62
|
+
return formatSuccess({
|
|
63
|
+
data: { message: "Transaction rolled back" },
|
|
64
|
+
database: params.database,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
default:
|
|
68
|
+
return formatError(`Unknown action: ${params.action}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return formatError(String(err));
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/tools/write/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Server } from "node:http";
|
|
2
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
3
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import type { ConnectorManager } from "../connectors/manager.js";
|
|
5
|
+
import type { AppConfig, HttpTransportConfig } from "../config/types.js";
|
|
6
|
+
interface SessionEntry {
|
|
7
|
+
transport: StreamableHTTPServerTransport;
|
|
8
|
+
server: McpServer;
|
|
9
|
+
}
|
|
10
|
+
export declare function startHttpTransport(config: AppConfig, transportConfig: HttpTransportConfig): Promise<{
|
|
11
|
+
httpServer: Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
12
|
+
manager: ConnectorManager;
|
|
13
|
+
sessions: Map<string, SessionEntry>;
|
|
14
|
+
}>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
3
|
+
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
|
|
4
|
+
import { createConnectorManager, createMcpServerInstance } from "../server.js";
|
|
5
|
+
export async function startHttpTransport(config, transportConfig) {
|
|
6
|
+
const manager = createConnectorManager(config);
|
|
7
|
+
await manager.connectEager();
|
|
8
|
+
const sessions = new Map();
|
|
9
|
+
const { host, port } = transportConfig;
|
|
10
|
+
const app = createMcpExpressApp({ host });
|
|
11
|
+
if (transportConfig.auth) {
|
|
12
|
+
const expectedToken = transportConfig.auth.token;
|
|
13
|
+
app.use("/mcp", (req, res, next) => {
|
|
14
|
+
const authHeader = req.headers.authorization;
|
|
15
|
+
if (!authHeader || authHeader !== `Bearer ${expectedToken}`) {
|
|
16
|
+
res.status(401).json({ error: "Unauthorized" });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
next();
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (transportConfig.stateless) {
|
|
23
|
+
setupStatelessRoutes(app, manager, config);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
setupStatefulRoutes(app, manager, config, sessions);
|
|
27
|
+
}
|
|
28
|
+
setupHealthEndpoint(app, manager, sessions);
|
|
29
|
+
const httpServer = await new Promise((resolve) => {
|
|
30
|
+
const server = app.listen(port, host, () => {
|
|
31
|
+
resolve(server);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
console.error(`db-view-mcp HTTP server listening on http://${host}:${port}/mcp`);
|
|
35
|
+
console.error(`Health check: http://${host}:${port}/health`);
|
|
36
|
+
if (transportConfig.stateless) {
|
|
37
|
+
console.error("Mode: stateless");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.error("Mode: stateful (session-based)");
|
|
41
|
+
}
|
|
42
|
+
return { httpServer, manager, sessions };
|
|
43
|
+
}
|
|
44
|
+
function setupStatelessRoutes(app, manager, config) {
|
|
45
|
+
app.all("/mcp", async (req, res) => {
|
|
46
|
+
const server = createMcpServerInstance(manager, config);
|
|
47
|
+
const transport = new StreamableHTTPServerTransport({
|
|
48
|
+
sessionIdGenerator: undefined,
|
|
49
|
+
});
|
|
50
|
+
await server.connect(transport);
|
|
51
|
+
await transport.handleRequest(req, res, req.body);
|
|
52
|
+
// Close after handling since stateless has no persistent sessions
|
|
53
|
+
await transport.close();
|
|
54
|
+
await server.close();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function setupStatefulRoutes(app, manager, config, sessions) {
|
|
58
|
+
app.all("/mcp", async (req, res) => {
|
|
59
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
60
|
+
if (sessionId && sessions.has(sessionId)) {
|
|
61
|
+
const session = sessions.get(sessionId);
|
|
62
|
+
await session.transport.handleRequest(req, res, req.body);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (sessionId && !sessions.has(sessionId)) {
|
|
66
|
+
res.status(404).json({ error: "Session not found" });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// New session — create McpServer + transport
|
|
70
|
+
const server = createMcpServerInstance(manager, config);
|
|
71
|
+
const transport = new StreamableHTTPServerTransport({
|
|
72
|
+
sessionIdGenerator: () => randomUUID(),
|
|
73
|
+
onsessioninitialized: (newSessionId) => {
|
|
74
|
+
sessions.set(newSessionId, { transport, server });
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
transport.onclose = () => {
|
|
78
|
+
const sid = transport.sessionId;
|
|
79
|
+
if (sid) {
|
|
80
|
+
sessions.delete(sid);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
await server.connect(transport);
|
|
84
|
+
await transport.handleRequest(req, res, req.body);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function setupHealthEndpoint(app, manager, sessions) {
|
|
88
|
+
app.get("/health", (_req, res) => {
|
|
89
|
+
res.json({
|
|
90
|
+
status: "ok",
|
|
91
|
+
activeSessions: sessions.size,
|
|
92
|
+
databases: manager.getDatabaseIds(),
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface SuccessResponse {
|
|
2
|
+
success: true;
|
|
3
|
+
rows?: Record<string, unknown>[];
|
|
4
|
+
count?: number;
|
|
5
|
+
database?: string;
|
|
6
|
+
data?: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface ErrorResponse {
|
|
9
|
+
success: false;
|
|
10
|
+
error: string;
|
|
11
|
+
code?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function formatSuccess(data: Omit<SuccessResponse, "success">): {
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
export declare function formatError(error: string, code?: string): {
|
|
20
|
+
content: {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
isError: true;
|
|
25
|
+
};
|
|
26
|
+
export declare function formatRows(rows: Record<string, unknown>[], database: string): {
|
|
27
|
+
content: {
|
|
28
|
+
type: "text";
|
|
29
|
+
text: string;
|
|
30
|
+
}[];
|
|
31
|
+
};
|