@neverinfamous/postgres-mcp 1.3.0 → 2.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 (226) hide show
  1. package/README.md +177 -129
  2. package/dist/__tests__/benchmarks/codemode.bench.d.ts +10 -0
  3. package/dist/__tests__/benchmarks/codemode.bench.d.ts.map +1 -0
  4. package/dist/__tests__/benchmarks/codemode.bench.js +159 -0
  5. package/dist/__tests__/benchmarks/codemode.bench.js.map +1 -0
  6. package/dist/__tests__/benchmarks/connection-pool.bench.d.ts +10 -0
  7. package/dist/__tests__/benchmarks/connection-pool.bench.d.ts.map +1 -0
  8. package/dist/__tests__/benchmarks/connection-pool.bench.js +123 -0
  9. package/dist/__tests__/benchmarks/connection-pool.bench.js.map +1 -0
  10. package/dist/__tests__/benchmarks/handler-dispatch.bench.d.ts +11 -0
  11. package/dist/__tests__/benchmarks/handler-dispatch.bench.d.ts.map +1 -0
  12. package/dist/__tests__/benchmarks/handler-dispatch.bench.js +199 -0
  13. package/dist/__tests__/benchmarks/handler-dispatch.bench.js.map +1 -0
  14. package/dist/__tests__/benchmarks/logger-sanitization.bench.d.ts +15 -0
  15. package/dist/__tests__/benchmarks/logger-sanitization.bench.d.ts.map +1 -0
  16. package/dist/__tests__/benchmarks/logger-sanitization.bench.js +155 -0
  17. package/dist/__tests__/benchmarks/logger-sanitization.bench.js.map +1 -0
  18. package/dist/__tests__/benchmarks/resource-prompts.bench.d.ts +10 -0
  19. package/dist/__tests__/benchmarks/resource-prompts.bench.d.ts.map +1 -0
  20. package/dist/__tests__/benchmarks/resource-prompts.bench.js +181 -0
  21. package/dist/__tests__/benchmarks/resource-prompts.bench.js.map +1 -0
  22. package/dist/__tests__/benchmarks/schema-parsing.bench.d.ts +11 -0
  23. package/dist/__tests__/benchmarks/schema-parsing.bench.d.ts.map +1 -0
  24. package/dist/__tests__/benchmarks/schema-parsing.bench.js +209 -0
  25. package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -0
  26. package/dist/__tests__/benchmarks/tool-filtering.bench.d.ts +9 -0
  27. package/dist/__tests__/benchmarks/tool-filtering.bench.d.ts.map +1 -0
  28. package/dist/__tests__/benchmarks/tool-filtering.bench.js +83 -0
  29. package/dist/__tests__/benchmarks/tool-filtering.bench.js.map +1 -0
  30. package/dist/__tests__/benchmarks/transport-auth.bench.d.ts +10 -0
  31. package/dist/__tests__/benchmarks/transport-auth.bench.d.ts.map +1 -0
  32. package/dist/__tests__/benchmarks/transport-auth.bench.js +128 -0
  33. package/dist/__tests__/benchmarks/transport-auth.bench.js.map +1 -0
  34. package/dist/__tests__/benchmarks/utilities.bench.d.ts +10 -0
  35. package/dist/__tests__/benchmarks/utilities.bench.d.ts.map +1 -0
  36. package/dist/__tests__/benchmarks/utilities.bench.js +164 -0
  37. package/dist/__tests__/benchmarks/utilities.bench.js.map +1 -0
  38. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  39. package/dist/adapters/DatabaseAdapter.js +12 -0
  40. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  41. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
  42. package/dist/adapters/postgresql/PostgresAdapter.js +3 -0
  43. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
  44. package/dist/adapters/postgresql/schemas/backup.d.ts +37 -23
  45. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
  46. package/dist/adapters/postgresql/schemas/backup.js +53 -22
  47. package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
  48. package/dist/adapters/postgresql/schemas/extensions.d.ts +56 -37
  49. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -1
  50. package/dist/adapters/postgresql/schemas/extensions.js +68 -36
  51. package/dist/adapters/postgresql/schemas/extensions.js.map +1 -1
  52. package/dist/adapters/postgresql/schemas/index.d.ts +3 -2
  53. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
  54. package/dist/adapters/postgresql/schemas/index.js +8 -2
  55. package/dist/adapters/postgresql/schemas/index.js.map +1 -1
  56. package/dist/adapters/postgresql/schemas/introspection.d.ts +445 -0
  57. package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -0
  58. package/dist/adapters/postgresql/schemas/introspection.js +478 -0
  59. package/dist/adapters/postgresql/schemas/introspection.js.map +1 -0
  60. package/dist/adapters/postgresql/schemas/jsonb.d.ts +8 -0
  61. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -1
  62. package/dist/adapters/postgresql/schemas/jsonb.js +26 -2
  63. package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -1
  64. package/dist/adapters/postgresql/schemas/monitoring.d.ts +41 -25
  65. package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -1
  66. package/dist/adapters/postgresql/schemas/monitoring.js +49 -16
  67. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
  68. package/dist/adapters/postgresql/schemas/partitioning.d.ts +16 -20
  69. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
  70. package/dist/adapters/postgresql/schemas/partitioning.js +21 -10
  71. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
  72. package/dist/adapters/postgresql/schemas/partman.d.ts +69 -0
  73. package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
  74. package/dist/adapters/postgresql/schemas/partman.js +46 -33
  75. package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
  76. package/dist/adapters/postgresql/schemas/performance.d.ts +37 -19
  77. package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -1
  78. package/dist/adapters/postgresql/schemas/performance.js +54 -12
  79. package/dist/adapters/postgresql/schemas/performance.js.map +1 -1
  80. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -1
  81. package/dist/adapters/postgresql/schemas/postgis.js +20 -0
  82. package/dist/adapters/postgresql/schemas/postgis.js.map +1 -1
  83. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +15 -7
  84. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
  85. package/dist/adapters/postgresql/schemas/schema-mgmt.js +36 -7
  86. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
  87. package/dist/adapters/postgresql/schemas/text-search.d.ts +26 -14
  88. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
  89. package/dist/adapters/postgresql/schemas/text-search.js +41 -9
  90. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
  91. package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -1
  92. package/dist/adapters/postgresql/tools/admin.js +82 -67
  93. package/dist/adapters/postgresql/tools/admin.js.map +1 -1
  94. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
  95. package/dist/adapters/postgresql/tools/backup/dump.js +27 -24
  96. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
  97. package/dist/adapters/postgresql/tools/citext.js +114 -82
  98. package/dist/adapters/postgresql/tools/citext.js.map +1 -1
  99. package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -1
  100. package/dist/adapters/postgresql/tools/codemode/index.js +2 -11
  101. package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
  102. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
  103. package/dist/adapters/postgresql/tools/core/convenience.js +23 -8
  104. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
  105. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
  106. package/dist/adapters/postgresql/tools/core/indexes.js +3 -2
  107. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
  108. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
  109. package/dist/adapters/postgresql/tools/core/tables.js +4 -4
  110. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
  111. package/dist/adapters/postgresql/tools/cron.js +59 -27
  112. package/dist/adapters/postgresql/tools/cron.js.map +1 -1
  113. package/dist/adapters/postgresql/tools/introspection.d.ts +15 -0
  114. package/dist/adapters/postgresql/tools/introspection.d.ts.map +1 -0
  115. package/dist/adapters/postgresql/tools/introspection.js +1682 -0
  116. package/dist/adapters/postgresql/tools/introspection.js.map +1 -0
  117. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -1
  118. package/dist/adapters/postgresql/tools/jsonb/advanced.js +26 -17
  119. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -1
  120. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -1
  121. package/dist/adapters/postgresql/tools/jsonb/basic.js +92 -23
  122. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -1
  123. package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -1
  124. package/dist/adapters/postgresql/tools/ltree.js +17 -4
  125. package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
  126. package/dist/adapters/postgresql/tools/monitoring.js +32 -21
  127. package/dist/adapters/postgresql/tools/monitoring.js.map +1 -1
  128. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
  129. package/dist/adapters/postgresql/tools/partman/management.js +32 -52
  130. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
  131. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
  132. package/dist/adapters/postgresql/tools/partman/operations.js +5 -5
  133. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
  134. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
  135. package/dist/adapters/postgresql/tools/performance/analysis.js +15 -8
  136. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
  137. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
  138. package/dist/adapters/postgresql/tools/performance/monitoring.js +10 -7
  139. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
  140. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
  141. package/dist/adapters/postgresql/tools/performance/stats.js +62 -28
  142. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
  143. package/dist/adapters/postgresql/tools/pgcrypto.js +31 -11
  144. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
  145. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -1
  146. package/dist/adapters/postgresql/tools/postgis/advanced.js +30 -25
  147. package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -1
  148. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
  149. package/dist/adapters/postgresql/tools/postgis/basic.js +24 -15
  150. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
  151. package/dist/adapters/postgresql/tools/schema.js +79 -5
  152. package/dist/adapters/postgresql/tools/schema.js.map +1 -1
  153. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
  154. package/dist/adapters/postgresql/tools/stats/advanced.js +61 -39
  155. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
  156. package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -1
  157. package/dist/adapters/postgresql/tools/stats/basic.js +45 -30
  158. package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -1
  159. package/dist/adapters/postgresql/tools/text.js +327 -148
  160. package/dist/adapters/postgresql/tools/text.js.map +1 -1
  161. package/dist/auth/auth-context.d.ts +28 -0
  162. package/dist/auth/auth-context.d.ts.map +1 -0
  163. package/dist/auth/auth-context.js +37 -0
  164. package/dist/auth/auth-context.js.map +1 -0
  165. package/dist/auth/scope-map.d.ts +20 -0
  166. package/dist/auth/scope-map.d.ts.map +1 -0
  167. package/dist/auth/scope-map.js +40 -0
  168. package/dist/auth/scope-map.js.map +1 -0
  169. package/dist/auth/scopes.d.ts.map +1 -1
  170. package/dist/auth/scopes.js +2 -0
  171. package/dist/auth/scopes.js.map +1 -1
  172. package/dist/cli.js +1 -1
  173. package/dist/cli.js.map +1 -1
  174. package/dist/codemode/api.d.ts +1 -0
  175. package/dist/codemode/api.d.ts.map +1 -1
  176. package/dist/codemode/api.js +34 -0
  177. package/dist/codemode/api.js.map +1 -1
  178. package/dist/codemode/index.d.ts +0 -2
  179. package/dist/codemode/index.d.ts.map +1 -1
  180. package/dist/codemode/index.js +0 -4
  181. package/dist/codemode/index.js.map +1 -1
  182. package/dist/codemode/sandbox.d.ts +14 -1
  183. package/dist/codemode/sandbox.d.ts.map +1 -1
  184. package/dist/codemode/sandbox.js +58 -19
  185. package/dist/codemode/sandbox.js.map +1 -1
  186. package/dist/codemode/types.d.ts.map +1 -1
  187. package/dist/codemode/types.js +3 -0
  188. package/dist/codemode/types.js.map +1 -1
  189. package/dist/constants/ServerInstructions.d.ts +5 -1
  190. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  191. package/dist/constants/ServerInstructions.js +91 -43
  192. package/dist/constants/ServerInstructions.js.map +1 -1
  193. package/dist/filtering/ToolConstants.d.ts +22 -19
  194. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  195. package/dist/filtering/ToolConstants.js +48 -37
  196. package/dist/filtering/ToolConstants.js.map +1 -1
  197. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  198. package/dist/filtering/ToolFilter.js +10 -13
  199. package/dist/filtering/ToolFilter.js.map +1 -1
  200. package/dist/pool/ConnectionPool.js +1 -1
  201. package/dist/pool/ConnectionPool.js.map +1 -1
  202. package/dist/transports/http.d.ts +1 -0
  203. package/dist/transports/http.d.ts.map +1 -1
  204. package/dist/transports/http.js +75 -21
  205. package/dist/transports/http.js.map +1 -1
  206. package/dist/types/filtering.d.ts +2 -2
  207. package/dist/types/filtering.d.ts.map +1 -1
  208. package/dist/utils/icons.d.ts.map +1 -1
  209. package/dist/utils/icons.js +5 -0
  210. package/dist/utils/icons.js.map +1 -1
  211. package/dist/utils/where-clause.d.ts.map +1 -1
  212. package/dist/utils/where-clause.js +24 -0
  213. package/dist/utils/where-clause.js.map +1 -1
  214. package/package.json +15 -12
  215. package/dist/codemode/sandbox-factory.d.ts +0 -72
  216. package/dist/codemode/sandbox-factory.d.ts.map +0 -1
  217. package/dist/codemode/sandbox-factory.js +0 -88
  218. package/dist/codemode/sandbox-factory.js.map +0 -1
  219. package/dist/codemode/worker-sandbox.d.ts +0 -82
  220. package/dist/codemode/worker-sandbox.d.ts.map +0 -1
  221. package/dist/codemode/worker-sandbox.js +0 -244
  222. package/dist/codemode/worker-sandbox.js.map +0 -1
  223. package/dist/codemode/worker-script.d.ts +0 -8
  224. package/dist/codemode/worker-script.d.ts.map +0 -1
  225. package/dist/codemode/worker-script.js +0 -113
  226. package/dist/codemode/worker-script.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ /**
2
+ * postgres-mcp - Connection Pool Performance Benchmarks
3
+ *
4
+ * Measures overhead of pool operations using mocked pg internals
5
+ * to isolate framework cost from database latency.
6
+ *
7
+ * Run: npm run bench
8
+ */
9
+ import { describe, bench, beforeEach, afterEach, vi } from "vitest";
10
+ // ---------------------------------------------------------------------------
11
+ // Mock pg.Pool
12
+ // ---------------------------------------------------------------------------
13
+ const mockClientQuery = vi.fn();
14
+ const mockClientRelease = vi.fn();
15
+ const mockPoolConnect = vi.fn();
16
+ const mockPoolQuery = vi.fn();
17
+ const mockPoolEnd = vi.fn();
18
+ const mockPoolOn = vi.fn();
19
+ vi.mock("pg", () => {
20
+ const MockPool = function () {
21
+ return {
22
+ connect: mockPoolConnect,
23
+ query: mockPoolQuery,
24
+ end: mockPoolEnd,
25
+ on: mockPoolOn,
26
+ get totalCount() {
27
+ return 5;
28
+ },
29
+ get idleCount() {
30
+ return 3;
31
+ },
32
+ get waitingCount() {
33
+ return 0;
34
+ },
35
+ };
36
+ };
37
+ return { default: { Pool: MockPool } };
38
+ });
39
+ // Suppress logger stderr output during benchmarks
40
+ vi.mock("../../utils/logger.js", () => ({
41
+ logger: {
42
+ debug: vi.fn(),
43
+ info: vi.fn(),
44
+ warn: vi.fn(),
45
+ warning: vi.fn(),
46
+ error: vi.fn(),
47
+ notice: vi.fn(),
48
+ critical: vi.fn(),
49
+ alert: vi.fn(),
50
+ emergency: vi.fn(),
51
+ setLevel: vi.fn(),
52
+ setMcpServer: vi.fn(),
53
+ },
54
+ }));
55
+ // Import after mocking
56
+ import { ConnectionPool } from "../../pool/ConnectionPool.js";
57
+ describe("Connection Pool Benchmarks", () => {
58
+ let pool;
59
+ beforeEach(async () => {
60
+ vi.clearAllMocks();
61
+ mockClientQuery.mockResolvedValue({
62
+ rows: [{ version: "PostgreSQL 18.1" }],
63
+ });
64
+ mockClientRelease.mockReturnValue(undefined);
65
+ mockPoolConnect.mockResolvedValue({
66
+ query: mockClientQuery,
67
+ release: mockClientRelease,
68
+ });
69
+ mockPoolQuery.mockResolvedValue({
70
+ rows: [{ version: "PostgreSQL 18.1", current_database: "testdb" }],
71
+ rowCount: 1,
72
+ command: "SELECT",
73
+ fields: [],
74
+ });
75
+ mockPoolEnd.mockResolvedValue(undefined);
76
+ pool = new ConnectionPool({
77
+ host: "localhost",
78
+ port: 5432,
79
+ user: "test",
80
+ password: "test",
81
+ database: "testdb",
82
+ });
83
+ await pool.initialize();
84
+ });
85
+ afterEach(async () => {
86
+ if (pool.isInitialized()) {
87
+ await pool.shutdown();
88
+ }
89
+ });
90
+ // -------------------------------------------------------------------------
91
+ // 1. getStats() — called on every query, must be sub-microsecond
92
+ // -------------------------------------------------------------------------
93
+ bench("getStats() overhead", () => {
94
+ pool.getStats();
95
+ }, { iterations: 10000, warmupIterations: 100 });
96
+ // -------------------------------------------------------------------------
97
+ // 2. query() wrapper overhead — isolate pool.query from real pg
98
+ // -------------------------------------------------------------------------
99
+ bench("query() framework overhead", async () => {
100
+ await pool.query("SELECT 1");
101
+ }, { iterations: 1000, warmupIterations: 20 });
102
+ // -------------------------------------------------------------------------
103
+ // 3. getConnection() + releaseConnection() round trip
104
+ // -------------------------------------------------------------------------
105
+ bench("getConnection/releaseConnection round trip", async () => {
106
+ const client = await pool.getConnection();
107
+ pool.releaseConnection(client);
108
+ }, { iterations: 1000, warmupIterations: 20 });
109
+ // -------------------------------------------------------------------------
110
+ // 4. checkHealth() overhead (includes a mocked SELECT query)
111
+ // -------------------------------------------------------------------------
112
+ bench("checkHealth() overhead", async () => {
113
+ await pool.checkHealth();
114
+ }, { iterations: 500, warmupIterations: 10 });
115
+ // -------------------------------------------------------------------------
116
+ // 5. isInitialized() / isClosing() — micro-operations used in guards
117
+ // -------------------------------------------------------------------------
118
+ bench("isInitialized + isClosing guards", () => {
119
+ pool.isInitialized();
120
+ pool.isClosing();
121
+ }, { iterations: 10000, warmupIterations: 100 });
122
+ });
123
+ //# sourceMappingURL=connection-pool.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-pool.bench.js","sourceRoot":"","sources":["../../../src/__tests__/benchmarks/connection-pool.bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * postgres-mcp - Handler Dispatch Performance Benchmarks
3
+ *
4
+ * Measures the framework overhead between MCP request receipt and
5
+ * handler function invocation: tool lookup, error construction,
6
+ * and progress notification overhead.
7
+ *
8
+ * Run: npm run bench
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=handler-dispatch.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-dispatch.bench.d.ts","sourceRoot":"","sources":["../../../src/__tests__/benchmarks/handler-dispatch.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * postgres-mcp - Handler Dispatch Performance Benchmarks
3
+ *
4
+ * Measures the framework overhead between MCP request receipt and
5
+ * handler function invocation: tool lookup, error construction,
6
+ * and progress notification overhead.
7
+ *
8
+ * Run: npm run bench
9
+ */
10
+ import { describe, bench, vi } from "vitest";
11
+ // Suppress logger output
12
+ vi.mock("../../utils/logger.js", () => ({
13
+ logger: {
14
+ debug: vi.fn(),
15
+ info: vi.fn(),
16
+ warn: vi.fn(),
17
+ warning: vi.fn(),
18
+ error: vi.fn(),
19
+ notice: vi.fn(),
20
+ critical: vi.fn(),
21
+ alert: vi.fn(),
22
+ emergency: vi.fn(),
23
+ setLevel: vi.fn(),
24
+ setMcpServer: vi.fn(),
25
+ },
26
+ }));
27
+ // ---------------------------------------------------------------------------
28
+ // Simulated Tool Registry (Map-based lookup, same pattern as DatabaseAdapter)
29
+ // ---------------------------------------------------------------------------
30
+ const toolRegistry = new Map();
31
+ const toolNames = [
32
+ "pg_read_query",
33
+ "pg_write_query",
34
+ "pg_list_tables",
35
+ "pg_describe_table",
36
+ "pg_create_table",
37
+ "pg_drop_table",
38
+ "pg_create_index",
39
+ "pg_get_indexes",
40
+ "pg_upsert",
41
+ "pg_count",
42
+ "pg_exists",
43
+ "pg_batch_insert",
44
+ "pg_truncate",
45
+ "pg_jsonb_extract",
46
+ "pg_jsonb_set",
47
+ "pg_jsonb_merge",
48
+ "pg_jsonb_array_append",
49
+ "pg_vec_search",
50
+ "pg_vec_upsert",
51
+ "pg_distance",
52
+ "pg_spatial_relate",
53
+ "pg_execute_code",
54
+ "pg_transaction_begin",
55
+ "pg_transaction_commit",
56
+ "pg_transaction_rollback",
57
+ "pg_explain_analyze",
58
+ "pg_stat_statements",
59
+ "pg_analyze_db_health",
60
+ ];
61
+ for (const name of toolNames) {
62
+ toolRegistry.set(name, {
63
+ name,
64
+ description: `Tool ${name}`,
65
+ group: "core",
66
+ inputSchema: { type: "object", properties: {} },
67
+ handler: () => Promise.resolve({ content: [{ type: "text", text: "ok" }] }),
68
+ });
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Simulated Handler Map (Map<string, Function>)
72
+ // ---------------------------------------------------------------------------
73
+ const handlerMap = new Map();
74
+ for (const name of toolNames) {
75
+ handlerMap.set(name, () => ({
76
+ content: [{ type: "text", text: JSON.stringify({ success: true }) }],
77
+ }));
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // 1. Tool Lookup by Name
81
+ // ---------------------------------------------------------------------------
82
+ describe("Tool Lookup by Name", () => {
83
+ bench("Map.get() single — pg_read_query", () => {
84
+ handlerMap.get("pg_read_query");
85
+ }, { iterations: 50000, warmupIterations: 500 });
86
+ bench("Map.get() x28 tools (full registry scan)", () => {
87
+ for (const name of toolNames) {
88
+ handlerMap.get(name);
89
+ }
90
+ }, { iterations: 10000, warmupIterations: 100 });
91
+ bench("Map.has() unknown tool", () => {
92
+ handlerMap.has("pg_nonexistent_tool");
93
+ }, { iterations: 50000, warmupIterations: 500 });
94
+ bench("toolRegistry.get() → definition access", () => {
95
+ const def = toolRegistry.get("pg_read_query");
96
+ if (def) {
97
+ void def.name;
98
+ void def.group;
99
+ void def.inputSchema;
100
+ }
101
+ }, { iterations: 30000, warmupIterations: 300 });
102
+ });
103
+ // ---------------------------------------------------------------------------
104
+ // 2. Error Response Construction (P154)
105
+ // ---------------------------------------------------------------------------
106
+ describe("Error Response Construction", () => {
107
+ bench("P154 structured error (simple)", () => {
108
+ const error = {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: JSON.stringify({
113
+ success: false,
114
+ error: "Table not found: nonexistent_table",
115
+ code: "OBJECT_NOT_FOUND",
116
+ }),
117
+ },
118
+ ],
119
+ };
120
+ void error;
121
+ }, { iterations: 10000, warmupIterations: 100 });
122
+ bench("P154 structured error (with context)", () => {
123
+ const error = {
124
+ content: [
125
+ {
126
+ type: "text",
127
+ text: JSON.stringify({
128
+ success: false,
129
+ error: "Failed to execute query",
130
+ code: "QUERY_EXECUTION_FAILED",
131
+ details: {
132
+ sql: "SELECT * FROM missing_table",
133
+ pgCode: "42P01",
134
+ pgMessage: 'relation "missing_table" does not exist',
135
+ hint: "Check the table name and schema",
136
+ },
137
+ }),
138
+ },
139
+ ],
140
+ };
141
+ void error;
142
+ }, { iterations: 5000, warmupIterations: 50 });
143
+ bench("Error.message extraction + stack flattening", () => {
144
+ try {
145
+ throw new Error("Test error for benchmarking");
146
+ }
147
+ catch (e) {
148
+ const err = e;
149
+ const flat = (err.stack ?? "").replace(/\n/g, " → ");
150
+ void flat;
151
+ }
152
+ }, { iterations: 5000, warmupIterations: 50 });
153
+ });
154
+ // ---------------------------------------------------------------------------
155
+ // 3. Progress Notification Overhead
156
+ // ---------------------------------------------------------------------------
157
+ describe("Progress Notification Overhead", () => {
158
+ bench("construct progress payload", () => {
159
+ const progress = {
160
+ progressToken: "token-123",
161
+ progress: 42,
162
+ total: 100,
163
+ message: "Processing row 42 of 100",
164
+ };
165
+ void JSON.stringify(progress);
166
+ }, { iterations: 10000, warmupIterations: 100 });
167
+ bench("10 incremental progress updates", () => {
168
+ for (let i = 0; i < 10; i++) {
169
+ void JSON.stringify({
170
+ progressToken: "token-123",
171
+ progress: i * 10,
172
+ total: 100,
173
+ message: `Step ${String(i + 1)} of 10`,
174
+ });
175
+ }
176
+ }, { iterations: 5000, warmupIterations: 50 });
177
+ });
178
+ // ---------------------------------------------------------------------------
179
+ // 4. Full Handler Wrapper Pipeline (Simulated)
180
+ // ---------------------------------------------------------------------------
181
+ describe("Handler Wrapper Pipeline", () => {
182
+ bench("lookup → handler → serialize (sync simulation)", () => {
183
+ // Simulates the hot path: tool lookup + handler call + response serialization
184
+ const handler = handlerMap.get("pg_read_query");
185
+ if (handler) {
186
+ const result = handler();
187
+ void JSON.stringify(result);
188
+ }
189
+ }, { iterations: 10000, warmupIterations: 100 });
190
+ bench("tool definition list generation (Array.from registry)", () => {
191
+ const definitions = Array.from(toolRegistry.values()).map((def) => ({
192
+ name: def.name,
193
+ description: def.description,
194
+ inputSchema: def.inputSchema,
195
+ }));
196
+ void definitions.length;
197
+ }, { iterations: 3000, warmupIterations: 30 });
198
+ });
199
+ //# sourceMappingURL=handler-dispatch.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-dispatch.bench.js","sourceRoot":"","sources":["../../../src/__tests__/benchmarks/handler-dispatch.bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * postgres-mcp - Logger & Sanitization Performance Benchmarks
3
+ *
4
+ * Measures the overhead of Enterprise Security Level 4 logging:
5
+ * sanitizeMessage(), sanitizeStack(), sanitizeContext(), writeToStderr(),
6
+ * and high-frequency log call throughput.
7
+ *
8
+ * Note: Logger methods (sanitize*) are private, so we benchmark
9
+ * through the public Logger API. We create a fresh Logger instance
10
+ * and intercept console.error to measure overhead without I/O noise.
11
+ *
12
+ * Run: npm run bench
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=logger-sanitization.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-sanitization.bench.d.ts","sourceRoot":"","sources":["../../../src/__tests__/benchmarks/logger-sanitization.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * postgres-mcp - Logger & Sanitization Performance Benchmarks
3
+ *
4
+ * Measures the overhead of Enterprise Security Level 4 logging:
5
+ * sanitizeMessage(), sanitizeStack(), sanitizeContext(), writeToStderr(),
6
+ * and high-frequency log call throughput.
7
+ *
8
+ * Note: Logger methods (sanitize*) are private, so we benchmark
9
+ * through the public Logger API. We create a fresh Logger instance
10
+ * and intercept console.error to measure overhead without I/O noise.
11
+ *
12
+ * Run: npm run bench
13
+ */
14
+ import { describe, bench, vi, beforeAll } from "vitest";
15
+ // We need to NOT mock the logger here — we want to benchmark the real Logger.
16
+ // Instead, suppress console.error output to avoid noise.
17
+ const originalConsoleError = console.error;
18
+ beforeAll(() => {
19
+ console.error = vi.fn();
20
+ return () => {
21
+ console.error = originalConsoleError;
22
+ };
23
+ });
24
+ // Import the real logger
25
+ import { logger } from "../../utils/logger.js";
26
+ // ---------------------------------------------------------------------------
27
+ // Test data
28
+ // ---------------------------------------------------------------------------
29
+ const shortMessage = "Query executed successfully";
30
+ const longMessage = "A".repeat(1000);
31
+ const controlCharMessage = "Normal text\x00with\x01control\x02chars\x03and\ttabs\nand\nnewlines\x7Fand\x1Bescapes";
32
+ const stackTrace = `Error: Connection refused
33
+ at ConnectionPool.connect (c:\\postgres-mcp\\src\\pool\\ConnectionPool.ts:45:11)
34
+ at async DatabaseAdapter.query (c:\\postgres-mcp\\src\\adapters\\postgresql\\DatabaseAdapter.ts:123:5)
35
+ at async Object.handler (c:\\postgres-mcp\\src\\adapters\\postgresql\\tools\\core.ts:89:20)
36
+ at async McpServer.handleToolCall (c:\\postgres-mcp\\node_modules\\@modelcontextprotocol\\sdk\\server.js:234:12)
37
+ at async processTicksAndRejections (node:internal/process/task_queues:95:5)`;
38
+ const simpleContext = {
39
+ module: "ADAPTER",
40
+ operation: "readQuery",
41
+ entityId: "users",
42
+ };
43
+ const sensitiveContext = {
44
+ module: "AUTH",
45
+ code: "AUTH_TOKEN_INVALID",
46
+ operation: "validateToken",
47
+ token: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9",
48
+ password: "super_secret_password",
49
+ client_secret: "oauth-client-secret-value",
50
+ issuer: "http://localhost:8080/realms/postgres-mcp",
51
+ audience: "postgres-mcp-client",
52
+ jwks_uri: "http://localhost:8080/certs",
53
+ bearer_format: "JWT",
54
+ nested: {
55
+ api_key: "nested-secret-key-123",
56
+ normalField: "visible",
57
+ deep: {
58
+ access_token: "deeply-nested-token",
59
+ safeValue: 42,
60
+ },
61
+ },
62
+ };
63
+ const nestedContext = {
64
+ module: "QUERY",
65
+ operation: "batchInsert",
66
+ entityId: "products",
67
+ details: {
68
+ rowCount: 100,
69
+ schema: "public",
70
+ table: "products",
71
+ metadata: {
72
+ duration: 234,
73
+ plan: "INSERT",
74
+ },
75
+ },
76
+ };
77
+ // ---------------------------------------------------------------------------
78
+ // 1. Log Call Overhead (includes all sanitization)
79
+ // ---------------------------------------------------------------------------
80
+ describe("Log Call Overhead", () => {
81
+ // Set to info level so debug calls are filtered pre-sanitization
82
+ logger.setLevel("info");
83
+ bench("logger.info(short message, no context)", () => {
84
+ logger.info(shortMessage);
85
+ }, { iterations: 5000, warmupIterations: 50 });
86
+ bench("logger.info(short message, simple context)", () => {
87
+ logger.info(shortMessage, simpleContext);
88
+ }, { iterations: 5000, warmupIterations: 50 });
89
+ bench("logger.info(long message — 1KB)", () => {
90
+ logger.info(longMessage);
91
+ }, { iterations: 3000, warmupIterations: 30 });
92
+ bench("logger.debug(filtered — below minLevel)", () => {
93
+ logger.debug("This message should be filtered before sanitization");
94
+ }, { iterations: 50000, warmupIterations: 500 });
95
+ });
96
+ // ---------------------------------------------------------------------------
97
+ // 2. Message Sanitization (exercised through logger.info)
98
+ // ---------------------------------------------------------------------------
99
+ describe("Message Sanitization", () => {
100
+ bench("message with control characters", () => {
101
+ logger.info(controlCharMessage);
102
+ }, { iterations: 3000, warmupIterations: 30 });
103
+ bench('message with no special chars ("clean" path)', () => {
104
+ logger.info("Clean message without any special characters at all");
105
+ }, { iterations: 5000, warmupIterations: 50 });
106
+ });
107
+ // ---------------------------------------------------------------------------
108
+ // 3. Stack Trace Processing (exercised through logger.error)
109
+ // ---------------------------------------------------------------------------
110
+ describe("Stack Trace Processing", () => {
111
+ bench("logger.error(with stack trace)", () => {
112
+ logger.error("Connection failed", {
113
+ module: "POOL",
114
+ code: "PG_CONNECT_FAILED",
115
+ stack: stackTrace,
116
+ });
117
+ }, { iterations: 2000, warmupIterations: 20 });
118
+ bench("logger.error(without stack trace)", () => {
119
+ logger.error("Generic error", {
120
+ module: "ADAPTER",
121
+ code: "QUERY_FAILED",
122
+ });
123
+ }, { iterations: 3000, warmupIterations: 30 });
124
+ });
125
+ // ---------------------------------------------------------------------------
126
+ // 4. Sensitive Data Redaction
127
+ // ---------------------------------------------------------------------------
128
+ describe("Sensitive Data Redaction", () => {
129
+ bench("context with 8+ sensitive fields (deep nested)", () => {
130
+ logger.info("Auth operation", sensitiveContext);
131
+ }, { iterations: 1000, warmupIterations: 10 });
132
+ bench("context with nested safe objects", () => {
133
+ logger.info("Batch operation", nestedContext);
134
+ }, { iterations: 3000, warmupIterations: 30 });
135
+ });
136
+ // ---------------------------------------------------------------------------
137
+ // 5. High-Frequency Logging
138
+ // ---------------------------------------------------------------------------
139
+ describe("High-Frequency Logging", () => {
140
+ bench("100 sequential log calls", () => {
141
+ for (let i = 0; i < 100; i++) {
142
+ logger.info(`Processing item ${String(i)}`, {
143
+ module: "TOOLS",
144
+ operation: "batchProcess",
145
+ entityId: `item-${String(i)}`,
146
+ });
147
+ }
148
+ }, { iterations: 100, warmupIterations: 5 });
149
+ bench("100 filtered debug calls (no-op path)", () => {
150
+ for (let i = 0; i < 100; i++) {
151
+ logger.debug(`Debug item ${String(i)}`);
152
+ }
153
+ }, { iterations: 5000, warmupIterations: 50 });
154
+ });
155
+ //# sourceMappingURL=logger-sanitization.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-sanitization.bench.js","sourceRoot":"","sources":["../../../src/__tests__/benchmarks/logger-sanitization.bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * postgres-mcp - Resource & Prompt Generation Performance Benchmarks
3
+ *
4
+ * Measures resource URI matching, prompt generation, and the
5
+ * overhead of compact tool index / discovery prompt assembly.
6
+ *
7
+ * Run: npm run bench
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=resource-prompts.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-prompts.bench.d.ts","sourceRoot":"","sources":["../../../src/__tests__/benchmarks/resource-prompts.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}