@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,510 +1,623 @@
1
1
  /**
2
2
  * mysql-mcp - MySQLAdapter Unit Tests
3
- *
3
+ *
4
4
  * Tests for the MySQL-specific adapter implementation.
5
5
  */
6
6
 
7
- import { describe, it, expect, vi, beforeEach, afterEach, type Mock } from 'vitest';
8
- import { MySQLAdapter } from '../MySQLAdapter.js';
9
- import { ConnectionPool } from '../../../pool/ConnectionPool.js';
10
- import { ConnectionError, QueryError, TransactionError, ValidationError } from '../../../types/index.js';
7
+ import {
8
+ describe,
9
+ it,
10
+ expect,
11
+ vi,
12
+ beforeEach,
13
+ afterEach,
14
+ type Mock,
15
+ } from "vitest";
16
+ import { MySQLAdapter } from "../MySQLAdapter.js";
17
+ import { ConnectionPool } from "../../../pool/ConnectionPool.js";
18
+ import {
19
+ ConnectionError,
20
+ QueryError,
21
+ TransactionError,
22
+ ValidationError,
23
+ } from "../../../types/index.js";
11
24
 
12
25
  // Mock generic ConnectionPool
13
- vi.mock('../../../pool/ConnectionPool.js');
14
-
15
- describe('MySQLAdapter', () => {
16
- let adapter: MySQLAdapter;
17
- let mockPool: any;
18
- let mockConnection: any;
19
-
20
- beforeEach(() => {
21
- vi.clearAllMocks();
22
-
23
- // Setup mock connection
24
- mockConnection = {
25
- execute: vi.fn(),
26
- query: vi.fn(),
27
- release: vi.fn(),
28
- beginTransaction: vi.fn(),
29
- commit: vi.fn(),
30
- rollback: vi.fn(),
31
- ping: vi.fn()
32
- };
33
-
34
- // Setup mock pool
35
- mockPool = {
36
- initialize: vi.fn().mockResolvedValue(undefined),
37
- shutdown: vi.fn().mockResolvedValue(undefined),
38
- checkHealth: vi.fn().mockResolvedValue({ connected: true }),
39
- execute: vi.fn(),
40
- query: vi.fn(),
41
- getConnection: vi.fn().mockResolvedValue(mockConnection)
42
- };
43
-
44
- // Mock ConnectionPool constructor to return our mockPool
45
- (ConnectionPool as unknown as Mock).mockImplementation(function () { return mockPool; });
46
-
47
- adapter = new MySQLAdapter();
48
- });
49
-
50
- afterEach(async () => {
51
- if (adapter.isConnected()) {
52
- await adapter.disconnect();
53
- }
54
- });
55
-
56
- const config = {
57
- type: 'mysql' as const,
58
- host: 'localhost',
59
- port: 3306,
60
- database: 'test_db',
61
- username: 'user',
62
- password: 'password'
26
+ vi.mock("../../../pool/ConnectionPool.js");
27
+
28
+ describe("MySQLAdapter", () => {
29
+ let adapter: MySQLAdapter;
30
+ let mockPool: any;
31
+ let mockConnection: any;
32
+
33
+ beforeEach(() => {
34
+ vi.clearAllMocks();
35
+
36
+ // Setup mock connection
37
+ mockConnection = {
38
+ execute: vi.fn(),
39
+ query: vi.fn(),
40
+ release: vi.fn(),
41
+ beginTransaction: vi.fn(),
42
+ commit: vi.fn(),
43
+ rollback: vi.fn(),
44
+ ping: vi.fn(),
63
45
  };
64
46
 
65
- describe('connection', () => {
66
- it('should connect successfully', async () => {
67
- await adapter.connect(config);
68
- expect(adapter.isConnected()).toBe(true);
69
- expect(ConnectionPool).toHaveBeenCalledWith(expect.objectContaining({
70
- host: 'localhost',
71
- database: 'test_db'
72
- }));
73
- expect(mockPool.initialize).toHaveBeenCalled();
74
- });
75
-
76
- it('should not connect if already connected', async () => {
77
- await adapter.connect(config);
78
- await adapter.connect(config); // Should warn and return
79
- expect(mockPool.initialize).toHaveBeenCalledTimes(1);
80
- });
81
-
82
- it('should handle connection failure', async () => {
83
- mockPool.initialize.mockRejectedValue(new Error('Connection failed'));
84
- await expect(adapter.connect(config)).rejects.toThrow(ConnectionError);
85
- expect(adapter.isConnected()).toBe(false);
86
- });
87
-
88
- it('should disconnect successfully', async () => {
89
- await adapter.connect(config);
90
- await adapter.disconnect();
91
- expect(adapter.isConnected()).toBe(false);
92
- expect(mockPool.shutdown).toHaveBeenCalled();
93
- });
94
-
95
- it('should handle disconnect when not connected', async () => {
96
- await adapter.disconnect();
97
- expect(mockPool.shutdown).not.toHaveBeenCalled();
98
- });
99
-
100
- it('should rollback active transactions on disconnect', async () => {
101
- await adapter.connect(config);
102
- // Mock a transaction
103
- const mockConn = {
104
- rollback: vi.fn().mockResolvedValue(undefined),
105
- release: vi.fn()
106
- };
107
- (adapter as any).activeTransactions.set('tx-1', mockConn);
108
-
109
- await adapter.disconnect();
110
-
111
- expect(mockConn.rollback).toHaveBeenCalled();
112
- expect(mockConn.release).toHaveBeenCalled();
113
- });
114
-
115
- it('should ignore errors during transaction rollback on disconnect', async () => {
116
- await adapter.connect(config);
117
- const mockConn = {
118
- rollback: vi.fn().mockRejectedValue(new Error('Rollback failed')),
119
- release: vi.fn()
120
- };
121
- (adapter as any).activeTransactions.set('tx-1', mockConn);
122
-
123
- // Should not throw
124
- await expect(adapter.disconnect()).resolves.not.toThrow();
125
- expect(mockConn.release).toHaveBeenCalled();
126
- });
127
-
128
- it('should use default config values when not provided', async () => {
129
- await adapter.connect({ type: 'mysql' });
130
- expect(ConnectionPool).toHaveBeenCalledWith(expect.objectContaining({
131
- host: 'localhost',
132
- port: 3306,
133
- user: 'root',
134
- password: '',
135
- database: '',
136
- charset: 'utf8mb4',
137
- timezone: 'local',
138
- connectTimeout: 10000
139
- }));
140
- });
141
- });
142
-
143
- describe('health check', () => {
144
- const dbConfig = {
145
- type: 'mysql' as const,
146
- host: 'localhost',
147
- port: 3306,
148
- database: 'test_db',
149
- username: 'user',
150
- password: 'password'
151
- };
152
-
153
- it('should return not connected status when pool is null', async () => {
154
- const health = await adapter.getHealth();
155
- expect(health.connected).toBe(false);
156
- expect(health.error).toBe('Not connected');
157
- });
158
-
159
- it('should return pool health when connected', async () => {
160
- await adapter.connect(dbConfig);
161
- mockPool.checkHealth.mockResolvedValue({ connected: true });
162
-
163
- const health = await adapter.getHealth();
164
-
165
- expect(health.connected).toBe(true);
166
- expect(mockPool.checkHealth).toHaveBeenCalled();
167
- });
168
- });
169
-
170
- describe('query execution', () => {
171
- beforeEach(async () => {
172
- await adapter.connect({ type: 'mysql', host: 'localhost', username: 'root', password: '' });
173
- });
174
-
175
- it('should execute read query', async () => {
176
- const mockRows = [{ id: 1, name: 'test' }];
177
- const mockFields = [{ name: 'id', type: 3 }, { name: 'name', type: 253 }];
178
- mockPool.execute.mockResolvedValue([mockRows, mockFields]);
179
-
180
- const result = await adapter.executeReadQuery('SELECT * FROM users');
181
-
182
- expect(result.rows).toEqual(mockRows);
183
- expect(result.columns).toHaveLength(2);
184
- expect(result.columns?.[0].type).toBe('INT');
185
- });
186
-
187
- it('should execute write query', async () => {
188
- const mockResult = { affectedRows: 1, insertId: 100, warningStatus: 0 };
189
- mockPool.execute.mockResolvedValue([mockResult, undefined]);
190
-
191
- const result = await adapter.executeWriteQuery('INSERT INTO users VALUES (?)', ['test']);
192
-
193
- expect(result.rowsAffected).toBe(1);
194
- expect(result.lastInsertId).toBe(100);
195
- });
196
-
197
- it('should throw ConnectionError if not connected', async () => {
198
- await adapter.disconnect();
199
- await expect(adapter.executeQuery('SELECT 1')).rejects.toThrow(ConnectionError);
200
- });
201
-
202
- it('should throw QueryError on failure', async () => {
203
- mockPool.execute.mockRejectedValue(new Error('Syntax error'));
204
- await expect(adapter.executeQuery('BAD QUERY')).rejects.toThrow(QueryError);
205
- });
206
-
207
- it('should execute raw query', async () => {
208
- const mockRows = [{ status: 'OK' }];
209
- mockPool.query.mockResolvedValue([mockRows, undefined]);
210
-
211
- const result = await adapter.rawQuery('SHOW STATUS');
212
-
213
- expect(result.rows).toEqual(mockRows);
214
- expect(mockPool.query).toHaveBeenCalledWith('SHOW STATUS');
215
- });
216
-
217
- it('should throw QueryError on raw query failure', async () => {
218
- mockPool.query.mockRejectedValue(new Error('Raw query error'));
219
- await expect(adapter.rawQuery('BAD RAW QUERY')).rejects.toThrow(QueryError);
220
- });
221
-
222
- it('should throw ConnectionError when executing rawQuery if not connected', async () => {
223
- await adapter.disconnect();
224
- await expect(adapter.rawQuery('SELECT 1')).rejects.toThrow(ConnectionError);
225
- });
47
+ // Setup mock pool
48
+ mockPool = {
49
+ initialize: vi.fn().mockResolvedValue(undefined),
50
+ shutdown: vi.fn().mockResolvedValue(undefined),
51
+ checkHealth: vi.fn().mockResolvedValue({ connected: true }),
52
+ execute: vi.fn(),
53
+ query: vi.fn(),
54
+ getConnection: vi.fn().mockResolvedValue(mockConnection),
55
+ };
56
+
57
+ // Mock ConnectionPool constructor to return our mockPool
58
+ (ConnectionPool as unknown as Mock).mockImplementation(function () {
59
+ return mockPool;
60
+ });
61
+
62
+ adapter = new MySQLAdapter();
63
+ });
64
+
65
+ afterEach(async () => {
66
+ if (adapter.isConnected()) {
67
+ await adapter.disconnect();
68
+ }
69
+ });
70
+
71
+ const config = {
72
+ type: "mysql" as const,
73
+ host: "localhost",
74
+ port: 3306,
75
+ database: "test_db",
76
+ username: "user",
77
+ password: "password",
78
+ };
79
+
80
+ describe("connection", () => {
81
+ it("should connect successfully", async () => {
82
+ await adapter.connect(config);
83
+ expect(adapter.isConnected()).toBe(true);
84
+ expect(ConnectionPool).toHaveBeenCalledWith(
85
+ expect.objectContaining({
86
+ host: "localhost",
87
+ database: "test_db",
88
+ }),
89
+ );
90
+ expect(mockPool.initialize).toHaveBeenCalled();
91
+ });
92
+
93
+ it("should not connect if already connected", async () => {
94
+ await adapter.connect(config);
95
+ await adapter.connect(config); // Should warn and return
96
+ expect(mockPool.initialize).toHaveBeenCalledTimes(1);
97
+ });
98
+
99
+ it("should handle connection failure", async () => {
100
+ mockPool.initialize.mockRejectedValue(new Error("Connection failed"));
101
+ await expect(adapter.connect(config)).rejects.toThrow(ConnectionError);
102
+ expect(adapter.isConnected()).toBe(false);
103
+ });
104
+
105
+ it("should disconnect successfully", async () => {
106
+ await adapter.connect(config);
107
+ await adapter.disconnect();
108
+ expect(adapter.isConnected()).toBe(false);
109
+ expect(mockPool.shutdown).toHaveBeenCalled();
110
+ });
111
+
112
+ it("should handle disconnect when not connected", async () => {
113
+ await adapter.disconnect();
114
+ expect(mockPool.shutdown).not.toHaveBeenCalled();
115
+ });
116
+
117
+ it("should rollback active transactions on disconnect", async () => {
118
+ await adapter.connect(config);
119
+ // Mock a transaction
120
+ const mockConn = {
121
+ rollback: vi.fn().mockResolvedValue(undefined),
122
+ release: vi.fn(),
123
+ };
124
+ (adapter as any).activeTransactions.set("tx-1", mockConn);
125
+
126
+ await adapter.disconnect();
127
+
128
+ expect(mockConn.rollback).toHaveBeenCalled();
129
+ expect(mockConn.release).toHaveBeenCalled();
130
+ });
131
+
132
+ it("should ignore errors during transaction rollback on disconnect", async () => {
133
+ await adapter.connect(config);
134
+ const mockConn = {
135
+ rollback: vi.fn().mockRejectedValue(new Error("Rollback failed")),
136
+ release: vi.fn(),
137
+ };
138
+ (adapter as any).activeTransactions.set("tx-1", mockConn);
139
+
140
+ // Should not throw
141
+ await expect(adapter.disconnect()).resolves.not.toThrow();
142
+ expect(mockConn.release).toHaveBeenCalled();
143
+ });
144
+
145
+ it("should use default config values when not provided", async () => {
146
+ await adapter.connect({ type: "mysql" });
147
+ expect(ConnectionPool).toHaveBeenCalledWith(
148
+ expect.objectContaining({
149
+ host: "localhost",
150
+ port: 3306,
151
+ user: "root",
152
+ password: "",
153
+ database: "",
154
+ charset: "utf8mb4",
155
+ timezone: "local",
156
+ connectTimeout: 10000,
157
+ }),
158
+ );
159
+ });
160
+ });
161
+
162
+ describe("health check", () => {
163
+ const dbConfig = {
164
+ type: "mysql" as const,
165
+ host: "localhost",
166
+ port: 3306,
167
+ database: "test_db",
168
+ username: "user",
169
+ password: "password",
170
+ };
171
+
172
+ it("should return not connected status when pool is null", async () => {
173
+ const health = await adapter.getHealth();
174
+ expect(health.connected).toBe(false);
175
+ expect(health.error).toBe("Not connected");
176
+ });
177
+
178
+ it("should return pool health when connected", async () => {
179
+ await adapter.connect(dbConfig);
180
+ mockPool.checkHealth.mockResolvedValue({ connected: true });
181
+
182
+ const health = await adapter.getHealth();
226
183
 
227
- it('should handle raw query write result', async () => {
228
- const mockResult = { affectedRows: 5, insertId: 0 };
229
- mockPool.query.mockResolvedValue([mockResult, undefined]);
184
+ expect(health.connected).toBe(true);
185
+ expect(mockPool.checkHealth).toHaveBeenCalled();
186
+ });
187
+ });
188
+
189
+ describe("query execution", () => {
190
+ beforeEach(async () => {
191
+ await adapter.connect({
192
+ type: "mysql",
193
+ host: "localhost",
194
+ username: "root",
195
+ password: "",
196
+ });
197
+ });
198
+
199
+ it("should execute read query", async () => {
200
+ const mockRows = [{ id: 1, name: "test" }];
201
+ const mockFields = [
202
+ { name: "id", type: 3 },
203
+ { name: "name", type: 253 },
204
+ ];
205
+ mockPool.execute.mockResolvedValue([mockRows, mockFields]);
206
+
207
+ const result = await adapter.executeReadQuery("SELECT * FROM users");
208
+
209
+ expect(result.rows).toEqual(mockRows);
210
+ expect(result.columns).toHaveLength(2);
211
+ expect(result.columns?.[0].type).toBe("INT");
212
+ });
213
+
214
+ it("should execute write query", async () => {
215
+ const mockResult = { affectedRows: 1, insertId: 100, warningStatus: 0 };
216
+ mockPool.execute.mockResolvedValue([mockResult, undefined]);
230
217
 
231
- const result = await adapter.rawQuery('DELETE FROM users');
218
+ const result = await adapter.executeWriteQuery(
219
+ "INSERT INTO users VALUES (?)",
220
+ ["test"],
221
+ );
232
222
 
233
- expect(result.rowsAffected).toBe(5);
234
- expect(mockPool.query).toHaveBeenCalledWith('DELETE FROM users');
235
- });
223
+ expect(result.rowsAffected).toBe(1);
224
+ expect(result.lastInsertId).toBe(100);
236
225
  });
237
226
 
238
- describe('transactions', () => {
239
- beforeEach(async () => {
240
- await adapter.connect({ type: 'mysql', host: 'localhost', username: 'root', password: '' });
241
- });
227
+ it("should throw ConnectionError if not connected", async () => {
228
+ await adapter.disconnect();
229
+ await expect(adapter.executeQuery("SELECT 1")).rejects.toThrow(
230
+ ConnectionError,
231
+ );
232
+ });
233
+
234
+ it("should throw QueryError on failure", async () => {
235
+ mockPool.execute.mockRejectedValue(new Error("Syntax error"));
236
+ await expect(adapter.executeQuery("BAD QUERY")).rejects.toThrow(
237
+ QueryError,
238
+ );
239
+ });
240
+
241
+ it("should execute raw query", async () => {
242
+ const mockRows = [{ status: "OK" }];
243
+ mockPool.query.mockResolvedValue([mockRows, undefined]);
244
+
245
+ const result = await adapter.rawQuery("SHOW STATUS");
246
+
247
+ expect(result.rows).toEqual(mockRows);
248
+ expect(mockPool.query).toHaveBeenCalledWith("SHOW STATUS");
249
+ });
242
250
 
243
- it('should begin transaction', async () => {
244
- const txId = await adapter.beginTransaction();
251
+ it("should throw QueryError on raw query failure", async () => {
252
+ mockPool.query.mockRejectedValue(new Error("Raw query error"));
253
+ await expect(adapter.rawQuery("BAD RAW QUERY")).rejects.toThrow(
254
+ QueryError,
255
+ );
256
+ });
245
257
 
246
- expect(txId).toBeDefined();
247
- expect(mockPool.getConnection).toHaveBeenCalled();
248
- expect(mockConnection.beginTransaction).toHaveBeenCalled();
249
- });
258
+ it("should throw ConnectionError when executing rawQuery if not connected", async () => {
259
+ await adapter.disconnect();
260
+ await expect(adapter.rawQuery("SELECT 1")).rejects.toThrow(
261
+ ConnectionError,
262
+ );
263
+ });
250
264
 
251
- it('should commit transaction', async () => {
252
- const txId = await adapter.beginTransaction();
253
- await adapter.commitTransaction(txId);
265
+ it("should handle raw query write result", async () => {
266
+ const mockResult = { affectedRows: 5, insertId: 0 };
267
+ mockPool.query.mockResolvedValue([mockResult, undefined]);
254
268
 
255
- expect(mockConnection.commit).toHaveBeenCalled();
256
- expect(mockConnection.release).toHaveBeenCalled();
257
- });
269
+ const result = await adapter.rawQuery("DELETE FROM users");
258
270
 
259
- it('should rollback transaction', async () => {
260
- const txId = await adapter.beginTransaction();
261
- await adapter.rollbackTransaction(txId);
271
+ expect(result.rowsAffected).toBe(5);
272
+ expect(mockPool.query).toHaveBeenCalledWith("DELETE FROM users");
273
+ });
274
+ });
275
+
276
+ describe("transactions", () => {
277
+ beforeEach(async () => {
278
+ await adapter.connect({
279
+ type: "mysql",
280
+ host: "localhost",
281
+ username: "root",
282
+ password: "",
283
+ });
284
+ });
262
285
 
263
- expect(mockConnection.rollback).toHaveBeenCalled();
264
- expect(mockConnection.release).toHaveBeenCalled();
265
- });
286
+ it("should begin transaction", async () => {
287
+ const txId = await adapter.beginTransaction();
266
288
 
289
+ expect(txId).toBeDefined();
290
+ expect(mockPool.getConnection).toHaveBeenCalled();
291
+ expect(mockConnection.beginTransaction).toHaveBeenCalled();
292
+ });
267
293
 
268
- it('should throw error for invalid transaction id', async () => {
269
- await expect(adapter.commitTransaction('invalid-id')).rejects.toThrow(TransactionError);
270
- });
294
+ it("should commit transaction", async () => {
295
+ const txId = await adapter.beginTransaction();
296
+ await adapter.commitTransaction(txId);
271
297
 
272
- it('should throw error for invalid transaction id on rollback', async () => {
273
- await expect(adapter.rollbackTransaction('invalid-id')).rejects.toThrow(TransactionError);
274
- });
298
+ expect(mockConnection.commit).toHaveBeenCalled();
299
+ expect(mockConnection.release).toHaveBeenCalled();
300
+ });
275
301
 
276
- it('should handle beginTransaction failure', async () => {
277
- mockConnection.beginTransaction.mockRejectedValue(new Error('Start tx failed'));
278
- await expect(adapter.beginTransaction()).rejects.toThrow(TransactionError);
279
- expect(mockConnection.release).toHaveBeenCalled();
280
- });
302
+ it("should rollback transaction", async () => {
303
+ const txId = await adapter.beginTransaction();
304
+ await adapter.rollbackTransaction(txId);
281
305
 
282
- it('should throw error when beginning transaction if not connected', async () => {
283
- await adapter.disconnect();
284
- await expect(adapter.beginTransaction()).rejects.toThrow(ConnectionError);
285
- });
306
+ expect(mockConnection.rollback).toHaveBeenCalled();
307
+ expect(mockConnection.release).toHaveBeenCalled();
308
+ });
286
309
 
287
- it('should throw ConnectionError when executing query if not connected (pool null)', async () => {
288
- // Force pool to be null even if connected flag might be true (simulating weird state or just standard disconnect)
289
- await adapter.disconnect();
290
- await expect(adapter.executeQuery('SELECT 1')).rejects.toThrow(ConnectionError);
291
- });
310
+ it("should throw error for invalid transaction id", async () => {
311
+ await expect(adapter.commitTransaction("invalid-id")).rejects.toThrow(
312
+ TransactionError,
313
+ );
314
+ });
292
315
 
293
- it('should handle transaction rollback failure', async () => {
294
- const txId = await adapter.beginTransaction();
295
- mockConnection.rollback.mockRejectedValue(new Error('Rollback failed'));
316
+ it("should throw error for invalid transaction id on rollback", async () => {
317
+ await expect(adapter.rollbackTransaction("invalid-id")).rejects.toThrow(
318
+ TransactionError,
319
+ );
320
+ });
296
321
 
297
- await expect(adapter.rollbackTransaction(txId)).rejects.toThrow();
298
- expect(mockConnection.release).toHaveBeenCalled(); // Should still release
299
- });
300
-
301
- it('should handle transaction commit failure', async () => {
302
- const txId = await adapter.beginTransaction();
303
- mockConnection.commit.mockRejectedValue(new Error('Commit failed'));
322
+ it("should handle beginTransaction failure", async () => {
323
+ mockConnection.beginTransaction.mockRejectedValue(
324
+ new Error("Start tx failed"),
325
+ );
326
+ await expect(adapter.beginTransaction()).rejects.toThrow(
327
+ TransactionError,
328
+ );
329
+ expect(mockConnection.release).toHaveBeenCalled();
330
+ });
304
331
 
305
- await expect(adapter.commitTransaction(txId)).rejects.toThrow();
306
- expect(mockConnection.release).toHaveBeenCalled(); // Should still release
307
- });
332
+ it("should reject invalid isolation levels", async () => {
333
+ await expect(
334
+ adapter.beginTransaction("SERIALIZABLE; DROP TABLE users"),
335
+ ).rejects.toThrow(TransactionError);
336
+ await expect(adapter.beginTransaction("INVALID LEVEL")).rejects.toThrow(
337
+ TransactionError,
338
+ );
339
+ });
308
340
 
309
- it('should throw when getting connection for invalid transaction', () => {
310
- expect(adapter.getTransactionConnection('bad-id')).toBeUndefined();
311
- });
312
-
313
-
314
- it('should execute query on transaction connection', async () => {
315
- const txId = await adapter.beginTransaction();
316
- const connection = adapter.getTransactionConnection(txId);
317
-
318
- expect(connection).toBeDefined();
319
-
320
- mockConnection.execute.mockResolvedValue([[], undefined]);
321
- await adapter.executeOnConnection(connection!, 'SELECT 1');
322
-
323
- expect(mockConnection.execute).toHaveBeenCalledWith('SELECT 1', undefined);
324
- });
325
-
326
- it('should handle write query result on transaction connection', async () => {
327
- const txId = await adapter.beginTransaction();
328
- const connection = adapter.getTransactionConnection(txId);
329
-
330
- const mockResult = { affectedRows: 1, insertId: 123 };
331
- mockConnection.execute.mockResolvedValue([mockResult, undefined]);
332
-
333
- const result = await adapter.executeOnConnection(connection!, 'INSERT INTO foo VALUES (1)');
334
-
335
- expect(result.rowsAffected).toBe(1);
336
- expect(result.lastInsertId).toBe(123);
337
- });
338
- });
339
-
340
- describe('schema operations', () => {
341
- beforeEach(async () => {
342
- await adapter.connect({ type: 'mysql', host: 'localhost', username: 'root', password: '' });
343
- });
344
-
345
- it('should list tables', async () => {
346
- const mockTables = [{
347
- name: 'users',
348
- type: 'table',
349
- engine: 'InnoDB',
350
- rowCount: 10
351
- }];
352
- mockPool.execute.mockResolvedValue([mockTables, undefined]);
353
-
354
- const tables = await adapter.listTables();
355
-
356
- expect(tables).toHaveLength(1);
357
- expect(tables[0].name).toBe('users');
358
- expect(tables[0].type).toBe('table');
359
- });
360
-
361
- it('should describe table', async () => {
362
- // Mock column info
363
- mockPool.execute.mockResolvedValueOnce([[{
364
- name: 'id',
365
- type: 'int',
366
- nullable: 'NO',
367
- columnKey: 'PRI',
368
- extra: 'auto_increment'
369
- }], undefined]);
370
-
371
- // Mock table info
372
- mockPool.execute.mockResolvedValueOnce([[{
373
- type: 'BASE TABLE',
374
- engine: 'InnoDB'
375
- }], undefined]);
376
-
377
- const info = await adapter.describeTable('users');
378
-
379
- expect(info.name).toBe('users');
380
- expect(info.columns).toHaveLength(1);
381
- expect(info.columns?.[0].primaryKey).toBe(true);
382
- });
383
-
384
- it('should validate table name in describeTable', async () => {
385
- await expect(adapter.describeTable('invalid;table')).rejects.toThrow(ValidationError);
386
- });
387
-
388
- it('should list schemas', async () => {
389
- mockPool.execute.mockResolvedValue([[{ Database: 'test_db' }], undefined]);
390
- const schemas = await adapter.listSchemas();
391
- expect(schemas).toContain('test_db');
392
- });
393
-
394
- it('should get table indexes', async () => {
395
- mockPool.execute.mockResolvedValue([[{
396
- name: 'PRIMARY',
397
- nonUnique: 0,
398
- columnName: 'id',
399
- type: 'BTREE'
400
- }], undefined]);
401
-
402
- const indexes = await adapter.getTableIndexes('users');
403
-
404
- expect(indexes).toHaveLength(1);
405
- expect(indexes[0].name).toBe('PRIMARY');
406
- expect(indexes[0].unique).toBe(true);
407
- });
408
-
409
- it('should handle composite indexes', async () => {
410
- mockPool.execute.mockResolvedValue([[{
411
- name: 'composite_idx',
412
- nonUnique: 1,
413
- columnName: 'col1',
414
- type: 'BTREE'
415
- }, {
416
- name: 'composite_idx',
417
- nonUnique: 1,
418
- columnName: 'col2',
419
- type: 'BTREE'
420
- }], undefined]);
421
-
422
- const indexes = await adapter.getTableIndexes('users');
423
- expect(indexes).toHaveLength(1);
424
- expect(indexes[0].name).toBe('composite_idx');
425
- expect(indexes[0].columns).toEqual(['col1', 'col2']);
426
- });
427
- });
428
-
429
- describe('views handling', () => {
430
- beforeEach(async () => {
431
- await adapter.connect(config);
432
- });
433
-
434
- it('should identify views in listTables', async () => {
435
- const mockTables = [{
436
- name: 'user_view',
437
- type: 'VIEW',
438
- engine: null,
439
- rowCount: null
440
- }];
441
- mockPool.execute.mockResolvedValue([mockTables, undefined]);
442
-
443
- const tables = await adapter.listTables();
444
- expect(tables[0].type).toBe('view');
445
- });
446
-
447
- it('should identify views in describeTable', async () => {
448
- // Mock columns
449
- mockPool.execute.mockResolvedValueOnce([[], undefined]);
450
-
451
- // Mock view info
452
- mockPool.execute.mockResolvedValueOnce([[{
453
- type: 'VIEW',
454
- engine: null
455
- }], undefined]);
456
-
457
- const table = await adapter.describeTable('user_view');
458
- expect(table.type).toBe('view');
459
- });
460
- });
461
-
462
- describe('capabilities and metadata', () => {
463
- it('should return correct capabilities', () => {
464
- const caps = adapter.getCapabilities();
465
- expect(caps.json).toBe(true);
466
- expect(caps.transactions).toBe(true);
467
- expect(caps.fullTextSearch).toBe(true);
468
- });
469
-
470
- it('should return supported tool groups', () => {
471
- const groups = adapter.getSupportedToolGroups();
472
- expect(groups).toContain('core');
473
- expect(groups).toContain('json');
474
- expect(groups.length).toBeGreaterThan(20);
475
- });
476
-
477
- it('should return definitions', () => {
478
- expect(adapter.getToolDefinitions()).toBeDefined();
479
- expect(adapter.getResourceDefinitions()).toBeDefined();
480
- expect(adapter.getPromptDefinitions()).toBeDefined();
481
- });
482
-
483
- it('should return adapter info', () => {
484
- const info = adapter.getInfo();
485
- expect(info.type).toBe('mysql');
486
- expect(info.name).toBe('MySQL Adapter');
487
- });
488
- });
489
-
490
- describe('tool definition caching', () => {
491
- it('should return same array reference on repeated getToolDefinitions calls', () => {
492
- const first = adapter.getToolDefinitions();
493
- const second = adapter.getToolDefinitions();
494
- expect(first).toBe(second); // Same reference = cached
495
- expect(first.length).toBe(191);
496
- });
497
- });
498
-
499
- describe('accessor methods', () => {
500
- it('should return null pool when not connected', () => {
501
- expect(adapter.getPool()).toBeNull();
502
- });
503
-
504
- it('should return pool when connected', async () => {
505
- await adapter.connect(config);
506
- expect(adapter.getPool()).toBeDefined();
507
- });
341
+ it("should accept valid isolation levels", async () => {
342
+ const txId = await adapter.beginTransaction("READ COMMITTED");
343
+ expect(txId).toBeDefined();
344
+ expect(mockConnection.execute).toHaveBeenCalledWith(
345
+ "SET TRANSACTION ISOLATION LEVEL READ COMMITTED",
346
+ );
508
347
  });
509
348
 
349
+ it("should throw error when beginning transaction if not connected", async () => {
350
+ await adapter.disconnect();
351
+ await expect(adapter.beginTransaction()).rejects.toThrow(ConnectionError);
352
+ });
353
+
354
+ it("should throw ConnectionError when executing query if not connected (pool null)", async () => {
355
+ // Force pool to be null even if connected flag might be true (simulating weird state or just standard disconnect)
356
+ await adapter.disconnect();
357
+ await expect(adapter.executeQuery("SELECT 1")).rejects.toThrow(
358
+ ConnectionError,
359
+ );
360
+ });
361
+
362
+ it("should handle transaction rollback failure", async () => {
363
+ const txId = await adapter.beginTransaction();
364
+ mockConnection.rollback.mockRejectedValue(new Error("Rollback failed"));
365
+
366
+ await expect(adapter.rollbackTransaction(txId)).rejects.toThrow();
367
+ expect(mockConnection.release).toHaveBeenCalled(); // Should still release
368
+ });
369
+
370
+ it("should handle transaction commit failure", async () => {
371
+ const txId = await adapter.beginTransaction();
372
+ mockConnection.commit.mockRejectedValue(new Error("Commit failed"));
373
+
374
+ await expect(adapter.commitTransaction(txId)).rejects.toThrow();
375
+ expect(mockConnection.release).toHaveBeenCalled(); // Should still release
376
+ });
377
+
378
+ it("should throw when getting connection for invalid transaction", () => {
379
+ expect(adapter.getTransactionConnection("bad-id")).toBeUndefined();
380
+ });
381
+
382
+ it("should execute query on transaction connection", async () => {
383
+ const txId = await adapter.beginTransaction();
384
+ const connection = adapter.getTransactionConnection(txId);
385
+
386
+ expect(connection).toBeDefined();
387
+
388
+ mockConnection.execute.mockResolvedValue([[], undefined]);
389
+ await adapter.executeOnConnection(connection!, "SELECT 1");
390
+
391
+ expect(mockConnection.execute).toHaveBeenCalledWith(
392
+ "SELECT 1",
393
+ undefined,
394
+ );
395
+ });
396
+
397
+ it("should handle write query result on transaction connection", async () => {
398
+ const txId = await adapter.beginTransaction();
399
+ const connection = adapter.getTransactionConnection(txId);
400
+
401
+ const mockResult = { affectedRows: 1, insertId: 123 };
402
+ mockConnection.execute.mockResolvedValue([mockResult, undefined]);
403
+
404
+ const result = await adapter.executeOnConnection(
405
+ connection!,
406
+ "INSERT INTO foo VALUES (1)",
407
+ );
408
+
409
+ expect(result.rowsAffected).toBe(1);
410
+ expect(result.lastInsertId).toBe(123);
411
+ });
412
+ });
413
+
414
+ describe("schema operations", () => {
415
+ beforeEach(async () => {
416
+ await adapter.connect({
417
+ type: "mysql",
418
+ host: "localhost",
419
+ username: "root",
420
+ password: "",
421
+ });
422
+ });
423
+
424
+ it("should list tables", async () => {
425
+ const mockTables = [
426
+ {
427
+ name: "users",
428
+ type: "table",
429
+ engine: "InnoDB",
430
+ rowCount: 10,
431
+ },
432
+ ];
433
+ mockPool.execute.mockResolvedValue([mockTables, undefined]);
434
+
435
+ const tables = await adapter.listTables();
436
+
437
+ expect(tables).toHaveLength(1);
438
+ expect(tables[0].name).toBe("users");
439
+ expect(tables[0].type).toBe("table");
440
+ });
441
+
442
+ it("should describe table", async () => {
443
+ // Mock column info
444
+ mockPool.execute.mockResolvedValueOnce([
445
+ [
446
+ {
447
+ name: "id",
448
+ type: "int",
449
+ nullable: "NO",
450
+ columnKey: "PRI",
451
+ extra: "auto_increment",
452
+ },
453
+ ],
454
+ undefined,
455
+ ]);
456
+
457
+ // Mock table info
458
+ mockPool.execute.mockResolvedValueOnce([
459
+ [
460
+ {
461
+ type: "BASE TABLE",
462
+ engine: "InnoDB",
463
+ },
464
+ ],
465
+ undefined,
466
+ ]);
467
+
468
+ const info = await adapter.describeTable("users");
469
+
470
+ expect(info.name).toBe("users");
471
+ expect(info.columns).toHaveLength(1);
472
+ expect(info.columns?.[0].primaryKey).toBe(true);
473
+ });
474
+
475
+ it("should validate table name in describeTable", async () => {
476
+ await expect(adapter.describeTable("invalid;table")).rejects.toThrow(
477
+ ValidationError,
478
+ );
479
+ });
480
+
481
+ it("should list schemas", async () => {
482
+ mockPool.execute.mockResolvedValue([
483
+ [{ Database: "test_db" }],
484
+ undefined,
485
+ ]);
486
+ const schemas = await adapter.listSchemas();
487
+ expect(schemas).toContain("test_db");
488
+ });
489
+
490
+ it("should get table indexes", async () => {
491
+ mockPool.execute.mockResolvedValue([
492
+ [
493
+ {
494
+ name: "PRIMARY",
495
+ nonUnique: 0,
496
+ columnName: "id",
497
+ type: "BTREE",
498
+ },
499
+ ],
500
+ undefined,
501
+ ]);
502
+
503
+ const indexes = await adapter.getTableIndexes("users");
504
+
505
+ expect(indexes).toHaveLength(1);
506
+ expect(indexes[0].name).toBe("PRIMARY");
507
+ expect(indexes[0].unique).toBe(true);
508
+ });
509
+
510
+ it("should handle composite indexes", async () => {
511
+ mockPool.execute.mockResolvedValue([
512
+ [
513
+ {
514
+ name: "composite_idx",
515
+ nonUnique: 1,
516
+ columnName: "col1",
517
+ type: "BTREE",
518
+ },
519
+ {
520
+ name: "composite_idx",
521
+ nonUnique: 1,
522
+ columnName: "col2",
523
+ type: "BTREE",
524
+ },
525
+ ],
526
+ undefined,
527
+ ]);
528
+
529
+ const indexes = await adapter.getTableIndexes("users");
530
+ expect(indexes).toHaveLength(1);
531
+ expect(indexes[0].name).toBe("composite_idx");
532
+ expect(indexes[0].columns).toEqual(["col1", "col2"]);
533
+ });
534
+ });
535
+
536
+ describe("views handling", () => {
537
+ beforeEach(async () => {
538
+ await adapter.connect(config);
539
+ });
540
+
541
+ it("should identify views in listTables", async () => {
542
+ const mockTables = [
543
+ {
544
+ name: "user_view",
545
+ type: "VIEW",
546
+ engine: null,
547
+ rowCount: null,
548
+ },
549
+ ];
550
+ mockPool.execute.mockResolvedValue([mockTables, undefined]);
551
+
552
+ const tables = await adapter.listTables();
553
+ expect(tables[0].type).toBe("view");
554
+ });
555
+
556
+ it("should identify views in describeTable", async () => {
557
+ // Mock columns
558
+ mockPool.execute.mockResolvedValueOnce([[], undefined]);
559
+
560
+ // Mock view info
561
+ mockPool.execute.mockResolvedValueOnce([
562
+ [
563
+ {
564
+ type: "VIEW",
565
+ engine: null,
566
+ },
567
+ ],
568
+ undefined,
569
+ ]);
570
+
571
+ const table = await adapter.describeTable("user_view");
572
+ expect(table.type).toBe("view");
573
+ });
574
+ });
575
+
576
+ describe("capabilities and metadata", () => {
577
+ it("should return correct capabilities", () => {
578
+ const caps = adapter.getCapabilities();
579
+ expect(caps.json).toBe(true);
580
+ expect(caps.transactions).toBe(true);
581
+ expect(caps.fullTextSearch).toBe(true);
582
+ });
583
+
584
+ it("should return supported tool groups", () => {
585
+ const groups = adapter.getSupportedToolGroups();
586
+ expect(groups).toContain("core");
587
+ expect(groups).toContain("json");
588
+ expect(groups.length).toBeGreaterThan(20);
589
+ });
590
+
591
+ it("should return definitions", () => {
592
+ expect(adapter.getToolDefinitions()).toBeDefined();
593
+ expect(adapter.getResourceDefinitions()).toBeDefined();
594
+ expect(adapter.getPromptDefinitions()).toBeDefined();
595
+ });
596
+
597
+ it("should return adapter info", () => {
598
+ const info = adapter.getInfo();
599
+ expect(info.type).toBe("mysql");
600
+ expect(info.name).toBe("MySQL Adapter");
601
+ });
602
+ });
603
+
604
+ describe("tool definition caching", () => {
605
+ it("should return same array reference on repeated getToolDefinitions calls", () => {
606
+ const first = adapter.getToolDefinitions();
607
+ const second = adapter.getToolDefinitions();
608
+ expect(first).toBe(second); // Same reference = cached
609
+ expect(first.length).toBe(193);
610
+ });
611
+ });
612
+
613
+ describe("accessor methods", () => {
614
+ it("should return null pool when not connected", () => {
615
+ expect(adapter.getPool()).toBeNull();
616
+ });
617
+
618
+ it("should return pool when connected", async () => {
619
+ await adapter.connect(config);
620
+ expect(adapter.getPool()).toBeDefined();
621
+ });
622
+ });
510
623
  });