@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
@@ -323,7 +323,7 @@ export const DropTableSchemaBase = z.object({
323
323
  ifExists: z
324
324
  .boolean()
325
325
  .optional()
326
- .default(true)
326
+ .default(false)
327
327
  .describe("Add IF EXISTS clause"),
328
328
  });
329
329
 
@@ -397,6 +397,12 @@ export const GetIndexesSchema = z
397
397
 
398
398
  // --- TransactionBegin ---
399
399
 
400
+ // Base schema for MCP visibility
401
+ export const TransactionBeginSchemaBase = z.object({
402
+ isolationLevel: z.string().optional().describe("Transaction isolation level"),
403
+ });
404
+
405
+ // Transformed schema for handler parsing
400
406
  export const TransactionBeginSchema = z.preprocess(
401
407
  defaultToEmpty,
402
408
  z.object({
@@ -467,24 +473,31 @@ export const TransactionExecuteSchemaBase = z.object({
467
473
  .optional()
468
474
  .describe("SQL statements to execute atomically"),
469
475
  queries: z.array(z.string()).optional().describe("Alias for statements"),
470
- isolationLevel: z
471
- .enum([
472
- "READ UNCOMMITTED",
473
- "READ COMMITTED",
474
- "REPEATABLE READ",
475
- "SERIALIZABLE",
476
- ])
477
- .optional()
478
- .describe("Transaction isolation level"),
476
+ isolationLevel: z.string().optional().describe("Transaction isolation level"),
479
477
  });
480
478
 
481
- // Transformed schema for handler parsing
482
479
  export const TransactionExecuteSchema = z
483
480
  .preprocess(preprocessTransactionExecuteParams, TransactionExecuteSchemaBase)
484
481
  .transform((data) => ({
485
482
  statements: data.statements ?? data.queries ?? [],
486
483
  isolationLevel: data.isolationLevel,
487
- }));
484
+ }))
485
+ .refine(
486
+ (data) => {
487
+ if (!data.isolationLevel) return true;
488
+ const validLevels = [
489
+ "READ UNCOMMITTED",
490
+ "READ COMMITTED",
491
+ "REPEATABLE READ",
492
+ "SERIALIZABLE",
493
+ ];
494
+ return validLevels.includes(data.isolationLevel);
495
+ },
496
+ {
497
+ message:
498
+ "Invalid isolationLevel. Expected one of: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE",
499
+ },
500
+ );
488
501
 
489
502
  // =============================================================================
490
503
  // Preprocess: JSON/Text column params (table, column, where aliases)
@@ -710,6 +723,378 @@ export const JsonSearchSchema = z
710
723
  message: "column (or col alias) is required",
711
724
  });
712
725
 
726
+ // --- JsonInsert ---
727
+ export const JsonInsertSchemaBase = z.object({
728
+ table: z.string().optional().describe("Table name"),
729
+ tableName: z.string().optional().describe("Alias for table"),
730
+ name: z.string().optional().describe("Alias for table"),
731
+ column: z.string().optional().describe("JSON column name"),
732
+ col: z.string().optional().describe("Alias for column"),
733
+ path: z.string().describe("JSON path to insert at"),
734
+ value: z.unknown().describe("Value to insert"),
735
+ where: z.string().optional().describe("WHERE clause to identify rows"),
736
+ filter: z.string().optional().describe("Alias for where"),
737
+ });
738
+
739
+ export const JsonInsertSchema = z
740
+ .preprocess(
741
+ preprocessJsonColumnParams,
742
+ z.object({
743
+ table: z.string().optional(),
744
+ tableName: z.string().optional(),
745
+ name: z.string().optional(),
746
+ column: z.string().optional(),
747
+ col: z.string().optional(),
748
+ path: z.string(),
749
+ value: z.unknown(),
750
+ where: z.string().optional(),
751
+ filter: z.string().optional(),
752
+ }),
753
+ )
754
+ .transform((data) => ({
755
+ table: data.table ?? data.tableName ?? data.name ?? "",
756
+ column: data.column ?? data.col ?? "",
757
+ path: data.path,
758
+ value: data.value,
759
+ where: data.where ?? data.filter ?? "",
760
+ }))
761
+ .refine((data) => data.table !== "", {
762
+ message: "table (or tableName/name alias) is required",
763
+ })
764
+ .refine((data) => data.column !== "", {
765
+ message: "column (or col alias) is required",
766
+ })
767
+ .refine((data) => data.where !== "", {
768
+ message: "where (or filter alias) is required",
769
+ });
770
+
771
+ // --- JsonReplace ---
772
+ export const JsonReplaceSchemaBase = z.object({
773
+ table: z.string().optional().describe("Table name"),
774
+ tableName: z.string().optional().describe("Alias for table"),
775
+ name: z.string().optional().describe("Alias for table"),
776
+ column: z.string().optional().describe("JSON column name"),
777
+ col: z.string().optional().describe("Alias for column"),
778
+ path: z.string().describe("JSON path to replace"),
779
+ value: z.unknown().describe("Replacement value"),
780
+ where: z.string().optional().describe("WHERE clause to identify rows"),
781
+ filter: z.string().optional().describe("Alias for where"),
782
+ });
783
+
784
+ export const JsonReplaceSchema = z
785
+ .preprocess(
786
+ preprocessJsonColumnParams,
787
+ z.object({
788
+ table: z.string().optional(),
789
+ tableName: z.string().optional(),
790
+ name: z.string().optional(),
791
+ column: z.string().optional(),
792
+ col: z.string().optional(),
793
+ path: z.string(),
794
+ value: z.unknown(),
795
+ where: z.string().optional(),
796
+ filter: z.string().optional(),
797
+ }),
798
+ )
799
+ .transform((data) => ({
800
+ table: data.table ?? data.tableName ?? data.name ?? "",
801
+ column: data.column ?? data.col ?? "",
802
+ path: data.path,
803
+ value: data.value,
804
+ where: data.where ?? data.filter ?? "",
805
+ }))
806
+ .refine((data) => data.table !== "", {
807
+ message: "table (or tableName/name alias) is required",
808
+ })
809
+ .refine((data) => data.column !== "", {
810
+ message: "column (or col alias) is required",
811
+ })
812
+ .refine((data) => data.where !== "", {
813
+ message: "where (or filter alias) is required",
814
+ });
815
+
816
+ // --- JsonRemove ---
817
+ export const JsonRemoveSchemaBase = z.object({
818
+ table: z.string().optional().describe("Table name"),
819
+ tableName: z.string().optional().describe("Alias for table"),
820
+ name: z.string().optional().describe("Alias for table"),
821
+ column: z.string().optional().describe("JSON column name"),
822
+ col: z.string().optional().describe("Alias for column"),
823
+ paths: z.array(z.string()).describe("JSON paths to remove"),
824
+ where: z.string().optional().describe("WHERE clause to identify rows"),
825
+ filter: z.string().optional().describe("Alias for where"),
826
+ });
827
+
828
+ export const JsonRemoveSchema = z
829
+ .preprocess(
830
+ preprocessJsonColumnParams,
831
+ z.object({
832
+ table: z.string().optional(),
833
+ tableName: z.string().optional(),
834
+ name: z.string().optional(),
835
+ column: z.string().optional(),
836
+ col: z.string().optional(),
837
+ paths: z.array(z.string()),
838
+ where: z.string().optional(),
839
+ filter: z.string().optional(),
840
+ }),
841
+ )
842
+ .transform((data) => ({
843
+ table: data.table ?? data.tableName ?? data.name ?? "",
844
+ column: data.column ?? data.col ?? "",
845
+ paths: data.paths,
846
+ where: data.where ?? data.filter ?? "",
847
+ }))
848
+ .refine((data) => data.table !== "", {
849
+ message: "table (or tableName/name alias) is required",
850
+ })
851
+ .refine((data) => data.column !== "", {
852
+ message: "column (or col alias) is required",
853
+ })
854
+ .refine((data) => data.where !== "", {
855
+ message: "where (or filter alias) is required",
856
+ });
857
+
858
+ // --- JsonArrayAppend ---
859
+ export const JsonArrayAppendSchemaBase = z.object({
860
+ table: z.string().optional().describe("Table name"),
861
+ tableName: z.string().optional().describe("Alias for table"),
862
+ name: z.string().optional().describe("Alias for table"),
863
+ column: z.string().optional().describe("JSON column name"),
864
+ col: z.string().optional().describe("Alias for column"),
865
+ path: z.string().describe("JSON path to array"),
866
+ value: z.unknown().describe("Value to append"),
867
+ where: z.string().optional().describe("WHERE clause to identify rows"),
868
+ filter: z.string().optional().describe("Alias for where"),
869
+ });
870
+
871
+ export const JsonArrayAppendSchema = z
872
+ .preprocess(
873
+ preprocessJsonColumnParams,
874
+ z.object({
875
+ table: z.string().optional(),
876
+ tableName: z.string().optional(),
877
+ name: z.string().optional(),
878
+ column: z.string().optional(),
879
+ col: z.string().optional(),
880
+ path: z.string(),
881
+ value: z.unknown(),
882
+ where: z.string().optional(),
883
+ filter: z.string().optional(),
884
+ }),
885
+ )
886
+ .transform((data) => ({
887
+ table: data.table ?? data.tableName ?? data.name ?? "",
888
+ column: data.column ?? data.col ?? "",
889
+ path: data.path,
890
+ value: data.value,
891
+ where: data.where ?? data.filter ?? "",
892
+ }))
893
+ .refine((data) => data.table !== "", {
894
+ message: "table (or tableName/name alias) is required",
895
+ })
896
+ .refine((data) => data.column !== "", {
897
+ message: "column (or col alias) is required",
898
+ })
899
+ .refine((data) => data.where !== "", {
900
+ message: "where (or filter alias) is required",
901
+ });
902
+
903
+ // --- JsonGet ---
904
+ export const JsonGetSchemaBase = z.object({
905
+ table: z.string().optional().describe("Table name"),
906
+ tableName: z.string().optional().describe("Alias for table"),
907
+ name: z.string().optional().describe("Alias for table"),
908
+ column: z.string().optional().describe("JSON column name"),
909
+ col: z.string().optional().describe("Alias for column"),
910
+ path: z.string().describe("JSON path to extract"),
911
+ id: z.union([z.string(), z.number()]).describe("Row ID"),
912
+ idColumn: z.string().default("id").describe("ID column name"),
913
+ });
914
+
915
+ export const JsonGetSchema = z
916
+ .preprocess(
917
+ preprocessJsonColumnParams,
918
+ z.object({
919
+ table: z.string().optional(),
920
+ tableName: z.string().optional(),
921
+ name: z.string().optional(),
922
+ column: z.string().optional(),
923
+ col: z.string().optional(),
924
+ path: z.string(),
925
+ id: z.union([z.string(), z.number()]),
926
+ idColumn: z.string().default("id"),
927
+ }),
928
+ )
929
+ .transform((data) => ({
930
+ table: data.table ?? data.tableName ?? data.name ?? "",
931
+ column: data.column ?? data.col ?? "",
932
+ path: data.path,
933
+ id: data.id,
934
+ idColumn: data.idColumn,
935
+ }))
936
+ .refine((data) => data.table !== "", {
937
+ message: "table (or tableName/name alias) is required",
938
+ })
939
+ .refine((data) => data.column !== "", {
940
+ message: "column (or col alias) is required",
941
+ });
942
+
943
+ // --- JsonUpdate ---
944
+ export const JsonUpdateSchemaBase = z.object({
945
+ table: z.string().optional().describe("Table name"),
946
+ tableName: z.string().optional().describe("Alias for table"),
947
+ name: z.string().optional().describe("Alias for table"),
948
+ column: z.string().optional().describe("JSON column name"),
949
+ col: z.string().optional().describe("Alias for column"),
950
+ path: z.string().describe("JSON path to update"),
951
+ value: z.unknown().describe("New value"),
952
+ id: z.union([z.string(), z.number()]).describe("Row ID"),
953
+ idColumn: z.string().default("id").describe("ID column name"),
954
+ });
955
+
956
+ export const JsonUpdateSchema = z
957
+ .preprocess(
958
+ preprocessJsonColumnParams,
959
+ z.object({
960
+ table: z.string().optional(),
961
+ tableName: z.string().optional(),
962
+ name: z.string().optional(),
963
+ column: z.string().optional(),
964
+ col: z.string().optional(),
965
+ path: z.string(),
966
+ value: z.unknown(),
967
+ id: z.union([z.string(), z.number()]),
968
+ idColumn: z.string().default("id"),
969
+ }),
970
+ )
971
+ .transform((data) => ({
972
+ table: data.table ?? data.tableName ?? data.name ?? "",
973
+ column: data.column ?? data.col ?? "",
974
+ path: data.path,
975
+ value: data.value,
976
+ id: data.id,
977
+ idColumn: data.idColumn,
978
+ }))
979
+ .refine((data) => data.table !== "", {
980
+ message: "table (or tableName/name alias) is required",
981
+ })
982
+ .refine((data) => data.column !== "", {
983
+ message: "column (or col alias) is required",
984
+ });
985
+
986
+ // --- JsonNormalize ---
987
+ export const JsonNormalizeSchemaBase = z.object({
988
+ table: z.string().optional().describe("Table name"),
989
+ tableName: z.string().optional().describe("Alias for table"),
990
+ name: z.string().optional().describe("Alias for table"),
991
+ column: z.string().optional().describe("JSON column name"),
992
+ col: z.string().optional().describe("Alias for column"),
993
+ where: z.string().optional().describe("WHERE clause"),
994
+ filter: z.string().optional().describe("Alias for where"),
995
+ limit: z.number().default(100).describe("Maximum rows to process"),
996
+ });
997
+
998
+ export const JsonNormalizeSchema = z
999
+ .preprocess(
1000
+ preprocessJsonColumnParams,
1001
+ z.object({
1002
+ table: z.string().optional(),
1003
+ tableName: z.string().optional(),
1004
+ name: z.string().optional(),
1005
+ column: z.string().optional(),
1006
+ col: z.string().optional(),
1007
+ where: z.string().optional(),
1008
+ filter: z.string().optional(),
1009
+ limit: z.number().default(100),
1010
+ }),
1011
+ )
1012
+ .transform((data) => ({
1013
+ table: data.table ?? data.tableName ?? data.name ?? "",
1014
+ column: data.column ?? data.col ?? "",
1015
+ where: data.where ?? data.filter,
1016
+ limit: data.limit,
1017
+ }))
1018
+ .refine((data) => data.table !== "", {
1019
+ message: "table (or tableName/name alias) is required",
1020
+ })
1021
+ .refine((data) => data.column !== "", {
1022
+ message: "column (or col alias) is required",
1023
+ });
1024
+
1025
+ // --- JsonStats ---
1026
+ export const JsonStatsSchemaBase = z.object({
1027
+ table: z.string().optional().describe("Table name"),
1028
+ tableName: z.string().optional().describe("Alias for table"),
1029
+ name: z.string().optional().describe("Alias for table"),
1030
+ column: z.string().optional().describe("JSON column name"),
1031
+ col: z.string().optional().describe("Alias for column"),
1032
+ where: z.string().optional().describe("Optional WHERE clause"),
1033
+ filter: z.string().optional().describe("Alias for where"),
1034
+ sampleSize: z.number().default(1000).describe("Sample size for statistics"),
1035
+ });
1036
+
1037
+ export const JsonStatsSchema = z
1038
+ .preprocess(
1039
+ preprocessJsonColumnParams,
1040
+ z.object({
1041
+ table: z.string().optional(),
1042
+ tableName: z.string().optional(),
1043
+ name: z.string().optional(),
1044
+ column: z.string().optional(),
1045
+ col: z.string().optional(),
1046
+ where: z.string().optional(),
1047
+ filter: z.string().optional(),
1048
+ sampleSize: z.number().default(1000),
1049
+ }),
1050
+ )
1051
+ .transform((data) => ({
1052
+ table: data.table ?? data.tableName ?? data.name ?? "",
1053
+ column: data.column ?? data.col ?? "",
1054
+ where: data.where ?? data.filter,
1055
+ sampleSize: data.sampleSize,
1056
+ }))
1057
+ .refine((data) => data.table !== "", {
1058
+ message: "table (or tableName/name alias) is required",
1059
+ })
1060
+ .refine((data) => data.column !== "", {
1061
+ message: "column (or col alias) is required",
1062
+ });
1063
+
1064
+ // --- JsonIndexSuggest ---
1065
+ export const JsonIndexSuggestSchemaBase = z.object({
1066
+ table: z.string().optional().describe("Table name"),
1067
+ tableName: z.string().optional().describe("Alias for table"),
1068
+ name: z.string().optional().describe("Alias for table"),
1069
+ column: z.string().optional().describe("JSON column name"),
1070
+ col: z.string().optional().describe("Alias for column"),
1071
+ sampleSize: z.number().default(100).describe("Sample size to analyze"),
1072
+ });
1073
+
1074
+ export const JsonIndexSuggestSchema = z
1075
+ .preprocess(
1076
+ preprocessJsonColumnParams,
1077
+ z.object({
1078
+ table: z.string().optional(),
1079
+ tableName: z.string().optional(),
1080
+ name: z.string().optional(),
1081
+ column: z.string().optional(),
1082
+ col: z.string().optional(),
1083
+ sampleSize: z.number().default(100),
1084
+ }),
1085
+ )
1086
+ .transform((data) => ({
1087
+ table: data.table ?? data.tableName ?? data.name ?? "",
1088
+ column: data.column ?? data.col ?? "",
1089
+ sampleSize: data.sampleSize,
1090
+ }))
1091
+ .refine((data) => data.table !== "", {
1092
+ message: "table (or tableName/name alias) is required",
1093
+ })
1094
+ .refine((data) => data.column !== "", {
1095
+ message: "column (or col alias) is required",
1096
+ });
1097
+
713
1098
  // --- JsonValidate (no table/column — no aliases needed) ---
714
1099
  export const JsonValidateSchema = z.object({
715
1100
  value: z.string().describe("JSON string to validate"),
@@ -1070,6 +1455,119 @@ export const FulltextSearchSchema = z
1070
1455
  message: "query (or sql alias) is required",
1071
1456
  });
1072
1457
 
1458
+ // --- FulltextDrop ---
1459
+ export const FulltextDropSchemaBase = z.object({
1460
+ table: z.string().optional().describe("Table containing the index"),
1461
+ tableName: z.string().optional().describe("Alias for table"),
1462
+ name: z.string().optional().describe("Alias for table"),
1463
+ indexName: z
1464
+ .string()
1465
+ .optional()
1466
+ .describe("Name of the FULLTEXT index to drop"),
1467
+ });
1468
+
1469
+ export const FulltextDropSchema = z
1470
+ .preprocess(
1471
+ preprocessTableParams,
1472
+ z.object({
1473
+ table: z.string().optional(),
1474
+ tableName: z.string().optional(),
1475
+ name: z.string().optional(),
1476
+ indexName: z.string().optional(),
1477
+ }),
1478
+ )
1479
+ .transform((data) => ({
1480
+ table: data.table ?? data.tableName ?? data.name ?? "",
1481
+ indexName: data.indexName ?? "",
1482
+ }))
1483
+ .refine((data) => data.table !== "", {
1484
+ message: "table (or tableName/name alias) is required",
1485
+ })
1486
+ .refine((data) => data.indexName !== "", {
1487
+ message: "indexName is required",
1488
+ });
1489
+
1490
+ // --- FulltextBoolean ---
1491
+ export const FulltextBooleanSchemaBase = z.object({
1492
+ table: z.string().optional().describe("Table name"),
1493
+ tableName: z.string().optional().describe("Alias for table"),
1494
+ name: z.string().optional().describe("Alias for table"),
1495
+ columns: z.array(z.string()).optional().describe("Columns to search"),
1496
+ query: z
1497
+ .string()
1498
+ .optional()
1499
+ .describe("Boolean search query with +, -, *, etc."),
1500
+ maxLength: z
1501
+ .number()
1502
+ .optional()
1503
+ .describe(
1504
+ "Optional max characters per text column in results. Truncates with '...' if exceeded.",
1505
+ ),
1506
+ });
1507
+
1508
+ export const FulltextBooleanSchema = z
1509
+ .preprocess(
1510
+ preprocessTableParams,
1511
+ z.object({
1512
+ table: z.string().optional(),
1513
+ tableName: z.string().optional(),
1514
+ name: z.string().optional(),
1515
+ columns: z.array(z.string()).optional(),
1516
+ query: z.string().optional(),
1517
+ maxLength: z.number().optional(),
1518
+ }),
1519
+ )
1520
+ .transform((data) => ({
1521
+ table: data.table ?? data.tableName ?? data.name ?? "",
1522
+ columns: data.columns ?? [],
1523
+ query: data.query ?? "",
1524
+ maxLength: data.maxLength,
1525
+ }))
1526
+ .refine((data) => data.table !== "", {
1527
+ message: "table (or tableName/name alias) is required",
1528
+ })
1529
+ .refine((data) => data.columns.length > 0, { message: "columns is required" })
1530
+ .refine((data) => data.query !== "", { message: "query is required" });
1531
+
1532
+ // --- FulltextExpand ---
1533
+ export const FulltextExpandSchemaBase = z.object({
1534
+ table: z.string().optional().describe("Table name"),
1535
+ tableName: z.string().optional().describe("Alias for table"),
1536
+ name: z.string().optional().describe("Alias for table"),
1537
+ columns: z.array(z.string()).optional().describe("Columns to search"),
1538
+ query: z.string().optional().describe("Search query to expand"),
1539
+ maxLength: z
1540
+ .number()
1541
+ .optional()
1542
+ .describe(
1543
+ "Optional max characters per text column in results. Truncates with '...' if exceeded.",
1544
+ ),
1545
+ });
1546
+
1547
+ export const FulltextExpandSchema = z
1548
+ .preprocess(
1549
+ preprocessTableParams,
1550
+ z.object({
1551
+ table: z.string().optional(),
1552
+ tableName: z.string().optional(),
1553
+ name: z.string().optional(),
1554
+ columns: z.array(z.string()).optional(),
1555
+ query: z.string().optional(),
1556
+ maxLength: z.number().optional(),
1557
+ }),
1558
+ )
1559
+ .transform((data) => ({
1560
+ table: data.table ?? data.tableName ?? data.name ?? "",
1561
+ columns: data.columns ?? [],
1562
+ query: data.query ?? "",
1563
+ maxLength: data.maxLength,
1564
+ }))
1565
+ .refine((data) => data.table !== "", {
1566
+ message: "table (or tableName/name alias) is required",
1567
+ })
1568
+ .refine((data) => data.columns.length > 0, { message: "columns is required" })
1569
+ .refine((data) => data.query !== "", { message: "query is required" });
1570
+
1073
1571
  // =============================================================================
1074
1572
  // Performance Schemas
1075
1573
  // =============================================================================
@@ -1143,6 +1641,20 @@ export const SlowQuerySchema = z.object({
1143
1641
  minTime: z.number().optional().describe("Minimum query time in seconds"),
1144
1642
  });
1145
1643
 
1644
+ // --- QueryStats (no table/query aliases — simple passthrough) ---
1645
+ export const QueryStatsSchema = z.object({
1646
+ orderBy: z
1647
+ .enum(["total_time", "avg_time", "executions"])
1648
+ .optional()
1649
+ .default("total_time")
1650
+ .describe("Order results by metric"),
1651
+ limit: z
1652
+ .number()
1653
+ .optional()
1654
+ .default(10)
1655
+ .describe("Maximum number of queries to return"),
1656
+ });
1657
+
1146
1658
  // --- IndexUsage ---
1147
1659
  export const IndexUsageSchemaBase = z.object({
1148
1660
  table: z.string().optional().describe("Filter by table name"),
@@ -1195,6 +1707,48 @@ export const TableStatsSchema = z
1195
1707
  message: "table (or tableName/name alias) is required",
1196
1708
  });
1197
1709
 
1710
+ // --- IndexRecommendation ---
1711
+
1712
+ // Base schema for MCP visibility
1713
+ export const IndexRecommendationSchemaBase = z.object({
1714
+ table: z.string().optional().describe("Table to analyze for missing indexes"),
1715
+ tableName: z.string().optional().describe("Alias for table"),
1716
+ name: z.string().optional().describe("Alias for table"),
1717
+ });
1718
+
1719
+ // Transformed schema for handler parsing
1720
+ export const IndexRecommendationSchema = z
1721
+ .preprocess(preprocessTableParams, IndexRecommendationSchemaBase)
1722
+ .transform((data) => ({
1723
+ table: data.table ?? data.tableName ?? data.name ?? "",
1724
+ }))
1725
+ .refine((data) => data.table !== "", {
1726
+ message: "table (or tableName/name alias) is required",
1727
+ });
1728
+
1729
+ // --- ForceIndex ---
1730
+
1731
+ // Base schema for MCP visibility
1732
+ export const ForceIndexSchemaBase = z.object({
1733
+ table: z.string().optional().describe("Table name"),
1734
+ tableName: z.string().optional().describe("Alias for table"),
1735
+ name: z.string().optional().describe("Alias for table"),
1736
+ query: z.string().describe("Original query"),
1737
+ indexName: z.string().describe("Index name to force"),
1738
+ });
1739
+
1740
+ // Transformed schema for handler parsing
1741
+ export const ForceIndexSchema = z
1742
+ .preprocess(preprocessTableParams, ForceIndexSchemaBase)
1743
+ .transform((data) => ({
1744
+ table: data.table ?? data.tableName ?? data.name ?? "",
1745
+ query: data.query,
1746
+ indexName: data.indexName,
1747
+ }))
1748
+ .refine((data) => data.table !== "", {
1749
+ message: "table (or tableName/name alias) is required",
1750
+ });
1751
+
1198
1752
  // =============================================================================
1199
1753
  // Preprocess: Admin table params (normalizes singular 'table' to 'tables' array)
1200
1754
  // =============================================================================
@@ -1276,10 +1830,7 @@ export const CheckTableSchemaBase = z.object({
1276
1830
  table: z.string().optional().describe("Single table name (alias for tables)"),
1277
1831
  tableName: z.string().optional().describe("Alias for table"),
1278
1832
  name: z.string().optional().describe("Alias for table"),
1279
- option: z
1280
- .enum(["QUICK", "FAST", "MEDIUM", "EXTENDED", "CHANGED"])
1281
- .optional()
1282
- .describe("Check option"),
1833
+ option: z.string().optional().describe("Check option"),
1283
1834
  });
1284
1835
 
1285
1836
  export const CheckTableSchema = z
@@ -1303,6 +1854,38 @@ export const CheckTableSchema = z
1303
1854
  message: "tables (or table/tableName/name alias) is required",
1304
1855
  });
1305
1856
 
1857
+ // --- RepairTable ---
1858
+ export const RepairTableSchemaBase = z.object({
1859
+ tables: z.array(z.string()).optional().describe("Table names to repair"),
1860
+ table: z.string().optional().describe("Single table name (alias for tables)"),
1861
+ tableName: z.string().optional().describe("Alias for table"),
1862
+ name: z.string().optional().describe("Alias for table"),
1863
+ quick: z
1864
+ .boolean()
1865
+ .optional()
1866
+ .default(false)
1867
+ .describe("Quick repair (MyISAM only)"),
1868
+ });
1869
+
1870
+ export const RepairTableSchema = z
1871
+ .preprocess(
1872
+ preprocessAdminTableParams,
1873
+ z.object({
1874
+ tables: z.array(z.string()).optional(),
1875
+ table: z.string().optional(),
1876
+ tableName: z.string().optional(),
1877
+ name: z.string().optional(),
1878
+ quick: z.boolean().optional().default(false),
1879
+ }),
1880
+ )
1881
+ .transform((data) => ({
1882
+ tables: data.tables ?? [],
1883
+ quick: data.quick,
1884
+ }))
1885
+ .refine((data) => data.tables.length > 0, {
1886
+ message: "tables (or table/tableName/name alias) is required",
1887
+ });
1888
+
1306
1889
  // --- FlushTables ---
1307
1890
  export const FlushTablesSchemaBase = z.object({
1308
1891
  tables: z
@@ -1328,6 +1911,15 @@ export const FlushTablesSchema = z
1328
1911
  tables: data.tables,
1329
1912
  }));
1330
1913
 
1914
+ export const KillQuerySchemaBase = z.object({
1915
+ processId: z.number().describe("Process ID to kill"),
1916
+ connection: z
1917
+ .boolean()
1918
+ .optional()
1919
+ .default(false)
1920
+ .describe("Kill connection instead of query"),
1921
+ });
1922
+
1331
1923
  export const KillQuerySchema = z.object({
1332
1924
  processId: z.number().describe("Process ID to kill"),
1333
1925
  connection: z
@@ -1347,7 +1939,6 @@ export const ShowStatusSchema = z.object({
1347
1939
  limit: z
1348
1940
  .number()
1349
1941
  .int()
1350
- .positive()
1351
1942
  .optional()
1352
1943
  .describe(
1353
1944
  "Maximum number of variables to return (default: 100). Set higher to see all.",
@@ -1364,7 +1955,6 @@ export const ShowVariablesSchema = z.object({
1364
1955
  limit: z
1365
1956
  .number()
1366
1957
  .int()
1367
- .positive()
1368
1958
  .optional()
1369
1959
  .describe(
1370
1960
  "Maximum number of variables to return (default: 100). Set higher to see all.",
@@ -1390,12 +1980,20 @@ export const ExportTableSchemaBase = z.object({
1390
1980
  limit: z
1391
1981
  .number()
1392
1982
  .int()
1393
- .positive()
1394
1983
  .optional()
1395
1984
  .default(100)
1396
1985
  .describe(
1397
1986
  "Maximum number of rows to export (default: 100). Set higher to export more rows.",
1398
1987
  ),
1988
+ batch: z
1989
+ .number()
1990
+ .int()
1991
+ .positive()
1992
+ .optional()
1993
+ .default(1)
1994
+ .describe(
1995
+ "Rows per INSERT statement (default: 1). Higher values produce multi-row INSERT ... VALUES (...), (...) for smaller payloads.",
1996
+ ),
1399
1997
  });
1400
1998
 
1401
1999
  export const ExportTableSchema = z
@@ -1409,6 +2007,7 @@ export const ExportTableSchema = z
1409
2007
  where: z.string().optional(),
1410
2008
  filter: z.string().optional(),
1411
2009
  limit: z.number().int().positive().optional().default(100),
2010
+ batch: z.number().int().positive().optional().default(1),
1412
2011
  }),
1413
2012
  )
1414
2013
  .transform((data) => ({
@@ -1416,6 +2015,7 @@ export const ExportTableSchema = z
1416
2015
  format: data.format,
1417
2016
  where: data.where ?? data.filter,
1418
2017
  limit: data.limit,
2018
+ batch: data.batch,
1419
2019
  }))
1420
2020
  .refine((data) => data.table !== "", {
1421
2021
  message: "table (or tableName/name alias) is required",
@@ -1453,11 +2053,24 @@ export const ImportDataSchema = z
1453
2053
  // Replication Schemas
1454
2054
  // =============================================================================
1455
2055
 
2056
+ export const BinlogEventsSchemaBase = z.object({
2057
+ logFile: z.string().optional().describe("Binlog file name"),
2058
+ position: z.number().optional().describe("Starting position"),
2059
+ limit: z
2060
+ .number()
2061
+ .optional()
2062
+ .default(20)
2063
+ .describe(
2064
+ "Maximum events to return (default: 20). Set higher for more events.",
2065
+ ),
2066
+ });
2067
+
1456
2068
  export const BinlogEventsSchema = z.object({
1457
2069
  logFile: z.string().optional().describe("Binlog file name"),
1458
2070
  position: z.number().optional().describe("Starting position"),
1459
2071
  limit: z
1460
2072
  .number()
2073
+ .nonnegative()
1461
2074
  .optional()
1462
2075
  .default(20)
1463
2076
  .describe(