@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
@@ -5,10 +5,15 @@
5
5
  * 6 tools total.
6
6
  */
7
7
 
8
- import { z } from "zod";
8
+ import { z, ZodError } from "zod";
9
9
  import type { MySQLAdapter } from "../MySQLAdapter.js";
10
10
  import type { ToolDefinition, RequestContext } from "../../../types/index.js";
11
11
 
12
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
13
+ function formatZodError(error: ZodError): string {
14
+ return error.issues.map((i) => i.message).join("; ");
15
+ }
16
+
12
17
  // =============================================================================
13
18
  // Zod Schemas
14
19
  // =============================================================================
@@ -17,7 +22,7 @@ const EventCreateSchema = z.object({
17
22
  name: z.string().describe("Event name"),
18
23
  schedule: z
19
24
  .object({
20
- type: z.enum(["ONE TIME", "RECURRING"]).describe("Event schedule type"),
25
+ type: z.string().describe("Event schedule type"),
21
26
  executeAt: z
22
27
  .string()
23
28
  .optional()
@@ -26,16 +31,7 @@ const EventCreateSchema = z.object({
26
31
  ),
27
32
  interval: z.number().optional().describe("For RECURRING: interval value"),
28
33
  intervalUnit: z
29
- .enum([
30
- "YEAR",
31
- "QUARTER",
32
- "MONTH",
33
- "DAY",
34
- "HOUR",
35
- "MINUTE",
36
- "WEEK",
37
- "SECOND",
38
- ])
34
+ .string()
39
35
  .optional()
40
36
  .describe("For RECURRING: interval unit"),
41
37
  starts: z.string().optional().describe("For RECURRING: start timestamp"),
@@ -44,7 +40,7 @@ const EventCreateSchema = z.object({
44
40
  .describe("Event schedule configuration"),
45
41
  body: z.string().describe("SQL statement(s) to execute"),
46
42
  onCompletion: z
47
- .enum(["PRESERVE", "NOT PRESERVE"])
43
+ .string()
48
44
  .default("NOT PRESERVE")
49
45
  .describe("What to do after event completes"),
50
46
  enabled: z.boolean().default(true).describe("Whether event is enabled"),
@@ -57,28 +53,17 @@ const EventAlterSchema = z.object({
57
53
  newName: z.string().optional().describe("New event name (for rename)"),
58
54
  schedule: z
59
55
  .object({
60
- type: z.enum(["ONE TIME", "RECURRING"]).optional(),
56
+ type: z.string().optional(),
61
57
  executeAt: z.string().optional(),
62
58
  interval: z.number().optional(),
63
- intervalUnit: z
64
- .enum([
65
- "YEAR",
66
- "QUARTER",
67
- "MONTH",
68
- "DAY",
69
- "HOUR",
70
- "MINUTE",
71
- "WEEK",
72
- "SECOND",
73
- ])
74
- .optional(),
59
+ intervalUnit: z.string().optional(),
75
60
  starts: z.string().optional(),
76
61
  ends: z.string().optional(),
77
62
  })
78
63
  .optional()
79
64
  .describe("New schedule configuration"),
80
65
  body: z.string().optional().describe("New SQL statement(s)"),
81
- onCompletion: z.enum(["PRESERVE", "NOT PRESERVE"]).optional(),
66
+ onCompletion: z.string().optional(),
82
67
  enabled: z.boolean().optional().describe("Enable or disable event"),
83
68
  comment: z.string().optional(),
84
69
  });
@@ -137,92 +122,132 @@ function createEventCreateTool(adapter: MySQLAdapter): ToolDefinition {
137
122
  readOnlyHint: false,
138
123
  },
139
124
  handler: async (params: unknown, _context: RequestContext) => {
140
- const {
141
- name,
142
- schedule,
143
- body,
144
- onCompletion,
145
- enabled,
146
- comment,
147
- ifNotExists,
148
- } = EventCreateSchema.parse(params);
149
-
150
- // Validate event name
151
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
152
- throw new Error("Invalid event name");
153
- }
125
+ try {
126
+ const {
127
+ name,
128
+ schedule,
129
+ body,
130
+ onCompletion,
131
+ enabled,
132
+ comment,
133
+ ifNotExists,
134
+ } = EventCreateSchema.parse(params);
135
+
136
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
137
+ return { success: false, error: "Invalid event name" };
138
+ }
154
139
 
155
- // Pre-check event existence for informative messaging
156
- if (ifNotExists) {
157
- const existsCheck = await adapter.executeQuery(
158
- "SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA = DATABASE() AND EVENT_NAME = ?",
159
- [name],
160
- );
161
- if (existsCheck.rows && existsCheck.rows.length > 0) {
140
+ // Validate enum fields at handler level
141
+ const validScheduleTypes = ["ONE TIME", "RECURRING"];
142
+ if (!validScheduleTypes.includes(schedule.type)) {
162
143
  return {
163
- success: true,
164
- skipped: true,
165
- reason: "Event already exists",
166
- eventName: name,
144
+ success: false,
145
+ error: `Invalid schedule type: '${schedule.type}' — expected one of: ${validScheduleTypes.join(", ")}`,
167
146
  };
168
147
  }
169
- }
170
148
 
171
- const ifNotExistsClause = ifNotExists ? "IF NOT EXISTS " : "";
172
- let sql = `CREATE EVENT ${ifNotExistsClause}\`${name}\`\nON SCHEDULE `;
173
-
174
- // Build schedule clause
175
- if (schedule.type === "ONE TIME") {
176
- if (!schedule.executeAt) {
177
- throw new Error("executeAt is required for ONE TIME events");
149
+ const validOnCompletion = ["PRESERVE", "NOT PRESERVE"];
150
+ if (!validOnCompletion.includes(onCompletion)) {
151
+ return {
152
+ success: false,
153
+ error: `Invalid onCompletion: '${onCompletion}' — expected one of: ${validOnCompletion.join(", ")}`,
154
+ };
178
155
  }
179
- sql += `AT '${schedule.executeAt}'`;
180
- } else {
181
- if (
182
- schedule.interval === undefined ||
183
- schedule.interval === null ||
184
- schedule.intervalUnit === undefined ||
185
- schedule.intervalUnit === null
186
- ) {
187
- throw new Error(
188
- "interval and intervalUnit are required for RECURRING events",
156
+
157
+ if (ifNotExists) {
158
+ const existsCheck = await adapter.executeQuery(
159
+ "SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA = DATABASE() AND EVENT_NAME = ?",
160
+ [name],
189
161
  );
162
+ if (existsCheck.rows && existsCheck.rows.length > 0) {
163
+ return {
164
+ success: true,
165
+ skipped: true,
166
+ reason: "Event already exists",
167
+ eventName: name,
168
+ };
169
+ }
190
170
  }
191
- sql += `EVERY ${String(schedule.interval)} ${schedule.intervalUnit}`;
192
- if (schedule.starts) {
193
- sql += ` STARTS '${schedule.starts}'`;
194
- }
195
- if (schedule.ends) {
196
- sql += ` ENDS '${schedule.ends}'`;
171
+
172
+ const ifNotExistsClause = ifNotExists ? "IF NOT EXISTS " : "";
173
+ let sql = `CREATE EVENT ${ifNotExistsClause}\`${name}\`\nON SCHEDULE `;
174
+
175
+ if (schedule.type === "ONE TIME") {
176
+ if (!schedule.executeAt) {
177
+ return {
178
+ success: false,
179
+ error: "executeAt is required for ONE TIME events",
180
+ };
181
+ }
182
+ sql += `AT '${schedule.executeAt}'`;
183
+ } else {
184
+ if (
185
+ schedule.interval === undefined ||
186
+ schedule.interval === null ||
187
+ schedule.intervalUnit === undefined ||
188
+ schedule.intervalUnit === null
189
+ ) {
190
+ return {
191
+ success: false,
192
+ error:
193
+ "interval and intervalUnit are required for RECURRING events",
194
+ };
195
+ }
196
+
197
+ const validUnits = [
198
+ "YEAR",
199
+ "QUARTER",
200
+ "MONTH",
201
+ "DAY",
202
+ "HOUR",
203
+ "MINUTE",
204
+ "WEEK",
205
+ "SECOND",
206
+ ];
207
+ if (!validUnits.includes(schedule.intervalUnit)) {
208
+ return {
209
+ success: false,
210
+ error: `Invalid intervalUnit: '${schedule.intervalUnit}' — expected one of: ${validUnits.join(", ")}`,
211
+ };
212
+ }
213
+ sql += `EVERY ${String(schedule.interval)} ${schedule.intervalUnit}`;
214
+ if (schedule.starts) {
215
+ sql += ` STARTS '${schedule.starts}'`;
216
+ }
217
+ if (schedule.ends) {
218
+ sql += ` ENDS '${schedule.ends}'`;
219
+ }
197
220
  }
198
- }
199
221
 
200
- sql += `\nON COMPLETION ${onCompletion}`;
222
+ sql += `\nON COMPLETION ${onCompletion}`;
201
223
 
202
- if (!enabled) {
203
- sql += "\nDISABLE";
204
- } else {
205
- sql += "\nENABLE";
206
- }
224
+ if (!enabled) {
225
+ sql += "\nDISABLE";
226
+ } else {
227
+ sql += "\nENABLE";
228
+ }
207
229
 
208
- if (comment) {
209
- sql += `\nCOMMENT '${comment.replace(/'/g, "''")}'`;
210
- }
230
+ if (comment) {
231
+ sql += `\nCOMMENT '${comment.replace(/'/g, "''")}'`;
232
+ }
211
233
 
212
- sql += `\nDO ${body}`;
234
+ sql += `\nDO ${body}`;
213
235
 
214
- try {
215
236
  await adapter.executeQuery(sql);
216
237
  return { success: true, eventName: name };
217
238
  } catch (error: unknown) {
239
+ if (error instanceof ZodError) {
240
+ return { success: false, error: formatZodError(error) };
241
+ }
218
242
  const message = error instanceof Error ? error.message : String(error);
219
243
  if (message.toLowerCase().includes("already exists")) {
220
- return {
221
- success: false,
222
- reason: `Event '${name}' already exists`,
223
- };
244
+ return { success: false, error: "Event already exists" };
224
245
  }
225
- throw error;
246
+ const cleaned = message.replace(
247
+ /^(Query failed: )?(Execute failed: )?/i,
248
+ "",
249
+ );
250
+ return { success: false, error: cleaned };
226
251
  }
227
252
  },
228
253
  };
@@ -244,88 +269,139 @@ function createEventAlterTool(adapter: MySQLAdapter): ToolDefinition {
244
269
  readOnlyHint: false,
245
270
  },
246
271
  handler: async (params: unknown, _context: RequestContext) => {
247
- const { name, newName, schedule, body, onCompletion, enabled, comment } =
248
- EventAlterSchema.parse(params);
249
-
250
- // Validate event name
251
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
252
- throw new Error("Invalid event name");
253
- }
254
-
255
- let sql = `ALTER EVENT \`${name}\``;
256
- const clauses: string[] = [];
272
+ try {
273
+ const {
274
+ name,
275
+ newName,
276
+ schedule,
277
+ body,
278
+ onCompletion,
279
+ enabled,
280
+ comment,
281
+ } = EventAlterSchema.parse(params);
282
+
283
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
284
+ return { success: false, error: "Invalid event name" };
285
+ }
257
286
 
258
- // Build schedule clause if provided
259
- if (schedule?.type) {
260
- let scheduleClause = "ON SCHEDULE ";
261
- if (schedule.type === "ONE TIME") {
262
- if (!schedule.executeAt) {
263
- throw new Error("executeAt is required for ONE TIME events");
264
- }
265
- scheduleClause += `AT '${schedule.executeAt}'`;
266
- } else {
267
- if (
268
- schedule.interval === undefined ||
269
- schedule.interval === null ||
270
- schedule.intervalUnit === undefined ||
271
- schedule.intervalUnit === null
272
- ) {
273
- throw new Error(
274
- "interval and intervalUnit are required for RECURRING events",
275
- );
287
+ // Validate enum fields at handler level
288
+ if (onCompletion !== undefined) {
289
+ const validOnCompletion = ["PRESERVE", "NOT PRESERVE"];
290
+ if (!validOnCompletion.includes(onCompletion)) {
291
+ return {
292
+ success: false,
293
+ error: `Invalid onCompletion: '${onCompletion}' — expected one of: ${validOnCompletion.join(", ")}`,
294
+ };
276
295
  }
277
- scheduleClause += `EVERY ${String(schedule.interval)} ${schedule.intervalUnit}`;
278
- if (schedule.starts) {
279
- scheduleClause += ` STARTS '${schedule.starts}'`;
296
+ }
297
+
298
+ let sql = `ALTER EVENT \`${name}\``;
299
+ const clauses: string[] = [];
300
+
301
+ if (schedule?.type) {
302
+ // Validate schedule.type
303
+ const validScheduleTypes = ["ONE TIME", "RECURRING"];
304
+ if (!validScheduleTypes.includes(schedule.type)) {
305
+ return {
306
+ success: false,
307
+ error: `Invalid schedule type: '${schedule.type}' — expected one of: ${validScheduleTypes.join(", ")}`,
308
+ };
280
309
  }
281
- if (schedule.ends) {
282
- scheduleClause += ` ENDS '${schedule.ends}'`;
310
+
311
+ let scheduleClause = "ON SCHEDULE ";
312
+ if (schedule.type === "ONE TIME") {
313
+ if (!schedule.executeAt) {
314
+ return {
315
+ success: false,
316
+ error: "executeAt is required for ONE TIME events",
317
+ };
318
+ }
319
+ scheduleClause += `AT '${schedule.executeAt}'`;
320
+ } else {
321
+ if (
322
+ schedule.interval === undefined ||
323
+ schedule.interval === null ||
324
+ schedule.intervalUnit === undefined ||
325
+ schedule.intervalUnit === null
326
+ ) {
327
+ return {
328
+ success: false,
329
+ error:
330
+ "interval and intervalUnit are required for RECURRING events",
331
+ };
332
+ }
333
+
334
+ const validUnits = [
335
+ "YEAR",
336
+ "QUARTER",
337
+ "MONTH",
338
+ "DAY",
339
+ "HOUR",
340
+ "MINUTE",
341
+ "WEEK",
342
+ "SECOND",
343
+ ];
344
+ if (!validUnits.includes(schedule.intervalUnit)) {
345
+ return {
346
+ success: false,
347
+ error: `Invalid intervalUnit: '${schedule.intervalUnit}' — expected one of: ${validUnits.join(", ")}`,
348
+ };
349
+ }
350
+ scheduleClause += `EVERY ${String(schedule.interval)} ${schedule.intervalUnit}`;
351
+ if (schedule.starts) {
352
+ scheduleClause += ` STARTS '${schedule.starts}'`;
353
+ }
354
+ if (schedule.ends) {
355
+ scheduleClause += ` ENDS '${schedule.ends}'`;
356
+ }
283
357
  }
358
+ clauses.push(scheduleClause);
284
359
  }
285
- clauses.push(scheduleClause);
286
- }
287
360
 
288
- if (onCompletion) {
289
- clauses.push(`ON COMPLETION ${onCompletion}`);
290
- }
361
+ if (onCompletion) {
362
+ clauses.push(`ON COMPLETION ${onCompletion}`);
363
+ }
291
364
 
292
- if (newName) {
293
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(newName)) {
294
- throw new Error("Invalid new event name");
365
+ if (newName) {
366
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(newName)) {
367
+ return { success: false, error: "Invalid new event name" };
368
+ }
369
+ clauses.push(`RENAME TO \`${newName}\``);
295
370
  }
296
- clauses.push(`RENAME TO \`${newName}\``);
297
- }
298
371
 
299
- if (enabled !== undefined) {
300
- clauses.push(enabled ? "ENABLE" : "DISABLE");
301
- }
372
+ if (enabled !== undefined) {
373
+ clauses.push(enabled ? "ENABLE" : "DISABLE");
374
+ }
302
375
 
303
- if (comment !== undefined) {
304
- clauses.push(`COMMENT '${comment.replace(/'/g, "''")}'`);
305
- }
376
+ if (comment !== undefined) {
377
+ clauses.push(`COMMENT '${comment.replace(/'/g, "''")}'`);
378
+ }
306
379
 
307
- if (body) {
308
- clauses.push(`DO ${body}`);
309
- }
380
+ if (body) {
381
+ clauses.push(`DO ${body}`);
382
+ }
310
383
 
311
- if (clauses.length === 0) {
312
- throw new Error("No modifications specified");
313
- }
384
+ if (clauses.length === 0) {
385
+ return { success: false, error: "No modifications specified" };
386
+ }
314
387
 
315
- sql += "\n" + clauses.join("\n");
388
+ sql += "\n" + clauses.join("\n");
316
389
 
317
- try {
318
390
  await adapter.executeQuery(sql);
319
391
  return { success: true, eventName: newName ?? name };
320
392
  } catch (error: unknown) {
393
+ if (error instanceof ZodError) {
394
+ return { success: false, error: formatZodError(error) };
395
+ }
321
396
  const message = error instanceof Error ? error.message : String(error);
322
397
  if (message.toLowerCase().includes("unknown event")) {
323
- return {
324
- success: false,
325
- reason: `Event '${name}' does not exist`,
326
- };
398
+ return { success: false, error: "Event does not exist" };
327
399
  }
328
- throw error;
400
+ const cleaned = message.replace(
401
+ /^(Query failed: )?(Execute failed: )?/i,
402
+ "",
403
+ );
404
+ return { success: false, error: cleaned };
329
405
  }
330
406
  },
331
407
  };
@@ -347,43 +423,41 @@ function createEventDropTool(adapter: MySQLAdapter): ToolDefinition {
347
423
  destructiveHint: true,
348
424
  },
349
425
  handler: async (params: unknown, _context: RequestContext) => {
350
- const { name, ifExists } = EventDropSchema.parse(params);
426
+ try {
427
+ const { name, ifExists } = EventDropSchema.parse(params);
351
428
 
352
- // Validate event name
353
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
354
- throw new Error("Invalid event name");
355
- }
429
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
430
+ return { success: false, error: "Invalid event name" };
431
+ }
356
432
 
357
- // Pre-check event existence for informative messaging
358
- if (ifExists) {
359
- const existsCheck = await adapter.executeQuery(
360
- "SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA = DATABASE() AND EVENT_NAME = ?",
361
- [name],
362
- );
363
- if (!existsCheck.rows || existsCheck.rows.length === 0) {
364
- return {
365
- success: true,
366
- skipped: true,
367
- reason: "Event did not exist",
368
- eventName: name,
369
- };
433
+ if (ifExists) {
434
+ const existsCheck = await adapter.executeQuery(
435
+ "SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA = DATABASE() AND EVENT_NAME = ?",
436
+ [name],
437
+ );
438
+ if (!existsCheck.rows || existsCheck.rows.length === 0) {
439
+ return {
440
+ success: true,
441
+ skipped: true,
442
+ reason: "Event did not exist",
443
+ eventName: name,
444
+ };
445
+ }
370
446
  }
371
- }
372
447
 
373
- const ifExistsClause = ifExists ? "IF EXISTS " : "";
448
+ const ifExistsClause = ifExists ? "IF EXISTS " : "";
374
449
 
375
- try {
376
450
  await adapter.executeQuery(`DROP EVENT ${ifExistsClause}\`${name}\``);
377
451
  return { success: true, eventName: name };
378
452
  } catch (error: unknown) {
453
+ if (error instanceof ZodError) {
454
+ return { success: false, error: formatZodError(error) };
455
+ }
379
456
  const message = error instanceof Error ? error.message : String(error);
380
457
  if (message.toLowerCase().includes("unknown event")) {
381
- return {
382
- success: false,
383
- reason: `Event '${name}' does not exist`,
384
- };
458
+ return { success: false, error: "Event does not exist" };
385
459
  }
386
- throw error;
460
+ return { success: false, error: message };
387
461
  }
388
462
  },
389
463
  };
@@ -406,20 +480,21 @@ function createEventListTool(adapter: MySQLAdapter): ToolDefinition {
406
480
  idempotentHint: true,
407
481
  },
408
482
  handler: async (params: unknown, _context: RequestContext) => {
409
- const { schema, includeDisabled } = EventListSchema.parse(params);
483
+ try {
484
+ const { schema, includeDisabled } = EventListSchema.parse(params);
410
485
 
411
- // P154: Schema existence check when explicitly provided
412
- if (schema) {
413
- const schemaCheck = await adapter.executeQuery(
414
- "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?",
415
- [schema],
416
- );
417
- if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
418
- return { exists: false, schema };
486
+ // P154: Schema existence check when explicitly provided
487
+ if (schema) {
488
+ const schemaCheck = await adapter.executeQuery(
489
+ "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?",
490
+ [schema],
491
+ );
492
+ if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
493
+ return { exists: false, schema };
494
+ }
419
495
  }
420
- }
421
496
 
422
- let query = `
497
+ let query = `
423
498
  SELECT
424
499
  EVENT_NAME as name,
425
500
  EVENT_SCHEMA as schemaName,
@@ -438,19 +513,26 @@ function createEventListTool(adapter: MySQLAdapter): ToolDefinition {
438
513
  WHERE EVENT_SCHEMA = COALESCE(?, DATABASE())
439
514
  `;
440
515
 
441
- const queryParams: unknown[] = [schema ?? null];
516
+ const queryParams: unknown[] = [schema ?? null];
442
517
 
443
- if (!includeDisabled) {
444
- query += " AND STATUS = 'ENABLED'";
445
- }
518
+ if (!includeDisabled) {
519
+ query += " AND STATUS = 'ENABLED'";
520
+ }
446
521
 
447
- query += " ORDER BY EVENT_NAME";
522
+ query += " ORDER BY EVENT_NAME";
448
523
 
449
- const result = await adapter.executeQuery(query, queryParams);
450
- return {
451
- events: result.rows,
452
- count: result.rows?.length ?? 0,
453
- };
524
+ const result = await adapter.executeQuery(query, queryParams);
525
+ return {
526
+ events: result.rows,
527
+ count: result.rows?.length ?? 0,
528
+ };
529
+ } catch (error: unknown) {
530
+ if (error instanceof ZodError) {
531
+ return { success: false, error: formatZodError(error) };
532
+ }
533
+ const message = error instanceof Error ? error.message : String(error);
534
+ return { success: false, error: message };
535
+ }
454
536
  },
455
537
  };
456
538
  }
@@ -472,20 +554,21 @@ function createEventStatusTool(adapter: MySQLAdapter): ToolDefinition {
472
554
  idempotentHint: true,
473
555
  },
474
556
  handler: async (params: unknown, _context: RequestContext) => {
475
- const { name, schema } = EventStatusSchema.parse(params);
557
+ try {
558
+ const { name, schema } = EventStatusSchema.parse(params);
476
559
 
477
- // P154: Schema existence check when explicitly provided
478
- if (schema) {
479
- const schemaCheck = await adapter.executeQuery(
480
- "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?",
481
- [schema],
482
- );
483
- if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
484
- return { exists: false, schema };
560
+ // P154: Schema existence check when explicitly provided
561
+ if (schema) {
562
+ const schemaCheck = await adapter.executeQuery(
563
+ "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?",
564
+ [schema],
565
+ );
566
+ if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
567
+ return { exists: false, schema };
568
+ }
485
569
  }
486
- }
487
570
 
488
- const query = `
571
+ const query = `
489
572
  SELECT
490
573
  EVENT_NAME as name,
491
574
  EVENT_SCHEMA as schemaName,
@@ -509,13 +592,23 @@ function createEventStatusTool(adapter: MySQLAdapter): ToolDefinition {
509
592
  AND EVENT_NAME = ?
510
593
  `;
511
594
 
512
- const result = await adapter.executeQuery(query, [schema ?? null, name]);
595
+ const result = await adapter.executeQuery(query, [
596
+ schema ?? null,
597
+ name,
598
+ ]);
513
599
 
514
- if (!result.rows || result.rows.length === 0) {
515
- return { exists: false, name };
516
- }
600
+ if (!result.rows || result.rows.length === 0) {
601
+ return { exists: false, name };
602
+ }
517
603
 
518
- return result.rows[0];
604
+ return result.rows[0];
605
+ } catch (error: unknown) {
606
+ if (error instanceof ZodError) {
607
+ return { success: false, error: formatZodError(error) };
608
+ }
609
+ const message = error instanceof Error ? error.message : String(error);
610
+ return { success: false, error: message };
611
+ }
519
612
  },
520
613
  };
521
614
  }
@@ -536,13 +629,14 @@ function createSchedulerStatusTool(adapter: MySQLAdapter): ToolDefinition {
536
629
  idempotentHint: true,
537
630
  },
538
631
  handler: async (_params: unknown, _context: RequestContext) => {
539
- // Get scheduler status
540
- const statusResult = await adapter.executeQuery(
541
- "SHOW VARIABLES LIKE 'event_scheduler'",
542
- );
632
+ try {
633
+ // Get scheduler status
634
+ const statusResult = await adapter.executeQuery(
635
+ "SHOW VARIABLES LIKE 'event_scheduler'",
636
+ );
543
637
 
544
- // Get event counts by status
545
- const countResult = await adapter.executeQuery(`
638
+ // Get event counts by status
639
+ const countResult = await adapter.executeQuery(`
546
640
  SELECT
547
641
  STATUS as status,
548
642
  COUNT(*) as count
@@ -550,8 +644,8 @@ function createSchedulerStatusTool(adapter: MySQLAdapter): ToolDefinition {
550
644
  GROUP BY STATUS
551
645
  `);
552
646
 
553
- // Get recently executed events
554
- const recentResult = await adapter.executeQuery(`
647
+ // Get recently executed events
648
+ const recentResult = await adapter.executeQuery(`
555
649
  SELECT
556
650
  EVENT_NAME as name,
557
651
  EVENT_SCHEMA as schemaName,
@@ -562,14 +656,21 @@ function createSchedulerStatusTool(adapter: MySQLAdapter): ToolDefinition {
562
656
  LIMIT 10
563
657
  `);
564
658
 
565
- const schedulerStatus = statusResult.rows?.[0];
659
+ const schedulerStatus = statusResult.rows?.[0];
566
660
 
567
- return {
568
- schedulerEnabled: schedulerStatus?.["Value"] === "ON",
569
- schedulerStatus: schedulerStatus?.["Value"] ?? "UNKNOWN",
570
- eventCounts: countResult.rows ?? [],
571
- recentlyExecuted: recentResult.rows ?? [],
572
- };
661
+ return {
662
+ schedulerEnabled: schedulerStatus?.["Value"] === "ON",
663
+ schedulerStatus: schedulerStatus?.["Value"] ?? "UNKNOWN",
664
+ eventCounts: countResult.rows ?? [],
665
+ recentlyExecuted: recentResult.rows ?? [],
666
+ };
667
+ } catch (error: unknown) {
668
+ if (error instanceof ZodError) {
669
+ return { success: false, error: formatZodError(error) };
670
+ }
671
+ const message = error instanceof Error ? error.message : String(error);
672
+ return { success: false, error: message };
673
+ }
573
674
  },
574
675
  };
575
676
  }