@neverinfamous/postgres-mcp 2.0.0 → 2.2.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 (518) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +119 -46
  3. package/dist/__tests__/benchmarks/codemode.bench.js +3 -3
  4. package/dist/__tests__/benchmarks/codemode.bench.js.map +1 -1
  5. package/dist/__tests__/benchmarks/connection-pool.bench.js +3 -3
  6. package/dist/__tests__/benchmarks/connection-pool.bench.js.map +1 -1
  7. package/dist/__tests__/benchmarks/introspection-migration.bench.d.ts +11 -0
  8. package/dist/__tests__/benchmarks/introspection-migration.bench.d.ts.map +1 -0
  9. package/dist/__tests__/benchmarks/introspection-migration.bench.js +143 -0
  10. package/dist/__tests__/benchmarks/introspection-migration.bench.js.map +1 -0
  11. package/dist/__tests__/benchmarks/resource-prompts.bench.js +0 -64
  12. package/dist/__tests__/benchmarks/resource-prompts.bench.js.map +1 -1
  13. package/dist/__tests__/benchmarks/schema-parsing.bench.js +5 -5
  14. package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -1
  15. package/dist/__tests__/benchmarks/tool-filtering.bench.js +17 -8
  16. package/dist/__tests__/benchmarks/tool-filtering.bench.js.map +1 -1
  17. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  18. package/dist/__tests__/mocks/adapter.js +2 -1
  19. package/dist/__tests__/mocks/adapter.js.map +1 -1
  20. package/dist/adapters/DatabaseAdapter.d.ts +6 -5
  21. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  22. package/dist/adapters/DatabaseAdapter.js +11 -20
  23. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  24. package/dist/adapters/postgresql/PostgresAdapter.d.ts +5 -26
  25. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
  26. package/dist/adapters/postgresql/PostgresAdapter.js +31 -526
  27. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
  28. package/dist/adapters/postgresql/prompts/index.js +1 -1
  29. package/dist/adapters/postgresql/prompts/index.js.map +1 -1
  30. package/dist/adapters/postgresql/resources/index.d.ts +1 -1
  31. package/dist/adapters/postgresql/resources/index.js +3 -3
  32. package/dist/adapters/postgresql/resources/index.js.map +1 -1
  33. package/dist/adapters/postgresql/schema-operations.d.ts +71 -0
  34. package/dist/adapters/postgresql/schema-operations.d.ts.map +1 -0
  35. package/dist/adapters/postgresql/schema-operations.js +561 -0
  36. package/dist/adapters/postgresql/schema-operations.js.map +1 -0
  37. package/dist/adapters/postgresql/schemas/admin.d.ts +4 -4
  38. package/dist/adapters/postgresql/schemas/admin.js +4 -4
  39. package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
  40. package/dist/adapters/postgresql/schemas/backup.d.ts +2 -2
  41. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
  42. package/dist/adapters/postgresql/schemas/backup.js +1 -3
  43. package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
  44. package/dist/adapters/postgresql/schemas/core/index.d.ts +6 -0
  45. package/dist/adapters/postgresql/schemas/core/index.d.ts.map +1 -0
  46. package/dist/adapters/postgresql/schemas/core/index.js +6 -0
  47. package/dist/adapters/postgresql/schemas/core/index.js.map +1 -0
  48. package/dist/adapters/postgresql/schemas/{core.d.ts → core/queries.d.ts} +16 -171
  49. package/dist/adapters/postgresql/schemas/core/queries.d.ts.map +1 -0
  50. package/dist/adapters/postgresql/schemas/{core.js → core/queries.js} +5 -213
  51. package/dist/adapters/postgresql/schemas/core/queries.js.map +1 -0
  52. package/dist/adapters/postgresql/schemas/core/transactions.d.ts +149 -0
  53. package/dist/adapters/postgresql/schemas/core/transactions.d.ts.map +1 -0
  54. package/dist/adapters/postgresql/schemas/core/transactions.js +239 -0
  55. package/dist/adapters/postgresql/schemas/core/transactions.js.map +1 -0
  56. package/dist/adapters/postgresql/schemas/cron.d.ts +12 -12
  57. package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
  58. package/dist/adapters/postgresql/schemas/cron.js +38 -10
  59. package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
  60. package/dist/adapters/postgresql/schemas/extensions/citext.d.ts +222 -0
  61. package/dist/adapters/postgresql/schemas/extensions/citext.d.ts.map +1 -0
  62. package/dist/adapters/postgresql/schemas/extensions/citext.js +306 -0
  63. package/dist/adapters/postgresql/schemas/extensions/citext.js.map +1 -0
  64. package/dist/adapters/postgresql/schemas/extensions/index.d.ts +15 -0
  65. package/dist/adapters/postgresql/schemas/extensions/index.d.ts.map +1 -0
  66. package/dist/adapters/postgresql/schemas/extensions/index.js +20 -0
  67. package/dist/adapters/postgresql/schemas/extensions/index.js.map +1 -0
  68. package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts +164 -0
  69. package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts.map +1 -0
  70. package/dist/adapters/postgresql/schemas/extensions/kcache.js +225 -0
  71. package/dist/adapters/postgresql/schemas/extensions/kcache.js.map +1 -0
  72. package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts +253 -0
  73. package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts.map +1 -0
  74. package/dist/adapters/postgresql/schemas/extensions/ltree.js +430 -0
  75. package/dist/adapters/postgresql/schemas/extensions/ltree.js.map +1 -0
  76. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts +251 -0
  77. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts.map +1 -0
  78. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js +294 -0
  79. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js.map +1 -0
  80. package/dist/adapters/postgresql/schemas/extensions/shared.d.ts +10 -0
  81. package/dist/adapters/postgresql/schemas/extensions/shared.d.ts.map +1 -0
  82. package/dist/adapters/postgresql/schemas/extensions/shared.js +15 -0
  83. package/dist/adapters/postgresql/schemas/extensions/shared.js.map +1 -0
  84. package/dist/adapters/postgresql/schemas/index.d.ts +6 -6
  85. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
  86. package/dist/adapters/postgresql/schemas/index.js +8 -8
  87. package/dist/adapters/postgresql/schemas/index.js.map +1 -1
  88. package/dist/adapters/postgresql/schemas/introspection.d.ts +19 -42
  89. package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -1
  90. package/dist/adapters/postgresql/schemas/introspection.js +72 -27
  91. package/dist/adapters/postgresql/schemas/introspection.js.map +1 -1
  92. package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts +270 -0
  93. package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts.map +1 -0
  94. package/dist/adapters/postgresql/schemas/jsonb/advanced.js +371 -0
  95. package/dist/adapters/postgresql/schemas/jsonb/advanced.js.map +1 -0
  96. package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts +283 -0
  97. package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts.map +1 -0
  98. package/dist/adapters/postgresql/schemas/jsonb/basic.js +456 -0
  99. package/dist/adapters/postgresql/schemas/jsonb/basic.js.map +1 -0
  100. package/dist/adapters/postgresql/schemas/jsonb/index.d.ts +6 -0
  101. package/dist/adapters/postgresql/schemas/jsonb/index.d.ts.map +1 -0
  102. package/dist/adapters/postgresql/schemas/jsonb/index.js +6 -0
  103. package/dist/adapters/postgresql/schemas/jsonb/index.js.map +1 -0
  104. package/dist/adapters/postgresql/schemas/monitoring.d.ts +4 -4
  105. package/dist/adapters/postgresql/schemas/monitoring.js +2 -2
  106. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
  107. package/dist/adapters/postgresql/schemas/partitioning.d.ts +14 -14
  108. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
  109. package/dist/adapters/postgresql/schemas/partitioning.js +64 -46
  110. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
  111. package/dist/adapters/postgresql/schemas/partman.d.ts +16 -14
  112. package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
  113. package/dist/adapters/postgresql/schemas/partman.js +9 -9
  114. package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
  115. package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts +429 -0
  116. package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts.map +1 -0
  117. package/dist/adapters/postgresql/schemas/postgis/advanced.js +495 -0
  118. package/dist/adapters/postgresql/schemas/postgis/advanced.js.map +1 -0
  119. package/dist/adapters/postgresql/schemas/{postgis.d.ts → postgis/basic.d.ts} +1 -423
  120. package/dist/adapters/postgresql/schemas/postgis/basic.d.ts.map +1 -0
  121. package/dist/adapters/postgresql/schemas/{postgis.js → postgis/basic.js} +1 -486
  122. package/dist/adapters/postgresql/schemas/postgis/basic.js.map +1 -0
  123. package/dist/adapters/postgresql/schemas/postgis/index.d.ts +6 -0
  124. package/dist/adapters/postgresql/schemas/postgis/index.d.ts.map +1 -0
  125. package/dist/adapters/postgresql/schemas/postgis/index.js +6 -0
  126. package/dist/adapters/postgresql/schemas/postgis/index.js.map +1 -0
  127. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +35 -25
  128. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
  129. package/dist/adapters/postgresql/schemas/schema-mgmt.js +57 -19
  130. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
  131. package/dist/adapters/postgresql/schemas/stats/index.d.ts +6 -0
  132. package/dist/adapters/postgresql/schemas/stats/index.d.ts.map +1 -0
  133. package/dist/adapters/postgresql/schemas/stats/index.js +6 -0
  134. package/dist/adapters/postgresql/schemas/stats/index.js.map +1 -0
  135. package/dist/adapters/postgresql/schemas/stats/input.d.ts +260 -0
  136. package/dist/adapters/postgresql/schemas/stats/input.d.ts.map +1 -0
  137. package/dist/adapters/postgresql/schemas/{stats.js → stats/input.js} +2 -331
  138. package/dist/adapters/postgresql/schemas/stats/input.js.map +1 -0
  139. package/dist/adapters/postgresql/schemas/{stats.d.ts → stats/output.d.ts} +3 -246
  140. package/dist/adapters/postgresql/schemas/stats/output.d.ts.map +1 -0
  141. package/dist/adapters/postgresql/schemas/stats/output.js +334 -0
  142. package/dist/adapters/postgresql/schemas/stats/output.js.map +1 -0
  143. package/dist/adapters/postgresql/schemas/text-search.d.ts +18 -18
  144. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
  145. package/dist/adapters/postgresql/schemas/text-search.js +12 -27
  146. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
  147. package/dist/adapters/postgresql/schemas/vector.d.ts +10 -10
  148. package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -1
  149. package/dist/adapters/postgresql/schemas/vector.js +9 -15
  150. package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
  151. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
  152. package/dist/adapters/postgresql/tools/backup/dump.js +95 -76
  153. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
  154. package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -1
  155. package/dist/adapters/postgresql/tools/backup/planning.js +345 -287
  156. package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -1
  157. package/dist/adapters/postgresql/tools/citext/analysis.d.ts +24 -0
  158. package/dist/adapters/postgresql/tools/citext/analysis.d.ts.map +1 -0
  159. package/dist/adapters/postgresql/tools/{citext.js → citext/analysis.js} +50 -232
  160. package/dist/adapters/postgresql/tools/citext/analysis.js.map +1 -0
  161. package/dist/adapters/postgresql/tools/citext/index.d.ts +15 -0
  162. package/dist/adapters/postgresql/tools/citext/index.d.ts.map +1 -0
  163. package/dist/adapters/postgresql/tools/citext/index.js +23 -0
  164. package/dist/adapters/postgresql/tools/citext/index.js.map +1 -0
  165. package/dist/adapters/postgresql/tools/citext/setup.d.ts +16 -0
  166. package/dist/adapters/postgresql/tools/citext/setup.d.ts.map +1 -0
  167. package/dist/adapters/postgresql/tools/citext/setup.js +193 -0
  168. package/dist/adapters/postgresql/tools/citext/setup.js.map +1 -0
  169. package/dist/adapters/postgresql/tools/codemode/index.js +1 -1
  170. package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
  171. package/dist/adapters/postgresql/tools/core/convenience.d.ts +12 -22
  172. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
  173. package/dist/adapters/postgresql/tools/core/convenience.js +100 -210
  174. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
  175. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts +1 -0
  176. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts.map +1 -1
  177. package/dist/adapters/postgresql/tools/core/error-helpers.js +8 -1
  178. package/dist/adapters/postgresql/tools/core/error-helpers.js.map +1 -1
  179. package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
  180. package/dist/adapters/postgresql/tools/core/health.js +124 -114
  181. package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
  182. package/dist/adapters/postgresql/tools/core/index.d.ts +2 -1
  183. package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -1
  184. package/dist/adapters/postgresql/tools/core/index.js +3 -2
  185. package/dist/adapters/postgresql/tools/core/index.js.map +1 -1
  186. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
  187. package/dist/adapters/postgresql/tools/core/indexes.js +151 -127
  188. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
  189. package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
  190. package/dist/adapters/postgresql/tools/core/objects.js +186 -161
  191. package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
  192. package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
  193. package/dist/adapters/postgresql/tools/core/query.js +37 -25
  194. package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
  195. package/dist/adapters/postgresql/tools/core/schemas.d.ts +6 -3
  196. package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
  197. package/dist/adapters/postgresql/tools/core/schemas.js +11 -2
  198. package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
  199. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
  200. package/dist/adapters/postgresql/tools/core/tables.js +156 -129
  201. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
  202. package/dist/adapters/postgresql/tools/core/utility.d.ts +26 -0
  203. package/dist/adapters/postgresql/tools/core/utility.d.ts.map +1 -0
  204. package/dist/adapters/postgresql/tools/core/utility.js +174 -0
  205. package/dist/adapters/postgresql/tools/core/utility.js.map +1 -0
  206. package/dist/adapters/postgresql/tools/cron.js +90 -43
  207. package/dist/adapters/postgresql/tools/cron.js.map +1 -1
  208. package/dist/adapters/postgresql/tools/introspection/analysis.d.ts +12 -0
  209. package/dist/adapters/postgresql/tools/introspection/analysis.d.ts.map +1 -0
  210. package/dist/adapters/postgresql/tools/introspection/analysis.js +605 -0
  211. package/dist/adapters/postgresql/tools/introspection/analysis.js.map +1 -0
  212. package/dist/adapters/postgresql/tools/introspection/graph.d.ts +55 -0
  213. package/dist/adapters/postgresql/tools/introspection/graph.d.ts.map +1 -0
  214. package/dist/adapters/postgresql/tools/introspection/graph.js +621 -0
  215. package/dist/adapters/postgresql/tools/introspection/graph.js.map +1 -0
  216. package/dist/adapters/postgresql/tools/introspection/index.d.ts +21 -0
  217. package/dist/adapters/postgresql/tools/introspection/index.d.ts.map +1 -0
  218. package/dist/adapters/postgresql/tools/introspection/index.js +31 -0
  219. package/dist/adapters/postgresql/tools/introspection/index.js.map +1 -0
  220. package/dist/adapters/postgresql/tools/introspection/migration.d.ts +15 -0
  221. package/dist/adapters/postgresql/tools/introspection/migration.d.ts.map +1 -0
  222. package/dist/adapters/postgresql/tools/introspection/migration.js +575 -0
  223. package/dist/adapters/postgresql/tools/introspection/migration.js.map +1 -0
  224. package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts +20 -0
  225. package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts.map +1 -0
  226. package/dist/adapters/postgresql/tools/jsonb/analytics.js +367 -0
  227. package/dist/adapters/postgresql/tools/jsonb/analytics.js.map +1 -0
  228. package/dist/adapters/postgresql/tools/jsonb/index.d.ts +4 -2
  229. package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -1
  230. package/dist/adapters/postgresql/tools/jsonb/index.js +8 -4
  231. package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -1
  232. package/dist/adapters/postgresql/tools/jsonb/read.d.ts +38 -0
  233. package/dist/adapters/postgresql/tools/jsonb/read.d.ts.map +1 -0
  234. package/dist/adapters/postgresql/tools/jsonb/{basic.js → read.js} +41 -482
  235. package/dist/adapters/postgresql/tools/jsonb/read.js.map +1 -0
  236. package/dist/adapters/postgresql/tools/jsonb/{advanced.d.ts → transform.d.ts} +1 -13
  237. package/dist/adapters/postgresql/tools/jsonb/transform.d.ts.map +1 -0
  238. package/dist/adapters/postgresql/tools/jsonb/{advanced.js → transform.js} +26 -357
  239. package/dist/adapters/postgresql/tools/jsonb/transform.js.map +1 -0
  240. package/dist/adapters/postgresql/tools/jsonb/write.d.ts +14 -0
  241. package/dist/adapters/postgresql/tools/jsonb/write.d.ts.map +1 -0
  242. package/dist/adapters/postgresql/tools/jsonb/write.js +468 -0
  243. package/dist/adapters/postgresql/tools/jsonb/write.js.map +1 -0
  244. package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
  245. package/dist/adapters/postgresql/tools/kcache.js +116 -51
  246. package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
  247. package/dist/adapters/postgresql/tools/ltree.js +346 -260
  248. package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
  249. package/dist/adapters/postgresql/tools/migration/index.d.ts +15 -0
  250. package/dist/adapters/postgresql/tools/migration/index.d.ts.map +1 -0
  251. package/dist/adapters/postgresql/tools/migration/index.js +23 -0
  252. package/dist/adapters/postgresql/tools/migration/index.js.map +1 -0
  253. package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts +15 -0
  254. package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts.map +1 -0
  255. package/dist/adapters/postgresql/tools/{monitoring.js → monitoring/analysis.js} +24 -359
  256. package/dist/adapters/postgresql/tools/monitoring/analysis.js.map +1 -0
  257. package/dist/adapters/postgresql/tools/monitoring/basic.d.ts +17 -0
  258. package/dist/adapters/postgresql/tools/monitoring/basic.d.ts.map +1 -0
  259. package/dist/adapters/postgresql/tools/monitoring/basic.js +432 -0
  260. package/dist/adapters/postgresql/tools/monitoring/basic.js.map +1 -0
  261. package/dist/adapters/postgresql/tools/monitoring/index.d.ts +16 -0
  262. package/dist/adapters/postgresql/tools/monitoring/index.d.ts.map +1 -0
  263. package/dist/adapters/postgresql/tools/monitoring/index.js +31 -0
  264. package/dist/adapters/postgresql/tools/monitoring/index.js.map +1 -0
  265. package/dist/adapters/postgresql/tools/partitioning/index.d.ts +15 -0
  266. package/dist/adapters/postgresql/tools/partitioning/index.d.ts.map +1 -0
  267. package/dist/adapters/postgresql/tools/partitioning/index.js +23 -0
  268. package/dist/adapters/postgresql/tools/partitioning/index.js.map +1 -0
  269. package/dist/adapters/postgresql/tools/partitioning/info.d.ts +11 -0
  270. package/dist/adapters/postgresql/tools/partitioning/info.d.ts.map +1 -0
  271. package/dist/adapters/postgresql/tools/partitioning/info.js +302 -0
  272. package/dist/adapters/postgresql/tools/partitioning/info.js.map +1 -0
  273. package/dist/adapters/postgresql/tools/partitioning/management.d.ts +28 -0
  274. package/dist/adapters/postgresql/tools/partitioning/management.d.ts.map +1 -0
  275. package/dist/adapters/postgresql/tools/{partitioning.js → partitioning/management.js} +48 -307
  276. package/dist/adapters/postgresql/tools/partitioning/management.js.map +1 -0
  277. package/dist/adapters/postgresql/tools/partman/helpers.d.ts +29 -0
  278. package/dist/adapters/postgresql/tools/partman/helpers.d.ts.map +1 -0
  279. package/dist/adapters/postgresql/tools/partman/helpers.js +59 -0
  280. package/dist/adapters/postgresql/tools/partman/helpers.js.map +1 -0
  281. package/dist/adapters/postgresql/tools/partman/index.d.ts +2 -1
  282. package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -1
  283. package/dist/adapters/postgresql/tools/partman/index.js +4 -2
  284. package/dist/adapters/postgresql/tools/partman/index.js.map +1 -1
  285. package/dist/adapters/postgresql/tools/partman/maintenance.d.ts +20 -0
  286. package/dist/adapters/postgresql/tools/partman/maintenance.d.ts.map +1 -0
  287. package/dist/adapters/postgresql/tools/partman/maintenance.js +496 -0
  288. package/dist/adapters/postgresql/tools/partman/maintenance.js.map +1 -0
  289. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
  290. package/dist/adapters/postgresql/tools/partman/management.js +438 -383
  291. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
  292. package/dist/adapters/postgresql/tools/partman/operations.d.ts +1 -13
  293. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
  294. package/dist/adapters/postgresql/tools/partman/operations.js +171 -652
  295. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
  296. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
  297. package/dist/adapters/postgresql/tools/performance/analysis.js +69 -42
  298. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
  299. package/dist/adapters/postgresql/tools/performance/anomaly-detection.d.ts +18 -0
  300. package/dist/adapters/postgresql/tools/performance/anomaly-detection.d.ts.map +1 -0
  301. package/dist/adapters/postgresql/tools/performance/anomaly-detection.js +533 -0
  302. package/dist/adapters/postgresql/tools/performance/anomaly-detection.js.map +1 -0
  303. package/dist/adapters/postgresql/tools/performance/diagnostics.d.ts +11 -0
  304. package/dist/adapters/postgresql/tools/performance/diagnostics.d.ts.map +1 -0
  305. package/dist/adapters/postgresql/tools/performance/diagnostics.js +332 -0
  306. package/dist/adapters/postgresql/tools/performance/diagnostics.js.map +1 -0
  307. package/dist/adapters/postgresql/tools/performance/index.d.ts +1 -1
  308. package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -1
  309. package/dist/adapters/postgresql/tools/performance/index.js +7 -1
  310. package/dist/adapters/postgresql/tools/performance/index.js.map +1 -1
  311. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
  312. package/dist/adapters/postgresql/tools/performance/monitoring.js +80 -55
  313. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
  314. package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
  315. package/dist/adapters/postgresql/tools/performance/optimization.js +18 -11
  316. package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
  317. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
  318. package/dist/adapters/postgresql/tools/performance/stats.js +439 -318
  319. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
  320. package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
  321. package/dist/adapters/postgresql/tools/pgcrypto.js +45 -77
  322. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
  323. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
  324. package/dist/adapters/postgresql/tools/postgis/basic.js +121 -93
  325. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
  326. package/dist/adapters/postgresql/tools/schema/index.d.ts +16 -0
  327. package/dist/adapters/postgresql/tools/schema/index.d.ts.map +1 -0
  328. package/dist/adapters/postgresql/tools/schema/index.js +32 -0
  329. package/dist/adapters/postgresql/tools/schema/index.js.map +1 -0
  330. package/dist/adapters/postgresql/tools/schema/objects.d.ts +15 -0
  331. package/dist/adapters/postgresql/tools/schema/objects.d.ts.map +1 -0
  332. package/dist/adapters/postgresql/tools/schema/objects.js +378 -0
  333. package/dist/adapters/postgresql/tools/schema/objects.js.map +1 -0
  334. package/dist/adapters/postgresql/tools/schema/views.d.ts +15 -0
  335. package/dist/adapters/postgresql/tools/schema/views.d.ts.map +1 -0
  336. package/dist/adapters/postgresql/tools/{schema.js → schema/views.js} +64 -386
  337. package/dist/adapters/postgresql/tools/schema/views.js.map +1 -0
  338. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
  339. package/dist/adapters/postgresql/tools/stats/advanced.js +1 -218
  340. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
  341. package/dist/adapters/postgresql/tools/stats/math-utils.d.ts +33 -0
  342. package/dist/adapters/postgresql/tools/stats/math-utils.d.ts.map +1 -0
  343. package/dist/adapters/postgresql/tools/stats/math-utils.js +225 -0
  344. package/dist/adapters/postgresql/tools/stats/math-utils.js.map +1 -0
  345. package/dist/adapters/postgresql/tools/text/index.d.ts +16 -0
  346. package/dist/adapters/postgresql/tools/text/index.d.ts.map +1 -0
  347. package/dist/adapters/postgresql/tools/text/index.js +33 -0
  348. package/dist/adapters/postgresql/tools/text/index.js.map +1 -0
  349. package/dist/adapters/postgresql/tools/text/matching.d.ts +17 -0
  350. package/dist/adapters/postgresql/tools/text/matching.d.ts.map +1 -0
  351. package/dist/adapters/postgresql/tools/text/matching.js +565 -0
  352. package/dist/adapters/postgresql/tools/text/matching.js.map +1 -0
  353. package/dist/adapters/postgresql/tools/text/search.d.ts +17 -0
  354. package/dist/adapters/postgresql/tools/text/search.d.ts.map +1 -0
  355. package/dist/adapters/postgresql/tools/text/search.js +653 -0
  356. package/dist/adapters/postgresql/tools/text/search.js.map +1 -0
  357. package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
  358. package/dist/adapters/postgresql/tools/transactions.js +11 -27
  359. package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
  360. package/dist/adapters/postgresql/tools/vector/{basic.d.ts → data.d.ts} +10 -8
  361. package/dist/adapters/postgresql/tools/vector/data.d.ts.map +1 -0
  362. package/dist/adapters/postgresql/tools/vector/data.js +540 -0
  363. package/dist/adapters/postgresql/tools/vector/data.js.map +1 -0
  364. package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -1
  365. package/dist/adapters/postgresql/tools/vector/index.js +6 -2
  366. package/dist/adapters/postgresql/tools/vector/index.js.map +1 -1
  367. package/dist/adapters/postgresql/tools/vector/management.d.ts +11 -0
  368. package/dist/adapters/postgresql/tools/vector/management.d.ts.map +1 -0
  369. package/dist/adapters/postgresql/tools/vector/management.js +425 -0
  370. package/dist/adapters/postgresql/tools/vector/management.js.map +1 -0
  371. package/dist/adapters/postgresql/tools/vector/query.d.ts +14 -0
  372. package/dist/adapters/postgresql/tools/vector/query.d.ts.map +1 -0
  373. package/dist/adapters/postgresql/tools/vector/query.js +767 -0
  374. package/dist/adapters/postgresql/tools/vector/query.js.map +1 -0
  375. package/dist/adapters/postgresql/tools/vector/{advanced.d.ts → search-advanced.d.ts} +4 -5
  376. package/dist/adapters/postgresql/tools/vector/search-advanced.d.ts.map +1 -0
  377. package/dist/adapters/postgresql/tools/vector/search-advanced.js +626 -0
  378. package/dist/adapters/postgresql/tools/vector/search-advanced.js.map +1 -0
  379. package/dist/auth/scopes.d.ts.map +1 -1
  380. package/dist/auth/scopes.js +3 -1
  381. package/dist/auth/scopes.js.map +1 -1
  382. package/dist/cli/args.d.ts +3 -2
  383. package/dist/cli/args.d.ts.map +1 -1
  384. package/dist/cli/args.js +4 -3
  385. package/dist/cli/args.js.map +1 -1
  386. package/dist/cli.js +16 -4
  387. package/dist/cli.js.map +1 -1
  388. package/dist/codemode/api/aliases.d.ts +14 -0
  389. package/dist/codemode/api/aliases.d.ts.map +1 -0
  390. package/dist/codemode/api/aliases.js +503 -0
  391. package/dist/codemode/api/aliases.js.map +1 -0
  392. package/dist/codemode/api/group-api.d.ts +23 -0
  393. package/dist/codemode/api/group-api.d.ts.map +1 -0
  394. package/dist/codemode/api/group-api.js +179 -0
  395. package/dist/codemode/api/group-api.js.map +1 -0
  396. package/dist/codemode/{api.d.ts → api/index.d.ts} +5 -4
  397. package/dist/codemode/api/index.d.ts.map +1 -0
  398. package/dist/codemode/api/index.js +195 -0
  399. package/dist/codemode/api/index.js.map +1 -0
  400. package/dist/codemode/api/maps.d.ts +47 -0
  401. package/dist/codemode/api/maps.d.ts.map +1 -0
  402. package/dist/codemode/api/maps.js +529 -0
  403. package/dist/codemode/api/maps.js.map +1 -0
  404. package/dist/codemode/api/normalize.d.ts +13 -0
  405. package/dist/codemode/api/normalize.d.ts.map +1 -0
  406. package/dist/codemode/api/normalize.js +120 -0
  407. package/dist/codemode/api/normalize.js.map +1 -0
  408. package/dist/codemode/index.d.ts +1 -1
  409. package/dist/codemode/index.d.ts.map +1 -1
  410. package/dist/codemode/index.js +1 -1
  411. package/dist/codemode/index.js.map +1 -1
  412. package/dist/codemode/sandbox.d.ts.map +1 -1
  413. package/dist/codemode/sandbox.js +8 -25
  414. package/dist/codemode/sandbox.js.map +1 -1
  415. package/dist/filtering/ToolConstants.d.ts +11 -11
  416. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  417. package/dist/filtering/ToolConstants.js +28 -15
  418. package/dist/filtering/ToolConstants.js.map +1 -1
  419. package/dist/filtering/ToolFilter.d.ts +0 -32
  420. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  421. package/dist/filtering/ToolFilter.js +0 -43
  422. package/dist/filtering/ToolFilter.js.map +1 -1
  423. package/dist/server/McpServer.d.ts +1 -1
  424. package/dist/server/McpServer.d.ts.map +1 -1
  425. package/dist/server/McpServer.js +1 -2
  426. package/dist/server/McpServer.js.map +1 -1
  427. package/dist/transports/http.d.ts +55 -10
  428. package/dist/transports/http.d.ts.map +1 -1
  429. package/dist/transports/http.js +301 -50
  430. package/dist/transports/http.js.map +1 -1
  431. package/dist/types/filtering.d.ts +1 -1
  432. package/dist/types/filtering.d.ts.map +1 -1
  433. package/dist/types/index.d.ts +2 -2
  434. package/dist/types/index.d.ts.map +1 -1
  435. package/dist/types/index.js.map +1 -1
  436. package/dist/types/mcp.d.ts +0 -21
  437. package/dist/types/mcp.d.ts.map +1 -1
  438. package/dist/types/schema.d.ts +0 -79
  439. package/dist/types/schema.d.ts.map +1 -1
  440. package/dist/utils/fts-config.d.ts +0 -6
  441. package/dist/utils/fts-config.d.ts.map +1 -1
  442. package/dist/utils/fts-config.js +1 -1
  443. package/dist/utils/fts-config.js.map +1 -1
  444. package/dist/utils/icons.d.ts.map +1 -1
  445. package/dist/utils/icons.js +5 -0
  446. package/dist/utils/icons.js.map +1 -1
  447. package/dist/utils/identifiers.d.ts.map +1 -1
  448. package/dist/utils/identifiers.js +6 -6
  449. package/dist/utils/identifiers.js.map +1 -1
  450. package/dist/utils/logger.d.ts +6 -6
  451. package/dist/utils/logger.d.ts.map +1 -1
  452. package/dist/utils/logger.js +18 -15
  453. package/dist/utils/logger.js.map +1 -1
  454. package/dist/utils/progress-utils.d.ts +3 -14
  455. package/dist/utils/progress-utils.d.ts.map +1 -1
  456. package/dist/utils/progress-utils.js +2 -21
  457. package/dist/utils/progress-utils.js.map +1 -1
  458. package/dist/utils/version.d.ts +9 -0
  459. package/dist/utils/version.d.ts.map +1 -0
  460. package/dist/utils/version.js +12 -0
  461. package/dist/utils/version.js.map +1 -0
  462. package/dist/utils/where-clause.d.ts +4 -0
  463. package/dist/utils/where-clause.d.ts.map +1 -1
  464. package/dist/utils/where-clause.js +16 -0
  465. package/dist/utils/where-clause.js.map +1 -1
  466. package/package.json +6 -4
  467. package/dist/adapters/postgresql/schemas/core.d.ts.map +0 -1
  468. package/dist/adapters/postgresql/schemas/core.js.map +0 -1
  469. package/dist/adapters/postgresql/schemas/extensions.d.ts +0 -852
  470. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +0 -1
  471. package/dist/adapters/postgresql/schemas/extensions.js +0 -1202
  472. package/dist/adapters/postgresql/schemas/extensions.js.map +0 -1
  473. package/dist/adapters/postgresql/schemas/jsonb.d.ts +0 -541
  474. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +0 -1
  475. package/dist/adapters/postgresql/schemas/jsonb.js +0 -814
  476. package/dist/adapters/postgresql/schemas/jsonb.js.map +0 -1
  477. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +0 -1
  478. package/dist/adapters/postgresql/schemas/postgis.js.map +0 -1
  479. package/dist/adapters/postgresql/schemas/stats.d.ts.map +0 -1
  480. package/dist/adapters/postgresql/schemas/stats.js.map +0 -1
  481. package/dist/adapters/postgresql/tools/citext.d.ts +0 -18
  482. package/dist/adapters/postgresql/tools/citext.d.ts.map +0 -1
  483. package/dist/adapters/postgresql/tools/citext.js.map +0 -1
  484. package/dist/adapters/postgresql/tools/introspection.d.ts +0 -15
  485. package/dist/adapters/postgresql/tools/introspection.d.ts.map +0 -1
  486. package/dist/adapters/postgresql/tools/introspection.js +0 -1682
  487. package/dist/adapters/postgresql/tools/introspection.js.map +0 -1
  488. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +0 -1
  489. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +0 -1
  490. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +0 -20
  491. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +0 -1
  492. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +0 -1
  493. package/dist/adapters/postgresql/tools/monitoring.d.ts +0 -13
  494. package/dist/adapters/postgresql/tools/monitoring.d.ts.map +0 -1
  495. package/dist/adapters/postgresql/tools/monitoring.js.map +0 -1
  496. package/dist/adapters/postgresql/tools/partitioning.d.ts +0 -13
  497. package/dist/adapters/postgresql/tools/partitioning.d.ts.map +0 -1
  498. package/dist/adapters/postgresql/tools/partitioning.js.map +0 -1
  499. package/dist/adapters/postgresql/tools/schema.d.ts +0 -13
  500. package/dist/adapters/postgresql/tools/schema.d.ts.map +0 -1
  501. package/dist/adapters/postgresql/tools/schema.js.map +0 -1
  502. package/dist/adapters/postgresql/tools/text.d.ts +0 -13
  503. package/dist/adapters/postgresql/tools/text.d.ts.map +0 -1
  504. package/dist/adapters/postgresql/tools/text.js +0 -1082
  505. package/dist/adapters/postgresql/tools/text.js.map +0 -1
  506. package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +0 -1
  507. package/dist/adapters/postgresql/tools/vector/advanced.js +0 -958
  508. package/dist/adapters/postgresql/tools/vector/advanced.js.map +0 -1
  509. package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +0 -1
  510. package/dist/adapters/postgresql/tools/vector/basic.js +0 -1165
  511. package/dist/adapters/postgresql/tools/vector/basic.js.map +0 -1
  512. package/dist/codemode/api.d.ts.map +0 -1
  513. package/dist/codemode/api.js +0 -1544
  514. package/dist/codemode/api.js.map +0 -1
  515. package/dist/utils/promptGenerator.d.ts +0 -20
  516. package/dist/utils/promptGenerator.d.ts.map +0 -1
  517. package/dist/utils/promptGenerator.js +0 -81
  518. package/dist/utils/promptGenerator.js.map +0 -1
@@ -6,6 +6,7 @@
6
6
  import { z } from "zod";
7
7
  import { readOnly } from "../../../../utils/annotations.js";
8
8
  import { getToolIcons } from "../../../../utils/icons.js";
9
+ import { formatPostgresError } from "../core/error-helpers.js";
9
10
  import { CreateBackupPlanOutputSchema, RestoreCommandOutputSchema, PhysicalBackupOutputSchema, RestoreValidateOutputSchema, BackupScheduleOptimizeOutputSchema, } from "../../schemas/index.js";
10
11
  export function createBackupPlanTool(adapter) {
11
12
  return {
@@ -17,7 +18,7 @@ export function createBackupPlanTool(adapter) {
17
18
  .enum(["hourly", "daily", "weekly"])
18
19
  .optional()
19
20
  .describe("Backup frequency (default: daily)"),
20
- retention: z
21
+ retention: z.coerce
21
22
  .number()
22
23
  .optional()
23
24
  .describe("Number of backups to retain (default: 7)"),
@@ -26,64 +27,72 @@ export function createBackupPlanTool(adapter) {
26
27
  annotations: readOnly("Create Backup Plan"),
27
28
  icons: getToolIcons("backup", readOnly("Create Backup Plan")),
28
29
  handler: async (params, _context) => {
29
- // Parse params through schema to validate enum values
30
- const schema = z.object({
31
- frequency: z.enum(["hourly", "daily", "weekly"]).optional(),
32
- retention: z.number().optional(),
33
- });
34
- const parsed = schema.parse(params);
35
- const freq = parsed.frequency ?? "daily";
36
- // Validate retention - must be at least 1
37
- if (parsed.retention !== undefined && parsed.retention < 1) {
38
- throw new Error("retention must be at least 1 (cannot retain zero or negative backups)");
39
- }
40
- const retention = parsed.retention ?? 7;
41
- // Generate cron schedule based on frequency
42
- const getCronSchedule = (frequency) => {
43
- switch (frequency) {
44
- case "hourly":
45
- return "0 * * * *"; // Every hour at minute 0
46
- case "weekly":
47
- return "0 2 * * 0"; // Sundays at 2 AM
48
- default:
49
- return "0 2 * * *"; // Daily at 2 AM
30
+ try {
31
+ // Parse params through schema to validate enum values
32
+ const schema = z.object({
33
+ frequency: z.enum(["hourly", "daily", "weekly"]).optional(),
34
+ retention: z.coerce.number().optional(),
35
+ });
36
+ const parsed = schema.parse(params);
37
+ const freq = parsed.frequency ?? "daily";
38
+ // Validate retention - must be at least 1
39
+ if (parsed.retention !== undefined && parsed.retention < 1) {
40
+ throw new Error("retention must be at least 1 (cannot retain zero or negative backups)");
50
41
  }
51
- };
52
- const cronSchedule = getCronSchedule(freq);
53
- const sizeResult = await adapter.executeQuery(`SELECT pg_database_size(current_database()) as bytes`);
54
- const sizeBytes = Number(sizeResult.rows?.[0]?.["bytes"] ?? 0);
55
- const sizeGB = (sizeBytes / (1024 * 1024 * 1024)).toFixed(2);
56
- return {
57
- strategy: {
58
- fullBackup: {
59
- // Use timestamp with hours/minutes for hourly backups to prevent overwrites
60
- command: freq === "hourly"
61
- ? "pg_dump --format=custom --verbose --file=backup_$(date +%Y%m%d_%H%M).dump $POSTGRES_CONNECTION_STRING"
62
- : "pg_dump --format=custom --verbose --file=backup_$(date +%Y%m%d).dump $POSTGRES_CONNECTION_STRING",
63
- frequency: freq,
64
- cronSchedule,
65
- retention: `${String(retention)} backups`,
42
+ const retention = parsed.retention ?? 7;
43
+ // Generate cron schedule based on frequency
44
+ const getCronSchedule = (frequency) => {
45
+ switch (frequency) {
46
+ case "hourly":
47
+ return "0 * * * *"; // Every hour at minute 0
48
+ case "weekly":
49
+ return "0 2 * * 0"; // Sundays at 2 AM
50
+ default:
51
+ return "0 2 * * *"; // Daily at 2 AM
52
+ }
53
+ };
54
+ const cronSchedule = getCronSchedule(freq);
55
+ const sizeResult = await adapter.executeQuery(`SELECT pg_database_size(current_database()) as bytes`);
56
+ const sizeBytes = Number(sizeResult.rows?.[0]?.["bytes"] ?? 0);
57
+ const sizeGB = (sizeBytes / (1024 * 1024 * 1024)).toFixed(2);
58
+ return {
59
+ strategy: {
60
+ fullBackup: {
61
+ // Use timestamp with hours/minutes for hourly backups to prevent overwrites
62
+ command: freq === "hourly"
63
+ ? "pg_dump --format=custom --verbose --file=backup_$(date +%Y%m%d_%H%M).dump $POSTGRES_CONNECTION_STRING"
64
+ : "pg_dump --format=custom --verbose --file=backup_$(date +%Y%m%d).dump $POSTGRES_CONNECTION_STRING",
65
+ frequency: freq,
66
+ cronSchedule,
67
+ retention: `${String(retention)} backups`,
68
+ },
69
+ walArchiving: {
70
+ note: "Enable archive_mode and archive_command for point-in-time recovery",
71
+ configChanges: [
72
+ "archive_mode = on",
73
+ "archive_command = 'cp %p /path/to/wal_archive/%f'",
74
+ ],
75
+ },
66
76
  },
67
- walArchiving: {
68
- note: "Enable archive_mode and archive_command for point-in-time recovery",
69
- configChanges: [
70
- "archive_mode = on",
71
- "archive_command = 'cp %p /path/to/wal_archive/%f'",
72
- ],
77
+ estimates: {
78
+ databaseSize: `${sizeGB} GB`,
79
+ // Per-backup size is ~30% of database due to compression
80
+ backupSizeEach: `~${(Number(sizeGB) * 0.3).toFixed(2)} GB (compressed)`,
81
+ // Use appropriate frequency label
82
+ ...(freq === "weekly"
83
+ ? { backupsPerWeek: 1 }
84
+ : { backupsPerDay: freq === "hourly" ? 24 : 1 }),
85
+ // Total = size per backup * retention count
86
+ totalStorageNeeded: `~${(Number(sizeGB) * 0.3 * retention).toFixed(2)} GB (${String(retention)} backups retained)`,
73
87
  },
74
- },
75
- estimates: {
76
- databaseSize: `${sizeGB} GB`,
77
- // Per-backup size is ~30% of database due to compression
78
- backupSizeEach: `~${(Number(sizeGB) * 0.3).toFixed(2)} GB (compressed)`,
79
- // Use appropriate frequency label
80
- ...(freq === "weekly"
81
- ? { backupsPerWeek: 1 }
82
- : { backupsPerDay: freq === "hourly" ? 24 : 1 }),
83
- // Total = size per backup * retention count
84
- totalStorageNeeded: `~${(Number(sizeGB) * 0.3 * retention).toFixed(2)} GB (${String(retention)} backups retained)`,
85
- },
86
- };
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ success: false,
93
+ error: formatPostgresError(error, { tool: "pg_create_backup_plan" }),
94
+ };
95
+ }
87
96
  },
88
97
  };
89
98
  }
@@ -107,45 +116,58 @@ export function createRestoreCommandTool(_adapter) {
107
116
  annotations: readOnly("Restore Command"),
108
117
  icons: getToolIcons("backup", readOnly("Restore Command")),
109
118
  handler: (params, _context) => {
110
- return Promise.resolve().then(() => {
111
- const parsed = params;
112
- // Validate required param
113
- if (parsed.backupFile === undefined || parsed.backupFile === "") {
114
- throw new Error("backupFile parameter is required");
115
- }
116
- // Validate mutually exclusive options
117
- if (parsed.dataOnly === true && parsed.schemaOnly === true) {
118
- throw new Error("dataOnly and schemaOnly cannot both be true - pg_restore only supports one at a time");
119
- }
120
- let command = "pg_restore --verbose";
121
- const warnings = [];
122
- if (parsed.database !== undefined) {
123
- command += ` --dbname="${parsed.database}"`;
124
- }
125
- else {
126
- warnings.push("No database specified - add --dbname=DBNAME to run this command");
127
- }
128
- if (parsed.schema !== undefined)
129
- command += ` --schema="${parsed.schema}"`;
130
- if (parsed.table !== undefined)
131
- command += ` --table="${parsed.table}"`;
132
- if (parsed.dataOnly === true)
133
- command += " --data-only";
134
- if (parsed.schemaOnly === true)
135
- command += " --schema-only";
136
- command += ` "${parsed.backupFile}"`;
137
- return {
138
- command,
139
- ...(warnings.length > 0 && { warnings }),
140
- notes: [
141
- "Add --clean to drop database objects before recreating",
142
- "Add --if-exists to avoid errors on drop",
143
- "Add --no-owner to skip ownership commands",
144
- "Use -j N for parallel restore (N workers)",
145
- "For remote restores, add -h HOST -p PORT -U USER to the command",
146
- ],
147
- };
148
- });
119
+ try {
120
+ return Promise.resolve()
121
+ .then(() => {
122
+ const parsed = params;
123
+ // Validate required param
124
+ if (parsed.backupFile === undefined || parsed.backupFile === "") {
125
+ throw new Error("backupFile parameter is required");
126
+ }
127
+ // Validate mutually exclusive options
128
+ if (parsed.dataOnly === true && parsed.schemaOnly === true) {
129
+ throw new Error("dataOnly and schemaOnly cannot both be true - pg_restore only supports one at a time");
130
+ }
131
+ let command = "pg_restore --verbose";
132
+ const warnings = [];
133
+ if (parsed.database !== undefined) {
134
+ command += ` --dbname="${parsed.database}"`;
135
+ }
136
+ else {
137
+ warnings.push("No database specified - add --dbname=DBNAME to run this command");
138
+ }
139
+ if (parsed.schema !== undefined)
140
+ command += ` --schema="${parsed.schema}"`;
141
+ if (parsed.table !== undefined)
142
+ command += ` --table="${parsed.table}"`;
143
+ if (parsed.dataOnly === true)
144
+ command += " --data-only";
145
+ if (parsed.schemaOnly === true)
146
+ command += " --schema-only";
147
+ command += ` "${parsed.backupFile}"`;
148
+ return {
149
+ command,
150
+ ...(warnings.length > 0 && { warnings }),
151
+ notes: [
152
+ "Add --clean to drop database objects before recreating",
153
+ "Add --if-exists to avoid errors on drop",
154
+ "Add --no-owner to skip ownership commands",
155
+ "Use -j N for parallel restore (N workers)",
156
+ "For remote restores, add -h HOST -p PORT -U USER to the command",
157
+ ],
158
+ };
159
+ })
160
+ .catch((error) => ({
161
+ success: false,
162
+ error: formatPostgresError(error, { tool: "pg_restore_command" }),
163
+ }));
164
+ }
165
+ catch (error) {
166
+ return Promise.resolve({
167
+ success: false,
168
+ error: formatPostgresError(error, { tool: "pg_restore_command" }),
169
+ });
170
+ }
149
171
  },
150
172
  };
151
173
  }
@@ -164,68 +186,81 @@ export function createPhysicalBackupTool(_adapter) {
164
186
  .enum(["fast", "spread"])
165
187
  .optional()
166
188
  .describe("Checkpoint mode"),
167
- compress: z.number().optional().describe("Compression level 0-9"),
189
+ compress: z.coerce.number().optional().describe("Compression level 0-9"),
168
190
  }),
169
191
  outputSchema: PhysicalBackupOutputSchema,
170
192
  annotations: readOnly("Physical Backup"),
171
193
  icons: getToolIcons("backup", readOnly("Physical Backup")),
172
194
  handler: (params, _context) => {
173
- return Promise.resolve().then(() => {
174
- // Parse params through schema to validate enum values
175
- const schema = z.object({
176
- targetDir: z.string().optional(),
177
- format: z.enum(["plain", "tar"]).optional(),
178
- checkpoint: z.enum(["fast", "spread"]).optional(),
179
- compress: z.number().optional(),
195
+ try {
196
+ return Promise.resolve()
197
+ .then(() => {
198
+ // Parse params through schema to validate enum values
199
+ const schema = z.object({
200
+ targetDir: z.string().optional(),
201
+ format: z.enum(["plain", "tar"]).optional(),
202
+ checkpoint: z.enum(["fast", "spread"]).optional(),
203
+ compress: z.coerce.number().optional(),
204
+ });
205
+ const parsed = schema.parse(params);
206
+ // Validate required param
207
+ if (parsed.targetDir === undefined || parsed.targetDir === "") {
208
+ throw new Error("targetDir parameter is required");
209
+ }
210
+ // Validate compress range
211
+ if (parsed.compress !== undefined &&
212
+ (parsed.compress < 0 || parsed.compress > 9)) {
213
+ throw new Error("compress must be between 0 and 9");
214
+ }
215
+ let command = "pg_basebackup";
216
+ command += ` -D "${parsed.targetDir}"`;
217
+ // Set format flag: plain (-Fp) if specified, otherwise tar (-Ft) as default
218
+ command += parsed.format === "plain" ? " -Fp" : " -Ft";
219
+ command += " -Xs";
220
+ command += " -P";
221
+ if (parsed.checkpoint === "fast") {
222
+ command += " -c fast";
223
+ }
224
+ else if (parsed.checkpoint === "spread") {
225
+ command += " -c spread";
226
+ }
227
+ if (parsed.compress !== undefined && parsed.compress > 0) {
228
+ // Use only -Z (--compress) with level, not -z (which is redundant)
229
+ command += ` -Z ${String(parsed.compress)}`;
230
+ }
231
+ // Connection flags should be provided by user or via environment
232
+ command +=
233
+ " -h ${PGHOST:-localhost} -p ${PGPORT:-5432} -U ${PGUSER:-postgres}";
234
+ return {
235
+ command,
236
+ notes: [
237
+ "Set PGHOST, PGPORT, PGUSER environment variables or replace the placeholders directly",
238
+ "Requires replication connection permission",
239
+ "Modify -h/-U flags above to change connection target",
240
+ "Add --slot=NAME to use a replication slot",
241
+ "Physical backups capture the entire cluster",
242
+ parsed.format === "plain"
243
+ ? "Plain format (-Fp): Creates directory structure with individual data files"
244
+ : "Tar format (-Ft): Creates single compressed archive file",
245
+ ],
246
+ requirements: [
247
+ "wal_level = replica (or higher)",
248
+ "max_wal_senders > 0",
249
+ "pg_hba.conf must allow replication connections",
250
+ ],
251
+ };
252
+ })
253
+ .catch((error) => ({
254
+ success: false,
255
+ error: formatPostgresError(error, { tool: "pg_backup_physical" }),
256
+ }));
257
+ }
258
+ catch (error) {
259
+ return Promise.resolve({
260
+ success: false,
261
+ error: formatPostgresError(error, { tool: "pg_backup_physical" }),
180
262
  });
181
- const parsed = schema.parse(params);
182
- // Validate required param
183
- if (parsed.targetDir === undefined || parsed.targetDir === "") {
184
- throw new Error("targetDir parameter is required");
185
- }
186
- // Validate compress range
187
- if (parsed.compress !== undefined &&
188
- (parsed.compress < 0 || parsed.compress > 9)) {
189
- throw new Error("compress must be between 0 and 9");
190
- }
191
- let command = "pg_basebackup";
192
- command += ` -D "${parsed.targetDir}"`;
193
- // Set format flag: plain (-Fp) if specified, otherwise tar (-Ft) as default
194
- command += parsed.format === "plain" ? " -Fp" : " -Ft";
195
- command += " -Xs";
196
- command += " -P";
197
- if (parsed.checkpoint === "fast") {
198
- command += " -c fast";
199
- }
200
- else if (parsed.checkpoint === "spread") {
201
- command += " -c spread";
202
- }
203
- if (parsed.compress !== undefined && parsed.compress > 0) {
204
- // Use only -Z (--compress) with level, not -z (which is redundant)
205
- command += ` -Z ${String(parsed.compress)}`;
206
- }
207
- // Connection flags should be provided by user or via environment
208
- command +=
209
- " -h ${PGHOST:-localhost} -p ${PGPORT:-5432} -U ${PGUSER:-postgres}";
210
- return {
211
- command,
212
- notes: [
213
- "Set PGHOST, PGPORT, PGUSER environment variables or replace the placeholders directly",
214
- "Requires replication connection permission",
215
- "Modify -h/-U flags above to change connection target",
216
- "Add --slot=NAME to use a replication slot",
217
- "Physical backups capture the entire cluster",
218
- parsed.format === "plain"
219
- ? "Plain format (-Fp): Creates directory structure with individual data files"
220
- : "Tar format (-Ft): Creates single compressed archive file",
221
- ],
222
- requirements: [
223
- "wal_level = replica (or higher)",
224
- "max_wal_senders > 0",
225
- "pg_hba.conf must allow replication connections",
226
- ],
227
- };
228
- });
263
+ }
229
264
  },
230
265
  };
231
266
  }
@@ -245,85 +280,98 @@ export function createRestoreValidateTool(_adapter) {
245
280
  annotations: readOnly("Restore Validate"),
246
281
  icons: getToolIcons("backup", readOnly("Restore Validate")),
247
282
  handler: (params, _context) => {
248
- return Promise.resolve().then(() => {
249
- // Parse params through schema to validate enum values
250
- const schema = z.object({
251
- backupFile: z.string().optional(),
252
- backupType: z.enum(["pg_dump", "pg_basebackup"]).optional(),
283
+ try {
284
+ return Promise.resolve()
285
+ .then(() => {
286
+ // Parse params through schema to validate enum values
287
+ const schema = z.object({
288
+ backupFile: z.string().optional(),
289
+ backupType: z.enum(["pg_dump", "pg_basebackup"]).optional(),
290
+ });
291
+ const parsed = schema.parse(params);
292
+ // Validate required param
293
+ if (parsed.backupFile === undefined || parsed.backupFile === "") {
294
+ throw new Error("backupFile parameter is required");
295
+ }
296
+ const backupType = parsed.backupType ?? "pg_dump";
297
+ const defaultUsed = parsed.backupType === undefined;
298
+ if (backupType === "pg_dump") {
299
+ return {
300
+ ...(defaultUsed && {
301
+ note: "No backupType specified - defaulting to pg_dump validation steps",
302
+ }),
303
+ validationSteps: [
304
+ {
305
+ step: 1,
306
+ name: "Check backup file integrity",
307
+ command: `pg_restore --list "${parsed.backupFile}"`,
308
+ },
309
+ {
310
+ step: 2,
311
+ name: "Test restore to temporary database",
312
+ commands: [
313
+ "createdb test_restore",
314
+ `pg_restore --dbname=test_restore "${parsed.backupFile}"`,
315
+ "-- Run validation queries",
316
+ "dropdb test_restore",
317
+ ],
318
+ },
319
+ {
320
+ step: 3,
321
+ name: "Verify table counts match",
322
+ note: "Compare pg_class counts between source and restored database",
323
+ },
324
+ ],
325
+ recommendations: [
326
+ "Automate validation as part of backup workflow",
327
+ "Keep validation logs for compliance",
328
+ "Test restores regularly, not just during incidents",
329
+ ],
330
+ };
331
+ }
332
+ else {
333
+ return {
334
+ validationSteps: [
335
+ {
336
+ step: 1,
337
+ name: "Verify backup with pg_verifybackup (PostgreSQL 13+)",
338
+ command: `pg_verifybackup "${parsed.backupFile}"`,
339
+ },
340
+ {
341
+ step: 2,
342
+ name: "Verify base backup files",
343
+ command: `ls -la "${parsed.backupFile}"/`,
344
+ },
345
+ {
346
+ step: 3,
347
+ name: "Check backup_label file",
348
+ command: `cat "${parsed.backupFile}"/backup_label`,
349
+ },
350
+ {
351
+ step: 4,
352
+ name: "Test recovery in isolated environment",
353
+ note: "Configure recovery.conf/recovery.signal and start standby",
354
+ },
355
+ ],
356
+ recommendations: [
357
+ "pg_verifybackup validates checksums (requires data checksums enabled)",
358
+ "Maintain WAL archives for point-in-time recovery testing",
359
+ "Document recovery procedures and test quarterly",
360
+ ],
361
+ };
362
+ }
363
+ })
364
+ .catch((error) => ({
365
+ success: false,
366
+ error: formatPostgresError(error, { tool: "pg_restore_validate" }),
367
+ }));
368
+ }
369
+ catch (error) {
370
+ return Promise.resolve({
371
+ success: false,
372
+ error: formatPostgresError(error, { tool: "pg_restore_validate" }),
253
373
  });
254
- const parsed = schema.parse(params);
255
- // Validate required param
256
- if (parsed.backupFile === undefined || parsed.backupFile === "") {
257
- throw new Error("backupFile parameter is required");
258
- }
259
- const backupType = parsed.backupType ?? "pg_dump";
260
- const defaultUsed = parsed.backupType === undefined;
261
- if (backupType === "pg_dump") {
262
- return {
263
- ...(defaultUsed && {
264
- note: "No backupType specified - defaulting to pg_dump validation steps",
265
- }),
266
- validationSteps: [
267
- {
268
- step: 1,
269
- name: "Check backup file integrity",
270
- command: `pg_restore --list "${parsed.backupFile}"`,
271
- },
272
- {
273
- step: 2,
274
- name: "Test restore to temporary database",
275
- commands: [
276
- "createdb test_restore",
277
- `pg_restore --dbname=test_restore "${parsed.backupFile}"`,
278
- "-- Run validation queries",
279
- "dropdb test_restore",
280
- ],
281
- },
282
- {
283
- step: 3,
284
- name: "Verify table counts match",
285
- note: "Compare pg_class counts between source and restored database",
286
- },
287
- ],
288
- recommendations: [
289
- "Automate validation as part of backup workflow",
290
- "Keep validation logs for compliance",
291
- "Test restores regularly, not just during incidents",
292
- ],
293
- };
294
- }
295
- else {
296
- return {
297
- validationSteps: [
298
- {
299
- step: 1,
300
- name: "Verify backup with pg_verifybackup (PostgreSQL 13+)",
301
- command: `pg_verifybackup "${parsed.backupFile}"`,
302
- },
303
- {
304
- step: 2,
305
- name: "Verify base backup files",
306
- command: `ls -la "${parsed.backupFile}"/`,
307
- },
308
- {
309
- step: 3,
310
- name: "Check backup_label file",
311
- command: `cat "${parsed.backupFile}"/backup_label`,
312
- },
313
- {
314
- step: 4,
315
- name: "Test recovery in isolated environment",
316
- note: "Configure recovery.conf/recovery.signal and start standby",
317
- },
318
- ],
319
- recommendations: [
320
- "pg_verifybackup validates checksums (requires data checksums enabled)",
321
- "Maintain WAL archives for point-in-time recovery testing",
322
- "Document recovery procedures and test quarterly",
323
- ],
324
- };
325
- }
326
- });
374
+ }
327
375
  },
328
376
  };
329
377
  }
@@ -340,20 +388,21 @@ export function createBackupScheduleOptimizeTool(adapter) {
340
388
  annotations: readOnly("Backup Schedule Optimize"),
341
389
  icons: getToolIcons("backup", readOnly("Backup Schedule Optimize")),
342
390
  handler: async (_params, _context) => {
343
- const [dbSize, changeRate, connActivity] = await Promise.all([
344
- adapter.executeQuery(`
345
- SELECT
391
+ try {
392
+ const [dbSize, changeRate, connActivity] = await Promise.all([
393
+ adapter.executeQuery(`
394
+ SELECT
346
395
  pg_database_size(current_database()) as size_bytes,
347
396
  pg_size_pretty(pg_database_size(current_database())) as size
348
397
  `),
349
- adapter.executeQuery(`
350
- SELECT
398
+ adapter.executeQuery(`
399
+ SELECT
351
400
  sum(n_tup_ins + n_tup_upd + n_tup_del) as total_changes,
352
401
  sum(n_live_tup) as total_rows
353
402
  FROM pg_stat_user_tables
354
403
  `),
355
- adapter.executeQuery(`
356
- SELECT
404
+ adapter.executeQuery(`
405
+ SELECT
357
406
  extract(hour from backend_start) as hour,
358
407
  count(*) as connection_count
359
408
  FROM pg_stat_activity
@@ -361,59 +410,68 @@ export function createBackupScheduleOptimizeTool(adapter) {
361
410
  GROUP BY extract(hour from backend_start)
362
411
  ORDER BY hour
363
412
  `),
364
- ]);
365
- const sizeBytes = Number(dbSize.rows?.[0]?.["size_bytes"] ?? 0);
366
- const totalChanges = Number(changeRate.rows?.[0]?.["total_changes"] ?? 0);
367
- const totalRows = Number(changeRate.rows?.[0]?.["total_rows"] ?? 1);
368
- const changePercent = (totalChanges / Math.max(totalRows, 1)) * 100;
369
- let strategy;
370
- let fullBackupFrequency;
371
- let incrementalFrequency;
372
- if (sizeBytes > 100 * 1024 * 1024 * 1024) {
373
- strategy = "Large database - use incremental/WAL-based backups";
374
- fullBackupFrequency = "Weekly";
375
- incrementalFrequency = "Continuous WAL archiving";
376
- }
377
- else if (changePercent > 50) {
378
- strategy = "High change rate - frequent backups recommended";
379
- fullBackupFrequency = "Daily";
380
- incrementalFrequency = "Every 6 hours";
381
- }
382
- else if (changePercent > 10) {
383
- strategy = "Moderate activity - standard backup schedule";
384
- fullBackupFrequency = "Daily";
385
- incrementalFrequency = "Every 12 hours";
413
+ ]);
414
+ const sizeBytes = Number(dbSize.rows?.[0]?.["size_bytes"] ?? 0);
415
+ const totalChanges = Number(changeRate.rows?.[0]?.["total_changes"] ?? 0);
416
+ const totalRows = Number(changeRate.rows?.[0]?.["total_rows"] ?? 1);
417
+ const changePercent = (totalChanges / Math.max(totalRows, 1)) * 100;
418
+ let strategy;
419
+ let fullBackupFrequency;
420
+ let incrementalFrequency;
421
+ if (sizeBytes > 100 * 1024 * 1024 * 1024) {
422
+ strategy = "Large database - use incremental/WAL-based backups";
423
+ fullBackupFrequency = "Weekly";
424
+ incrementalFrequency = "Continuous WAL archiving";
425
+ }
426
+ else if (changePercent > 50) {
427
+ strategy = "High change rate - frequent backups recommended";
428
+ fullBackupFrequency = "Daily";
429
+ incrementalFrequency = "Every 6 hours";
430
+ }
431
+ else if (changePercent > 10) {
432
+ strategy = "Moderate activity - standard backup schedule";
433
+ fullBackupFrequency = "Daily";
434
+ incrementalFrequency = "Every 12 hours";
435
+ }
436
+ else {
437
+ strategy = "Low activity - conservative backup schedule";
438
+ fullBackupFrequency = "Daily";
439
+ incrementalFrequency = "Not required";
440
+ }
441
+ return {
442
+ analysis: {
443
+ databaseSize: dbSize.rows?.[0]?.["size"],
444
+ totalChanges,
445
+ // This is change velocity (total DML operations / current rows) - can exceed 100% for high-churn tables
446
+ changeVelocity: Number(changePercent.toFixed(2)),
447
+ changeVelocityRatio: changePercent.toFixed(2) + "%",
448
+ activityByHour: connActivity.rows?.map((row) => ({
449
+ hour: Number(row["hour"]),
450
+ connection_count: Number(row["connection_count"]),
451
+ })),
452
+ activityNote: "Activity data reflects current session connections only, not historical patterns",
453
+ },
454
+ recommendation: {
455
+ strategy,
456
+ fullBackupFrequency,
457
+ incrementalFrequency,
458
+ bestTimeForBackup: "Off-peak hours (typically 2-4 AM local time)",
459
+ retentionPolicy: "Keep 7 daily, 4 weekly, 12 monthly",
460
+ },
461
+ commands: {
462
+ cronSchedule: `0 2 * * * pg_dump -Fc -f /backups/daily_$(date +\\%Y\\%m\\%d).dump $POSTGRES_CONNECTION_STRING`,
463
+ walArchive: "archive_command = 'test ! -f /wal_archive/%f && cp %p /wal_archive/%f'",
464
+ },
465
+ };
386
466
  }
387
- else {
388
- strategy = "Low activity - conservative backup schedule";
389
- fullBackupFrequency = "Daily";
390
- incrementalFrequency = "Not required";
467
+ catch (error) {
468
+ return {
469
+ success: false,
470
+ error: formatPostgresError(error, {
471
+ tool: "pg_backup_schedule_optimize",
472
+ }),
473
+ };
391
474
  }
392
- return {
393
- analysis: {
394
- databaseSize: dbSize.rows?.[0]?.["size"],
395
- totalChanges,
396
- // This is change velocity (total DML operations / current rows) - can exceed 100% for high-churn tables
397
- changeVelocity: Number(changePercent.toFixed(2)),
398
- changeVelocityRatio: changePercent.toFixed(2) + "%",
399
- activityByHour: connActivity.rows?.map((row) => ({
400
- hour: Number(row["hour"]),
401
- connection_count: Number(row["connection_count"]),
402
- })),
403
- activityNote: "Activity data reflects current session connections only, not historical patterns",
404
- },
405
- recommendation: {
406
- strategy,
407
- fullBackupFrequency,
408
- incrementalFrequency,
409
- bestTimeForBackup: "Off-peak hours (typically 2-4 AM local time)",
410
- retentionPolicy: "Keep 7 daily, 4 weekly, 12 monthly",
411
- },
412
- commands: {
413
- cronSchedule: `0 2 * * * pg_dump -Fc -f /backups/daily_$(date +\\%Y\\%m\\%d).dump $POSTGRES_CONNECTION_STRING`,
414
- walArchive: "archive_command = 'test ! -f /wal_archive/%f && cp %p /wal_archive/%f'",
415
- },
416
- };
417
475
  },
418
476
  };
419
477
  }