@zlash65/postgres-ssh-mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/dist/config.d.ts +3 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +122 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/connection/host-key-verifier.d.ts +13 -0
  8. package/dist/connection/host-key-verifier.d.ts.map +1 -0
  9. package/dist/connection/host-key-verifier.js +127 -0
  10. package/dist/connection/host-key-verifier.js.map +1 -0
  11. package/dist/connection/index.d.ts +7 -0
  12. package/dist/connection/index.d.ts.map +1 -0
  13. package/dist/connection/index.js +7 -0
  14. package/dist/connection/index.js.map +1 -0
  15. package/dist/connection/postgres-pool.d.ts +23 -0
  16. package/dist/connection/postgres-pool.d.ts.map +1 -0
  17. package/dist/connection/postgres-pool.js +295 -0
  18. package/dist/connection/postgres-pool.js.map +1 -0
  19. package/dist/connection/ssh-tunnel.d.ts +34 -0
  20. package/dist/connection/ssh-tunnel.d.ts.map +1 -0
  21. package/dist/connection/ssh-tunnel.js +295 -0
  22. package/dist/connection/ssh-tunnel.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +67 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lib/obfuscate.d.ts +2 -0
  28. package/dist/lib/obfuscate.d.ts.map +1 -0
  29. package/dist/lib/obfuscate.js +13 -0
  30. package/dist/lib/obfuscate.js.map +1 -0
  31. package/dist/lib/sql-validator.d.ts +6 -0
  32. package/dist/lib/sql-validator.d.ts.map +1 -0
  33. package/dist/lib/sql-validator.js +684 -0
  34. package/dist/lib/sql-validator.js.map +1 -0
  35. package/dist/lib/tool-response.d.ts +5 -0
  36. package/dist/lib/tool-response.d.ts.map +1 -0
  37. package/dist/lib/tool-response.js +30 -0
  38. package/dist/lib/tool-response.js.map +1 -0
  39. package/dist/server.d.ts +8 -0
  40. package/dist/server.d.ts.map +1 -0
  41. package/dist/server.js +24 -0
  42. package/dist/server.js.map +1 -0
  43. package/dist/tools/admin.d.ts +4 -0
  44. package/dist/tools/admin.d.ts.map +1 -0
  45. package/dist/tools/admin.js +184 -0
  46. package/dist/tools/admin.js.map +1 -0
  47. package/dist/tools/index.d.ts +8 -0
  48. package/dist/tools/index.d.ts.map +1 -0
  49. package/dist/tools/index.js +8 -0
  50. package/dist/tools/index.js.map +1 -0
  51. package/dist/tools/query.d.ts +4 -0
  52. package/dist/tools/query.d.ts.map +1 -0
  53. package/dist/tools/query.js +65 -0
  54. package/dist/tools/query.js.map +1 -0
  55. package/dist/tools/schema.d.ts +4 -0
  56. package/dist/tools/schema.d.ts.map +1 -0
  57. package/dist/tools/schema.js +189 -0
  58. package/dist/tools/schema.js.map +1 -0
  59. package/dist/types.d.ts +93 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { parseConfig } from './config.js';
4
+ import { ConnectionManager } from './connection/postgres-pool.js';
5
+ import { createServer } from './server.js';
6
+ import { obfuscateConnectionString } from './lib/obfuscate.js';
7
+ async function main() {
8
+ console.error('[postgres-mcp] Starting server...');
9
+ let cleanup = null;
10
+ try {
11
+ const config = parseConfig();
12
+ const connectionManager = new ConnectionManager(config);
13
+ await connectionManager.initialize();
14
+ const { server, cleanup: serverCleanup } = createServer(connectionManager);
15
+ cleanup = serverCleanup;
16
+ const handleShutdown = async (signal) => {
17
+ console.error(`[postgres-mcp] Received ${signal}, shutting down...`);
18
+ if (cleanup) {
19
+ try {
20
+ await cleanup();
21
+ }
22
+ catch (err) {
23
+ console.error('[postgres-mcp] Error during cleanup:', err);
24
+ }
25
+ }
26
+ process.exit(0);
27
+ };
28
+ process.on('SIGINT', () => handleShutdown('SIGINT'));
29
+ process.on('SIGTERM', () => handleShutdown('SIGTERM'));
30
+ process.on('uncaughtException', (err) => {
31
+ console.error('[postgres-mcp] Uncaught exception:', obfuscateConnectionString(err.message));
32
+ console.error(err.stack);
33
+ process.exit(1);
34
+ });
35
+ process.on('unhandledRejection', (reason) => {
36
+ const message = reason instanceof Error ? reason.message : String(reason);
37
+ console.error('[postgres-mcp] Unhandled rejection:', obfuscateConnectionString(message));
38
+ process.exit(1);
39
+ });
40
+ const transport = new StdioServerTransport();
41
+ await server.connect(transport);
42
+ console.error('[postgres-mcp] Server running on STDIO');
43
+ console.error(`[postgres-mcp] Mode: ${config.readOnly ? 'read-only' : 'read-write'}`);
44
+ console.error(`[postgres-mcp] Max rows per query: ${config.maxRows}`);
45
+ if (config.ssh) {
46
+ console.error('[postgres-mcp] SSH tunnel: enabled');
47
+ }
48
+ }
49
+ catch (err) {
50
+ const message = err instanceof Error ? err.message : String(err);
51
+ console.error('[postgres-mcp] Fatal error:', obfuscateConnectionString(message));
52
+ if (cleanup) {
53
+ try {
54
+ await cleanup();
55
+ }
56
+ catch {
57
+ // Ignore cleanup errors during fatal shutdown
58
+ }
59
+ }
60
+ process.exit(1);
61
+ }
62
+ }
63
+ main().catch((err) => {
64
+ console.error('[postgres-mcp] Failed to start:', err);
65
+ process.exit(1);
66
+ });
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function obfuscateConnectionString(str: string): string;
2
+ //# sourceMappingURL=obfuscate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscate.d.ts","sourceRoot":"","sources":["../../src/lib/obfuscate.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW7D"}
@@ -0,0 +1,13 @@
1
+ export function obfuscateConnectionString(str) {
2
+ return str
3
+ .replace(/:([^:@/]+)@/g, ':****@')
4
+ .replace(/password[=:]\s*\S+/gi, 'password=****')
5
+ .replace(/privateKey[=:]\s*\S+/gi, 'privateKey=****')
6
+ .replace(/privatekey[=:]\s*\S+/gi, 'privateKey=****')
7
+ .replace(/passphrase[=:]\s*\S+/gi, 'passphrase=****')
8
+ .replace(/secret[=:]\s*\S+/gi, 'secret=****')
9
+ .replace(/token[=:]\s*\S+/gi, 'token=****')
10
+ .replace(/api[_-]?key[=:]\s*\S+/gi, 'apiKey=****')
11
+ .replace(/authorization[=:]\s*\S+/gi, 'authorization=****');
12
+ }
13
+ //# sourceMappingURL=obfuscate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscate.js","sourceRoot":"","sources":["../../src/lib/obfuscate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,OAAO,GAAG;SACP,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;SACjC,OAAO,CAAC,sBAAsB,EAAE,eAAe,CAAC;SAChD,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,CAAC;SACpD,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,CAAC;SACpD,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,CAAC;SACpD,OAAO,CAAC,oBAAoB,EAAE,aAAa,CAAC;SAC5C,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC;SAC1C,OAAO,CAAC,yBAAyB,EAAE,aAAa,CAAC;SACjD,OAAO,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function validateReadOnlyStatement(sql: string): void;
2
+ export declare function cteContainsDML(sql: string): boolean;
3
+ export declare function extractFinalStatementAfterCTEs(sql: string): string | null;
4
+ export declare function stripLeadingComments(sql: string): string;
5
+ export declare function getFirstKeyword(sql: string): string | null;
6
+ //# sourceMappingURL=sql-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-validator.d.ts","sourceRoot":"","sources":["../../src/lib/sql-validator.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAoE3D;AAiOD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgDnD;AA2GD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqHzE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBxD;AAoMD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ1D"}