@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
@@ -300,7 +300,7 @@ export const DropTableSchemaBase = z.object({
300
300
  ifExists: z
301
301
  .boolean()
302
302
  .optional()
303
- .default(true)
303
+ .default(false)
304
304
  .describe("Add IF EXISTS clause"),
305
305
  });
306
306
  // Transformed schema for handler parsing
@@ -364,6 +364,11 @@ export const GetIndexesSchema = z
364
364
  // Transaction Schemas
365
365
  // =============================================================================
366
366
  // --- TransactionBegin ---
367
+ // Base schema for MCP visibility
368
+ export const TransactionBeginSchemaBase = z.object({
369
+ isolationLevel: z.string().optional().describe("Transaction isolation level"),
370
+ });
371
+ // Transformed schema for handler parsing
367
372
  export const TransactionBeginSchema = z.preprocess(defaultToEmpty, z.object({
368
373
  isolationLevel: z
369
374
  .enum([
@@ -421,23 +426,27 @@ export const TransactionExecuteSchemaBase = z.object({
421
426
  .optional()
422
427
  .describe("SQL statements to execute atomically"),
423
428
  queries: z.array(z.string()).optional().describe("Alias for statements"),
424
- isolationLevel: z
425
- .enum([
426
- "READ UNCOMMITTED",
427
- "READ COMMITTED",
428
- "REPEATABLE READ",
429
- "SERIALIZABLE",
430
- ])
431
- .optional()
432
- .describe("Transaction isolation level"),
429
+ isolationLevel: z.string().optional().describe("Transaction isolation level"),
433
430
  });
434
- // Transformed schema for handler parsing
435
431
  export const TransactionExecuteSchema = z
436
432
  .preprocess(preprocessTransactionExecuteParams, TransactionExecuteSchemaBase)
437
433
  .transform((data) => ({
438
434
  statements: data.statements ?? data.queries ?? [],
439
435
  isolationLevel: data.isolationLevel,
440
- }));
436
+ }))
437
+ .refine((data) => {
438
+ if (!data.isolationLevel)
439
+ return true;
440
+ const validLevels = [
441
+ "READ UNCOMMITTED",
442
+ "READ COMMITTED",
443
+ "REPEATABLE READ",
444
+ "SERIALIZABLE",
445
+ ];
446
+ return validLevels.includes(data.isolationLevel);
447
+ }, {
448
+ message: "Invalid isolationLevel. Expected one of: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE",
449
+ });
441
450
  // =============================================================================
442
451
  // Preprocess: JSON/Text column params (table, column, where aliases)
443
452
  // =============================================================================
@@ -635,6 +644,333 @@ export const JsonSearchSchema = z
635
644
  .refine((data) => data.column !== "", {
636
645
  message: "column (or col alias) is required",
637
646
  });
647
+ // --- JsonInsert ---
648
+ export const JsonInsertSchemaBase = z.object({
649
+ table: z.string().optional().describe("Table name"),
650
+ tableName: z.string().optional().describe("Alias for table"),
651
+ name: z.string().optional().describe("Alias for table"),
652
+ column: z.string().optional().describe("JSON column name"),
653
+ col: z.string().optional().describe("Alias for column"),
654
+ path: z.string().describe("JSON path to insert at"),
655
+ value: z.unknown().describe("Value to insert"),
656
+ where: z.string().optional().describe("WHERE clause to identify rows"),
657
+ filter: z.string().optional().describe("Alias for where"),
658
+ });
659
+ export const JsonInsertSchema = z
660
+ .preprocess(preprocessJsonColumnParams, z.object({
661
+ table: z.string().optional(),
662
+ tableName: z.string().optional(),
663
+ name: z.string().optional(),
664
+ column: z.string().optional(),
665
+ col: z.string().optional(),
666
+ path: z.string(),
667
+ value: z.unknown(),
668
+ where: z.string().optional(),
669
+ filter: z.string().optional(),
670
+ }))
671
+ .transform((data) => ({
672
+ table: data.table ?? data.tableName ?? data.name ?? "",
673
+ column: data.column ?? data.col ?? "",
674
+ path: data.path,
675
+ value: data.value,
676
+ where: data.where ?? data.filter ?? "",
677
+ }))
678
+ .refine((data) => data.table !== "", {
679
+ message: "table (or tableName/name alias) is required",
680
+ })
681
+ .refine((data) => data.column !== "", {
682
+ message: "column (or col alias) is required",
683
+ })
684
+ .refine((data) => data.where !== "", {
685
+ message: "where (or filter alias) is required",
686
+ });
687
+ // --- JsonReplace ---
688
+ export const JsonReplaceSchemaBase = z.object({
689
+ table: z.string().optional().describe("Table name"),
690
+ tableName: z.string().optional().describe("Alias for table"),
691
+ name: z.string().optional().describe("Alias for table"),
692
+ column: z.string().optional().describe("JSON column name"),
693
+ col: z.string().optional().describe("Alias for column"),
694
+ path: z.string().describe("JSON path to replace"),
695
+ value: z.unknown().describe("Replacement value"),
696
+ where: z.string().optional().describe("WHERE clause to identify rows"),
697
+ filter: z.string().optional().describe("Alias for where"),
698
+ });
699
+ export const JsonReplaceSchema = z
700
+ .preprocess(preprocessJsonColumnParams, z.object({
701
+ table: z.string().optional(),
702
+ tableName: z.string().optional(),
703
+ name: z.string().optional(),
704
+ column: z.string().optional(),
705
+ col: z.string().optional(),
706
+ path: z.string(),
707
+ value: z.unknown(),
708
+ where: z.string().optional(),
709
+ filter: z.string().optional(),
710
+ }))
711
+ .transform((data) => ({
712
+ table: data.table ?? data.tableName ?? data.name ?? "",
713
+ column: data.column ?? data.col ?? "",
714
+ path: data.path,
715
+ value: data.value,
716
+ where: data.where ?? data.filter ?? "",
717
+ }))
718
+ .refine((data) => data.table !== "", {
719
+ message: "table (or tableName/name alias) is required",
720
+ })
721
+ .refine((data) => data.column !== "", {
722
+ message: "column (or col alias) is required",
723
+ })
724
+ .refine((data) => data.where !== "", {
725
+ message: "where (or filter alias) is required",
726
+ });
727
+ // --- JsonRemove ---
728
+ export const JsonRemoveSchemaBase = z.object({
729
+ table: z.string().optional().describe("Table name"),
730
+ tableName: z.string().optional().describe("Alias for table"),
731
+ name: z.string().optional().describe("Alias for table"),
732
+ column: z.string().optional().describe("JSON column name"),
733
+ col: z.string().optional().describe("Alias for column"),
734
+ paths: z.array(z.string()).describe("JSON paths to remove"),
735
+ where: z.string().optional().describe("WHERE clause to identify rows"),
736
+ filter: z.string().optional().describe("Alias for where"),
737
+ });
738
+ export const JsonRemoveSchema = z
739
+ .preprocess(preprocessJsonColumnParams, z.object({
740
+ table: z.string().optional(),
741
+ tableName: z.string().optional(),
742
+ name: z.string().optional(),
743
+ column: z.string().optional(),
744
+ col: z.string().optional(),
745
+ paths: z.array(z.string()),
746
+ where: z.string().optional(),
747
+ filter: z.string().optional(),
748
+ }))
749
+ .transform((data) => ({
750
+ table: data.table ?? data.tableName ?? data.name ?? "",
751
+ column: data.column ?? data.col ?? "",
752
+ paths: data.paths,
753
+ where: data.where ?? data.filter ?? "",
754
+ }))
755
+ .refine((data) => data.table !== "", {
756
+ message: "table (or tableName/name alias) is required",
757
+ })
758
+ .refine((data) => data.column !== "", {
759
+ message: "column (or col alias) is required",
760
+ })
761
+ .refine((data) => data.where !== "", {
762
+ message: "where (or filter alias) is required",
763
+ });
764
+ // --- JsonArrayAppend ---
765
+ export const JsonArrayAppendSchemaBase = z.object({
766
+ table: z.string().optional().describe("Table name"),
767
+ tableName: z.string().optional().describe("Alias for table"),
768
+ name: z.string().optional().describe("Alias for table"),
769
+ column: z.string().optional().describe("JSON column name"),
770
+ col: z.string().optional().describe("Alias for column"),
771
+ path: z.string().describe("JSON path to array"),
772
+ value: z.unknown().describe("Value to append"),
773
+ where: z.string().optional().describe("WHERE clause to identify rows"),
774
+ filter: z.string().optional().describe("Alias for where"),
775
+ });
776
+ export const JsonArrayAppendSchema = z
777
+ .preprocess(preprocessJsonColumnParams, z.object({
778
+ table: z.string().optional(),
779
+ tableName: z.string().optional(),
780
+ name: z.string().optional(),
781
+ column: z.string().optional(),
782
+ col: z.string().optional(),
783
+ path: z.string(),
784
+ value: z.unknown(),
785
+ where: z.string().optional(),
786
+ filter: z.string().optional(),
787
+ }))
788
+ .transform((data) => ({
789
+ table: data.table ?? data.tableName ?? data.name ?? "",
790
+ column: data.column ?? data.col ?? "",
791
+ path: data.path,
792
+ value: data.value,
793
+ where: data.where ?? data.filter ?? "",
794
+ }))
795
+ .refine((data) => data.table !== "", {
796
+ message: "table (or tableName/name alias) is required",
797
+ })
798
+ .refine((data) => data.column !== "", {
799
+ message: "column (or col alias) is required",
800
+ })
801
+ .refine((data) => data.where !== "", {
802
+ message: "where (or filter alias) is required",
803
+ });
804
+ // --- JsonGet ---
805
+ export const JsonGetSchemaBase = z.object({
806
+ table: z.string().optional().describe("Table name"),
807
+ tableName: z.string().optional().describe("Alias for table"),
808
+ name: z.string().optional().describe("Alias for table"),
809
+ column: z.string().optional().describe("JSON column name"),
810
+ col: z.string().optional().describe("Alias for column"),
811
+ path: z.string().describe("JSON path to extract"),
812
+ id: z.union([z.string(), z.number()]).describe("Row ID"),
813
+ idColumn: z.string().default("id").describe("ID column name"),
814
+ });
815
+ export const JsonGetSchema = z
816
+ .preprocess(preprocessJsonColumnParams, z.object({
817
+ table: z.string().optional(),
818
+ tableName: z.string().optional(),
819
+ name: z.string().optional(),
820
+ column: z.string().optional(),
821
+ col: z.string().optional(),
822
+ path: z.string(),
823
+ id: z.union([z.string(), z.number()]),
824
+ idColumn: z.string().default("id"),
825
+ }))
826
+ .transform((data) => ({
827
+ table: data.table ?? data.tableName ?? data.name ?? "",
828
+ column: data.column ?? data.col ?? "",
829
+ path: data.path,
830
+ id: data.id,
831
+ idColumn: data.idColumn,
832
+ }))
833
+ .refine((data) => data.table !== "", {
834
+ message: "table (or tableName/name alias) is required",
835
+ })
836
+ .refine((data) => data.column !== "", {
837
+ message: "column (or col alias) is required",
838
+ });
839
+ // --- JsonUpdate ---
840
+ export const JsonUpdateSchemaBase = z.object({
841
+ table: z.string().optional().describe("Table name"),
842
+ tableName: z.string().optional().describe("Alias for table"),
843
+ name: z.string().optional().describe("Alias for table"),
844
+ column: z.string().optional().describe("JSON column name"),
845
+ col: z.string().optional().describe("Alias for column"),
846
+ path: z.string().describe("JSON path to update"),
847
+ value: z.unknown().describe("New value"),
848
+ id: z.union([z.string(), z.number()]).describe("Row ID"),
849
+ idColumn: z.string().default("id").describe("ID column name"),
850
+ });
851
+ export const JsonUpdateSchema = z
852
+ .preprocess(preprocessJsonColumnParams, z.object({
853
+ table: z.string().optional(),
854
+ tableName: z.string().optional(),
855
+ name: z.string().optional(),
856
+ column: z.string().optional(),
857
+ col: z.string().optional(),
858
+ path: z.string(),
859
+ value: z.unknown(),
860
+ id: z.union([z.string(), z.number()]),
861
+ idColumn: z.string().default("id"),
862
+ }))
863
+ .transform((data) => ({
864
+ table: data.table ?? data.tableName ?? data.name ?? "",
865
+ column: data.column ?? data.col ?? "",
866
+ path: data.path,
867
+ value: data.value,
868
+ id: data.id,
869
+ idColumn: data.idColumn,
870
+ }))
871
+ .refine((data) => data.table !== "", {
872
+ message: "table (or tableName/name alias) is required",
873
+ })
874
+ .refine((data) => data.column !== "", {
875
+ message: "column (or col alias) is required",
876
+ });
877
+ // --- JsonNormalize ---
878
+ export const JsonNormalizeSchemaBase = z.object({
879
+ table: z.string().optional().describe("Table name"),
880
+ tableName: z.string().optional().describe("Alias for table"),
881
+ name: z.string().optional().describe("Alias for table"),
882
+ column: z.string().optional().describe("JSON column name"),
883
+ col: z.string().optional().describe("Alias for column"),
884
+ where: z.string().optional().describe("WHERE clause"),
885
+ filter: z.string().optional().describe("Alias for where"),
886
+ limit: z.number().default(100).describe("Maximum rows to process"),
887
+ });
888
+ export const JsonNormalizeSchema = z
889
+ .preprocess(preprocessJsonColumnParams, z.object({
890
+ table: z.string().optional(),
891
+ tableName: z.string().optional(),
892
+ name: z.string().optional(),
893
+ column: z.string().optional(),
894
+ col: z.string().optional(),
895
+ where: z.string().optional(),
896
+ filter: z.string().optional(),
897
+ limit: z.number().default(100),
898
+ }))
899
+ .transform((data) => ({
900
+ table: data.table ?? data.tableName ?? data.name ?? "",
901
+ column: data.column ?? data.col ?? "",
902
+ where: data.where ?? data.filter,
903
+ limit: data.limit,
904
+ }))
905
+ .refine((data) => data.table !== "", {
906
+ message: "table (or tableName/name alias) is required",
907
+ })
908
+ .refine((data) => data.column !== "", {
909
+ message: "column (or col alias) is required",
910
+ });
911
+ // --- JsonStats ---
912
+ export const JsonStatsSchemaBase = z.object({
913
+ table: z.string().optional().describe("Table name"),
914
+ tableName: z.string().optional().describe("Alias for table"),
915
+ name: z.string().optional().describe("Alias for table"),
916
+ column: z.string().optional().describe("JSON column name"),
917
+ col: z.string().optional().describe("Alias for column"),
918
+ where: z.string().optional().describe("Optional WHERE clause"),
919
+ filter: z.string().optional().describe("Alias for where"),
920
+ sampleSize: z.number().default(1000).describe("Sample size for statistics"),
921
+ });
922
+ export const JsonStatsSchema = z
923
+ .preprocess(preprocessJsonColumnParams, z.object({
924
+ table: z.string().optional(),
925
+ tableName: z.string().optional(),
926
+ name: z.string().optional(),
927
+ column: z.string().optional(),
928
+ col: z.string().optional(),
929
+ where: z.string().optional(),
930
+ filter: z.string().optional(),
931
+ sampleSize: z.number().default(1000),
932
+ }))
933
+ .transform((data) => ({
934
+ table: data.table ?? data.tableName ?? data.name ?? "",
935
+ column: data.column ?? data.col ?? "",
936
+ where: data.where ?? data.filter,
937
+ sampleSize: data.sampleSize,
938
+ }))
939
+ .refine((data) => data.table !== "", {
940
+ message: "table (or tableName/name alias) is required",
941
+ })
942
+ .refine((data) => data.column !== "", {
943
+ message: "column (or col alias) is required",
944
+ });
945
+ // --- JsonIndexSuggest ---
946
+ export const JsonIndexSuggestSchemaBase = z.object({
947
+ table: z.string().optional().describe("Table name"),
948
+ tableName: z.string().optional().describe("Alias for table"),
949
+ name: z.string().optional().describe("Alias for table"),
950
+ column: z.string().optional().describe("JSON column name"),
951
+ col: z.string().optional().describe("Alias for column"),
952
+ sampleSize: z.number().default(100).describe("Sample size to analyze"),
953
+ });
954
+ export const JsonIndexSuggestSchema = z
955
+ .preprocess(preprocessJsonColumnParams, z.object({
956
+ table: z.string().optional(),
957
+ tableName: z.string().optional(),
958
+ name: z.string().optional(),
959
+ column: z.string().optional(),
960
+ col: z.string().optional(),
961
+ sampleSize: z.number().default(100),
962
+ }))
963
+ .transform((data) => ({
964
+ table: data.table ?? data.tableName ?? data.name ?? "",
965
+ column: data.column ?? data.col ?? "",
966
+ sampleSize: data.sampleSize,
967
+ }))
968
+ .refine((data) => data.table !== "", {
969
+ message: "table (or tableName/name alias) is required",
970
+ })
971
+ .refine((data) => data.column !== "", {
972
+ message: "column (or col alias) is required",
973
+ });
638
974
  // --- JsonValidate (no table/column — no aliases needed) ---
639
975
  export const JsonValidateSchema = z.object({
640
976
  value: z.string().describe("JSON string to validate"),
@@ -951,6 +1287,100 @@ export const FulltextSearchSchema = z
951
1287
  .refine((data) => data.query !== "", {
952
1288
  message: "query (or sql alias) is required",
953
1289
  });
1290
+ // --- FulltextDrop ---
1291
+ export const FulltextDropSchemaBase = z.object({
1292
+ table: z.string().optional().describe("Table containing the index"),
1293
+ tableName: z.string().optional().describe("Alias for table"),
1294
+ name: z.string().optional().describe("Alias for table"),
1295
+ indexName: z
1296
+ .string()
1297
+ .optional()
1298
+ .describe("Name of the FULLTEXT index to drop"),
1299
+ });
1300
+ export const FulltextDropSchema = z
1301
+ .preprocess(preprocessTableParams, z.object({
1302
+ table: z.string().optional(),
1303
+ tableName: z.string().optional(),
1304
+ name: z.string().optional(),
1305
+ indexName: z.string().optional(),
1306
+ }))
1307
+ .transform((data) => ({
1308
+ table: data.table ?? data.tableName ?? data.name ?? "",
1309
+ indexName: data.indexName ?? "",
1310
+ }))
1311
+ .refine((data) => data.table !== "", {
1312
+ message: "table (or tableName/name alias) is required",
1313
+ })
1314
+ .refine((data) => data.indexName !== "", {
1315
+ message: "indexName is required",
1316
+ });
1317
+ // --- FulltextBoolean ---
1318
+ export const FulltextBooleanSchemaBase = z.object({
1319
+ table: z.string().optional().describe("Table name"),
1320
+ tableName: z.string().optional().describe("Alias for table"),
1321
+ name: z.string().optional().describe("Alias for table"),
1322
+ columns: z.array(z.string()).optional().describe("Columns to search"),
1323
+ query: z
1324
+ .string()
1325
+ .optional()
1326
+ .describe("Boolean search query with +, -, *, etc."),
1327
+ maxLength: z
1328
+ .number()
1329
+ .optional()
1330
+ .describe("Optional max characters per text column in results. Truncates with '...' if exceeded."),
1331
+ });
1332
+ export const FulltextBooleanSchema = z
1333
+ .preprocess(preprocessTableParams, z.object({
1334
+ table: z.string().optional(),
1335
+ tableName: z.string().optional(),
1336
+ name: z.string().optional(),
1337
+ columns: z.array(z.string()).optional(),
1338
+ query: z.string().optional(),
1339
+ maxLength: z.number().optional(),
1340
+ }))
1341
+ .transform((data) => ({
1342
+ table: data.table ?? data.tableName ?? data.name ?? "",
1343
+ columns: data.columns ?? [],
1344
+ query: data.query ?? "",
1345
+ maxLength: data.maxLength,
1346
+ }))
1347
+ .refine((data) => data.table !== "", {
1348
+ message: "table (or tableName/name alias) is required",
1349
+ })
1350
+ .refine((data) => data.columns.length > 0, { message: "columns is required" })
1351
+ .refine((data) => data.query !== "", { message: "query is required" });
1352
+ // --- FulltextExpand ---
1353
+ export const FulltextExpandSchemaBase = z.object({
1354
+ table: z.string().optional().describe("Table name"),
1355
+ tableName: z.string().optional().describe("Alias for table"),
1356
+ name: z.string().optional().describe("Alias for table"),
1357
+ columns: z.array(z.string()).optional().describe("Columns to search"),
1358
+ query: z.string().optional().describe("Search query to expand"),
1359
+ maxLength: z
1360
+ .number()
1361
+ .optional()
1362
+ .describe("Optional max characters per text column in results. Truncates with '...' if exceeded."),
1363
+ });
1364
+ export const FulltextExpandSchema = z
1365
+ .preprocess(preprocessTableParams, z.object({
1366
+ table: z.string().optional(),
1367
+ tableName: z.string().optional(),
1368
+ name: z.string().optional(),
1369
+ columns: z.array(z.string()).optional(),
1370
+ query: z.string().optional(),
1371
+ maxLength: z.number().optional(),
1372
+ }))
1373
+ .transform((data) => ({
1374
+ table: data.table ?? data.tableName ?? data.name ?? "",
1375
+ columns: data.columns ?? [],
1376
+ query: data.query ?? "",
1377
+ maxLength: data.maxLength,
1378
+ }))
1379
+ .refine((data) => data.table !== "", {
1380
+ message: "table (or tableName/name alias) is required",
1381
+ })
1382
+ .refine((data) => data.columns.length > 0, { message: "columns is required" })
1383
+ .refine((data) => data.query !== "", { message: "query is required" });
954
1384
  // =============================================================================
955
1385
  // Performance Schemas
956
1386
  // =============================================================================
@@ -1012,6 +1442,19 @@ export const SlowQuerySchema = z.object({
1012
1442
  .describe("Number of slow queries to return"),
1013
1443
  minTime: z.number().optional().describe("Minimum query time in seconds"),
1014
1444
  });
1445
+ // --- QueryStats (no table/query aliases — simple passthrough) ---
1446
+ export const QueryStatsSchema = z.object({
1447
+ orderBy: z
1448
+ .enum(["total_time", "avg_time", "executions"])
1449
+ .optional()
1450
+ .default("total_time")
1451
+ .describe("Order results by metric"),
1452
+ limit: z
1453
+ .number()
1454
+ .optional()
1455
+ .default(10)
1456
+ .describe("Maximum number of queries to return"),
1457
+ });
1015
1458
  // --- IndexUsage ---
1016
1459
  export const IndexUsageSchemaBase = z.object({
1017
1460
  table: z.string().optional().describe("Filter by table name"),
@@ -1054,6 +1497,42 @@ export const TableStatsSchema = z
1054
1497
  .refine((data) => data.table !== "", {
1055
1498
  message: "table (or tableName/name alias) is required",
1056
1499
  });
1500
+ // --- IndexRecommendation ---
1501
+ // Base schema for MCP visibility
1502
+ export const IndexRecommendationSchemaBase = z.object({
1503
+ table: z.string().optional().describe("Table to analyze for missing indexes"),
1504
+ tableName: z.string().optional().describe("Alias for table"),
1505
+ name: z.string().optional().describe("Alias for table"),
1506
+ });
1507
+ // Transformed schema for handler parsing
1508
+ export const IndexRecommendationSchema = z
1509
+ .preprocess(preprocessTableParams, IndexRecommendationSchemaBase)
1510
+ .transform((data) => ({
1511
+ table: data.table ?? data.tableName ?? data.name ?? "",
1512
+ }))
1513
+ .refine((data) => data.table !== "", {
1514
+ message: "table (or tableName/name alias) is required",
1515
+ });
1516
+ // --- ForceIndex ---
1517
+ // Base schema for MCP visibility
1518
+ export const ForceIndexSchemaBase = z.object({
1519
+ table: z.string().optional().describe("Table name"),
1520
+ tableName: z.string().optional().describe("Alias for table"),
1521
+ name: z.string().optional().describe("Alias for table"),
1522
+ query: z.string().describe("Original query"),
1523
+ indexName: z.string().describe("Index name to force"),
1524
+ });
1525
+ // Transformed schema for handler parsing
1526
+ export const ForceIndexSchema = z
1527
+ .preprocess(preprocessTableParams, ForceIndexSchemaBase)
1528
+ .transform((data) => ({
1529
+ table: data.table ?? data.tableName ?? data.name ?? "",
1530
+ query: data.query,
1531
+ indexName: data.indexName,
1532
+ }))
1533
+ .refine((data) => data.table !== "", {
1534
+ message: "table (or tableName/name alias) is required",
1535
+ });
1057
1536
  // =============================================================================
1058
1537
  // Preprocess: Admin table params (normalizes singular 'table' to 'tables' array)
1059
1538
  // =============================================================================
@@ -1123,10 +1602,7 @@ export const CheckTableSchemaBase = z.object({
1123
1602
  table: z.string().optional().describe("Single table name (alias for tables)"),
1124
1603
  tableName: z.string().optional().describe("Alias for table"),
1125
1604
  name: z.string().optional().describe("Alias for table"),
1126
- option: z
1127
- .enum(["QUICK", "FAST", "MEDIUM", "EXTENDED", "CHANGED"])
1128
- .optional()
1129
- .describe("Check option"),
1605
+ option: z.string().optional().describe("Check option"),
1130
1606
  });
1131
1607
  export const CheckTableSchema = z
1132
1608
  .preprocess(preprocessAdminTableParams, z.object({
@@ -1145,6 +1621,33 @@ export const CheckTableSchema = z
1145
1621
  .refine((data) => data.tables.length > 0, {
1146
1622
  message: "tables (or table/tableName/name alias) is required",
1147
1623
  });
1624
+ // --- RepairTable ---
1625
+ export const RepairTableSchemaBase = z.object({
1626
+ tables: z.array(z.string()).optional().describe("Table names to repair"),
1627
+ table: z.string().optional().describe("Single table name (alias for tables)"),
1628
+ tableName: z.string().optional().describe("Alias for table"),
1629
+ name: z.string().optional().describe("Alias for table"),
1630
+ quick: z
1631
+ .boolean()
1632
+ .optional()
1633
+ .default(false)
1634
+ .describe("Quick repair (MyISAM only)"),
1635
+ });
1636
+ export const RepairTableSchema = z
1637
+ .preprocess(preprocessAdminTableParams, z.object({
1638
+ tables: z.array(z.string()).optional(),
1639
+ table: z.string().optional(),
1640
+ tableName: z.string().optional(),
1641
+ name: z.string().optional(),
1642
+ quick: z.boolean().optional().default(false),
1643
+ }))
1644
+ .transform((data) => ({
1645
+ tables: data.tables ?? [],
1646
+ quick: data.quick,
1647
+ }))
1648
+ .refine((data) => data.tables.length > 0, {
1649
+ message: "tables (or table/tableName/name alias) is required",
1650
+ });
1148
1651
  // --- FlushTables ---
1149
1652
  export const FlushTablesSchemaBase = z.object({
1150
1653
  tables: z
@@ -1165,6 +1668,14 @@ export const FlushTablesSchema = z
1165
1668
  .transform((data) => ({
1166
1669
  tables: data.tables,
1167
1670
  }));
1671
+ export const KillQuerySchemaBase = z.object({
1672
+ processId: z.number().describe("Process ID to kill"),
1673
+ connection: z
1674
+ .boolean()
1675
+ .optional()
1676
+ .default(false)
1677
+ .describe("Kill connection instead of query"),
1678
+ });
1168
1679
  export const KillQuerySchema = z.object({
1169
1680
  processId: z.number().describe("Process ID to kill"),
1170
1681
  connection: z
@@ -1182,7 +1693,6 @@ export const ShowStatusSchema = z.object({
1182
1693
  limit: z
1183
1694
  .number()
1184
1695
  .int()
1185
- .positive()
1186
1696
  .optional()
1187
1697
  .describe("Maximum number of variables to return (default: 100). Set higher to see all."),
1188
1698
  });
@@ -1196,7 +1706,6 @@ export const ShowVariablesSchema = z.object({
1196
1706
  limit: z
1197
1707
  .number()
1198
1708
  .int()
1199
- .positive()
1200
1709
  .optional()
1201
1710
  .describe("Maximum number of variables to return (default: 100). Set higher to see all."),
1202
1711
  });
@@ -1218,10 +1727,16 @@ export const ExportTableSchemaBase = z.object({
1218
1727
  limit: z
1219
1728
  .number()
1220
1729
  .int()
1221
- .positive()
1222
1730
  .optional()
1223
1731
  .default(100)
1224
1732
  .describe("Maximum number of rows to export (default: 100). Set higher to export more rows."),
1733
+ batch: z
1734
+ .number()
1735
+ .int()
1736
+ .positive()
1737
+ .optional()
1738
+ .default(1)
1739
+ .describe("Rows per INSERT statement (default: 1). Higher values produce multi-row INSERT ... VALUES (...), (...) for smaller payloads."),
1225
1740
  });
1226
1741
  export const ExportTableSchema = z
1227
1742
  .preprocess(preprocessTableParams, z.object({
@@ -1232,12 +1747,14 @@ export const ExportTableSchema = z
1232
1747
  where: z.string().optional(),
1233
1748
  filter: z.string().optional(),
1234
1749
  limit: z.number().int().positive().optional().default(100),
1750
+ batch: z.number().int().positive().optional().default(1),
1235
1751
  }))
1236
1752
  .transform((data) => ({
1237
1753
  table: data.table ?? data.tableName ?? data.name ?? "",
1238
1754
  format: data.format,
1239
1755
  where: data.where ?? data.filter,
1240
1756
  limit: data.limit,
1757
+ batch: data.batch,
1241
1758
  }))
1242
1759
  .refine((data) => data.table !== "", {
1243
1760
  message: "table (or tableName/name alias) is required",
@@ -1268,11 +1785,21 @@ export const ImportDataSchema = z
1268
1785
  // =============================================================================
1269
1786
  // Replication Schemas
1270
1787
  // =============================================================================
1788
+ export const BinlogEventsSchemaBase = z.object({
1789
+ logFile: z.string().optional().describe("Binlog file name"),
1790
+ position: z.number().optional().describe("Starting position"),
1791
+ limit: z
1792
+ .number()
1793
+ .optional()
1794
+ .default(20)
1795
+ .describe("Maximum events to return (default: 20). Set higher for more events."),
1796
+ });
1271
1797
  export const BinlogEventsSchema = z.object({
1272
1798
  logFile: z.string().optional().describe("Binlog file name"),
1273
1799
  position: z.number().optional().describe("Starting position"),
1274
1800
  limit: z
1275
1801
  .number()
1802
+ .nonnegative()
1276
1803
  .optional()
1277
1804
  .default(20)
1278
1805
  .describe("Maximum events to return (default: 20). Set higher for more events."),