@neverinfamous/mysql-mcp 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -10
  4. package/.github/workflows/docker-publish.yml +15 -13
  5. package/CHANGELOG.md +287 -1
  6. package/DOCKER_README.md +100 -265
  7. package/Dockerfile +5 -0
  8. package/README.md +124 -59
  9. package/VERSION +1 -1
  10. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  11. package/dist/__tests__/mocks/adapter.js +2 -0
  12. package/dist/__tests__/mocks/adapter.js.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  14. package/dist/adapters/DatabaseAdapter.js +50 -9
  15. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  17. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  18. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  19. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  20. package/dist/adapters/mysql/SchemaManager.js +16 -15
  21. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  22. package/dist/adapters/mysql/prompts/index.js +10 -20
  23. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  24. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  25. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  26. package/dist/adapters/mysql/resources/docstore.js +10 -7
  27. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  28. package/dist/adapters/mysql/resources/events.js +11 -8
  29. package/dist/adapters/mysql/resources/events.js.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  31. package/dist/adapters/mysql/resources/indexes.js +12 -15
  32. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  34. package/dist/adapters/mysql/resources/innodb.js +20 -17
  35. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  37. package/dist/adapters/mysql/resources/locks.js +9 -6
  38. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  40. package/dist/adapters/mysql/resources/performance.js +15 -15
  41. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  43. package/dist/adapters/mysql/resources/spatial.js +9 -6
  44. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  46. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  47. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  49. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  50. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  52. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  53. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  55. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  56. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  59. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  62. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  64. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  65. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  66. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  67. package/dist/adapters/mysql/tools/core.js +152 -29
  68. package/dist/adapters/mysql/tools/core.js.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  70. package/dist/adapters/mysql/tools/docstore.js +340 -163
  71. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  72. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  73. package/dist/adapters/mysql/tools/events.js +284 -198
  74. package/dist/adapters/mysql/tools/events.js.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  76. package/dist/adapters/mysql/tools/json/core.js +11 -39
  77. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  79. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  80. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  82. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  83. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  84. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  85. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  87. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  88. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  90. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  91. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  94. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  95. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  96. package/dist/adapters/mysql/tools/replication.js +75 -49
  97. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  99. package/dist/adapters/mysql/tools/roles.js +224 -182
  100. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  101. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  102. package/dist/adapters/mysql/tools/router.js +168 -67
  103. package/dist/adapters/mysql/tools/router.js.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  105. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  106. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  108. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  109. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  111. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  112. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  115. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  117. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  118. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  120. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  121. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  123. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  124. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  126. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  127. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  129. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  130. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  132. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  133. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  135. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  136. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  138. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  139. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  141. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  142. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  144. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  145. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  147. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  148. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  150. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  151. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  153. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  154. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  156. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  157. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  159. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  160. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  162. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  163. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  165. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  166. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  168. package/dist/adapters/mysql/tools/transactions.js +48 -23
  169. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  171. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  173. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  174. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  175. package/dist/adapters/mysql/types/router-types.js +1 -1
  176. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  177. package/dist/adapters/mysql/types/shell-types.js +2 -2
  178. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  179. package/dist/adapters/mysql/types.d.ts +485 -21
  180. package/dist/adapters/mysql/types.d.ts.map +1 -1
  181. package/dist/adapters/mysql/types.js +546 -19
  182. package/dist/adapters/mysql/types.js.map +1 -1
  183. package/dist/auth/scopes.js +1 -1
  184. package/dist/auth/scopes.js.map +1 -1
  185. package/dist/codemode/api.d.ts +3 -2
  186. package/dist/codemode/api.d.ts.map +1 -1
  187. package/dist/codemode/api.js +80 -5
  188. package/dist/codemode/api.js.map +1 -1
  189. package/dist/codemode/sandbox-factory.js +1 -1
  190. package/dist/codemode/sandbox-factory.js.map +1 -1
  191. package/dist/codemode/types.d.ts +26 -0
  192. package/dist/codemode/types.d.ts.map +1 -1
  193. package/dist/codemode/types.js +2 -0
  194. package/dist/codemode/types.js.map +1 -1
  195. package/dist/codemode/worker-sandbox.d.ts +4 -2
  196. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  197. package/dist/codemode/worker-sandbox.js +66 -7
  198. package/dist/codemode/worker-sandbox.js.map +1 -1
  199. package/dist/codemode/worker-script.d.ts +3 -0
  200. package/dist/codemode/worker-script.d.ts.map +1 -1
  201. package/dist/codemode/worker-script.js +128 -75
  202. package/dist/codemode/worker-script.js.map +1 -1
  203. package/dist/constants/ServerInstructions.d.ts +1 -1
  204. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  205. package/dist/constants/ServerInstructions.js +37 -31
  206. package/dist/constants/ServerInstructions.js.map +1 -1
  207. package/dist/filtering/ToolConstants.d.ts +1 -1
  208. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  209. package/dist/filtering/ToolConstants.js +1 -2
  210. package/dist/filtering/ToolConstants.js.map +1 -1
  211. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  212. package/dist/pool/ConnectionPool.js.map +1 -1
  213. package/dist/transports/http.d.ts.map +1 -1
  214. package/dist/transports/http.js +6 -0
  215. package/dist/transports/http.js.map +1 -1
  216. package/dist/utils/validators.d.ts +1 -1
  217. package/dist/utils/validators.d.ts.map +1 -1
  218. package/dist/utils/validators.js.map +1 -1
  219. package/package.json +4 -4
  220. package/releases/v2.3.0-release-notes.md +20 -20
  221. package/releases/v2.3.1-release-notes.md +34 -0
  222. package/releases/v3.0.0-release-notes.md +81 -0
  223. package/src/__tests__/mocks/adapter.ts +3 -0
  224. package/src/__tests__/perf.test.ts +6 -6
  225. package/src/adapters/DatabaseAdapter.ts +58 -9
  226. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  227. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  228. package/src/adapters/mysql/SchemaManager.ts +21 -21
  229. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  230. package/src/adapters/mysql/prompts/index.ts +12 -22
  231. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  232. package/src/adapters/mysql/resources/docstore.ts +13 -10
  233. package/src/adapters/mysql/resources/events.ts +12 -12
  234. package/src/adapters/mysql/resources/indexes.ts +17 -19
  235. package/src/adapters/mysql/resources/innodb.ts +23 -22
  236. package/src/adapters/mysql/resources/locks.ts +9 -7
  237. package/src/adapters/mysql/resources/performance.ts +23 -18
  238. package/src/adapters/mysql/resources/spatial.ts +9 -7
  239. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  240. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  241. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  242. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  243. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  244. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  245. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  246. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  247. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  248. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  249. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
  250. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  251. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  252. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  253. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  254. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  255. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  256. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  257. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  258. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  259. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  260. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  261. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  262. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  263. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  264. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  265. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  266. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  267. package/src/adapters/mysql/tools/core.ts +152 -38
  268. package/src/adapters/mysql/tools/docstore.ts +422 -205
  269. package/src/adapters/mysql/tools/events.ts +334 -233
  270. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  271. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  272. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  273. package/src/adapters/mysql/tools/json/core.ts +21 -42
  274. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  275. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  276. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  278. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  279. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  280. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  281. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  282. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  283. package/src/adapters/mysql/tools/replication.ts +84 -57
  284. package/src/adapters/mysql/tools/roles.ts +274 -226
  285. package/src/adapters/mysql/tools/router.ts +181 -85
  286. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  288. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  289. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  290. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  291. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  292. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  293. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  294. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  295. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  296. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  297. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  298. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  299. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  300. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  301. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  302. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  303. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  304. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  305. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  306. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  307. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  308. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  309. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  310. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  311. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  312. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  313. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  314. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  315. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  316. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  317. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  318. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  319. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  320. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  321. package/src/adapters/mysql/tools/transactions.ts +49 -24
  322. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  323. package/src/adapters/mysql/types/router-types.ts +1 -1
  324. package/src/adapters/mysql/types/shell-types.ts +2 -2
  325. package/src/adapters/mysql/types.ts +632 -19
  326. package/src/auth/__tests__/scopes.test.ts +2 -2
  327. package/src/auth/scopes.ts +1 -1
  328. package/src/codemode/__tests__/api.test.ts +417 -0
  329. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  330. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  331. package/src/codemode/__tests__/security.test.ts +368 -0
  332. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  333. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  334. package/src/codemode/api.ts +89 -5
  335. package/src/codemode/sandbox-factory.ts +1 -1
  336. package/src/codemode/types.ts +34 -0
  337. package/src/codemode/worker-sandbox.ts +74 -7
  338. package/src/codemode/worker-script.ts +157 -86
  339. package/src/constants/ServerInstructions.ts +37 -31
  340. package/src/filtering/ToolConstants.ts +1 -2
  341. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  342. package/src/pool/ConnectionPool.ts +4 -1
  343. package/src/transports/__tests__/http.test.ts +15 -3
  344. package/src/transports/http.ts +12 -0
  345. package/src/utils/validators.ts +2 -1
  346. package/vitest.config.ts +3 -1
  347. package/CODE_MODE.md +0 -245
@@ -5,6 +5,7 @@
5
5
  * 6 tools: optimize, analyze, check, repair, flush, kill.
6
6
  */
7
7
 
8
+ import { ZodError } from "zod";
8
9
  import type { MySQLAdapter } from "../../MySQLAdapter.js";
9
10
  import type {
10
11
  ToolDefinition,
@@ -17,11 +18,18 @@ import {
17
18
  AnalyzeTableSchemaBase,
18
19
  CheckTableSchema,
19
20
  CheckTableSchemaBase,
21
+ RepairTableSchema,
22
+ RepairTableSchemaBase,
20
23
  FlushTablesSchema,
21
24
  FlushTablesSchemaBase,
22
25
  KillQuerySchema,
26
+ KillQuerySchemaBase,
23
27
  } from "../../types.js";
24
- import { z } from "zod";
28
+
29
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
30
+ function formatZodError(error: ZodError): string {
31
+ return error.issues.map((i) => i.message).join("; ");
32
+ }
25
33
 
26
34
  export function createOptimizeTableTool(adapter: MySQLAdapter): ToolDefinition {
27
35
  return {
@@ -36,10 +44,20 @@ export function createOptimizeTableTool(adapter: MySQLAdapter): ToolDefinition {
36
44
  idempotentHint: true,
37
45
  },
38
46
  handler: async (params: unknown, _context: RequestContext) => {
39
- const { tables } = OptimizeTableSchema.parse(params);
40
- const tableList = tables.map((t) => `\`${t}\``).join(", ");
41
- const result = await adapter.executeQuery(`OPTIMIZE TABLE ${tableList}`);
42
- return { results: result.rows, rowCount: result.rows?.length ?? 0 };
47
+ try {
48
+ const { tables } = OptimizeTableSchema.parse(params);
49
+ const tableList = tables.map((t) => `\`${t}\``).join(", ");
50
+ const result = await adapter.executeQuery(
51
+ `OPTIMIZE TABLE ${tableList}`,
52
+ );
53
+ return { results: result.rows, rowCount: result.rows?.length ?? 0 };
54
+ } catch (error) {
55
+ if (error instanceof ZodError) {
56
+ return { success: false, error: formatZodError(error) };
57
+ }
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ return { success: false, error: message };
60
+ }
43
61
  },
44
62
  };
45
63
  }
@@ -58,10 +76,18 @@ export function createAnalyzeTableTool(adapter: MySQLAdapter): ToolDefinition {
58
76
  idempotentHint: true,
59
77
  },
60
78
  handler: async (params: unknown, _context: RequestContext) => {
61
- const { tables } = AnalyzeTableSchema.parse(params);
62
- const tableList = tables.map((t) => `\`${t}\``).join(", ");
63
- const result = await adapter.executeQuery(`ANALYZE TABLE ${tableList}`);
64
- return { results: result.rows, rowCount: result.rows?.length ?? 0 };
79
+ try {
80
+ const { tables } = AnalyzeTableSchema.parse(params);
81
+ const tableList = tables.map((t) => `\`${t}\``).join(", ");
82
+ const result = await adapter.executeQuery(`ANALYZE TABLE ${tableList}`);
83
+ return { results: result.rows, rowCount: result.rows?.length ?? 0 };
84
+ } catch (error) {
85
+ if (error instanceof ZodError) {
86
+ return { success: false, error: formatZodError(error) };
87
+ }
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ return { success: false, error: message };
90
+ }
65
91
  },
66
92
  };
67
93
  }
@@ -79,46 +105,57 @@ export function createCheckTableTool(adapter: MySQLAdapter): ToolDefinition {
79
105
  idempotentHint: true,
80
106
  },
81
107
  handler: async (params: unknown, _context: RequestContext) => {
82
- const { tables, option } = CheckTableSchema.parse(params);
83
- const tableList = tables.map((t) => `\`${t}\``).join(", ");
84
- const optionClause = option ? ` ${option}` : "";
85
- // Use rawQuery - CHECK TABLE not supported in prepared statement protocol
86
- const result = await adapter.rawQuery(
87
- `CHECK TABLE ${tableList}${optionClause}`,
88
- );
89
- return {
90
- results: result.rows ?? [],
91
- rowCount: result.rows?.length ?? 0,
92
- };
108
+ try {
109
+ const { tables, option } = CheckTableSchema.parse(params);
110
+ const tableList = tables.map((t) => `\`${t}\``).join(", ");
111
+ const optionClause = option ? ` ${option}` : "";
112
+ // Use rawQuery - CHECK TABLE not supported in prepared statement protocol
113
+ const result = await adapter.rawQuery(
114
+ `CHECK TABLE ${tableList}${optionClause}`,
115
+ );
116
+ return {
117
+ results: result.rows ?? [],
118
+ rowCount: result.rows?.length ?? 0,
119
+ };
120
+ } catch (error) {
121
+ if (error instanceof ZodError) {
122
+ return { success: false, error: formatZodError(error) };
123
+ }
124
+ const message = error instanceof Error ? error.message : String(error);
125
+ return { success: false, error: message };
126
+ }
93
127
  },
94
128
  };
95
129
  }
96
130
 
97
131
  export function createRepairTableTool(adapter: MySQLAdapter): ToolDefinition {
98
- const schema = z.object({
99
- tables: z.array(z.string()),
100
- quick: z.boolean().optional().default(false),
101
- });
102
-
103
132
  return {
104
133
  name: "mysql_repair_table",
105
134
  title: "MySQL Repair Table",
106
135
  description: "Repair corrupted tables (MyISAM only).",
107
136
  group: "admin",
108
- inputSchema: schema,
137
+ inputSchema: RepairTableSchemaBase,
109
138
  requiredScopes: ["admin"],
110
139
  annotations: {
111
140
  readOnlyHint: false,
112
141
  idempotentHint: true,
113
142
  },
114
143
  handler: async (params: unknown, _context: RequestContext) => {
115
- const { tables, quick } = schema.parse(params);
116
- const tableList = tables.map((t) => `\`${t}\``).join(", ");
117
- const quickClause = quick ? " QUICK" : "";
118
- const result = await adapter.executeQuery(
119
- `REPAIR TABLE ${tableList}${quickClause}`,
120
- );
121
- return { results: result.rows, rowCount: result.rows?.length ?? 0 };
144
+ try {
145
+ const { tables, quick } = RepairTableSchema.parse(params);
146
+ const tableList = tables.map((t) => `\`${t}\``).join(", ");
147
+ const quickClause = quick ? " QUICK" : "";
148
+ const result = await adapter.executeQuery(
149
+ `REPAIR TABLE ${tableList}${quickClause}`,
150
+ );
151
+ return { results: result.rows, rowCount: result.rows?.length ?? 0 };
152
+ } catch (error) {
153
+ if (error instanceof ZodError) {
154
+ return { success: false, error: formatZodError(error) };
155
+ }
156
+ const message = error instanceof Error ? error.message : String(error);
157
+ return { success: false, error: message };
158
+ }
122
159
  },
123
160
  };
124
161
  }
@@ -136,43 +173,52 @@ export function createFlushTablesTool(adapter: MySQLAdapter): ToolDefinition {
136
173
  idempotentHint: true,
137
174
  },
138
175
  handler: async (params: unknown, _context: RequestContext) => {
139
- const { tables } = FlushTablesSchema.parse(params);
176
+ try {
177
+ const { tables } = FlushTablesSchema.parse(params);
140
178
 
141
- if (tables && tables.length > 0) {
142
- // Pre-check table existence since FLUSH TABLES silently succeeds for nonexistent tables
143
- const placeholders = tables.map(() => "?").join(", ");
144
- const checkResult = await adapter.executeReadQuery(
145
- `SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN (${placeholders})`,
146
- tables,
147
- );
148
- const foundTables = new Set(
149
- (checkResult.rows ?? []).map(
150
- (r: Record<string, unknown>) => r["TABLE_NAME"] as string,
151
- ),
152
- );
153
- const notFound = tables.filter((t) => !foundTables.has(t));
179
+ if (tables && tables.length > 0) {
180
+ // Pre-check table existence since FLUSH TABLES silently succeeds for nonexistent tables
181
+ const placeholders = tables.map(() => "?").join(", ");
182
+ const checkResult = await adapter.executeReadQuery(
183
+ `SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN (${placeholders})`,
184
+ tables,
185
+ );
186
+ const foundTables = new Set(
187
+ (checkResult.rows ?? []).map(
188
+ (r: Record<string, unknown>) => r["TABLE_NAME"] as string,
189
+ ),
190
+ );
191
+ const notFound = tables.filter((t) => !foundTables.has(t));
154
192
 
155
- if (notFound.length > 0) {
156
- // Flush valid tables before reporting missing ones
157
- const validTables = tables.filter((t) => foundTables.has(t));
158
- if (validTables.length > 0) {
159
- const validList = validTables.map((t) => `\`${t}\``).join(", ");
160
- await adapter.executeQuery(`FLUSH TABLES ${validList}`);
193
+ if (notFound.length > 0) {
194
+ // Flush valid tables before reporting missing ones
195
+ const validTables = tables.filter((t) => foundTables.has(t));
196
+ if (validTables.length > 0) {
197
+ const validList = validTables.map((t) => `\`${t}\``).join(", ");
198
+ await adapter.executeQuery(`FLUSH TABLES ${validList}`);
199
+ }
200
+ return {
201
+ success: false,
202
+ error: `Tables not found: ${notFound.join(", ")}`,
203
+ notFound,
204
+ flushed: validTables,
205
+ };
161
206
  }
162
- return {
163
- success: false,
164
- notFound,
165
- flushed: validTables,
166
- };
207
+
208
+ const tableList = tables.map((t) => `\`${t}\``).join(", ");
209
+ await adapter.executeQuery(`FLUSH TABLES ${tableList}`);
210
+ } else {
211
+ await adapter.executeQuery("FLUSH TABLES");
167
212
  }
168
213
 
169
- const tableList = tables.map((t) => `\`${t}\``).join(", ");
170
- await adapter.executeQuery(`FLUSH TABLES ${tableList}`);
171
- } else {
172
- await adapter.executeQuery("FLUSH TABLES");
214
+ return { success: true };
215
+ } catch (error) {
216
+ if (error instanceof ZodError) {
217
+ return { success: false, error: formatZodError(error) };
218
+ }
219
+ const message = error instanceof Error ? error.message : String(error);
220
+ return { success: false, error: message };
173
221
  }
174
-
175
- return { success: true };
176
222
  },
177
223
  };
178
224
  }
@@ -183,27 +229,30 @@ export function createKillQueryTool(adapter: MySQLAdapter): ToolDefinition {
183
229
  title: "MySQL Kill Query",
184
230
  description: "Kill a running query or connection.",
185
231
  group: "admin",
186
- inputSchema: KillQuerySchema,
232
+ inputSchema: KillQuerySchemaBase,
187
233
  requiredScopes: ["admin"],
188
234
  annotations: {
189
235
  readOnlyHint: false,
190
236
  destructiveHint: true,
191
237
  },
192
238
  handler: async (params: unknown, _context: RequestContext) => {
193
- const { processId, connection } = KillQuerySchema.parse(params);
194
- const killType = connection ? "CONNECTION" : "QUERY";
195
239
  try {
240
+ const { processId, connection } = KillQuerySchema.parse(params);
241
+ const killType = connection ? "CONNECTION" : "QUERY";
196
242
  await adapter.executeQuery(`KILL ${killType} ${processId}`);
197
243
  return { success: true, killed: processId, type: killType };
198
244
  } catch (error) {
245
+ if (error instanceof ZodError) {
246
+ return { success: false, error: formatZodError(error) };
247
+ }
199
248
  const message = error instanceof Error ? error.message : String(error);
200
249
  if (message.includes("Unknown thread id")) {
201
250
  return {
202
251
  success: false,
203
- error: `Process ID ${processId} not found`,
252
+ error: `Process ID ${/\d+/.exec(message)?.[0] ?? "unknown"} not found`,
204
253
  };
205
254
  }
206
- throw error;
255
+ return { success: false, error: message };
207
256
  }
208
257
  },
209
258
  };
@@ -15,7 +15,7 @@ import {
15
15
  ShowStatusSchema,
16
16
  ShowVariablesSchema,
17
17
  } from "../../types.js";
18
- import { z } from "zod";
18
+ import { z, ZodError } from "zod";
19
19
 
20
20
  export function createShowProcesslistTool(
21
21
  adapter: MySQLAdapter,
@@ -32,10 +32,21 @@ export function createShowProcesslistTool(
32
32
  idempotentHint: true,
33
33
  },
34
34
  handler: async (params: unknown, _context: RequestContext) => {
35
- const { full } = ShowProcesslistSchema.parse(params);
36
- const sql = full ? "SHOW FULL PROCESSLIST" : "SHOW PROCESSLIST";
37
- const result = await adapter.executeQuery(sql);
38
- return { processes: result.rows };
35
+ try {
36
+ const { full } = ShowProcesslistSchema.parse(params);
37
+ const sql = full ? "SHOW FULL PROCESSLIST" : "SHOW PROCESSLIST";
38
+ const result = await adapter.executeQuery(sql);
39
+ return { processes: result.rows };
40
+ } catch (err) {
41
+ if (err instanceof ZodError) {
42
+ const messages = err.issues.map((i) => i.message).join("; ");
43
+ return { success: false as const, error: messages };
44
+ }
45
+ return {
46
+ success: false as const,
47
+ error: err instanceof Error ? err.message : String(err),
48
+ };
49
+ }
39
50
  },
40
51
  };
41
52
  }
@@ -53,49 +64,68 @@ export function createShowStatusTool(adapter: MySQLAdapter): ToolDefinition {
53
64
  idempotentHint: true,
54
65
  },
55
66
  handler: async (params: unknown, _context: RequestContext) => {
56
- const { like, global, limit } = ShowStatusSchema.parse(params);
57
- const effectiveLimit = limit ?? 100;
67
+ try {
68
+ const { like, global, limit } = ShowStatusSchema.parse(params);
69
+ if (limit !== undefined && limit < 1) {
70
+ return {
71
+ success: false as const,
72
+ error: "limit must be a positive integer",
73
+ };
74
+ }
75
+ const effectiveLimit = limit ?? 100;
58
76
 
59
- let sql = global ? "SHOW GLOBAL STATUS" : "SHOW STATUS";
77
+ let sql = global ? "SHOW GLOBAL STATUS" : "SHOW STATUS";
60
78
 
61
- // SHOW commands don't support parameter binding - build SQL directly
62
- if (like) {
63
- // Escape the like pattern for safety
64
- const escapedLike = like.replace(/'/g, "''");
65
- sql += ` LIKE '${escapedLike}'`;
66
- }
79
+ // SHOW commands don't support parameter binding - build SQL directly
80
+ if (like) {
81
+ // Escape the like pattern for safety
82
+ const escapedLike = like.replace(/'/g, "''");
83
+ sql += ` LIKE '${escapedLike}'`;
84
+ }
67
85
 
68
- const result = await adapter.rawQuery(sql);
69
-
70
- // Convert to object for easier use
71
- // Handle both uppercase and Pascal case column names
72
- const status: Record<string, string> = {};
73
- for (const row of result.rows ?? []) {
74
- const name = (row["Variable_name"] ??
75
- row["VARIABLE_NAME"] ??
76
- row["variable_name"]) as string;
77
- const value = (row["Value"] ?? row["VALUE"] ?? row["value"]) as string;
78
- if (name) {
79
- // Redact RSA public key blobs (multi-line PEM certificates)
80
- status[name] = value?.includes("-----BEGIN PUBLIC KEY-----")
81
- ? "[REDACTED]"
82
- : value;
86
+ const result = await adapter.rawQuery(sql);
87
+
88
+ // Convert to object for easier use
89
+ // Handle both uppercase and Pascal case column names
90
+ const status: Record<string, string> = {};
91
+ for (const row of result.rows ?? []) {
92
+ const name = (row["Variable_name"] ??
93
+ row["VARIABLE_NAME"] ??
94
+ row["variable_name"]) as string;
95
+ const value = (row["Value"] ??
96
+ row["VALUE"] ??
97
+ row["value"]) as string;
98
+ if (name) {
99
+ // Redact RSA public key blobs (multi-line PEM certificates)
100
+ status[name] = value?.includes("-----BEGIN PUBLIC KEY-----")
101
+ ? "[REDACTED]"
102
+ : value;
103
+ }
83
104
  }
84
- }
85
105
 
86
- const totalAvailable = Object.keys(status).length;
87
- const entries = Object.entries(status);
88
- const limited = entries.length > effectiveLimit;
89
- const truncated = limited
90
- ? Object.fromEntries(entries.slice(0, effectiveLimit))
91
- : status;
92
-
93
- return {
94
- status: truncated,
95
- rowCount: Object.keys(truncated).length,
96
- totalAvailable,
97
- ...(limited && { limited: true }),
98
- };
106
+ const totalAvailable = Object.keys(status).length;
107
+ const entries = Object.entries(status);
108
+ const limited = entries.length > effectiveLimit;
109
+ const truncated = limited
110
+ ? Object.fromEntries(entries.slice(0, effectiveLimit))
111
+ : status;
112
+
113
+ return {
114
+ status: truncated,
115
+ rowCount: Object.keys(truncated).length,
116
+ totalAvailable,
117
+ ...(limited && { limited: true }),
118
+ };
119
+ } catch (err) {
120
+ if (err instanceof ZodError) {
121
+ const messages = err.issues.map((i) => i.message).join("; ");
122
+ return { success: false as const, error: messages };
123
+ }
124
+ return {
125
+ success: false as const,
126
+ error: err instanceof Error ? err.message : String(err),
127
+ };
128
+ }
99
129
  },
100
130
  };
101
131
  }
@@ -113,46 +143,65 @@ export function createShowVariablesTool(adapter: MySQLAdapter): ToolDefinition {
113
143
  idempotentHint: true,
114
144
  },
115
145
  handler: async (params: unknown, _context: RequestContext) => {
116
- const { like, global, limit } = ShowVariablesSchema.parse(params);
117
- const effectiveLimit = limit ?? 100;
146
+ try {
147
+ const { like, global, limit } = ShowVariablesSchema.parse(params);
148
+ if (limit !== undefined && limit < 1) {
149
+ return {
150
+ success: false as const,
151
+ error: "limit must be a positive integer",
152
+ };
153
+ }
154
+ const effectiveLimit = limit ?? 100;
118
155
 
119
- let sql = global ? "SHOW GLOBAL VARIABLES" : "SHOW VARIABLES";
156
+ let sql = global ? "SHOW GLOBAL VARIABLES" : "SHOW VARIABLES";
120
157
 
121
- // SHOW commands don't support parameter binding - build SQL directly
122
- if (like) {
123
- // Escape the like pattern for safety
124
- const escapedLike = like.replace(/'/g, "''");
125
- sql += ` LIKE '${escapedLike}'`;
126
- }
158
+ // SHOW commands don't support parameter binding - build SQL directly
159
+ if (like) {
160
+ // Escape the like pattern for safety
161
+ const escapedLike = like.replace(/'/g, "''");
162
+ sql += ` LIKE '${escapedLike}'`;
163
+ }
164
+
165
+ const result = await adapter.rawQuery(sql);
166
+
167
+ // Convert to object
168
+ // Handle both uppercase and Pascal case column names
169
+ const variables: Record<string, string> = {};
170
+ for (const row of result.rows ?? []) {
171
+ const name = (row["Variable_name"] ??
172
+ row["VARIABLE_NAME"] ??
173
+ row["variable_name"]) as string;
174
+ const value = (row["Value"] ??
175
+ row["VALUE"] ??
176
+ row["value"]) as string;
177
+ if (name) {
178
+ variables[name] = value;
179
+ }
180
+ }
127
181
 
128
- const result = await adapter.rawQuery(sql);
129
-
130
- // Convert to object
131
- // Handle both uppercase and Pascal case column names
132
- const variables: Record<string, string> = {};
133
- for (const row of result.rows ?? []) {
134
- const name = (row["Variable_name"] ??
135
- row["VARIABLE_NAME"] ??
136
- row["variable_name"]) as string;
137
- const value = (row["Value"] ?? row["VALUE"] ?? row["value"]) as string;
138
- if (name) {
139
- variables[name] = value;
182
+ const totalAvailable = Object.keys(variables).length;
183
+ const entries = Object.entries(variables);
184
+ const limited = entries.length > effectiveLimit;
185
+ const truncated = limited
186
+ ? Object.fromEntries(entries.slice(0, effectiveLimit))
187
+ : variables;
188
+
189
+ return {
190
+ variables: truncated,
191
+ rowCount: Object.keys(truncated).length,
192
+ totalAvailable,
193
+ ...(limited && { limited: true }),
194
+ };
195
+ } catch (err) {
196
+ if (err instanceof ZodError) {
197
+ const messages = err.issues.map((i) => i.message).join("; ");
198
+ return { success: false as const, error: messages };
140
199
  }
200
+ return {
201
+ success: false as const,
202
+ error: err instanceof Error ? err.message : String(err),
203
+ };
141
204
  }
142
-
143
- const totalAvailable = Object.keys(variables).length;
144
- const entries = Object.entries(variables);
145
- const limited = entries.length > effectiveLimit;
146
- const truncated = limited
147
- ? Object.fromEntries(entries.slice(0, effectiveLimit))
148
- : variables;
149
-
150
- return {
151
- variables: truncated,
152
- rowCount: Object.keys(truncated).length,
153
- totalAvailable,
154
- ...(limited && { limited: true }),
155
- };
156
205
  },
157
206
  };
158
207
  }
@@ -263,17 +312,30 @@ export function createInnodbStatusTool(adapter: MySQLAdapter): ToolDefinition {
263
312
  idempotentHint: true,
264
313
  },
265
314
  handler: async (params: unknown, _context: RequestContext) => {
266
- const { summary } = InnodbStatusSchema.parse(params);
267
- const result = await adapter.executeQuery("SHOW ENGINE INNODB STATUS");
268
- const rawRow = result.rows?.[0];
269
- const rawStatus =
270
- (rawRow?.["Status"] as string) ?? (rawRow?.["STATUS"] as string) ?? "";
271
-
272
- if (summary) {
273
- return { summary: parseInnodbStatusSummary(rawStatus) };
274
- }
315
+ try {
316
+ const { summary } = InnodbStatusSchema.parse(params);
317
+ const result = await adapter.executeQuery("SHOW ENGINE INNODB STATUS");
318
+ const rawRow = result.rows?.[0];
319
+ const rawStatus =
320
+ (rawRow?.["Status"] as string) ??
321
+ (rawRow?.["STATUS"] as string) ??
322
+ "";
323
+
324
+ if (summary) {
325
+ return { summary: parseInnodbStatusSummary(rawStatus) };
326
+ }
275
327
 
276
- return { status: rawRow };
328
+ return { status: rawRow };
329
+ } catch (err) {
330
+ if (err instanceof ZodError) {
331
+ const messages = err.issues.map((i) => i.message).join("; ");
332
+ return { success: false as const, error: messages };
333
+ }
334
+ return {
335
+ success: false as const,
336
+ error: err instanceof Error ? err.message : String(err),
337
+ };
338
+ }
277
339
  },
278
340
  };
279
341
  }
@@ -341,11 +403,18 @@ export function createPoolStatsTool(adapter: MySQLAdapter): ToolDefinition {
341
403
  idempotentHint: true,
342
404
  },
343
405
  handler: async (_params: unknown, _context: RequestContext) => {
344
- const pool = await Promise.resolve(adapter.getPool());
345
- if (!pool) {
346
- return { error: "Pool not available" };
406
+ try {
407
+ const pool = await Promise.resolve(adapter.getPool());
408
+ if (!pool) {
409
+ return { success: false as const, error: "Pool not available" };
410
+ }
411
+ return { poolStats: pool.getStats() };
412
+ } catch (err) {
413
+ return {
414
+ success: false as const,
415
+ error: err instanceof Error ? err.message : String(err),
416
+ };
347
417
  }
348
- return { poolStats: pool.getStats() };
349
418
  },
350
419
  };
351
420
  }
@@ -365,39 +434,46 @@ export function createServerHealthTool(adapter: MySQLAdapter): ToolDefinition {
365
434
  idempotentHint: true,
366
435
  },
367
436
  handler: async (_params: unknown, _context: RequestContext) => {
368
- const health = await adapter.getHealth();
369
-
370
- // Get additional metrics
371
- const uptimeResult = await adapter.executeQuery(
372
- "SHOW GLOBAL STATUS LIKE 'Uptime'",
373
- );
374
- const uptime = uptimeResult.rows?.[0]?.["Value"];
375
-
376
- const connectionsResult = await adapter.executeQuery(
377
- "SHOW GLOBAL STATUS LIKE 'Threads_connected'",
378
- );
379
- const connections = connectionsResult.rows?.[0]?.["Value"];
380
-
381
- const queriesResult = await adapter.executeQuery(
382
- "SHOW GLOBAL STATUS LIKE 'Questions'",
383
- );
384
- const queries = queriesResult.rows?.[0]?.["Value"];
385
-
386
- return {
387
- ...health,
388
- uptime:
389
- uptime != null && typeof uptime === "string"
390
- ? parseInt(uptime, 10)
391
- : undefined,
392
- activeConnections:
393
- connections != null && typeof connections === "string"
394
- ? parseInt(connections, 10)
395
- : undefined,
396
- totalQueries:
397
- queries != null && typeof queries === "string"
398
- ? parseInt(queries, 10)
399
- : undefined,
400
- };
437
+ try {
438
+ const health = await adapter.getHealth();
439
+
440
+ // Get additional metrics
441
+ const uptimeResult = await adapter.executeQuery(
442
+ "SHOW GLOBAL STATUS LIKE 'Uptime'",
443
+ );
444
+ const uptime = uptimeResult.rows?.[0]?.["Value"];
445
+
446
+ const connectionsResult = await adapter.executeQuery(
447
+ "SHOW GLOBAL STATUS LIKE 'Threads_connected'",
448
+ );
449
+ const connections = connectionsResult.rows?.[0]?.["Value"];
450
+
451
+ const queriesResult = await adapter.executeQuery(
452
+ "SHOW GLOBAL STATUS LIKE 'Questions'",
453
+ );
454
+ const queries = queriesResult.rows?.[0]?.["Value"];
455
+
456
+ return {
457
+ ...health,
458
+ uptime:
459
+ uptime != null && typeof uptime === "string"
460
+ ? parseInt(uptime, 10)
461
+ : undefined,
462
+ activeConnections:
463
+ connections != null && typeof connections === "string"
464
+ ? parseInt(connections, 10)
465
+ : undefined,
466
+ totalQueries:
467
+ queries != null && typeof queries === "string"
468
+ ? parseInt(queries, 10)
469
+ : undefined,
470
+ };
471
+ } catch (err) {
472
+ return {
473
+ success: false as const,
474
+ error: err instanceof Error ? err.message : String(err),
475
+ };
476
+ }
401
477
  },
402
478
  };
403
479
  }