@neverinfamous/mysql-mcp 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -10
  4. package/.github/workflows/docker-publish.yml +15 -13
  5. package/CHANGELOG.md +287 -1
  6. package/DOCKER_README.md +100 -265
  7. package/Dockerfile +5 -0
  8. package/README.md +124 -59
  9. package/VERSION +1 -1
  10. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  11. package/dist/__tests__/mocks/adapter.js +2 -0
  12. package/dist/__tests__/mocks/adapter.js.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  14. package/dist/adapters/DatabaseAdapter.js +50 -9
  15. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  17. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  18. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  19. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  20. package/dist/adapters/mysql/SchemaManager.js +16 -15
  21. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  22. package/dist/adapters/mysql/prompts/index.js +10 -20
  23. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  24. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  25. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  26. package/dist/adapters/mysql/resources/docstore.js +10 -7
  27. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  28. package/dist/adapters/mysql/resources/events.js +11 -8
  29. package/dist/adapters/mysql/resources/events.js.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  31. package/dist/adapters/mysql/resources/indexes.js +12 -15
  32. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  34. package/dist/adapters/mysql/resources/innodb.js +20 -17
  35. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  37. package/dist/adapters/mysql/resources/locks.js +9 -6
  38. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  40. package/dist/adapters/mysql/resources/performance.js +15 -15
  41. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  43. package/dist/adapters/mysql/resources/spatial.js +9 -6
  44. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  46. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  47. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  49. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  50. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  52. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  53. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  55. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  56. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  59. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  62. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  64. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  65. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  66. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  67. package/dist/adapters/mysql/tools/core.js +152 -29
  68. package/dist/adapters/mysql/tools/core.js.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  70. package/dist/adapters/mysql/tools/docstore.js +340 -163
  71. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  72. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  73. package/dist/adapters/mysql/tools/events.js +284 -198
  74. package/dist/adapters/mysql/tools/events.js.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  76. package/dist/adapters/mysql/tools/json/core.js +11 -39
  77. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  79. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  80. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  82. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  83. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  84. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  85. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  87. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  88. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  90. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  91. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  94. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  95. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  96. package/dist/adapters/mysql/tools/replication.js +75 -49
  97. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  99. package/dist/adapters/mysql/tools/roles.js +224 -182
  100. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  101. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  102. package/dist/adapters/mysql/tools/router.js +168 -67
  103. package/dist/adapters/mysql/tools/router.js.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  105. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  106. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  108. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  109. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  111. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  112. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  115. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  117. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  118. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  120. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  121. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  123. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  124. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  126. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  127. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  129. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  130. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  132. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  133. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  135. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  136. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  138. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  139. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  141. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  142. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  144. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  145. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  147. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  148. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  150. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  151. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  153. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  154. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  156. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  157. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  159. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  160. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  162. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  163. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  165. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  166. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  168. package/dist/adapters/mysql/tools/transactions.js +48 -23
  169. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  171. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  173. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  174. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  175. package/dist/adapters/mysql/types/router-types.js +1 -1
  176. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  177. package/dist/adapters/mysql/types/shell-types.js +2 -2
  178. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  179. package/dist/adapters/mysql/types.d.ts +485 -21
  180. package/dist/adapters/mysql/types.d.ts.map +1 -1
  181. package/dist/adapters/mysql/types.js +546 -19
  182. package/dist/adapters/mysql/types.js.map +1 -1
  183. package/dist/auth/scopes.js +1 -1
  184. package/dist/auth/scopes.js.map +1 -1
  185. package/dist/codemode/api.d.ts +3 -2
  186. package/dist/codemode/api.d.ts.map +1 -1
  187. package/dist/codemode/api.js +80 -5
  188. package/dist/codemode/api.js.map +1 -1
  189. package/dist/codemode/sandbox-factory.js +1 -1
  190. package/dist/codemode/sandbox-factory.js.map +1 -1
  191. package/dist/codemode/types.d.ts +26 -0
  192. package/dist/codemode/types.d.ts.map +1 -1
  193. package/dist/codemode/types.js +2 -0
  194. package/dist/codemode/types.js.map +1 -1
  195. package/dist/codemode/worker-sandbox.d.ts +4 -2
  196. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  197. package/dist/codemode/worker-sandbox.js +66 -7
  198. package/dist/codemode/worker-sandbox.js.map +1 -1
  199. package/dist/codemode/worker-script.d.ts +3 -0
  200. package/dist/codemode/worker-script.d.ts.map +1 -1
  201. package/dist/codemode/worker-script.js +128 -75
  202. package/dist/codemode/worker-script.js.map +1 -1
  203. package/dist/constants/ServerInstructions.d.ts +1 -1
  204. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  205. package/dist/constants/ServerInstructions.js +37 -31
  206. package/dist/constants/ServerInstructions.js.map +1 -1
  207. package/dist/filtering/ToolConstants.d.ts +1 -1
  208. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  209. package/dist/filtering/ToolConstants.js +1 -2
  210. package/dist/filtering/ToolConstants.js.map +1 -1
  211. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  212. package/dist/pool/ConnectionPool.js.map +1 -1
  213. package/dist/transports/http.d.ts.map +1 -1
  214. package/dist/transports/http.js +6 -0
  215. package/dist/transports/http.js.map +1 -1
  216. package/dist/utils/validators.d.ts +1 -1
  217. package/dist/utils/validators.d.ts.map +1 -1
  218. package/dist/utils/validators.js.map +1 -1
  219. package/package.json +4 -4
  220. package/releases/v2.3.0-release-notes.md +20 -20
  221. package/releases/v2.3.1-release-notes.md +34 -0
  222. package/releases/v3.0.0-release-notes.md +81 -0
  223. package/src/__tests__/mocks/adapter.ts +3 -0
  224. package/src/__tests__/perf.test.ts +6 -6
  225. package/src/adapters/DatabaseAdapter.ts +58 -9
  226. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  227. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  228. package/src/adapters/mysql/SchemaManager.ts +21 -21
  229. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  230. package/src/adapters/mysql/prompts/index.ts +12 -22
  231. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  232. package/src/adapters/mysql/resources/docstore.ts +13 -10
  233. package/src/adapters/mysql/resources/events.ts +12 -12
  234. package/src/adapters/mysql/resources/indexes.ts +17 -19
  235. package/src/adapters/mysql/resources/innodb.ts +23 -22
  236. package/src/adapters/mysql/resources/locks.ts +9 -7
  237. package/src/adapters/mysql/resources/performance.ts +23 -18
  238. package/src/adapters/mysql/resources/spatial.ts +9 -7
  239. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  240. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  241. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  242. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  243. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  244. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  245. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  246. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  247. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  248. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  249. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
  250. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  251. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  252. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  253. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  254. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  255. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  256. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  257. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  258. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  259. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  260. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  261. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  262. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  263. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  264. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  265. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  266. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  267. package/src/adapters/mysql/tools/core.ts +152 -38
  268. package/src/adapters/mysql/tools/docstore.ts +422 -205
  269. package/src/adapters/mysql/tools/events.ts +334 -233
  270. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  271. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  272. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  273. package/src/adapters/mysql/tools/json/core.ts +21 -42
  274. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  275. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  276. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  278. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  279. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  280. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  281. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  282. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  283. package/src/adapters/mysql/tools/replication.ts +84 -57
  284. package/src/adapters/mysql/tools/roles.ts +274 -226
  285. package/src/adapters/mysql/tools/router.ts +181 -85
  286. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  288. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  289. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  290. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  291. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  292. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  293. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  294. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  295. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  296. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  297. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  298. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  299. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  300. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  301. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  302. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  303. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  304. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  305. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  306. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  307. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  308. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  309. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  310. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  311. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  312. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  313. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  314. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  315. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  316. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  317. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  318. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  319. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  320. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  321. package/src/adapters/mysql/tools/transactions.ts +49 -24
  322. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  323. package/src/adapters/mysql/types/router-types.ts +1 -1
  324. package/src/adapters/mysql/types/shell-types.ts +2 -2
  325. package/src/adapters/mysql/types.ts +632 -19
  326. package/src/auth/__tests__/scopes.test.ts +2 -2
  327. package/src/auth/scopes.ts +1 -1
  328. package/src/codemode/__tests__/api.test.ts +417 -0
  329. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  330. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  331. package/src/codemode/__tests__/security.test.ts +368 -0
  332. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  333. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  334. package/src/codemode/api.ts +89 -5
  335. package/src/codemode/sandbox-factory.ts +1 -1
  336. package/src/codemode/types.ts +34 -0
  337. package/src/codemode/worker-sandbox.ts +74 -7
  338. package/src/codemode/worker-script.ts +157 -86
  339. package/src/constants/ServerInstructions.ts +37 -31
  340. package/src/filtering/ToolConstants.ts +1 -2
  341. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  342. package/src/pool/ConnectionPool.ts +4 -1
  343. package/src/transports/__tests__/http.test.ts +15 -3
  344. package/src/transports/http.ts +12 -0
  345. package/src/utils/validators.ts +2 -1
  346. package/vitest.config.ts +3 -1
  347. package/CODE_MODE.md +0 -245
@@ -0,0 +1,274 @@
1
+ /**
2
+ * mysql-mcp - Monitoring Summary & Edge Cases Tests
3
+ *
4
+ * Tests for parseInnodbStatusSummary (via summary=true),
5
+ * InnoDB ZodError path, and replication double-failure path.
6
+ * These target lines 209-289, 330-332, 374, 381 in monitoring.ts.
7
+ */
8
+
9
+ import { describe, it, expect, vi, beforeEach } from "vitest";
10
+ import {
11
+ createInnodbStatusTool,
12
+ createReplicationStatusTool,
13
+ createShowStatusTool,
14
+ createShowVariablesTool,
15
+ } from "../monitoring.js";
16
+ import type { MySQLAdapter } from "../../../MySQLAdapter.js";
17
+ import {
18
+ createMockMySQLAdapter,
19
+ createMockRequestContext,
20
+ createMockQueryResult,
21
+ } from "../../../../../__tests__/mocks/index.js";
22
+
23
+ describe("Monitoring Summary & Edge Cases", () => {
24
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
25
+ let mockContext: ReturnType<typeof createMockRequestContext>;
26
+
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ mockAdapter = createMockMySQLAdapter();
30
+ mockContext = createMockRequestContext();
31
+ });
32
+
33
+ // ===========================================================================
34
+ // InnoDB Status with summary=true (exercises parseInnodbStatusSummary)
35
+ // ===========================================================================
36
+ describe("InnoDB status summary mode", () => {
37
+ it("should parse buffer pool metrics from raw status", async () => {
38
+ const rawStatus = [
39
+ "BACKGROUND THREAD",
40
+ "Buffer pool size 16384",
41
+ "Free buffers 1024",
42
+ "Buffer pool hit rate 999 / 1000",
43
+ "END OF INNODB MONITOR OUTPUT",
44
+ ].join("\n");
45
+
46
+ mockAdapter.executeQuery.mockResolvedValue(
47
+ createMockQueryResult([{ Status: rawStatus }]),
48
+ );
49
+
50
+ const tool = createInnodbStatusTool(
51
+ mockAdapter as unknown as MySQLAdapter,
52
+ );
53
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
54
+ summary: Record<string, unknown>;
55
+ };
56
+
57
+ expect(result.summary).toBeDefined();
58
+ const bp = result.summary["bufferPool"] as Record<string, unknown>;
59
+ expect(bp).toBeDefined();
60
+ expect(bp["size"]).toBe(16384);
61
+ expect(bp["freeBuffers"]).toBe(1024);
62
+ expect(bp["hitRate"]).toBe("999/1000");
63
+ });
64
+
65
+ it("should parse row operations metrics", async () => {
66
+ const rawStatus =
67
+ "1.50 inserts/s, 2.75 updates/s, 0.25 deletes/s, 100.00 reads/s";
68
+
69
+ mockAdapter.executeQuery.mockResolvedValue(
70
+ createMockQueryResult([{ Status: rawStatus }]),
71
+ );
72
+
73
+ const tool = createInnodbStatusTool(
74
+ mockAdapter as unknown as MySQLAdapter,
75
+ );
76
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
77
+ summary: Record<string, unknown>;
78
+ };
79
+
80
+ const ops = result.summary["rowOperations"] as Record<string, number>;
81
+ expect(ops).toBeDefined();
82
+ expect(ops["insertsPerSec"]).toBe(1.5);
83
+ expect(ops["updatesPerSec"]).toBe(2.75);
84
+ expect(ops["deletesPerSec"]).toBe(0.25);
85
+ expect(ops["readsPerSec"]).toBe(100.0);
86
+ });
87
+
88
+ it("should parse log section metrics", async () => {
89
+ const rawStatus = [
90
+ "Log sequence number 123456789",
91
+ "Last checkpoint at 123456000",
92
+ ].join("\n");
93
+
94
+ mockAdapter.executeQuery.mockResolvedValue(
95
+ createMockQueryResult([{ Status: rawStatus }]),
96
+ );
97
+
98
+ const tool = createInnodbStatusTool(
99
+ mockAdapter as unknown as MySQLAdapter,
100
+ );
101
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
102
+ summary: Record<string, unknown>;
103
+ };
104
+
105
+ const log = result.summary["log"] as Record<string, number>;
106
+ expect(log).toBeDefined();
107
+ expect(log["sequenceNumber"]).toBe(123456789);
108
+ expect(log["lastCheckpoint"]).toBe(123456000);
109
+ });
110
+
111
+ it("should parse transactions section", async () => {
112
+ const rawStatus = [
113
+ "History list length 100",
114
+ "Trx id counter 456789",
115
+ ].join("\n");
116
+
117
+ mockAdapter.executeQuery.mockResolvedValue(
118
+ createMockQueryResult([{ Status: rawStatus }]),
119
+ );
120
+
121
+ const tool = createInnodbStatusTool(
122
+ mockAdapter as unknown as MySQLAdapter,
123
+ );
124
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
125
+ summary: Record<string, unknown>;
126
+ };
127
+
128
+ const trx = result.summary["transactions"] as Record<string, number>;
129
+ expect(trx).toBeDefined();
130
+ expect(trx["historyListLength"]).toBe(100);
131
+ expect(trx["trxIdCounter"]).toBe(456789);
132
+ });
133
+
134
+ it("should parse semaphores section", async () => {
135
+ const rawStatus = "OS WAIT ARRAY INFO: reservation count 42";
136
+
137
+ mockAdapter.executeQuery.mockResolvedValue(
138
+ createMockQueryResult([{ Status: rawStatus }]),
139
+ );
140
+
141
+ const tool = createInnodbStatusTool(
142
+ mockAdapter as unknown as MySQLAdapter,
143
+ );
144
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
145
+ summary: Record<string, unknown>;
146
+ };
147
+
148
+ const sem = result.summary["semaphores"] as Record<string, number>;
149
+ expect(sem).toBeDefined();
150
+ expect(sem["osWaitReservations"]).toBe(42);
151
+ });
152
+
153
+ it("should return empty summary for status without matching patterns", async () => {
154
+ mockAdapter.executeQuery.mockResolvedValue(
155
+ createMockQueryResult([{ Status: "Nothing relevant here" }]),
156
+ );
157
+
158
+ const tool = createInnodbStatusTool(
159
+ mockAdapter as unknown as MySQLAdapter,
160
+ );
161
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
162
+ summary: Record<string, unknown>;
163
+ };
164
+
165
+ expect(result.summary).toBeDefined();
166
+ expect(Object.keys(result.summary)).toHaveLength(0);
167
+ });
168
+
169
+ it("should handle empty rows for summary mode", async () => {
170
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
171
+
172
+ const tool = createInnodbStatusTool(
173
+ mockAdapter as unknown as MySQLAdapter,
174
+ );
175
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
176
+ summary: Record<string, unknown>;
177
+ };
178
+
179
+ expect(result.summary).toBeDefined();
180
+ });
181
+
182
+ it("should handle STATUS column name in uppercase", async () => {
183
+ mockAdapter.executeQuery.mockResolvedValue(
184
+ createMockQueryResult([{ STATUS: "Buffer pool size 8192" }]),
185
+ );
186
+
187
+ const tool = createInnodbStatusTool(
188
+ mockAdapter as unknown as MySQLAdapter,
189
+ );
190
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
191
+ summary: Record<string, unknown>;
192
+ };
193
+
194
+ expect(result.summary).toBeDefined();
195
+ });
196
+ });
197
+
198
+ // ===========================================================================
199
+ // Replication double-failure and SHOW SLAVE STATUS fallback
200
+ // ===========================================================================
201
+ describe("replication edge cases", () => {
202
+ it("should handle both REPLICA and SLAVE STATUS failing", async () => {
203
+ mockAdapter.executeQuery
204
+ .mockRejectedValueOnce(new Error("REPLICA not supported"))
205
+ .mockRejectedValueOnce(new Error("SLAVE not supported"));
206
+
207
+ const tool = createReplicationStatusTool(
208
+ mockAdapter as unknown as MySQLAdapter,
209
+ );
210
+ const result = (await tool.handler({}, mockContext)) as {
211
+ configured: boolean;
212
+ message: string;
213
+ };
214
+
215
+ expect(result.configured).toBe(false);
216
+ expect(result.message).toContain("not configured");
217
+ });
218
+
219
+ it("should handle SHOW SLAVE STATUS returning empty rows", async () => {
220
+ mockAdapter.executeQuery
221
+ .mockRejectedValueOnce(new Error("REPLICA not supported"))
222
+ .mockResolvedValueOnce(createMockQueryResult([]));
223
+
224
+ const tool = createReplicationStatusTool(
225
+ mockAdapter as unknown as MySQLAdapter,
226
+ );
227
+ const result = (await tool.handler({}, mockContext)) as {
228
+ configured: boolean;
229
+ message: string;
230
+ };
231
+
232
+ expect(result.configured).toBe(false);
233
+ expect(result.message).toContain("not configured");
234
+ });
235
+ });
236
+
237
+ // ===========================================================================
238
+ // ShowStatus and ShowVariables - limit < 1 validation path
239
+ // ===========================================================================
240
+ describe("status/variables limit validation", () => {
241
+ it("should reject limit < 1 in showStatus", async () => {
242
+ const tool = createShowStatusTool(mockAdapter as unknown as MySQLAdapter);
243
+ const result = (await tool.handler({ limit: 0 }, mockContext)) as {
244
+ success: boolean;
245
+ error: string;
246
+ };
247
+ expect(result.success).toBe(false);
248
+ expect(result.error).toContain("limit must be a positive integer");
249
+ });
250
+
251
+ it("should reject limit < 1 in showVariables", async () => {
252
+ const tool = createShowVariablesTool(
253
+ mockAdapter as unknown as MySQLAdapter,
254
+ );
255
+ const result = (await tool.handler({ limit: 0 }, mockContext)) as {
256
+ success: boolean;
257
+ error: string;
258
+ };
259
+ expect(result.success).toBe(false);
260
+ expect(result.error).toContain("limit must be a positive integer");
261
+ });
262
+
263
+ it("should handle showVariables with LIKE and session", async () => {
264
+ mockAdapter.rawQuery.mockResolvedValue(createMockQueryResult([]));
265
+ const tool = createShowVariablesTool(
266
+ mockAdapter as unknown as MySQLAdapter,
267
+ );
268
+ await tool.handler({ global: false, like: "max_%" }, mockContext);
269
+ const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
270
+ expect(call).not.toContain("GLOBAL");
271
+ expect(call).toContain("LIKE 'max_%'");
272
+ });
273
+ });
274
+ });
@@ -81,6 +81,21 @@ describe("Admin Monitoring Tools", () => {
81
81
  expect(result).toHaveProperty("processes");
82
82
  expect((result as { processes: unknown[] }).processes).toEqual([]);
83
83
  });
84
+
85
+ it("should return structured error on query failure", async () => {
86
+ mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
87
+
88
+ const tool = createShowProcesslistTool(
89
+ mockAdapter as unknown as MySQLAdapter,
90
+ );
91
+ const result = (await tool.handler({}, mockContext)) as {
92
+ success: false;
93
+ error: string;
94
+ };
95
+
96
+ expect(result.success).toBe(false);
97
+ expect(result.error).toBe("Connection lost");
98
+ });
84
99
  });
85
100
 
86
101
  describe("createShowStatusTool", () => {
@@ -226,6 +241,33 @@ describe("Admin Monitoring Tools", () => {
226
241
  "[REDACTED]",
227
242
  );
228
243
  });
244
+
245
+ it("should return structured error on query failure", async () => {
246
+ mockAdapter.rawQuery.mockRejectedValue(new Error("Access denied"));
247
+
248
+ const tool = createShowStatusTool(mockAdapter as unknown as MySQLAdapter);
249
+ const result = (await tool.handler({}, mockContext)) as {
250
+ success: false;
251
+ error: string;
252
+ };
253
+
254
+ expect(result.success).toBe(false);
255
+ expect(result.error).toBe("Access denied");
256
+ });
257
+
258
+ it("should return structured error on Zod validation failure", async () => {
259
+ const tool = createShowStatusTool(mockAdapter as unknown as MySQLAdapter);
260
+ const result = (await tool.handler(
261
+ { limit: "not-a-number" },
262
+ mockContext,
263
+ )) as {
264
+ success: false;
265
+ error: string;
266
+ };
267
+
268
+ expect(result.success).toBe(false);
269
+ expect(result.error).toBeDefined();
270
+ });
229
271
  });
230
272
 
231
273
  describe("createShowVariablesTool", () => {
@@ -327,6 +369,21 @@ describe("Admin Monitoring Tools", () => {
327
369
  expect(result.totalAvailable).toBe(200);
328
370
  expect(result.limited).toBe(true);
329
371
  });
372
+
373
+ it("should return structured error on query failure", async () => {
374
+ mockAdapter.rawQuery.mockRejectedValue(new Error("Connection refused"));
375
+
376
+ const tool = createShowVariablesTool(
377
+ mockAdapter as unknown as MySQLAdapter,
378
+ );
379
+ const result = (await tool.handler({}, mockContext)) as {
380
+ success: false;
381
+ error: string;
382
+ };
383
+
384
+ expect(result.success).toBe(false);
385
+ expect(result.error).toBe("Connection refused");
386
+ });
330
387
  });
331
388
 
332
389
  describe("createInnodbStatusTool", () => {
@@ -373,6 +430,23 @@ describe("Admin Monitoring Tools", () => {
373
430
 
374
431
  expect(result).toHaveProperty("status");
375
432
  });
433
+
434
+ it("should return structured error on query failure", async () => {
435
+ mockAdapter.executeQuery.mockRejectedValue(
436
+ new Error("PROCESS privilege required"),
437
+ );
438
+
439
+ const tool = createInnodbStatusTool(
440
+ mockAdapter as unknown as MySQLAdapter,
441
+ );
442
+ const result = (await tool.handler({}, mockContext)) as {
443
+ success: false;
444
+ error: string;
445
+ };
446
+
447
+ expect(result.success).toBe(false);
448
+ expect(result.error).toBe("PROCESS privilege required");
449
+ });
376
450
  });
377
451
 
378
452
  describe("createReplicationStatusTool", () => {
@@ -473,12 +547,16 @@ describe("Admin Monitoring Tools", () => {
473
547
  mockAdapter.getPool = vi.fn().mockReturnValue(undefined);
474
548
 
475
549
  const tool = createPoolStatsTool(mockAdapter as unknown as MySQLAdapter);
476
- const result = (await tool.handler({}, mockContext)) as { error: string };
550
+ const result = (await tool.handler({}, mockContext)) as {
551
+ success: false;
552
+ error: string;
553
+ };
477
554
 
555
+ expect(result.success).toBe(false);
478
556
  expect(result.error).toBe("Pool not available");
479
557
  });
480
558
 
481
- it("should handle pool error", async () => {
559
+ it("should return structured error on pool error", async () => {
482
560
  const mockPool = {
483
561
  getStats: vi.fn().mockImplementation(() => {
484
562
  throw new Error("Pool error");
@@ -487,7 +565,13 @@ describe("Admin Monitoring Tools", () => {
487
565
  mockAdapter.getPool = vi.fn().mockReturnValue(mockPool);
488
566
 
489
567
  const tool = createPoolStatsTool(mockAdapter as unknown as MySQLAdapter);
490
- await expect(tool.handler({}, mockContext)).rejects.toThrow("Pool error");
568
+ const result = (await tool.handler({}, mockContext)) as {
569
+ success: false;
570
+ error: string;
571
+ };
572
+
573
+ expect(result.success).toBe(false);
574
+ expect(result.error).toBe("Pool error");
491
575
  });
492
576
  });
493
577
 
@@ -586,14 +670,19 @@ describe("Admin Monitoring Tools", () => {
586
670
  expect(result.activeConnections).toBeUndefined();
587
671
  });
588
672
 
589
- it("should mark unhealthy on connection failure", async () => {
673
+ it("should return structured error on connection failure", async () => {
590
674
  mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
591
675
 
592
676
  const tool = createServerHealthTool(
593
677
  mockAdapter as unknown as MySQLAdapter,
594
678
  );
679
+ const result = (await tool.handler({}, mockContext)) as {
680
+ success: false;
681
+ error: string;
682
+ };
595
683
 
596
- await expect(tool.handler({}, mockContext)).rejects.toThrow();
684
+ expect(result.success).toBe(false);
685
+ expect(result.error).toBe("Connection lost");
597
686
  });
598
687
  });
599
688
  });