@neverinfamous/postgres-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +515 -0
  3. package/dist/__tests__/mocks/adapter.d.ts +80 -0
  4. package/dist/__tests__/mocks/adapter.d.ts.map +1 -0
  5. package/dist/__tests__/mocks/adapter.js +225 -0
  6. package/dist/__tests__/mocks/adapter.js.map +1 -0
  7. package/dist/__tests__/mocks/index.d.ts +11 -0
  8. package/dist/__tests__/mocks/index.d.ts.map +1 -0
  9. package/dist/__tests__/mocks/index.js +11 -0
  10. package/dist/__tests__/mocks/index.js.map +1 -0
  11. package/dist/__tests__/mocks/pool.d.ts +43 -0
  12. package/dist/__tests__/mocks/pool.d.ts.map +1 -0
  13. package/dist/__tests__/mocks/pool.js +71 -0
  14. package/dist/__tests__/mocks/pool.js.map +1 -0
  15. package/dist/adapters/DatabaseAdapter.d.ts +139 -0
  16. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
  17. package/dist/adapters/DatabaseAdapter.js +250 -0
  18. package/dist/adapters/DatabaseAdapter.js.map +1 -0
  19. package/dist/adapters/postgresql/PostgresAdapter.d.ts +119 -0
  20. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -0
  21. package/dist/adapters/postgresql/PostgresAdapter.js +902 -0
  22. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -0
  23. package/dist/adapters/postgresql/index.d.ts +5 -0
  24. package/dist/adapters/postgresql/index.d.ts.map +1 -0
  25. package/dist/adapters/postgresql/index.js +5 -0
  26. package/dist/adapters/postgresql/index.js.map +1 -0
  27. package/dist/adapters/postgresql/prompts/backup.d.ts +8 -0
  28. package/dist/adapters/postgresql/prompts/backup.d.ts.map +1 -0
  29. package/dist/adapters/postgresql/prompts/backup.js +132 -0
  30. package/dist/adapters/postgresql/prompts/backup.js.map +1 -0
  31. package/dist/adapters/postgresql/prompts/citext.d.ts +8 -0
  32. package/dist/adapters/postgresql/prompts/citext.d.ts.map +1 -0
  33. package/dist/adapters/postgresql/prompts/citext.js +227 -0
  34. package/dist/adapters/postgresql/prompts/citext.js.map +1 -0
  35. package/dist/adapters/postgresql/prompts/extensionSetup.d.ts +8 -0
  36. package/dist/adapters/postgresql/prompts/extensionSetup.d.ts.map +1 -0
  37. package/dist/adapters/postgresql/prompts/extensionSetup.js +282 -0
  38. package/dist/adapters/postgresql/prompts/extensionSetup.js.map +1 -0
  39. package/dist/adapters/postgresql/prompts/health.d.ts +8 -0
  40. package/dist/adapters/postgresql/prompts/health.d.ts.map +1 -0
  41. package/dist/adapters/postgresql/prompts/health.js +118 -0
  42. package/dist/adapters/postgresql/prompts/health.js.map +1 -0
  43. package/dist/adapters/postgresql/prompts/index.d.ts +13 -0
  44. package/dist/adapters/postgresql/prompts/index.d.ts.map +1 -0
  45. package/dist/adapters/postgresql/prompts/index.js +308 -0
  46. package/dist/adapters/postgresql/prompts/index.js.map +1 -0
  47. package/dist/adapters/postgresql/prompts/indexTuning.d.ts +8 -0
  48. package/dist/adapters/postgresql/prompts/indexTuning.d.ts.map +1 -0
  49. package/dist/adapters/postgresql/prompts/indexTuning.js +130 -0
  50. package/dist/adapters/postgresql/prompts/indexTuning.js.map +1 -0
  51. package/dist/adapters/postgresql/prompts/kcache.d.ts +8 -0
  52. package/dist/adapters/postgresql/prompts/kcache.d.ts.map +1 -0
  53. package/dist/adapters/postgresql/prompts/kcache.js +227 -0
  54. package/dist/adapters/postgresql/prompts/kcache.js.map +1 -0
  55. package/dist/adapters/postgresql/prompts/ltree.d.ts +8 -0
  56. package/dist/adapters/postgresql/prompts/ltree.d.ts.map +1 -0
  57. package/dist/adapters/postgresql/prompts/ltree.js +286 -0
  58. package/dist/adapters/postgresql/prompts/ltree.js.map +1 -0
  59. package/dist/adapters/postgresql/prompts/partman.d.ts +8 -0
  60. package/dist/adapters/postgresql/prompts/partman.d.ts.map +1 -0
  61. package/dist/adapters/postgresql/prompts/partman.js +211 -0
  62. package/dist/adapters/postgresql/prompts/partman.js.map +1 -0
  63. package/dist/adapters/postgresql/prompts/pgcron.d.ts +8 -0
  64. package/dist/adapters/postgresql/prompts/pgcron.d.ts.map +1 -0
  65. package/dist/adapters/postgresql/prompts/pgcron.js +233 -0
  66. package/dist/adapters/postgresql/prompts/pgcron.js.map +1 -0
  67. package/dist/adapters/postgresql/prompts/pgcrypto.d.ts +8 -0
  68. package/dist/adapters/postgresql/prompts/pgcrypto.d.ts.map +1 -0
  69. package/dist/adapters/postgresql/prompts/pgcrypto.js +299 -0
  70. package/dist/adapters/postgresql/prompts/pgcrypto.js.map +1 -0
  71. package/dist/adapters/postgresql/prompts/pgvector.d.ts +8 -0
  72. package/dist/adapters/postgresql/prompts/pgvector.d.ts.map +1 -0
  73. package/dist/adapters/postgresql/prompts/pgvector.js +148 -0
  74. package/dist/adapters/postgresql/prompts/pgvector.js.map +1 -0
  75. package/dist/adapters/postgresql/prompts/postgis.d.ts +8 -0
  76. package/dist/adapters/postgresql/prompts/postgis.d.ts.map +1 -0
  77. package/dist/adapters/postgresql/prompts/postgis.js +200 -0
  78. package/dist/adapters/postgresql/prompts/postgis.js.map +1 -0
  79. package/dist/adapters/postgresql/resources/activity.d.ts +9 -0
  80. package/dist/adapters/postgresql/resources/activity.d.ts.map +1 -0
  81. package/dist/adapters/postgresql/resources/activity.js +118 -0
  82. package/dist/adapters/postgresql/resources/activity.js.map +1 -0
  83. package/dist/adapters/postgresql/resources/capabilities.d.ts +9 -0
  84. package/dist/adapters/postgresql/resources/capabilities.d.ts.map +1 -0
  85. package/dist/adapters/postgresql/resources/capabilities.js +182 -0
  86. package/dist/adapters/postgresql/resources/capabilities.js.map +1 -0
  87. package/dist/adapters/postgresql/resources/cron.d.ts +9 -0
  88. package/dist/adapters/postgresql/resources/cron.d.ts.map +1 -0
  89. package/dist/adapters/postgresql/resources/cron.js +156 -0
  90. package/dist/adapters/postgresql/resources/cron.js.map +1 -0
  91. package/dist/adapters/postgresql/resources/crypto.d.ts +9 -0
  92. package/dist/adapters/postgresql/resources/crypto.d.ts.map +1 -0
  93. package/dist/adapters/postgresql/resources/crypto.js +191 -0
  94. package/dist/adapters/postgresql/resources/crypto.js.map +1 -0
  95. package/dist/adapters/postgresql/resources/extensions.d.ts +9 -0
  96. package/dist/adapters/postgresql/resources/extensions.d.ts.map +1 -0
  97. package/dist/adapters/postgresql/resources/extensions.js +85 -0
  98. package/dist/adapters/postgresql/resources/extensions.js.map +1 -0
  99. package/dist/adapters/postgresql/resources/health.d.ts +9 -0
  100. package/dist/adapters/postgresql/resources/health.d.ts.map +1 -0
  101. package/dist/adapters/postgresql/resources/health.js +185 -0
  102. package/dist/adapters/postgresql/resources/health.js.map +1 -0
  103. package/dist/adapters/postgresql/resources/index.d.ts +40 -0
  104. package/dist/adapters/postgresql/resources/index.d.ts.map +1 -0
  105. package/dist/adapters/postgresql/resources/index.js +87 -0
  106. package/dist/adapters/postgresql/resources/index.js.map +1 -0
  107. package/dist/adapters/postgresql/resources/indexes.d.ts +9 -0
  108. package/dist/adapters/postgresql/resources/indexes.d.ts.map +1 -0
  109. package/dist/adapters/postgresql/resources/indexes.js +130 -0
  110. package/dist/adapters/postgresql/resources/indexes.js.map +1 -0
  111. package/dist/adapters/postgresql/resources/kcache.d.ts +9 -0
  112. package/dist/adapters/postgresql/resources/kcache.d.ts.map +1 -0
  113. package/dist/adapters/postgresql/resources/kcache.js +219 -0
  114. package/dist/adapters/postgresql/resources/kcache.js.map +1 -0
  115. package/dist/adapters/postgresql/resources/locks.d.ts +9 -0
  116. package/dist/adapters/postgresql/resources/locks.d.ts.map +1 -0
  117. package/dist/adapters/postgresql/resources/locks.js +89 -0
  118. package/dist/adapters/postgresql/resources/locks.js.map +1 -0
  119. package/dist/adapters/postgresql/resources/partman.d.ts +9 -0
  120. package/dist/adapters/postgresql/resources/partman.d.ts.map +1 -0
  121. package/dist/adapters/postgresql/resources/partman.js +149 -0
  122. package/dist/adapters/postgresql/resources/partman.js.map +1 -0
  123. package/dist/adapters/postgresql/resources/performance.d.ts +9 -0
  124. package/dist/adapters/postgresql/resources/performance.d.ts.map +1 -0
  125. package/dist/adapters/postgresql/resources/performance.js +170 -0
  126. package/dist/adapters/postgresql/resources/performance.js.map +1 -0
  127. package/dist/adapters/postgresql/resources/pool.d.ts +9 -0
  128. package/dist/adapters/postgresql/resources/pool.d.ts.map +1 -0
  129. package/dist/adapters/postgresql/resources/pool.js +93 -0
  130. package/dist/adapters/postgresql/resources/pool.js.map +1 -0
  131. package/dist/adapters/postgresql/resources/postgis.d.ts +9 -0
  132. package/dist/adapters/postgresql/resources/postgis.d.ts.map +1 -0
  133. package/dist/adapters/postgresql/resources/postgis.js +232 -0
  134. package/dist/adapters/postgresql/resources/postgis.js.map +1 -0
  135. package/dist/adapters/postgresql/resources/replication.d.ts +9 -0
  136. package/dist/adapters/postgresql/resources/replication.d.ts.map +1 -0
  137. package/dist/adapters/postgresql/resources/replication.js +126 -0
  138. package/dist/adapters/postgresql/resources/replication.js.map +1 -0
  139. package/dist/adapters/postgresql/resources/schema.d.ts +10 -0
  140. package/dist/adapters/postgresql/resources/schema.d.ts.map +1 -0
  141. package/dist/adapters/postgresql/resources/schema.js +80 -0
  142. package/dist/adapters/postgresql/resources/schema.js.map +1 -0
  143. package/dist/adapters/postgresql/resources/settings.d.ts +9 -0
  144. package/dist/adapters/postgresql/resources/settings.d.ts.map +1 -0
  145. package/dist/adapters/postgresql/resources/settings.js +184 -0
  146. package/dist/adapters/postgresql/resources/settings.js.map +1 -0
  147. package/dist/adapters/postgresql/resources/stats.d.ts +10 -0
  148. package/dist/adapters/postgresql/resources/stats.d.ts.map +1 -0
  149. package/dist/adapters/postgresql/resources/stats.js +124 -0
  150. package/dist/adapters/postgresql/resources/stats.js.map +1 -0
  151. package/dist/adapters/postgresql/resources/tables.d.ts +9 -0
  152. package/dist/adapters/postgresql/resources/tables.d.ts.map +1 -0
  153. package/dist/adapters/postgresql/resources/tables.js +20 -0
  154. package/dist/adapters/postgresql/resources/tables.js.map +1 -0
  155. package/dist/adapters/postgresql/resources/vacuum.d.ts +9 -0
  156. package/dist/adapters/postgresql/resources/vacuum.d.ts.map +1 -0
  157. package/dist/adapters/postgresql/resources/vacuum.js +122 -0
  158. package/dist/adapters/postgresql/resources/vacuum.js.map +1 -0
  159. package/dist/adapters/postgresql/resources/vector.d.ts +9 -0
  160. package/dist/adapters/postgresql/resources/vector.d.ts.map +1 -0
  161. package/dist/adapters/postgresql/resources/vector.js +185 -0
  162. package/dist/adapters/postgresql/resources/vector.js.map +1 -0
  163. package/dist/adapters/postgresql/schemas/admin.d.ts +74 -0
  164. package/dist/adapters/postgresql/schemas/admin.d.ts.map +1 -0
  165. package/dist/adapters/postgresql/schemas/admin.js +180 -0
  166. package/dist/adapters/postgresql/schemas/admin.js.map +1 -0
  167. package/dist/adapters/postgresql/schemas/backup.d.ts +68 -0
  168. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -0
  169. package/dist/adapters/postgresql/schemas/backup.js +114 -0
  170. package/dist/adapters/postgresql/schemas/backup.js.map +1 -0
  171. package/dist/adapters/postgresql/schemas/core.d.ts +443 -0
  172. package/dist/adapters/postgresql/schemas/core.d.ts.map +1 -0
  173. package/dist/adapters/postgresql/schemas/core.js +628 -0
  174. package/dist/adapters/postgresql/schemas/core.js.map +1 -0
  175. package/dist/adapters/postgresql/schemas/cron.d.ts +131 -0
  176. package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -0
  177. package/dist/adapters/postgresql/schemas/cron.js +218 -0
  178. package/dist/adapters/postgresql/schemas/cron.js.map +1 -0
  179. package/dist/adapters/postgresql/schemas/extensions.d.ts +403 -0
  180. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -0
  181. package/dist/adapters/postgresql/schemas/extensions.js +600 -0
  182. package/dist/adapters/postgresql/schemas/extensions.js.map +1 -0
  183. package/dist/adapters/postgresql/schemas/index.d.ts +21 -0
  184. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -0
  185. package/dist/adapters/postgresql/schemas/index.js +72 -0
  186. package/dist/adapters/postgresql/schemas/index.js.map +1 -0
  187. package/dist/adapters/postgresql/schemas/jsonb.d.ts +94 -0
  188. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -0
  189. package/dist/adapters/postgresql/schemas/jsonb.js +198 -0
  190. package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -0
  191. package/dist/adapters/postgresql/schemas/monitoring.d.ts +28 -0
  192. package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -0
  193. package/dist/adapters/postgresql/schemas/monitoring.js +45 -0
  194. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -0
  195. package/dist/adapters/postgresql/schemas/partitioning.d.ts +152 -0
  196. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -0
  197. package/dist/adapters/postgresql/schemas/partitioning.js +399 -0
  198. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -0
  199. package/dist/adapters/postgresql/schemas/partman.d.ts +94 -0
  200. package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -0
  201. package/dist/adapters/postgresql/schemas/partman.js +264 -0
  202. package/dist/adapters/postgresql/schemas/partman.js.map +1 -0
  203. package/dist/adapters/postgresql/schemas/performance.d.ts +52 -0
  204. package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -0
  205. package/dist/adapters/postgresql/schemas/performance.js +57 -0
  206. package/dist/adapters/postgresql/schemas/performance.js.map +1 -0
  207. package/dist/adapters/postgresql/schemas/postgis.d.ts +693 -0
  208. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -0
  209. package/dist/adapters/postgresql/schemas/postgis.js +662 -0
  210. package/dist/adapters/postgresql/schemas/postgis.js.map +1 -0
  211. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +171 -0
  212. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -0
  213. package/dist/adapters/postgresql/schemas/schema-mgmt.js +235 -0
  214. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -0
  215. package/dist/adapters/postgresql/schemas/stats.d.ts +229 -0
  216. package/dist/adapters/postgresql/schemas/stats.d.ts.map +1 -0
  217. package/dist/adapters/postgresql/schemas/stats.js +587 -0
  218. package/dist/adapters/postgresql/schemas/stats.js.map +1 -0
  219. package/dist/adapters/postgresql/schemas/text-search.d.ts +83 -0
  220. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -0
  221. package/dist/adapters/postgresql/schemas/text-search.js +132 -0
  222. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -0
  223. package/dist/adapters/postgresql/schemas/vector.d.ts +143 -0
  224. package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -0
  225. package/dist/adapters/postgresql/schemas/vector.js +123 -0
  226. package/dist/adapters/postgresql/schemas/vector.js.map +1 -0
  227. package/dist/adapters/postgresql/tools/admin.d.ts +13 -0
  228. package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -0
  229. package/dist/adapters/postgresql/tools/admin.js +417 -0
  230. package/dist/adapters/postgresql/tools/admin.js.map +1 -0
  231. package/dist/adapters/postgresql/tools/backup/dump.d.ts +12 -0
  232. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -0
  233. package/dist/adapters/postgresql/tools/backup/dump.js +546 -0
  234. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -0
  235. package/dist/adapters/postgresql/tools/backup/index.d.ts +16 -0
  236. package/dist/adapters/postgresql/tools/backup/index.d.ts.map +1 -0
  237. package/dist/adapters/postgresql/tools/backup/index.js +29 -0
  238. package/dist/adapters/postgresql/tools/backup/index.js.map +1 -0
  239. package/dist/adapters/postgresql/tools/backup/planning.d.ts +22 -0
  240. package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -0
  241. package/dist/adapters/postgresql/tools/backup/planning.js +411 -0
  242. package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -0
  243. package/dist/adapters/postgresql/tools/citext.d.ts +18 -0
  244. package/dist/adapters/postgresql/tools/citext.d.ts.map +1 -0
  245. package/dist/adapters/postgresql/tools/citext.js +568 -0
  246. package/dist/adapters/postgresql/tools/citext.js.map +1 -0
  247. package/dist/adapters/postgresql/tools/codemode/index.d.ts +27 -0
  248. package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -0
  249. package/dist/adapters/postgresql/tools/codemode/index.js +171 -0
  250. package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -0
  251. package/dist/adapters/postgresql/tools/core/convenience.d.ts +192 -0
  252. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -0
  253. package/dist/adapters/postgresql/tools/core/convenience.js +617 -0
  254. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -0
  255. package/dist/adapters/postgresql/tools/core/health.d.ts +20 -0
  256. package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -0
  257. package/dist/adapters/postgresql/tools/core/health.js +360 -0
  258. package/dist/adapters/postgresql/tools/core/health.js.map +1 -0
  259. package/dist/adapters/postgresql/tools/core/index.d.ts +15 -0
  260. package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -0
  261. package/dist/adapters/postgresql/tools/core/index.js +40 -0
  262. package/dist/adapters/postgresql/tools/core/index.js.map +1 -0
  263. package/dist/adapters/postgresql/tools/core/indexes.d.ts +30 -0
  264. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -0
  265. package/dist/adapters/postgresql/tools/core/indexes.js +232 -0
  266. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -0
  267. package/dist/adapters/postgresql/tools/core/objects.d.ts +20 -0
  268. package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -0
  269. package/dist/adapters/postgresql/tools/core/objects.js +361 -0
  270. package/dist/adapters/postgresql/tools/core/objects.js.map +1 -0
  271. package/dist/adapters/postgresql/tools/core/query.d.ts +16 -0
  272. package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -0
  273. package/dist/adapters/postgresql/tools/core/query.js +87 -0
  274. package/dist/adapters/postgresql/tools/core/query.js.map +1 -0
  275. package/dist/adapters/postgresql/tools/core/schemas.d.ts +135 -0
  276. package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -0
  277. package/dist/adapters/postgresql/tools/core/schemas.js +221 -0
  278. package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -0
  279. package/dist/adapters/postgresql/tools/core/tables.d.ts +24 -0
  280. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -0
  281. package/dist/adapters/postgresql/tools/core/tables.js +219 -0
  282. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -0
  283. package/dist/adapters/postgresql/tools/cron.d.ts +16 -0
  284. package/dist/adapters/postgresql/tools/cron.d.ts.map +1 -0
  285. package/dist/adapters/postgresql/tools/cron.js +440 -0
  286. package/dist/adapters/postgresql/tools/cron.js.map +1 -0
  287. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts +33 -0
  288. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -0
  289. package/dist/adapters/postgresql/tools/jsonb/advanced.js +681 -0
  290. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -0
  291. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +20 -0
  292. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -0
  293. package/dist/adapters/postgresql/tools/jsonb/basic.js +654 -0
  294. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -0
  295. package/dist/adapters/postgresql/tools/jsonb/index.d.ts +16 -0
  296. package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -0
  297. package/dist/adapters/postgresql/tools/jsonb/index.js +39 -0
  298. package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -0
  299. package/dist/adapters/postgresql/tools/kcache.d.ts +20 -0
  300. package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -0
  301. package/dist/adapters/postgresql/tools/kcache.js +574 -0
  302. package/dist/adapters/postgresql/tools/kcache.js.map +1 -0
  303. package/dist/adapters/postgresql/tools/ltree.d.ts +8 -0
  304. package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -0
  305. package/dist/adapters/postgresql/tools/ltree.js +390 -0
  306. package/dist/adapters/postgresql/tools/ltree.js.map +1 -0
  307. package/dist/adapters/postgresql/tools/monitoring.d.ts +13 -0
  308. package/dist/adapters/postgresql/tools/monitoring.d.ts.map +1 -0
  309. package/dist/adapters/postgresql/tools/monitoring.js +753 -0
  310. package/dist/adapters/postgresql/tools/monitoring.js.map +1 -0
  311. package/dist/adapters/postgresql/tools/partitioning.d.ts +13 -0
  312. package/dist/adapters/postgresql/tools/partitioning.d.ts.map +1 -0
  313. package/dist/adapters/postgresql/tools/partitioning.js +500 -0
  314. package/dist/adapters/postgresql/tools/partitioning.js.map +1 -0
  315. package/dist/adapters/postgresql/tools/partman/index.d.ts +19 -0
  316. package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -0
  317. package/dist/adapters/postgresql/tools/partman/index.js +33 -0
  318. package/dist/adapters/postgresql/tools/partman/index.js.map +1 -0
  319. package/dist/adapters/postgresql/tools/partman/management.d.ts +28 -0
  320. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -0
  321. package/dist/adapters/postgresql/tools/partman/management.js +563 -0
  322. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -0
  323. package/dist/adapters/postgresql/tools/partman/operations.d.ts +28 -0
  324. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -0
  325. package/dist/adapters/postgresql/tools/partman/operations.js +632 -0
  326. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -0
  327. package/dist/adapters/postgresql/tools/performance/analysis.d.ts +9 -0
  328. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -0
  329. package/dist/adapters/postgresql/tools/performance/analysis.js +383 -0
  330. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -0
  331. package/dist/adapters/postgresql/tools/performance/explain.d.ts +13 -0
  332. package/dist/adapters/postgresql/tools/performance/explain.d.ts.map +1 -0
  333. package/dist/adapters/postgresql/tools/performance/explain.js +71 -0
  334. package/dist/adapters/postgresql/tools/performance/explain.js.map +1 -0
  335. package/dist/adapters/postgresql/tools/performance/index.d.ts +13 -0
  336. package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -0
  337. package/dist/adapters/postgresql/tools/performance/index.js +40 -0
  338. package/dist/adapters/postgresql/tools/performance/index.js.map +1 -0
  339. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts +9 -0
  340. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -0
  341. package/dist/adapters/postgresql/tools/performance/monitoring.js +122 -0
  342. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -0
  343. package/dist/adapters/postgresql/tools/performance/optimization.d.ts +9 -0
  344. package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -0
  345. package/dist/adapters/postgresql/tools/performance/optimization.js +315 -0
  346. package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -0
  347. package/dist/adapters/postgresql/tools/performance/stats.d.ts +14 -0
  348. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -0
  349. package/dist/adapters/postgresql/tools/performance/stats.js +559 -0
  350. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -0
  351. package/dist/adapters/postgresql/tools/pgcrypto.d.ts +8 -0
  352. package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -0
  353. package/dist/adapters/postgresql/tools/pgcrypto.js +239 -0
  354. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -0
  355. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts +21 -0
  356. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -0
  357. package/dist/adapters/postgresql/tools/postgis/advanced.js +383 -0
  358. package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -0
  359. package/dist/adapters/postgresql/tools/postgis/basic.d.ts +16 -0
  360. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -0
  361. package/dist/adapters/postgresql/tools/postgis/basic.js +479 -0
  362. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -0
  363. package/dist/adapters/postgresql/tools/postgis/index.d.ts +17 -0
  364. package/dist/adapters/postgresql/tools/postgis/index.d.ts.map +1 -0
  365. package/dist/adapters/postgresql/tools/postgis/index.js +46 -0
  366. package/dist/adapters/postgresql/tools/postgis/index.js.map +1 -0
  367. package/dist/adapters/postgresql/tools/postgis/standalone.d.ts +21 -0
  368. package/dist/adapters/postgresql/tools/postgis/standalone.d.ts.map +1 -0
  369. package/dist/adapters/postgresql/tools/postgis/standalone.js +150 -0
  370. package/dist/adapters/postgresql/tools/postgis/standalone.js.map +1 -0
  371. package/dist/adapters/postgresql/tools/schema.d.ts +13 -0
  372. package/dist/adapters/postgresql/tools/schema.d.ts.map +1 -0
  373. package/dist/adapters/postgresql/tools/schema.js +515 -0
  374. package/dist/adapters/postgresql/tools/schema.js.map +1 -0
  375. package/dist/adapters/postgresql/tools/stats/advanced.d.ts +24 -0
  376. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -0
  377. package/dist/adapters/postgresql/tools/stats/advanced.js +876 -0
  378. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -0
  379. package/dist/adapters/postgresql/tools/stats/basic.d.ts +24 -0
  380. package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -0
  381. package/dist/adapters/postgresql/tools/stats/basic.js +501 -0
  382. package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -0
  383. package/dist/adapters/postgresql/tools/stats/index.d.ts +17 -0
  384. package/dist/adapters/postgresql/tools/stats/index.d.ts.map +1 -0
  385. package/dist/adapters/postgresql/tools/stats/index.js +30 -0
  386. package/dist/adapters/postgresql/tools/stats/index.js.map +1 -0
  387. package/dist/adapters/postgresql/tools/text.d.ts +13 -0
  388. package/dist/adapters/postgresql/tools/text.d.ts.map +1 -0
  389. package/dist/adapters/postgresql/tools/text.js +708 -0
  390. package/dist/adapters/postgresql/tools/text.js.map +1 -0
  391. package/dist/adapters/postgresql/tools/transactions.d.ts +13 -0
  392. package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -0
  393. package/dist/adapters/postgresql/tools/transactions.js +201 -0
  394. package/dist/adapters/postgresql/tools/transactions.js.map +1 -0
  395. package/dist/adapters/postgresql/tools/vector/advanced.d.ts +12 -0
  396. package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +1 -0
  397. package/dist/adapters/postgresql/tools/vector/advanced.js +902 -0
  398. package/dist/adapters/postgresql/tools/vector/advanced.js.map +1 -0
  399. package/dist/adapters/postgresql/tools/vector/basic.d.ts +25 -0
  400. package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +1 -0
  401. package/dist/adapters/postgresql/tools/vector/basic.js +1000 -0
  402. package/dist/adapters/postgresql/tools/vector/basic.js.map +1 -0
  403. package/dist/adapters/postgresql/tools/vector/index.d.ts +13 -0
  404. package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -0
  405. package/dist/adapters/postgresql/tools/vector/index.js +33 -0
  406. package/dist/adapters/postgresql/tools/vector/index.js.map +1 -0
  407. package/dist/auth/AuthorizationServerDiscovery.d.ts +44 -0
  408. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
  409. package/dist/auth/AuthorizationServerDiscovery.js +117 -0
  410. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
  411. package/dist/auth/OAuthResourceServer.d.ts +42 -0
  412. package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
  413. package/dist/auth/OAuthResourceServer.js +80 -0
  414. package/dist/auth/OAuthResourceServer.js.map +1 -0
  415. package/dist/auth/TokenValidator.d.ts +36 -0
  416. package/dist/auth/TokenValidator.d.ts.map +1 -0
  417. package/dist/auth/TokenValidator.js +139 -0
  418. package/dist/auth/TokenValidator.js.map +1 -0
  419. package/dist/auth/errors.d.ts +63 -0
  420. package/dist/auth/errors.d.ts.map +1 -0
  421. package/dist/auth/errors.js +102 -0
  422. package/dist/auth/errors.js.map +1 -0
  423. package/dist/auth/index.d.ts +15 -0
  424. package/dist/auth/index.d.ts.map +1 -0
  425. package/dist/auth/index.js +16 -0
  426. package/dist/auth/index.js.map +1 -0
  427. package/dist/auth/middleware.d.ts +61 -0
  428. package/dist/auth/middleware.d.ts.map +1 -0
  429. package/dist/auth/middleware.js +156 -0
  430. package/dist/auth/middleware.js.map +1 -0
  431. package/dist/auth/scopes.d.ts +65 -0
  432. package/dist/auth/scopes.d.ts.map +1 -0
  433. package/dist/auth/scopes.js +189 -0
  434. package/dist/auth/scopes.js.map +1 -0
  435. package/dist/auth/types.d.ts +208 -0
  436. package/dist/auth/types.d.ts.map +1 -0
  437. package/dist/auth/types.js +8 -0
  438. package/dist/auth/types.js.map +1 -0
  439. package/dist/cli/args.d.ts +34 -0
  440. package/dist/cli/args.d.ts.map +1 -0
  441. package/dist/cli/args.js +308 -0
  442. package/dist/cli/args.js.map +1 -0
  443. package/dist/cli/index.d.ts +8 -0
  444. package/dist/cli/index.d.ts.map +1 -0
  445. package/dist/cli/index.js +7 -0
  446. package/dist/cli/index.js.map +1 -0
  447. package/dist/cli.d.ts +9 -0
  448. package/dist/cli.d.ts.map +1 -0
  449. package/dist/cli.js +341 -0
  450. package/dist/cli.js.map +1 -0
  451. package/dist/codemode/api.d.ts +62 -0
  452. package/dist/codemode/api.d.ts.map +1 -0
  453. package/dist/codemode/api.js +1505 -0
  454. package/dist/codemode/api.js.map +1 -0
  455. package/dist/codemode/index.d.ts +13 -0
  456. package/dist/codemode/index.d.ts.map +1 -0
  457. package/dist/codemode/index.js +17 -0
  458. package/dist/codemode/index.js.map +1 -0
  459. package/dist/codemode/sandbox-factory.d.ts +72 -0
  460. package/dist/codemode/sandbox-factory.d.ts.map +1 -0
  461. package/dist/codemode/sandbox-factory.js +88 -0
  462. package/dist/codemode/sandbox-factory.js.map +1 -0
  463. package/dist/codemode/sandbox.d.ts +96 -0
  464. package/dist/codemode/sandbox.d.ts.map +1 -0
  465. package/dist/codemode/sandbox.js +345 -0
  466. package/dist/codemode/sandbox.js.map +1 -0
  467. package/dist/codemode/security.d.ts +44 -0
  468. package/dist/codemode/security.d.ts.map +1 -0
  469. package/dist/codemode/security.js +149 -0
  470. package/dist/codemode/security.js.map +1 -0
  471. package/dist/codemode/types.d.ts +137 -0
  472. package/dist/codemode/types.d.ts.map +1 -0
  473. package/dist/codemode/types.js +46 -0
  474. package/dist/codemode/types.js.map +1 -0
  475. package/dist/codemode/worker-sandbox.d.ts +82 -0
  476. package/dist/codemode/worker-sandbox.d.ts.map +1 -0
  477. package/dist/codemode/worker-sandbox.js +244 -0
  478. package/dist/codemode/worker-sandbox.js.map +1 -0
  479. package/dist/codemode/worker-script.d.ts +8 -0
  480. package/dist/codemode/worker-script.d.ts.map +1 -0
  481. package/dist/codemode/worker-script.js +113 -0
  482. package/dist/codemode/worker-script.js.map +1 -0
  483. package/dist/constants/ServerInstructions.d.ts +13 -0
  484. package/dist/constants/ServerInstructions.d.ts.map +1 -0
  485. package/dist/constants/ServerInstructions.js +405 -0
  486. package/dist/constants/ServerInstructions.js.map +1 -0
  487. package/dist/filtering/ToolConstants.d.ts +43 -0
  488. package/dist/filtering/ToolConstants.d.ts.map +1 -0
  489. package/dist/filtering/ToolConstants.js +352 -0
  490. package/dist/filtering/ToolConstants.js.map +1 -0
  491. package/dist/filtering/ToolFilter.d.ts +90 -0
  492. package/dist/filtering/ToolFilter.d.ts.map +1 -0
  493. package/dist/filtering/ToolFilter.js +315 -0
  494. package/dist/filtering/ToolFilter.js.map +1 -0
  495. package/dist/index.d.ts +15 -0
  496. package/dist/index.d.ts.map +1 -0
  497. package/dist/index.js +19 -0
  498. package/dist/index.js.map +1 -0
  499. package/dist/pool/ConnectionPool.d.ts +70 -0
  500. package/dist/pool/ConnectionPool.d.ts.map +1 -0
  501. package/dist/pool/ConnectionPool.js +254 -0
  502. package/dist/pool/ConnectionPool.js.map +1 -0
  503. package/dist/server/McpServer.d.ts +50 -0
  504. package/dist/server/McpServer.d.ts.map +1 -0
  505. package/dist/server/McpServer.js +108 -0
  506. package/dist/server/McpServer.js.map +1 -0
  507. package/dist/transports/http.d.ts +126 -0
  508. package/dist/transports/http.d.ts.map +1 -0
  509. package/dist/transports/http.js +303 -0
  510. package/dist/transports/http.js.map +1 -0
  511. package/dist/transports/index.d.ts +8 -0
  512. package/dist/transports/index.d.ts.map +1 -0
  513. package/dist/transports/index.js +7 -0
  514. package/dist/transports/index.js.map +1 -0
  515. package/dist/types/adapters.d.ts +136 -0
  516. package/dist/types/adapters.d.ts.map +1 -0
  517. package/dist/types/adapters.js +7 -0
  518. package/dist/types/adapters.js.map +1 -0
  519. package/dist/types/database.d.ts +204 -0
  520. package/dist/types/database.d.ts.map +1 -0
  521. package/dist/types/database.js +7 -0
  522. package/dist/types/database.js.map +1 -0
  523. package/dist/types/errors.d.ts +62 -0
  524. package/dist/types/errors.d.ts.map +1 -0
  525. package/dist/types/errors.js +91 -0
  526. package/dist/types/errors.js.map +1 -0
  527. package/dist/types/filtering.d.ts +39 -0
  528. package/dist/types/filtering.d.ts.map +1 -0
  529. package/dist/types/filtering.js +7 -0
  530. package/dist/types/filtering.js.map +1 -0
  531. package/dist/types/index.d.ts +16 -0
  532. package/dist/types/index.d.ts.map +1 -0
  533. package/dist/types/index.js +11 -0
  534. package/dist/types/index.js.map +1 -0
  535. package/dist/types/mcp.d.ts +31 -0
  536. package/dist/types/mcp.d.ts.map +1 -0
  537. package/dist/types/mcp.js +7 -0
  538. package/dist/types/mcp.js.map +1 -0
  539. package/dist/types/oauth.d.ts +65 -0
  540. package/dist/types/oauth.d.ts.map +1 -0
  541. package/dist/types/oauth.js +7 -0
  542. package/dist/types/oauth.js.map +1 -0
  543. package/dist/types/schema.d.ts +110 -0
  544. package/dist/types/schema.d.ts.map +1 -0
  545. package/dist/types/schema.js +7 -0
  546. package/dist/types/schema.js.map +1 -0
  547. package/dist/utils/annotations.d.ts +42 -0
  548. package/dist/utils/annotations.d.ts.map +1 -0
  549. package/dist/utils/annotations.js +75 -0
  550. package/dist/utils/annotations.js.map +1 -0
  551. package/dist/utils/icons.d.ts +25 -0
  552. package/dist/utils/icons.d.ts.map +1 -0
  553. package/dist/utils/icons.js +212 -0
  554. package/dist/utils/icons.js.map +1 -0
  555. package/dist/utils/identifiers.d.ts +111 -0
  556. package/dist/utils/identifiers.d.ts.map +1 -0
  557. package/dist/utils/identifiers.js +270 -0
  558. package/dist/utils/identifiers.js.map +1 -0
  559. package/dist/utils/logger.d.ts +141 -0
  560. package/dist/utils/logger.d.ts.map +1 -0
  561. package/dist/utils/logger.js +304 -0
  562. package/dist/utils/logger.js.map +1 -0
  563. package/dist/utils/promptGenerator.d.ts +20 -0
  564. package/dist/utils/promptGenerator.d.ts.map +1 -0
  565. package/dist/utils/promptGenerator.js +81 -0
  566. package/dist/utils/promptGenerator.js.map +1 -0
  567. package/dist/utils/resourceAnnotations.d.ts +36 -0
  568. package/dist/utils/resourceAnnotations.d.ts.map +1 -0
  569. package/dist/utils/resourceAnnotations.js +57 -0
  570. package/dist/utils/resourceAnnotations.js.map +1 -0
  571. package/package.json +64 -0
@@ -0,0 +1,753 @@
1
+ /**
2
+ * PostgreSQL Monitoring Tools
3
+ *
4
+ * Database health, sizes, connections, and replication status.
5
+ * 11 tools total.
6
+ */
7
+ import { z } from "zod";
8
+ import { readOnly } from "../../../utils/annotations.js";
9
+ import { getToolIcons } from "../../../utils/icons.js";
10
+ import { DatabaseSizeSchema, TableSizesSchema, ShowSettingsSchema, } from "../schemas/index.js";
11
+ /**
12
+ * Get all monitoring tools
13
+ */
14
+ export function getMonitoringTools(adapter) {
15
+ return [
16
+ createDatabaseSizeTool(adapter),
17
+ createTableSizesTool(adapter),
18
+ createConnectionStatsTool(adapter),
19
+ createReplicationStatusTool(adapter),
20
+ createServerVersionTool(adapter),
21
+ createShowSettingsTool(adapter),
22
+ createUptimeTool(adapter),
23
+ createRecoveryStatusTool(adapter),
24
+ createCapacityPlanningTool(adapter),
25
+ createResourceUsageAnalyzeTool(adapter),
26
+ createAlertThresholdSetTool(adapter),
27
+ ];
28
+ }
29
+ function createDatabaseSizeTool(adapter) {
30
+ return {
31
+ name: "pg_database_size",
32
+ description: "Get the size of a database.",
33
+ group: "monitoring",
34
+ inputSchema: DatabaseSizeSchema,
35
+ annotations: readOnly("Database Size"),
36
+ icons: getToolIcons("monitoring", readOnly("Database Size")),
37
+ handler: async (params, _context) => {
38
+ const { database } = DatabaseSizeSchema.parse(params);
39
+ const sql = database
40
+ ? `SELECT pg_database_size($1) as bytes, pg_size_pretty(pg_database_size($1)) as size`
41
+ : `SELECT pg_database_size(current_database()) as bytes, pg_size_pretty(pg_database_size(current_database())) as size`;
42
+ const result = await adapter.executeQuery(sql, database ? [database] : []);
43
+ const row = result.rows?.[0];
44
+ if (!row)
45
+ return row;
46
+ return {
47
+ ...row,
48
+ bytes: parseInt(String(row.bytes), 10),
49
+ };
50
+ },
51
+ };
52
+ }
53
+ function createTableSizesTool(adapter) {
54
+ return {
55
+ name: "pg_table_sizes",
56
+ description: "Get sizes of all tables with indexes and total.",
57
+ group: "monitoring",
58
+ inputSchema: TableSizesSchema,
59
+ annotations: readOnly("Table Sizes"),
60
+ icons: getToolIcons("monitoring", readOnly("Table Sizes")),
61
+ handler: async (params, _context) => {
62
+ const { schema, limit } = TableSizesSchema.parse(params);
63
+ const schemaClause = schema ? `AND n.nspname = '${schema}'` : "";
64
+ // Apply limit (default 50)
65
+ const effectiveLimit = limit !== undefined && limit > 0 ? limit : 50;
66
+ const limitClause = ` LIMIT ${String(effectiveLimit)}`;
67
+ const sql = `SELECT n.nspname as schema, c.relname as table_name,
68
+ pg_size_pretty(pg_table_size(c.oid)) as table_size,
69
+ pg_size_pretty(pg_indexes_size(c.oid)) as indexes_size,
70
+ pg_size_pretty(pg_total_relation_size(c.oid)) as total_size,
71
+ pg_total_relation_size(c.oid) as total_bytes
72
+ FROM pg_class c
73
+ LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
74
+ WHERE c.relkind IN ('r', 'p')
75
+ AND n.nspname NOT IN ('pg_catalog', 'information_schema')
76
+ ${schemaClause}
77
+ ORDER BY pg_total_relation_size(c.oid) DESC${limitClause}`;
78
+ const result = await adapter.executeQuery(sql);
79
+ // Coerce total_bytes to number for each table row
80
+ const tables = (result.rows ?? []).map((row) => {
81
+ const totalBytes = row["total_bytes"];
82
+ return {
83
+ ...row,
84
+ total_bytes: typeof totalBytes === "number"
85
+ ? totalBytes
86
+ : typeof totalBytes === "string"
87
+ ? parseInt(totalBytes, 10)
88
+ : 0,
89
+ };
90
+ });
91
+ // If limit was applied and we hit the limit, get total count to indicate truncation
92
+ if (tables.length === effectiveLimit) {
93
+ const countSql = `SELECT count(*) as total
94
+ FROM pg_class c
95
+ LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
96
+ WHERE c.relkind IN ('r', 'p')
97
+ AND n.nspname NOT IN ('pg_catalog', 'information_schema')
98
+ ${schemaClause}`;
99
+ const countResult = await adapter.executeQuery(countSql);
100
+ const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
101
+ return {
102
+ tables,
103
+ count: tables.length,
104
+ totalCount,
105
+ truncated: totalCount > tables.length,
106
+ };
107
+ }
108
+ return { tables, count: tables.length };
109
+ },
110
+ };
111
+ }
112
+ function createConnectionStatsTool(adapter) {
113
+ return {
114
+ name: "pg_connection_stats",
115
+ description: "Get connection statistics by database and state.",
116
+ group: "monitoring",
117
+ inputSchema: z.object({}),
118
+ annotations: readOnly("Connection Stats"),
119
+ icons: getToolIcons("monitoring", readOnly("Connection Stats")),
120
+ handler: async (_params, _context) => {
121
+ const sql = `SELECT datname, state, count(*) as connections
122
+ FROM pg_stat_activity
123
+ WHERE pid != pg_backend_pid()
124
+ GROUP BY datname, state
125
+ ORDER BY datname, state`;
126
+ const result = await adapter.executeQuery(sql);
127
+ const maxResult = await adapter.executeQuery(`SHOW max_connections`);
128
+ const maxConnections = maxResult.rows?.[0]?.["max_connections"];
129
+ const totalResult = await adapter.executeQuery(`SELECT count(*) as total FROM pg_stat_activity`);
130
+ // Coerce connection counts to numbers
131
+ const byDatabaseAndState = (result.rows ?? []).map((row) => {
132
+ const connCount = row["connections"];
133
+ return {
134
+ ...row,
135
+ connections: typeof connCount === "number"
136
+ ? connCount
137
+ : typeof connCount === "string"
138
+ ? parseInt(connCount, 10)
139
+ : 0,
140
+ };
141
+ });
142
+ const totalRaw = totalResult.rows?.[0]?.["total"];
143
+ const maxRaw = maxConnections;
144
+ return {
145
+ byDatabaseAndState,
146
+ totalConnections: typeof totalRaw === "number"
147
+ ? totalRaw
148
+ : typeof totalRaw === "string"
149
+ ? parseInt(totalRaw, 10)
150
+ : 0,
151
+ maxConnections: typeof maxRaw === "number"
152
+ ? maxRaw
153
+ : typeof maxRaw === "string"
154
+ ? parseInt(maxRaw, 10)
155
+ : 0,
156
+ };
157
+ },
158
+ };
159
+ }
160
+ function createReplicationStatusTool(adapter) {
161
+ return {
162
+ name: "pg_replication_status",
163
+ description: "Check replication status and lag.",
164
+ group: "monitoring",
165
+ inputSchema: z.object({}),
166
+ annotations: readOnly("Replication Status"),
167
+ icons: getToolIcons("monitoring", readOnly("Replication Status")),
168
+ handler: async (_params, _context) => {
169
+ const recoveryResult = await adapter.executeQuery(`SELECT pg_is_in_recovery() as is_replica`);
170
+ const isReplica = recoveryResult.rows?.[0]?.["is_replica"];
171
+ if (isReplica === true) {
172
+ const sql = `SELECT
173
+ now() - pg_last_xact_replay_timestamp() as replay_lag,
174
+ pg_last_wal_receive_lsn() as receive_lsn,
175
+ pg_last_wal_replay_lsn() as replay_lsn`;
176
+ const result = await adapter.executeQuery(sql);
177
+ return { role: "replica", ...result.rows?.[0] };
178
+ }
179
+ else {
180
+ const sql = `SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn,
181
+ now() - backend_start as connection_duration
182
+ FROM pg_stat_replication`;
183
+ const result = await adapter.executeQuery(sql);
184
+ return { role: "primary", replicas: result.rows };
185
+ }
186
+ },
187
+ };
188
+ }
189
+ function createServerVersionTool(adapter) {
190
+ return {
191
+ name: "pg_server_version",
192
+ description: "Get PostgreSQL server version information.",
193
+ group: "monitoring",
194
+ inputSchema: z.object({}),
195
+ annotations: readOnly("Server Version"),
196
+ icons: getToolIcons("monitoring", readOnly("Server Version")),
197
+ handler: async (_params, _context) => {
198
+ const sql = `SELECT version() as full_version,
199
+ current_setting('server_version') as version,
200
+ current_setting('server_version_num') as version_num`;
201
+ const result = await adapter.executeQuery(sql);
202
+ const row = result.rows?.[0];
203
+ if (!row)
204
+ return row;
205
+ return {
206
+ ...row,
207
+ version_num: parseInt(row.version_num, 10),
208
+ };
209
+ },
210
+ };
211
+ }
212
+ function createShowSettingsTool(adapter) {
213
+ return {
214
+ name: "pg_show_settings",
215
+ description: "Show current PostgreSQL configuration settings. Filter by name pattern or exact setting name. Accepts: pattern, setting, or name parameter.",
216
+ group: "monitoring",
217
+ inputSchema: ShowSettingsSchema,
218
+ annotations: readOnly("Show Settings"),
219
+ icons: getToolIcons("monitoring", readOnly("Show Settings")),
220
+ handler: async (params, _context) => {
221
+ const { pattern, limit } = ShowSettingsSchema.parse(params);
222
+ // Auto-detect if user passed exact name vs LIKE pattern
223
+ // If no wildcards, try exact match first, fall back to LIKE with wildcards
224
+ let whereClause = "";
225
+ let queryParams = [];
226
+ if (pattern !== undefined) {
227
+ if (pattern.includes("%") || pattern.includes("_")) {
228
+ // User specified LIKE pattern explicitly
229
+ whereClause = "WHERE name LIKE $1";
230
+ queryParams = [pattern];
231
+ }
232
+ else {
233
+ // Exact name - try exact match first, or pattern match with auto-wildcards
234
+ whereClause = "WHERE name = $1 OR name LIKE $2";
235
+ queryParams = [pattern, `%${pattern}%`];
236
+ }
237
+ }
238
+ // Build LIMIT clause if limit is specified
239
+ const limitClause = limit !== undefined && limit > 0 ? ` LIMIT ${String(limit)}` : "";
240
+ const sql = `SELECT name, setting, unit, category, short_desc
241
+ FROM pg_settings
242
+ ${whereClause}
243
+ ORDER BY category, name${limitClause}`;
244
+ const result = await adapter.executeQuery(sql, queryParams);
245
+ const rows = result.rows ?? [];
246
+ // If limit was applied, get total count to indicate truncation
247
+ if (limit !== undefined && limit > 0 && rows.length === limit) {
248
+ const countSql = `SELECT count(*) as total FROM pg_settings ${whereClause}`;
249
+ const countResult = await adapter.executeQuery(countSql, queryParams);
250
+ const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
251
+ return {
252
+ settings: rows,
253
+ count: rows.length,
254
+ totalCount,
255
+ truncated: totalCount > rows.length,
256
+ };
257
+ }
258
+ return {
259
+ settings: rows,
260
+ count: rows.length,
261
+ };
262
+ },
263
+ };
264
+ }
265
+ function createUptimeTool(adapter) {
266
+ return {
267
+ name: "pg_uptime",
268
+ description: "Get server uptime and startup time.",
269
+ group: "monitoring",
270
+ inputSchema: z.object({}),
271
+ annotations: readOnly("Server Uptime"),
272
+ icons: getToolIcons("monitoring", readOnly("Server Uptime")),
273
+ handler: async (_params, _context) => {
274
+ const sql = `SELECT
275
+ pg_postmaster_start_time() as start_time,
276
+ EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time())) as total_seconds`;
277
+ const result = await adapter.executeQuery(sql);
278
+ const row = result.rows?.[0];
279
+ if (!row)
280
+ return row;
281
+ // Parse total seconds into components
282
+ const totalSeconds = Number(row.total_seconds);
283
+ const days = Math.floor(totalSeconds / 86400);
284
+ const hours = Math.floor((totalSeconds % 86400) / 3600);
285
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
286
+ const seconds = Math.floor(totalSeconds % 60);
287
+ const milliseconds = parseFloat(((totalSeconds % 1) * 1000).toFixed(3));
288
+ return {
289
+ start_time: row.start_time,
290
+ uptime: {
291
+ days,
292
+ hours,
293
+ minutes,
294
+ seconds,
295
+ milliseconds,
296
+ },
297
+ };
298
+ },
299
+ };
300
+ }
301
+ function createRecoveryStatusTool(adapter) {
302
+ return {
303
+ name: "pg_recovery_status",
304
+ description: "Check if server is in recovery mode (replica).",
305
+ group: "monitoring",
306
+ inputSchema: z.object({}),
307
+ annotations: readOnly("Recovery Status"),
308
+ icons: getToolIcons("monitoring", readOnly("Recovery Status")),
309
+ handler: async (_params, _context) => {
310
+ const sql = `SELECT pg_is_in_recovery() as in_recovery,
311
+ CASE WHEN pg_is_in_recovery()
312
+ THEN pg_last_xact_replay_timestamp()
313
+ ELSE NULL
314
+ END as last_replay_timestamp`;
315
+ const result = await adapter.executeQuery(sql);
316
+ return result.rows?.[0];
317
+ },
318
+ };
319
+ }
320
+ /**
321
+ * Capacity planning analysis
322
+ */
323
+ function createCapacityPlanningTool(adapter) {
324
+ // Schema with alias support and validation for non-negative days
325
+ const CapacityPlanningSchema = z
326
+ .object({
327
+ projectionDays: z
328
+ .number()
329
+ .optional()
330
+ .describe("Days to project growth (default: 90)"),
331
+ days: z.number().optional().describe("Alias for projectionDays"),
332
+ })
333
+ .refine((data) => {
334
+ const val = data.projectionDays ?? data.days;
335
+ return val === undefined || val >= 0;
336
+ }, {
337
+ message: "Projection days must be a non-negative number",
338
+ path: ["days"],
339
+ })
340
+ .transform((data) => ({
341
+ projectionDays: data.projectionDays ?? data.days ?? 90,
342
+ }));
343
+ return {
344
+ name: "pg_capacity_planning",
345
+ description: "Analyze database growth trends and provide capacity planning forecasts. Note: Growth estimates are based on pg_stat_user_tables counters since last stats reset; accuracy depends on how long stats have been accumulating.",
346
+ group: "monitoring",
347
+ inputSchema: z.object({
348
+ projectionDays: z
349
+ .number()
350
+ .optional()
351
+ .describe("Days to project growth (default: 90)"),
352
+ days: z.number().optional().describe("Alias for projectionDays"),
353
+ }),
354
+ annotations: readOnly("Capacity Planning"),
355
+ icons: getToolIcons("monitoring", readOnly("Capacity Planning")),
356
+ handler: async (params, _context) => {
357
+ const parsed = CapacityPlanningSchema.parse(params ?? {});
358
+ const projectionDays = parsed.projectionDays;
359
+ const [dbSize, tableStats, connStats, statsAge] = await Promise.all([
360
+ adapter.executeQuery(`
361
+ SELECT
362
+ pg_database_size(current_database()) as current_size_bytes,
363
+ pg_size_pretty(pg_database_size(current_database())) as current_size
364
+ `),
365
+ adapter.executeQuery(`
366
+ SELECT
367
+ count(*) as table_count,
368
+ sum(n_live_tup) as total_rows,
369
+ sum(n_tup_ins) as total_inserts,
370
+ sum(n_tup_del) as total_deletes
371
+ FROM pg_stat_user_tables
372
+ `),
373
+ adapter.executeQuery(`
374
+ SELECT
375
+ current_setting('max_connections')::int as max_connections,
376
+ count(*) as current_connections
377
+ FROM pg_stat_activity
378
+ WHERE backend_type = 'client backend'
379
+ `),
380
+ // Get time since stats reset for accurate daily rate calculation
381
+ // Use pg_stat_database.stats_reset (works in all PG versions including 17+)
382
+ // Fall back to server start time if stats_reset is NULL
383
+ adapter.executeQuery(`
384
+ SELECT
385
+ COALESCE(
386
+ (SELECT stats_reset FROM pg_stat_database WHERE datname = current_database()),
387
+ pg_postmaster_start_time()
388
+ ) as stats_since,
389
+ EXTRACT(EPOCH FROM (now() - COALESCE(
390
+ (SELECT stats_reset FROM pg_stat_database WHERE datname = current_database()),
391
+ pg_postmaster_start_time()
392
+ ))) / 86400.0 as days_of_data
393
+ `),
394
+ ]);
395
+ const currentBytes = Number(dbSize.rows?.[0]?.["current_size_bytes"] ?? 0);
396
+ const tableData = tableStats.rows?.[0];
397
+ const connData = connStats.rows?.[0];
398
+ const ageData = statsAge.rows?.[0];
399
+ const totalInserts = Number(tableData?.["total_inserts"] ?? 0);
400
+ const totalDeletes = Number(tableData?.["total_deletes"] ?? 0);
401
+ const netRowGrowth = totalInserts - totalDeletes;
402
+ const totalRows = Number(tableData?.["total_rows"] ?? 1);
403
+ const avgRowSize = currentBytes / Math.max(totalRows, 1);
404
+ // Use actual days of data for accurate daily growth rate
405
+ const daysOfData = Number(ageData?.["days_of_data"] ?? 1);
406
+ const dailyRowGrowth = daysOfData > 0.01 ? netRowGrowth / daysOfData : 0;
407
+ const dailyGrowthBytes = dailyRowGrowth * avgRowSize;
408
+ const projectedGrowthBytes = dailyGrowthBytes * projectionDays;
409
+ const projectedTotalBytes = currentBytes + projectedGrowthBytes;
410
+ // Determine estimation quality based on data availability
411
+ const estimationQuality = daysOfData < 1
412
+ ? "Low confidence - less than 1 day of data"
413
+ : daysOfData < 7
414
+ ? "Moderate confidence - less than 1 week of data"
415
+ : daysOfData < 30
416
+ ? "Good confidence - more than 1 week of data"
417
+ : "High confidence - more than 30 days of data";
418
+ // Coerce numeric fields
419
+ const dbSizeRow = dbSize.rows?.[0];
420
+ const coercedDbSize = dbSizeRow
421
+ ? {
422
+ current_size_bytes: typeof dbSizeRow.current_size_bytes === "number"
423
+ ? dbSizeRow.current_size_bytes
424
+ : typeof dbSizeRow.current_size_bytes === "string"
425
+ ? parseInt(dbSizeRow.current_size_bytes, 10)
426
+ : 0,
427
+ current_size: dbSizeRow.current_size,
428
+ }
429
+ : undefined;
430
+ const tableCountRaw = tableData?.["table_count"];
431
+ const totalRowsRaw = tableData?.["total_rows"];
432
+ const totalInsertsRaw = tableData?.["total_inserts"];
433
+ const totalDeletesRaw = tableData?.["total_deletes"];
434
+ return {
435
+ current: {
436
+ databaseSize: coercedDbSize,
437
+ tableCount: typeof tableCountRaw === "number"
438
+ ? tableCountRaw
439
+ : typeof tableCountRaw === "string"
440
+ ? parseInt(tableCountRaw, 10)
441
+ : 0,
442
+ totalRows: typeof totalRowsRaw === "number"
443
+ ? totalRowsRaw
444
+ : typeof totalRowsRaw === "string"
445
+ ? parseInt(totalRowsRaw, 10)
446
+ : 0,
447
+ connections: `${String(Number(connData?.["current_connections"] ?? 0))}/${String(Number(connData?.["max_connections"] ?? 0))}`,
448
+ },
449
+ growth: {
450
+ totalInserts: typeof totalInsertsRaw === "number"
451
+ ? totalInsertsRaw
452
+ : typeof totalInsertsRaw === "string"
453
+ ? parseInt(totalInsertsRaw, 10)
454
+ : 0,
455
+ totalDeletes: typeof totalDeletesRaw === "number"
456
+ ? totalDeletesRaw
457
+ : typeof totalDeletesRaw === "string"
458
+ ? parseInt(totalDeletesRaw, 10)
459
+ : 0,
460
+ netRowGrowth,
461
+ daysOfData: parseFloat(daysOfData.toFixed(1)),
462
+ statsSince: ageData?.["stats_since"],
463
+ estimatedDailyRowGrowth: Math.round(dailyRowGrowth),
464
+ estimatedDailyGrowthBytes: Math.round(dailyGrowthBytes),
465
+ estimationQuality,
466
+ },
467
+ projection: {
468
+ days: projectionDays,
469
+ projectedSizeBytes: Math.round(projectedTotalBytes),
470
+ projectedSizePretty: `${(projectedTotalBytes / (1024 * 1024 * 1024)).toFixed(2)} GB`,
471
+ growthPercentage: currentBytes > 0
472
+ ? parseFloat(((projectedGrowthBytes / currentBytes) * 100).toFixed(1))
473
+ : 0.0,
474
+ },
475
+ recommendations: [
476
+ projectedTotalBytes > 100 * 1024 * 1024 * 1024
477
+ ? "Consider archiving old data or implementing table partitioning"
478
+ : null,
479
+ Number(connData?.["current_connections"] ?? 0) >
480
+ Number(connData?.["max_connections"] ?? 100) * 0.7
481
+ ? "Connection usage is high, consider increasing max_connections"
482
+ : null,
483
+ daysOfData < 7
484
+ ? "Wait for more data accumulation for more accurate projections"
485
+ : null,
486
+ ].filter(Boolean),
487
+ };
488
+ },
489
+ };
490
+ }
491
+ /**
492
+ * Resource usage analysis
493
+ */
494
+ function createResourceUsageAnalyzeTool(adapter) {
495
+ return {
496
+ name: "pg_resource_usage_analyze",
497
+ description: "Analyze current resource usage including CPU, memory, and I/O patterns.",
498
+ group: "monitoring",
499
+ inputSchema: z.object({}),
500
+ annotations: readOnly("Resource Usage Analysis"),
501
+ icons: getToolIcons("monitoring", readOnly("Resource Usage Analysis")),
502
+ handler: async (_params, _context) => {
503
+ // Detect PostgreSQL version for checkpoint stats compatibility
504
+ const versionResult = await adapter.executeQuery(`SELECT current_setting('server_version_num')::int as version_num`);
505
+ const versionNum = Number(versionResult.rows?.[0]?.["version_num"] ?? 0);
506
+ const isPg17Plus = versionNum >= 170000;
507
+ const [bgWriter, checkpoints, connections, buffers, activity] = await Promise.all([
508
+ // PG17+ moved buffers_checkpoint to pg_stat_checkpointer as buffers_written
509
+ isPg17Plus
510
+ ? adapter.executeQuery(`
511
+ SELECT
512
+ buffers_clean, maxwritten_clean, buffers_alloc
513
+ FROM pg_stat_bgwriter
514
+ `)
515
+ : adapter.executeQuery(`
516
+ SELECT
517
+ buffers_checkpoint, buffers_clean, buffers_backend,
518
+ maxwritten_clean, buffers_alloc
519
+ FROM pg_stat_bgwriter
520
+ `),
521
+ // PG17+ moved checkpoint stats to pg_stat_checkpointer with renamed columns
522
+ isPg17Plus
523
+ ? adapter.executeQuery(`
524
+ SELECT
525
+ num_timed as checkpoints_timed,
526
+ num_requested as checkpoints_req,
527
+ write_time as checkpoint_write_time,
528
+ sync_time as checkpoint_sync_time,
529
+ buffers_written as buffers_checkpoint
530
+ FROM pg_stat_checkpointer
531
+ `)
532
+ : adapter.executeQuery(`
533
+ SELECT
534
+ checkpoints_timed, checkpoints_req,
535
+ checkpoint_write_time, checkpoint_sync_time
536
+ FROM pg_stat_bgwriter
537
+ `),
538
+ adapter.executeQuery(`
539
+ SELECT
540
+ state, wait_event_type, wait_event,
541
+ count(*) as count
542
+ FROM pg_stat_activity
543
+ WHERE backend_type = 'client backend'
544
+ GROUP BY state, wait_event_type, wait_event
545
+ `),
546
+ adapter.executeQuery(`
547
+ SELECT
548
+ sum(heap_blks_read) as heap_reads,
549
+ sum(heap_blks_hit) as heap_hits,
550
+ sum(idx_blks_read) as index_reads,
551
+ sum(idx_blks_hit) as index_hits
552
+ FROM pg_statio_user_tables
553
+ `),
554
+ adapter.executeQuery(`
555
+ SELECT
556
+ count(*) FILTER (WHERE state = 'active') as active_queries,
557
+ count(*) FILTER (WHERE state = 'idle') as idle_connections,
558
+ count(*) FILTER (WHERE wait_event_type = 'Lock') as lock_waiting,
559
+ count(*) FILTER (WHERE wait_event_type = 'IO') as io_waiting
560
+ FROM pg_stat_activity
561
+ WHERE backend_type = 'client backend'
562
+ `),
563
+ ]);
564
+ const bufferData = buffers.rows?.[0];
565
+ const heapHits = Number(bufferData?.["heap_hits"] ?? 0);
566
+ const heapReads = Number(bufferData?.["heap_reads"] ?? 0);
567
+ const indexHits = Number(bufferData?.["index_hits"] ?? 0);
568
+ const indexReads = Number(bufferData?.["index_reads"] ?? 0);
569
+ // Calculate hit rates
570
+ const heapHitRate = heapHits + heapReads > 0
571
+ ? (heapHits / (heapHits + heapReads)) * 100
572
+ : null;
573
+ const indexHitRate = indexHits + indexReads > 0
574
+ ? (indexHits / (indexHits + indexReads)) * 100
575
+ : null;
576
+ // Interpret buffer hit rates
577
+ const getHitRateAnalysis = (rate, type) => {
578
+ if (rate === null)
579
+ return `No ${type} activity recorded yet - run some queries first`;
580
+ if (rate >= 99)
581
+ return `Excellent (${rate.toFixed(2)}%) - nearly all ${type} data served from cache`;
582
+ if (rate >= 95)
583
+ return `Good (${rate.toFixed(2)}%) - most ${type} reads from cache`;
584
+ if (rate >= 80)
585
+ return `Fair (${rate.toFixed(2)}%) - consider increasing shared_buffers`;
586
+ return `Poor (${rate.toFixed(2)}%) - significant disk I/O; increase shared_buffers or optimize queries`;
587
+ };
588
+ // Helper to coerce value to number
589
+ const toNum = (val) => typeof val === "number"
590
+ ? val
591
+ : typeof val === "string"
592
+ ? parseInt(val, 10)
593
+ : 0;
594
+ // Coerce backgroundWriter fields
595
+ const bgWriterRaw = bgWriter.rows?.[0];
596
+ const coercedBgWriter = bgWriterRaw
597
+ ? {
598
+ buffers_clean: toNum(bgWriterRaw["buffers_clean"]),
599
+ maxwritten_clean: toNum(bgWriterRaw["maxwritten_clean"]),
600
+ buffers_alloc: toNum(bgWriterRaw["buffers_alloc"]),
601
+ ...(bgWriterRaw["buffers_checkpoint"] !== undefined && {
602
+ buffers_checkpoint: toNum(bgWriterRaw["buffers_checkpoint"]),
603
+ }),
604
+ ...(bgWriterRaw["buffers_backend"] !== undefined && {
605
+ buffers_backend: toNum(bgWriterRaw["buffers_backend"]),
606
+ }),
607
+ }
608
+ : undefined;
609
+ // Coerce checkpoints fields
610
+ const checkpointsRaw = checkpoints.rows?.[0];
611
+ const coercedCheckpoints = checkpointsRaw
612
+ ? {
613
+ checkpoints_timed: toNum(checkpointsRaw["checkpoints_timed"]),
614
+ checkpoints_req: toNum(checkpointsRaw["checkpoints_req"]),
615
+ checkpoint_write_time: toNum(checkpointsRaw["checkpoint_write_time"]),
616
+ checkpoint_sync_time: toNum(checkpointsRaw["checkpoint_sync_time"]),
617
+ ...(checkpointsRaw["buffers_checkpoint"] !== undefined && {
618
+ buffers_checkpoint: toNum(checkpointsRaw["buffers_checkpoint"]),
619
+ }),
620
+ }
621
+ : undefined;
622
+ // Coerce connectionDistribution count fields
623
+ const coercedConnDist = (connections.rows ?? []).map((row) => ({
624
+ ...row,
625
+ count: toNum(row["count"]),
626
+ }));
627
+ // Coerce activity fields
628
+ const activityRaw = activity.rows?.[0];
629
+ const coercedActivity = activityRaw
630
+ ? {
631
+ active_queries: toNum(activityRaw["active_queries"]),
632
+ idle_connections: toNum(activityRaw["idle_connections"]),
633
+ lock_waiting: toNum(activityRaw["lock_waiting"]),
634
+ io_waiting: toNum(activityRaw["io_waiting"]),
635
+ }
636
+ : undefined;
637
+ return {
638
+ backgroundWriter: coercedBgWriter,
639
+ checkpoints: coercedCheckpoints,
640
+ connectionDistribution: coercedConnDist,
641
+ bufferUsage: {
642
+ heap_reads: heapReads,
643
+ heap_hits: heapHits,
644
+ index_reads: indexReads,
645
+ index_hits: indexHits,
646
+ heapHitRate: heapHitRate !== null ? heapHitRate.toFixed(2) + "%" : "N/A",
647
+ indexHitRate: indexHitRate !== null ? indexHitRate.toFixed(2) + "%" : "N/A",
648
+ },
649
+ activity: coercedActivity,
650
+ analysis: {
651
+ heapCachePerformance: getHitRateAnalysis(heapHitRate, "heap"),
652
+ indexCachePerformance: getHitRateAnalysis(indexHitRate, "index"),
653
+ checkpointPressure: (coercedCheckpoints?.checkpoints_req ?? 0) >
654
+ (coercedCheckpoints?.checkpoints_timed ?? 0)
655
+ ? "HIGH - More forced checkpoints than scheduled"
656
+ : "Normal",
657
+ ioPattern: (coercedActivity?.io_waiting ?? 0) > 0
658
+ ? "Some queries waiting on I/O"
659
+ : "No I/O wait bottlenecks detected",
660
+ lockContention: (coercedActivity?.lock_waiting ?? 0) > 0
661
+ ? `${String(coercedActivity?.lock_waiting ?? 0)} queries waiting on locks`
662
+ : "No lock contention",
663
+ },
664
+ };
665
+ },
666
+ };
667
+ }
668
+ /**
669
+ * Alert threshold recommendations (informational)
670
+ */
671
+ function createAlertThresholdSetTool(_adapter) {
672
+ return {
673
+ name: "pg_alert_threshold_set",
674
+ description: "Get recommended alert thresholds for monitoring key database metrics. Note: This is informational only - returns suggested warning/critical thresholds for external monitoring tools. Does not configure alerts in PostgreSQL itself.",
675
+ group: "monitoring",
676
+ inputSchema: z.object({
677
+ metric: z
678
+ .enum([
679
+ "connection_usage",
680
+ "cache_hit_ratio",
681
+ "replication_lag",
682
+ "dead_tuples",
683
+ "long_running_queries",
684
+ "lock_wait_time",
685
+ ])
686
+ .optional()
687
+ .describe("Specific metric to get thresholds for, or all if not specified"),
688
+ }),
689
+ annotations: readOnly("Get Alert Thresholds"),
690
+ icons: getToolIcons("monitoring", readOnly("Get Alert Thresholds")),
691
+ // eslint-disable-next-line @typescript-eslint/require-await
692
+ handler: async (params, _context) => {
693
+ // Schema with validated enum for metric
694
+ const AlertThresholdSchema = z.object({
695
+ metric: z
696
+ .enum([
697
+ "connection_usage",
698
+ "cache_hit_ratio",
699
+ "replication_lag",
700
+ "dead_tuples",
701
+ "long_running_queries",
702
+ "lock_wait_time",
703
+ ])
704
+ .optional()
705
+ .describe("Specific metric to get thresholds for, or all if not specified"),
706
+ });
707
+ const parsed = AlertThresholdSchema.parse(params ?? {});
708
+ const thresholds = {
709
+ connection_usage: {
710
+ warning: "70%",
711
+ critical: "90%",
712
+ description: "Percentage of max_connections in use",
713
+ },
714
+ cache_hit_ratio: {
715
+ warning: "< 95%",
716
+ critical: "< 80%",
717
+ description: "Buffer cache hit ratio - lower is worse",
718
+ },
719
+ replication_lag: {
720
+ warning: "> 1 minute",
721
+ critical: "> 5 minutes",
722
+ description: "Replication lag from primary to replica",
723
+ },
724
+ dead_tuples: {
725
+ warning: "> 10% of live tuples",
726
+ critical: "> 25% of live tuples",
727
+ description: "Dead tuples indicating need for VACUUM",
728
+ },
729
+ long_running_queries: {
730
+ warning: "> 5 minutes",
731
+ critical: "> 30 minutes",
732
+ description: "Queries running longer than threshold",
733
+ },
734
+ lock_wait_time: {
735
+ warning: "> 30 seconds",
736
+ critical: "> 5 minutes",
737
+ description: "Time spent waiting for locks",
738
+ },
739
+ };
740
+ if (parsed.metric && thresholds[parsed.metric]) {
741
+ return {
742
+ metric: parsed.metric,
743
+ threshold: thresholds[parsed.metric],
744
+ };
745
+ }
746
+ return {
747
+ thresholds,
748
+ note: "These are recommended starting thresholds. Adjust based on your specific workload and requirements.",
749
+ };
750
+ },
751
+ };
752
+ }
753
+ //# sourceMappingURL=monitoring.js.map