@neverinfamous/mysql-mcp 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -10
  4. package/.github/workflows/docker-publish.yml +15 -13
  5. package/CHANGELOG.md +287 -1
  6. package/DOCKER_README.md +100 -265
  7. package/Dockerfile +5 -0
  8. package/README.md +124 -59
  9. package/VERSION +1 -1
  10. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  11. package/dist/__tests__/mocks/adapter.js +2 -0
  12. package/dist/__tests__/mocks/adapter.js.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  14. package/dist/adapters/DatabaseAdapter.js +50 -9
  15. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  17. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  18. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  19. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  20. package/dist/adapters/mysql/SchemaManager.js +16 -15
  21. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  22. package/dist/adapters/mysql/prompts/index.js +10 -20
  23. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  24. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  25. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  26. package/dist/adapters/mysql/resources/docstore.js +10 -7
  27. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  28. package/dist/adapters/mysql/resources/events.js +11 -8
  29. package/dist/adapters/mysql/resources/events.js.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  31. package/dist/adapters/mysql/resources/indexes.js +12 -15
  32. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  34. package/dist/adapters/mysql/resources/innodb.js +20 -17
  35. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  37. package/dist/adapters/mysql/resources/locks.js +9 -6
  38. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  40. package/dist/adapters/mysql/resources/performance.js +15 -15
  41. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  43. package/dist/adapters/mysql/resources/spatial.js +9 -6
  44. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  46. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  47. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  49. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  50. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  52. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  53. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  55. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  56. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  59. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  62. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  64. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  65. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  66. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  67. package/dist/adapters/mysql/tools/core.js +152 -29
  68. package/dist/adapters/mysql/tools/core.js.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  70. package/dist/adapters/mysql/tools/docstore.js +340 -163
  71. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  72. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  73. package/dist/adapters/mysql/tools/events.js +284 -198
  74. package/dist/adapters/mysql/tools/events.js.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  76. package/dist/adapters/mysql/tools/json/core.js +11 -39
  77. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  79. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  80. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  82. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  83. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  84. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  85. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  87. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  88. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  90. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  91. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  94. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  95. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  96. package/dist/adapters/mysql/tools/replication.js +75 -49
  97. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  99. package/dist/adapters/mysql/tools/roles.js +224 -182
  100. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  101. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  102. package/dist/adapters/mysql/tools/router.js +168 -67
  103. package/dist/adapters/mysql/tools/router.js.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  105. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  106. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  108. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  109. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  111. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  112. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  115. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  117. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  118. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  120. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  121. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  123. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  124. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  126. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  127. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  129. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  130. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  132. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  133. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  135. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  136. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  138. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  139. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  141. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  142. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  144. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  145. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  147. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  148. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  150. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  151. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  153. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  154. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  156. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  157. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  159. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  160. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  162. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  163. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  165. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  166. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  168. package/dist/adapters/mysql/tools/transactions.js +48 -23
  169. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  171. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  173. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  174. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  175. package/dist/adapters/mysql/types/router-types.js +1 -1
  176. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  177. package/dist/adapters/mysql/types/shell-types.js +2 -2
  178. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  179. package/dist/adapters/mysql/types.d.ts +485 -21
  180. package/dist/adapters/mysql/types.d.ts.map +1 -1
  181. package/dist/adapters/mysql/types.js +546 -19
  182. package/dist/adapters/mysql/types.js.map +1 -1
  183. package/dist/auth/scopes.js +1 -1
  184. package/dist/auth/scopes.js.map +1 -1
  185. package/dist/codemode/api.d.ts +3 -2
  186. package/dist/codemode/api.d.ts.map +1 -1
  187. package/dist/codemode/api.js +80 -5
  188. package/dist/codemode/api.js.map +1 -1
  189. package/dist/codemode/sandbox-factory.js +1 -1
  190. package/dist/codemode/sandbox-factory.js.map +1 -1
  191. package/dist/codemode/types.d.ts +26 -0
  192. package/dist/codemode/types.d.ts.map +1 -1
  193. package/dist/codemode/types.js +2 -0
  194. package/dist/codemode/types.js.map +1 -1
  195. package/dist/codemode/worker-sandbox.d.ts +4 -2
  196. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  197. package/dist/codemode/worker-sandbox.js +66 -7
  198. package/dist/codemode/worker-sandbox.js.map +1 -1
  199. package/dist/codemode/worker-script.d.ts +3 -0
  200. package/dist/codemode/worker-script.d.ts.map +1 -1
  201. package/dist/codemode/worker-script.js +128 -75
  202. package/dist/codemode/worker-script.js.map +1 -1
  203. package/dist/constants/ServerInstructions.d.ts +1 -1
  204. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  205. package/dist/constants/ServerInstructions.js +37 -31
  206. package/dist/constants/ServerInstructions.js.map +1 -1
  207. package/dist/filtering/ToolConstants.d.ts +1 -1
  208. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  209. package/dist/filtering/ToolConstants.js +1 -2
  210. package/dist/filtering/ToolConstants.js.map +1 -1
  211. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  212. package/dist/pool/ConnectionPool.js.map +1 -1
  213. package/dist/transports/http.d.ts.map +1 -1
  214. package/dist/transports/http.js +6 -0
  215. package/dist/transports/http.js.map +1 -1
  216. package/dist/utils/validators.d.ts +1 -1
  217. package/dist/utils/validators.d.ts.map +1 -1
  218. package/dist/utils/validators.js.map +1 -1
  219. package/package.json +4 -4
  220. package/releases/v2.3.0-release-notes.md +20 -20
  221. package/releases/v2.3.1-release-notes.md +34 -0
  222. package/releases/v3.0.0-release-notes.md +81 -0
  223. package/src/__tests__/mocks/adapter.ts +3 -0
  224. package/src/__tests__/perf.test.ts +6 -6
  225. package/src/adapters/DatabaseAdapter.ts +58 -9
  226. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  227. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  228. package/src/adapters/mysql/SchemaManager.ts +21 -21
  229. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  230. package/src/adapters/mysql/prompts/index.ts +12 -22
  231. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  232. package/src/adapters/mysql/resources/docstore.ts +13 -10
  233. package/src/adapters/mysql/resources/events.ts +12 -12
  234. package/src/adapters/mysql/resources/indexes.ts +17 -19
  235. package/src/adapters/mysql/resources/innodb.ts +23 -22
  236. package/src/adapters/mysql/resources/locks.ts +9 -7
  237. package/src/adapters/mysql/resources/performance.ts +23 -18
  238. package/src/adapters/mysql/resources/spatial.ts +9 -7
  239. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  240. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  241. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  242. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  243. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  244. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  245. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  246. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  247. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  248. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  249. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
  250. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  251. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  252. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  253. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  254. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  255. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  256. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  257. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  258. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  259. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  260. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  261. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  262. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  263. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  264. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  265. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  266. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  267. package/src/adapters/mysql/tools/core.ts +152 -38
  268. package/src/adapters/mysql/tools/docstore.ts +422 -205
  269. package/src/adapters/mysql/tools/events.ts +334 -233
  270. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  271. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  272. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  273. package/src/adapters/mysql/tools/json/core.ts +21 -42
  274. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  275. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  276. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  278. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  279. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  280. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  281. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  282. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  283. package/src/adapters/mysql/tools/replication.ts +84 -57
  284. package/src/adapters/mysql/tools/roles.ts +274 -226
  285. package/src/adapters/mysql/tools/router.ts +181 -85
  286. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  288. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  289. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  290. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  291. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  292. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  293. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  294. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  295. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  296. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  297. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  298. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  299. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  300. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  301. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  302. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  303. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  304. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  305. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  306. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  307. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  308. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  309. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  310. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  311. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  312. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  313. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  314. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  315. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  316. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  317. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  318. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  319. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  320. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  321. package/src/adapters/mysql/tools/transactions.ts +49 -24
  322. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  323. package/src/adapters/mysql/types/router-types.ts +1 -1
  324. package/src/adapters/mysql/types/shell-types.ts +2 -2
  325. package/src/adapters/mysql/types.ts +632 -19
  326. package/src/auth/__tests__/scopes.test.ts +2 -2
  327. package/src/auth/scopes.ts +1 -1
  328. package/src/codemode/__tests__/api.test.ts +417 -0
  329. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  330. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  331. package/src/codemode/__tests__/security.test.ts +368 -0
  332. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  333. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  334. package/src/codemode/api.ts +89 -5
  335. package/src/codemode/sandbox-factory.ts +1 -1
  336. package/src/codemode/types.ts +34 -0
  337. package/src/codemode/worker-sandbox.ts +74 -7
  338. package/src/codemode/worker-script.ts +157 -86
  339. package/src/constants/ServerInstructions.ts +37 -31
  340. package/src/filtering/ToolConstants.ts +1 -2
  341. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  342. package/src/pool/ConnectionPool.ts +4 -1
  343. package/src/transports/__tests__/http.test.ts +15 -3
  344. package/src/transports/http.ts +12 -0
  345. package/src/utils/validators.ts +2 -1
  346. package/vitest.config.ts +3 -1
  347. package/CODE_MODE.md +0 -245
@@ -2,25 +2,41 @@
2
2
  * ProxySQL Management Tools
3
3
  *
4
4
  * Tools for monitoring and managing ProxySQL via its MySQL-protocol admin interface.
5
- * 12 tools total.
5
+ * 11 tools total.
6
6
  *
7
7
  * ProxySQL admin interface documentation:
8
8
  * https://proxysql.com/documentation/ProxySQL-Admin-Interface/
9
9
  */
10
10
 
11
11
  import mysql from "mysql2/promise";
12
+ import { ZodError } from "zod";
12
13
  import type { ToolDefinition, RequestContext } from "../../../types/index.js";
13
14
  import type { MySQLAdapter } from "../MySQLAdapter.js";
14
15
  import {
15
16
  ProxySQLBaseInputSchema,
16
17
  ProxySQLStatusInputSchema,
17
18
  ProxySQLLimitInputSchema,
19
+ ProxySQLLimitInputSchemaBase,
18
20
  ProxySQLHostgroupInputSchema,
21
+ ProxySQLHostgroupInputSchemaBase,
19
22
  ProxySQLVariableFilterSchema,
23
+ ProxySQLVariableFilterSchemaBase,
20
24
  ProxySQLCommandInputSchema,
21
25
  type ProxySQLConfig,
22
26
  } from "../types/proxysql-types.js";
23
27
 
28
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
29
+ function formatZodError(error: ZodError): string {
30
+ return error.issues.map((i) => i.message).join("; ");
31
+ }
32
+
33
+ /**
34
+ * Safe character set for LIKE patterns.
35
+ * Allows alphanumeric, underscore, dash, dot, percent (%), and space.
36
+ * Rejects SQL injection characters like single quotes, semicolons, parentheses, etc.
37
+ */
38
+ const LIKE_SAFE_RE = /^[a-zA-Z0-9_%\-. *]+$/;
39
+
24
40
  // =============================================================================
25
41
  // ProxySQL Connection Helper
26
42
  // =============================================================================
@@ -98,7 +114,6 @@ export function getProxySQLTools(_adapter: MySQLAdapter): ToolDefinition[] {
98
114
  return [
99
115
  createProxySQLStatusTool(),
100
116
  createProxySQLServersTool(),
101
- createProxySQLHostgroupsTool(),
102
117
  createProxySQLQueryRulesTool(),
103
118
  createProxySQLQueryDigestTool(),
104
119
  createProxySQLConnectionPoolTool(),
@@ -133,42 +148,52 @@ function createProxySQLStatusTool(): ToolDefinition {
133
148
  openWorldHint: true,
134
149
  },
135
150
  handler: async (params: unknown, _context: RequestContext) => {
136
- const { summary } = ProxySQLStatusInputSchema.parse(params);
137
- const rows = await proxySQLQuery("SELECT * FROM stats_mysql_global");
138
-
139
- if (summary) {
140
- // Key metrics for summary mode
141
- const keyMetrics = [
142
- "ProxySQL_Uptime",
143
- "Questions",
144
- "Slow_queries",
145
- "Active_Transactions",
146
- "Client_Connections_connected",
147
- "Client_Connections_created",
148
- "Server_Connections_connected",
149
- "Server_Connections_created",
150
- "Query_Cache_Entries",
151
- "Query_Cache_Memory_bytes",
152
- "mysql_backend_buffers_bytes",
153
- "mysql_frontend_buffers_bytes",
154
- ];
155
- const filteredRows = rows.filter((row) =>
156
- keyMetrics.includes(row["Variable_Name"] as string),
157
- );
151
+ try {
152
+ const { summary } = ProxySQLStatusInputSchema.parse(params);
153
+ const rows = await proxySQLQuery("SELECT * FROM stats_mysql_global");
154
+
155
+ if (summary) {
156
+ // Key metrics for summary mode
157
+ const keyMetrics = [
158
+ "ProxySQL_Uptime",
159
+ "Questions",
160
+ "Slow_queries",
161
+ "Active_Transactions",
162
+ "Client_Connections_connected",
163
+ "Client_Connections_created",
164
+ "Server_Connections_connected",
165
+ "Server_Connections_created",
166
+ "Query_Cache_Entries",
167
+ "Query_Cache_Memory_bytes",
168
+ "mysql_backend_buffers_bytes",
169
+ "mysql_frontend_buffers_bytes",
170
+ ];
171
+ const filteredRows = rows.filter((row) =>
172
+ keyMetrics.includes(row["Variable_Name"] as string),
173
+ );
174
+ return {
175
+ success: true,
176
+ summary: true,
177
+ stats: filteredRows,
178
+ totalVarsAvailable: rows.length,
179
+ };
180
+ }
181
+
158
182
  return {
159
183
  success: true,
160
- summary: true,
161
- stats: filteredRows,
184
+ summary: false,
185
+ stats: rows,
162
186
  totalVarsAvailable: rows.length,
163
187
  };
188
+ } catch (error: unknown) {
189
+ if (error instanceof ZodError) {
190
+ return { success: false, error: formatZodError(error) };
191
+ }
192
+ return {
193
+ success: false,
194
+ error: error instanceof Error ? error.message : String(error),
195
+ };
164
196
  }
165
-
166
- return {
167
- success: true,
168
- summary: false,
169
- stats: rows,
170
- totalVarsAvailable: rows.length,
171
- };
172
197
  },
173
198
  };
174
199
  }
@@ -191,47 +216,57 @@ function createProxySQLRuntimeStatusTool(): ToolDefinition {
191
216
  openWorldHint: true,
192
217
  },
193
218
  handler: async (params: unknown, _context: RequestContext) => {
194
- const { summary } = ProxySQLStatusInputSchema.parse(params);
195
- const [versionRow] = await proxySQLQuery(
196
- "SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'",
197
- );
198
- const adminVars = await proxySQLQuery(
199
- "SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'",
200
- );
201
-
202
- // Redact sensitive admin variables (passwords, credentials)
203
- const redactedVars = redactSensitiveVariables(adminVars);
204
-
205
- if (summary) {
206
- // Key admin variables for summary mode
207
- const keyAdminVars = [
208
- "admin-version",
209
- "admin-read_only",
210
- "admin-cluster_username",
211
- "admin-mysql_ifaces",
212
- "admin-restapi_enabled",
213
- "admin-web_enabled",
214
- "admin-stats_mysql_connection_pool",
215
- ];
216
- const filteredVars = redactedVars.filter((row) =>
217
- keyAdminVars.includes(row["variable_name"] as string),
219
+ try {
220
+ const { summary } = ProxySQLStatusInputSchema.parse(params);
221
+ const [versionRow] = await proxySQLQuery(
222
+ "SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'",
223
+ );
224
+ const adminVars = await proxySQLQuery(
225
+ "SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'",
218
226
  );
227
+
228
+ // Redact sensitive admin variables (passwords, credentials)
229
+ const redactedVars = redactSensitiveVariables(adminVars);
230
+
231
+ if (summary) {
232
+ // Key admin variables for summary mode
233
+ const keyAdminVars = [
234
+ "admin-version",
235
+ "admin-read_only",
236
+ "admin-cluster_username",
237
+ "admin-mysql_ifaces",
238
+ "admin-restapi_enabled",
239
+ "admin-web_enabled",
240
+ "admin-stats_mysql_connection_pool",
241
+ ];
242
+ const filteredVars = redactedVars.filter((row) =>
243
+ keyAdminVars.includes(row["variable_name"] as string),
244
+ );
245
+ return {
246
+ success: true,
247
+ summary: true,
248
+ version: versionRow?.["variable_value"] ?? "unknown",
249
+ adminVariables: filteredVars,
250
+ totalAdminVarsAvailable: redactedVars.length,
251
+ };
252
+ }
253
+
219
254
  return {
220
255
  success: true,
221
- summary: true,
256
+ summary: false,
222
257
  version: versionRow?.["variable_value"] ?? "unknown",
223
- adminVariables: filteredVars,
258
+ adminVariables: redactedVars,
224
259
  totalAdminVarsAvailable: redactedVars.length,
225
260
  };
261
+ } catch (error: unknown) {
262
+ if (error instanceof ZodError) {
263
+ return { success: false, error: formatZodError(error) };
264
+ }
265
+ return {
266
+ success: false,
267
+ error: error instanceof Error ? error.message : String(error),
268
+ };
226
269
  }
227
-
228
- return {
229
- success: true,
230
- summary: false,
231
- version: versionRow?.["variable_value"] ?? "unknown",
232
- adminVariables: redactedVars,
233
- totalAdminVarsAvailable: redactedVars.length,
234
- };
235
270
  },
236
271
  };
237
272
  }
@@ -250,7 +285,7 @@ function createProxySQLServersTool(): ToolDefinition {
250
285
  description:
251
286
  "List configured backend MySQL servers from mysql_servers table. Shows hostgroup, hostname, port, status, and weights.",
252
287
  group: "proxysql",
253
- inputSchema: ProxySQLHostgroupInputSchema,
288
+ inputSchema: ProxySQLHostgroupInputSchemaBase,
254
289
  requiredScopes: ["read"],
255
290
  annotations: {
256
291
  readOnlyHint: true,
@@ -258,47 +293,28 @@ function createProxySQLServersTool(): ToolDefinition {
258
293
  openWorldHint: true,
259
294
  },
260
295
  handler: async (params: unknown, _context: RequestContext) => {
261
- const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
262
- let sql = "SELECT * FROM mysql_servers";
263
- if (hostgroup_id !== undefined) {
264
- sql += ` WHERE hostgroup_id = ${hostgroup_id}`;
296
+ try {
297
+ const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
298
+ let sql = "SELECT * FROM mysql_servers";
299
+ if (hostgroup_id !== undefined) {
300
+ const safeId = Math.max(0, Math.floor(hostgroup_id));
301
+ sql += ` WHERE hostgroup_id = ${safeId}`;
302
+ }
303
+ const rows = await proxySQLQuery(sql);
304
+ return {
305
+ success: true,
306
+ servers: rows,
307
+ count: rows.length,
308
+ };
309
+ } catch (error: unknown) {
310
+ if (error instanceof ZodError) {
311
+ return { success: false, error: formatZodError(error) };
312
+ }
313
+ return {
314
+ success: false,
315
+ error: error instanceof Error ? error.message : String(error),
316
+ };
265
317
  }
266
- const rows = await proxySQLQuery(sql);
267
- return {
268
- success: true,
269
- servers: rows,
270
- count: rows.length,
271
- };
272
- },
273
- };
274
- }
275
-
276
- /**
277
- * List hostgroup configurations and connection pool stats
278
- */
279
- function createProxySQLHostgroupsTool(): ToolDefinition {
280
- return {
281
- name: "proxysql_hostgroups",
282
- title: "ProxySQL Hostgroups",
283
- description:
284
- "List hostgroup configurations with connection pool statistics. Shows connections used/free, query counts, and latency.",
285
- group: "proxysql",
286
- inputSchema: ProxySQLBaseInputSchema,
287
- requiredScopes: ["read"],
288
- annotations: {
289
- readOnlyHint: true,
290
- idempotentHint: true,
291
- openWorldHint: true,
292
- },
293
- handler: async (_params: unknown, _context: RequestContext) => {
294
- const rows = await proxySQLQuery(
295
- "SELECT * FROM stats_mysql_connection_pool",
296
- );
297
- return {
298
- success: true,
299
- hostgroups: rows,
300
- count: rows.length,
301
- };
302
318
  },
303
319
  };
304
320
  }
@@ -317,7 +333,7 @@ function createProxySQLQueryRulesTool(): ToolDefinition {
317
333
  description:
318
334
  "List query routing rules from mysql_query_rules table. Shows rule IDs, match patterns, destination hostgroups, and cache settings.",
319
335
  group: "proxysql",
320
- inputSchema: ProxySQLLimitInputSchema,
336
+ inputSchema: ProxySQLLimitInputSchemaBase,
321
337
  requiredScopes: ["read"],
322
338
  annotations: {
323
339
  readOnlyHint: true,
@@ -325,16 +341,26 @@ function createProxySQLQueryRulesTool(): ToolDefinition {
325
341
  openWorldHint: true,
326
342
  },
327
343
  handler: async (params: unknown, _context: RequestContext) => {
328
- const { limit } = ProxySQLLimitInputSchema.parse(params);
329
- const maxRows = limit ?? 100;
330
- const rows = await proxySQLQuery(
331
- `SELECT * FROM mysql_query_rules LIMIT ${maxRows}`,
332
- );
333
- return {
334
- success: true,
335
- queryRules: rows,
336
- count: rows.length,
337
- };
344
+ try {
345
+ const { limit } = ProxySQLLimitInputSchema.parse(params);
346
+ const maxRows = Math.max(0, Math.floor(limit ?? 100));
347
+ const rows = await proxySQLQuery(
348
+ `SELECT * FROM mysql_query_rules LIMIT ${maxRows}`,
349
+ );
350
+ return {
351
+ success: true,
352
+ queryRules: rows,
353
+ count: rows.length,
354
+ };
355
+ } catch (error: unknown) {
356
+ if (error instanceof ZodError) {
357
+ return { success: false, error: formatZodError(error) };
358
+ }
359
+ return {
360
+ success: false,
361
+ error: error instanceof Error ? error.message : String(error),
362
+ };
363
+ }
338
364
  },
339
365
  };
340
366
  }
@@ -349,7 +375,7 @@ function createProxySQLQueryDigestTool(): ToolDefinition {
349
375
  description:
350
376
  "Get query digest statistics showing top queries by execution count. Useful for identifying queries for routing, rewriting, or caching.",
351
377
  group: "proxysql",
352
- inputSchema: ProxySQLLimitInputSchema,
378
+ inputSchema: ProxySQLLimitInputSchemaBase,
353
379
  requiredScopes: ["read"],
354
380
  annotations: {
355
381
  readOnlyHint: true,
@@ -357,16 +383,26 @@ function createProxySQLQueryDigestTool(): ToolDefinition {
357
383
  openWorldHint: true,
358
384
  },
359
385
  handler: async (params: unknown, _context: RequestContext) => {
360
- const { limit } = ProxySQLLimitInputSchema.parse(params);
361
- const maxRows = limit ?? 50;
362
- const rows = await proxySQLQuery(
363
- `SELECT hostgroup, schemaname, username, digest, digest_text, count_star, sum_time, min_time, max_time FROM stats_mysql_query_digest ORDER BY count_star DESC LIMIT ${maxRows}`,
364
- );
365
- return {
366
- success: true,
367
- queryDigests: rows,
368
- count: rows.length,
369
- };
386
+ try {
387
+ const { limit } = ProxySQLLimitInputSchema.parse(params);
388
+ const maxRows = Math.max(0, Math.floor(limit ?? 50));
389
+ const rows = await proxySQLQuery(
390
+ `SELECT hostgroup, schemaname, username, digest, digest_text, count_star, sum_time, min_time, max_time FROM stats_mysql_query_digest ORDER BY count_star DESC LIMIT ${maxRows}`,
391
+ );
392
+ return {
393
+ success: true,
394
+ queryDigests: rows,
395
+ count: rows.length,
396
+ };
397
+ } catch (error: unknown) {
398
+ if (error instanceof ZodError) {
399
+ return { success: false, error: formatZodError(error) };
400
+ }
401
+ return {
402
+ success: false,
403
+ error: error instanceof Error ? error.message : String(error),
404
+ };
405
+ }
370
406
  },
371
407
  };
372
408
  }
@@ -385,7 +421,7 @@ function createProxySQLConnectionPoolTool(): ToolDefinition {
385
421
  description:
386
422
  "Get connection pool statistics per backend server. Shows connections used/free, errors, queries, bytes transferred, and latency.",
387
423
  group: "proxysql",
388
- inputSchema: ProxySQLHostgroupInputSchema,
424
+ inputSchema: ProxySQLHostgroupInputSchemaBase,
389
425
  requiredScopes: ["read"],
390
426
  annotations: {
391
427
  readOnlyHint: true,
@@ -393,17 +429,28 @@ function createProxySQLConnectionPoolTool(): ToolDefinition {
393
429
  openWorldHint: true,
394
430
  },
395
431
  handler: async (params: unknown, _context: RequestContext) => {
396
- const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
397
- let sql = "SELECT * FROM stats_mysql_connection_pool";
398
- if (hostgroup_id !== undefined) {
399
- sql += ` WHERE hostgroup = ${hostgroup_id}`;
432
+ try {
433
+ const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
434
+ let sql = "SELECT * FROM stats_mysql_connection_pool";
435
+ if (hostgroup_id !== undefined) {
436
+ const safeId = Math.max(0, Math.floor(hostgroup_id));
437
+ sql += ` WHERE hostgroup = ${safeId}`;
438
+ }
439
+ const rows = await proxySQLQuery(sql);
440
+ return {
441
+ success: true,
442
+ connectionPools: rows,
443
+ count: rows.length,
444
+ };
445
+ } catch (error: unknown) {
446
+ if (error instanceof ZodError) {
447
+ return { success: false, error: formatZodError(error) };
448
+ }
449
+ return {
450
+ success: false,
451
+ error: error instanceof Error ? error.message : String(error),
452
+ };
400
453
  }
401
- const rows = await proxySQLQuery(sql);
402
- return {
403
- success: true,
404
- connectionPools: rows,
405
- count: rows.length,
406
- };
407
454
  },
408
455
  };
409
456
  }
@@ -430,15 +477,25 @@ function createProxySQLUsersTool(): ToolDefinition {
430
477
  openWorldHint: true,
431
478
  },
432
479
  handler: async (_params: unknown, _context: RequestContext) => {
433
- // Don't expose passwords, select specific columns
434
- const rows = await proxySQLQuery(
435
- "SELECT username, active, use_ssl, default_hostgroup, default_schema, transaction_persistent, max_connections, comment FROM mysql_users",
436
- );
437
- return {
438
- success: true,
439
- users: rows,
440
- count: rows.length,
441
- };
480
+ try {
481
+ // Don't expose passwords, select specific columns
482
+ const rows = await proxySQLQuery(
483
+ "SELECT username, active, use_ssl, default_hostgroup, default_schema, transaction_persistent, max_connections, comment FROM mysql_users",
484
+ );
485
+ return {
486
+ success: true,
487
+ users: rows,
488
+ count: rows.length,
489
+ };
490
+ } catch (error: unknown) {
491
+ if (error instanceof ZodError) {
492
+ return { success: false, error: formatZodError(error) };
493
+ }
494
+ return {
495
+ success: false,
496
+ error: error instanceof Error ? error.message : String(error),
497
+ };
498
+ }
442
499
  },
443
500
  };
444
501
  }
@@ -457,7 +514,7 @@ function createProxySQLGlobalVariablesTool(): ToolDefinition {
457
514
  description:
458
515
  "Get ProxySQL global variables. Filter by prefix: mysql (MySQL proxy settings), admin (admin interface settings), or all. Use like parameter for pattern matching.",
459
516
  group: "proxysql",
460
- inputSchema: ProxySQLVariableFilterSchema,
517
+ inputSchema: ProxySQLVariableFilterSchemaBase,
461
518
  requiredScopes: ["read"],
462
519
  annotations: {
463
520
  readOnlyHint: true,
@@ -465,47 +522,63 @@ function createProxySQLGlobalVariablesTool(): ToolDefinition {
465
522
  openWorldHint: true,
466
523
  },
467
524
  handler: async (params: unknown, _context: RequestContext) => {
468
- const { prefix, like, limit } =
469
- ProxySQLVariableFilterSchema.parse(params);
470
- const conditions: string[] = [];
471
-
472
- // Apply prefix filter
473
- if (prefix === "mysql") {
474
- conditions.push("variable_name LIKE 'mysql-%'");
475
- } else if (prefix === "admin") {
476
- conditions.push("variable_name LIKE 'admin-%'");
477
- }
525
+ try {
526
+ const { prefix, like, limit } =
527
+ ProxySQLVariableFilterSchema.parse(params);
528
+ const conditions: string[] = [];
529
+
530
+ // Apply prefix filter
531
+ if (prefix === "mysql") {
532
+ conditions.push("variable_name LIKE 'mysql-%'");
533
+ } else if (prefix === "admin") {
534
+ conditions.push("variable_name LIKE 'admin-%'");
535
+ }
536
+
537
+ // Validate like pattern against safe character set
538
+ if (like) {
539
+ if (!LIKE_SAFE_RE.test(like)) {
540
+ return {
541
+ success: false,
542
+ error: `Invalid like pattern: '${like}' — only alphanumeric, underscore, dash, dot, percent (%), and space characters are allowed`,
543
+ };
544
+ }
545
+ const sanitizedLike = like.replace(/'/g, "''");
546
+ conditions.push(`variable_name LIKE '${sanitizedLike}'`);
547
+ }
548
+
549
+ const whereClause =
550
+ conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
551
+
552
+ // Get total count (without LIMIT) for truncation awareness
553
+ const countRows = await proxySQLQuery(
554
+ `SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`,
555
+ );
556
+ const countRow = countRows[0] ?? { cnt: 0 };
557
+ const totalVarsAvailable = Number(countRow["cnt"]);
478
558
 
479
- // Apply like pattern filter (sanitize input)
480
- if (like) {
481
- const sanitizedLike = like.replace(/'/g, "''");
482
- conditions.push(`variable_name LIKE '${sanitizedLike}'`);
483
- }
559
+ const maxRows = Math.max(0, Math.floor(limit ?? 50));
560
+ const rows = await proxySQLQuery(
561
+ `SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`,
562
+ );
484
563
 
485
- const whereClause =
486
- conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
487
-
488
- // Get total count (without LIMIT) for truncation awareness
489
- const countRows = await proxySQLQuery(
490
- `SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`,
491
- );
492
- const countRow = countRows[0] ?? { cnt: 0 };
493
- const totalVarsAvailable = Number(countRow["cnt"]);
494
-
495
- const maxRows = limit ?? 50;
496
- const rows = await proxySQLQuery(
497
- `SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`,
498
- );
499
-
500
- // Redact sensitive credential values (passwords, credentials)
501
- const redactedRows = redactSensitiveVariables(rows);
502
-
503
- return {
504
- success: true,
505
- variables: redactedRows,
506
- count: redactedRows.length,
507
- totalVarsAvailable,
508
- };
564
+ // Redact sensitive credential values (passwords, credentials)
565
+ const redactedRows = redactSensitiveVariables(rows);
566
+
567
+ return {
568
+ success: true,
569
+ variables: redactedRows,
570
+ count: redactedRows.length,
571
+ totalVarsAvailable,
572
+ };
573
+ } catch (error: unknown) {
574
+ if (error instanceof ZodError) {
575
+ return { success: false, error: formatZodError(error) };
576
+ }
577
+ return {
578
+ success: false,
579
+ error: error instanceof Error ? error.message : String(error),
580
+ };
581
+ }
509
582
  },
510
583
  };
511
584
  }
@@ -532,12 +605,22 @@ function createProxySQLMemoryStatsTool(): ToolDefinition {
532
605
  openWorldHint: true,
533
606
  },
534
607
  handler: async (_params: unknown, _context: RequestContext) => {
535
- const rows = await proxySQLQuery("SELECT * FROM stats_memory_metrics");
536
- return {
537
- success: true,
538
- memoryStats: rows,
539
- count: rows.length,
540
- };
608
+ try {
609
+ const rows = await proxySQLQuery("SELECT * FROM stats_memory_metrics");
610
+ return {
611
+ success: true,
612
+ memoryStats: rows,
613
+ count: rows.length,
614
+ };
615
+ } catch (error: unknown) {
616
+ if (error instanceof ZodError) {
617
+ return { success: false, error: formatZodError(error) };
618
+ }
619
+ return {
620
+ success: false,
621
+ error: error instanceof Error ? error.message : String(error),
622
+ };
623
+ }
541
624
  },
542
625
  };
543
626
  }
@@ -563,13 +646,23 @@ function createProxySQLCommandsTool(): ToolDefinition {
563
646
  openWorldHint: true,
564
647
  },
565
648
  handler: async (params: unknown, _context: RequestContext) => {
566
- const { command } = ProxySQLCommandInputSchema.parse(params);
567
- await proxySQLQuery(command);
568
- return {
569
- success: true,
570
- command,
571
- message: `Command executed: ${command}`,
572
- };
649
+ try {
650
+ const { command } = ProxySQLCommandInputSchema.parse(params);
651
+ await proxySQLQuery(command);
652
+ return {
653
+ success: true,
654
+ command,
655
+ message: `Command executed: ${command}`,
656
+ };
657
+ } catch (error: unknown) {
658
+ if (error instanceof ZodError) {
659
+ return { success: false, error: formatZodError(error) };
660
+ }
661
+ return {
662
+ success: false,
663
+ error: error instanceof Error ? error.message : String(error),
664
+ };
665
+ }
573
666
  },
574
667
  };
575
668
  }
@@ -596,12 +689,24 @@ function createProxySQLProcessListTool(): ToolDefinition {
596
689
  openWorldHint: true,
597
690
  },
598
691
  handler: async (_params: unknown, _context: RequestContext) => {
599
- const rows = await proxySQLQuery("SELECT * FROM stats_mysql_processlist");
600
- return {
601
- success: true,
602
- processes: rows,
603
- count: rows.length,
604
- };
692
+ try {
693
+ const rows = await proxySQLQuery(
694
+ "SELECT * FROM stats_mysql_processlist",
695
+ );
696
+ return {
697
+ success: true,
698
+ processes: rows,
699
+ count: rows.length,
700
+ };
701
+ } catch (error: unknown) {
702
+ if (error instanceof ZodError) {
703
+ return { success: false, error: formatZodError(error) };
704
+ }
705
+ return {
706
+ success: false,
707
+ error: error instanceof Error ? error.message : String(error),
708
+ };
709
+ }
605
710
  },
606
711
  };
607
712
  }