@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
@@ -7,6 +7,7 @@
7
7
  import { promises as fs } from "fs";
8
8
  import { tmpdir } from "os";
9
9
  import { join } from "path";
10
+ import { ZodError } from "zod";
10
11
  import type {
11
12
  ToolDefinition,
12
13
  RequestContext,
@@ -17,6 +18,11 @@ import {
17
18
  } from "../../types/shell-types.js";
18
19
  import { getShellConfig, execShellJS, execMySQLShell } from "./common.js";
19
20
 
21
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
22
+ function formatZodError(error: ZodError): string {
23
+ return error.issues.map((i) => i.message).join("; ");
24
+ }
25
+
20
26
  /**
21
27
  * Load dump to instance
22
28
  */
@@ -210,59 +216,67 @@ export function createShellRunScriptTool(): ToolDefinition {
210
216
  openWorldHint: true,
211
217
  },
212
218
  handler: async (params: unknown, _context: RequestContext) => {
213
- const { script, language, timeout } =
214
- ShellRunScriptInputSchema.parse(params);
215
- const config = getShellConfig();
219
+ try {
220
+ const { script, language, timeout } =
221
+ ShellRunScriptInputSchema.parse(params);
222
+ const config = getShellConfig();
216
223
 
217
- // Build command based on language
218
- let langFlag: string;
219
- switch (language) {
220
- case "js":
221
- langFlag = "--js";
222
- break;
223
- case "py":
224
- langFlag = "--py";
225
- break;
226
- case "sql":
227
- langFlag = "--sql";
228
- break;
229
- }
224
+ // Build command based on language
225
+ let langFlag: string;
226
+ switch (language) {
227
+ case "js":
228
+ langFlag = "--js";
229
+ break;
230
+ case "py":
231
+ langFlag = "--py";
232
+ break;
233
+ case "sql":
234
+ langFlag = "--sql";
235
+ break;
236
+ }
230
237
 
231
- let result;
232
- // SQL scripts with comments or multi-line content break when passed via -e
233
- // Use --file approach for SQL to properly handle all syntax
234
- if (language === "sql") {
235
- // Create a secure temp directory via mkdtemp (restrictive permissions,
236
- // unique path) to avoid CodeQL js/insecure-temporary-file alert.
237
- const tempDir = await fs.mkdtemp(join(tmpdir(), `mysqlsh_script_`));
238
- const tempFile = join(tempDir, "script.sql");
239
- try {
240
- await fs.writeFile(tempFile, script, "utf8");
241
- const args = [
242
- "--uri",
243
- config.connectionUri,
244
- langFlag,
245
- "--file",
246
- tempFile,
247
- ];
238
+ let result;
239
+ // SQL scripts with comments or multi-line content break when passed via -e
240
+ // Use --file approach for SQL to properly handle all syntax
241
+ if (language === "sql") {
242
+ // Create a secure temp directory via mkdtemp (restrictive permissions,
243
+ // unique path) to avoid CodeQL js/insecure-temporary-file alert.
244
+ const tempDir = await fs.mkdtemp(join(tmpdir(), `mysqlsh_script_`));
245
+ const tempFile = join(tempDir, "script.sql");
246
+ try {
247
+ await fs.writeFile(tempFile, script, "utf8");
248
+ const args = [
249
+ "--uri",
250
+ config.connectionUri,
251
+ langFlag,
252
+ "--file",
253
+ tempFile,
254
+ ];
255
+ result = await execMySQLShell(args, { timeout });
256
+ } finally {
257
+ // Cleanup temp directory and its contents
258
+ await fs.rm(tempDir, { recursive: true }).catch(() => void 0);
259
+ }
260
+ } else {
261
+ // JS and Python work fine with -e
262
+ const args = ["--uri", config.connectionUri, langFlag, "-e", script];
248
263
  result = await execMySQLShell(args, { timeout });
249
- } finally {
250
- // Cleanup temp directory and its contents
251
- await fs.rm(tempDir, { recursive: true }).catch(() => void 0);
252
264
  }
253
- } else {
254
- // JS and Python work fine with -e
255
- const args = ["--uri", config.connectionUri, langFlag, "-e", script];
256
- result = await execMySQLShell(args, { timeout });
257
- }
258
265
 
259
- return {
260
- success: result.exitCode === 0,
261
- language,
262
- exitCode: result.exitCode,
263
- stdout: result.stdout,
264
- stderr: result.stderr,
265
- };
266
+ return {
267
+ success: result.exitCode === 0,
268
+ language,
269
+ exitCode: result.exitCode,
270
+ stdout: result.stdout,
271
+ stderr: result.stderr,
272
+ };
273
+ } catch (error) {
274
+ if (error instanceof ZodError) {
275
+ return { success: false, error: formatZodError(error) };
276
+ }
277
+ const message = error instanceof Error ? error.message : String(error);
278
+ return { success: false, error: message };
279
+ }
266
280
  },
267
281
  };
268
282
  }
@@ -272,29 +272,37 @@ describe("Spatial Operations Tools", () => {
272
272
  expect(result.wkt).toBe("POINT(10 20)");
273
273
  });
274
274
 
275
- it("should throw if neither geometry nor geoJson provided", async () => {
275
+ it("should return structured error if neither geometry nor geoJson provided", async () => {
276
276
  const tool = createSpatialGeoJSONTool(
277
277
  mockAdapter as unknown as MySQLAdapter,
278
278
  );
279
- // Use type assertion or casting to bypass TS error for invalid input in test
280
- // Zod parser will catch it, or refiner.
281
- // Wait, Zod schema has refine check.
282
- await expect(tool.handler({}, mockContext)).rejects.toThrow();
279
+ const result = await tool.handler({}, mockContext);
280
+ expect(result).toEqual({
281
+ success: false,
282
+ error: expect.stringContaining(
283
+ "Either geometry or geoJson must be provided",
284
+ ),
285
+ });
283
286
  });
284
287
 
285
- it("should throw if both geometry and geoJson provided", async () => {
288
+ it("should return structured error if both geometry and geoJson provided", async () => {
286
289
  const tool = createSpatialGeoJSONTool(
287
290
  mockAdapter as unknown as MySQLAdapter,
288
291
  );
289
- await expect(
290
- tool.handler(
291
- {
292
- geometry: "POINT(0 0)",
293
- geoJson: "{}",
294
- },
295
- mockContext,
292
+ const result = await tool.handler(
293
+ {
294
+ geometry: "POINT(0 0)",
295
+ geoJson: "{}",
296
+ },
297
+ mockContext,
298
+ );
299
+
300
+ expect(result).toEqual({
301
+ success: false,
302
+ error: expect.stringContaining(
303
+ "Either geometry or geoJson must be provided",
296
304
  ),
297
- ).rejects.toThrow();
305
+ });
298
306
  });
299
307
  });
300
308
  });
@@ -97,32 +97,38 @@ describe("Spatial Queries Tools", () => {
97
97
  const tool = createSpatialDistanceTool(
98
98
  mockAdapter as unknown as MySQLAdapter,
99
99
  );
100
- await expect(
101
- tool.handler(
102
- {
103
- table: "invalid; drop table",
104
- spatialColumn: "geom",
105
- point: { longitude: 0, latitude: 0 },
106
- },
107
- mockContext,
108
- ),
109
- ).rejects.toThrow("Invalid table name");
100
+ const result = await tool.handler(
101
+ {
102
+ table: "invalid; drop table",
103
+ spatialColumn: "geom",
104
+ point: { longitude: 0, latitude: 0 },
105
+ },
106
+ mockContext,
107
+ );
108
+
109
+ expect(result).toEqual({
110
+ success: false,
111
+ error: expect.stringContaining("Invalid table name"),
112
+ });
110
113
  });
111
114
 
112
115
  it("should validate column name", async () => {
113
116
  const tool = createSpatialDistanceTool(
114
117
  mockAdapter as unknown as MySQLAdapter,
115
118
  );
116
- await expect(
117
- tool.handler(
118
- {
119
- table: "valid_table",
120
- spatialColumn: "invalid column",
121
- point: { longitude: 0, latitude: 0 },
122
- },
123
- mockContext,
124
- ),
125
- ).rejects.toThrow("Invalid column name");
119
+ const result = await tool.handler(
120
+ {
121
+ table: "valid_table",
122
+ spatialColumn: "invalid column",
123
+ point: { longitude: 0, latitude: 0 },
124
+ },
125
+ mockContext,
126
+ );
127
+
128
+ expect(result).toEqual({
129
+ success: false,
130
+ error: "Invalid column name",
131
+ });
126
132
  });
127
133
 
128
134
  it("should handle undefined rows result", async () => {
@@ -200,17 +206,19 @@ describe("Spatial Queries Tools", () => {
200
206
  const tool = createSpatialDistanceSphereTool(
201
207
  mockAdapter as unknown as MySQLAdapter,
202
208
  );
203
- await expect(
204
- tool.handler(
205
- {
206
- table: "invalid",
207
- spatialColumn: "bad-column", // Hyphens not allowed by simple regex maybe?
208
- // Regex is /^[a-zA-Z_][a-zA-Z0-9_]*$/ so hyphen is invalid
209
- point: { longitude: 0, latitude: 0 },
210
- },
211
- mockContext,
212
- ),
213
- ).rejects.toThrow("Invalid column name");
209
+ const result = await tool.handler(
210
+ {
211
+ table: "invalid",
212
+ spatialColumn: "bad-column",
213
+ point: { longitude: 0, latitude: 0 },
214
+ },
215
+ mockContext,
216
+ );
217
+
218
+ expect(result).toEqual({
219
+ success: false,
220
+ error: "Invalid column name",
221
+ });
214
222
  });
215
223
  });
216
224
 
@@ -267,16 +275,19 @@ describe("Spatial Queries Tools", () => {
267
275
  const tool = createSpatialContainsTool(
268
276
  mockAdapter as unknown as MySQLAdapter,
269
277
  );
270
- await expect(
271
- tool.handler(
272
- {
273
- table: "bad-table",
274
- spatialColumn: "boundary",
275
- polygon: "P",
276
- },
277
- mockContext,
278
- ),
279
- ).rejects.toThrow("Invalid table name");
278
+ const result = await tool.handler(
279
+ {
280
+ table: "bad-table",
281
+ spatialColumn: "boundary",
282
+ polygon: "P",
283
+ },
284
+ mockContext,
285
+ );
286
+
287
+ expect(result).toEqual({
288
+ success: false,
289
+ error: expect.stringContaining("Invalid table name"),
290
+ });
280
291
  });
281
292
  });
282
293
 
@@ -333,16 +344,19 @@ describe("Spatial Queries Tools", () => {
333
344
  const tool = createSpatialWithinTool(
334
345
  mockAdapter as unknown as MySQLAdapter,
335
346
  );
336
- await expect(
337
- tool.handler(
338
- {
339
- table: "t",
340
- spatialColumn: "bad col",
341
- geometry: "P",
342
- },
343
- mockContext,
344
- ),
345
- ).rejects.toThrow("Invalid column name");
347
+ const result = await tool.handler(
348
+ {
349
+ table: "t",
350
+ spatialColumn: "bad col",
351
+ geometry: "P",
352
+ },
353
+ mockContext,
354
+ );
355
+
356
+ expect(result).toEqual({
357
+ success: false,
358
+ error: "Invalid column name",
359
+ });
346
360
  });
347
361
  });
348
362
  });
@@ -5,7 +5,7 @@
5
5
  * 2 tools: point and polygon creation.
6
6
  */
7
7
 
8
- import { z } from "zod";
8
+ import { z, ZodError } from "zod";
9
9
  import type { MySQLAdapter } from "../../MySQLAdapter.js";
10
10
  import type {
11
11
  ToolDefinition,
@@ -16,6 +16,16 @@ import type {
16
16
  // Helpers
17
17
  // =============================================================================
18
18
 
19
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
20
+ function formatZodError(error: ZodError): string {
21
+ return error.issues.map((i) => i.message).join("; ");
22
+ }
23
+
24
+ /** Strip verbose adapter prefixes from MySQL error messages */
25
+ function stripErrorPrefix(msg: string): string {
26
+ return msg.replace(/^(Query failed:\s*)?(Execute failed:\s*)?/i, "");
27
+ }
28
+
19
29
  /**
20
30
  * Parse GeoJSON result from MySQL.
21
31
  * MySQL returns ST_AsGeoJSON as a string, but mysql2 driver may auto-parse JSON.
@@ -73,9 +83,9 @@ export function createSpatialPointTool(adapter: MySQLAdapter): ToolDefinition {
73
83
  idempotentHint: true,
74
84
  },
75
85
  handler: async (params: unknown, _context: RequestContext) => {
76
- const { longitude, latitude, srid } = PointSchema.parse(params);
77
-
78
86
  try {
87
+ const { longitude, latitude, srid } = PointSchema.parse(params);
88
+
79
89
  const result = await adapter.executeQuery(
80
90
  `SELECT ST_AsText(ST_SRID(ST_GeomFromText('POINT(${String(longitude)} ${String(latitude)})', ${String(srid)}, 'axis-order=long-lat'), ${String(srid)})) as wkt,
81
91
  ST_AsGeoJSON(ST_SRID(ST_GeomFromText('POINT(${String(longitude)} ${String(latitude)})', ${String(srid)}, 'axis-order=long-lat'), ${String(srid)})) as geoJson`,
@@ -90,8 +100,11 @@ export function createSpatialPointTool(adapter: MySQLAdapter): ToolDefinition {
90
100
  latitude,
91
101
  };
92
102
  } catch (error) {
103
+ if (error instanceof ZodError) {
104
+ return { success: false, error: formatZodError(error) };
105
+ }
93
106
  const msg = error instanceof Error ? error.message : String(error);
94
- return { success: false, error: msg };
107
+ return { success: false, error: stripErrorPrefix(msg) };
95
108
  }
96
109
  },
97
110
  };
@@ -115,9 +128,9 @@ export function createSpatialPolygonTool(
115
128
  idempotentHint: true,
116
129
  },
117
130
  handler: async (params: unknown, _context: RequestContext) => {
118
- const { coordinates, srid } = PolygonSchema.parse(params);
119
-
120
131
  try {
132
+ const { coordinates, srid } = PolygonSchema.parse(params);
133
+
121
134
  // Build WKT polygon
122
135
  const rings = coordinates.map(
123
136
  (ring) =>
@@ -144,8 +157,11 @@ export function createSpatialPolygonTool(
144
157
  srid,
145
158
  };
146
159
  } catch (error) {
160
+ if (error instanceof ZodError) {
161
+ return { success: false, error: formatZodError(error) };
162
+ }
147
163
  const msg = error instanceof Error ? error.message : String(error);
148
- return { success: false, error: msg };
164
+ return { success: false, error: stripErrorPrefix(msg) };
149
165
  }
150
166
  },
151
167
  };
@@ -5,7 +5,7 @@
5
5
  * 4 tools: intersection, buffer, transform, geojson.
6
6
  */
7
7
 
8
- import { z } from "zod";
8
+ import { z, ZodError } from "zod";
9
9
  import type { MySQLAdapter } from "../../MySQLAdapter.js";
10
10
  import type {
11
11
  ToolDefinition,
@@ -16,6 +16,16 @@ import type {
16
16
  // Helpers
17
17
  // =============================================================================
18
18
 
19
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
20
+ function formatZodError(error: ZodError): string {
21
+ return error.issues.map((i) => i.message).join("; ");
22
+ }
23
+
24
+ /** Strip verbose adapter prefixes from MySQL error messages */
25
+ function stripErrorPrefix(msg: string): string {
26
+ return msg.replace(/^(Query failed:\s*)?(Execute failed:\s*)?/i, "");
27
+ }
28
+
19
29
  /**
20
30
  * Parse GeoJSON result from MySQL.
21
31
  * MySQL returns ST_AsGeoJSON as a string, but mysql2 driver may auto-parse JSON.
@@ -55,10 +65,9 @@ const BufferSchema = z.object({
55
65
  segments: z
56
66
  .number()
57
67
  .int()
58
- .min(1)
59
68
  .default(8)
60
69
  .describe(
61
- "Number of segments per quarter-circle for buffer polygon approximation (default: 8, MySQL default: 32). Lower values produce simpler polygons with smaller payloads. Only effective with Cartesian geometries (SRID 0); geographic SRIDs use MySQL's internal algorithm.",
70
+ "Number of segments per quarter-circle for buffer polygon approximation (default: 8, MySQL default: 32). Must be >= 1. Lower values produce simpler polygons with smaller payloads. Only effective with Cartesian geometries (SRID 0); geographic SRIDs use MySQL's internal algorithm.",
62
71
  ),
63
72
  precision: z
64
73
  .number()
@@ -77,19 +86,19 @@ const TransformSchema = z.object({
77
86
  toSrid: z.number().describe("Target SRID"),
78
87
  });
79
88
 
80
- const GeoJSONSchema = z
81
- .object({
82
- geometry: z
83
- .string()
84
- .optional()
85
- .describe("WKT geometry to convert to GeoJSON"),
86
- geoJson: z.string().optional().describe("GeoJSON to convert to WKT"),
87
- srid: z.number().default(4326).describe("SRID for conversion"),
88
- })
89
- .refine(
90
- (data) => (data.geometry !== undefined) !== (data.geoJson !== undefined),
91
- "Either geometry or geoJson must be provided, but not both",
92
- );
89
+ const GeoJSONSchemaBase = z.object({
90
+ geometry: z
91
+ .string()
92
+ .optional()
93
+ .describe("WKT geometry to convert to GeoJSON"),
94
+ geoJson: z.string().optional().describe("GeoJSON to convert to WKT"),
95
+ srid: z.number().default(4326).describe("SRID for conversion"),
96
+ });
97
+
98
+ const GeoJSONSchema = GeoJSONSchemaBase.refine(
99
+ (data) => (data.geometry !== undefined) !== (data.geoJson !== undefined),
100
+ "Either geometry or geoJson must be provided, but not both",
101
+ );
93
102
 
94
103
  /**
95
104
  * Calculate intersection of two geometries
@@ -109,9 +118,9 @@ export function createSpatialIntersectionTool(
109
118
  idempotentHint: true,
110
119
  },
111
120
  handler: async (params: unknown, _context: RequestContext) => {
112
- const { geometry1, geometry2, srid } = IntersectionSchema.parse(params);
113
-
114
121
  try {
122
+ const { geometry1, geometry2, srid } = IntersectionSchema.parse(params);
123
+
115
124
  const result = await adapter.executeQuery(
116
125
  `SELECT
117
126
  ST_Intersects(
@@ -138,8 +147,11 @@ export function createSpatialIntersectionTool(
138
147
  ),
139
148
  };
140
149
  } catch (error) {
150
+ if (error instanceof ZodError) {
151
+ return { success: false, error: formatZodError(error) };
152
+ }
141
153
  const msg = error instanceof Error ? error.message : String(error);
142
- return { success: false, error: msg };
154
+ return { success: false, error: stripErrorPrefix(msg) };
143
155
  }
144
156
  },
145
157
  };
@@ -161,10 +173,15 @@ export function createSpatialBufferTool(adapter: MySQLAdapter): ToolDefinition {
161
173
  idempotentHint: true,
162
174
  },
163
175
  handler: async (params: unknown, _context: RequestContext) => {
164
- const { geometry, distance, srid, segments, precision } =
165
- BufferSchema.parse(params);
166
-
167
176
  try {
177
+ const { geometry, distance, srid, segments, precision } =
178
+ BufferSchema.parse(params);
179
+
180
+ // Handler-level validation for segments (replaces schema .min(1))
181
+ if (segments < 1) {
182
+ return { success: false, error: "segments must be >= 1" };
183
+ }
184
+
168
185
  // ST_Buffer_Strategy only works with Cartesian (non-geographic) SRIDs.
169
186
  // Geographic SRIDs (e.g., 4326) use MySQL's internal geographic buffer algorithm.
170
187
  const isGeographic = srid !== 0;
@@ -189,8 +206,11 @@ export function createSpatialBufferTool(adapter: MySQLAdapter): ToolDefinition {
189
206
  srid,
190
207
  };
191
208
  } catch (error) {
209
+ if (error instanceof ZodError) {
210
+ return { success: false, error: formatZodError(error) };
211
+ }
192
212
  const msg = error instanceof Error ? error.message : String(error);
193
- return { success: false, error: msg };
213
+ return { success: false, error: stripErrorPrefix(msg) };
194
214
  }
195
215
  },
196
216
  };
@@ -215,9 +235,9 @@ export function createSpatialTransformTool(
215
235
  idempotentHint: true,
216
236
  },
217
237
  handler: async (params: unknown, _context: RequestContext) => {
218
- const { geometry, fromSrid, toSrid } = TransformSchema.parse(params);
219
-
220
238
  try {
239
+ const { geometry, fromSrid, toSrid } = TransformSchema.parse(params);
240
+
221
241
  const result = await adapter.executeQuery(
222
242
  `SELECT
223
243
  ST_AsText(ST_Transform(ST_GeomFromText(?, ${String(fromSrid)}, 'axis-order=long-lat'), ${String(toSrid)})) as transformed_wkt,
@@ -234,8 +254,11 @@ export function createSpatialTransformTool(
234
254
  toSrid,
235
255
  };
236
256
  } catch (error) {
257
+ if (error instanceof ZodError) {
258
+ return { success: false, error: formatZodError(error) };
259
+ }
237
260
  const msg = error instanceof Error ? error.message : String(error);
238
- return { success: false, error: msg };
261
+ return { success: false, error: stripErrorPrefix(msg) };
239
262
  }
240
263
  },
241
264
  };
@@ -252,16 +275,16 @@ export function createSpatialGeoJSONTool(
252
275
  title: "MySQL GeoJSON Conversion",
253
276
  description: "Convert geometry between WKT and GeoJSON formats.",
254
277
  group: "spatial",
255
- inputSchema: GeoJSONSchema,
278
+ inputSchema: GeoJSONSchemaBase,
256
279
  requiredScopes: ["read"],
257
280
  annotations: {
258
281
  readOnlyHint: true,
259
282
  idempotentHint: true,
260
283
  },
261
284
  handler: async (params: unknown, _context: RequestContext) => {
262
- const { geometry, geoJson, srid } = GeoJSONSchema.parse(params);
263
-
264
285
  try {
286
+ const { geometry, geoJson, srid } = GeoJSONSchema.parse(params);
287
+
265
288
  if (geometry) {
266
289
  // Convert WKT to GeoJSON
267
290
  const result = await adapter.executeQuery(
@@ -290,10 +313,16 @@ export function createSpatialGeoJSONTool(
290
313
  };
291
314
  }
292
315
 
293
- throw new Error("Either geometry or geoJson must be provided");
316
+ return {
317
+ success: false,
318
+ error: "Either geometry or geoJson must be provided",
319
+ };
294
320
  } catch (error) {
321
+ if (error instanceof ZodError) {
322
+ return { success: false, error: formatZodError(error) };
323
+ }
295
324
  const msg = error instanceof Error ? error.message : String(error);
296
- return { success: false, error: msg };
325
+ return { success: false, error: stripErrorPrefix(msg) };
297
326
  }
298
327
  },
299
328
  };