@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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/config.example.json +41 -0
  4. package/dist/config/loader.d.ts +6 -0
  5. package/dist/config/loader.js +28 -0
  6. package/dist/config/loader.js.map +1 -0
  7. package/dist/config/types.d.ts +149 -0
  8. package/dist/config/types.js +73 -0
  9. package/dist/config/types.js.map +1 -0
  10. package/dist/connectors/clickhouse.d.ts +20 -0
  11. package/dist/connectors/clickhouse.js +95 -0
  12. package/dist/connectors/clickhouse.js.map +1 -0
  13. package/dist/connectors/interface.d.ts +37 -0
  14. package/dist/connectors/interface.js +2 -0
  15. package/dist/connectors/interface.js.map +1 -0
  16. package/dist/connectors/manager.d.ts +14 -0
  17. package/dist/connectors/manager.js +51 -0
  18. package/dist/connectors/manager.js.map +1 -0
  19. package/dist/connectors/postgresql.d.ts +20 -0
  20. package/dist/connectors/postgresql.js +138 -0
  21. package/dist/connectors/postgresql.js.map +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +43 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/server.d.ts +9 -0
  26. package/dist/server.js +23 -0
  27. package/dist/server.js.map +1 -0
  28. package/dist/tools/readonly/describe-table.d.ts +19 -0
  29. package/dist/tools/readonly/describe-table.js +22 -0
  30. package/dist/tools/readonly/describe-table.js.map +1 -0
  31. package/dist/tools/readonly/explain.d.ts +17 -0
  32. package/dist/tools/readonly/explain.js +26 -0
  33. package/dist/tools/readonly/explain.js.map +1 -0
  34. package/dist/tools/readonly/list-databases.d.ts +7 -0
  35. package/dist/tools/readonly/list-databases.js +12 -0
  36. package/dist/tools/readonly/list-databases.js.map +1 -0
  37. package/dist/tools/readonly/list-tables.d.ts +17 -0
  38. package/dist/tools/readonly/list-tables.js +21 -0
  39. package/dist/tools/readonly/list-tables.js.map +1 -0
  40. package/dist/tools/readonly/performance.d.ts +43 -0
  41. package/dist/tools/readonly/performance.js +72 -0
  42. package/dist/tools/readonly/performance.js.map +1 -0
  43. package/dist/tools/readonly/query.d.ts +19 -0
  44. package/dist/tools/readonly/query.js +27 -0
  45. package/dist/tools/readonly/query.js.map +1 -0
  46. package/dist/tools/readonly/schema.d.ts +15 -0
  47. package/dist/tools/readonly/schema.js +20 -0
  48. package/dist/tools/readonly/schema.js.map +1 -0
  49. package/dist/tools/registry.d.ts +4 -0
  50. package/dist/tools/registry.js +56 -0
  51. package/dist/tools/registry.js.map +1 -0
  52. package/dist/tools/write/execute.d.ts +19 -0
  53. package/dist/tools/write/execute.js +26 -0
  54. package/dist/tools/write/execute.js.map +1 -0
  55. package/dist/tools/write/transaction.d.ts +28 -0
  56. package/dist/tools/write/transaction.js +76 -0
  57. package/dist/tools/write/transaction.js.map +1 -0
  58. package/dist/transport/http.d.ts +15 -0
  59. package/dist/transport/http.js +96 -0
  60. package/dist/transport/http.js.map +1 -0
  61. package/dist/utils/response.d.ts +31 -0
  62. package/dist/utils/response.js +25 -0
  63. package/dist/utils/response.js.map +1 -0
  64. package/dist/utils/sql-validator.d.ts +5 -0
  65. package/dist/utils/sql-validator.js +36 -0
  66. package/dist/utils/sql-validator.js.map +1 -0
  67. package/package.json +41 -0
@@ -0,0 +1,25 @@
1
+ export function formatSuccess(data) {
2
+ return {
3
+ content: [
4
+ {
5
+ type: "text",
6
+ text: JSON.stringify({ success: true, ...data }, null, 2),
7
+ },
8
+ ],
9
+ };
10
+ }
11
+ export function formatError(error, code) {
12
+ return {
13
+ content: [
14
+ {
15
+ type: "text",
16
+ text: JSON.stringify({ success: false, error, code }, null, 2),
17
+ },
18
+ ],
19
+ isError: true,
20
+ };
21
+ }
22
+ export function formatRows(rows, database) {
23
+ return formatSuccess({ rows, count: rows.length, database });
24
+ }
25
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,aAAa,CAAC,IAAsC;IAClE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC1D;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAa;IACtD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC/D;SACF;QACD,OAAO,EAAE,IAAa;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAA+B,EAAE,QAAgB;IAC1E,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ error?: string;
4
+ }
5
+ export declare function validateReadonlySql(sql: string): ValidationResult;
@@ -0,0 +1,36 @@
1
+ const WRITE_KEYWORDS = [
2
+ "INSERT",
3
+ "UPDATE",
4
+ "DELETE",
5
+ "DROP",
6
+ "ALTER",
7
+ "TRUNCATE",
8
+ "CREATE",
9
+ "GRANT",
10
+ "REVOKE",
11
+ "REPLACE",
12
+ "MERGE",
13
+ ];
14
+ const WRITE_PATTERN = new RegExp(`^\\s*(${WRITE_KEYWORDS.join("|")})\\b`, "i");
15
+ const MULTI_STATEMENT_PATTERN = /;\s*\S/;
16
+ export function validateReadonlySql(sql) {
17
+ const trimmed = sql.trim();
18
+ if (!trimmed) {
19
+ return { valid: false, error: "Empty SQL statement" };
20
+ }
21
+ if (MULTI_STATEMENT_PATTERN.test(trimmed)) {
22
+ return {
23
+ valid: false,
24
+ error: "Multiple statements are not allowed in read-only mode",
25
+ };
26
+ }
27
+ if (WRITE_PATTERN.test(trimmed)) {
28
+ const match = trimmed.match(/^\s*(\w+)/);
29
+ return {
30
+ valid: false,
31
+ error: `Statement '${match?.[1]?.toUpperCase()}' is not allowed in read-only mode`,
32
+ };
33
+ }
34
+ return { valid: true };
35
+ }
36
+ //# sourceMappingURL=sql-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-validator.js","sourceRoot":"","sources":["../../src/utils/sql-validator.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;CACR,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,MAAM,CAC9B,SAAS,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EACvC,GAAG,CACJ,CAAC;AAEF,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAOzC,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,uDAAuD;SAC/D,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,oCAAoC;SACnF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@conte777/db-view-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for database access (PostgreSQL + ClickHouse)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "db-view-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "config.example.json"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsx src/index.ts",
17
+ "start": "node dist/index.js",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "database",
23
+ "postgresql",
24
+ "clickhouse"
25
+ ],
26
+ "license": "MIT",
27
+ "dependencies": {
28
+ "@clickhouse/client": "^1.17.0",
29
+ "@modelcontextprotocol/sdk": "^1.26.0",
30
+ "express": "^5.2.1",
31
+ "pg": "^8.18.0",
32
+ "zod": "^4.3.6"
33
+ },
34
+ "devDependencies": {
35
+ "@types/express": "^5.0.3",
36
+ "@types/node": "^25.2.3",
37
+ "@types/pg": "^8.16.0",
38
+ "tsx": "^4.21.0",
39
+ "typescript": "^5.9.3"
40
+ }
41
+ }