@neverinfamous/mysql-mcp 2.1.0 → 2.3.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 (802) hide show
  1. package/.env.example +14 -4
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +7 -1
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +6 -1
  4. package/.github/dependabot.yml +15 -0
  5. package/.github/pull_request_template.md +5 -0
  6. package/.github/workflows/codeql.yml +41 -42
  7. package/.github/workflows/docker-publish.yml +247 -210
  8. package/.github/workflows/publish-npm.yml +16 -6
  9. package/CHANGELOG.md +357 -22
  10. package/CODE_MODE.md +245 -0
  11. package/CODE_OF_CONDUCT.md +2 -0
  12. package/DOCKER_README.md +250 -161
  13. package/Dockerfile +2 -2
  14. package/README.md +239 -182
  15. package/SECURITY.md +0 -8
  16. package/VERSION +1 -1
  17. package/dist/__tests__/mocks/adapter.d.ts +3 -3
  18. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  19. package/dist/__tests__/mocks/adapter.js +51 -35
  20. package/dist/__tests__/mocks/adapter.js.map +1 -1
  21. package/dist/__tests__/mocks/index.d.ts +4 -4
  22. package/dist/__tests__/mocks/index.d.ts.map +1 -1
  23. package/dist/__tests__/mocks/index.js +2 -2
  24. package/dist/__tests__/mocks/index.js.map +1 -1
  25. package/dist/__tests__/mocks/mysql.d.ts +2 -2
  26. package/dist/__tests__/mocks/mysql.d.ts.map +1 -1
  27. package/dist/__tests__/mocks/mysql.js +14 -14
  28. package/dist/__tests__/mocks/mysql.js.map +1 -1
  29. package/dist/__tests__/setup.d.ts.map +1 -1
  30. package/dist/__tests__/setup.js +7 -7
  31. package/dist/__tests__/setup.js.map +1 -1
  32. package/dist/adapters/DatabaseAdapter.d.ts +2 -2
  33. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  34. package/dist/adapters/DatabaseAdapter.js +69 -40
  35. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  36. package/dist/adapters/mysql/MySQLAdapter.d.ts +14 -4
  37. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  38. package/dist/adapters/mysql/MySQLAdapter.js +152 -116
  39. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  40. package/dist/adapters/mysql/SchemaManager.d.ts +1 -1
  41. package/dist/adapters/mysql/SchemaManager.d.ts.map +1 -1
  42. package/dist/adapters/mysql/SchemaManager.js +76 -56
  43. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  44. package/dist/adapters/mysql/index.d.ts +2 -2
  45. package/dist/adapters/mysql/index.js +2 -2
  46. package/dist/adapters/mysql/prompts/backupStrategy.d.ts +1 -1
  47. package/dist/adapters/mysql/prompts/backupStrategy.d.ts.map +1 -1
  48. package/dist/adapters/mysql/prompts/backupStrategy.js +21 -9
  49. package/dist/adapters/mysql/prompts/backupStrategy.js.map +1 -1
  50. package/dist/adapters/mysql/prompts/clusterSetup.d.ts +1 -1
  51. package/dist/adapters/mysql/prompts/clusterSetup.d.ts.map +1 -1
  52. package/dist/adapters/mysql/prompts/clusterSetup.js +3 -3
  53. package/dist/adapters/mysql/prompts/clusterSetup.js.map +1 -1
  54. package/dist/adapters/mysql/prompts/docstoreSetup.d.ts +1 -1
  55. package/dist/adapters/mysql/prompts/docstoreSetup.js +3 -3
  56. package/dist/adapters/mysql/prompts/docstoreSetup.js.map +1 -1
  57. package/dist/adapters/mysql/prompts/eventScheduler.d.ts +1 -1
  58. package/dist/adapters/mysql/prompts/eventScheduler.js +3 -3
  59. package/dist/adapters/mysql/prompts/eventScheduler.js.map +1 -1
  60. package/dist/adapters/mysql/prompts/healthCheck.d.ts +1 -1
  61. package/dist/adapters/mysql/prompts/healthCheck.d.ts.map +1 -1
  62. package/dist/adapters/mysql/prompts/healthCheck.js +10 -6
  63. package/dist/adapters/mysql/prompts/healthCheck.js.map +1 -1
  64. package/dist/adapters/mysql/prompts/index.d.ts +10 -3
  65. package/dist/adapters/mysql/prompts/index.d.ts.map +1 -1
  66. package/dist/adapters/mysql/prompts/index.js +106 -63
  67. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  68. package/dist/adapters/mysql/prompts/indexTuning.d.ts +1 -1
  69. package/dist/adapters/mysql/prompts/indexTuning.d.ts.map +1 -1
  70. package/dist/adapters/mysql/prompts/indexTuning.js +11 -7
  71. package/dist/adapters/mysql/prompts/indexTuning.js.map +1 -1
  72. package/dist/adapters/mysql/prompts/mysqlshSetup.d.ts +1 -1
  73. package/dist/adapters/mysql/prompts/mysqlshSetup.js +4 -4
  74. package/dist/adapters/mysql/prompts/mysqlshSetup.js.map +1 -1
  75. package/dist/adapters/mysql/prompts/proxysqlSetup.d.ts +1 -1
  76. package/dist/adapters/mysql/prompts/proxysqlSetup.js +3 -3
  77. package/dist/adapters/mysql/prompts/proxysqlSetup.js.map +1 -1
  78. package/dist/adapters/mysql/prompts/replicationSetup.d.ts +1 -1
  79. package/dist/adapters/mysql/prompts/replicationSetup.d.ts.map +1 -1
  80. package/dist/adapters/mysql/prompts/replicationSetup.js +13 -7
  81. package/dist/adapters/mysql/prompts/replicationSetup.js.map +1 -1
  82. package/dist/adapters/mysql/prompts/routerSetup.d.ts +1 -1
  83. package/dist/adapters/mysql/prompts/routerSetup.d.ts.map +1 -1
  84. package/dist/adapters/mysql/prompts/routerSetup.js +8 -3
  85. package/dist/adapters/mysql/prompts/routerSetup.js.map +1 -1
  86. package/dist/adapters/mysql/prompts/spatialSetup.d.ts +1 -1
  87. package/dist/adapters/mysql/prompts/spatialSetup.js +3 -3
  88. package/dist/adapters/mysql/prompts/spatialSetup.js.map +1 -1
  89. package/dist/adapters/mysql/prompts/sysSchema.d.ts +1 -1
  90. package/dist/adapters/mysql/prompts/sysSchema.d.ts.map +1 -1
  91. package/dist/adapters/mysql/prompts/sysSchema.js +3 -3
  92. package/dist/adapters/mysql/prompts/sysSchema.js.map +1 -1
  93. package/dist/adapters/mysql/resources/capabilities.d.ts +2 -2
  94. package/dist/adapters/mysql/resources/capabilities.d.ts.map +1 -1
  95. package/dist/adapters/mysql/resources/capabilities.js +19 -16
  96. package/dist/adapters/mysql/resources/capabilities.js.map +1 -1
  97. package/dist/adapters/mysql/resources/cluster.d.ts +2 -2
  98. package/dist/adapters/mysql/resources/cluster.d.ts.map +1 -1
  99. package/dist/adapters/mysql/resources/cluster.js +17 -15
  100. package/dist/adapters/mysql/resources/cluster.js.map +1 -1
  101. package/dist/adapters/mysql/resources/docstore.d.ts +2 -2
  102. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  103. package/dist/adapters/mysql/resources/docstore.js +12 -12
  104. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  105. package/dist/adapters/mysql/resources/events.d.ts +2 -2
  106. package/dist/adapters/mysql/resources/events.d.ts.map +1 -1
  107. package/dist/adapters/mysql/resources/events.js +12 -12
  108. package/dist/adapters/mysql/resources/events.js.map +1 -1
  109. package/dist/adapters/mysql/resources/health.d.ts +2 -2
  110. package/dist/adapters/mysql/resources/health.d.ts.map +1 -1
  111. package/dist/adapters/mysql/resources/health.js +36 -32
  112. package/dist/adapters/mysql/resources/health.js.map +1 -1
  113. package/dist/adapters/mysql/resources/index.d.ts +11 -3
  114. package/dist/adapters/mysql/resources/index.d.ts.map +1 -1
  115. package/dist/adapters/mysql/resources/index.js +28 -20
  116. package/dist/adapters/mysql/resources/index.js.map +1 -1
  117. package/dist/adapters/mysql/resources/indexes.d.ts +2 -2
  118. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  119. package/dist/adapters/mysql/resources/indexes.js +12 -12
  120. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  121. package/dist/adapters/mysql/resources/innodb.d.ts +2 -2
  122. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  123. package/dist/adapters/mysql/resources/innodb.js +37 -36
  124. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  125. package/dist/adapters/mysql/resources/locks.d.ts +2 -2
  126. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  127. package/dist/adapters/mysql/resources/locks.js +14 -14
  128. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  129. package/dist/adapters/mysql/resources/performance.d.ts +2 -2
  130. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  131. package/dist/adapters/mysql/resources/performance.js +30 -29
  132. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  133. package/dist/adapters/mysql/resources/pool.d.ts +2 -2
  134. package/dist/adapters/mysql/resources/pool.d.ts.map +1 -1
  135. package/dist/adapters/mysql/resources/pool.js +9 -9
  136. package/dist/adapters/mysql/resources/pool.js.map +1 -1
  137. package/dist/adapters/mysql/resources/processlist.d.ts +2 -2
  138. package/dist/adapters/mysql/resources/processlist.d.ts.map +1 -1
  139. package/dist/adapters/mysql/resources/processlist.js +9 -9
  140. package/dist/adapters/mysql/resources/processlist.js.map +1 -1
  141. package/dist/adapters/mysql/resources/replication.d.ts +2 -2
  142. package/dist/adapters/mysql/resources/replication.d.ts.map +1 -1
  143. package/dist/adapters/mysql/resources/replication.js +42 -35
  144. package/dist/adapters/mysql/resources/replication.js.map +1 -1
  145. package/dist/adapters/mysql/resources/schema.d.ts +2 -2
  146. package/dist/adapters/mysql/resources/schema.d.ts.map +1 -1
  147. package/dist/adapters/mysql/resources/schema.js +8 -8
  148. package/dist/adapters/mysql/resources/schema.js.map +1 -1
  149. package/dist/adapters/mysql/resources/spatial.d.ts +2 -2
  150. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  151. package/dist/adapters/mysql/resources/spatial.js +9 -9
  152. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  153. package/dist/adapters/mysql/resources/status.d.ts +2 -2
  154. package/dist/adapters/mysql/resources/status.d.ts.map +1 -1
  155. package/dist/adapters/mysql/resources/status.js +10 -10
  156. package/dist/adapters/mysql/resources/status.js.map +1 -1
  157. package/dist/adapters/mysql/resources/sysschema.d.ts +2 -2
  158. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  159. package/dist/adapters/mysql/resources/sysschema.js +10 -10
  160. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  161. package/dist/adapters/mysql/resources/tables.d.ts +2 -2
  162. package/dist/adapters/mysql/resources/tables.d.ts.map +1 -1
  163. package/dist/adapters/mysql/resources/tables.js +8 -8
  164. package/dist/adapters/mysql/resources/tables.js.map +1 -1
  165. package/dist/adapters/mysql/resources/variables.d.ts +2 -2
  166. package/dist/adapters/mysql/resources/variables.d.ts.map +1 -1
  167. package/dist/adapters/mysql/resources/variables.js +10 -10
  168. package/dist/adapters/mysql/resources/variables.js.map +1 -1
  169. package/dist/adapters/mysql/tools/admin/backup.d.ts +2 -2
  170. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  171. package/dist/adapters/mysql/tools/admin/backup.js +193 -101
  172. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  173. package/dist/adapters/mysql/tools/admin/index.d.ts +2 -2
  174. package/dist/adapters/mysql/tools/admin/index.js +6 -6
  175. package/dist/adapters/mysql/tools/admin/index.js.map +1 -1
  176. package/dist/adapters/mysql/tools/admin/maintenance.d.ts +2 -2
  177. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  178. package/dist/adapters/mysql/tools/admin/maintenance.js +97 -66
  179. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  180. package/dist/adapters/mysql/tools/admin/monitoring.d.ts +2 -2
  181. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  182. package/dist/adapters/mysql/tools/admin/monitoring.js +215 -79
  183. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  184. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts +2 -2
  185. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  186. package/dist/adapters/mysql/tools/cluster/group-replication.js +90 -74
  187. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  188. package/dist/adapters/mysql/tools/cluster/index.d.ts +2 -2
  189. package/dist/adapters/mysql/tools/cluster/index.js +3 -3
  190. package/dist/adapters/mysql/tools/cluster/index.js.map +1 -1
  191. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts +2 -2
  192. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  193. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +225 -97
  194. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  195. package/dist/adapters/mysql/tools/codemode/index.d.ts +38 -0
  196. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -0
  197. package/dist/adapters/mysql/tools/codemode/index.js +203 -0
  198. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -0
  199. package/dist/adapters/mysql/tools/core.d.ts +2 -2
  200. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  201. package/dist/adapters/mysql/tools/core.js +234 -114
  202. package/dist/adapters/mysql/tools/core.js.map +1 -1
  203. package/dist/adapters/mysql/tools/docstore.d.ts +2 -2
  204. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  205. package/dist/adapters/mysql/tools/docstore.js +252 -117
  206. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  207. package/dist/adapters/mysql/tools/events.d.ts +2 -2
  208. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  209. package/dist/adapters/mysql/tools/events.js +236 -113
  210. package/dist/adapters/mysql/tools/events.js.map +1 -1
  211. package/dist/adapters/mysql/tools/index.d.ts +19 -19
  212. package/dist/adapters/mysql/tools/index.d.ts.map +1 -1
  213. package/dist/adapters/mysql/tools/index.js +19 -19
  214. package/dist/adapters/mysql/tools/index.js.map +1 -1
  215. package/dist/adapters/mysql/tools/json/core.d.ts +2 -2
  216. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  217. package/dist/adapters/mysql/tools/json/core.js +225 -131
  218. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  219. package/dist/adapters/mysql/tools/json/enhanced.d.ts +2 -2
  220. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  221. package/dist/adapters/mysql/tools/json/enhanced.js +274 -163
  222. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  223. package/dist/adapters/mysql/tools/json/helpers.d.ts +2 -2
  224. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  225. package/dist/adapters/mysql/tools/json/helpers.js +141 -57
  226. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  227. package/dist/adapters/mysql/tools/json/index.d.ts +2 -2
  228. package/dist/adapters/mysql/tools/json/index.js +6 -6
  229. package/dist/adapters/mysql/tools/json/index.js.map +1 -1
  230. package/dist/adapters/mysql/tools/partitioning.d.ts +2 -2
  231. package/dist/adapters/mysql/tools/partitioning.d.ts.map +1 -1
  232. package/dist/adapters/mysql/tools/partitioning.js +180 -64
  233. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  234. package/dist/adapters/mysql/tools/performance/analysis.d.ts +2 -2
  235. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  236. package/dist/adapters/mysql/tools/performance/analysis.js +184 -101
  237. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  238. package/dist/adapters/mysql/tools/performance/index.d.ts +2 -2
  239. package/dist/adapters/mysql/tools/performance/index.js +4 -4
  240. package/dist/adapters/mysql/tools/performance/index.js.map +1 -1
  241. package/dist/adapters/mysql/tools/performance/optimization.d.ts +3 -3
  242. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  243. package/dist/adapters/mysql/tools/performance/optimization.js +229 -77
  244. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  245. package/dist/adapters/mysql/tools/proxysql.d.ts +2 -2
  246. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  247. package/dist/adapters/mysql/tools/proxysql.js +213 -125
  248. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  249. package/dist/adapters/mysql/tools/replication.d.ts +2 -2
  250. package/dist/adapters/mysql/tools/replication.d.ts.map +1 -1
  251. package/dist/adapters/mysql/tools/replication.js +117 -66
  252. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  253. package/dist/adapters/mysql/tools/roles.d.ts +2 -2
  254. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  255. package/dist/adapters/mysql/tools/roles.js +276 -84
  256. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  257. package/dist/adapters/mysql/tools/router.d.ts +2 -2
  258. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  259. package/dist/adapters/mysql/tools/router.js +174 -109
  260. package/dist/adapters/mysql/tools/router.js.map +1 -1
  261. package/dist/adapters/mysql/tools/schema/constraints.d.ts +2 -2
  262. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  263. package/dist/adapters/mysql/tools/schema/constraints.js +24 -15
  264. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  265. package/dist/adapters/mysql/tools/schema/index.d.ts +2 -2
  266. package/dist/adapters/mysql/tools/schema/index.d.ts.map +1 -1
  267. package/dist/adapters/mysql/tools/schema/index.js +7 -7
  268. package/dist/adapters/mysql/tools/schema/index.js.map +1 -1
  269. package/dist/adapters/mysql/tools/schema/management.d.ts +2 -2
  270. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  271. package/dist/adapters/mysql/tools/schema/management.js +99 -42
  272. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  273. package/dist/adapters/mysql/tools/schema/routines.d.ts +2 -2
  274. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  275. package/dist/adapters/mysql/tools/schema/routines.js +36 -19
  276. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  277. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts +2 -2
  278. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  279. package/dist/adapters/mysql/tools/schema/scheduled_events.js +26 -13
  280. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  281. package/dist/adapters/mysql/tools/schema/triggers.d.ts +2 -2
  282. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  283. package/dist/adapters/mysql/tools/schema/triggers.js +24 -13
  284. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  285. package/dist/adapters/mysql/tools/schema/views.d.ts +2 -2
  286. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  287. package/dist/adapters/mysql/tools/schema/views.js +59 -28
  288. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  289. package/dist/adapters/mysql/tools/security/audit.d.ts +2 -2
  290. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  291. package/dist/adapters/mysql/tools/security/audit.js +61 -55
  292. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  293. package/dist/adapters/mysql/tools/security/data-protection.d.ts +2 -2
  294. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  295. package/dist/adapters/mysql/tools/security/data-protection.js +193 -80
  296. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  297. package/dist/adapters/mysql/tools/security/encryption.d.ts +2 -2
  298. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  299. package/dist/adapters/mysql/tools/security/encryption.js +86 -67
  300. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  301. package/dist/adapters/mysql/tools/security/index.d.ts +2 -2
  302. package/dist/adapters/mysql/tools/security/index.js +4 -4
  303. package/dist/adapters/mysql/tools/security/index.js.map +1 -1
  304. package/dist/adapters/mysql/tools/shell/backup.d.ts +1 -1
  305. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  306. package/dist/adapters/mysql/tools/shell/backup.js +122 -63
  307. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  308. package/dist/adapters/mysql/tools/shell/common.d.ts.map +1 -1
  309. package/dist/adapters/mysql/tools/shell/common.js +61 -37
  310. package/dist/adapters/mysql/tools/shell/common.js.map +1 -1
  311. package/dist/adapters/mysql/tools/shell/data-transfer.d.ts +1 -1
  312. package/dist/adapters/mysql/tools/shell/data-transfer.d.ts.map +1 -1
  313. package/dist/adapters/mysql/tools/shell/data-transfer.js +125 -69
  314. package/dist/adapters/mysql/tools/shell/data-transfer.js.map +1 -1
  315. package/dist/adapters/mysql/tools/shell/index.d.ts +2 -2
  316. package/dist/adapters/mysql/tools/shell/index.js +6 -6
  317. package/dist/adapters/mysql/tools/shell/index.js.map +1 -1
  318. package/dist/adapters/mysql/tools/shell/info.d.ts +1 -1
  319. package/dist/adapters/mysql/tools/shell/info.d.ts.map +1 -1
  320. package/dist/adapters/mysql/tools/shell/info.js +12 -12
  321. package/dist/adapters/mysql/tools/shell/info.js.map +1 -1
  322. package/dist/adapters/mysql/tools/shell/restore.d.ts +1 -1
  323. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  324. package/dist/adapters/mysql/tools/shell/restore.js +128 -43
  325. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  326. package/dist/adapters/mysql/tools/shell/utilities.d.ts +1 -1
  327. package/dist/adapters/mysql/tools/shell/utilities.d.ts.map +1 -1
  328. package/dist/adapters/mysql/tools/shell/utilities.js +42 -18
  329. package/dist/adapters/mysql/tools/shell/utilities.js.map +1 -1
  330. package/dist/adapters/mysql/tools/spatial/geometry.d.ts +2 -2
  331. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  332. package/dist/adapters/mysql/tools/spatial/geometry.js +85 -46
  333. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  334. package/dist/adapters/mysql/tools/spatial/index.d.ts +2 -2
  335. package/dist/adapters/mysql/tools/spatial/index.js +5 -5
  336. package/dist/adapters/mysql/tools/spatial/index.js.map +1 -1
  337. package/dist/adapters/mysql/tools/spatial/operations.d.ts +2 -2
  338. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  339. package/dist/adapters/mysql/tools/spatial/operations.js +175 -106
  340. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  341. package/dist/adapters/mysql/tools/spatial/queries.d.ts +2 -2
  342. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  343. package/dist/adapters/mysql/tools/spatial/queries.js +144 -100
  344. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  345. package/dist/adapters/mysql/tools/spatial/setup.d.ts +2 -2
  346. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  347. package/dist/adapters/mysql/tools/spatial/setup.js +122 -34
  348. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  349. package/dist/adapters/mysql/tools/stats/comparative.d.ts +2 -2
  350. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  351. package/dist/adapters/mysql/tools/stats/comparative.js +159 -107
  352. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  353. package/dist/adapters/mysql/tools/stats/descriptive.d.ts +2 -2
  354. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  355. package/dist/adapters/mysql/tools/stats/descriptive.js +268 -205
  356. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  357. package/dist/adapters/mysql/tools/stats/index.d.ts +2 -2
  358. package/dist/adapters/mysql/tools/stats/index.js +3 -3
  359. package/dist/adapters/mysql/tools/stats/index.js.map +1 -1
  360. package/dist/adapters/mysql/tools/sysschema/activity.d.ts +2 -2
  361. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  362. package/dist/adapters/mysql/tools/sysschema/activity.js +23 -23
  363. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  364. package/dist/adapters/mysql/tools/sysschema/index.d.ts +2 -2
  365. package/dist/adapters/mysql/tools/sysschema/index.js +4 -4
  366. package/dist/adapters/mysql/tools/sysschema/index.js.map +1 -1
  367. package/dist/adapters/mysql/tools/sysschema/performance.d.ts +2 -2
  368. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  369. package/dist/adapters/mysql/tools/sysschema/performance.js +58 -43
  370. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  371. package/dist/adapters/mysql/tools/sysschema/resources.d.ts +2 -2
  372. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  373. package/dist/adapters/mysql/tools/sysschema/resources.js +58 -33
  374. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  375. package/dist/adapters/mysql/tools/text/fulltext.d.ts +4 -3
  376. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  377. package/dist/adapters/mysql/tools/text/fulltext.js +214 -55
  378. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  379. package/dist/adapters/mysql/tools/text/index.d.ts +3 -3
  380. package/dist/adapters/mysql/tools/text/index.d.ts.map +1 -1
  381. package/dist/adapters/mysql/tools/text/index.js +6 -5
  382. package/dist/adapters/mysql/tools/text/index.js.map +1 -1
  383. package/dist/adapters/mysql/tools/text/processing.d.ts +2 -2
  384. package/dist/adapters/mysql/tools/text/processing.d.ts.map +1 -1
  385. package/dist/adapters/mysql/tools/text/processing.js +175 -122
  386. package/dist/adapters/mysql/tools/text/processing.js.map +1 -1
  387. package/dist/adapters/mysql/tools/transactions.d.ts +2 -2
  388. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  389. package/dist/adapters/mysql/tools/transactions.js +162 -85
  390. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  391. package/dist/adapters/mysql/types/proxysql-types.d.ts +7 -2
  392. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  393. package/dist/adapters/mysql/types/proxysql-types.js +52 -30
  394. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  395. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  396. package/dist/adapters/mysql/types/router-types.js +17 -17
  397. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  398. package/dist/adapters/mysql/types/shell-types.d.ts +1 -2
  399. package/dist/adapters/mysql/types/shell-types.d.ts.map +1 -1
  400. package/dist/adapters/mysql/types/shell-types.js +255 -82
  401. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  402. package/dist/adapters/mysql/types.d.ts +976 -80
  403. package/dist/adapters/mysql/types.d.ts.map +1 -1
  404. package/dist/adapters/mysql/types.js +1317 -170
  405. package/dist/adapters/mysql/types.js.map +1 -1
  406. package/dist/auth/AuthorizationServerDiscovery.d.ts +1 -1
  407. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -1
  408. package/dist/auth/AuthorizationServerDiscovery.js +16 -14
  409. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -1
  410. package/dist/auth/OAuthResourceServer.d.ts +1 -1
  411. package/dist/auth/OAuthResourceServer.d.ts.map +1 -1
  412. package/dist/auth/OAuthResourceServer.js +4 -4
  413. package/dist/auth/OAuthResourceServer.js.map +1 -1
  414. package/dist/auth/TokenValidator.d.ts +1 -1
  415. package/dist/auth/TokenValidator.d.ts.map +1 -1
  416. package/dist/auth/TokenValidator.js +30 -20
  417. package/dist/auth/TokenValidator.js.map +1 -1
  418. package/dist/auth/errors.d.ts.map +1 -1
  419. package/dist/auth/errors.js +24 -24
  420. package/dist/auth/errors.js.map +1 -1
  421. package/dist/auth/index.d.ts +7 -7
  422. package/dist/auth/index.d.ts.map +1 -1
  423. package/dist/auth/index.js +6 -6
  424. package/dist/auth/index.js.map +1 -1
  425. package/dist/auth/middleware.d.ts +2 -2
  426. package/dist/auth/middleware.d.ts.map +1 -1
  427. package/dist/auth/middleware.js +28 -24
  428. package/dist/auth/middleware.js.map +1 -1
  429. package/dist/auth/scopes.d.ts +2 -2
  430. package/dist/auth/scopes.d.ts.map +1 -1
  431. package/dist/auth/scopes.js +23 -16
  432. package/dist/auth/scopes.js.map +1 -1
  433. package/dist/auth/types.d.ts +2 -2
  434. package/dist/auth/types.d.ts.map +1 -1
  435. package/dist/cli/args.d.ts +1 -1
  436. package/dist/cli/args.d.ts.map +1 -1
  437. package/dist/cli/args.js +82 -68
  438. package/dist/cli/args.js.map +1 -1
  439. package/dist/cli.d.ts +1 -1
  440. package/dist/cli.d.ts.map +1 -1
  441. package/dist/cli.js +44 -34
  442. package/dist/cli.js.map +1 -1
  443. package/dist/codemode/api.d.ts +69 -0
  444. package/dist/codemode/api.d.ts.map +1 -0
  445. package/dist/codemode/api.js +1035 -0
  446. package/dist/codemode/api.js.map +1 -0
  447. package/dist/codemode/index.d.ts +13 -0
  448. package/dist/codemode/index.d.ts.map +1 -0
  449. package/dist/codemode/index.js +17 -0
  450. package/dist/codemode/index.js.map +1 -0
  451. package/dist/codemode/sandbox-factory.d.ts +72 -0
  452. package/dist/codemode/sandbox-factory.d.ts.map +1 -0
  453. package/dist/codemode/sandbox-factory.js +88 -0
  454. package/dist/codemode/sandbox-factory.js.map +1 -0
  455. package/dist/codemode/sandbox.d.ts +96 -0
  456. package/dist/codemode/sandbox.d.ts.map +1 -0
  457. package/dist/codemode/sandbox.js +345 -0
  458. package/dist/codemode/sandbox.js.map +1 -0
  459. package/dist/codemode/security.d.ts +44 -0
  460. package/dist/codemode/security.d.ts.map +1 -0
  461. package/dist/codemode/security.js +149 -0
  462. package/dist/codemode/security.js.map +1 -0
  463. package/dist/codemode/types.d.ts +137 -0
  464. package/dist/codemode/types.d.ts.map +1 -0
  465. package/dist/codemode/types.js +46 -0
  466. package/dist/codemode/types.js.map +1 -0
  467. package/dist/codemode/worker-sandbox.d.ts +82 -0
  468. package/dist/codemode/worker-sandbox.d.ts.map +1 -0
  469. package/dist/codemode/worker-sandbox.js +244 -0
  470. package/dist/codemode/worker-sandbox.js.map +1 -0
  471. package/dist/codemode/worker-script.d.ts +8 -0
  472. package/dist/codemode/worker-script.d.ts.map +1 -0
  473. package/dist/codemode/worker-script.js +113 -0
  474. package/dist/codemode/worker-script.js.map +1 -0
  475. package/dist/constants/ServerInstructions.d.ts +2 -2
  476. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  477. package/dist/constants/ServerInstructions.js +252 -36
  478. package/dist/constants/ServerInstructions.js.map +1 -1
  479. package/dist/filtering/ToolConstants.d.ts +12 -12
  480. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  481. package/dist/filtering/ToolConstants.js +253 -214
  482. package/dist/filtering/ToolConstants.js.map +1 -1
  483. package/dist/filtering/ToolFilter.d.ts +2 -2
  484. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  485. package/dist/filtering/ToolFilter.js +47 -36
  486. package/dist/filtering/ToolFilter.js.map +1 -1
  487. package/dist/index.d.ts +9 -9
  488. package/dist/index.d.ts.map +1 -1
  489. package/dist/index.js +7 -7
  490. package/dist/index.js.map +1 -1
  491. package/dist/logging/McpLogging.d.ts +2 -2
  492. package/dist/logging/McpLogging.d.ts.map +1 -1
  493. package/dist/logging/McpLogging.js +16 -13
  494. package/dist/logging/McpLogging.js.map +1 -1
  495. package/dist/logging/index.d.ts +1 -1
  496. package/dist/logging/index.js +1 -1
  497. package/dist/pool/ConnectionPool.d.ts +3 -3
  498. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  499. package/dist/pool/ConnectionPool.js +30 -26
  500. package/dist/pool/ConnectionPool.js.map +1 -1
  501. package/dist/progress/ProgressReporter.d.ts +1 -1
  502. package/dist/progress/ProgressReporter.d.ts.map +1 -1
  503. package/dist/progress/ProgressReporter.js +5 -5
  504. package/dist/progress/ProgressReporter.js.map +1 -1
  505. package/dist/progress/index.d.ts +1 -1
  506. package/dist/progress/index.d.ts.map +1 -1
  507. package/dist/progress/index.js +1 -1
  508. package/dist/progress/index.js.map +1 -1
  509. package/dist/server/McpServer.d.ts +3 -3
  510. package/dist/server/McpServer.d.ts.map +1 -1
  511. package/dist/server/McpServer.js +58 -53
  512. package/dist/server/McpServer.js.map +1 -1
  513. package/dist/transports/http.d.ts +3 -3
  514. package/dist/transports/http.d.ts.map +1 -1
  515. package/dist/transports/http.js +36 -33
  516. package/dist/transports/http.js.map +1 -1
  517. package/dist/transports/index.d.ts +1 -1
  518. package/dist/transports/index.d.ts.map +1 -1
  519. package/dist/transports/index.js +1 -1
  520. package/dist/transports/index.js.map +1 -1
  521. package/dist/types/index.d.ts +6 -6
  522. package/dist/types/index.d.ts.map +1 -1
  523. package/dist/types/index.js +1 -1
  524. package/dist/types/index.js.map +1 -1
  525. package/dist/types/modules/database.d.ts +1 -1
  526. package/dist/types/modules/database.d.ts.map +1 -1
  527. package/dist/types/modules/errors.d.ts.map +1 -1
  528. package/dist/types/modules/errors.js +15 -15
  529. package/dist/types/modules/errors.js.map +1 -1
  530. package/dist/types/modules/oauth.d.ts +1 -1
  531. package/dist/types/modules/oauth.d.ts.map +1 -1
  532. package/dist/types/modules/query.d.ts +8 -8
  533. package/dist/types/modules/query.d.ts.map +1 -1
  534. package/dist/types/modules/server.d.ts +5 -3
  535. package/dist/types/modules/server.d.ts.map +1 -1
  536. package/dist/types/modules/tools.d.ts +6 -6
  537. package/dist/types/modules/tools.d.ts.map +1 -1
  538. package/dist/utils/logger.d.ts +2 -2
  539. package/dist/utils/logger.d.ts.map +1 -1
  540. package/dist/utils/logger.js +58 -55
  541. package/dist/utils/logger.js.map +1 -1
  542. package/dist/utils/promptGenerator.d.ts +1 -1
  543. package/dist/utils/promptGenerator.d.ts.map +1 -1
  544. package/dist/utils/promptGenerator.js +24 -16
  545. package/dist/utils/promptGenerator.js.map +1 -1
  546. package/dist/utils/validators.d.ts +21 -2
  547. package/dist/utils/validators.d.ts.map +1 -1
  548. package/dist/utils/validators.js +101 -13
  549. package/dist/utils/validators.js.map +1 -1
  550. package/eslint.config.js +117 -81
  551. package/package.json +66 -64
  552. package/releases/release-notes.md +32 -26
  553. package/releases/v2.0.0-release-notes.md +99 -51
  554. package/releases/v2.1.0-release-notes.md +14 -5
  555. package/releases/v2.2.0-release-notes.md +239 -0
  556. package/releases/v2.3.0-release-notes.md +191 -0
  557. package/server.json +1 -1
  558. package/src/__tests__/cli.test.ts +302 -247
  559. package/src/__tests__/index.test.ts +21 -21
  560. package/src/__tests__/mocks/adapter.ts +204 -163
  561. package/src/__tests__/mocks/index.ts +30 -23
  562. package/src/__tests__/mocks/mysql.ts +94 -84
  563. package/src/__tests__/perf.test.ts +207 -203
  564. package/src/__tests__/performance.test.ts +173 -164
  565. package/src/__tests__/setup.ts +26 -21
  566. package/src/adapters/DatabaseAdapter.ts +386 -340
  567. package/src/adapters/__tests__/DatabaseAdapter.test.ts +455 -377
  568. package/src/adapters/mysql/MySQLAdapter.ts +560 -486
  569. package/src/adapters/mysql/SchemaManager.ts +251 -208
  570. package/src/adapters/mysql/__tests__/MySQLAdapter.integration.test.ts +150 -147
  571. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +590 -477
  572. package/src/adapters/mysql/__tests__/SchemaManager.test.ts +196 -154
  573. package/src/adapters/mysql/index.ts +2 -2
  574. package/src/adapters/mysql/prompts/__tests__/indexTuning.test.ts +33 -26
  575. package/src/adapters/mysql/prompts/__tests__/prompts.test.ts +277 -239
  576. package/src/adapters/mysql/prompts/backupStrategy.ts +29 -17
  577. package/src/adapters/mysql/prompts/clusterSetup.ts +11 -10
  578. package/src/adapters/mysql/prompts/docstoreSetup.ts +10 -10
  579. package/src/adapters/mysql/prompts/eventScheduler.ts +10 -10
  580. package/src/adapters/mysql/prompts/healthCheck.ts +20 -15
  581. package/src/adapters/mysql/prompts/index.ts +202 -145
  582. package/src/adapters/mysql/prompts/indexTuning.ts +22 -17
  583. package/src/adapters/mysql/prompts/mysqlshSetup.ts +11 -11
  584. package/src/adapters/mysql/prompts/proxysqlSetup.ts +10 -10
  585. package/src/adapters/mysql/prompts/replicationSetup.ts +24 -16
  586. package/src/adapters/mysql/prompts/routerSetup.ts +15 -10
  587. package/src/adapters/mysql/prompts/spatialSetup.ts +10 -10
  588. package/src/adapters/mysql/prompts/sysSchema.ts +11 -10
  589. package/src/adapters/mysql/resources/__tests__/capabilities.test.ts +118 -47
  590. package/src/adapters/mysql/resources/__tests__/cluster.test.ts +163 -104
  591. package/src/adapters/mysql/resources/__tests__/docstore.test.ts +88 -81
  592. package/src/adapters/mysql/resources/__tests__/events.test.ts +94 -83
  593. package/src/adapters/mysql/resources/__tests__/health.test.ts +131 -91
  594. package/src/adapters/mysql/resources/__tests__/indexes.test.ts +125 -102
  595. package/src/adapters/mysql/resources/__tests__/innodb.test.ts +86 -62
  596. package/src/adapters/mysql/resources/__tests__/locks.test.ts +142 -104
  597. package/src/adapters/mysql/resources/__tests__/performance.test.ts +81 -58
  598. package/src/adapters/mysql/resources/__tests__/pool.test.ts +45 -40
  599. package/src/adapters/mysql/resources/__tests__/processlist.test.ts +39 -23
  600. package/src/adapters/mysql/resources/__tests__/replication.test.ts +265 -211
  601. package/src/adapters/mysql/resources/__tests__/resources.test.ts +121 -109
  602. package/src/adapters/mysql/resources/__tests__/schema.test.ts +29 -23
  603. package/src/adapters/mysql/resources/__tests__/spatial.test.ts +58 -45
  604. package/src/adapters/mysql/resources/__tests__/status.test.ts +62 -45
  605. package/src/adapters/mysql/resources/__tests__/sysschema.test.ts +99 -60
  606. package/src/adapters/mysql/resources/__tests__/tables.test.ts +41 -32
  607. package/src/adapters/mysql/resources/__tests__/variables.test.ts +77 -49
  608. package/src/adapters/mysql/resources/capabilities.ts +61 -42
  609. package/src/adapters/mysql/resources/cluster.ts +58 -49
  610. package/src/adapters/mysql/resources/docstore.ts +46 -41
  611. package/src/adapters/mysql/resources/events.ts +37 -31
  612. package/src/adapters/mysql/resources/health.ts +98 -74
  613. package/src/adapters/mysql/resources/index.ts +55 -47
  614. package/src/adapters/mysql/resources/indexes.ts +66 -51
  615. package/src/adapters/mysql/resources/innodb.ts +98 -81
  616. package/src/adapters/mysql/resources/locks.ts +43 -40
  617. package/src/adapters/mysql/resources/performance.ts +80 -67
  618. package/src/adapters/mysql/resources/pool.ts +23 -20
  619. package/src/adapters/mysql/resources/processlist.ts +23 -18
  620. package/src/adapters/mysql/resources/replication.ts +124 -105
  621. package/src/adapters/mysql/resources/schema.ts +23 -18
  622. package/src/adapters/mysql/resources/spatial.ts +31 -26
  623. package/src/adapters/mysql/resources/status.ts +27 -22
  624. package/src/adapters/mysql/resources/sysschema.ts +41 -36
  625. package/src/adapters/mysql/resources/tables.ts +23 -18
  626. package/src/adapters/mysql/resources/variables.ts +27 -22
  627. package/src/adapters/mysql/tools/__tests__/cluster.test.ts +419 -311
  628. package/src/adapters/mysql/tools/__tests__/core.test.ts +701 -382
  629. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +782 -413
  630. package/src/adapters/mysql/tools/__tests__/events.test.ts +806 -486
  631. package/src/adapters/mysql/tools/__tests__/json_core.test.ts +326 -259
  632. package/src/adapters/mysql/tools/__tests__/json_enhanced.test.ts +452 -352
  633. package/src/adapters/mysql/tools/__tests__/json_helpers.test.ts +203 -128
  634. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +576 -340
  635. package/src/adapters/mysql/tools/__tests__/replication.test.ts +796 -390
  636. package/src/adapters/mysql/tools/__tests__/roles.test.ts +423 -166
  637. package/src/adapters/mysql/tools/__tests__/router.test.ts +644 -540
  638. package/src/adapters/mysql/tools/__tests__/security.test.ts +746 -421
  639. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +246 -173
  640. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +244 -205
  641. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +443 -298
  642. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +535 -150
  643. package/src/adapters/mysql/tools/__tests__/stats.test.ts +861 -553
  644. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +452 -263
  645. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +612 -372
  646. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +550 -257
  647. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +549 -352
  648. package/src/adapters/mysql/tools/admin/backup.ts +339 -215
  649. package/src/adapters/mysql/tools/admin/index.ts +46 -46
  650. package/src/adapters/mysql/tools/admin/maintenance.ts +180 -130
  651. package/src/adapters/mysql/tools/admin/monitoring.ts +373 -199
  652. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +200 -186
  653. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +399 -95
  654. package/src/adapters/mysql/tools/cluster/group-replication.ts +218 -183
  655. package/src/adapters/mysql/tools/cluster/index.ts +27 -27
  656. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +413 -251
  657. package/src/adapters/mysql/tools/codemode/index.ts +249 -0
  658. package/src/adapters/mysql/tools/core.ts +425 -285
  659. package/src/adapters/mysql/tools/docstore.ts +478 -276
  660. package/src/adapters/mysql/tools/events.ts +441 -285
  661. package/src/adapters/mysql/tools/index.ts +31 -20
  662. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +456 -199
  663. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +554 -298
  664. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +195 -74
  665. package/src/adapters/mysql/tools/json/__tests__/validation.test.ts +106 -72
  666. package/src/adapters/mysql/tools/json/core.ts +368 -263
  667. package/src/adapters/mysql/tools/json/enhanced.ts +368 -229
  668. package/src/adapters/mysql/tools/json/helpers.ts +205 -113
  669. package/src/adapters/mysql/tools/json/index.ts +46 -46
  670. package/src/adapters/mysql/tools/partitioning.ts +289 -140
  671. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +664 -249
  672. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +436 -179
  673. package/src/adapters/mysql/tools/performance/analysis.ts +319 -215
  674. package/src/adapters/mysql/tools/performance/index.ts +33 -33
  675. package/src/adapters/mysql/tools/performance/optimization.ts +438 -183
  676. package/src/adapters/mysql/tools/proxysql.ts +462 -320
  677. package/src/adapters/mysql/tools/replication.ts +233 -180
  678. package/src/adapters/mysql/tools/roles.ts +429 -171
  679. package/src/adapters/mysql/tools/router.ts +410 -292
  680. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +157 -82
  681. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +226 -101
  682. package/src/adapters/mysql/tools/schema/__tests__/routines.test.ts +80 -35
  683. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +59 -40
  684. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +65 -40
  685. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +146 -77
  686. package/src/adapters/mysql/tools/schema/constraints.ts +61 -42
  687. package/src/adapters/mysql/tools/schema/index.ts +26 -35
  688. package/src/adapters/mysql/tools/schema/management.ts +167 -94
  689. package/src/adapters/mysql/tools/schema/routines.ts +79 -48
  690. package/src/adapters/mysql/tools/schema/scheduled_events.ts +53 -32
  691. package/src/adapters/mysql/tools/schema/triggers.ts +51 -33
  692. package/src/adapters/mysql/tools/schema/views.ts +96 -53
  693. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +216 -158
  694. package/src/adapters/mysql/tools/security/__tests__/data-protection.test.ts +154 -98
  695. package/src/adapters/mysql/tools/security/__tests__/encryption.test.ts +174 -138
  696. package/src/adapters/mysql/tools/security/audit.ts +213 -193
  697. package/src/adapters/mysql/tools/security/data-protection.ts +342 -198
  698. package/src/adapters/mysql/tools/security/encryption.ts +233 -193
  699. package/src/adapters/mysql/tools/security/index.ts +26 -26
  700. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +443 -283
  701. package/src/adapters/mysql/tools/shell/__tests__/common.test.ts +183 -130
  702. package/src/adapters/mysql/tools/shell/__tests__/data-transfer.test.ts +516 -353
  703. package/src/adapters/mysql/tools/shell/__tests__/info.test.ts +65 -63
  704. package/src/adapters/mysql/tools/shell/__tests__/restore.test.ts +260 -174
  705. package/src/adapters/mysql/tools/shell/__tests__/utilities.test.ts +161 -143
  706. package/src/adapters/mysql/tools/shell/backup.ts +280 -188
  707. package/src/adapters/mysql/tools/shell/common.ts +203 -153
  708. package/src/adapters/mysql/tools/shell/data-transfer.ts +286 -200
  709. package/src/adapters/mysql/tools/shell/index.ts +29 -29
  710. package/src/adapters/mysql/tools/shell/info.ts +35 -31
  711. package/src/adapters/mysql/tools/shell/restore.ts +236 -121
  712. package/src/adapters/mysql/tools/shell/utilities.ts +86 -45
  713. package/src/adapters/mysql/tools/spatial/__tests__/geometry.test.ts +129 -89
  714. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +284 -148
  715. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +340 -245
  716. package/src/adapters/mysql/tools/spatial/geometry.ts +120 -74
  717. package/src/adapters/mysql/tools/spatial/index.ts +33 -33
  718. package/src/adapters/mysql/tools/spatial/operations.ts +254 -171
  719. package/src/adapters/mysql/tools/spatial/queries.ts +221 -165
  720. package/src/adapters/mysql/tools/spatial/setup.ts +180 -73
  721. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +188 -130
  722. package/src/adapters/mysql/tools/stats/comparative.ts +261 -187
  723. package/src/adapters/mysql/tools/stats/descriptive.ts +414 -322
  724. package/src/adapters/mysql/tools/stats/index.ts +23 -23
  725. package/src/adapters/mysql/tools/sysschema/__tests__/activity.test.ts +99 -71
  726. package/src/adapters/mysql/tools/sysschema/__tests__/io_summary_fix.test.ts +21 -18
  727. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +149 -108
  728. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +243 -104
  729. package/src/adapters/mysql/tools/sysschema/activity.ts +72 -64
  730. package/src/adapters/mysql/tools/sysschema/index.ts +24 -24
  731. package/src/adapters/mysql/tools/sysschema/performance.ts +140 -115
  732. package/src/adapters/mysql/tools/sysschema/resources.ts +140 -99
  733. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +526 -145
  734. package/src/adapters/mysql/tools/text/__tests__/processing.test.ts +452 -193
  735. package/src/adapters/mysql/tools/text/fulltext.ts +327 -123
  736. package/src/adapters/mysql/tools/text/index.ts +32 -30
  737. package/src/adapters/mysql/tools/text/processing.ts +281 -212
  738. package/src/adapters/mysql/tools/transactions.ts +288 -197
  739. package/src/adapters/mysql/types/__tests__/shell-types.test.ts +204 -202
  740. package/src/adapters/mysql/types/proxysql-types.ts +142 -109
  741. package/src/adapters/mysql/types/router-types.ts +36 -36
  742. package/src/adapters/mysql/types/shell-types.ts +280 -94
  743. package/src/adapters/mysql/types.ts +1475 -164
  744. package/src/auth/AuthorizationServerDiscovery.ts +127 -113
  745. package/src/auth/OAuthResourceServer.ts +67 -62
  746. package/src/auth/TokenValidator.ts +136 -119
  747. package/src/auth/__tests__/AuthorizationServerDiscovery.test.ts +295 -274
  748. package/src/auth/__tests__/OAuthResourceServer.test.ts +180 -169
  749. package/src/auth/__tests__/TokenValidator.test.ts +297 -285
  750. package/src/auth/__tests__/errors.test.ts +180 -175
  751. package/src/auth/__tests__/middleware.test.ts +281 -247
  752. package/src/auth/__tests__/scopes.test.ts +136 -134
  753. package/src/auth/errors.ts +56 -56
  754. package/src/auth/index.ts +23 -17
  755. package/src/auth/middleware.ts +161 -139
  756. package/src/auth/scopes.ts +134 -107
  757. package/src/auth/types.ts +155 -155
  758. package/src/cli/__tests__/args.test.ts +241 -216
  759. package/src/cli/__tests__/main.test.ts +191 -158
  760. package/src/cli/args.ts +285 -258
  761. package/src/cli.ts +150 -127
  762. package/src/codemode/api.ts +1224 -0
  763. package/src/codemode/index.ts +51 -0
  764. package/src/codemode/sandbox-factory.ts +146 -0
  765. package/src/codemode/sandbox.ts +450 -0
  766. package/src/codemode/security.ts +188 -0
  767. package/src/codemode/types.ts +194 -0
  768. package/src/codemode/worker-sandbox.ts +326 -0
  769. package/src/codemode/worker-script.ts +144 -0
  770. package/src/constants/ServerInstructions.ts +295 -70
  771. package/src/filtering/ToolConstants.ts +311 -272
  772. package/src/filtering/ToolFilter.ts +254 -220
  773. package/src/filtering/__tests__/ToolFilter.test.ts +469 -396
  774. package/src/index.ts +62 -57
  775. package/src/logging/McpLogging.ts +128 -119
  776. package/src/logging/__tests__/McpLogging.test.ts +223 -223
  777. package/src/logging/index.ts +2 -2
  778. package/src/pool/ConnectionPool.ts +260 -246
  779. package/src/pool/__tests__/ConnectionPool.test.ts +452 -418
  780. package/src/progress/ProgressReporter.ts +123 -123
  781. package/src/progress/__tests__/ProgressReporter.test.ts +235 -229
  782. package/src/progress/index.ts +6 -2
  783. package/src/server/McpServer.ts +305 -285
  784. package/src/server/__tests__/McpServer.test.ts +333 -291
  785. package/src/transports/__tests__/http.test.ts +658 -527
  786. package/src/transports/http.ts +237 -203
  787. package/src/transports/index.ts +6 -2
  788. package/src/types/__tests__/types.test.ts +197 -193
  789. package/src/types/index.ts +49 -37
  790. package/src/types/modules/database.ts +65 -63
  791. package/src/types/modules/errors.ts +41 -37
  792. package/src/types/modules/oauth.ts +46 -46
  793. package/src/types/modules/query.ts +75 -75
  794. package/src/types/modules/server.ts +21 -18
  795. package/src/types/modules/tools.ts +182 -178
  796. package/src/utils/__tests__/logger.test.ts +424 -414
  797. package/src/utils/__tests__/validators.test.ts +250 -165
  798. package/src/utils/logger.ts +344 -330
  799. package/src/utils/promptGenerator.ts +58 -47
  800. package/src/utils/validators.ts +217 -91
  801. package/tsconfig.json +41 -50
  802. package/vitest.config.ts +23 -23
@@ -1,56 +1,76 @@
1
1
  /**
2
2
  * MySQL Document Store / X DevAPI Tools
3
- *
3
+ *
4
4
  * Tools for working with JSON document collections.
5
5
  * 9 tools total.
6
6
  */
7
7
 
8
- import { z } from 'zod';
9
- import type { MySQLAdapter } from '../MySQLAdapter.js';
10
- import type { ToolDefinition, RequestContext } from '../../../types/index.js';
8
+ import { z } from "zod";
9
+ import type { MySQLAdapter } from "../MySQLAdapter.js";
10
+ import type { ToolDefinition, RequestContext } from "../../../types/index.js";
11
11
 
12
12
  const ListCollectionsSchema = z.object({
13
- schema: z.string().optional().describe('Schema name (defaults to current)')
13
+ schema: z.string().optional().describe("Schema name (defaults to current)"),
14
14
  });
15
15
 
16
16
  const CreateCollectionSchema = z.object({
17
- name: z.string().describe('Collection name'),
18
- schema: z.string().optional(),
19
- validation: z.object({
20
- schema: z.record(z.string(), z.unknown()).optional().describe('JSON schema'),
21
- level: z.enum(['OFF', 'STRICT', 'MODERATE']).default('OFF').describe('Validation level')
22
- }).optional().describe('Validation config')
17
+ name: z.string().describe("Collection name"),
18
+ schema: z.string().optional(),
19
+ ifNotExists: z.boolean().default(false).describe("Add IF NOT EXISTS clause"),
20
+ validation: z
21
+ .object({
22
+ schema: z
23
+ .record(z.string(), z.unknown())
24
+ .optional()
25
+ .describe("JSON schema"),
26
+ level: z
27
+ .enum(["OFF", "STRICT", "MODERATE"])
28
+ .default("OFF")
29
+ .describe("Validation level"),
30
+ })
31
+ .optional()
32
+ .describe("Validation config"),
23
33
  });
24
34
 
25
35
  const DropCollectionSchema = z.object({
26
- name: z.string(),
27
- schema: z.string().optional(),
28
- ifExists: z.boolean().default(true)
36
+ name: z.string(),
37
+ schema: z.string().optional(),
38
+ ifExists: z.boolean().default(true),
29
39
  });
30
40
 
31
41
  const FindSchema = z.object({
32
- collection: z.string(),
33
- filter: z.string().optional().describe('JSON path expression filter'),
34
- fields: z.array(z.string()).optional(),
35
- limit: z.number().default(100),
36
- offset: z.number().default(0)
42
+ collection: z.string(),
43
+ filter: z.string().optional().describe("JSON path expression filter"),
44
+ fields: z.array(z.string()).optional(),
45
+ limit: z.number().default(100),
46
+ offset: z.number().default(0),
37
47
  });
38
48
 
39
49
  const AddDocSchema = z.object({
40
- collection: z.string(),
41
- documents: z.array(z.record(z.string(), z.unknown())).describe('Documents to add')
50
+ collection: z.string(),
51
+ documents: z
52
+ .array(z.record(z.string(), z.unknown()))
53
+ .describe("Documents to add"),
42
54
  });
43
55
 
44
56
  const ModifyDocSchema = z.object({
45
- collection: z.string(),
46
- filter: z.string().describe('Filter: JSON path for existence ($.name) OR _id value for specific document'),
47
- set: z.record(z.string(), z.unknown()).optional().describe('Fields to set'),
48
- unset: z.array(z.string()).optional()
57
+ collection: z.string(),
58
+ filter: z
59
+ .string()
60
+ .describe(
61
+ "Filter: JSON path for existence ($.name) OR _id value for specific document",
62
+ ),
63
+ set: z.record(z.string(), z.unknown()).optional().describe("Fields to set"),
64
+ unset: z.array(z.string()).optional(),
49
65
  });
50
66
 
51
67
  const RemoveDocSchema = z.object({
52
- collection: z.string(),
53
- filter: z.string().describe('Filter: JSON path for existence ($.name) OR _id value for specific document')
68
+ collection: z.string(),
69
+ filter: z
70
+ .string()
71
+ .describe(
72
+ "Filter: JSON path for existence ($.name) OR _id value for specific document",
73
+ ),
54
74
  });
55
75
 
56
76
  /**
@@ -61,65 +81,98 @@ const RemoveDocSchema = z.object({
61
81
  * - Field equality: name=Alice, age=30
62
82
  */
63
83
  function parseDocFilter(filter: string): { where: string; params: unknown[] } {
64
- // Check if it's a direct _id (32-char hex)
65
- if (/^[a-f0-9]{32}$/i.test(filter)) {
66
- return { where: '_id = ?', params: [filter] };
67
- }
68
-
69
- // Check for simple field=value pattern
70
- const eqMatch = /^([a-zA-Z_][a-zA-Z0-9_]*)=(.+)$/.exec(filter);
71
- if (eqMatch) {
72
- const [, field, value] = eqMatch;
73
- // Try to parse as number
74
- const numVal = Number(value);
75
- if (!isNaN(numVal)) {
76
- return {
77
- where: `JSON_UNQUOTE(JSON_EXTRACT(doc, '$.${field}')) = ?`,
78
- params: [String(numVal)]
79
- };
80
- }
81
- return {
82
- where: `JSON_UNQUOTE(JSON_EXTRACT(doc, '$.${field}')) = ?`,
83
- params: [value]
84
- };
85
- }
86
-
87
- // Default: treat as JSON path existence check
88
- if (!filter.startsWith('$')) {
89
- throw new Error(`Invalid filter: "${filter}". Use JSON path ($.field), _id value, or field=value format.`);
84
+ // Check if it's a direct _id (32-char hex)
85
+ if (/^[a-f0-9]{32}$/i.test(filter)) {
86
+ return { where: "_id = ?", params: [filter] };
87
+ }
88
+
89
+ // Check for simple field=value pattern
90
+ const eqMatch = /^([a-zA-Z_][a-zA-Z0-9_]*)=(.+)$/.exec(filter);
91
+ if (eqMatch) {
92
+ const [, field, value] = eqMatch;
93
+ // Try to parse as number
94
+ const numVal = Number(value);
95
+ if (!isNaN(numVal)) {
96
+ return {
97
+ where: `JSON_UNQUOTE(JSON_EXTRACT(doc, '$.${field}')) = ?`,
98
+ params: [String(numVal)],
99
+ };
90
100
  }
91
- return { where: `JSON_EXTRACT(doc, '${filter}') IS NOT NULL`, params: [] };
101
+ return {
102
+ where: `JSON_UNQUOTE(JSON_EXTRACT(doc, '$.${field}')) = ?`,
103
+ params: [value],
104
+ };
105
+ }
106
+
107
+ // Default: treat as JSON path existence check
108
+ if (!filter.startsWith("$")) {
109
+ throw new Error(
110
+ `Invalid filter: "${filter}". Use JSON path ($.field), _id value, or field=value format.`,
111
+ );
112
+ }
113
+ return { where: `JSON_EXTRACT(doc, '${filter}') IS NOT NULL`, params: [] };
92
114
  }
93
115
 
94
116
  const CreateDocIndexSchema = z.object({
95
- collection: z.string(),
96
- name: z.string(),
97
- fields: z.array(z.object({
98
- path: z.string(),
99
- type: z.enum(['TEXT', 'INT', 'DOUBLE', 'DATE', 'DATETIME', 'GEOJSON']).default('TEXT'),
100
- required: z.boolean().default(false)
101
- })),
102
- unique: z.boolean().default(false)
117
+ collection: z.string(),
118
+ name: z.string(),
119
+ fields: z.array(
120
+ z.object({
121
+ path: z.string(),
122
+ type: z
123
+ .enum(["TEXT", "INT", "DOUBLE", "DATE", "DATETIME", "GEOJSON"])
124
+ .default("TEXT"),
125
+ required: z.boolean().default(false),
126
+ }),
127
+ ),
128
+ unique: z.boolean().default(false),
103
129
  });
104
130
 
105
131
  const CollectionInfoSchema = z.object({
106
- collection: z.string(),
107
- schema: z.string().optional()
132
+ collection: z.string(),
133
+ schema: z.string().optional(),
108
134
  });
109
135
 
136
+ /**
137
+ * Check if a collection (table) exists in the current database.
138
+ */
139
+ async function checkCollectionExists(
140
+ adapter: MySQLAdapter,
141
+ collection: string,
142
+ ): Promise<boolean> {
143
+ const result = await adapter.executeQuery(
144
+ `SELECT 1 FROM information_schema.TABLES
145
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,
146
+ [collection],
147
+ );
148
+ return (result.rows?.length ?? 0) > 0;
149
+ }
150
+
110
151
  export function getDocStoreTools(adapter: MySQLAdapter): ToolDefinition[] {
111
- return [
112
- {
113
- name: 'mysql_doc_list_collections',
114
- title: 'MySQL List Collections',
115
- description: 'List JSON document collections in a schema.',
116
- group: 'docstore',
117
- inputSchema: ListCollectionsSchema,
118
- requiredScopes: ['read'],
119
- annotations: { readOnlyHint: true, idempotentHint: true },
120
- handler: async (params: unknown, _context: RequestContext) => {
121
- const { schema } = ListCollectionsSchema.parse(params);
122
- const query = `
152
+ return [
153
+ {
154
+ name: "mysql_doc_list_collections",
155
+ title: "MySQL List Collections",
156
+ description: "List JSON document collections in a schema.",
157
+ group: "docstore",
158
+ inputSchema: ListCollectionsSchema,
159
+ requiredScopes: ["read"],
160
+ annotations: { readOnlyHint: true, idempotentHint: true },
161
+ handler: async (params: unknown, _context: RequestContext) => {
162
+ const { schema } = ListCollectionsSchema.parse(params);
163
+
164
+ // P154: Schema existence check when explicitly provided
165
+ if (schema) {
166
+ const schemaCheck = await adapter.executeQuery(
167
+ "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?",
168
+ [schema],
169
+ );
170
+ if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
171
+ return { exists: false, schema };
172
+ }
173
+ }
174
+
175
+ const query = `
123
176
  SELECT TABLE_NAME as name, TABLE_COMMENT as comment, TABLE_ROWS as rowCount
124
177
  FROM information_schema.TABLES
125
178
  WHERE TABLE_SCHEMA = COALESCE(?, DATABASE())
@@ -128,219 +181,368 @@ export function getDocStoreTools(adapter: MySQLAdapter): ToolDefinition[] {
128
181
  WHERE COLUMN_NAME = 'doc' AND DATA_TYPE = 'json'
129
182
  AND TABLE_SCHEMA = COALESCE(?, DATABASE())
130
183
  )`;
131
- const result = await adapter.executeQuery(query, [schema ?? null, schema ?? null]);
132
- return { collections: result.rows ?? [], count: result.rows?.length ?? 0 };
133
- }
134
- },
135
- {
136
- name: 'mysql_doc_create_collection',
137
- title: 'MySQL Create Collection',
138
- description: 'Create a new JSON document collection.',
139
- group: 'docstore',
140
- inputSchema: CreateCollectionSchema,
141
- requiredScopes: ['write'],
142
- annotations: { readOnlyHint: false },
143
- handler: async (params: unknown, _context: RequestContext) => {
144
- const { name, validation } = CreateCollectionSchema.parse(params);
145
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) throw new Error('Invalid collection name');
146
-
147
- let sql = `CREATE TABLE \`${name}\` (
184
+ const result = await adapter.executeQuery(query, [
185
+ schema ?? null,
186
+ schema ?? null,
187
+ ]);
188
+ return {
189
+ collections: result.rows ?? [],
190
+ count: result.rows?.length ?? 0,
191
+ };
192
+ },
193
+ },
194
+ {
195
+ name: "mysql_doc_create_collection",
196
+ title: "MySQL Create Collection",
197
+ description: "Create a new JSON document collection.",
198
+ group: "docstore",
199
+ inputSchema: CreateCollectionSchema,
200
+ requiredScopes: ["write"],
201
+ annotations: { readOnlyHint: false },
202
+ handler: async (params: unknown, _context: RequestContext) => {
203
+ const { name, ifNotExists, validation } =
204
+ CreateCollectionSchema.parse(params);
205
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name))
206
+ throw new Error("Invalid collection name");
207
+
208
+ const createClause = ifNotExists
209
+ ? "CREATE TABLE IF NOT EXISTS"
210
+ : "CREATE TABLE";
211
+
212
+ let sql = `${createClause} \`${name}\` (
148
213
  doc JSON,
149
214
  _id VARBINARY(32) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) STORED PRIMARY KEY,
150
215
  _json_schema JSON GENERATED ALWAYS AS ('{}') VIRTUAL
151
216
  ) ENGINE=InnoDB`;
152
217
 
153
- if (validation?.level && validation.level !== 'OFF') {
154
- const schemaJson = JSON.stringify(validation.schema ?? {});
155
- sql = `CREATE TABLE \`${name}\` (
218
+ if (validation?.level && validation.level !== "OFF") {
219
+ const schemaJson = JSON.stringify(validation.schema ?? {});
220
+ sql = `${createClause} \`${name}\` (
156
221
  doc JSON,
157
222
  _id VARBINARY(32) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) STORED PRIMARY KEY,
158
223
  CONSTRAINT chk_schema CHECK (JSON_SCHEMA_VALID('${schemaJson}', doc))
159
224
  ) ENGINE=InnoDB`;
160
- }
161
-
162
- await adapter.executeQuery(sql);
163
- return { success: true, collection: name };
164
- }
165
- },
166
- {
167
- name: 'mysql_doc_drop_collection',
168
- title: 'MySQL Drop Collection',
169
- description: 'Drop a document collection.',
170
- group: 'docstore',
171
- inputSchema: DropCollectionSchema,
172
- requiredScopes: ['admin'],
173
- annotations: { readOnlyHint: false, destructiveHint: true },
174
- handler: async (params: unknown, _context: RequestContext) => {
175
- const { name, ifExists } = DropCollectionSchema.parse(params);
176
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) throw new Error('Invalid collection name');
177
- await adapter.executeQuery(`DROP TABLE ${ifExists ? 'IF EXISTS ' : ''}\`${name}\``);
178
- return { success: true, collection: name };
179
- }
180
- },
181
- {
182
- name: 'mysql_doc_find',
183
- title: 'MySQL Find Documents',
184
- description: 'Query documents in a collection.',
185
- group: 'docstore',
186
- inputSchema: FindSchema,
187
- requiredScopes: ['read'],
188
- annotations: { readOnlyHint: true, idempotentHint: true },
189
- handler: async (params: unknown, _context: RequestContext) => {
190
- const { collection, filter, fields, limit, offset } = FindSchema.parse(params);
191
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection)) throw new Error('Invalid collection name');
192
-
193
- let selectClause = 'doc';
194
- if (fields && fields.length > 0) {
195
- selectClause = 'JSON_OBJECT(' + fields.map(f => `'${f}', JSON_EXTRACT(doc, '$.${f}')`).join(', ') + ') as doc';
196
- }
197
-
198
- let query = `SELECT ${selectClause} FROM \`${collection}\``;
199
- if (filter) query += ` WHERE JSON_EXTRACT(doc, '${filter}') IS NOT NULL`;
200
- query += ` LIMIT ${String(limit)} OFFSET ${String(offset)}`;
201
-
202
- const result = await adapter.executeQuery(query);
203
- const docs = (result.rows ?? []).map(r => {
204
- const row = r;
205
- const docValue = row['doc'];
206
- return typeof docValue === 'string' ? JSON.parse(docValue) as Record<string, unknown> : docValue;
207
- });
208
- return { documents: docs, count: docs.length };
209
- }
210
- },
211
- {
212
- name: 'mysql_doc_add',
213
- title: 'MySQL Add Documents',
214
- description: 'Add documents to a collection.',
215
- group: 'docstore',
216
- inputSchema: AddDocSchema,
217
- requiredScopes: ['write'],
218
- annotations: { readOnlyHint: false },
219
- handler: async (params: unknown, _context: RequestContext) => {
220
- const { collection, documents } = AddDocSchema.parse(params);
221
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection)) throw new Error('Invalid collection name');
222
-
223
- let inserted = 0;
224
- for (const doc of documents) {
225
- doc['_id'] ??= crypto.randomUUID().replace(/-/g, '');
226
- await adapter.executeQuery(
227
- `INSERT INTO \`${collection}\` (doc) VALUES (?)`,
228
- [JSON.stringify(doc)]
229
- );
230
- inserted++;
231
- }
232
- return { success: true, inserted };
233
- }
234
- },
235
- {
236
- name: 'mysql_doc_modify',
237
- title: 'MySQL Modify Documents',
238
- description: 'Update documents in a collection.',
239
- group: 'docstore',
240
- inputSchema: ModifyDocSchema,
241
- requiredScopes: ['write'],
242
- annotations: { readOnlyHint: false },
243
- handler: async (params: unknown, _context: RequestContext) => {
244
- const { collection, filter, set, unset } = ModifyDocSchema.parse(params);
245
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection)) throw new Error('Invalid collection name');
246
-
247
- const updates: string[] = [];
248
- if (set) {
249
- for (const [path, value] of Object.entries(set)) {
250
- updates.push(`doc = JSON_SET(doc, '$.${path}', CAST('${JSON.stringify(value)}' AS JSON))`);
251
- }
252
- }
253
- if (unset) {
254
- for (const path of unset) {
255
- updates.push(`doc = JSON_REMOVE(doc, '$.${path}')`);
256
- }
257
- }
258
-
259
- if (updates.length === 0) throw new Error('No modifications specified');
260
-
261
- const { where, params: whereParams } = parseDocFilter(filter);
262
- const query = `UPDATE \`${collection}\` SET ${updates.join(', ')} WHERE ${where}`;
263
- const result = await adapter.executeQuery(query, whereParams);
264
- return { success: true, modified: result.rowsAffected ?? 0 };
265
- }
266
- },
267
- {
268
- name: 'mysql_doc_remove',
269
- title: 'MySQL Remove Documents',
270
- description: 'Remove documents from a collection.',
271
- group: 'docstore',
272
- inputSchema: RemoveDocSchema,
273
- requiredScopes: ['write'],
274
- annotations: { readOnlyHint: false, destructiveHint: true },
275
- handler: async (params: unknown, _context: RequestContext) => {
276
- const { collection, filter } = RemoveDocSchema.parse(params);
277
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection)) throw new Error('Invalid collection name');
278
-
279
- const { where, params: whereParams } = parseDocFilter(filter);
280
- const query = `DELETE FROM \`${collection}\` WHERE ${where}`;
281
- const result = await adapter.executeQuery(query, whereParams);
282
- return { success: true, removed: result.rowsAffected ?? 0 };
283
- }
284
- },
285
- {
286
- name: 'mysql_doc_create_index',
287
- title: 'MySQL Create Doc Index',
288
- description: 'Create an index on document fields.',
289
- group: 'docstore',
290
- inputSchema: CreateDocIndexSchema,
291
- requiredScopes: ['write'],
292
- annotations: { readOnlyHint: false },
293
- handler: async (params: unknown, _context: RequestContext) => {
294
- const { collection, name, fields, unique } = CreateDocIndexSchema.parse(params);
295
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection)) throw new Error('Invalid collection name');
296
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) throw new Error('Invalid index name');
297
-
298
- for (const field of fields) {
299
- const colName = `_idx_${field.path.replace(/\./g, '_')}`;
300
- const cast = field.type === 'TEXT' ? 'CHAR(255)' : field.type;
301
- await adapter.executeQuery(
302
- `ALTER TABLE \`${collection}\` ADD COLUMN \`${colName}\` ${cast}
303
- GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$.${field.path}'))) STORED`
304
- );
305
- }
306
-
307
- const cols = fields.map(f => `\`_idx_${f.path.replace(/\./g, '_')}\``).join(', ');
308
- const uniqueClause = unique ? 'UNIQUE ' : '';
309
- await adapter.executeQuery(`CREATE ${uniqueClause}INDEX \`${name}\` ON \`${collection}\` (${cols})`);
310
-
311
- return { success: true, index: name };
312
- }
313
- },
314
- {
315
- name: 'mysql_doc_collection_info',
316
- title: 'MySQL Collection Info',
317
- description: 'Get collection statistics.',
318
- group: 'docstore',
319
- inputSchema: CollectionInfoSchema,
320
- requiredScopes: ['read'],
321
- annotations: { readOnlyHint: true, idempotentHint: true },
322
- handler: async (params: unknown, _context: RequestContext) => {
323
- const { collection, schema } = CollectionInfoSchema.parse(params);
324
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection)) throw new Error('Invalid collection name');
325
-
326
- const tableInfo = await adapter.executeQuery(`
327
- SELECT TABLE_ROWS as rowCount, DATA_LENGTH as dataSize, INDEX_LENGTH as indexSize
225
+ }
226
+
227
+ try {
228
+ await adapter.executeQuery(sql);
229
+ return { success: true, collection: name };
230
+ } catch (error: unknown) {
231
+ const message =
232
+ error instanceof Error ? error.message : String(error);
233
+ if (message.toLowerCase().includes("already exists")) {
234
+ return {
235
+ success: false,
236
+ reason: `Collection '${name}' already exists`,
237
+ };
238
+ }
239
+ throw error;
240
+ }
241
+ },
242
+ },
243
+ {
244
+ name: "mysql_doc_drop_collection",
245
+ title: "MySQL Drop Collection",
246
+ description: "Drop a document collection.",
247
+ group: "docstore",
248
+ inputSchema: DropCollectionSchema,
249
+ requiredScopes: ["admin"],
250
+ annotations: { readOnlyHint: false, destructiveHint: true },
251
+ handler: async (params: unknown, _context: RequestContext) => {
252
+ const { name, ifExists } = DropCollectionSchema.parse(params);
253
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name))
254
+ throw new Error("Invalid collection name");
255
+
256
+ // Pre-check existence when ifExists is true so we can report accurately
257
+ if (ifExists) {
258
+ const exists = await checkCollectionExists(adapter, name);
259
+ if (!exists) {
260
+ return {
261
+ success: true,
262
+ collection: name,
263
+ message: "Collection did not exist",
264
+ };
265
+ }
266
+ }
267
+
268
+ try {
269
+ await adapter.executeQuery(
270
+ `DROP TABLE ${ifExists ? "IF EXISTS " : ""}\`${name}\``,
271
+ );
272
+ return { success: true, collection: name };
273
+ } catch (error: unknown) {
274
+ const message =
275
+ error instanceof Error ? error.message : String(error);
276
+ if (message.toLowerCase().includes("unknown table")) {
277
+ return {
278
+ success: false,
279
+ reason: `Collection '${name}' does not exist`,
280
+ };
281
+ }
282
+ throw error;
283
+ }
284
+ },
285
+ },
286
+ {
287
+ name: "mysql_doc_find",
288
+ title: "MySQL Find Documents",
289
+ description: "Query documents in a collection.",
290
+ group: "docstore",
291
+ inputSchema: FindSchema,
292
+ requiredScopes: ["read"],
293
+ annotations: { readOnlyHint: true, idempotentHint: true },
294
+ handler: async (params: unknown, _context: RequestContext) => {
295
+ const { collection, filter, fields, limit, offset } =
296
+ FindSchema.parse(params);
297
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection))
298
+ throw new Error("Invalid collection name");
299
+
300
+ // Check if collection exists
301
+ const tableCheck = await adapter.executeQuery(
302
+ `SELECT 1 FROM information_schema.TABLES
303
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,
304
+ [collection],
305
+ );
306
+ if (!tableCheck.rows || tableCheck.rows.length === 0) {
307
+ return {
308
+ exists: false,
309
+ collection,
310
+ documents: [],
311
+ count: 0,
312
+ };
313
+ }
314
+
315
+ let selectClause = "doc";
316
+ if (fields && fields.length > 0) {
317
+ selectClause =
318
+ "JSON_OBJECT(" +
319
+ fields
320
+ .map((f) => `'${f}', JSON_EXTRACT(doc, '$.${f}')`)
321
+ .join(", ") +
322
+ ") as doc";
323
+ }
324
+
325
+ let query = `SELECT ${selectClause} FROM \`${collection}\``;
326
+ if (filter)
327
+ query += ` WHERE JSON_EXTRACT(doc, '${filter}') IS NOT NULL`;
328
+ query += ` LIMIT ${String(limit)} OFFSET ${String(offset)}`;
329
+
330
+ const result = await adapter.executeQuery(query);
331
+ const docs = (result.rows ?? []).map((r) => {
332
+ const row = r;
333
+ const docValue = row["doc"];
334
+ return typeof docValue === "string"
335
+ ? (JSON.parse(docValue) as Record<string, unknown>)
336
+ : docValue;
337
+ });
338
+ return { documents: docs, count: docs.length };
339
+ },
340
+ },
341
+ {
342
+ name: "mysql_doc_add",
343
+ title: "MySQL Add Documents",
344
+ description: "Add documents to a collection.",
345
+ group: "docstore",
346
+ inputSchema: AddDocSchema,
347
+ requiredScopes: ["write"],
348
+ annotations: { readOnlyHint: false },
349
+ handler: async (params: unknown, _context: RequestContext) => {
350
+ const { collection, documents } = AddDocSchema.parse(params);
351
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection))
352
+ throw new Error("Invalid collection name");
353
+
354
+ if (!(await checkCollectionExists(adapter, collection))) {
355
+ return { exists: false, collection };
356
+ }
357
+
358
+ let inserted = 0;
359
+ for (const doc of documents) {
360
+ doc["_id"] ??= crypto.randomUUID().replace(/-/g, "");
361
+ await adapter.executeQuery(
362
+ `INSERT INTO \`${collection}\` (doc) VALUES (?)`,
363
+ [JSON.stringify(doc)],
364
+ );
365
+ inserted++;
366
+ }
367
+ return { success: true, inserted };
368
+ },
369
+ },
370
+ {
371
+ name: "mysql_doc_modify",
372
+ title: "MySQL Modify Documents",
373
+ description: "Update documents in a collection.",
374
+ group: "docstore",
375
+ inputSchema: ModifyDocSchema,
376
+ requiredScopes: ["write"],
377
+ annotations: { readOnlyHint: false },
378
+ handler: async (params: unknown, _context: RequestContext) => {
379
+ const { collection, filter, set, unset } =
380
+ ModifyDocSchema.parse(params);
381
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection))
382
+ throw new Error("Invalid collection name");
383
+
384
+ if (!(await checkCollectionExists(adapter, collection))) {
385
+ return { exists: false, collection };
386
+ }
387
+
388
+ const updates: string[] = [];
389
+ if (set) {
390
+ for (const [path, value] of Object.entries(set)) {
391
+ updates.push(
392
+ `doc = JSON_SET(doc, '$.${path}', CAST('${JSON.stringify(value)}' AS JSON))`,
393
+ );
394
+ }
395
+ }
396
+ if (unset) {
397
+ for (const path of unset) {
398
+ updates.push(`doc = JSON_REMOVE(doc, '$.${path}')`);
399
+ }
400
+ }
401
+
402
+ if (updates.length === 0) throw new Error("No modifications specified");
403
+
404
+ const { where, params: whereParams } = parseDocFilter(filter);
405
+ const query = `UPDATE \`${collection}\` SET ${updates.join(", ")} WHERE ${where}`;
406
+ const result = await adapter.executeQuery(query, whereParams);
407
+ return { success: true, modified: result.rowsAffected ?? 0 };
408
+ },
409
+ },
410
+ {
411
+ name: "mysql_doc_remove",
412
+ title: "MySQL Remove Documents",
413
+ description: "Remove documents from a collection.",
414
+ group: "docstore",
415
+ inputSchema: RemoveDocSchema,
416
+ requiredScopes: ["write"],
417
+ annotations: { readOnlyHint: false, destructiveHint: true },
418
+ handler: async (params: unknown, _context: RequestContext) => {
419
+ const { collection, filter } = RemoveDocSchema.parse(params);
420
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection))
421
+ throw new Error("Invalid collection name");
422
+
423
+ if (!(await checkCollectionExists(adapter, collection))) {
424
+ return { exists: false, collection };
425
+ }
426
+
427
+ const { where, params: whereParams } = parseDocFilter(filter);
428
+ const query = `DELETE FROM \`${collection}\` WHERE ${where}`;
429
+ const result = await adapter.executeQuery(query, whereParams);
430
+ return { success: true, removed: result.rowsAffected ?? 0 };
431
+ },
432
+ },
433
+ {
434
+ name: "mysql_doc_create_index",
435
+ title: "MySQL Create Doc Index",
436
+ description: "Create an index on document fields.",
437
+ group: "docstore",
438
+ inputSchema: CreateDocIndexSchema,
439
+ requiredScopes: ["write"],
440
+ annotations: { readOnlyHint: false },
441
+ handler: async (params: unknown, _context: RequestContext) => {
442
+ const { collection, name, fields, unique } =
443
+ CreateDocIndexSchema.parse(params);
444
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection))
445
+ throw new Error("Invalid collection name");
446
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name))
447
+ throw new Error("Invalid index name");
448
+
449
+ if (!(await checkCollectionExists(adapter, collection))) {
450
+ return { exists: false, collection };
451
+ }
452
+
453
+ try {
454
+ for (const field of fields) {
455
+ const colName = `_idx_${field.path.replace(/\./g, "_")}`;
456
+ const cast = field.type === "TEXT" ? "CHAR(255)" : field.type;
457
+ await adapter.executeQuery(
458
+ `ALTER TABLE \`${collection}\` ADD COLUMN \`${colName}\` ${cast}
459
+ GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$.${field.path}'))) STORED`,
460
+ );
461
+ }
462
+
463
+ const cols = fields
464
+ .map((f) => `\`_idx_${f.path.replace(/\./g, "_")}\``)
465
+ .join(", ");
466
+ const uniqueClause = unique ? "UNIQUE " : "";
467
+ await adapter.executeQuery(
468
+ `CREATE ${uniqueClause}INDEX \`${name}\` ON \`${collection}\` (${cols})`,
469
+ );
470
+
471
+ return { success: true, index: name };
472
+ } catch (error: unknown) {
473
+ const message =
474
+ error instanceof Error ? error.message : String(error);
475
+ if (
476
+ message.toLowerCase().includes("duplicate column") ||
477
+ message.toLowerCase().includes("duplicate key")
478
+ ) {
479
+ return {
480
+ success: false,
481
+ reason: `Index '${name}' or its generated columns already exist on '${collection}'`,
482
+ };
483
+ }
484
+ throw error;
485
+ }
486
+ },
487
+ },
488
+ {
489
+ name: "mysql_doc_collection_info",
490
+ title: "MySQL Collection Info",
491
+ description: "Get collection statistics.",
492
+ group: "docstore",
493
+ inputSchema: CollectionInfoSchema,
494
+ requiredScopes: ["read"],
495
+ annotations: { readOnlyHint: true, idempotentHint: true },
496
+ handler: async (params: unknown, _context: RequestContext) => {
497
+ const { collection, schema } = CollectionInfoSchema.parse(params);
498
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(collection))
499
+ throw new Error("Invalid collection name");
500
+
501
+ // Check if collection exists
502
+ const existsCheck = await adapter.executeQuery(
503
+ `SELECT 1 FROM information_schema.TABLES
504
+ WHERE TABLE_SCHEMA = COALESCE(?, DATABASE()) AND TABLE_NAME = ?`,
505
+ [schema ?? null, collection],
506
+ );
507
+ if (!existsCheck.rows || existsCheck.rows.length === 0) {
508
+ return { exists: false, collection };
509
+ }
510
+
511
+ // Get accurate row count using COUNT(*) instead of INFORMATION_SCHEMA estimate
512
+ const schemaClause = schema
513
+ ? `\`${schema}\`.\`${collection}\``
514
+ : `\`${collection}\``;
515
+ const countResult = await adapter.executeQuery(
516
+ `SELECT COUNT(*) as rowCount FROM ${schemaClause}`,
517
+ );
518
+ const rowCount =
519
+ (countResult.rows?.[0] as { rowCount: number })?.rowCount ?? 0;
520
+
521
+ const tableInfo = await adapter.executeQuery(
522
+ `
523
+ SELECT DATA_LENGTH as dataSize, INDEX_LENGTH as indexSize
328
524
  FROM information_schema.TABLES
329
525
  WHERE TABLE_SCHEMA = COALESCE(?, DATABASE()) AND TABLE_NAME = ?
330
- `, [schema ?? null, collection]);
526
+ `,
527
+ [schema ?? null, collection],
528
+ );
331
529
 
332
- const indexInfo = await adapter.executeQuery(`
530
+ const indexInfo = await adapter.executeQuery(
531
+ `
333
532
  SELECT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, NON_UNIQUE
334
533
  FROM information_schema.STATISTICS
335
534
  WHERE TABLE_SCHEMA = COALESCE(?, DATABASE()) AND TABLE_NAME = ?
336
- `, [schema ?? null, collection]);
337
-
338
- return {
339
- collection,
340
- stats: tableInfo.rows?.[0] ?? {},
341
- indexes: indexInfo.rows ?? []
342
- };
343
- }
344
- }
345
- ];
535
+ `,
536
+ [schema ?? null, collection],
537
+ );
538
+
539
+ const stats = tableInfo.rows?.[0] ?? {};
540
+ return {
541
+ collection,
542
+ stats: { rowCount, ...stats },
543
+ indexes: indexInfo.rows ?? [],
544
+ };
545
+ },
546
+ },
547
+ ];
346
548
  }