@neverinfamous/postgres-mcp 2.0.0 → 2.1.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 (458) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +76 -9
  3. package/dist/__tests__/benchmarks/schema-parsing.bench.js +1 -1
  4. package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -1
  5. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  6. package/dist/__tests__/mocks/adapter.js +2 -1
  7. package/dist/__tests__/mocks/adapter.js.map +1 -1
  8. package/dist/adapters/DatabaseAdapter.d.ts +6 -1
  9. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  10. package/dist/adapters/DatabaseAdapter.js +11 -7
  11. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  12. package/dist/adapters/postgresql/PostgresAdapter.d.ts +5 -22
  13. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
  14. package/dist/adapters/postgresql/PostgresAdapter.js +28 -520
  15. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
  16. package/dist/adapters/postgresql/prompts/index.js +1 -1
  17. package/dist/adapters/postgresql/prompts/index.js.map +1 -1
  18. package/dist/adapters/postgresql/resources/index.d.ts +1 -1
  19. package/dist/adapters/postgresql/resources/index.js +3 -3
  20. package/dist/adapters/postgresql/resources/index.js.map +1 -1
  21. package/dist/adapters/postgresql/schema-operations.d.ts +71 -0
  22. package/dist/adapters/postgresql/schema-operations.d.ts.map +1 -0
  23. package/dist/adapters/postgresql/schema-operations.js +561 -0
  24. package/dist/adapters/postgresql/schema-operations.js.map +1 -0
  25. package/dist/adapters/postgresql/schemas/admin.d.ts +4 -4
  26. package/dist/adapters/postgresql/schemas/admin.js +4 -4
  27. package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
  28. package/dist/adapters/postgresql/schemas/backup.d.ts +2 -2
  29. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
  30. package/dist/adapters/postgresql/schemas/backup.js +1 -3
  31. package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
  32. package/dist/adapters/postgresql/schemas/core/index.d.ts +6 -0
  33. package/dist/adapters/postgresql/schemas/core/index.d.ts.map +1 -0
  34. package/dist/adapters/postgresql/schemas/core/index.js +6 -0
  35. package/dist/adapters/postgresql/schemas/core/index.js.map +1 -0
  36. package/dist/adapters/postgresql/schemas/{core.d.ts → core/queries.d.ts} +12 -167
  37. package/dist/adapters/postgresql/schemas/core/queries.d.ts.map +1 -0
  38. package/dist/adapters/postgresql/schemas/{core.js → core/queries.js} +5 -213
  39. package/dist/adapters/postgresql/schemas/core/queries.js.map +1 -0
  40. package/dist/adapters/postgresql/schemas/core/transactions.d.ts +149 -0
  41. package/dist/adapters/postgresql/schemas/core/transactions.d.ts.map +1 -0
  42. package/dist/adapters/postgresql/schemas/core/transactions.js +239 -0
  43. package/dist/adapters/postgresql/schemas/core/transactions.js.map +1 -0
  44. package/dist/adapters/postgresql/schemas/cron.d.ts +12 -12
  45. package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
  46. package/dist/adapters/postgresql/schemas/cron.js +38 -10
  47. package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
  48. package/dist/adapters/postgresql/schemas/extensions/citext.d.ts +222 -0
  49. package/dist/adapters/postgresql/schemas/extensions/citext.d.ts.map +1 -0
  50. package/dist/adapters/postgresql/schemas/extensions/citext.js +306 -0
  51. package/dist/adapters/postgresql/schemas/extensions/citext.js.map +1 -0
  52. package/dist/adapters/postgresql/schemas/extensions/index.d.ts +15 -0
  53. package/dist/adapters/postgresql/schemas/extensions/index.d.ts.map +1 -0
  54. package/dist/adapters/postgresql/schemas/extensions/index.js +20 -0
  55. package/dist/adapters/postgresql/schemas/extensions/index.js.map +1 -0
  56. package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts +164 -0
  57. package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts.map +1 -0
  58. package/dist/adapters/postgresql/schemas/extensions/kcache.js +225 -0
  59. package/dist/adapters/postgresql/schemas/extensions/kcache.js.map +1 -0
  60. package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts +253 -0
  61. package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts.map +1 -0
  62. package/dist/adapters/postgresql/schemas/extensions/ltree.js +430 -0
  63. package/dist/adapters/postgresql/schemas/extensions/ltree.js.map +1 -0
  64. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts +251 -0
  65. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts.map +1 -0
  66. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js +294 -0
  67. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js.map +1 -0
  68. package/dist/adapters/postgresql/schemas/extensions/shared.d.ts +10 -0
  69. package/dist/adapters/postgresql/schemas/extensions/shared.d.ts.map +1 -0
  70. package/dist/adapters/postgresql/schemas/extensions/shared.js +15 -0
  71. package/dist/adapters/postgresql/schemas/extensions/shared.js.map +1 -0
  72. package/dist/adapters/postgresql/schemas/index.d.ts +6 -6
  73. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
  74. package/dist/adapters/postgresql/schemas/index.js +8 -8
  75. package/dist/adapters/postgresql/schemas/index.js.map +1 -1
  76. package/dist/adapters/postgresql/schemas/introspection.d.ts +14 -14
  77. package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -1
  78. package/dist/adapters/postgresql/schemas/introspection.js +6 -3
  79. package/dist/adapters/postgresql/schemas/introspection.js.map +1 -1
  80. package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts +270 -0
  81. package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts.map +1 -0
  82. package/dist/adapters/postgresql/schemas/jsonb/advanced.js +371 -0
  83. package/dist/adapters/postgresql/schemas/jsonb/advanced.js.map +1 -0
  84. package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts +283 -0
  85. package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts.map +1 -0
  86. package/dist/adapters/postgresql/schemas/jsonb/basic.js +456 -0
  87. package/dist/adapters/postgresql/schemas/jsonb/basic.js.map +1 -0
  88. package/dist/adapters/postgresql/schemas/jsonb/index.d.ts +6 -0
  89. package/dist/adapters/postgresql/schemas/jsonb/index.d.ts.map +1 -0
  90. package/dist/adapters/postgresql/schemas/jsonb/index.js +6 -0
  91. package/dist/adapters/postgresql/schemas/jsonb/index.js.map +1 -0
  92. package/dist/adapters/postgresql/schemas/monitoring.d.ts +4 -4
  93. package/dist/adapters/postgresql/schemas/monitoring.js +2 -2
  94. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
  95. package/dist/adapters/postgresql/schemas/partitioning.d.ts +14 -14
  96. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
  97. package/dist/adapters/postgresql/schemas/partitioning.js +64 -46
  98. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
  99. package/dist/adapters/postgresql/schemas/partman.d.ts +16 -14
  100. package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
  101. package/dist/adapters/postgresql/schemas/partman.js +9 -9
  102. package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
  103. package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts +429 -0
  104. package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts.map +1 -0
  105. package/dist/adapters/postgresql/schemas/postgis/advanced.js +495 -0
  106. package/dist/adapters/postgresql/schemas/postgis/advanced.js.map +1 -0
  107. package/dist/adapters/postgresql/schemas/{postgis.d.ts → postgis/basic.d.ts} +1 -423
  108. package/dist/adapters/postgresql/schemas/postgis/basic.d.ts.map +1 -0
  109. package/dist/adapters/postgresql/schemas/{postgis.js → postgis/basic.js} +1 -486
  110. package/dist/adapters/postgresql/schemas/postgis/basic.js.map +1 -0
  111. package/dist/adapters/postgresql/schemas/postgis/index.d.ts +6 -0
  112. package/dist/adapters/postgresql/schemas/postgis/index.d.ts.map +1 -0
  113. package/dist/adapters/postgresql/schemas/postgis/index.js +6 -0
  114. package/dist/adapters/postgresql/schemas/postgis/index.js.map +1 -0
  115. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +35 -25
  116. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
  117. package/dist/adapters/postgresql/schemas/schema-mgmt.js +57 -19
  118. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
  119. package/dist/adapters/postgresql/schemas/stats/index.d.ts +6 -0
  120. package/dist/adapters/postgresql/schemas/stats/index.d.ts.map +1 -0
  121. package/dist/adapters/postgresql/schemas/stats/index.js +6 -0
  122. package/dist/adapters/postgresql/schemas/stats/index.js.map +1 -0
  123. package/dist/adapters/postgresql/schemas/stats/input.d.ts +260 -0
  124. package/dist/adapters/postgresql/schemas/stats/input.d.ts.map +1 -0
  125. package/dist/adapters/postgresql/schemas/{stats.js → stats/input.js} +2 -331
  126. package/dist/adapters/postgresql/schemas/stats/input.js.map +1 -0
  127. package/dist/adapters/postgresql/schemas/{stats.d.ts → stats/output.d.ts} +3 -246
  128. package/dist/adapters/postgresql/schemas/stats/output.d.ts.map +1 -0
  129. package/dist/adapters/postgresql/schemas/stats/output.js +334 -0
  130. package/dist/adapters/postgresql/schemas/stats/output.js.map +1 -0
  131. package/dist/adapters/postgresql/schemas/text-search.d.ts +18 -18
  132. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
  133. package/dist/adapters/postgresql/schemas/text-search.js +12 -27
  134. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
  135. package/dist/adapters/postgresql/schemas/vector.d.ts +10 -10
  136. package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -1
  137. package/dist/adapters/postgresql/schemas/vector.js +12 -16
  138. package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
  139. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
  140. package/dist/adapters/postgresql/tools/backup/dump.js +95 -76
  141. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
  142. package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -1
  143. package/dist/adapters/postgresql/tools/backup/planning.js +345 -287
  144. package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -1
  145. package/dist/adapters/postgresql/tools/citext/analysis.d.ts +24 -0
  146. package/dist/adapters/postgresql/tools/citext/analysis.d.ts.map +1 -0
  147. package/dist/adapters/postgresql/tools/{citext.js → citext/analysis.js} +50 -232
  148. package/dist/adapters/postgresql/tools/citext/analysis.js.map +1 -0
  149. package/dist/adapters/postgresql/tools/citext/index.d.ts +15 -0
  150. package/dist/adapters/postgresql/tools/citext/index.d.ts.map +1 -0
  151. package/dist/adapters/postgresql/tools/citext/index.js +23 -0
  152. package/dist/adapters/postgresql/tools/citext/index.js.map +1 -0
  153. package/dist/adapters/postgresql/tools/citext/setup.d.ts +16 -0
  154. package/dist/adapters/postgresql/tools/citext/setup.d.ts.map +1 -0
  155. package/dist/adapters/postgresql/tools/citext/setup.js +193 -0
  156. package/dist/adapters/postgresql/tools/citext/setup.js.map +1 -0
  157. package/dist/adapters/postgresql/tools/codemode/index.js +1 -1
  158. package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
  159. package/dist/adapters/postgresql/tools/core/convenience.d.ts +12 -22
  160. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
  161. package/dist/adapters/postgresql/tools/core/convenience.js +100 -210
  162. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
  163. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts +1 -0
  164. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts.map +1 -1
  165. package/dist/adapters/postgresql/tools/core/error-helpers.js +8 -1
  166. package/dist/adapters/postgresql/tools/core/error-helpers.js.map +1 -1
  167. package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
  168. package/dist/adapters/postgresql/tools/core/health.js +124 -114
  169. package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
  170. package/dist/adapters/postgresql/tools/core/index.d.ts +2 -1
  171. package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -1
  172. package/dist/adapters/postgresql/tools/core/index.js +3 -2
  173. package/dist/adapters/postgresql/tools/core/index.js.map +1 -1
  174. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
  175. package/dist/adapters/postgresql/tools/core/indexes.js +151 -127
  176. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
  177. package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
  178. package/dist/adapters/postgresql/tools/core/objects.js +186 -161
  179. package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
  180. package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
  181. package/dist/adapters/postgresql/tools/core/query.js +37 -25
  182. package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
  183. package/dist/adapters/postgresql/tools/core/schemas.d.ts +6 -3
  184. package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
  185. package/dist/adapters/postgresql/tools/core/schemas.js +11 -2
  186. package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
  187. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
  188. package/dist/adapters/postgresql/tools/core/tables.js +156 -129
  189. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
  190. package/dist/adapters/postgresql/tools/core/utility.d.ts +26 -0
  191. package/dist/adapters/postgresql/tools/core/utility.d.ts.map +1 -0
  192. package/dist/adapters/postgresql/tools/core/utility.js +174 -0
  193. package/dist/adapters/postgresql/tools/core/utility.js.map +1 -0
  194. package/dist/adapters/postgresql/tools/cron.js +90 -43
  195. package/dist/adapters/postgresql/tools/cron.js.map +1 -1
  196. package/dist/adapters/postgresql/tools/introspection/analysis.d.ts +12 -0
  197. package/dist/adapters/postgresql/tools/introspection/analysis.d.ts.map +1 -0
  198. package/dist/adapters/postgresql/tools/introspection/analysis.js +574 -0
  199. package/dist/adapters/postgresql/tools/introspection/analysis.js.map +1 -0
  200. package/dist/adapters/postgresql/tools/introspection/graph.d.ts +55 -0
  201. package/dist/adapters/postgresql/tools/introspection/graph.d.ts.map +1 -0
  202. package/dist/adapters/postgresql/tools/introspection/graph.js +638 -0
  203. package/dist/adapters/postgresql/tools/introspection/graph.js.map +1 -0
  204. package/dist/adapters/postgresql/tools/introspection/index.d.ts +19 -0
  205. package/dist/adapters/postgresql/tools/introspection/index.d.ts.map +1 -0
  206. package/dist/adapters/postgresql/tools/introspection/index.js +36 -0
  207. package/dist/adapters/postgresql/tools/introspection/index.js.map +1 -0
  208. package/dist/adapters/postgresql/tools/introspection/migration.d.ts +15 -0
  209. package/dist/adapters/postgresql/tools/introspection/migration.d.ts.map +1 -0
  210. package/dist/adapters/postgresql/tools/introspection/migration.js +599 -0
  211. package/dist/adapters/postgresql/tools/introspection/migration.js.map +1 -0
  212. package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts +20 -0
  213. package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts.map +1 -0
  214. package/dist/adapters/postgresql/tools/jsonb/analytics.js +367 -0
  215. package/dist/adapters/postgresql/tools/jsonb/analytics.js.map +1 -0
  216. package/dist/adapters/postgresql/tools/jsonb/index.d.ts +4 -2
  217. package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -1
  218. package/dist/adapters/postgresql/tools/jsonb/index.js +8 -4
  219. package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -1
  220. package/dist/adapters/postgresql/tools/jsonb/read.d.ts +38 -0
  221. package/dist/adapters/postgresql/tools/jsonb/read.d.ts.map +1 -0
  222. package/dist/adapters/postgresql/tools/jsonb/{basic.js → read.js} +41 -482
  223. package/dist/adapters/postgresql/tools/jsonb/read.js.map +1 -0
  224. package/dist/adapters/postgresql/tools/jsonb/{advanced.d.ts → transform.d.ts} +1 -13
  225. package/dist/adapters/postgresql/tools/jsonb/transform.d.ts.map +1 -0
  226. package/dist/adapters/postgresql/tools/jsonb/{advanced.js → transform.js} +26 -357
  227. package/dist/adapters/postgresql/tools/jsonb/transform.js.map +1 -0
  228. package/dist/adapters/postgresql/tools/jsonb/write.d.ts +14 -0
  229. package/dist/adapters/postgresql/tools/jsonb/write.d.ts.map +1 -0
  230. package/dist/adapters/postgresql/tools/jsonb/write.js +468 -0
  231. package/dist/adapters/postgresql/tools/jsonb/write.js.map +1 -0
  232. package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
  233. package/dist/adapters/postgresql/tools/kcache.js +116 -51
  234. package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
  235. package/dist/adapters/postgresql/tools/ltree.js +346 -260
  236. package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
  237. package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts +15 -0
  238. package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts.map +1 -0
  239. package/dist/adapters/postgresql/tools/{monitoring.js → monitoring/analysis.js} +24 -359
  240. package/dist/adapters/postgresql/tools/monitoring/analysis.js.map +1 -0
  241. package/dist/adapters/postgresql/tools/monitoring/basic.d.ts +17 -0
  242. package/dist/adapters/postgresql/tools/monitoring/basic.d.ts.map +1 -0
  243. package/dist/adapters/postgresql/tools/monitoring/basic.js +432 -0
  244. package/dist/adapters/postgresql/tools/monitoring/basic.js.map +1 -0
  245. package/dist/adapters/postgresql/tools/monitoring/index.d.ts +16 -0
  246. package/dist/adapters/postgresql/tools/monitoring/index.d.ts.map +1 -0
  247. package/dist/adapters/postgresql/tools/monitoring/index.js +31 -0
  248. package/dist/adapters/postgresql/tools/monitoring/index.js.map +1 -0
  249. package/dist/adapters/postgresql/tools/partitioning/index.d.ts +15 -0
  250. package/dist/adapters/postgresql/tools/partitioning/index.d.ts.map +1 -0
  251. package/dist/adapters/postgresql/tools/partitioning/index.js +23 -0
  252. package/dist/adapters/postgresql/tools/partitioning/index.js.map +1 -0
  253. package/dist/adapters/postgresql/tools/partitioning/info.d.ts +11 -0
  254. package/dist/adapters/postgresql/tools/partitioning/info.d.ts.map +1 -0
  255. package/dist/adapters/postgresql/tools/partitioning/info.js +302 -0
  256. package/dist/adapters/postgresql/tools/partitioning/info.js.map +1 -0
  257. package/dist/adapters/postgresql/tools/partitioning/management.d.ts +28 -0
  258. package/dist/adapters/postgresql/tools/partitioning/management.d.ts.map +1 -0
  259. package/dist/adapters/postgresql/tools/{partitioning.js → partitioning/management.js} +48 -307
  260. package/dist/adapters/postgresql/tools/partitioning/management.js.map +1 -0
  261. package/dist/adapters/postgresql/tools/partman/helpers.d.ts +29 -0
  262. package/dist/adapters/postgresql/tools/partman/helpers.d.ts.map +1 -0
  263. package/dist/adapters/postgresql/tools/partman/helpers.js +59 -0
  264. package/dist/adapters/postgresql/tools/partman/helpers.js.map +1 -0
  265. package/dist/adapters/postgresql/tools/partman/index.d.ts +2 -1
  266. package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -1
  267. package/dist/adapters/postgresql/tools/partman/index.js +4 -2
  268. package/dist/adapters/postgresql/tools/partman/index.js.map +1 -1
  269. package/dist/adapters/postgresql/tools/partman/maintenance.d.ts +20 -0
  270. package/dist/adapters/postgresql/tools/partman/maintenance.d.ts.map +1 -0
  271. package/dist/adapters/postgresql/tools/partman/maintenance.js +496 -0
  272. package/dist/adapters/postgresql/tools/partman/maintenance.js.map +1 -0
  273. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
  274. package/dist/adapters/postgresql/tools/partman/management.js +438 -383
  275. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
  276. package/dist/adapters/postgresql/tools/partman/operations.d.ts +1 -13
  277. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
  278. package/dist/adapters/postgresql/tools/partman/operations.js +171 -652
  279. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
  280. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
  281. package/dist/adapters/postgresql/tools/performance/analysis.js +69 -42
  282. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
  283. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
  284. package/dist/adapters/postgresql/tools/performance/monitoring.js +80 -55
  285. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
  286. package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
  287. package/dist/adapters/postgresql/tools/performance/optimization.js +18 -11
  288. package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
  289. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
  290. package/dist/adapters/postgresql/tools/performance/stats.js +439 -318
  291. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
  292. package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
  293. package/dist/adapters/postgresql/tools/pgcrypto.js +45 -77
  294. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
  295. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
  296. package/dist/adapters/postgresql/tools/postgis/basic.js +121 -93
  297. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
  298. package/dist/adapters/postgresql/tools/schema/index.d.ts +16 -0
  299. package/dist/adapters/postgresql/tools/schema/index.d.ts.map +1 -0
  300. package/dist/adapters/postgresql/tools/schema/index.js +32 -0
  301. package/dist/adapters/postgresql/tools/schema/index.js.map +1 -0
  302. package/dist/adapters/postgresql/tools/schema/objects.d.ts +15 -0
  303. package/dist/adapters/postgresql/tools/schema/objects.d.ts.map +1 -0
  304. package/dist/adapters/postgresql/tools/schema/objects.js +378 -0
  305. package/dist/adapters/postgresql/tools/schema/objects.js.map +1 -0
  306. package/dist/adapters/postgresql/tools/schema/views.d.ts +15 -0
  307. package/dist/adapters/postgresql/tools/schema/views.d.ts.map +1 -0
  308. package/dist/adapters/postgresql/tools/{schema.js → schema/views.js} +64 -386
  309. package/dist/adapters/postgresql/tools/schema/views.js.map +1 -0
  310. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
  311. package/dist/adapters/postgresql/tools/stats/advanced.js +1 -218
  312. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
  313. package/dist/adapters/postgresql/tools/stats/math-utils.d.ts +33 -0
  314. package/dist/adapters/postgresql/tools/stats/math-utils.d.ts.map +1 -0
  315. package/dist/adapters/postgresql/tools/stats/math-utils.js +225 -0
  316. package/dist/adapters/postgresql/tools/stats/math-utils.js.map +1 -0
  317. package/dist/adapters/postgresql/tools/text/index.d.ts +16 -0
  318. package/dist/adapters/postgresql/tools/text/index.d.ts.map +1 -0
  319. package/dist/adapters/postgresql/tools/text/index.js +33 -0
  320. package/dist/adapters/postgresql/tools/text/index.js.map +1 -0
  321. package/dist/adapters/postgresql/tools/text/matching.d.ts +17 -0
  322. package/dist/adapters/postgresql/tools/text/matching.d.ts.map +1 -0
  323. package/dist/adapters/postgresql/tools/text/matching.js +565 -0
  324. package/dist/adapters/postgresql/tools/text/matching.js.map +1 -0
  325. package/dist/adapters/postgresql/tools/text/search.d.ts +17 -0
  326. package/dist/adapters/postgresql/tools/text/search.d.ts.map +1 -0
  327. package/dist/adapters/postgresql/tools/text/search.js +653 -0
  328. package/dist/adapters/postgresql/tools/text/search.js.map +1 -0
  329. package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
  330. package/dist/adapters/postgresql/tools/transactions.js +11 -27
  331. package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
  332. package/dist/adapters/postgresql/tools/vector/{basic.d.ts → data.d.ts} +10 -8
  333. package/dist/adapters/postgresql/tools/vector/data.d.ts.map +1 -0
  334. package/dist/adapters/postgresql/tools/vector/data.js +540 -0
  335. package/dist/adapters/postgresql/tools/vector/data.js.map +1 -0
  336. package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -1
  337. package/dist/adapters/postgresql/tools/vector/index.js +6 -2
  338. package/dist/adapters/postgresql/tools/vector/index.js.map +1 -1
  339. package/dist/adapters/postgresql/tools/vector/management.d.ts +11 -0
  340. package/dist/adapters/postgresql/tools/vector/management.d.ts.map +1 -0
  341. package/dist/adapters/postgresql/tools/vector/management.js +425 -0
  342. package/dist/adapters/postgresql/tools/vector/management.js.map +1 -0
  343. package/dist/adapters/postgresql/tools/vector/query.d.ts +14 -0
  344. package/dist/adapters/postgresql/tools/vector/query.d.ts.map +1 -0
  345. package/dist/adapters/postgresql/tools/vector/query.js +767 -0
  346. package/dist/adapters/postgresql/tools/vector/query.js.map +1 -0
  347. package/dist/adapters/postgresql/tools/vector/{advanced.d.ts → search-advanced.d.ts} +4 -5
  348. package/dist/adapters/postgresql/tools/vector/search-advanced.d.ts.map +1 -0
  349. package/dist/adapters/postgresql/tools/vector/search-advanced.js +626 -0
  350. package/dist/adapters/postgresql/tools/vector/search-advanced.js.map +1 -0
  351. package/dist/auth/scopes.js +1 -1
  352. package/dist/auth/scopes.js.map +1 -1
  353. package/dist/cli/args.d.ts +3 -2
  354. package/dist/cli/args.d.ts.map +1 -1
  355. package/dist/cli/args.js +4 -3
  356. package/dist/cli/args.js.map +1 -1
  357. package/dist/cli.js +10 -4
  358. package/dist/cli.js.map +1 -1
  359. package/dist/codemode/api/aliases.d.ts +14 -0
  360. package/dist/codemode/api/aliases.d.ts.map +1 -0
  361. package/dist/codemode/api/aliases.js +503 -0
  362. package/dist/codemode/api/aliases.js.map +1 -0
  363. package/dist/codemode/api/group-api.d.ts +23 -0
  364. package/dist/codemode/api/group-api.d.ts.map +1 -0
  365. package/dist/codemode/api/group-api.js +179 -0
  366. package/dist/codemode/api/group-api.js.map +1 -0
  367. package/dist/codemode/{api.d.ts → api/index.d.ts} +4 -4
  368. package/dist/codemode/api/index.d.ts.map +1 -0
  369. package/dist/codemode/api/index.js +192 -0
  370. package/dist/codemode/api/index.js.map +1 -0
  371. package/dist/codemode/api/maps.d.ts +47 -0
  372. package/dist/codemode/api/maps.d.ts.map +1 -0
  373. package/dist/codemode/api/maps.js +523 -0
  374. package/dist/codemode/api/maps.js.map +1 -0
  375. package/dist/codemode/api/normalize.d.ts +13 -0
  376. package/dist/codemode/api/normalize.d.ts.map +1 -0
  377. package/dist/codemode/api/normalize.js +120 -0
  378. package/dist/codemode/api/normalize.js.map +1 -0
  379. package/dist/codemode/index.d.ts +1 -1
  380. package/dist/codemode/index.d.ts.map +1 -1
  381. package/dist/codemode/index.js +1 -1
  382. package/dist/codemode/index.js.map +1 -1
  383. package/dist/codemode/sandbox.d.ts.map +1 -1
  384. package/dist/codemode/sandbox.js +8 -25
  385. package/dist/codemode/sandbox.js.map +1 -1
  386. package/dist/server/McpServer.d.ts +1 -1
  387. package/dist/server/McpServer.d.ts.map +1 -1
  388. package/dist/server/McpServer.js +1 -2
  389. package/dist/server/McpServer.js.map +1 -1
  390. package/dist/transports/http.d.ts +43 -10
  391. package/dist/transports/http.d.ts.map +1 -1
  392. package/dist/transports/http.js +282 -49
  393. package/dist/transports/http.js.map +1 -1
  394. package/dist/utils/logger.d.ts +6 -6
  395. package/dist/utils/logger.d.ts.map +1 -1
  396. package/dist/utils/logger.js +18 -15
  397. package/dist/utils/logger.js.map +1 -1
  398. package/dist/utils/progress-utils.d.ts +2 -2
  399. package/dist/utils/progress-utils.d.ts.map +1 -1
  400. package/dist/utils/progress-utils.js +2 -3
  401. package/dist/utils/progress-utils.js.map +1 -1
  402. package/dist/utils/version.d.ts +9 -0
  403. package/dist/utils/version.d.ts.map +1 -0
  404. package/dist/utils/version.js +12 -0
  405. package/dist/utils/version.js.map +1 -0
  406. package/dist/utils/where-clause.d.ts +4 -0
  407. package/dist/utils/where-clause.d.ts.map +1 -1
  408. package/dist/utils/where-clause.js +16 -0
  409. package/dist/utils/where-clause.js.map +1 -1
  410. package/package.json +6 -4
  411. package/dist/adapters/postgresql/schemas/core.d.ts.map +0 -1
  412. package/dist/adapters/postgresql/schemas/core.js.map +0 -1
  413. package/dist/adapters/postgresql/schemas/extensions.d.ts +0 -852
  414. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +0 -1
  415. package/dist/adapters/postgresql/schemas/extensions.js +0 -1202
  416. package/dist/adapters/postgresql/schemas/extensions.js.map +0 -1
  417. package/dist/adapters/postgresql/schemas/jsonb.d.ts +0 -541
  418. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +0 -1
  419. package/dist/adapters/postgresql/schemas/jsonb.js +0 -814
  420. package/dist/adapters/postgresql/schemas/jsonb.js.map +0 -1
  421. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +0 -1
  422. package/dist/adapters/postgresql/schemas/postgis.js.map +0 -1
  423. package/dist/adapters/postgresql/schemas/stats.d.ts.map +0 -1
  424. package/dist/adapters/postgresql/schemas/stats.js.map +0 -1
  425. package/dist/adapters/postgresql/tools/citext.d.ts +0 -18
  426. package/dist/adapters/postgresql/tools/citext.d.ts.map +0 -1
  427. package/dist/adapters/postgresql/tools/citext.js.map +0 -1
  428. package/dist/adapters/postgresql/tools/introspection.d.ts +0 -15
  429. package/dist/adapters/postgresql/tools/introspection.d.ts.map +0 -1
  430. package/dist/adapters/postgresql/tools/introspection.js +0 -1682
  431. package/dist/adapters/postgresql/tools/introspection.js.map +0 -1
  432. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +0 -1
  433. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +0 -1
  434. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +0 -20
  435. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +0 -1
  436. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +0 -1
  437. package/dist/adapters/postgresql/tools/monitoring.d.ts +0 -13
  438. package/dist/adapters/postgresql/tools/monitoring.d.ts.map +0 -1
  439. package/dist/adapters/postgresql/tools/monitoring.js.map +0 -1
  440. package/dist/adapters/postgresql/tools/partitioning.d.ts +0 -13
  441. package/dist/adapters/postgresql/tools/partitioning.d.ts.map +0 -1
  442. package/dist/adapters/postgresql/tools/partitioning.js.map +0 -1
  443. package/dist/adapters/postgresql/tools/schema.d.ts +0 -13
  444. package/dist/adapters/postgresql/tools/schema.d.ts.map +0 -1
  445. package/dist/adapters/postgresql/tools/schema.js.map +0 -1
  446. package/dist/adapters/postgresql/tools/text.d.ts +0 -13
  447. package/dist/adapters/postgresql/tools/text.d.ts.map +0 -1
  448. package/dist/adapters/postgresql/tools/text.js +0 -1082
  449. package/dist/adapters/postgresql/tools/text.js.map +0 -1
  450. package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +0 -1
  451. package/dist/adapters/postgresql/tools/vector/advanced.js +0 -958
  452. package/dist/adapters/postgresql/tools/vector/advanced.js.map +0 -1
  453. package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +0 -1
  454. package/dist/adapters/postgresql/tools/vector/basic.js +0 -1165
  455. package/dist/adapters/postgresql/tools/vector/basic.js.map +0 -1
  456. package/dist/codemode/api.d.ts.map +0 -1
  457. package/dist/codemode/api.js +0 -1544
  458. package/dist/codemode/api.js.map +0 -1
@@ -1,1082 +0,0 @@
1
- /**
2
- * PostgreSQL Text & Full-Text Search Tools
3
- *
4
- * Text processing, FTS, trigrams, and fuzzy matching.
5
- * 14 tools total.
6
- */
7
- import { z, ZodError } from "zod";
8
- import { readOnly, write } from "../../../utils/annotations.js";
9
- import { getToolIcons } from "../../../utils/icons.js";
10
- import { formatPostgresError } from "./core/error-helpers.js";
11
- import { sanitizeIdentifier, sanitizeIdentifiers, sanitizeTableName, } from "../../../utils/identifiers.js";
12
- import { sanitizeFtsConfig } from "../../../utils/fts-config.js";
13
- import { sanitizeWhereClause } from "../../../utils/where-clause.js";
14
- import { TextSearchSchema, TextSearchSchemaBase, TrigramSimilaritySchema, TrigramSimilaritySchemaBase, RegexpMatchSchema, RegexpMatchSchemaBase, preprocessTextParams,
15
- // Output schemas
16
- TextRowsOutputSchema, FtsIndexOutputSchema, TextNormalizeOutputSchema, TextSentimentOutputSchema, TextToVectorOutputSchema, TextToQueryOutputSchema, TextSearchConfigOutputSchema, } from "../schemas/index.js";
17
- /**
18
- * Get all text processing tools
19
- */
20
- export function getTextTools(adapter) {
21
- return [
22
- createTextSearchTool(adapter),
23
- createTextRankTool(adapter),
24
- createTrigramSimilarityTool(adapter),
25
- createFuzzyMatchTool(adapter),
26
- createRegexpMatchTool(adapter),
27
- createLikeSearchTool(adapter),
28
- createTextHeadlineTool(adapter),
29
- createFtsIndexTool(adapter),
30
- createTextNormalizeTool(adapter),
31
- createTextSentimentTool(adapter),
32
- createTextToVectorTool(adapter),
33
- createTextToQueryTool(adapter),
34
- createTextSearchConfigTool(adapter),
35
- ];
36
- }
37
- function createTextSearchTool(adapter) {
38
- return {
39
- name: "pg_text_search",
40
- description: "Full-text search using tsvector and tsquery.",
41
- group: "text",
42
- inputSchema: TextSearchSchemaBase, // Base schema for MCP visibility
43
- outputSchema: TextRowsOutputSchema,
44
- annotations: readOnly("Full-Text Search"),
45
- icons: getToolIcons("text", readOnly("Full-Text Search")),
46
- handler: async (params, _context) => {
47
- try {
48
- const parsed = TextSearchSchema.parse(params);
49
- const cfg = sanitizeFtsConfig(parsed.config ?? "english");
50
- // Handle both column (string) and columns (array) parameters
51
- // The preprocessor converts column → columns, but we handle both for safety
52
- let cols;
53
- if (parsed.columns !== undefined && parsed.columns.length > 0) {
54
- cols = parsed.columns;
55
- }
56
- else if (parsed.column !== undefined) {
57
- cols = [parsed.column];
58
- }
59
- else {
60
- return {
61
- success: false,
62
- error: "Either 'columns' (array) or 'column' (string) is required",
63
- };
64
- }
65
- // Build qualified table name with schema support
66
- // The preprocessor guarantees table is set (converts tableName → table)
67
- const resolvedTable = parsed.table ?? parsed.tableName;
68
- if (!resolvedTable) {
69
- return {
70
- success: false,
71
- error: "Either 'table' or 'tableName' is required",
72
- };
73
- }
74
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
75
- const sanitizedCols = sanitizeIdentifiers(cols);
76
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
77
- ? sanitizeIdentifiers(parsed.select).join(", ")
78
- : "*";
79
- const tsvector = sanitizedCols
80
- .map((c) => `coalesce(${c}, '')`)
81
- .join(" || ' ' || ");
82
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
83
- const limitVal = parsed.limit === 0
84
- ? null
85
- : parsed.limit !== undefined && parsed.limit > 0
86
- ? parsed.limit
87
- : 100;
88
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
89
- const sql = `SELECT ${selectCols}, ts_rank_cd(to_tsvector('${cfg}', ${tsvector}), plainto_tsquery('${cfg}', $1)) as rank
90
- FROM ${tableName}
91
- WHERE to_tsvector('${cfg}', ${tsvector}) @@ plainto_tsquery('${cfg}', $1)
92
- ORDER BY rank DESC${limitClause}`;
93
- const result = await adapter.executeQuery(sql, [parsed.query]);
94
- const count = result.rows?.length ?? 0;
95
- const truncated = limitVal !== null && count === limitVal;
96
- return {
97
- rows: result.rows,
98
- count,
99
- ...(truncated
100
- ? {
101
- truncated: true,
102
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
103
- }
104
- : {}),
105
- };
106
- }
107
- catch (error) {
108
- if (error instanceof ZodError) {
109
- return {
110
- success: false,
111
- error: `pg_text_search validation error: ${error.issues.map((e) => e.message).join(", ")}`,
112
- };
113
- }
114
- return {
115
- success: false,
116
- error: formatPostgresError(error, {
117
- tool: "pg_text_search",
118
- }),
119
- };
120
- }
121
- },
122
- };
123
- }
124
- function createTextRankTool(adapter) {
125
- // Base schema for MCP visibility (no preprocess)
126
- const TextRankSchemaBase = z
127
- .object({
128
- table: z.string().optional().describe("Table name"),
129
- tableName: z.string().optional().describe("Table name (alias for table)"),
130
- column: z.string().optional().describe("Single column to search"),
131
- columns: z
132
- .array(z.string())
133
- .optional()
134
- .describe("Multiple columns to search (alternative to column)"),
135
- query: z.string(),
136
- config: z.string().optional(),
137
- normalization: z.number().optional(),
138
- select: z.array(z.string()).optional().describe("Columns to return"),
139
- limit: z.number().optional().describe("Max results"),
140
- schema: z.string().optional().describe("Schema name (default: public)"),
141
- })
142
- .refine((data) => data.table !== undefined || data.tableName !== undefined, {
143
- message: "Either 'table' or 'tableName' is required",
144
- });
145
- // Full schema with preprocess for handler parsing
146
- const TextRankSchema = z.preprocess(preprocessTextParams, TextRankSchemaBase);
147
- return {
148
- name: "pg_text_rank",
149
- description: "Get relevance ranking for full-text search results. Returns matching rows only with rank score.",
150
- group: "text",
151
- inputSchema: TextRankSchemaBase, // Base schema for MCP visibility
152
- outputSchema: TextRowsOutputSchema,
153
- annotations: readOnly("Text Rank"),
154
- icons: getToolIcons("text", readOnly("Text Rank")),
155
- handler: async (params, _context) => {
156
- try {
157
- const parsed = TextRankSchema.parse(params);
158
- const cfg = sanitizeFtsConfig(parsed.config ?? "english");
159
- const norm = parsed.normalization ?? 0;
160
- // Handle both column (string) and columns (array) parameters
161
- let cols;
162
- if (parsed.columns !== undefined && parsed.columns.length > 0) {
163
- cols = parsed.columns;
164
- }
165
- else if (parsed.column !== undefined) {
166
- cols = [parsed.column];
167
- }
168
- else {
169
- return {
170
- success: false,
171
- error: "Either column or columns parameter is required",
172
- };
173
- }
174
- // The preprocessor guarantees table is set (converts tableName → table)
175
- const resolvedTable = parsed.table ?? parsed.tableName;
176
- if (!resolvedTable) {
177
- return {
178
- success: false,
179
- error: "Either 'table' or 'tableName' is required",
180
- };
181
- }
182
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
183
- const sanitizedCols = sanitizeIdentifiers(cols);
184
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
185
- ? sanitizeIdentifiers(parsed.select).join(", ")
186
- : "*";
187
- const tsvector = sanitizedCols
188
- .map((c) => `coalesce(${c}, '')`)
189
- .join(" || ' ' || ");
190
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
191
- const limitVal = parsed.limit === 0
192
- ? null
193
- : parsed.limit !== undefined && parsed.limit > 0
194
- ? parsed.limit
195
- : 100;
196
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
197
- const sql = `SELECT ${selectCols}, ts_rank_cd(to_tsvector('${cfg}', ${tsvector}), plainto_tsquery('${cfg}', $1), ${String(norm)}) as rank
198
- FROM ${tableName}
199
- WHERE to_tsvector('${cfg}', ${tsvector}) @@ plainto_tsquery('${cfg}', $1)
200
- ORDER BY rank DESC${limitClause}`;
201
- const result = await adapter.executeQuery(sql, [parsed.query]);
202
- const count = result.rows?.length ?? 0;
203
- const truncated = limitVal !== null && count === limitVal;
204
- return {
205
- rows: result.rows,
206
- count,
207
- ...(truncated
208
- ? {
209
- truncated: true,
210
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
211
- }
212
- : {}),
213
- };
214
- }
215
- catch (error) {
216
- if (error instanceof ZodError) {
217
- return {
218
- success: false,
219
- error: `pg_text_rank validation error: ${error.issues.map((e) => e.message).join(", ")}`,
220
- };
221
- }
222
- return {
223
- success: false,
224
- error: formatPostgresError(error, {
225
- tool: "pg_text_rank",
226
- }),
227
- };
228
- }
229
- },
230
- };
231
- }
232
- function createTrigramSimilarityTool(adapter) {
233
- return {
234
- name: "pg_trigram_similarity",
235
- description: "Find similar strings using pg_trgm trigram matching. Returns similarity score (0-1). Default threshold 0.3; use lower (e.g., 0.1) for partial matches.",
236
- group: "text",
237
- inputSchema: TrigramSimilaritySchemaBase, // Base schema for MCP visibility
238
- outputSchema: TextRowsOutputSchema,
239
- annotations: readOnly("Trigram Similarity"),
240
- icons: getToolIcons("text", readOnly("Trigram Similarity")),
241
- handler: async (params, _context) => {
242
- try {
243
- const parsed = TrigramSimilaritySchema.parse(params);
244
- const thresh = parsed.threshold ?? 0.3;
245
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
246
- const limitVal = parsed.limit === 0
247
- ? null
248
- : parsed.limit !== undefined && parsed.limit > 0
249
- ? parsed.limit
250
- : 100;
251
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
252
- // The preprocessor guarantees table is set (converts tableName → table)
253
- const resolvedTable = parsed.table ?? parsed.tableName;
254
- if (!resolvedTable) {
255
- return {
256
- success: false,
257
- error: "Either 'table' or 'tableName' is required",
258
- };
259
- }
260
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
261
- const columnName = sanitizeIdentifier(parsed.column);
262
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
263
- ? sanitizeIdentifiers(parsed.select).join(", ")
264
- : "*";
265
- const additionalWhere = parsed.where
266
- ? ` AND (${sanitizeWhereClause(parsed.where)})`
267
- : "";
268
- const sql = `SELECT ${selectCols}, similarity(${columnName}, $1) as similarity
269
- FROM ${tableName}
270
- WHERE similarity(${columnName}, $1) > ${String(thresh)}${additionalWhere}
271
- ORDER BY similarity DESC${limitClause}`;
272
- const result = await adapter.executeQuery(sql, [parsed.value]);
273
- const count = result.rows?.length ?? 0;
274
- const truncated = limitVal !== null && count === limitVal;
275
- return {
276
- rows: result.rows,
277
- count,
278
- ...(truncated
279
- ? {
280
- truncated: true,
281
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
282
- }
283
- : {}),
284
- };
285
- }
286
- catch (error) {
287
- if (error instanceof ZodError) {
288
- return {
289
- success: false,
290
- error: `pg_trigram_similarity validation error: ${error.issues.map((e) => e.message).join(", ")}`,
291
- };
292
- }
293
- return {
294
- success: false,
295
- error: formatPostgresError(error, {
296
- tool: "pg_trigram_similarity",
297
- }),
298
- };
299
- }
300
- },
301
- };
302
- }
303
- function createFuzzyMatchTool(adapter) {
304
- // Base schema for MCP visibility (no preprocess)
305
- const FuzzyMatchSchemaBase = z
306
- .object({
307
- table: z.string().optional().describe("Table name"),
308
- tableName: z.string().optional().describe("Table name (alias for table)"),
309
- column: z.string(),
310
- value: z.string(),
311
- method: z
312
- .string()
313
- .optional()
314
- .describe("Fuzzy match method (default: levenshtein). Valid: soundex, levenshtein, metaphone"),
315
- maxDistance: z
316
- .number()
317
- .optional()
318
- .describe("Max Levenshtein distance (default: 3, use 5+ for longer strings)"),
319
- select: z.array(z.string()).optional().describe("Columns to return"),
320
- limit: z
321
- .number()
322
- .optional()
323
- .describe("Max results (default: 100 to prevent large payloads)"),
324
- where: z.string().optional().describe("Additional WHERE clause filter"),
325
- schema: z.string().optional().describe("Schema name (default: public)"),
326
- })
327
- .refine((data) => data.table !== undefined || data.tableName !== undefined, {
328
- message: "Either 'table' or 'tableName' is required",
329
- });
330
- // Full schema with preprocess for handler parsing
331
- const FuzzyMatchSchema = z.preprocess(preprocessTextParams, FuzzyMatchSchemaBase);
332
- return {
333
- name: "pg_fuzzy_match",
334
- description: "Fuzzy string matching using fuzzystrmatch extension. Levenshtein (default): returns distance; use maxDistance=5+ for longer strings. Soundex/metaphone: returns phonetic code for exact matches only.",
335
- group: "text",
336
- inputSchema: FuzzyMatchSchemaBase, // Base schema for MCP visibility
337
- outputSchema: TextRowsOutputSchema,
338
- annotations: readOnly("Fuzzy Match"),
339
- icons: getToolIcons("text", readOnly("Fuzzy Match")),
340
- handler: async (params, _context) => {
341
- try {
342
- const parsed = FuzzyMatchSchema.parse(params);
343
- // Validate method (moved from z.enum to handler for structured error)
344
- const VALID_METHODS = [
345
- "levenshtein",
346
- "soundex",
347
- "metaphone",
348
- ];
349
- const rawMethod = parsed.method ?? "levenshtein";
350
- if (!VALID_METHODS.includes(rawMethod)) {
351
- return {
352
- success: false,
353
- error: `Invalid method "${rawMethod}". Valid methods: ${VALID_METHODS.join(", ")}`,
354
- };
355
- }
356
- const method = rawMethod;
357
- const maxDist = parsed.maxDistance ?? 3;
358
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
359
- const limitVal = parsed.limit === 0
360
- ? null
361
- : parsed.limit !== undefined && parsed.limit > 0
362
- ? parsed.limit
363
- : 100;
364
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
365
- // The preprocessor guarantees table is set (converts tableName → table)
366
- const resolvedTable = parsed.table ?? parsed.tableName;
367
- if (!resolvedTable) {
368
- return {
369
- success: false,
370
- error: "Either 'table' or 'tableName' is required",
371
- };
372
- }
373
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
374
- const columnName = sanitizeIdentifier(parsed.column);
375
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
376
- ? sanitizeIdentifiers(parsed.select).join(", ")
377
- : "*";
378
- const additionalWhere = parsed.where
379
- ? ` AND (${sanitizeWhereClause(parsed.where)})`
380
- : "";
381
- let sql;
382
- if (method === "soundex") {
383
- sql = `SELECT ${selectCols}, soundex(${columnName}) as code FROM ${tableName} WHERE soundex(${columnName}) = soundex($1)${additionalWhere}${limitClause}`;
384
- }
385
- else if (method === "metaphone") {
386
- sql = `SELECT ${selectCols}, metaphone(${columnName}, 10) as code FROM ${tableName} WHERE metaphone(${columnName}, 10) = metaphone($1, 10)${additionalWhere}${limitClause}`;
387
- }
388
- else {
389
- sql = `SELECT ${selectCols}, levenshtein(${columnName}, $1) as distance FROM ${tableName} WHERE levenshtein(${columnName}, $1) <= ${String(maxDist)}${additionalWhere} ORDER BY distance${limitClause}`;
390
- }
391
- const result = await adapter.executeQuery(sql, [parsed.value]);
392
- const count = result.rows?.length ?? 0;
393
- const truncated = limitVal !== null && count === limitVal;
394
- return {
395
- rows: result.rows,
396
- count,
397
- ...(truncated
398
- ? {
399
- truncated: true,
400
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
401
- }
402
- : {}),
403
- };
404
- }
405
- catch (error) {
406
- if (error instanceof ZodError) {
407
- return {
408
- success: false,
409
- error: `pg_fuzzy_match validation error: ${error.issues.map((e) => e.message).join(", ")}`,
410
- };
411
- }
412
- return {
413
- success: false,
414
- error: formatPostgresError(error, {
415
- tool: "pg_fuzzy_match",
416
- }),
417
- };
418
- }
419
- },
420
- };
421
- }
422
- function createRegexpMatchTool(adapter) {
423
- return {
424
- name: "pg_regexp_match",
425
- description: "Match text using POSIX regular expressions.",
426
- group: "text",
427
- inputSchema: RegexpMatchSchemaBase, // Base schema for MCP visibility
428
- outputSchema: TextRowsOutputSchema,
429
- annotations: readOnly("Regexp Match"),
430
- icons: getToolIcons("text", readOnly("Regexp Match")),
431
- handler: async (params, _context) => {
432
- try {
433
- const parsed = RegexpMatchSchema.parse(params);
434
- // The preprocessor guarantees table is set (converts tableName → table)
435
- const resolvedTable = parsed.table ?? parsed.tableName;
436
- if (!resolvedTable) {
437
- return {
438
- success: false,
439
- error: "Either 'table' or 'tableName' is required",
440
- };
441
- }
442
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
443
- const columnName = sanitizeIdentifier(parsed.column);
444
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
445
- ? sanitizeIdentifiers(parsed.select).join(", ")
446
- : "*";
447
- const op = parsed.flags?.includes("i") ? "~*" : "~";
448
- const additionalWhere = parsed.where
449
- ? ` AND (${sanitizeWhereClause(parsed.where)})`
450
- : "";
451
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
452
- const limitVal = parsed.limit === 0
453
- ? null
454
- : parsed.limit !== undefined && parsed.limit > 0
455
- ? parsed.limit
456
- : 100;
457
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
458
- const sql = `SELECT ${selectCols} FROM ${tableName} WHERE ${columnName} ${op} $1${additionalWhere}${limitClause}`;
459
- const result = await adapter.executeQuery(sql, [parsed.pattern]);
460
- const count = result.rows?.length ?? 0;
461
- const truncated = limitVal !== null && count === limitVal;
462
- return {
463
- rows: result.rows,
464
- count,
465
- ...(truncated
466
- ? {
467
- truncated: true,
468
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
469
- }
470
- : {}),
471
- };
472
- }
473
- catch (error) {
474
- if (error instanceof ZodError) {
475
- return {
476
- success: false,
477
- error: `pg_regexp_match validation error: ${error.issues.map((e) => e.message).join(", ")}`,
478
- };
479
- }
480
- return {
481
- success: false,
482
- error: formatPostgresError(error, {
483
- tool: "pg_regexp_match",
484
- }),
485
- };
486
- }
487
- },
488
- };
489
- }
490
- function createLikeSearchTool(adapter) {
491
- // Base schema for MCP visibility (no preprocess)
492
- const LikeSearchSchemaBase = z
493
- .object({
494
- table: z.string().optional().describe("Table name"),
495
- tableName: z.string().optional().describe("Table name (alias for table)"),
496
- column: z.string(),
497
- pattern: z.string(),
498
- caseSensitive: z
499
- .boolean()
500
- .optional()
501
- .describe("Use case-sensitive LIKE (default: false, uses ILIKE)"),
502
- select: z.array(z.string()).optional(),
503
- limit: z
504
- .number()
505
- .optional()
506
- .describe("Max results (default: 100 to prevent large payloads)"),
507
- where: z.string().optional().describe("Additional WHERE clause filter"),
508
- schema: z.string().optional().describe("Schema name (default: public)"),
509
- })
510
- .refine((data) => data.table !== undefined || data.tableName !== undefined, {
511
- message: "Either 'table' or 'tableName' is required",
512
- });
513
- // Full schema with preprocess for handler parsing
514
- const LikeSearchSchema = z.preprocess(preprocessTextParams, LikeSearchSchemaBase);
515
- return {
516
- name: "pg_like_search",
517
- description: "Search text using LIKE patterns. Case-insensitive (ILIKE) by default.",
518
- group: "text",
519
- inputSchema: LikeSearchSchemaBase, // Base schema for MCP visibility
520
- outputSchema: TextRowsOutputSchema,
521
- annotations: readOnly("LIKE Search"),
522
- icons: getToolIcons("text", readOnly("LIKE Search")),
523
- handler: async (params, _context) => {
524
- try {
525
- const parsed = LikeSearchSchema.parse(params);
526
- // The preprocessor guarantees table is set (converts tableName → table)
527
- const resolvedTable = parsed.table ?? parsed.tableName;
528
- if (!resolvedTable) {
529
- return {
530
- success: false,
531
- error: "Either 'table' or 'tableName' is required",
532
- };
533
- }
534
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
535
- const columnName = sanitizeIdentifier(parsed.column);
536
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
537
- ? sanitizeIdentifiers(parsed.select).join(", ")
538
- : "*";
539
- const op = parsed.caseSensitive === true ? "LIKE" : "ILIKE";
540
- const additionalWhere = parsed.where
541
- ? ` AND (${sanitizeWhereClause(parsed.where)})`
542
- : "";
543
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
544
- const limitVal = parsed.limit === 0
545
- ? null
546
- : parsed.limit !== undefined && parsed.limit > 0
547
- ? parsed.limit
548
- : 100;
549
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
550
- const sql = `SELECT ${selectCols} FROM ${tableName} WHERE ${columnName} ${op} $1${additionalWhere}${limitClause}`;
551
- const result = await adapter.executeQuery(sql, [parsed.pattern]);
552
- const count = result.rows?.length ?? 0;
553
- const truncated = limitVal !== null && count === limitVal;
554
- return {
555
- rows: result.rows,
556
- count,
557
- ...(truncated
558
- ? {
559
- truncated: true,
560
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
561
- }
562
- : {}),
563
- };
564
- }
565
- catch (error) {
566
- if (error instanceof ZodError) {
567
- return {
568
- success: false,
569
- error: `pg_like_search validation error: ${error.issues.map((e) => e.message).join(", ")}`,
570
- };
571
- }
572
- return {
573
- success: false,
574
- error: formatPostgresError(error, {
575
- tool: "pg_like_search",
576
- }),
577
- };
578
- }
579
- },
580
- };
581
- }
582
- function createTextHeadlineTool(adapter) {
583
- // Base schema for MCP visibility (no preprocess)
584
- const HeadlineSchemaBase = z
585
- .object({
586
- table: z.string().optional().describe("Table name"),
587
- tableName: z.string().optional().describe("Table name (alias for table)"),
588
- column: z.string(),
589
- query: z.string(),
590
- config: z.string().optional(),
591
- options: z
592
- .string()
593
- .optional()
594
- .describe('Headline options (e.g., "MaxWords=20, MinWords=5"). Note: MinWords must be < MaxWords.'),
595
- startSel: z
596
- .string()
597
- .optional()
598
- .describe("Start selection marker (default: <b>)"),
599
- stopSel: z
600
- .string()
601
- .optional()
602
- .describe("Stop selection marker (default: </b>)"),
603
- maxWords: z.number().optional().describe("Maximum words in headline"),
604
- minWords: z.number().optional().describe("Minimum words in headline"),
605
- select: z
606
- .array(z.string())
607
- .optional()
608
- .describe('Columns to return for row identification (e.g., ["id"])'),
609
- limit: z.number().optional().describe("Max results"),
610
- schema: z.string().optional().describe("Schema name (default: public)"),
611
- })
612
- .refine((data) => data.table !== undefined || data.tableName !== undefined, {
613
- message: "Either 'table' or 'tableName' is required",
614
- });
615
- // Full schema with preprocess for handler parsing
616
- const HeadlineSchema = z.preprocess(preprocessTextParams, HeadlineSchemaBase);
617
- return {
618
- name: "pg_text_headline",
619
- description: "Generate highlighted snippets from full-text search matches. Use select param for stable row identification (e.g., primary key).",
620
- group: "text",
621
- inputSchema: HeadlineSchemaBase, // Base schema for MCP visibility
622
- outputSchema: TextRowsOutputSchema,
623
- annotations: readOnly("Text Headline"),
624
- icons: getToolIcons("text", readOnly("Text Headline")),
625
- handler: async (params, _context) => {
626
- try {
627
- const parsed = HeadlineSchema.parse(params);
628
- const cfg = sanitizeFtsConfig(parsed.config ?? "english");
629
- // Build options string from individual params or use provided options
630
- let opts;
631
- if (parsed.options) {
632
- opts = parsed.options;
633
- }
634
- else {
635
- const optParts = [];
636
- optParts.push(`StartSel=${parsed.startSel ?? "<b>"}`);
637
- optParts.push(`StopSel=${parsed.stopSel ?? "</b>"}`);
638
- optParts.push(`MaxWords=${String(parsed.maxWords ?? 35)}`);
639
- optParts.push(`MinWords=${String(parsed.minWords ?? 15)}`);
640
- opts = optParts.join(", ");
641
- }
642
- // The preprocessor guarantees table is set (converts tableName → table)
643
- const resolvedTable = parsed.table ?? parsed.tableName;
644
- if (!resolvedTable) {
645
- return {
646
- success: false,
647
- error: "Either 'table' or 'tableName' is required",
648
- };
649
- }
650
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
651
- const columnName = sanitizeIdentifier(parsed.column);
652
- // Use provided select columns, or default to * (user should specify PK for stable identification)
653
- const selectCols = parsed.select !== undefined && parsed.select.length > 0
654
- ? sanitizeIdentifiers(parsed.select).join(", ") + ", "
655
- : "";
656
- // Default limit to 100 to prevent large payloads; limit: 0 means no limit
657
- const limitVal = parsed.limit === 0
658
- ? null
659
- : parsed.limit !== undefined && parsed.limit > 0
660
- ? parsed.limit
661
- : 100;
662
- const limitClause = limitVal !== null ? ` LIMIT ${String(limitVal)}` : "";
663
- const sql = `SELECT ${selectCols}ts_headline('${cfg}', ${columnName}, plainto_tsquery('${cfg}', $1), '${opts}') as headline
664
- FROM ${tableName}
665
- WHERE to_tsvector('${cfg}', ${columnName}) @@ plainto_tsquery('${cfg}', $1)${limitClause}`;
666
- const result = await adapter.executeQuery(sql, [parsed.query]);
667
- const count = result.rows?.length ?? 0;
668
- const truncated = limitVal !== null && count === limitVal;
669
- return {
670
- rows: result.rows,
671
- count,
672
- ...(truncated
673
- ? {
674
- truncated: true,
675
- hint: `Results limited to ${String(limitVal)}. Use limit: 0 for all rows.`,
676
- }
677
- : {}),
678
- };
679
- }
680
- catch (error) {
681
- if (error instanceof ZodError) {
682
- return {
683
- success: false,
684
- error: `pg_text_headline validation error: ${error.issues.map((e) => e.message).join(", ")}`,
685
- };
686
- }
687
- return {
688
- success: false,
689
- error: formatPostgresError(error, {
690
- tool: "pg_text_headline",
691
- }),
692
- };
693
- }
694
- },
695
- };
696
- }
697
- function createFtsIndexTool(adapter) {
698
- // Base schema for MCP visibility (no preprocess)
699
- const FtsIndexSchemaBase = z
700
- .object({
701
- table: z.string().optional().describe("Table name"),
702
- tableName: z.string().optional().describe("Table name (alias for table)"),
703
- column: z.string(),
704
- name: z.string().optional(),
705
- config: z.string().optional(),
706
- ifNotExists: z
707
- .boolean()
708
- .optional()
709
- .describe("Skip if index already exists (default: true)"),
710
- schema: z.string().optional().describe("Schema name (default: public)"),
711
- })
712
- .refine((data) => data.table !== undefined || data.tableName !== undefined, {
713
- message: "Either 'table' or 'tableName' is required",
714
- });
715
- // Full schema with preprocess for handler parsing
716
- const FtsIndexSchema = z.preprocess(preprocessTextParams, FtsIndexSchemaBase);
717
- return {
718
- name: "pg_create_fts_index",
719
- description: "Create a GIN index for full-text search on a column.",
720
- group: "text",
721
- inputSchema: FtsIndexSchemaBase, // Base schema for MCP visibility
722
- outputSchema: FtsIndexOutputSchema,
723
- annotations: write("Create FTS Index"),
724
- icons: getToolIcons("text", write("Create FTS Index")),
725
- handler: async (params, _context) => {
726
- try {
727
- const parsed = FtsIndexSchema.parse(params);
728
- const cfg = sanitizeFtsConfig(parsed.config ?? "english");
729
- // The preprocessor guarantees table is set (converts tableName → table)
730
- const resolvedTable = parsed.table ?? parsed.tableName;
731
- if (!resolvedTable) {
732
- return {
733
- success: false,
734
- error: "Either 'table' or 'tableName' is required",
735
- };
736
- }
737
- const defaultIndexName = `idx_${resolvedTable}_${parsed.column}_fts`;
738
- const resolvedIndexName = parsed.name ?? defaultIndexName;
739
- const indexName = sanitizeIdentifier(resolvedIndexName);
740
- // Default to IF NOT EXISTS for safer operation (skip existing indexes)
741
- const useIfNotExists = parsed.ifNotExists !== false;
742
- const ifNotExists = useIfNotExists ? "IF NOT EXISTS " : "";
743
- // Build qualified table name with schema support
744
- const tableName = sanitizeTableName(resolvedTable, parsed.schema);
745
- const columnName = sanitizeIdentifier(parsed.column);
746
- // Check if index exists before creation (to accurately report 'skipped')
747
- let existedBefore = false;
748
- if (useIfNotExists) {
749
- const checkResult = await adapter.executeQuery(`SELECT 1 FROM pg_indexes WHERE indexname = $1 LIMIT 1`, [resolvedIndexName]);
750
- existedBefore = (checkResult.rows?.length ?? 0) > 0;
751
- }
752
- const sql = `CREATE INDEX ${ifNotExists}${indexName} ON ${tableName} USING gin(to_tsvector('${cfg}', ${columnName}))`;
753
- await adapter.executeQuery(sql);
754
- return {
755
- success: true,
756
- index: resolvedIndexName,
757
- config: cfg,
758
- skipped: existedBefore,
759
- };
760
- }
761
- catch (error) {
762
- if (error instanceof ZodError) {
763
- return {
764
- success: false,
765
- error: `pg_create_fts_index validation error: ${error.issues.map((e) => e.message).join(", ")}`,
766
- };
767
- }
768
- return {
769
- success: false,
770
- error: formatPostgresError(error, {
771
- tool: "pg_create_fts_index",
772
- }),
773
- };
774
- }
775
- },
776
- };
777
- }
778
- function createTextNormalizeTool(adapter) {
779
- const NormalizeSchema = z.object({
780
- text: z.string().describe("Text to remove accent marks from"),
781
- });
782
- return {
783
- name: "pg_text_normalize",
784
- description: "Remove accent marks (diacritics) from text using PostgreSQL unaccent extension. Note: Does NOT lowercase or trim—use LOWER()/TRIM() in a query for those operations.",
785
- group: "text",
786
- inputSchema: NormalizeSchema,
787
- outputSchema: TextNormalizeOutputSchema,
788
- annotations: readOnly("Text Normalize"),
789
- icons: getToolIcons("text", readOnly("Text Normalize")),
790
- handler: async (params, _context) => {
791
- try {
792
- const parsed = NormalizeSchema.parse(params ?? {});
793
- // Ensure unaccent extension is available
794
- await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS unaccent");
795
- const result = await adapter.executeQuery(`SELECT unaccent($1) as normalized`, [parsed.text]);
796
- return { normalized: result.rows?.[0]?.["normalized"] };
797
- }
798
- catch (error) {
799
- if (error instanceof ZodError) {
800
- return {
801
- success: false,
802
- error: `pg_text_normalize validation error: ${error.issues.map((e) => e.message).join(", ")}`,
803
- };
804
- }
805
- return {
806
- success: false,
807
- error: formatPostgresError(error, {
808
- tool: "pg_text_normalize",
809
- }),
810
- };
811
- }
812
- },
813
- };
814
- }
815
- /**
816
- * Basic sentiment analysis using word matching
817
- */
818
- function createTextSentimentTool(_adapter) {
819
- const SentimentSchema = z.object({
820
- text: z.string().describe("Text to analyze"),
821
- returnWords: z
822
- .boolean()
823
- .optional()
824
- .describe("Return matched sentiment words"),
825
- });
826
- return {
827
- name: "pg_text_sentiment",
828
- description: "Perform basic sentiment analysis on text using keyword matching.",
829
- group: "text",
830
- inputSchema: SentimentSchema,
831
- outputSchema: TextSentimentOutputSchema,
832
- annotations: readOnly("Text Sentiment"),
833
- icons: getToolIcons("text", readOnly("Text Sentiment")),
834
- handler: (params, _context) => {
835
- try {
836
- const parsed = SentimentSchema.parse(params ?? {});
837
- const text = parsed.text.toLowerCase();
838
- const positiveWords = [
839
- "good",
840
- "great",
841
- "excellent",
842
- "amazing",
843
- "wonderful",
844
- "fantastic",
845
- "love",
846
- "happy",
847
- "positive",
848
- "best",
849
- "beautiful",
850
- "awesome",
851
- "perfect",
852
- "nice",
853
- "helpful",
854
- "thank",
855
- "thanks",
856
- "pleased",
857
- "satisfied",
858
- "recommend",
859
- "enjoy",
860
- "impressive",
861
- "brilliant",
862
- ];
863
- const negativeWords = [
864
- "bad",
865
- "terrible",
866
- "awful",
867
- "horrible",
868
- "worst",
869
- "hate",
870
- "angry",
871
- "disappointed",
872
- "poor",
873
- "wrong",
874
- "problem",
875
- "issue",
876
- "fail",
877
- "failed",
878
- "broken",
879
- "useless",
880
- "waste",
881
- "frustrating",
882
- "annoyed",
883
- "unhappy",
884
- "negative",
885
- "complaint",
886
- "slow",
887
- ];
888
- const words = text.split(/\s+/);
889
- const matchedPositive = words
890
- .map((w) => w.replace(/[^a-z]/g, ""))
891
- .filter((w) => positiveWords.includes(w));
892
- const matchedNegative = words
893
- .map((w) => w.replace(/[^a-z]/g, ""))
894
- .filter((w) => negativeWords.includes(w));
895
- const positiveScore = matchedPositive.length;
896
- const negativeScore = matchedNegative.length;
897
- const totalScore = positiveScore - negativeScore;
898
- let sentiment;
899
- if (totalScore > 2)
900
- sentiment = "very_positive";
901
- else if (totalScore > 0)
902
- sentiment = "positive";
903
- else if (totalScore < -2)
904
- sentiment = "very_negative";
905
- else if (totalScore < 0)
906
- sentiment = "negative";
907
- else
908
- sentiment = "neutral";
909
- const result = {
910
- sentiment,
911
- score: totalScore,
912
- positiveCount: positiveScore,
913
- negativeCount: negativeScore,
914
- confidence: positiveScore + negativeScore > 3
915
- ? "high"
916
- : positiveScore + negativeScore > 1
917
- ? "medium"
918
- : "low",
919
- };
920
- if (parsed.returnWords) {
921
- result.matchedPositive = matchedPositive;
922
- result.matchedNegative = matchedNegative;
923
- }
924
- return Promise.resolve(result);
925
- }
926
- catch (error) {
927
- if (error instanceof ZodError) {
928
- return Promise.resolve({
929
- success: false,
930
- error: `pg_text_sentiment validation error: ${error.issues.map((e) => e.message).join(", ")}`,
931
- });
932
- }
933
- return Promise.resolve({
934
- success: false,
935
- error: error instanceof Error ? error.message : "Unknown error occurred",
936
- });
937
- }
938
- },
939
- };
940
- }
941
- /**
942
- * Convert text to tsvector for full-text search
943
- */
944
- function createTextToVectorTool(adapter) {
945
- const ToVectorSchema = z.object({
946
- text: z.string().describe("Text to convert to tsvector"),
947
- config: z
948
- .string()
949
- .optional()
950
- .describe("Text search configuration (default: english)"),
951
- });
952
- return {
953
- name: "pg_text_to_vector",
954
- description: "Convert text to tsvector representation for full-text search operations.",
955
- group: "text",
956
- inputSchema: ToVectorSchema,
957
- outputSchema: TextToVectorOutputSchema,
958
- annotations: readOnly("Text to Vector"),
959
- icons: getToolIcons("text", readOnly("Text to Vector")),
960
- handler: async (params, _context) => {
961
- try {
962
- const parsed = ToVectorSchema.parse(params ?? {});
963
- const cfg = parsed.config ?? "english";
964
- const result = await adapter.executeQuery(`SELECT to_tsvector($1, $2) as vector`, [cfg, parsed.text]);
965
- return { vector: result.rows?.[0]?.["vector"] };
966
- }
967
- catch (error) {
968
- if (error instanceof ZodError) {
969
- return {
970
- success: false,
971
- error: `pg_text_to_vector validation error: ${error.issues.map((e) => e.message).join(", ")}`,
972
- };
973
- }
974
- return {
975
- success: false,
976
- error: formatPostgresError(error, {
977
- tool: "pg_text_to_vector",
978
- }),
979
- };
980
- }
981
- },
982
- };
983
- }
984
- /**
985
- * Convert text to tsquery for full-text search
986
- */
987
- function createTextToQueryTool(adapter) {
988
- const ToQuerySchema = z.object({
989
- text: z.string().describe("Text to convert to tsquery"),
990
- config: z
991
- .string()
992
- .optional()
993
- .describe("Text search configuration (default: english)"),
994
- mode: z
995
- .enum(["plain", "phrase", "websearch"])
996
- .optional()
997
- .describe("Query parsing mode: plain (default), phrase (proximity), websearch (Google-like)"),
998
- });
999
- return {
1000
- name: "pg_text_to_query",
1001
- description: "Convert text to tsquery for full-text search. Modes: plain (default), phrase (proximity matching), websearch (Google-like syntax with AND/OR/-).",
1002
- group: "text",
1003
- inputSchema: ToQuerySchema,
1004
- outputSchema: TextToQueryOutputSchema,
1005
- annotations: readOnly("Text to Query"),
1006
- icons: getToolIcons("text", readOnly("Text to Query")),
1007
- handler: async (params, _context) => {
1008
- try {
1009
- const parsed = ToQuerySchema.parse(params ?? {});
1010
- const cfg = parsed.config ?? "english";
1011
- const mode = parsed.mode ?? "plain";
1012
- let fn;
1013
- switch (mode) {
1014
- case "phrase":
1015
- fn = "phraseto_tsquery";
1016
- break;
1017
- case "websearch":
1018
- fn = "websearch_to_tsquery";
1019
- break;
1020
- default:
1021
- fn = "plainto_tsquery";
1022
- }
1023
- const result = await adapter.executeQuery(`SELECT ${fn}($1, $2) as query`, [cfg, parsed.text]);
1024
- return { query: result.rows?.[0]?.["query"], mode };
1025
- }
1026
- catch (error) {
1027
- if (error instanceof ZodError) {
1028
- return {
1029
- success: false,
1030
- error: `pg_text_to_query validation error: ${error.issues.map((e) => e.message).join(", ")}`,
1031
- };
1032
- }
1033
- return {
1034
- success: false,
1035
- error: formatPostgresError(error, {
1036
- tool: "pg_text_to_query",
1037
- }),
1038
- };
1039
- }
1040
- },
1041
- };
1042
- }
1043
- /**
1044
- * List available full-text search configurations
1045
- */
1046
- function createTextSearchConfigTool(adapter) {
1047
- return {
1048
- name: "pg_text_search_config",
1049
- description: "List available full-text search configurations (e.g., english, german, simple).",
1050
- group: "text",
1051
- inputSchema: z.object({}).default({}),
1052
- outputSchema: TextSearchConfigOutputSchema,
1053
- annotations: readOnly("Search Configurations"),
1054
- icons: getToolIcons("text", readOnly("Search Configurations")),
1055
- handler: async (_params, _context) => {
1056
- try {
1057
- const result = await adapter.executeQuery(`
1058
- SELECT
1059
- c.cfgname as name,
1060
- n.nspname as schema,
1061
- obj_description(c.oid, 'pg_ts_config') as description
1062
- FROM pg_ts_config c
1063
- JOIN pg_namespace n ON n.oid = c.cfgnamespace
1064
- ORDER BY c.cfgname
1065
- `);
1066
- return {
1067
- configs: result.rows ?? [],
1068
- count: result.rows?.length ?? 0,
1069
- };
1070
- }
1071
- catch (error) {
1072
- return {
1073
- success: false,
1074
- error: formatPostgresError(error, {
1075
- tool: "pg_text_search_config",
1076
- }),
1077
- };
1078
- }
1079
- },
1080
- };
1081
- }
1082
- //# sourceMappingURL=text.js.map