@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,20 +1,30 @@
1
1
  /**
2
2
  * MySQL InnoDB Cluster Tools
3
- *
3
+ *
4
4
  * Tools for managing MySQL InnoDB Cluster.
5
5
  * 5 tools total: status, instances, topology, router status, switchover.
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 {
11
+ ToolDefinition,
12
+ RequestContext,
13
+ } from "../../../../types/index.js";
11
14
 
12
15
  // =============================================================================
13
16
  // Schemas
14
17
  // =============================================================================
15
18
 
16
19
  const LimitSchema = z.object({
17
- limit: z.number().default(100).describe('Maximum number of results')
20
+ limit: z.number().default(100).describe("Maximum number of results"),
21
+ });
22
+
23
+ const SummarySchema = z.object({
24
+ summary: z
25
+ .boolean()
26
+ .optional()
27
+ .describe("If true, return condensed output without configuration blobs"),
18
28
  });
19
29
 
20
30
  // =============================================================================
@@ -25,99 +35,140 @@ const LimitSchema = z.object({
25
35
  * Get InnoDB Cluster status
26
36
  */
27
37
  export function createClusterStatusTool(adapter: MySQLAdapter): ToolDefinition {
28
- return {
29
- name: 'mysql_cluster_status',
30
- title: 'MySQL Cluster Status',
31
- description: 'Get overall InnoDB Cluster status (requires mysql_innodb_cluster_metadata schema).',
32
- group: 'cluster',
33
- inputSchema: z.object({}),
34
- requiredScopes: ['read'],
35
- annotations: {
36
- readOnlyHint: true,
37
- idempotentHint: true
38
- },
39
- handler: async (_params: unknown, _context: RequestContext) => {
40
- try {
41
- // Check for cluster metadata schema
42
- const schemaCheck = await adapter.executeQuery(`
38
+ return {
39
+ name: "mysql_cluster_status",
40
+ title: "MySQL Cluster Status",
41
+ description:
42
+ "Get overall InnoDB Cluster status (requires mysql_innodb_cluster_metadata schema).",
43
+ group: "cluster",
44
+ inputSchema: SummarySchema,
45
+ requiredScopes: ["read"],
46
+ annotations: {
47
+ readOnlyHint: true,
48
+ idempotentHint: true,
49
+ },
50
+ handler: async (params: unknown, _context: RequestContext) => {
51
+ const { summary } = SummarySchema.parse(params);
52
+ try {
53
+ // Check for cluster metadata schema
54
+ const schemaCheck = await adapter.executeQuery(`
43
55
  SELECT SCHEMA_NAME
44
56
  FROM information_schema.SCHEMATA
45
57
  WHERE SCHEMA_NAME = 'mysql_innodb_cluster_metadata'
46
58
  `);
47
59
 
48
- if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
49
- // Fall back to GR status
50
- const grResult = await adapter.executeQuery(`
60
+ if (!schemaCheck.rows || schemaCheck.rows.length === 0) {
61
+ // Fall back to GR status
62
+ const grResult = await adapter.executeQuery(`
51
63
  SELECT COUNT(*) as memberCount
52
64
  FROM performance_schema.replication_group_members
53
65
  WHERE MEMBER_STATE = 'ONLINE'
54
66
  `);
55
67
 
56
- return {
57
- isInnoDBCluster: false,
58
- message: 'InnoDB Cluster metadata not found. Using Group Replication status.',
59
- onlineMembers: (grResult.rows?.[0])?.['memberCount'] ?? 0
60
- };
61
- }
68
+ return {
69
+ isInnoDBCluster: false,
70
+ message:
71
+ "InnoDB Cluster metadata not found. Using Group Replication status.",
72
+ onlineMembers: grResult.rows?.[0]?.["memberCount"] ?? 0,
73
+ };
74
+ }
62
75
 
63
- // Get cluster info - use SELECT * to handle schema variations across versions
64
- const clusterResult = await adapter.executeQuery(`
65
- SELECT *
76
+ // Get cluster info
77
+ const clusterResult = await adapter.executeQuery(`
78
+ SELECT cluster_id, cluster_name, description, cluster_type, primary_mode
66
79
  FROM mysql_innodb_cluster_metadata.clusters
67
80
  LIMIT 1
68
81
  `);
69
82
 
70
- const cluster = clusterResult.rows?.[0];
83
+ const clusterBasic = clusterResult.rows?.[0];
71
84
 
72
- // Get instance count
73
- const instanceResult = await adapter.executeQuery(`
85
+ // Get instance count
86
+ const instanceResult = await adapter.executeQuery(`
74
87
  SELECT COUNT(*) as count
75
88
  FROM mysql_innodb_cluster_metadata.instances
76
89
  `);
77
90
 
78
- // Get router count
79
- const routerResult = await adapter.executeQuery(`
91
+ // Get router count
92
+ const routerResult = await adapter.executeQuery(`
80
93
  SELECT COUNT(*) as count
81
94
  FROM mysql_innodb_cluster_metadata.routers
82
95
  `);
83
96
 
84
- return {
85
- isInnoDBCluster: true,
86
- cluster: cluster ?? null,
87
- instanceCount: (instanceResult.rows?.[0])?.['count'] ?? 0,
88
- routerCount: (routerResult.rows?.[0])?.['count'] ?? 0
89
- };
90
- } catch (error) {
91
- return {
92
- isInnoDBCluster: false,
93
- message: 'Unable to query cluster metadata. Ensure InnoDB Cluster is properly configured.',
94
- error: error instanceof Error ? error.message : String(error)
95
- };
96
- }
97
+ // Summary mode: return only essential metadata
98
+ if (summary) {
99
+ return {
100
+ isInnoDBCluster: true,
101
+ cluster: clusterBasic ?? null,
102
+ instanceCount: instanceResult.rows?.[0]?.["count"] ?? 0,
103
+ routerCount: routerResult.rows?.[0]?.["count"] ?? 0,
104
+ };
97
105
  }
98
- };
106
+
107
+ // Full mode: include all cluster metadata including options/attributes
108
+ const fullClusterResult = await adapter.executeQuery(`
109
+ SELECT *
110
+ FROM mysql_innodb_cluster_metadata.clusters
111
+ LIMIT 1
112
+ `);
113
+
114
+ // Strip bulky Router Configuration blob from router_options to reduce payload
115
+ const cluster = fullClusterResult.rows?.[0] ?? null;
116
+ if (cluster?.["router_options"] != null) {
117
+ try {
118
+ const opts =
119
+ typeof cluster["router_options"] === "string"
120
+ ? (JSON.parse(cluster["router_options"]) as Record<
121
+ string,
122
+ unknown
123
+ >)
124
+ : (cluster["router_options"] as Record<string, unknown>);
125
+ delete opts["Configuration"];
126
+ cluster["router_options"] = opts;
127
+ } catch {
128
+ // Keep original if parsing fails
129
+ }
130
+ }
131
+
132
+ return {
133
+ isInnoDBCluster: true,
134
+ cluster,
135
+ instanceCount: instanceResult.rows?.[0]?.["count"] ?? 0,
136
+ routerCount: routerResult.rows?.[0]?.["count"] ?? 0,
137
+ };
138
+ } catch (error) {
139
+ return {
140
+ isInnoDBCluster: false,
141
+ message:
142
+ "Unable to query cluster metadata. Ensure InnoDB Cluster is properly configured.",
143
+ error: error instanceof Error ? error.message : String(error),
144
+ };
145
+ }
146
+ },
147
+ };
99
148
  }
100
149
 
101
150
  /**
102
151
  * List cluster instances
103
152
  */
104
- export function createClusterInstancesTool(adapter: MySQLAdapter): ToolDefinition {
105
- return {
106
- name: 'mysql_cluster_instances',
107
- title: 'MySQL Cluster Instances',
108
- description: 'List all instances in the InnoDB Cluster.',
109
- group: 'cluster',
110
- inputSchema: LimitSchema,
111
- requiredScopes: ['read'],
112
- annotations: {
113
- readOnlyHint: true,
114
- idempotentHint: true
115
- },
116
- handler: async (params: unknown, _context: RequestContext) => {
117
- const { limit } = LimitSchema.parse(params);
118
-
119
- try {
120
- const result = await adapter.executeQuery(`
153
+ export function createClusterInstancesTool(
154
+ adapter: MySQLAdapter,
155
+ ): ToolDefinition {
156
+ return {
157
+ name: "mysql_cluster_instances",
158
+ title: "MySQL Cluster Instances",
159
+ description: "List all instances in the InnoDB Cluster.",
160
+ group: "cluster",
161
+ inputSchema: LimitSchema,
162
+ requiredScopes: ["read"],
163
+ annotations: {
164
+ readOnlyHint: true,
165
+ idempotentHint: true,
166
+ },
167
+ handler: async (params: unknown, _context: RequestContext) => {
168
+ const { limit } = LimitSchema.parse(params);
169
+
170
+ try {
171
+ const result = await adapter.executeQuery(`
121
172
  SELECT
122
173
  i.instance_id as instanceId,
123
174
  i.cluster_id as clusterId,
@@ -125,21 +176,21 @@ export function createClusterInstancesTool(adapter: MySQLAdapter): ToolDefinitio
125
176
  i.mysql_server_uuid as serverUuid,
126
177
  i.instance_name as instanceName,
127
178
  i.description,
128
- m.MEMBER_STATE as memberState,
129
- m.MEMBER_ROLE as memberRole
179
+ COALESCE(m.MEMBER_STATE, 'OFFLINE') as memberState,
180
+ COALESCE(m.MEMBER_ROLE, 'NONE') as memberRole
130
181
  FROM mysql_innodb_cluster_metadata.instances i
131
182
  LEFT JOIN performance_schema.replication_group_members m
132
183
  ON i.mysql_server_uuid = m.MEMBER_ID
133
184
  LIMIT ${String(limit)}
134
185
  `);
135
186
 
136
- return {
137
- instances: result.rows ?? [],
138
- count: result.rows?.length ?? 0
139
- };
140
- } catch {
141
- // Fallback to GR members
142
- const grResult = await adapter.executeQuery(`
187
+ return {
188
+ instances: result.rows ?? [],
189
+ count: result.rows?.length ?? 0,
190
+ };
191
+ } catch {
192
+ // Fallback to GR members
193
+ const grResult = await adapter.executeQuery(`
143
194
  SELECT
144
195
  MEMBER_ID as serverUuid,
145
196
  CONCAT(MEMBER_HOST, ':', MEMBER_PORT) as address,
@@ -150,34 +201,36 @@ export function createClusterInstancesTool(adapter: MySQLAdapter): ToolDefinitio
150
201
  LIMIT ${String(limit)}
151
202
  `);
152
203
 
153
- return {
154
- source: 'group_replication',
155
- instances: grResult.rows ?? [],
156
- count: grResult.rows?.length ?? 0
157
- };
158
- }
159
- }
160
- };
204
+ return {
205
+ source: "group_replication",
206
+ instances: grResult.rows ?? [],
207
+ count: grResult.rows?.length ?? 0,
208
+ };
209
+ }
210
+ },
211
+ };
161
212
  }
162
213
 
163
214
  /**
164
215
  * Get cluster topology visualization
165
216
  */
166
- export function createClusterTopologyTool(adapter: MySQLAdapter): ToolDefinition {
167
- return {
168
- name: 'mysql_cluster_topology',
169
- title: 'MySQL Cluster Topology',
170
- description: 'Get a visual representation of the cluster topology.',
171
- group: 'cluster',
172
- inputSchema: z.object({}),
173
- requiredScopes: ['read'],
174
- annotations: {
175
- readOnlyHint: true,
176
- idempotentHint: true
177
- },
178
- handler: async (_params: unknown, _context: RequestContext) => {
179
- // Get all members
180
- const membersResult = await adapter.executeQuery(`
217
+ export function createClusterTopologyTool(
218
+ adapter: MySQLAdapter,
219
+ ): ToolDefinition {
220
+ return {
221
+ name: "mysql_cluster_topology",
222
+ title: "MySQL Cluster Topology",
223
+ description: "Get a visual representation of the cluster topology.",
224
+ group: "cluster",
225
+ inputSchema: z.object({}),
226
+ requiredScopes: ["read"],
227
+ annotations: {
228
+ readOnlyHint: true,
229
+ idempotentHint: true,
230
+ },
231
+ handler: async (_params: unknown, _context: RequestContext) => {
232
+ // Get all GR members
233
+ const membersResult = await adapter.executeQuery(`
181
234
  SELECT
182
235
  MEMBER_ID as id,
183
236
  MEMBER_HOST as host,
@@ -189,82 +242,156 @@ export function createClusterTopologyTool(adapter: MySQLAdapter): ToolDefinition
189
242
  ORDER BY MEMBER_ROLE DESC, MEMBER_HOST
190
243
  `);
191
244
 
192
- const members = membersResult.rows ?? [];
193
-
194
- // Build topology representation
195
- const topology = {
196
- primary: members.filter(m => (m)['role'] === 'PRIMARY'),
197
- secondaries: members.filter(m => (m)['role'] === 'SECONDARY'),
198
- recovering: members.filter(m => (m)['state'] === 'RECOVERING'),
199
- offline: members.filter(m =>
200
- (m)['state'] !== 'ONLINE' &&
201
- (m)['state'] !== 'RECOVERING'
202
- )
203
- };
204
-
205
- // Generate ASCII visualization
206
- let ascii = '=== MySQL Cluster Topology ===\n\n';
207
-
208
- if (topology.primary.length > 0) {
209
- ascii += ' PRIMARY:\n';
210
- for (const p of topology.primary) {
211
- const pm = p;
212
- ascii += ` ★ ${pm['host'] as string}:${String(pm['port'])} (${pm['state'] as string})\n`;
213
- }
214
- }
215
-
216
- if (topology.secondaries.length > 0) {
217
- ascii += '\n SECONDARY:\n';
218
- for (const s of topology.secondaries) {
219
- const sm = s;
220
- ascii += ` ○ ${sm['host'] as string}:${String(sm['port'])} (${sm['state'] as string})\n`;
221
- }
222
- }
245
+ const members = membersResult.rows ?? [];
246
+ const grMemberIds = new Set(
247
+ members.map((m) => m["id"] as string).filter(Boolean),
248
+ );
249
+
250
+ // Cross-reference with cluster metadata for offline instances
251
+ let metadataOffline: Record<string, unknown>[] = [];
252
+ try {
253
+ const metaResult = await adapter.executeQuery(`
254
+ SELECT
255
+ mysql_server_uuid as id,
256
+ SUBSTRING_INDEX(address, ':', 1) as host,
257
+ CAST(SUBSTRING_INDEX(address, ':', -1) AS UNSIGNED) as port
258
+ FROM mysql_innodb_cluster_metadata.instances
259
+ `);
260
+ if (metaResult.rows) {
261
+ metadataOffline = metaResult.rows
262
+ .filter((i) => !grMemberIds.has(i["id"] as string))
263
+ .map((i) => ({
264
+ id: i["id"],
265
+ host: i["host"],
266
+ port: i["port"],
267
+ state: "OFFLINE",
268
+ role: "NONE",
269
+ version: null,
270
+ source: "metadata",
271
+ }));
272
+ }
273
+ } catch {
274
+ // Cluster metadata not available; skip
275
+ }
276
+
277
+ // Build topology representation
278
+ const topology = {
279
+ primary: members.filter((m) => m["role"] === "PRIMARY"),
280
+ secondaries: members.filter((m) => m["role"] === "SECONDARY"),
281
+ recovering: members.filter((m) => m["state"] === "RECOVERING"),
282
+ offline: [
283
+ ...members.filter(
284
+ (m) => m["state"] !== "ONLINE" && m["state"] !== "RECOVERING",
285
+ ),
286
+ ...metadataOffline,
287
+ ],
288
+ };
289
+
290
+ // Generate ASCII visualization
291
+ let ascii = "=== MySQL Cluster Topology ===\n\n";
292
+
293
+ if (topology.primary.length > 0) {
294
+ ascii += " PRIMARY:\n";
295
+ for (const p of topology.primary) {
296
+ const pm = p;
297
+ ascii += ` ★ ${pm["host"] as string}:${String(pm["port"])} (${pm["state"] as string})\n`;
298
+ }
299
+ }
223
300
 
224
- if (topology.recovering.length > 0) {
225
- ascii += '\n RECOVERING:\n';
226
- for (const r of topology.recovering) {
227
- const rm = r;
228
- ascii += ` ${rm['host'] as string}:${String(rm['port'])}\n`;
229
- }
230
- }
301
+ if (topology.secondaries.length > 0) {
302
+ ascii += "\n SECONDARY:\n";
303
+ for (const s of topology.secondaries) {
304
+ const sm = s;
305
+ ascii += ` ${sm["host"] as string}:${String(sm["port"])} (${sm["state"] as string})\n`;
306
+ }
307
+ }
231
308
 
232
- if (topology.offline.length > 0) {
233
- ascii += '\n OFFLINE/ERROR:\n';
234
- for (const o of topology.offline) {
235
- const om = o;
236
- ascii += ` ${om['host'] as string}:${String(om['port'])} (${om['state'] as string})\n`;
237
- }
238
- }
309
+ if (topology.recovering.length > 0) {
310
+ ascii += "\n RECOVERING:\n";
311
+ for (const r of topology.recovering) {
312
+ const rm = r;
313
+ ascii += ` ${rm["host"] as string}:${String(rm["port"])}\n`;
314
+ }
315
+ }
239
316
 
240
- return {
241
- topology,
242
- visualization: ascii,
243
- totalMembers: members.length,
244
- onlineMembers: members.filter(m => (m)['state'] === 'ONLINE').length
245
- };
317
+ if (topology.offline.length > 0) {
318
+ ascii += "\n OFFLINE/ERROR:\n";
319
+ for (const o of topology.offline) {
320
+ const om = o;
321
+ ascii += ` ✗ ${om["host"] as string}:${String(om["port"])} (${om["state"] as string})\n`;
246
322
  }
247
- };
323
+ }
324
+
325
+ const allMembers = members.length + metadataOffline.length;
326
+ return {
327
+ topology,
328
+ visualization: ascii,
329
+ totalMembers: allMembers,
330
+ onlineMembers: members.filter((m) => m["state"] === "ONLINE").length,
331
+ };
332
+ },
333
+ };
248
334
  }
249
335
 
250
336
  /**
251
337
  * Get cluster router status
252
338
  */
253
- export function createClusterRouterStatusTool(adapter: MySQLAdapter): ToolDefinition {
254
- return {
255
- name: 'mysql_cluster_router_status',
256
- title: 'MySQL Cluster Router Status',
257
- description: 'Get status of MySQL Routers connected to the cluster.',
258
- group: 'cluster',
259
- inputSchema: z.object({}),
260
- requiredScopes: ['read'],
261
- annotations: {
262
- readOnlyHint: true,
263
- idempotentHint: true
264
- },
265
- handler: async (_params: unknown, _context: RequestContext) => {
266
- try {
267
- const result = await adapter.executeQuery(`
339
+ export function createClusterRouterStatusTool(
340
+ adapter: MySQLAdapter,
341
+ ): ToolDefinition {
342
+ return {
343
+ name: "mysql_cluster_router_status",
344
+ title: "MySQL Cluster Router Status",
345
+ description: "Get status of MySQL Routers connected to the cluster.",
346
+ group: "cluster",
347
+ inputSchema: SummarySchema,
348
+ requiredScopes: ["read"],
349
+ annotations: {
350
+ readOnlyHint: true,
351
+ idempotentHint: true,
352
+ },
353
+ handler: async (params: unknown, _context: RequestContext) => {
354
+ const { summary } = SummarySchema.parse(params);
355
+
356
+ // Compute staleness: null lastCheckIn or >1 hour old
357
+ const computeStale = (lastCheckIn: unknown): boolean => {
358
+ if (lastCheckIn == null) return true;
359
+ const checkInTime = new Date(lastCheckIn as string).getTime();
360
+ if (isNaN(checkInTime)) return true;
361
+ return Date.now() - checkInTime > 3_600_000; // 1 hour
362
+ };
363
+
364
+ try {
365
+ // Summary mode: return only essential router info
366
+ if (summary) {
367
+ const result = await adapter.executeQuery(`
368
+ SELECT
369
+ router_id as routerId,
370
+ router_name as routerName,
371
+ address,
372
+ version,
373
+ last_check_in as lastCheckIn,
374
+ JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.ROEndpoint')) as roPort,
375
+ JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.RWEndpoint')) as rwPort,
376
+ JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.LocalCluster')) as localCluster
377
+ FROM mysql_innodb_cluster_metadata.routers
378
+ `);
379
+
380
+ const routers = (result.rows ?? []).map((r) => ({
381
+ ...r,
382
+ isStale: computeStale(r["lastCheckIn"]),
383
+ }));
384
+ const staleCount = routers.filter((r) => r.isStale).length;
385
+
386
+ return {
387
+ routers,
388
+ count: routers.length,
389
+ staleCount,
390
+ };
391
+ }
392
+
393
+ // Full mode: include attributes but strip bulky Configuration blob
394
+ const result = await adapter.executeQuery(`
268
395
  SELECT
269
396
  router_id as routerId,
270
397
  router_name as routerName,
@@ -275,39 +402,66 @@ export function createClusterRouterStatusTool(adapter: MySQLAdapter): ToolDefini
275
402
  FROM mysql_innodb_cluster_metadata.routers
276
403
  `);
277
404
 
278
- return {
279
- routers: result.rows ?? [],
280
- count: result.rows?.length ?? 0
281
- };
405
+ const routers = (result.rows ?? []).map((r) => {
406
+ let processed = r;
407
+ if (r["attributes"] != null) {
408
+ try {
409
+ const attrs =
410
+ typeof r["attributes"] === "string"
411
+ ? (JSON.parse(r["attributes"]) as Record<string, unknown>)
412
+ : (r["attributes"] as Record<string, unknown>);
413
+ delete attrs["Configuration"];
414
+ processed = { ...r, attributes: attrs };
282
415
  } catch {
283
- return {
284
- available: false,
285
- message: 'Router metadata not available. Ensure InnoDB Cluster is configured.',
286
- suggestion: 'Use mysql_router_status tool if connecting directly to Router REST API.'
287
- };
416
+ // Keep original if parsing fails
288
417
  }
289
- }
290
- };
418
+ }
419
+ return {
420
+ ...processed,
421
+ isStale: computeStale(processed["lastCheckIn"]),
422
+ };
423
+ });
424
+ const staleCount = routers.filter((r) => r.isStale).length;
425
+
426
+ return {
427
+ routers,
428
+ count: routers.length,
429
+ staleCount,
430
+ };
431
+ } catch {
432
+ return {
433
+ available: false,
434
+ message:
435
+ "Router metadata not available. Ensure InnoDB Cluster is configured.",
436
+ suggestion:
437
+ "Use mysql_router_status tool if connecting directly to Router REST API.",
438
+ };
439
+ }
440
+ },
441
+ };
291
442
  }
292
443
 
293
444
  /**
294
445
  * Get switchover recommendation
295
446
  */
296
- export function createClusterSwitchoverTool(adapter: MySQLAdapter): ToolDefinition {
297
- return {
298
- name: 'mysql_cluster_switchover',
299
- title: 'MySQL Cluster Switchover Analysis',
300
- description: 'Analyze cluster state and provide switchover recommendations.',
301
- group: 'cluster',
302
- inputSchema: z.object({}),
303
- requiredScopes: ['read'],
304
- annotations: {
305
- readOnlyHint: true,
306
- idempotentHint: true
307
- },
308
- handler: async (_params: unknown, _context: RequestContext) => {
309
- // Get current members status
310
- const membersResult = await adapter.executeQuery(`
447
+ export function createClusterSwitchoverTool(
448
+ adapter: MySQLAdapter,
449
+ ): ToolDefinition {
450
+ return {
451
+ name: "mysql_cluster_switchover",
452
+ title: "MySQL Cluster Switchover Analysis",
453
+ description:
454
+ "Analyze cluster state and provide switchover recommendations.",
455
+ group: "cluster",
456
+ inputSchema: z.object({}),
457
+ requiredScopes: ["read"],
458
+ annotations: {
459
+ readOnlyHint: true,
460
+ idempotentHint: true,
461
+ },
462
+ handler: async (_params: unknown, _context: RequestContext) => {
463
+ // Get current members status
464
+ const membersResult = await adapter.executeQuery(`
311
465
  SELECT
312
466
  m.MEMBER_ID as memberId,
313
467
  m.MEMBER_HOST as host,
@@ -322,63 +476,71 @@ export function createClusterSwitchoverTool(adapter: MySQLAdapter): ToolDefiniti
322
476
  ON m.MEMBER_ID = s.MEMBER_ID
323
477
  `);
324
478
 
325
- const members = membersResult.rows ?? [];
326
- const onlineSecondaries = members.filter(m => {
327
- const member = m;
328
- return member['state'] === 'ONLINE' && member['role'] === 'SECONDARY';
329
- });
330
-
331
- // Analyze each secondary for switchover suitability
332
- const candidates = onlineSecondaries.map(s => {
333
- const sec = s;
334
- const txQueue = sec['txQueue'] as number ?? 0;
335
- const applierQueue = sec['applierQueue'] as number ?? 0;
336
- const totalQueue = txQueue + applierQueue;
337
-
338
- let suitability: 'GOOD' | 'ACCEPTABLE' | 'NOT_RECOMMENDED';
339
- let reason: string;
340
-
341
- if (totalQueue === 0) {
342
- suitability = 'GOOD';
343
- reason = 'Fully synchronized';
344
- } else if (totalQueue < 100) {
345
- suitability = 'ACCEPTABLE';
346
- reason = `Minor lag: ${String(totalQueue)} transactions pending`;
347
- } else {
348
- suitability = 'NOT_RECOMMENDED';
349
- reason = `Significant lag: ${String(totalQueue)} transactions pending`;
350
- }
351
-
352
- return {
353
- memberId: sec['memberId'],
354
- host: sec['host'],
355
- port: sec['port'],
356
- version: sec['version'],
357
- txQueue,
358
- applierQueue,
359
- suitability,
360
- reason
361
- };
362
- });
363
-
364
- // Sort by suitability
365
- candidates.sort((a, b) => {
366
- const order = { GOOD: 0, ACCEPTABLE: 1, NOT_RECOMMENDED: 2 };
367
- return order[a.suitability] - order[b.suitability];
368
- });
369
-
370
- const firstCandidate = candidates[0];
371
- return {
372
- currentPrimary: members.find(m => (m)['role'] === 'PRIMARY'),
373
- candidates,
374
- recommendedTarget: candidates.length > 0 && firstCandidate && firstCandidate.suitability !== 'NOT_RECOMMENDED'
375
- ? firstCandidate
376
- : null,
377
- canSwitchover: candidates.some(c => c.suitability !== 'NOT_RECOMMENDED'),
378
- warning: candidates.every(c => c.suitability === 'NOT_RECOMMENDED')
379
- ? 'All secondaries have significant replication lag. Switchover not recommended.'
380
- : undefined
381
- };
479
+ const members = membersResult.rows ?? [];
480
+ const onlineSecondaries = members.filter((m) => {
481
+ const member = m;
482
+ return member["state"] === "ONLINE" && member["role"] === "SECONDARY";
483
+ });
484
+
485
+ // Analyze each secondary for switchover suitability
486
+ const candidates = onlineSecondaries.map((s) => {
487
+ const sec = s;
488
+ const txQueue = (sec["txQueue"] as number) ?? 0;
489
+ const applierQueue = (sec["applierQueue"] as number) ?? 0;
490
+ const totalQueue = txQueue + applierQueue;
491
+
492
+ let suitability: "GOOD" | "ACCEPTABLE" | "NOT_RECOMMENDED";
493
+ let reason: string;
494
+
495
+ if (totalQueue === 0) {
496
+ suitability = "GOOD";
497
+ reason = "Fully synchronized";
498
+ } else if (totalQueue < 100) {
499
+ suitability = "ACCEPTABLE";
500
+ reason = `Minor lag: ${String(totalQueue)} transactions pending`;
501
+ } else {
502
+ suitability = "NOT_RECOMMENDED";
503
+ reason = `Significant lag: ${String(totalQueue)} transactions pending`;
382
504
  }
383
- };
505
+
506
+ return {
507
+ memberId: sec["memberId"],
508
+ host: sec["host"],
509
+ port: sec["port"],
510
+ version: sec["version"],
511
+ txQueue,
512
+ applierQueue,
513
+ suitability,
514
+ reason,
515
+ };
516
+ });
517
+
518
+ // Sort by suitability
519
+ candidates.sort((a, b) => {
520
+ const order = { GOOD: 0, ACCEPTABLE: 1, NOT_RECOMMENDED: 2 };
521
+ return order[a.suitability] - order[b.suitability];
522
+ });
523
+
524
+ const firstCandidate = candidates[0];
525
+ return {
526
+ currentPrimary: members.find((m) => m["role"] === "PRIMARY"),
527
+ candidates,
528
+ recommendedTarget:
529
+ candidates.length > 0 &&
530
+ firstCandidate &&
531
+ firstCandidate.suitability !== "NOT_RECOMMENDED"
532
+ ? firstCandidate
533
+ : null,
534
+ canSwitchover: candidates.some(
535
+ (c) => c.suitability !== "NOT_RECOMMENDED",
536
+ ),
537
+ warning:
538
+ onlineSecondaries.length === 0
539
+ ? "No online secondaries available for switchover."
540
+ : candidates.every((c) => c.suitability === "NOT_RECOMMENDED")
541
+ ? "All secondaries have significant replication lag. Switchover not recommended."
542
+ : undefined,
543
+ };
544
+ },
545
+ };
384
546
  }