@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,13 +2,24 @@
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
  import mysql from "mysql2/promise";
11
- import { ProxySQLBaseInputSchema, ProxySQLStatusInputSchema, ProxySQLLimitInputSchema, ProxySQLHostgroupInputSchema, ProxySQLVariableFilterSchema, ProxySQLCommandInputSchema, } from "../types/proxysql-types.js";
11
+ import { ZodError } from "zod";
12
+ import { ProxySQLBaseInputSchema, ProxySQLStatusInputSchema, ProxySQLLimitInputSchema, ProxySQLLimitInputSchemaBase, ProxySQLHostgroupInputSchema, ProxySQLHostgroupInputSchemaBase, ProxySQLVariableFilterSchema, ProxySQLVariableFilterSchemaBase, ProxySQLCommandInputSchema, } from "../types/proxysql-types.js";
13
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
14
+ function formatZodError(error) {
15
+ return error.issues.map((i) => i.message).join("; ");
16
+ }
17
+ /**
18
+ * Safe character set for LIKE patterns.
19
+ * Allows alphanumeric, underscore, dash, dot, percent (%), and space.
20
+ * Rejects SQL injection characters like single quotes, semicolons, parentheses, etc.
21
+ */
22
+ const LIKE_SAFE_RE = /^[a-zA-Z0-9_%\-. *]+$/;
12
23
  // =============================================================================
13
24
  // ProxySQL Connection Helper
14
25
  // =============================================================================
@@ -71,7 +82,6 @@ export function getProxySQLTools(_adapter) {
71
82
  return [
72
83
  createProxySQLStatusTool(),
73
84
  createProxySQLServersTool(),
74
- createProxySQLHostgroupsTool(),
75
85
  createProxySQLQueryRulesTool(),
76
86
  createProxySQLQueryDigestTool(),
77
87
  createProxySQLConnectionPoolTool(),
@@ -103,38 +113,49 @@ function createProxySQLStatusTool() {
103
113
  openWorldHint: true,
104
114
  },
105
115
  handler: async (params, _context) => {
106
- const { summary } = ProxySQLStatusInputSchema.parse(params);
107
- const rows = await proxySQLQuery("SELECT * FROM stats_mysql_global");
108
- if (summary) {
109
- // Key metrics for summary mode
110
- const keyMetrics = [
111
- "ProxySQL_Uptime",
112
- "Questions",
113
- "Slow_queries",
114
- "Active_Transactions",
115
- "Client_Connections_connected",
116
- "Client_Connections_created",
117
- "Server_Connections_connected",
118
- "Server_Connections_created",
119
- "Query_Cache_Entries",
120
- "Query_Cache_Memory_bytes",
121
- "mysql_backend_buffers_bytes",
122
- "mysql_frontend_buffers_bytes",
123
- ];
124
- const filteredRows = rows.filter((row) => keyMetrics.includes(row["Variable_Name"]));
116
+ try {
117
+ const { summary } = ProxySQLStatusInputSchema.parse(params);
118
+ const rows = await proxySQLQuery("SELECT * FROM stats_mysql_global");
119
+ if (summary) {
120
+ // Key metrics for summary mode
121
+ const keyMetrics = [
122
+ "ProxySQL_Uptime",
123
+ "Questions",
124
+ "Slow_queries",
125
+ "Active_Transactions",
126
+ "Client_Connections_connected",
127
+ "Client_Connections_created",
128
+ "Server_Connections_connected",
129
+ "Server_Connections_created",
130
+ "Query_Cache_Entries",
131
+ "Query_Cache_Memory_bytes",
132
+ "mysql_backend_buffers_bytes",
133
+ "mysql_frontend_buffers_bytes",
134
+ ];
135
+ const filteredRows = rows.filter((row) => keyMetrics.includes(row["Variable_Name"]));
136
+ return {
137
+ success: true,
138
+ summary: true,
139
+ stats: filteredRows,
140
+ totalVarsAvailable: rows.length,
141
+ };
142
+ }
125
143
  return {
126
144
  success: true,
127
- summary: true,
128
- stats: filteredRows,
145
+ summary: false,
146
+ stats: rows,
129
147
  totalVarsAvailable: rows.length,
130
148
  };
131
149
  }
132
- return {
133
- success: true,
134
- summary: false,
135
- stats: rows,
136
- totalVarsAvailable: rows.length,
137
- };
150
+ catch (error) {
151
+ if (error instanceof ZodError) {
152
+ return { success: false, error: formatZodError(error) };
153
+ }
154
+ return {
155
+ success: false,
156
+ error: error instanceof Error ? error.message : String(error),
157
+ };
158
+ }
138
159
  },
139
160
  };
140
161
  }
@@ -155,38 +176,49 @@ function createProxySQLRuntimeStatusTool() {
155
176
  openWorldHint: true,
156
177
  },
157
178
  handler: async (params, _context) => {
158
- const { summary } = ProxySQLStatusInputSchema.parse(params);
159
- const [versionRow] = await proxySQLQuery("SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'");
160
- const adminVars = await proxySQLQuery("SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'");
161
- // Redact sensitive admin variables (passwords, credentials)
162
- const redactedVars = redactSensitiveVariables(adminVars);
163
- if (summary) {
164
- // Key admin variables for summary mode
165
- const keyAdminVars = [
166
- "admin-version",
167
- "admin-read_only",
168
- "admin-cluster_username",
169
- "admin-mysql_ifaces",
170
- "admin-restapi_enabled",
171
- "admin-web_enabled",
172
- "admin-stats_mysql_connection_pool",
173
- ];
174
- const filteredVars = redactedVars.filter((row) => keyAdminVars.includes(row["variable_name"]));
179
+ try {
180
+ const { summary } = ProxySQLStatusInputSchema.parse(params);
181
+ const [versionRow] = await proxySQLQuery("SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'");
182
+ const adminVars = await proxySQLQuery("SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'");
183
+ // Redact sensitive admin variables (passwords, credentials)
184
+ const redactedVars = redactSensitiveVariables(adminVars);
185
+ if (summary) {
186
+ // Key admin variables for summary mode
187
+ const keyAdminVars = [
188
+ "admin-version",
189
+ "admin-read_only",
190
+ "admin-cluster_username",
191
+ "admin-mysql_ifaces",
192
+ "admin-restapi_enabled",
193
+ "admin-web_enabled",
194
+ "admin-stats_mysql_connection_pool",
195
+ ];
196
+ const filteredVars = redactedVars.filter((row) => keyAdminVars.includes(row["variable_name"]));
197
+ return {
198
+ success: true,
199
+ summary: true,
200
+ version: versionRow?.["variable_value"] ?? "unknown",
201
+ adminVariables: filteredVars,
202
+ totalAdminVarsAvailable: redactedVars.length,
203
+ };
204
+ }
175
205
  return {
176
206
  success: true,
177
- summary: true,
207
+ summary: false,
178
208
  version: versionRow?.["variable_value"] ?? "unknown",
179
- adminVariables: filteredVars,
209
+ adminVariables: redactedVars,
180
210
  totalAdminVarsAvailable: redactedVars.length,
181
211
  };
182
212
  }
183
- return {
184
- success: true,
185
- summary: false,
186
- version: versionRow?.["variable_value"] ?? "unknown",
187
- adminVariables: redactedVars,
188
- totalAdminVarsAvailable: redactedVars.length,
189
- };
213
+ catch (error) {
214
+ if (error instanceof ZodError) {
215
+ return { success: false, error: formatZodError(error) };
216
+ }
217
+ return {
218
+ success: false,
219
+ error: error instanceof Error ? error.message : String(error),
220
+ };
221
+ }
190
222
  },
191
223
  };
192
224
  }
@@ -202,7 +234,7 @@ function createProxySQLServersTool() {
202
234
  title: "ProxySQL Servers",
203
235
  description: "List configured backend MySQL servers from mysql_servers table. Shows hostgroup, hostname, port, status, and weights.",
204
236
  group: "proxysql",
205
- inputSchema: ProxySQLHostgroupInputSchema,
237
+ inputSchema: ProxySQLHostgroupInputSchemaBase,
206
238
  requiredScopes: ["read"],
207
239
  annotations: {
208
240
  readOnlyHint: true,
@@ -210,43 +242,29 @@ function createProxySQLServersTool() {
210
242
  openWorldHint: true,
211
243
  },
212
244
  handler: async (params, _context) => {
213
- const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
214
- let sql = "SELECT * FROM mysql_servers";
215
- if (hostgroup_id !== undefined) {
216
- sql += ` WHERE hostgroup_id = ${hostgroup_id}`;
245
+ try {
246
+ const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
247
+ let sql = "SELECT * FROM mysql_servers";
248
+ if (hostgroup_id !== undefined) {
249
+ const safeId = Math.max(0, Math.floor(hostgroup_id));
250
+ sql += ` WHERE hostgroup_id = ${safeId}`;
251
+ }
252
+ const rows = await proxySQLQuery(sql);
253
+ return {
254
+ success: true,
255
+ servers: rows,
256
+ count: rows.length,
257
+ };
258
+ }
259
+ catch (error) {
260
+ if (error instanceof ZodError) {
261
+ return { success: false, error: formatZodError(error) };
262
+ }
263
+ return {
264
+ success: false,
265
+ error: error instanceof Error ? error.message : String(error),
266
+ };
217
267
  }
218
- const rows = await proxySQLQuery(sql);
219
- return {
220
- success: true,
221
- servers: rows,
222
- count: rows.length,
223
- };
224
- },
225
- };
226
- }
227
- /**
228
- * List hostgroup configurations and connection pool stats
229
- */
230
- function createProxySQLHostgroupsTool() {
231
- return {
232
- name: "proxysql_hostgroups",
233
- title: "ProxySQL Hostgroups",
234
- description: "List hostgroup configurations with connection pool statistics. Shows connections used/free, query counts, and latency.",
235
- group: "proxysql",
236
- inputSchema: ProxySQLBaseInputSchema,
237
- requiredScopes: ["read"],
238
- annotations: {
239
- readOnlyHint: true,
240
- idempotentHint: true,
241
- openWorldHint: true,
242
- },
243
- handler: async (_params, _context) => {
244
- const rows = await proxySQLQuery("SELECT * FROM stats_mysql_connection_pool");
245
- return {
246
- success: true,
247
- hostgroups: rows,
248
- count: rows.length,
249
- };
250
268
  },
251
269
  };
252
270
  }
@@ -262,7 +280,7 @@ function createProxySQLQueryRulesTool() {
262
280
  title: "ProxySQL Query Rules",
263
281
  description: "List query routing rules from mysql_query_rules table. Shows rule IDs, match patterns, destination hostgroups, and cache settings.",
264
282
  group: "proxysql",
265
- inputSchema: ProxySQLLimitInputSchema,
283
+ inputSchema: ProxySQLLimitInputSchemaBase,
266
284
  requiredScopes: ["read"],
267
285
  annotations: {
268
286
  readOnlyHint: true,
@@ -270,14 +288,25 @@ function createProxySQLQueryRulesTool() {
270
288
  openWorldHint: true,
271
289
  },
272
290
  handler: async (params, _context) => {
273
- const { limit } = ProxySQLLimitInputSchema.parse(params);
274
- const maxRows = limit ?? 100;
275
- const rows = await proxySQLQuery(`SELECT * FROM mysql_query_rules LIMIT ${maxRows}`);
276
- return {
277
- success: true,
278
- queryRules: rows,
279
- count: rows.length,
280
- };
291
+ try {
292
+ const { limit } = ProxySQLLimitInputSchema.parse(params);
293
+ const maxRows = Math.max(0, Math.floor(limit ?? 100));
294
+ const rows = await proxySQLQuery(`SELECT * FROM mysql_query_rules LIMIT ${maxRows}`);
295
+ return {
296
+ success: true,
297
+ queryRules: rows,
298
+ count: rows.length,
299
+ };
300
+ }
301
+ catch (error) {
302
+ if (error instanceof ZodError) {
303
+ return { success: false, error: formatZodError(error) };
304
+ }
305
+ return {
306
+ success: false,
307
+ error: error instanceof Error ? error.message : String(error),
308
+ };
309
+ }
281
310
  },
282
311
  };
283
312
  }
@@ -290,7 +319,7 @@ function createProxySQLQueryDigestTool() {
290
319
  title: "ProxySQL Query Digest",
291
320
  description: "Get query digest statistics showing top queries by execution count. Useful for identifying queries for routing, rewriting, or caching.",
292
321
  group: "proxysql",
293
- inputSchema: ProxySQLLimitInputSchema,
322
+ inputSchema: ProxySQLLimitInputSchemaBase,
294
323
  requiredScopes: ["read"],
295
324
  annotations: {
296
325
  readOnlyHint: true,
@@ -298,14 +327,25 @@ function createProxySQLQueryDigestTool() {
298
327
  openWorldHint: true,
299
328
  },
300
329
  handler: async (params, _context) => {
301
- const { limit } = ProxySQLLimitInputSchema.parse(params);
302
- const maxRows = limit ?? 50;
303
- const rows = await proxySQLQuery(`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}`);
304
- return {
305
- success: true,
306
- queryDigests: rows,
307
- count: rows.length,
308
- };
330
+ try {
331
+ const { limit } = ProxySQLLimitInputSchema.parse(params);
332
+ const maxRows = Math.max(0, Math.floor(limit ?? 50));
333
+ const rows = await proxySQLQuery(`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}`);
334
+ return {
335
+ success: true,
336
+ queryDigests: rows,
337
+ count: rows.length,
338
+ };
339
+ }
340
+ catch (error) {
341
+ if (error instanceof ZodError) {
342
+ return { success: false, error: formatZodError(error) };
343
+ }
344
+ return {
345
+ success: false,
346
+ error: error instanceof Error ? error.message : String(error),
347
+ };
348
+ }
309
349
  },
310
350
  };
311
351
  }
@@ -321,7 +361,7 @@ function createProxySQLConnectionPoolTool() {
321
361
  title: "ProxySQL Connection Pool",
322
362
  description: "Get connection pool statistics per backend server. Shows connections used/free, errors, queries, bytes transferred, and latency.",
323
363
  group: "proxysql",
324
- inputSchema: ProxySQLHostgroupInputSchema,
364
+ inputSchema: ProxySQLHostgroupInputSchemaBase,
325
365
  requiredScopes: ["read"],
326
366
  annotations: {
327
367
  readOnlyHint: true,
@@ -329,17 +369,29 @@ function createProxySQLConnectionPoolTool() {
329
369
  openWorldHint: true,
330
370
  },
331
371
  handler: async (params, _context) => {
332
- const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
333
- let sql = "SELECT * FROM stats_mysql_connection_pool";
334
- if (hostgroup_id !== undefined) {
335
- sql += ` WHERE hostgroup = ${hostgroup_id}`;
372
+ try {
373
+ const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
374
+ let sql = "SELECT * FROM stats_mysql_connection_pool";
375
+ if (hostgroup_id !== undefined) {
376
+ const safeId = Math.max(0, Math.floor(hostgroup_id));
377
+ sql += ` WHERE hostgroup = ${safeId}`;
378
+ }
379
+ const rows = await proxySQLQuery(sql);
380
+ return {
381
+ success: true,
382
+ connectionPools: rows,
383
+ count: rows.length,
384
+ };
385
+ }
386
+ catch (error) {
387
+ if (error instanceof ZodError) {
388
+ return { success: false, error: formatZodError(error) };
389
+ }
390
+ return {
391
+ success: false,
392
+ error: error instanceof Error ? error.message : String(error),
393
+ };
336
394
  }
337
- const rows = await proxySQLQuery(sql);
338
- return {
339
- success: true,
340
- connectionPools: rows,
341
- count: rows.length,
342
- };
343
395
  },
344
396
  };
345
397
  }
@@ -363,13 +415,24 @@ function createProxySQLUsersTool() {
363
415
  openWorldHint: true,
364
416
  },
365
417
  handler: async (_params, _context) => {
366
- // Don't expose passwords, select specific columns
367
- const rows = await proxySQLQuery("SELECT username, active, use_ssl, default_hostgroup, default_schema, transaction_persistent, max_connections, comment FROM mysql_users");
368
- return {
369
- success: true,
370
- users: rows,
371
- count: rows.length,
372
- };
418
+ try {
419
+ // Don't expose passwords, select specific columns
420
+ const rows = await proxySQLQuery("SELECT username, active, use_ssl, default_hostgroup, default_schema, transaction_persistent, max_connections, comment FROM mysql_users");
421
+ return {
422
+ success: true,
423
+ users: rows,
424
+ count: rows.length,
425
+ };
426
+ }
427
+ catch (error) {
428
+ if (error instanceof ZodError) {
429
+ return { success: false, error: formatZodError(error) };
430
+ }
431
+ return {
432
+ success: false,
433
+ error: error instanceof Error ? error.message : String(error),
434
+ };
435
+ }
373
436
  },
374
437
  };
375
438
  }
@@ -385,7 +448,7 @@ function createProxySQLGlobalVariablesTool() {
385
448
  title: "ProxySQL Global Variables",
386
449
  description: "Get ProxySQL global variables. Filter by prefix: mysql (MySQL proxy settings), admin (admin interface settings), or all. Use like parameter for pattern matching.",
387
450
  group: "proxysql",
388
- inputSchema: ProxySQLVariableFilterSchema,
451
+ inputSchema: ProxySQLVariableFilterSchemaBase,
389
452
  requiredScopes: ["read"],
390
453
  annotations: {
391
454
  readOnlyHint: true,
@@ -393,35 +456,52 @@ function createProxySQLGlobalVariablesTool() {
393
456
  openWorldHint: true,
394
457
  },
395
458
  handler: async (params, _context) => {
396
- const { prefix, like, limit } = ProxySQLVariableFilterSchema.parse(params);
397
- const conditions = [];
398
- // Apply prefix filter
399
- if (prefix === "mysql") {
400
- conditions.push("variable_name LIKE 'mysql-%'");
401
- }
402
- else if (prefix === "admin") {
403
- conditions.push("variable_name LIKE 'admin-%'");
459
+ try {
460
+ const { prefix, like, limit } = ProxySQLVariableFilterSchema.parse(params);
461
+ const conditions = [];
462
+ // Apply prefix filter
463
+ if (prefix === "mysql") {
464
+ conditions.push("variable_name LIKE 'mysql-%'");
465
+ }
466
+ else if (prefix === "admin") {
467
+ conditions.push("variable_name LIKE 'admin-%'");
468
+ }
469
+ // Validate like pattern against safe character set
470
+ if (like) {
471
+ if (!LIKE_SAFE_RE.test(like)) {
472
+ return {
473
+ success: false,
474
+ error: `Invalid like pattern: '${like}' — only alphanumeric, underscore, dash, dot, percent (%), and space characters are allowed`,
475
+ };
476
+ }
477
+ const sanitizedLike = like.replace(/'/g, "''");
478
+ conditions.push(`variable_name LIKE '${sanitizedLike}'`);
479
+ }
480
+ const whereClause = conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
481
+ // Get total count (without LIMIT) for truncation awareness
482
+ const countRows = await proxySQLQuery(`SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`);
483
+ const countRow = countRows[0] ?? { cnt: 0 };
484
+ const totalVarsAvailable = Number(countRow["cnt"]);
485
+ const maxRows = Math.max(0, Math.floor(limit ?? 50));
486
+ const rows = await proxySQLQuery(`SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`);
487
+ // Redact sensitive credential values (passwords, credentials)
488
+ const redactedRows = redactSensitiveVariables(rows);
489
+ return {
490
+ success: true,
491
+ variables: redactedRows,
492
+ count: redactedRows.length,
493
+ totalVarsAvailable,
494
+ };
404
495
  }
405
- // Apply like pattern filter (sanitize input)
406
- if (like) {
407
- const sanitizedLike = like.replace(/'/g, "''");
408
- conditions.push(`variable_name LIKE '${sanitizedLike}'`);
496
+ catch (error) {
497
+ if (error instanceof ZodError) {
498
+ return { success: false, error: formatZodError(error) };
499
+ }
500
+ return {
501
+ success: false,
502
+ error: error instanceof Error ? error.message : String(error),
503
+ };
409
504
  }
410
- const whereClause = conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
411
- // Get total count (without LIMIT) for truncation awareness
412
- const countRows = await proxySQLQuery(`SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`);
413
- const countRow = countRows[0] ?? { cnt: 0 };
414
- const totalVarsAvailable = Number(countRow["cnt"]);
415
- const maxRows = limit ?? 50;
416
- const rows = await proxySQLQuery(`SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`);
417
- // Redact sensitive credential values (passwords, credentials)
418
- const redactedRows = redactSensitiveVariables(rows);
419
- return {
420
- success: true,
421
- variables: redactedRows,
422
- count: redactedRows.length,
423
- totalVarsAvailable,
424
- };
425
505
  },
426
506
  };
427
507
  }
@@ -445,12 +525,23 @@ function createProxySQLMemoryStatsTool() {
445
525
  openWorldHint: true,
446
526
  },
447
527
  handler: async (_params, _context) => {
448
- const rows = await proxySQLQuery("SELECT * FROM stats_memory_metrics");
449
- return {
450
- success: true,
451
- memoryStats: rows,
452
- count: rows.length,
453
- };
528
+ try {
529
+ const rows = await proxySQLQuery("SELECT * FROM stats_memory_metrics");
530
+ return {
531
+ success: true,
532
+ memoryStats: rows,
533
+ count: rows.length,
534
+ };
535
+ }
536
+ catch (error) {
537
+ if (error instanceof ZodError) {
538
+ return { success: false, error: formatZodError(error) };
539
+ }
540
+ return {
541
+ success: false,
542
+ error: error instanceof Error ? error.message : String(error),
543
+ };
544
+ }
454
545
  },
455
546
  };
456
547
  }
@@ -473,13 +564,24 @@ function createProxySQLCommandsTool() {
473
564
  openWorldHint: true,
474
565
  },
475
566
  handler: async (params, _context) => {
476
- const { command } = ProxySQLCommandInputSchema.parse(params);
477
- await proxySQLQuery(command);
478
- return {
479
- success: true,
480
- command,
481
- message: `Command executed: ${command}`,
482
- };
567
+ try {
568
+ const { command } = ProxySQLCommandInputSchema.parse(params);
569
+ await proxySQLQuery(command);
570
+ return {
571
+ success: true,
572
+ command,
573
+ message: `Command executed: ${command}`,
574
+ };
575
+ }
576
+ catch (error) {
577
+ if (error instanceof ZodError) {
578
+ return { success: false, error: formatZodError(error) };
579
+ }
580
+ return {
581
+ success: false,
582
+ error: error instanceof Error ? error.message : String(error),
583
+ };
584
+ }
483
585
  },
484
586
  };
485
587
  }
@@ -503,12 +605,23 @@ function createProxySQLProcessListTool() {
503
605
  openWorldHint: true,
504
606
  },
505
607
  handler: async (_params, _context) => {
506
- const rows = await proxySQLQuery("SELECT * FROM stats_mysql_processlist");
507
- return {
508
- success: true,
509
- processes: rows,
510
- count: rows.length,
511
- };
608
+ try {
609
+ const rows = await proxySQLQuery("SELECT * FROM stats_mysql_processlist");
610
+ return {
611
+ success: true,
612
+ processes: rows,
613
+ count: rows.length,
614
+ };
615
+ }
616
+ catch (error) {
617
+ if (error instanceof ZodError) {
618
+ return { success: false, error: formatZodError(error) };
619
+ }
620
+ return {
621
+ success: false,
622
+ error: error instanceof Error ? error.message : String(error),
623
+ };
624
+ }
512
625
  },
513
626
  };
514
627
  }