@neverinfamous/mysql-mcp 2.1.0 → 2.2.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 (751) 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 +248 -210
  8. package/.github/workflows/publish-npm.yml +16 -6
  9. package/CHANGELOG.md +272 -22
  10. package/CODE_OF_CONDUCT.md +2 -0
  11. package/DOCKER_README.md +222 -156
  12. package/Dockerfile +2 -2
  13. package/README.md +210 -176
  14. package/SECURITY.md +0 -8
  15. package/VERSION +1 -1
  16. package/dist/__tests__/mocks/adapter.d.ts +3 -3
  17. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  18. package/dist/__tests__/mocks/adapter.js +51 -35
  19. package/dist/__tests__/mocks/adapter.js.map +1 -1
  20. package/dist/__tests__/mocks/index.d.ts +4 -4
  21. package/dist/__tests__/mocks/index.d.ts.map +1 -1
  22. package/dist/__tests__/mocks/index.js +2 -2
  23. package/dist/__tests__/mocks/index.js.map +1 -1
  24. package/dist/__tests__/mocks/mysql.d.ts +2 -2
  25. package/dist/__tests__/mocks/mysql.d.ts.map +1 -1
  26. package/dist/__tests__/mocks/mysql.js +14 -14
  27. package/dist/__tests__/mocks/mysql.js.map +1 -1
  28. package/dist/__tests__/setup.d.ts.map +1 -1
  29. package/dist/__tests__/setup.js +7 -7
  30. package/dist/__tests__/setup.js.map +1 -1
  31. package/dist/adapters/DatabaseAdapter.d.ts +2 -2
  32. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  33. package/dist/adapters/DatabaseAdapter.js +69 -40
  34. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  35. package/dist/adapters/mysql/MySQLAdapter.d.ts +10 -4
  36. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  37. package/dist/adapters/mysql/MySQLAdapter.js +143 -116
  38. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  39. package/dist/adapters/mysql/SchemaManager.d.ts +1 -1
  40. package/dist/adapters/mysql/SchemaManager.d.ts.map +1 -1
  41. package/dist/adapters/mysql/SchemaManager.js +76 -56
  42. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  43. package/dist/adapters/mysql/index.d.ts +2 -2
  44. package/dist/adapters/mysql/index.js +2 -2
  45. package/dist/adapters/mysql/prompts/backupStrategy.d.ts +1 -1
  46. package/dist/adapters/mysql/prompts/backupStrategy.d.ts.map +1 -1
  47. package/dist/adapters/mysql/prompts/backupStrategy.js +21 -9
  48. package/dist/adapters/mysql/prompts/backupStrategy.js.map +1 -1
  49. package/dist/adapters/mysql/prompts/clusterSetup.d.ts +1 -1
  50. package/dist/adapters/mysql/prompts/clusterSetup.d.ts.map +1 -1
  51. package/dist/adapters/mysql/prompts/clusterSetup.js +3 -3
  52. package/dist/adapters/mysql/prompts/clusterSetup.js.map +1 -1
  53. package/dist/adapters/mysql/prompts/docstoreSetup.d.ts +1 -1
  54. package/dist/adapters/mysql/prompts/docstoreSetup.js +3 -3
  55. package/dist/adapters/mysql/prompts/docstoreSetup.js.map +1 -1
  56. package/dist/adapters/mysql/prompts/eventScheduler.d.ts +1 -1
  57. package/dist/adapters/mysql/prompts/eventScheduler.js +3 -3
  58. package/dist/adapters/mysql/prompts/eventScheduler.js.map +1 -1
  59. package/dist/adapters/mysql/prompts/healthCheck.d.ts +1 -1
  60. package/dist/adapters/mysql/prompts/healthCheck.d.ts.map +1 -1
  61. package/dist/adapters/mysql/prompts/healthCheck.js +10 -6
  62. package/dist/adapters/mysql/prompts/healthCheck.js.map +1 -1
  63. package/dist/adapters/mysql/prompts/index.d.ts +2 -2
  64. package/dist/adapters/mysql/prompts/index.d.ts.map +1 -1
  65. package/dist/adapters/mysql/prompts/index.js +98 -62
  66. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  67. package/dist/adapters/mysql/prompts/indexTuning.d.ts +1 -1
  68. package/dist/adapters/mysql/prompts/indexTuning.d.ts.map +1 -1
  69. package/dist/adapters/mysql/prompts/indexTuning.js +11 -7
  70. package/dist/adapters/mysql/prompts/indexTuning.js.map +1 -1
  71. package/dist/adapters/mysql/prompts/mysqlshSetup.d.ts +1 -1
  72. package/dist/adapters/mysql/prompts/mysqlshSetup.js +4 -4
  73. package/dist/adapters/mysql/prompts/mysqlshSetup.js.map +1 -1
  74. package/dist/adapters/mysql/prompts/proxysqlSetup.d.ts +1 -1
  75. package/dist/adapters/mysql/prompts/proxysqlSetup.js +3 -3
  76. package/dist/adapters/mysql/prompts/proxysqlSetup.js.map +1 -1
  77. package/dist/adapters/mysql/prompts/replicationSetup.d.ts +1 -1
  78. package/dist/adapters/mysql/prompts/replicationSetup.d.ts.map +1 -1
  79. package/dist/adapters/mysql/prompts/replicationSetup.js +13 -7
  80. package/dist/adapters/mysql/prompts/replicationSetup.js.map +1 -1
  81. package/dist/adapters/mysql/prompts/routerSetup.d.ts +1 -1
  82. package/dist/adapters/mysql/prompts/routerSetup.js +3 -3
  83. package/dist/adapters/mysql/prompts/routerSetup.js.map +1 -1
  84. package/dist/adapters/mysql/prompts/spatialSetup.d.ts +1 -1
  85. package/dist/adapters/mysql/prompts/spatialSetup.js +3 -3
  86. package/dist/adapters/mysql/prompts/spatialSetup.js.map +1 -1
  87. package/dist/adapters/mysql/prompts/sysSchema.d.ts +1 -1
  88. package/dist/adapters/mysql/prompts/sysSchema.d.ts.map +1 -1
  89. package/dist/adapters/mysql/prompts/sysSchema.js +3 -3
  90. package/dist/adapters/mysql/prompts/sysSchema.js.map +1 -1
  91. package/dist/adapters/mysql/resources/capabilities.d.ts +2 -2
  92. package/dist/adapters/mysql/resources/capabilities.d.ts.map +1 -1
  93. package/dist/adapters/mysql/resources/capabilities.js +17 -15
  94. package/dist/adapters/mysql/resources/capabilities.js.map +1 -1
  95. package/dist/adapters/mysql/resources/cluster.d.ts +2 -2
  96. package/dist/adapters/mysql/resources/cluster.d.ts.map +1 -1
  97. package/dist/adapters/mysql/resources/cluster.js +17 -15
  98. package/dist/adapters/mysql/resources/cluster.js.map +1 -1
  99. package/dist/adapters/mysql/resources/docstore.d.ts +2 -2
  100. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  101. package/dist/adapters/mysql/resources/docstore.js +12 -12
  102. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  103. package/dist/adapters/mysql/resources/events.d.ts +2 -2
  104. package/dist/adapters/mysql/resources/events.d.ts.map +1 -1
  105. package/dist/adapters/mysql/resources/events.js +12 -12
  106. package/dist/adapters/mysql/resources/events.js.map +1 -1
  107. package/dist/adapters/mysql/resources/health.d.ts +2 -2
  108. package/dist/adapters/mysql/resources/health.d.ts.map +1 -1
  109. package/dist/adapters/mysql/resources/health.js +36 -32
  110. package/dist/adapters/mysql/resources/health.js.map +1 -1
  111. package/dist/adapters/mysql/resources/index.d.ts +2 -2
  112. package/dist/adapters/mysql/resources/index.js +19 -19
  113. package/dist/adapters/mysql/resources/index.js.map +1 -1
  114. package/dist/adapters/mysql/resources/indexes.d.ts +2 -2
  115. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  116. package/dist/adapters/mysql/resources/indexes.js +12 -12
  117. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  118. package/dist/adapters/mysql/resources/innodb.d.ts +2 -2
  119. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  120. package/dist/adapters/mysql/resources/innodb.js +37 -36
  121. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  122. package/dist/adapters/mysql/resources/locks.d.ts +2 -2
  123. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  124. package/dist/adapters/mysql/resources/locks.js +14 -14
  125. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  126. package/dist/adapters/mysql/resources/performance.d.ts +2 -2
  127. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  128. package/dist/adapters/mysql/resources/performance.js +30 -29
  129. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  130. package/dist/adapters/mysql/resources/pool.d.ts +2 -2
  131. package/dist/adapters/mysql/resources/pool.d.ts.map +1 -1
  132. package/dist/adapters/mysql/resources/pool.js +9 -9
  133. package/dist/adapters/mysql/resources/pool.js.map +1 -1
  134. package/dist/adapters/mysql/resources/processlist.d.ts +2 -2
  135. package/dist/adapters/mysql/resources/processlist.d.ts.map +1 -1
  136. package/dist/adapters/mysql/resources/processlist.js +9 -9
  137. package/dist/adapters/mysql/resources/processlist.js.map +1 -1
  138. package/dist/adapters/mysql/resources/replication.d.ts +2 -2
  139. package/dist/adapters/mysql/resources/replication.d.ts.map +1 -1
  140. package/dist/adapters/mysql/resources/replication.js +42 -35
  141. package/dist/adapters/mysql/resources/replication.js.map +1 -1
  142. package/dist/adapters/mysql/resources/schema.d.ts +2 -2
  143. package/dist/adapters/mysql/resources/schema.d.ts.map +1 -1
  144. package/dist/adapters/mysql/resources/schema.js +8 -8
  145. package/dist/adapters/mysql/resources/schema.js.map +1 -1
  146. package/dist/adapters/mysql/resources/spatial.d.ts +2 -2
  147. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  148. package/dist/adapters/mysql/resources/spatial.js +9 -9
  149. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  150. package/dist/adapters/mysql/resources/status.d.ts +2 -2
  151. package/dist/adapters/mysql/resources/status.d.ts.map +1 -1
  152. package/dist/adapters/mysql/resources/status.js +10 -10
  153. package/dist/adapters/mysql/resources/status.js.map +1 -1
  154. package/dist/adapters/mysql/resources/sysschema.d.ts +2 -2
  155. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  156. package/dist/adapters/mysql/resources/sysschema.js +10 -10
  157. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  158. package/dist/adapters/mysql/resources/tables.d.ts +2 -2
  159. package/dist/adapters/mysql/resources/tables.d.ts.map +1 -1
  160. package/dist/adapters/mysql/resources/tables.js +8 -8
  161. package/dist/adapters/mysql/resources/tables.js.map +1 -1
  162. package/dist/adapters/mysql/resources/variables.d.ts +2 -2
  163. package/dist/adapters/mysql/resources/variables.d.ts.map +1 -1
  164. package/dist/adapters/mysql/resources/variables.js +10 -10
  165. package/dist/adapters/mysql/resources/variables.js.map +1 -1
  166. package/dist/adapters/mysql/tools/admin/backup.d.ts +2 -2
  167. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  168. package/dist/adapters/mysql/tools/admin/backup.js +191 -99
  169. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  170. package/dist/adapters/mysql/tools/admin/index.d.ts +2 -2
  171. package/dist/adapters/mysql/tools/admin/index.js +6 -6
  172. package/dist/adapters/mysql/tools/admin/index.js.map +1 -1
  173. package/dist/adapters/mysql/tools/admin/maintenance.d.ts +2 -2
  174. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  175. package/dist/adapters/mysql/tools/admin/maintenance.js +93 -62
  176. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  177. package/dist/adapters/mysql/tools/admin/monitoring.d.ts +2 -2
  178. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  179. package/dist/adapters/mysql/tools/admin/monitoring.js +215 -79
  180. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  181. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts +2 -2
  182. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  183. package/dist/adapters/mysql/tools/cluster/group-replication.js +90 -74
  184. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  185. package/dist/adapters/mysql/tools/cluster/index.d.ts +2 -2
  186. package/dist/adapters/mysql/tools/cluster/index.js +3 -3
  187. package/dist/adapters/mysql/tools/cluster/index.js.map +1 -1
  188. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts +2 -2
  189. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  190. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +204 -97
  191. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  192. package/dist/adapters/mysql/tools/core.d.ts +2 -2
  193. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  194. package/dist/adapters/mysql/tools/core.js +205 -97
  195. package/dist/adapters/mysql/tools/core.js.map +1 -1
  196. package/dist/adapters/mysql/tools/docstore.d.ts +2 -2
  197. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  198. package/dist/adapters/mysql/tools/docstore.js +252 -117
  199. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  200. package/dist/adapters/mysql/tools/events.d.ts +2 -2
  201. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  202. package/dist/adapters/mysql/tools/events.js +219 -108
  203. package/dist/adapters/mysql/tools/events.js.map +1 -1
  204. package/dist/adapters/mysql/tools/index.d.ts +19 -19
  205. package/dist/adapters/mysql/tools/index.d.ts.map +1 -1
  206. package/dist/adapters/mysql/tools/index.js +19 -19
  207. package/dist/adapters/mysql/tools/index.js.map +1 -1
  208. package/dist/adapters/mysql/tools/json/core.d.ts +2 -2
  209. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  210. package/dist/adapters/mysql/tools/json/core.js +221 -127
  211. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  212. package/dist/adapters/mysql/tools/json/enhanced.d.ts +2 -2
  213. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  214. package/dist/adapters/mysql/tools/json/enhanced.js +274 -163
  215. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  216. package/dist/adapters/mysql/tools/json/helpers.d.ts +2 -2
  217. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  218. package/dist/adapters/mysql/tools/json/helpers.js +134 -56
  219. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  220. package/dist/adapters/mysql/tools/json/index.d.ts +2 -2
  221. package/dist/adapters/mysql/tools/json/index.js +6 -6
  222. package/dist/adapters/mysql/tools/json/index.js.map +1 -1
  223. package/dist/adapters/mysql/tools/partitioning.d.ts +2 -2
  224. package/dist/adapters/mysql/tools/partitioning.js +143 -59
  225. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  226. package/dist/adapters/mysql/tools/performance/analysis.d.ts +2 -2
  227. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  228. package/dist/adapters/mysql/tools/performance/analysis.js +122 -86
  229. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  230. package/dist/adapters/mysql/tools/performance/index.d.ts +2 -2
  231. package/dist/adapters/mysql/tools/performance/index.js +4 -4
  232. package/dist/adapters/mysql/tools/performance/index.js.map +1 -1
  233. package/dist/adapters/mysql/tools/performance/optimization.d.ts +3 -3
  234. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  235. package/dist/adapters/mysql/tools/performance/optimization.js +195 -73
  236. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  237. package/dist/adapters/mysql/tools/proxysql.d.ts +2 -2
  238. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  239. package/dist/adapters/mysql/tools/proxysql.js +213 -125
  240. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  241. package/dist/adapters/mysql/tools/replication.d.ts +2 -2
  242. package/dist/adapters/mysql/tools/replication.d.ts.map +1 -1
  243. package/dist/adapters/mysql/tools/replication.js +117 -66
  244. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  245. package/dist/adapters/mysql/tools/roles.d.ts +2 -2
  246. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  247. package/dist/adapters/mysql/tools/roles.js +276 -84
  248. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  249. package/dist/adapters/mysql/tools/router.d.ts +2 -2
  250. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  251. package/dist/adapters/mysql/tools/router.js +174 -109
  252. package/dist/adapters/mysql/tools/router.js.map +1 -1
  253. package/dist/adapters/mysql/tools/schema/constraints.d.ts +2 -2
  254. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  255. package/dist/adapters/mysql/tools/schema/constraints.js +24 -15
  256. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  257. package/dist/adapters/mysql/tools/schema/index.d.ts +2 -2
  258. package/dist/adapters/mysql/tools/schema/index.d.ts.map +1 -1
  259. package/dist/adapters/mysql/tools/schema/index.js +7 -7
  260. package/dist/adapters/mysql/tools/schema/index.js.map +1 -1
  261. package/dist/adapters/mysql/tools/schema/management.d.ts +2 -2
  262. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  263. package/dist/adapters/mysql/tools/schema/management.js +99 -42
  264. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  265. package/dist/adapters/mysql/tools/schema/routines.d.ts +2 -2
  266. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  267. package/dist/adapters/mysql/tools/schema/routines.js +36 -19
  268. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  269. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts +2 -2
  270. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  271. package/dist/adapters/mysql/tools/schema/scheduled_events.js +26 -13
  272. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  273. package/dist/adapters/mysql/tools/schema/triggers.d.ts +2 -2
  274. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  275. package/dist/adapters/mysql/tools/schema/triggers.js +24 -13
  276. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  277. package/dist/adapters/mysql/tools/schema/views.d.ts +2 -2
  278. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  279. package/dist/adapters/mysql/tools/schema/views.js +59 -28
  280. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  281. package/dist/adapters/mysql/tools/security/audit.d.ts +2 -2
  282. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  283. package/dist/adapters/mysql/tools/security/audit.js +61 -55
  284. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  285. package/dist/adapters/mysql/tools/security/data-protection.d.ts +2 -2
  286. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  287. package/dist/adapters/mysql/tools/security/data-protection.js +188 -80
  288. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  289. package/dist/adapters/mysql/tools/security/encryption.d.ts +2 -2
  290. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  291. package/dist/adapters/mysql/tools/security/encryption.js +86 -67
  292. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  293. package/dist/adapters/mysql/tools/security/index.d.ts +2 -2
  294. package/dist/adapters/mysql/tools/security/index.js +4 -4
  295. package/dist/adapters/mysql/tools/security/index.js.map +1 -1
  296. package/dist/adapters/mysql/tools/shell/backup.d.ts +1 -1
  297. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  298. package/dist/adapters/mysql/tools/shell/backup.js +122 -63
  299. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  300. package/dist/adapters/mysql/tools/shell/common.d.ts.map +1 -1
  301. package/dist/adapters/mysql/tools/shell/common.js +34 -36
  302. package/dist/adapters/mysql/tools/shell/common.js.map +1 -1
  303. package/dist/adapters/mysql/tools/shell/data-transfer.d.ts +1 -1
  304. package/dist/adapters/mysql/tools/shell/data-transfer.d.ts.map +1 -1
  305. package/dist/adapters/mysql/tools/shell/data-transfer.js +125 -69
  306. package/dist/adapters/mysql/tools/shell/data-transfer.js.map +1 -1
  307. package/dist/adapters/mysql/tools/shell/index.d.ts +2 -2
  308. package/dist/adapters/mysql/tools/shell/index.js +6 -6
  309. package/dist/adapters/mysql/tools/shell/index.js.map +1 -1
  310. package/dist/adapters/mysql/tools/shell/info.d.ts +1 -1
  311. package/dist/adapters/mysql/tools/shell/info.d.ts.map +1 -1
  312. package/dist/adapters/mysql/tools/shell/info.js +12 -12
  313. package/dist/adapters/mysql/tools/shell/info.js.map +1 -1
  314. package/dist/adapters/mysql/tools/shell/restore.d.ts +1 -1
  315. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  316. package/dist/adapters/mysql/tools/shell/restore.js +77 -42
  317. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  318. package/dist/adapters/mysql/tools/shell/utilities.d.ts +1 -1
  319. package/dist/adapters/mysql/tools/shell/utilities.d.ts.map +1 -1
  320. package/dist/adapters/mysql/tools/shell/utilities.js +42 -18
  321. package/dist/adapters/mysql/tools/shell/utilities.js.map +1 -1
  322. package/dist/adapters/mysql/tools/spatial/geometry.d.ts +2 -2
  323. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  324. package/dist/adapters/mysql/tools/spatial/geometry.js +85 -46
  325. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  326. package/dist/adapters/mysql/tools/spatial/index.d.ts +2 -2
  327. package/dist/adapters/mysql/tools/spatial/index.js +5 -5
  328. package/dist/adapters/mysql/tools/spatial/index.js.map +1 -1
  329. package/dist/adapters/mysql/tools/spatial/operations.d.ts +2 -2
  330. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  331. package/dist/adapters/mysql/tools/spatial/operations.js +167 -106
  332. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  333. package/dist/adapters/mysql/tools/spatial/queries.d.ts +2 -2
  334. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  335. package/dist/adapters/mysql/tools/spatial/queries.js +144 -100
  336. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  337. package/dist/adapters/mysql/tools/spatial/setup.d.ts +2 -2
  338. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  339. package/dist/adapters/mysql/tools/spatial/setup.js +104 -34
  340. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  341. package/dist/adapters/mysql/tools/stats/comparative.d.ts +2 -2
  342. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  343. package/dist/adapters/mysql/tools/stats/comparative.js +159 -107
  344. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  345. package/dist/adapters/mysql/tools/stats/descriptive.d.ts +2 -2
  346. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  347. package/dist/adapters/mysql/tools/stats/descriptive.js +268 -205
  348. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  349. package/dist/adapters/mysql/tools/stats/index.d.ts +2 -2
  350. package/dist/adapters/mysql/tools/stats/index.js +3 -3
  351. package/dist/adapters/mysql/tools/stats/index.js.map +1 -1
  352. package/dist/adapters/mysql/tools/sysschema/activity.d.ts +2 -2
  353. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  354. package/dist/adapters/mysql/tools/sysschema/activity.js +23 -23
  355. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  356. package/dist/adapters/mysql/tools/sysschema/index.d.ts +2 -2
  357. package/dist/adapters/mysql/tools/sysschema/index.js +4 -4
  358. package/dist/adapters/mysql/tools/sysschema/index.js.map +1 -1
  359. package/dist/adapters/mysql/tools/sysschema/performance.d.ts +2 -2
  360. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  361. package/dist/adapters/mysql/tools/sysschema/performance.js +58 -43
  362. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  363. package/dist/adapters/mysql/tools/sysschema/resources.d.ts +2 -2
  364. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  365. package/dist/adapters/mysql/tools/sysschema/resources.js +53 -33
  366. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  367. package/dist/adapters/mysql/tools/text/fulltext.d.ts +4 -3
  368. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  369. package/dist/adapters/mysql/tools/text/fulltext.js +211 -54
  370. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  371. package/dist/adapters/mysql/tools/text/index.d.ts +3 -3
  372. package/dist/adapters/mysql/tools/text/index.d.ts.map +1 -1
  373. package/dist/adapters/mysql/tools/text/index.js +6 -5
  374. package/dist/adapters/mysql/tools/text/index.js.map +1 -1
  375. package/dist/adapters/mysql/tools/text/processing.d.ts +2 -2
  376. package/dist/adapters/mysql/tools/text/processing.d.ts.map +1 -1
  377. package/dist/adapters/mysql/tools/text/processing.js +191 -103
  378. package/dist/adapters/mysql/tools/text/processing.js.map +1 -1
  379. package/dist/adapters/mysql/tools/transactions.d.ts +2 -2
  380. package/dist/adapters/mysql/tools/transactions.js +156 -79
  381. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  382. package/dist/adapters/mysql/types/proxysql-types.d.ts +7 -2
  383. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  384. package/dist/adapters/mysql/types/proxysql-types.js +52 -30
  385. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  386. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  387. package/dist/adapters/mysql/types/router-types.js +17 -17
  388. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  389. package/dist/adapters/mysql/types/shell-types.d.ts +1 -2
  390. package/dist/adapters/mysql/types/shell-types.d.ts.map +1 -1
  391. package/dist/adapters/mysql/types/shell-types.js +255 -82
  392. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  393. package/dist/adapters/mysql/types.d.ts +8 -2
  394. package/dist/adapters/mysql/types.d.ts.map +1 -1
  395. package/dist/adapters/mysql/types.js +269 -128
  396. package/dist/adapters/mysql/types.js.map +1 -1
  397. package/dist/auth/AuthorizationServerDiscovery.d.ts +1 -1
  398. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -1
  399. package/dist/auth/AuthorizationServerDiscovery.js +16 -14
  400. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -1
  401. package/dist/auth/OAuthResourceServer.d.ts +1 -1
  402. package/dist/auth/OAuthResourceServer.d.ts.map +1 -1
  403. package/dist/auth/OAuthResourceServer.js +4 -4
  404. package/dist/auth/OAuthResourceServer.js.map +1 -1
  405. package/dist/auth/TokenValidator.d.ts +1 -1
  406. package/dist/auth/TokenValidator.d.ts.map +1 -1
  407. package/dist/auth/TokenValidator.js +30 -20
  408. package/dist/auth/TokenValidator.js.map +1 -1
  409. package/dist/auth/errors.d.ts.map +1 -1
  410. package/dist/auth/errors.js +24 -24
  411. package/dist/auth/errors.js.map +1 -1
  412. package/dist/auth/index.d.ts +7 -7
  413. package/dist/auth/index.d.ts.map +1 -1
  414. package/dist/auth/index.js +6 -6
  415. package/dist/auth/index.js.map +1 -1
  416. package/dist/auth/middleware.d.ts +2 -2
  417. package/dist/auth/middleware.d.ts.map +1 -1
  418. package/dist/auth/middleware.js +28 -24
  419. package/dist/auth/middleware.js.map +1 -1
  420. package/dist/auth/scopes.d.ts +2 -2
  421. package/dist/auth/scopes.d.ts.map +1 -1
  422. package/dist/auth/scopes.js +22 -16
  423. package/dist/auth/scopes.js.map +1 -1
  424. package/dist/auth/types.d.ts +2 -2
  425. package/dist/auth/types.d.ts.map +1 -1
  426. package/dist/cli/args.d.ts +1 -1
  427. package/dist/cli/args.d.ts.map +1 -1
  428. package/dist/cli/args.js +70 -68
  429. package/dist/cli/args.js.map +1 -1
  430. package/dist/cli.d.ts +1 -1
  431. package/dist/cli.d.ts.map +1 -1
  432. package/dist/cli.js +44 -34
  433. package/dist/cli.js.map +1 -1
  434. package/dist/constants/ServerInstructions.d.ts +2 -2
  435. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  436. package/dist/constants/ServerInstructions.js +228 -36
  437. package/dist/constants/ServerInstructions.js.map +1 -1
  438. package/dist/filtering/ToolConstants.d.ts +6 -6
  439. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  440. package/dist/filtering/ToolConstants.js +229 -208
  441. package/dist/filtering/ToolConstants.js.map +1 -1
  442. package/dist/filtering/ToolFilter.d.ts +2 -2
  443. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  444. package/dist/filtering/ToolFilter.js +35 -36
  445. package/dist/filtering/ToolFilter.js.map +1 -1
  446. package/dist/index.d.ts +9 -9
  447. package/dist/index.d.ts.map +1 -1
  448. package/dist/index.js +7 -7
  449. package/dist/index.js.map +1 -1
  450. package/dist/logging/McpLogging.d.ts +2 -2
  451. package/dist/logging/McpLogging.d.ts.map +1 -1
  452. package/dist/logging/McpLogging.js +16 -13
  453. package/dist/logging/McpLogging.js.map +1 -1
  454. package/dist/logging/index.d.ts +1 -1
  455. package/dist/logging/index.js +1 -1
  456. package/dist/pool/ConnectionPool.d.ts +3 -3
  457. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  458. package/dist/pool/ConnectionPool.js +30 -26
  459. package/dist/pool/ConnectionPool.js.map +1 -1
  460. package/dist/progress/ProgressReporter.d.ts +1 -1
  461. package/dist/progress/ProgressReporter.d.ts.map +1 -1
  462. package/dist/progress/ProgressReporter.js +5 -5
  463. package/dist/progress/ProgressReporter.js.map +1 -1
  464. package/dist/progress/index.d.ts +1 -1
  465. package/dist/progress/index.d.ts.map +1 -1
  466. package/dist/progress/index.js +1 -1
  467. package/dist/progress/index.js.map +1 -1
  468. package/dist/server/McpServer.d.ts +3 -3
  469. package/dist/server/McpServer.d.ts.map +1 -1
  470. package/dist/server/McpServer.js +58 -53
  471. package/dist/server/McpServer.js.map +1 -1
  472. package/dist/transports/http.d.ts +3 -3
  473. package/dist/transports/http.d.ts.map +1 -1
  474. package/dist/transports/http.js +36 -33
  475. package/dist/transports/http.js.map +1 -1
  476. package/dist/transports/index.d.ts +1 -1
  477. package/dist/transports/index.d.ts.map +1 -1
  478. package/dist/transports/index.js +1 -1
  479. package/dist/transports/index.js.map +1 -1
  480. package/dist/types/index.d.ts +6 -6
  481. package/dist/types/index.d.ts.map +1 -1
  482. package/dist/types/index.js +1 -1
  483. package/dist/types/index.js.map +1 -1
  484. package/dist/types/modules/database.d.ts +1 -1
  485. package/dist/types/modules/database.d.ts.map +1 -1
  486. package/dist/types/modules/errors.d.ts.map +1 -1
  487. package/dist/types/modules/errors.js +15 -15
  488. package/dist/types/modules/errors.js.map +1 -1
  489. package/dist/types/modules/oauth.d.ts +1 -1
  490. package/dist/types/modules/oauth.d.ts.map +1 -1
  491. package/dist/types/modules/query.d.ts +8 -8
  492. package/dist/types/modules/query.d.ts.map +1 -1
  493. package/dist/types/modules/server.d.ts +3 -3
  494. package/dist/types/modules/server.d.ts.map +1 -1
  495. package/dist/types/modules/tools.d.ts +6 -6
  496. package/dist/types/modules/tools.d.ts.map +1 -1
  497. package/dist/utils/logger.d.ts +2 -2
  498. package/dist/utils/logger.d.ts.map +1 -1
  499. package/dist/utils/logger.js +58 -55
  500. package/dist/utils/logger.js.map +1 -1
  501. package/dist/utils/promptGenerator.d.ts +1 -1
  502. package/dist/utils/promptGenerator.d.ts.map +1 -1
  503. package/dist/utils/promptGenerator.js +24 -16
  504. package/dist/utils/promptGenerator.js.map +1 -1
  505. package/dist/utils/validators.d.ts +21 -2
  506. package/dist/utils/validators.d.ts.map +1 -1
  507. package/dist/utils/validators.js +101 -13
  508. package/dist/utils/validators.js.map +1 -1
  509. package/eslint.config.js +117 -81
  510. package/package.json +61 -64
  511. package/releases/release-notes.md +32 -26
  512. package/releases/v2.0.0-release-notes.md +99 -51
  513. package/releases/v2.1.0-release-notes.md +14 -5
  514. package/releases/v2.2.0-release-notes.md +239 -0
  515. package/server.json +1 -1
  516. package/src/__tests__/cli.test.ts +302 -247
  517. package/src/__tests__/index.test.ts +21 -21
  518. package/src/__tests__/mocks/adapter.ts +204 -163
  519. package/src/__tests__/mocks/index.ts +30 -23
  520. package/src/__tests__/mocks/mysql.ts +94 -84
  521. package/src/__tests__/perf.test.ts +207 -203
  522. package/src/__tests__/performance.test.ts +173 -164
  523. package/src/__tests__/setup.ts +26 -21
  524. package/src/adapters/DatabaseAdapter.ts +386 -340
  525. package/src/adapters/__tests__/DatabaseAdapter.test.ts +455 -377
  526. package/src/adapters/mysql/MySQLAdapter.ts +550 -486
  527. package/src/adapters/mysql/SchemaManager.ts +251 -208
  528. package/src/adapters/mysql/__tests__/MySQLAdapter.integration.test.ts +150 -147
  529. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +590 -477
  530. package/src/adapters/mysql/__tests__/SchemaManager.test.ts +196 -154
  531. package/src/adapters/mysql/index.ts +2 -2
  532. package/src/adapters/mysql/prompts/__tests__/indexTuning.test.ts +33 -26
  533. package/src/adapters/mysql/prompts/__tests__/prompts.test.ts +277 -239
  534. package/src/adapters/mysql/prompts/backupStrategy.ts +29 -17
  535. package/src/adapters/mysql/prompts/clusterSetup.ts +11 -10
  536. package/src/adapters/mysql/prompts/docstoreSetup.ts +10 -10
  537. package/src/adapters/mysql/prompts/eventScheduler.ts +10 -10
  538. package/src/adapters/mysql/prompts/healthCheck.ts +20 -15
  539. package/src/adapters/mysql/prompts/index.ts +194 -144
  540. package/src/adapters/mysql/prompts/indexTuning.ts +22 -17
  541. package/src/adapters/mysql/prompts/mysqlshSetup.ts +11 -11
  542. package/src/adapters/mysql/prompts/proxysqlSetup.ts +10 -10
  543. package/src/adapters/mysql/prompts/replicationSetup.ts +24 -16
  544. package/src/adapters/mysql/prompts/routerSetup.ts +10 -10
  545. package/src/adapters/mysql/prompts/spatialSetup.ts +10 -10
  546. package/src/adapters/mysql/prompts/sysSchema.ts +11 -10
  547. package/src/adapters/mysql/resources/__tests__/capabilities.test.ts +69 -47
  548. package/src/adapters/mysql/resources/__tests__/cluster.test.ts +163 -104
  549. package/src/adapters/mysql/resources/__tests__/docstore.test.ts +88 -81
  550. package/src/adapters/mysql/resources/__tests__/events.test.ts +94 -83
  551. package/src/adapters/mysql/resources/__tests__/health.test.ts +131 -91
  552. package/src/adapters/mysql/resources/__tests__/indexes.test.ts +125 -102
  553. package/src/adapters/mysql/resources/__tests__/innodb.test.ts +86 -62
  554. package/src/adapters/mysql/resources/__tests__/locks.test.ts +142 -104
  555. package/src/adapters/mysql/resources/__tests__/performance.test.ts +81 -58
  556. package/src/adapters/mysql/resources/__tests__/pool.test.ts +45 -40
  557. package/src/adapters/mysql/resources/__tests__/processlist.test.ts +39 -23
  558. package/src/adapters/mysql/resources/__tests__/replication.test.ts +265 -211
  559. package/src/adapters/mysql/resources/__tests__/resources.test.ts +121 -109
  560. package/src/adapters/mysql/resources/__tests__/schema.test.ts +29 -23
  561. package/src/adapters/mysql/resources/__tests__/spatial.test.ts +58 -45
  562. package/src/adapters/mysql/resources/__tests__/status.test.ts +62 -45
  563. package/src/adapters/mysql/resources/__tests__/sysschema.test.ts +99 -60
  564. package/src/adapters/mysql/resources/__tests__/tables.test.ts +41 -32
  565. package/src/adapters/mysql/resources/__tests__/variables.test.ts +77 -49
  566. package/src/adapters/mysql/resources/capabilities.ts +59 -42
  567. package/src/adapters/mysql/resources/cluster.ts +58 -49
  568. package/src/adapters/mysql/resources/docstore.ts +46 -41
  569. package/src/adapters/mysql/resources/events.ts +37 -31
  570. package/src/adapters/mysql/resources/health.ts +98 -74
  571. package/src/adapters/mysql/resources/index.ts +46 -46
  572. package/src/adapters/mysql/resources/indexes.ts +66 -51
  573. package/src/adapters/mysql/resources/innodb.ts +98 -81
  574. package/src/adapters/mysql/resources/locks.ts +43 -40
  575. package/src/adapters/mysql/resources/performance.ts +80 -67
  576. package/src/adapters/mysql/resources/pool.ts +23 -20
  577. package/src/adapters/mysql/resources/processlist.ts +23 -18
  578. package/src/adapters/mysql/resources/replication.ts +124 -105
  579. package/src/adapters/mysql/resources/schema.ts +23 -18
  580. package/src/adapters/mysql/resources/spatial.ts +31 -26
  581. package/src/adapters/mysql/resources/status.ts +27 -22
  582. package/src/adapters/mysql/resources/sysschema.ts +41 -36
  583. package/src/adapters/mysql/resources/tables.ts +23 -18
  584. package/src/adapters/mysql/resources/variables.ts +27 -22
  585. package/src/adapters/mysql/tools/__tests__/cluster.test.ts +419 -311
  586. package/src/adapters/mysql/tools/__tests__/core.test.ts +633 -382
  587. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +782 -413
  588. package/src/adapters/mysql/tools/__tests__/events.test.ts +752 -486
  589. package/src/adapters/mysql/tools/__tests__/json_core.test.ts +326 -259
  590. package/src/adapters/mysql/tools/__tests__/json_enhanced.test.ts +452 -352
  591. package/src/adapters/mysql/tools/__tests__/json_helpers.test.ts +169 -136
  592. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +576 -340
  593. package/src/adapters/mysql/tools/__tests__/replication.test.ts +697 -393
  594. package/src/adapters/mysql/tools/__tests__/roles.test.ts +423 -166
  595. package/src/adapters/mysql/tools/__tests__/router.test.ts +644 -540
  596. package/src/adapters/mysql/tools/__tests__/security.test.ts +708 -422
  597. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +246 -173
  598. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +244 -205
  599. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +413 -300
  600. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +503 -150
  601. package/src/adapters/mysql/tools/__tests__/stats.test.ts +861 -553
  602. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +454 -263
  603. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +612 -372
  604. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +550 -257
  605. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +549 -352
  606. package/src/adapters/mysql/tools/admin/backup.ts +334 -215
  607. package/src/adapters/mysql/tools/admin/index.ts +46 -46
  608. package/src/adapters/mysql/tools/admin/maintenance.ts +176 -130
  609. package/src/adapters/mysql/tools/admin/monitoring.ts +373 -199
  610. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +200 -186
  611. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +364 -95
  612. package/src/adapters/mysql/tools/cluster/group-replication.ts +218 -183
  613. package/src/adapters/mysql/tools/cluster/index.ts +27 -27
  614. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +392 -251
  615. package/src/adapters/mysql/tools/core.ts +408 -285
  616. package/src/adapters/mysql/tools/docstore.ts +478 -276
  617. package/src/adapters/mysql/tools/events.ts +425 -285
  618. package/src/adapters/mysql/tools/index.ts +31 -20
  619. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +456 -199
  620. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +554 -298
  621. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +150 -74
  622. package/src/adapters/mysql/tools/json/__tests__/validation.test.ts +106 -72
  623. package/src/adapters/mysql/tools/json/core.ts +364 -263
  624. package/src/adapters/mysql/tools/json/enhanced.ts +368 -229
  625. package/src/adapters/mysql/tools/json/helpers.ts +195 -113
  626. package/src/adapters/mysql/tools/json/index.ts +46 -46
  627. package/src/adapters/mysql/tools/partitioning.ts +242 -140
  628. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +439 -247
  629. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +401 -179
  630. package/src/adapters/mysql/tools/performance/analysis.ts +263 -213
  631. package/src/adapters/mysql/tools/performance/index.ts +33 -33
  632. package/src/adapters/mysql/tools/performance/optimization.ts +407 -190
  633. package/src/adapters/mysql/tools/proxysql.ts +462 -320
  634. package/src/adapters/mysql/tools/replication.ts +233 -180
  635. package/src/adapters/mysql/tools/roles.ts +429 -171
  636. package/src/adapters/mysql/tools/router.ts +410 -292
  637. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +157 -82
  638. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +226 -101
  639. package/src/adapters/mysql/tools/schema/__tests__/routines.test.ts +80 -35
  640. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +59 -40
  641. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +65 -40
  642. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +146 -77
  643. package/src/adapters/mysql/tools/schema/constraints.ts +61 -42
  644. package/src/adapters/mysql/tools/schema/index.ts +26 -35
  645. package/src/adapters/mysql/tools/schema/management.ts +167 -94
  646. package/src/adapters/mysql/tools/schema/routines.ts +79 -48
  647. package/src/adapters/mysql/tools/schema/scheduled_events.ts +53 -32
  648. package/src/adapters/mysql/tools/schema/triggers.ts +51 -33
  649. package/src/adapters/mysql/tools/schema/views.ts +96 -53
  650. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +216 -158
  651. package/src/adapters/mysql/tools/security/__tests__/data-protection.test.ts +154 -98
  652. package/src/adapters/mysql/tools/security/__tests__/encryption.test.ts +174 -138
  653. package/src/adapters/mysql/tools/security/audit.ts +213 -193
  654. package/src/adapters/mysql/tools/security/data-protection.ts +336 -198
  655. package/src/adapters/mysql/tools/security/encryption.ts +233 -193
  656. package/src/adapters/mysql/tools/security/index.ts +26 -26
  657. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +443 -283
  658. package/src/adapters/mysql/tools/shell/__tests__/common.test.ts +138 -131
  659. package/src/adapters/mysql/tools/shell/__tests__/data-transfer.test.ts +516 -353
  660. package/src/adapters/mysql/tools/shell/__tests__/info.test.ts +65 -63
  661. package/src/adapters/mysql/tools/shell/__tests__/restore.test.ts +233 -174
  662. package/src/adapters/mysql/tools/shell/__tests__/utilities.test.ts +161 -143
  663. package/src/adapters/mysql/tools/shell/backup.ts +280 -188
  664. package/src/adapters/mysql/tools/shell/common.ts +173 -155
  665. package/src/adapters/mysql/tools/shell/data-transfer.ts +286 -200
  666. package/src/adapters/mysql/tools/shell/index.ts +29 -29
  667. package/src/adapters/mysql/tools/shell/info.ts +35 -31
  668. package/src/adapters/mysql/tools/shell/restore.ts +176 -124
  669. package/src/adapters/mysql/tools/shell/utilities.ts +86 -45
  670. package/src/adapters/mysql/tools/spatial/__tests__/geometry.test.ts +129 -89
  671. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +255 -148
  672. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +340 -245
  673. package/src/adapters/mysql/tools/spatial/geometry.ts +120 -74
  674. package/src/adapters/mysql/tools/spatial/index.ts +33 -33
  675. package/src/adapters/mysql/tools/spatial/operations.ts +243 -171
  676. package/src/adapters/mysql/tools/spatial/queries.ts +221 -165
  677. package/src/adapters/mysql/tools/spatial/setup.ts +157 -73
  678. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +188 -130
  679. package/src/adapters/mysql/tools/stats/comparative.ts +261 -187
  680. package/src/adapters/mysql/tools/stats/descriptive.ts +414 -322
  681. package/src/adapters/mysql/tools/stats/index.ts +23 -23
  682. package/src/adapters/mysql/tools/sysschema/__tests__/activity.test.ts +99 -71
  683. package/src/adapters/mysql/tools/sysschema/__tests__/io_summary_fix.test.ts +21 -18
  684. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +149 -108
  685. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +222 -104
  686. package/src/adapters/mysql/tools/sysschema/activity.ts +72 -64
  687. package/src/adapters/mysql/tools/sysschema/index.ts +24 -24
  688. package/src/adapters/mysql/tools/sysschema/performance.ts +140 -115
  689. package/src/adapters/mysql/tools/sysschema/resources.ts +135 -99
  690. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +526 -145
  691. package/src/adapters/mysql/tools/text/__tests__/processing.test.ts +452 -193
  692. package/src/adapters/mysql/tools/text/fulltext.ts +319 -123
  693. package/src/adapters/mysql/tools/text/index.ts +32 -30
  694. package/src/adapters/mysql/tools/text/processing.ts +310 -212
  695. package/src/adapters/mysql/tools/transactions.ts +284 -197
  696. package/src/adapters/mysql/types/__tests__/shell-types.test.ts +204 -202
  697. package/src/adapters/mysql/types/proxysql-types.ts +142 -109
  698. package/src/adapters/mysql/types/router-types.ts +36 -36
  699. package/src/adapters/mysql/types/shell-types.ts +280 -94
  700. package/src/adapters/mysql/types.ts +288 -131
  701. package/src/auth/AuthorizationServerDiscovery.ts +127 -113
  702. package/src/auth/OAuthResourceServer.ts +67 -62
  703. package/src/auth/TokenValidator.ts +136 -119
  704. package/src/auth/__tests__/AuthorizationServerDiscovery.test.ts +295 -274
  705. package/src/auth/__tests__/OAuthResourceServer.test.ts +180 -169
  706. package/src/auth/__tests__/TokenValidator.test.ts +297 -285
  707. package/src/auth/__tests__/errors.test.ts +180 -175
  708. package/src/auth/__tests__/middleware.test.ts +281 -247
  709. package/src/auth/__tests__/scopes.test.ts +136 -134
  710. package/src/auth/errors.ts +56 -56
  711. package/src/auth/index.ts +23 -17
  712. package/src/auth/middleware.ts +161 -139
  713. package/src/auth/scopes.ts +133 -107
  714. package/src/auth/types.ts +155 -155
  715. package/src/cli/__tests__/args.test.ts +241 -216
  716. package/src/cli/__tests__/main.test.ts +191 -158
  717. package/src/cli/args.ts +271 -258
  718. package/src/cli.ts +150 -127
  719. package/src/constants/ServerInstructions.ts +271 -70
  720. package/src/filtering/ToolConstants.ts +287 -266
  721. package/src/filtering/ToolFilter.ts +239 -220
  722. package/src/filtering/__tests__/ToolFilter.test.ts +442 -396
  723. package/src/index.ts +62 -57
  724. package/src/logging/McpLogging.ts +128 -119
  725. package/src/logging/__tests__/McpLogging.test.ts +223 -223
  726. package/src/logging/index.ts +2 -2
  727. package/src/pool/ConnectionPool.ts +260 -246
  728. package/src/pool/__tests__/ConnectionPool.test.ts +452 -418
  729. package/src/progress/ProgressReporter.ts +123 -123
  730. package/src/progress/__tests__/ProgressReporter.test.ts +235 -229
  731. package/src/progress/index.ts +6 -2
  732. package/src/server/McpServer.ts +305 -285
  733. package/src/server/__tests__/McpServer.test.ts +333 -291
  734. package/src/transports/__tests__/http.test.ts +658 -527
  735. package/src/transports/http.ts +237 -203
  736. package/src/transports/index.ts +6 -2
  737. package/src/types/__tests__/types.test.ts +197 -193
  738. package/src/types/index.ts +49 -37
  739. package/src/types/modules/database.ts +65 -63
  740. package/src/types/modules/errors.ts +41 -37
  741. package/src/types/modules/oauth.ts +46 -46
  742. package/src/types/modules/query.ts +75 -75
  743. package/src/types/modules/server.ts +18 -18
  744. package/src/types/modules/tools.ts +181 -178
  745. package/src/utils/__tests__/logger.test.ts +424 -414
  746. package/src/utils/__tests__/validators.test.ts +250 -165
  747. package/src/utils/logger.ts +343 -330
  748. package/src/utils/promptGenerator.ts +58 -47
  749. package/src/utils/validators.ts +217 -91
  750. package/tsconfig.json +41 -50
  751. package/vitest.config.ts +23 -23
@@ -1,217 +1,474 @@
1
1
  /**
2
2
  * mysql-mcp - Roles Tools Unit Tests
3
- *
3
+ *
4
4
  * Tests for roles tool definitions and annotations.
5
5
  */
6
6
 
7
- import { describe, it, expect, vi, beforeEach } from 'vitest';
8
- import { getRoleTools } from '../roles.js';
9
- import type { MySQLAdapter } from '../../MySQLAdapter.js';
10
- import { createMockMySQLAdapter, createMockRequestContext, createMockQueryResult } from '../../../../__tests__/mocks/index.js';
7
+ import { describe, it, expect, vi, beforeEach } from "vitest";
8
+ import { getRoleTools } from "../roles.js";
9
+ import type { MySQLAdapter } from "../../MySQLAdapter.js";
10
+ import {
11
+ createMockMySQLAdapter,
12
+ createMockRequestContext,
13
+ createMockQueryResult,
14
+ } from "../../../../__tests__/mocks/index.js";
15
+
16
+ describe("getRoleTools", () => {
17
+ let tools: ReturnType<typeof getRoleTools>;
18
+
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ tools = getRoleTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
22
+ });
23
+
24
+ it("should return 8 role tools", () => {
25
+ expect(tools).toHaveLength(8);
26
+ });
27
+
28
+ it("should have roles group for all tools", () => {
29
+ for (const tool of tools) {
30
+ expect(tool.group).toBe("roles");
31
+ }
32
+ });
33
+
34
+ it("should have handler functions for all tools", () => {
35
+ for (const tool of tools) {
36
+ expect(typeof tool.handler).toBe("function");
37
+ }
38
+ });
39
+
40
+ it("should have inputSchema for all tools", () => {
41
+ for (const tool of tools) {
42
+ expect(tool.inputSchema).toBeDefined();
43
+ }
44
+ });
45
+ });
11
46
 
12
- describe('getRoleTools', () => {
13
- let tools: ReturnType<typeof getRoleTools>;
47
+ describe("Handler Execution", () => {
48
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
49
+ let tools: ReturnType<typeof getRoleTools>;
50
+ let mockContext: ReturnType<typeof createMockRequestContext>;
14
51
 
15
- beforeEach(() => {
16
- vi.clearAllMocks();
17
- tools = getRoleTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
18
- });
52
+ beforeEach(() => {
53
+ vi.clearAllMocks();
54
+ mockAdapter = createMockMySQLAdapter();
55
+ tools = getRoleTools(mockAdapter as unknown as MySQLAdapter);
56
+ mockContext = createMockRequestContext();
57
+ });
19
58
 
20
- it('should return 8 role tools', () => {
21
- expect(tools).toHaveLength(8);
22
- });
59
+ describe("mysql_role_list", () => {
60
+ it("should list roles", async () => {
61
+ mockAdapter.executeQuery.mockResolvedValue(
62
+ createMockQueryResult([{ ROLE_NAME: "admin_role" }]),
63
+ );
23
64
 
24
- it('should have roles group for all tools', () => {
25
- for (const tool of tools) {
26
- expect(tool.group).toBe('roles');
27
- }
28
- });
65
+ const tool = tools.find((t) => t.name === "mysql_role_list")!;
66
+ await tool.handler({}, mockContext);
29
67
 
30
- it('should have handler functions for all tools', () => {
31
- for (const tool of tools) {
32
- expect(typeof tool.handler).toBe('function');
33
- }
68
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
34
69
  });
35
70
 
36
- it('should have inputSchema for all tools', () => {
37
- for (const tool of tools) {
38
- expect(tool.inputSchema).toBeDefined();
39
- }
40
- });
41
- });
71
+ it("should list roles with pattern", async () => {
72
+ mockAdapter.executeQuery.mockResolvedValue(
73
+ createMockQueryResult([{ ROLE_NAME: "admin_role" }]),
74
+ );
42
75
 
43
- describe('Handler Execution', () => {
44
- let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
45
- let tools: ReturnType<typeof getRoleTools>;
46
- let mockContext: ReturnType<typeof createMockRequestContext>;
76
+ const tool = tools.find((t) => t.name === "mysql_role_list")!;
77
+ await tool.handler({ pattern: "admin%" }, mockContext);
47
78
 
48
- beforeEach(() => {
49
- vi.clearAllMocks();
50
- mockAdapter = createMockMySQLAdapter();
51
- tools = getRoleTools(mockAdapter as unknown as MySQLAdapter);
52
- mockContext = createMockRequestContext();
79
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
80
+ expect(call).toContain("LIKE 'admin%'");
53
81
  });
82
+ });
54
83
 
55
- describe('mysql_role_list', () => {
56
- it('should list roles', async () => {
57
- mockAdapter.executeQuery.mockResolvedValue(
58
- createMockQueryResult([{ ROLE_NAME: 'admin_role' }])
59
- );
60
-
61
- const tool = tools.find(t => t.name === 'mysql_role_list')!;
62
- await tool.handler({}, mockContext);
84
+ describe("mysql_role_create", () => {
85
+ it("should create a role with IF NOT EXISTS default", async () => {
86
+ // First call: pre-check (role does not exist)
87
+ mockAdapter.executeQuery
88
+ .mockResolvedValueOnce(createMockQueryResult([]))
89
+ .mockResolvedValueOnce(createMockQueryResult([]));
63
90
 
64
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
65
- });
66
-
67
- it('should list roles with pattern', async () => {
68
- mockAdapter.executeQuery.mockResolvedValue(
69
- createMockQueryResult([{ ROLE_NAME: 'admin_role' }])
70
- );
91
+ const tool = tools.find((t) => t.name === "mysql_role_create")!;
92
+ await tool.handler({ name: "test_role" }, mockContext);
71
93
 
72
- const tool = tools.find(t => t.name === 'mysql_role_list')!;
73
- await tool.handler({ pattern: 'admin%' }, mockContext);
74
-
75
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
76
- expect(call).toContain("LIKE 'admin%'");
77
- });
94
+ // Second call should be the CREATE ROLE
95
+ const createCall = mockAdapter.executeQuery.mock.calls[1][0] as string;
96
+ expect(createCall).toContain("CREATE ROLE IF NOT EXISTS");
78
97
  });
79
98
 
80
- describe('mysql_role_create', () => {
81
- it('should create a role with IF NOT EXISTS default', async () => {
82
- const tool = tools.find(t => t.name === 'mysql_role_create')!;
83
- await tool.handler({ name: 'test_role' }, mockContext);
99
+ it("should create a role without IF NOT EXISTS", async () => {
100
+ const tool = tools.find((t) => t.name === "mysql_role_create")!;
101
+ await tool.handler(
102
+ { name: "test_role", ifNotExists: false },
103
+ mockContext,
104
+ );
84
105
 
85
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
86
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
87
- expect(call).toContain('CREATE ROLE IF NOT EXISTS');
88
- });
106
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
107
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
108
+ expect(call).toContain("CREATE ROLE 'test_role'");
109
+ });
89
110
 
90
- it('should create a role without IF NOT EXISTS', async () => {
91
- const tool = tools.find(t => t.name === 'mysql_role_create')!;
92
- await tool.handler({ name: 'test_role', ifNotExists: false }, mockContext);
111
+ it("should reject invalid role names", async () => {
112
+ const tool = tools.find((t) => t.name === "mysql_role_create")!;
113
+ await expect(
114
+ tool.handler({ name: "invalid-role" }, mockContext),
115
+ ).rejects.toThrow("Invalid role name");
116
+ });
93
117
 
94
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
95
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
96
- expect(call).toContain("CREATE ROLE 'test_role'");
97
- });
118
+ it("should return skipped when ifNotExists and role already exists", async () => {
119
+ // Pre-check finds an existing role
120
+ mockAdapter.executeQuery.mockResolvedValueOnce(
121
+ createMockQueryResult([{ "1": 1 }]),
122
+ );
123
+
124
+ const tool = tools.find((t) => t.name === "mysql_role_create")!;
125
+ const result = await tool.handler(
126
+ { name: "test_role", ifNotExists: true },
127
+ mockContext,
128
+ );
129
+
130
+ expect(result).toEqual({
131
+ success: true,
132
+ skipped: true,
133
+ roleName: "test_role",
134
+ reason: "Role already exists",
135
+ });
136
+ // Should NOT have issued a CREATE ROLE query
137
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(1);
138
+ });
139
+ });
140
+
141
+ describe("mysql_role_grant", () => {
142
+ it("should grant privileges to role", async () => {
143
+ const tool = tools.find((t) => t.name === "mysql_role_grant")!;
144
+ await tool.handler(
145
+ {
146
+ role: "test_role",
147
+ privileges: ["SELECT"],
148
+ database: "testdb",
149
+ table: "*",
150
+ },
151
+ mockContext,
152
+ );
153
+
154
+ expect(mockAdapter.rawQuery).toHaveBeenCalled();
155
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
156
+ expect(call).toContain("GRANT SELECT ON `testdb`.* TO 'test_role'");
157
+ });
98
158
 
99
- it('should reject invalid role names', async () => {
100
- const tool = tools.find(t => t.name === 'mysql_role_create')!;
101
- await expect(tool.handler({ name: 'invalid-role' }, mockContext))
102
- .rejects.toThrow('Invalid role name');
103
- });
159
+ it("should handle schema-qualified table name", async () => {
160
+ const tool = tools.find((t) => t.name === "mysql_role_grant")!;
161
+ await tool.handler(
162
+ { role: "test_role", privileges: ["SELECT"], table: "testdb.mytable" },
163
+ mockContext,
164
+ );
165
+
166
+ expect(mockAdapter.rawQuery).toHaveBeenCalled();
167
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
168
+ expect(call).toContain(
169
+ "GRANT SELECT ON `testdb`.`mytable` TO 'test_role'",
170
+ );
104
171
  });
105
172
 
106
- describe('mysql_role_grant', () => {
107
- it('should grant privileges to role', async () => {
108
- const tool = tools.find(t => t.name === 'mysql_role_grant')!;
109
- await tool.handler({ role: 'test_role', privileges: ['SELECT'], database: 'testdb', table: '*' }, mockContext);
173
+ it("should reject invalid role names", async () => {
174
+ const tool = tools.find((t) => t.name === "mysql_role_grant")!;
175
+ await expect(
176
+ tool.handler(
177
+ { role: "invalid-role", privileges: ["SELECT"] },
178
+ mockContext,
179
+ ),
180
+ ).rejects.toThrow("Invalid role name");
181
+ });
182
+ });
183
+
184
+ describe("mysql_role_revoke", () => {
185
+ it("should revoke role from user", async () => {
186
+ // 1: role exists check; 2: user exists check; 3: role_edges assignment check
187
+ mockAdapter.executeQuery
188
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]))
189
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]))
190
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]));
191
+
192
+ const tool = tools.find((t) => t.name === "mysql_role_revoke")!;
193
+ await tool.handler(
194
+ { role: "test_role", user: "testuser", host: "localhost" },
195
+ mockContext,
196
+ );
197
+
198
+ expect(mockAdapter.rawQuery).toHaveBeenCalled();
199
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
200
+ expect(call).toContain("REVOKE");
201
+ });
110
202
 
111
- expect(mockAdapter.rawQuery).toHaveBeenCalled();
112
- const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
113
- expect(call).toContain("GRANT SELECT ON `testdb`.* TO 'test_role'");
114
- });
203
+ it("should return graceful error when role is not assigned", async () => {
204
+ // 1: role exists; 2: user exists; 3: role_edges returns empty
205
+ mockAdapter.executeQuery
206
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]))
207
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]))
208
+ .mockResolvedValueOnce(createMockQueryResult([]));
209
+
210
+ const tool = tools.find((t) => t.name === "mysql_role_revoke")!;
211
+ const result = await tool.handler(
212
+ { role: "test_role", user: "testuser", host: "localhost" },
213
+ mockContext,
214
+ );
215
+
216
+ expect(result).toEqual({
217
+ success: false,
218
+ role: "test_role",
219
+ user: "testuser",
220
+ host: "localhost",
221
+ reason:
222
+ "Role 'test_role' is not assigned to user 'testuser'@'localhost'",
223
+ });
224
+ expect(mockAdapter.rawQuery).not.toHaveBeenCalled();
225
+ });
226
+ });
115
227
 
116
- it('should handle schema-qualified table name', async () => {
117
- const tool = tools.find(t => t.name === 'mysql_role_grant')!;
118
- await tool.handler({ role: 'test_role', privileges: ['SELECT'], table: 'testdb.mytable' }, mockContext);
228
+ describe("mysql_role_drop", () => {
229
+ it("should drop a role with IF EXISTS default", async () => {
230
+ // First call: pre-check (role exists)
231
+ mockAdapter.executeQuery
232
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]))
233
+ .mockResolvedValueOnce(createMockQueryResult([]));
119
234
 
120
- expect(mockAdapter.rawQuery).toHaveBeenCalled();
121
- const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
122
- expect(call).toContain("GRANT SELECT ON `testdb`.`mytable` TO 'test_role'");
123
- });
235
+ const tool = tools.find((t) => t.name === "mysql_role_drop")!;
236
+ await tool.handler({ name: "test_role" }, mockContext);
124
237
 
125
- it('should reject invalid role names', async () => {
126
- const tool = tools.find(t => t.name === 'mysql_role_grant')!;
127
- await expect(tool.handler({ role: 'invalid-role', privileges: ['SELECT'] }, mockContext))
128
- .rejects.toThrow('Invalid role name');
129
- });
238
+ // Second call should be the DROP ROLE
239
+ const dropCall = mockAdapter.executeQuery.mock.calls[1][0] as string;
240
+ expect(dropCall).toContain("DROP ROLE IF EXISTS");
130
241
  });
131
242
 
132
- describe('mysql_role_revoke', () => {
133
- it('should revoke role from user', async () => {
134
- const tool = tools.find(t => t.name === 'mysql_role_revoke')!;
135
- await tool.handler({ role: 'test_role', user: 'testuser', host: 'localhost' }, mockContext);
243
+ it("should drop a role without IF EXISTS", async () => {
244
+ const tool = tools.find((t) => t.name === "mysql_role_drop")!;
245
+ await tool.handler({ name: "test_role", ifExists: false }, mockContext);
136
246
 
137
- expect(mockAdapter.rawQuery).toHaveBeenCalled();
138
- const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
139
- expect(call).toContain('REVOKE');
140
- });
247
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
248
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
249
+ expect(call).toContain("DROP ROLE 'test_role'");
141
250
  });
142
251
 
143
- describe('mysql_role_drop', () => {
144
- it('should drop a role with IF EXISTS default', async () => {
145
- const tool = tools.find(t => t.name === 'mysql_role_drop')!;
146
- await tool.handler({ name: 'test_role' }, mockContext);
147
-
148
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
149
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
150
- expect(call).toContain('DROP ROLE IF EXISTS');
151
- });
152
-
153
- it('should drop a role without IF EXISTS', async () => {
154
- const tool = tools.find(t => t.name === 'mysql_role_drop')!;
155
- await tool.handler({ name: 'test_role', ifExists: false }, mockContext);
156
-
157
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
158
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
159
- expect(call).toContain("DROP ROLE 'test_role'");
160
- });
252
+ it("should reject invalid role names", async () => {
253
+ const tool = tools.find((t) => t.name === "mysql_role_drop")!;
254
+ await expect(
255
+ tool.handler({ name: "invalid-role" }, mockContext),
256
+ ).rejects.toThrow("Invalid role name");
257
+ });
161
258
 
162
- it('should reject invalid role names', async () => {
163
- const tool = tools.find(t => t.name === 'mysql_role_drop')!;
164
- await expect(tool.handler({ name: 'invalid-role' }, mockContext))
165
- .rejects.toThrow('Invalid role name');
166
- });
259
+ it("should return skipped when ifExists and role does not exist", async () => {
260
+ // Pre-check finds no role
261
+ mockAdapter.executeQuery
262
+ .mockResolvedValueOnce(createMockQueryResult([]))
263
+ .mockResolvedValueOnce(createMockQueryResult([]));
264
+
265
+ const tool = tools.find((t) => t.name === "mysql_role_drop")!;
266
+ const result = await tool.handler(
267
+ { name: "test_role", ifExists: true },
268
+ mockContext,
269
+ );
270
+
271
+ expect(result).toEqual({
272
+ success: true,
273
+ skipped: true,
274
+ roleName: "test_role",
275
+ reason: "Role did not exist",
276
+ });
277
+ });
278
+ });
279
+
280
+ describe("mysql_role_assign", () => {
281
+ it("should assign role to user", async () => {
282
+ const tool = tools.find((t) => t.name === "mysql_role_assign")!;
283
+ await tool.handler(
284
+ { role: "test_role", user: "testuser", host: "localhost" },
285
+ mockContext,
286
+ );
287
+
288
+ expect(mockAdapter.rawQuery).toHaveBeenCalled();
289
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
290
+ expect(call).toContain("GRANT");
167
291
  });
168
292
 
169
- describe('mysql_role_assign', () => {
170
- it('should assign role to user', async () => {
171
- const tool = tools.find(t => t.name === 'mysql_role_assign')!;
172
- await tool.handler({ role: 'test_role', user: 'testuser', host: 'localhost' }, mockContext);
293
+ it("should assign role with admin option", async () => {
294
+ const tool = tools.find((t) => t.name === "mysql_role_assign")!;
295
+ await tool.handler(
296
+ {
297
+ role: "test_role",
298
+ user: "testuser",
299
+ host: "localhost",
300
+ withAdminOption: true,
301
+ },
302
+ mockContext,
303
+ );
304
+
305
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
306
+ expect(call).toContain("WITH ADMIN OPTION");
307
+ });
308
+ });
173
309
 
174
- expect(mockAdapter.rawQuery).toHaveBeenCalled();
175
- const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
176
- expect(call).toContain('GRANT');
177
- });
310
+ describe("mysql_role_grants", () => {
311
+ it("should list grants for a role", async () => {
312
+ mockAdapter.rawQuery.mockResolvedValue(
313
+ createMockQueryResult([{ Grants: "SELECT ON *.*" }]),
314
+ );
178
315
 
179
- it('should assign role with admin option', async () => {
180
- const tool = tools.find(t => t.name === 'mysql_role_assign')!;
181
- await tool.handler({ role: 'test_role', user: 'testuser', host: 'localhost', withAdminOption: true }, mockContext);
316
+ const tool = tools.find((t) => t.name === "mysql_role_grants")!;
317
+ await tool.handler({ role: "test_role" }, mockContext);
182
318
 
183
- const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
184
- expect(call).toContain('WITH ADMIN OPTION');
185
- });
319
+ expect(mockAdapter.rawQuery).toHaveBeenCalled();
320
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
321
+ expect(call).toContain("SHOW GRANTS");
186
322
  });
323
+ });
187
324
 
188
- describe('mysql_role_grants', () => {
189
- it('should list grants for a role', async () => {
190
- mockAdapter.rawQuery.mockResolvedValue(
191
- createMockQueryResult([{ Grants: 'SELECT ON *.*' }])
192
- );
325
+ describe("mysql_user_roles", () => {
326
+ it("should list roles assigned to user", async () => {
327
+ mockAdapter.executeQuery.mockResolvedValue(
328
+ createMockQueryResult([{ roleName: "admin_role", roleHost: "%" }]),
329
+ );
193
330
 
194
- const tool = tools.find(t => t.name === 'mysql_role_grants')!;
195
- await tool.handler({ role: 'test_role' }, mockContext);
331
+ const tool = tools.find((t) => t.name === "mysql_user_roles")!;
332
+ await tool.handler({ user: "testuser", host: "localhost" }, mockContext);
196
333
 
197
- expect(mockAdapter.rawQuery).toHaveBeenCalled();
198
- const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
199
- expect(call).toContain('SHOW GRANTS');
200
- });
334
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
335
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
336
+ expect(call).toContain("mysql.user");
201
337
  });
202
338
 
203
- describe('mysql_user_roles', () => {
204
- it('should list roles assigned to user', async () => {
205
- mockAdapter.executeQuery.mockResolvedValue(
206
- createMockQueryResult([{ roleName: 'admin_role', roleHost: '%' }])
207
- );
339
+ it("should return exists: false for nonexistent user", async () => {
340
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
208
341
 
209
- const tool = tools.find(t => t.name === 'mysql_user_roles')!;
210
- await tool.handler({ user: 'testuser', host: 'localhost' }, mockContext);
342
+ const tool = tools.find((t) => t.name === "mysql_user_roles")!;
343
+ const result = await tool.handler(
344
+ { user: "nonexistent", host: "%" },
345
+ mockContext,
346
+ );
211
347
 
212
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
213
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
214
- expect(call).toContain('role_edges');
215
- });
348
+ expect(result).toEqual({
349
+ user: "nonexistent",
350
+ host: "%",
351
+ exists: false,
352
+ });
353
+ });
354
+ });
355
+
356
+ describe("mysql_role_create - error handling", () => {
357
+ it("should return graceful error for duplicate role", async () => {
358
+ mockAdapter.executeQuery.mockRejectedValue(
359
+ new Error("Operation CREATE ROLE failed for 'test_role'@'%'"),
360
+ );
361
+
362
+ const tool = tools.find((t) => t.name === "mysql_role_create")!;
363
+ const result = await tool.handler(
364
+ { name: "test_role", ifNotExists: false },
365
+ mockContext,
366
+ );
367
+
368
+ expect(result).toEqual({
369
+ success: false,
370
+ reason: "Role 'test_role' already exists",
371
+ });
372
+ });
373
+ });
374
+
375
+ describe("mysql_role_drop - error handling", () => {
376
+ it("should return graceful error for nonexistent role", async () => {
377
+ mockAdapter.executeQuery.mockRejectedValue(
378
+ new Error("Operation DROP ROLE failed for 'test_role'@'%'"),
379
+ );
380
+
381
+ const tool = tools.find((t) => t.name === "mysql_role_drop")!;
382
+ const result = await tool.handler(
383
+ { name: "test_role", ifExists: false },
384
+ mockContext,
385
+ );
386
+
387
+ expect(result).toEqual({
388
+ success: false,
389
+ reason: "Role 'test_role' does not exist",
390
+ });
391
+ });
392
+ });
393
+
394
+ describe("mysql_role_assign - error handling", () => {
395
+ it("should return graceful error for nonexistent user", async () => {
396
+ // Role exists check succeeds
397
+ mockAdapter.executeQuery.mockResolvedValue(
398
+ createMockQueryResult([{ "1": 1 }]),
399
+ );
400
+ // GRANT rawQuery fails with unknown user
401
+ mockAdapter.rawQuery.mockRejectedValue(
402
+ new Error("Unknown authorization ID `baduser`@`%`"),
403
+ );
404
+
405
+ const tool = tools.find((t) => t.name === "mysql_role_assign")!;
406
+ const result = await tool.handler(
407
+ { role: "test_role", user: "baduser", host: "%" },
408
+ mockContext,
409
+ );
410
+
411
+ expect(result).toEqual({
412
+ success: false,
413
+ role: "test_role",
414
+ user: "baduser",
415
+ host: "%",
416
+ error: "User does not exist",
417
+ });
418
+ });
419
+ });
420
+
421
+ describe("mysql_role_revoke - error handling", () => {
422
+ it("should return graceful error for nonexistent user", async () => {
423
+ // 1: role exists; 2: user does NOT exist
424
+ mockAdapter.executeQuery
425
+ .mockResolvedValueOnce(createMockQueryResult([{ "1": 1 }]))
426
+ .mockResolvedValueOnce(createMockQueryResult([]));
427
+
428
+ const tool = tools.find((t) => t.name === "mysql_role_revoke")!;
429
+ const result = await tool.handler(
430
+ { role: "test_role", user: "baduser", host: "%" },
431
+ mockContext,
432
+ );
433
+
434
+ expect(result).toEqual({
435
+ success: false,
436
+ role: "test_role",
437
+ user: "baduser",
438
+ host: "%",
439
+ error: "User does not exist",
440
+ });
441
+ expect(mockAdapter.rawQuery).not.toHaveBeenCalled();
442
+ });
443
+ });
444
+
445
+ describe("mysql_role_grant - error handling", () => {
446
+ it("should return graceful error for nonexistent table", async () => {
447
+ // Role exists check succeeds
448
+ mockAdapter.executeQuery.mockResolvedValue(
449
+ createMockQueryResult([{ "1": 1 }]),
450
+ );
451
+ // GRANT rawQuery fails with table not found
452
+ mockAdapter.rawQuery.mockRejectedValue(
453
+ new Error("Table 'testdb.nonexistent' doesn't exist"),
454
+ );
455
+
456
+ const tool = tools.find((t) => t.name === "mysql_role_grant")!;
457
+ const result = await tool.handler(
458
+ {
459
+ role: "test_role",
460
+ privileges: ["SELECT"],
461
+ database: "testdb",
462
+ table: "nonexistent",
463
+ },
464
+ mockContext,
465
+ );
466
+
467
+ expect(result).toEqual({
468
+ success: false,
469
+ role: "test_role",
470
+ error: "Table 'testdb.nonexistent' doesn't exist",
471
+ });
216
472
  });
473
+ });
217
474
  });