@neverinfamous/mysql-mcp 2.3.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -2
  4. package/.github/workflows/docker-publish.yml +5 -5
  5. package/CHANGELOG.md +348 -122
  6. package/DOCKER_README.md +81 -40
  7. package/README.md +87 -46
  8. package/VERSION +1 -1
  9. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  10. package/dist/__tests__/mocks/adapter.js +2 -0
  11. package/dist/__tests__/mocks/adapter.js.map +1 -1
  12. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.js +50 -9
  14. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  15. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  17. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  18. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  19. package/dist/adapters/mysql/SchemaManager.js +16 -15
  20. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  21. package/dist/adapters/mysql/prompts/index.js +10 -20
  22. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  23. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  24. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  25. package/dist/adapters/mysql/resources/docstore.js +10 -7
  26. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  27. package/dist/adapters/mysql/resources/events.js +11 -8
  28. package/dist/adapters/mysql/resources/events.js.map +1 -1
  29. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.js +12 -15
  31. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  32. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.js +20 -17
  34. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  35. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.js +9 -6
  37. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  38. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.js +15 -15
  40. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  41. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.js +9 -6
  43. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  44. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  46. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  47. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  49. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  50. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  52. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  53. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  55. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  56. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  59. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  62. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  64. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  65. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  66. package/dist/adapters/mysql/tools/core.js +152 -29
  67. package/dist/adapters/mysql/tools/core.js.map +1 -1
  68. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.js +340 -163
  70. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  71. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  72. package/dist/adapters/mysql/tools/events.js +284 -198
  73. package/dist/adapters/mysql/tools/events.js.map +1 -1
  74. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.js +11 -39
  76. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  77. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  79. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  80. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  82. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  83. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  84. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  85. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  87. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  88. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  90. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  91. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  94. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  95. package/dist/adapters/mysql/tools/replication.js +75 -49
  96. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  97. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.js +224 -182
  99. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  100. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  101. package/dist/adapters/mysql/tools/router.js +168 -67
  102. package/dist/adapters/mysql/tools/router.js.map +1 -1
  103. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  105. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  106. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  108. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  109. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  111. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  112. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  115. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  117. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  118. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  120. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  121. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  123. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  124. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  126. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  127. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  129. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  130. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  132. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  133. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  135. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  136. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  138. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  139. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  141. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  142. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  144. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  145. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  147. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  148. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  150. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  151. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  153. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  154. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  156. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  157. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  159. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  160. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  162. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  163. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  165. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  166. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.js +48 -23
  168. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  169. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  171. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  173. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  174. package/dist/adapters/mysql/types/router-types.js +1 -1
  175. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  176. package/dist/adapters/mysql/types/shell-types.js +2 -2
  177. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  178. package/dist/adapters/mysql/types.d.ts +485 -21
  179. package/dist/adapters/mysql/types.d.ts.map +1 -1
  180. package/dist/adapters/mysql/types.js +546 -19
  181. package/dist/adapters/mysql/types.js.map +1 -1
  182. package/dist/auth/scopes.js +1 -1
  183. package/dist/auth/scopes.js.map +1 -1
  184. package/dist/codemode/api.d.ts +3 -2
  185. package/dist/codemode/api.d.ts.map +1 -1
  186. package/dist/codemode/api.js +80 -5
  187. package/dist/codemode/api.js.map +1 -1
  188. package/dist/codemode/sandbox-factory.js +1 -1
  189. package/dist/codemode/sandbox-factory.js.map +1 -1
  190. package/dist/codemode/types.d.ts +26 -0
  191. package/dist/codemode/types.d.ts.map +1 -1
  192. package/dist/codemode/types.js +2 -0
  193. package/dist/codemode/types.js.map +1 -1
  194. package/dist/codemode/worker-sandbox.d.ts +4 -2
  195. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  196. package/dist/codemode/worker-sandbox.js +66 -7
  197. package/dist/codemode/worker-sandbox.js.map +1 -1
  198. package/dist/codemode/worker-script.d.ts +3 -0
  199. package/dist/codemode/worker-script.d.ts.map +1 -1
  200. package/dist/codemode/worker-script.js +128 -75
  201. package/dist/codemode/worker-script.js.map +1 -1
  202. package/dist/constants/ServerInstructions.d.ts +1 -1
  203. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  204. package/dist/constants/ServerInstructions.js +37 -31
  205. package/dist/constants/ServerInstructions.js.map +1 -1
  206. package/dist/filtering/ToolConstants.d.ts +1 -1
  207. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  208. package/dist/filtering/ToolConstants.js +1 -2
  209. package/dist/filtering/ToolConstants.js.map +1 -1
  210. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  211. package/dist/pool/ConnectionPool.js.map +1 -1
  212. package/dist/transports/http.d.ts.map +1 -1
  213. package/dist/transports/http.js +6 -0
  214. package/dist/transports/http.js.map +1 -1
  215. package/dist/utils/validators.d.ts +1 -1
  216. package/dist/utils/validators.d.ts.map +1 -1
  217. package/dist/utils/validators.js.map +1 -1
  218. package/package.json +4 -4
  219. package/releases/v3.0.0-release-notes.md +81 -0
  220. package/releases/v3.0.1-release-notes.md +20 -0
  221. package/src/__tests__/mocks/adapter.ts +3 -0
  222. package/src/__tests__/perf.test.ts +6 -6
  223. package/src/adapters/DatabaseAdapter.ts +58 -9
  224. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  225. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  226. package/src/adapters/mysql/SchemaManager.ts +21 -21
  227. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  228. package/src/adapters/mysql/prompts/index.ts +12 -22
  229. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  230. package/src/adapters/mysql/resources/docstore.ts +13 -10
  231. package/src/adapters/mysql/resources/events.ts +12 -12
  232. package/src/adapters/mysql/resources/indexes.ts +17 -19
  233. package/src/adapters/mysql/resources/innodb.ts +23 -22
  234. package/src/adapters/mysql/resources/locks.ts +9 -7
  235. package/src/adapters/mysql/resources/performance.ts +23 -18
  236. package/src/adapters/mysql/resources/spatial.ts +9 -7
  237. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  238. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  239. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  240. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  241. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  242. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  243. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  244. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  245. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  246. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  247. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -51
  248. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  249. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  250. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  251. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  252. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  253. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  254. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  255. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  256. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  257. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  258. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  259. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  260. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  261. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  262. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  263. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  264. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  265. package/src/adapters/mysql/tools/core.ts +152 -38
  266. package/src/adapters/mysql/tools/docstore.ts +422 -205
  267. package/src/adapters/mysql/tools/events.ts +334 -233
  268. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  269. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  270. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  271. package/src/adapters/mysql/tools/json/core.ts +21 -42
  272. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  273. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  274. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  275. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  276. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  278. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  279. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  280. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  281. package/src/adapters/mysql/tools/replication.ts +84 -57
  282. package/src/adapters/mysql/tools/roles.ts +274 -226
  283. package/src/adapters/mysql/tools/router.ts +181 -85
  284. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  285. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  286. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  288. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  289. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  290. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  291. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  292. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  293. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  294. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  295. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  296. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  297. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  298. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  299. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  300. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  301. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  302. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  303. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  304. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  305. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  306. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  307. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  308. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  309. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  310. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  311. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  312. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  313. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  314. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  315. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  316. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  317. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  318. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  319. package/src/adapters/mysql/tools/transactions.ts +49 -24
  320. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  321. package/src/adapters/mysql/types/router-types.ts +1 -1
  322. package/src/adapters/mysql/types/shell-types.ts +2 -2
  323. package/src/adapters/mysql/types.ts +632 -19
  324. package/src/auth/__tests__/scopes.test.ts +2 -2
  325. package/src/auth/scopes.ts +1 -1
  326. package/src/codemode/__tests__/api.test.ts +417 -0
  327. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  328. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  329. package/src/codemode/__tests__/security.test.ts +368 -0
  330. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  331. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  332. package/src/codemode/api.ts +89 -5
  333. package/src/codemode/sandbox-factory.ts +1 -1
  334. package/src/codemode/types.ts +34 -0
  335. package/src/codemode/worker-sandbox.ts +74 -7
  336. package/src/codemode/worker-script.ts +157 -86
  337. package/src/constants/ServerInstructions.ts +37 -31
  338. package/src/filtering/ToolConstants.ts +1 -2
  339. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  340. package/src/pool/ConnectionPool.ts +4 -1
  341. package/src/transports/__tests__/http.test.ts +15 -3
  342. package/src/transports/http.ts +12 -0
  343. package/src/utils/validators.ts +2 -1
  344. package/vitest.config.ts +3 -1
  345. 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
  }