@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.
- package/.dockerignore +1 -0
- package/.gitattributes +18 -0
- package/.github/workflows/codeql.yml +2 -10
- package/.github/workflows/docker-publish.yml +15 -13
- package/CHANGELOG.md +287 -1
- package/DOCKER_README.md +100 -265
- package/Dockerfile +5 -0
- package/README.md +124 -59
- package/VERSION +1 -1
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
- package/dist/__tests__/mocks/adapter.js +2 -0
- package/dist/__tests__/mocks/adapter.js.map +1 -1
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +50 -9
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
- package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.js +8 -0
- package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
- package/dist/adapters/mysql/SchemaManager.js +16 -15
- package/dist/adapters/mysql/SchemaManager.js.map +1 -1
- package/dist/adapters/mysql/prompts/index.js +10 -20
- package/dist/adapters/mysql/prompts/index.js.map +1 -1
- package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
- package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/docstore.js +10 -7
- package/dist/adapters/mysql/resources/docstore.js.map +1 -1
- package/dist/adapters/mysql/resources/events.js +11 -8
- package/dist/adapters/mysql/resources/events.js.map +1 -1
- package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/indexes.js +12 -15
- package/dist/adapters/mysql/resources/indexes.js.map +1 -1
- package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/innodb.js +20 -17
- package/dist/adapters/mysql/resources/innodb.js.map +1 -1
- package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/locks.js +9 -6
- package/dist/adapters/mysql/resources/locks.js.map +1 -1
- package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/performance.js +15 -15
- package/dist/adapters/mysql/resources/performance.js.map +1 -1
- package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/spatial.js +9 -6
- package/dist/adapters/mysql/resources/spatial.js.map +1 -1
- package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/sysschema.js +12 -9
- package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.js +170 -121
- package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
- package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
- package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
- package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.js +6 -4
- package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
- package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/core.js +152 -29
- package/dist/adapters/mysql/tools/core.js.map +1 -1
- package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/docstore.js +340 -163
- package/dist/adapters/mysql/tools/docstore.js.map +1 -1
- package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/events.js +284 -198
- package/dist/adapters/mysql/tools/events.js.map +1 -1
- package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/core.js +11 -39
- package/dist/adapters/mysql/tools/json/core.js.map +1 -1
- package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
- package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.js +13 -24
- package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
- package/dist/adapters/mysql/tools/partitioning.js +3 -0
- package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
- package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
- package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
- package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/proxysql.js +289 -176
- package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
- package/dist/adapters/mysql/tools/replication.js +75 -49
- package/dist/adapters/mysql/tools/replication.js.map +1 -1
- package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/roles.js +224 -182
- package/dist/adapters/mysql/tools/roles.js.map +1 -1
- package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/router.js +168 -67
- package/dist/adapters/mysql/tools/router.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
- package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/management.js +61 -14
- package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/routines.js +27 -4
- package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
- package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
- package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/views.js +47 -7
- package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
- package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/audit.js +102 -34
- package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
- package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
- package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/encryption.js +137 -104
- package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/backup.js +71 -59
- package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.js +61 -47
- package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
- package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
- package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
- package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
- package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
- package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
- package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
- package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
- package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
- package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
- package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
- package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
- package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
- package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/transactions.js +48 -23
- package/dist/adapters/mysql/tools/transactions.js.map +1 -1
- package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
- package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
- package/dist/adapters/mysql/types/proxysql-types.js +33 -1
- package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
- package/dist/adapters/mysql/types/router-types.d.ts +1 -1
- package/dist/adapters/mysql/types/router-types.js +1 -1
- package/dist/adapters/mysql/types/router-types.js.map +1 -1
- package/dist/adapters/mysql/types/shell-types.js +2 -2
- package/dist/adapters/mysql/types/shell-types.js.map +1 -1
- package/dist/adapters/mysql/types.d.ts +485 -21
- package/dist/adapters/mysql/types.d.ts.map +1 -1
- package/dist/adapters/mysql/types.js +546 -19
- package/dist/adapters/mysql/types.js.map +1 -1
- package/dist/auth/scopes.js +1 -1
- package/dist/auth/scopes.js.map +1 -1
- package/dist/codemode/api.d.ts +3 -2
- package/dist/codemode/api.d.ts.map +1 -1
- package/dist/codemode/api.js +80 -5
- package/dist/codemode/api.js.map +1 -1
- package/dist/codemode/sandbox-factory.js +1 -1
- package/dist/codemode/sandbox-factory.js.map +1 -1
- package/dist/codemode/types.d.ts +26 -0
- package/dist/codemode/types.d.ts.map +1 -1
- package/dist/codemode/types.js +2 -0
- package/dist/codemode/types.js.map +1 -1
- package/dist/codemode/worker-sandbox.d.ts +4 -2
- package/dist/codemode/worker-sandbox.d.ts.map +1 -1
- package/dist/codemode/worker-sandbox.js +66 -7
- package/dist/codemode/worker-sandbox.js.map +1 -1
- package/dist/codemode/worker-script.d.ts +3 -0
- package/dist/codemode/worker-script.d.ts.map +1 -1
- package/dist/codemode/worker-script.js +128 -75
- package/dist/codemode/worker-script.js.map +1 -1
- package/dist/constants/ServerInstructions.d.ts +1 -1
- package/dist/constants/ServerInstructions.d.ts.map +1 -1
- package/dist/constants/ServerInstructions.js +37 -31
- package/dist/constants/ServerInstructions.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +1 -1
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +1 -2
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/pool/ConnectionPool.d.ts.map +1 -1
- package/dist/pool/ConnectionPool.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +6 -0
- package/dist/transports/http.js.map +1 -1
- package/dist/utils/validators.d.ts +1 -1
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js.map +1 -1
- package/package.json +4 -4
- package/releases/v2.3.0-release-notes.md +20 -20
- package/releases/v2.3.1-release-notes.md +34 -0
- package/releases/v3.0.0-release-notes.md +81 -0
- package/src/__tests__/mocks/adapter.ts +3 -0
- package/src/__tests__/perf.test.ts +6 -6
- package/src/adapters/DatabaseAdapter.ts +58 -9
- package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
- package/src/adapters/mysql/MySQLAdapter.ts +17 -2
- package/src/adapters/mysql/SchemaManager.ts +21 -21
- package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
- package/src/adapters/mysql/prompts/index.ts +12 -22
- package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
- package/src/adapters/mysql/resources/docstore.ts +13 -10
- package/src/adapters/mysql/resources/events.ts +12 -12
- package/src/adapters/mysql/resources/indexes.ts +17 -19
- package/src/adapters/mysql/resources/innodb.ts +23 -22
- package/src/adapters/mysql/resources/locks.ts +9 -7
- package/src/adapters/mysql/resources/performance.ts +23 -18
- package/src/adapters/mysql/resources/spatial.ts +9 -7
- package/src/adapters/mysql/resources/sysschema.ts +12 -11
- package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
- package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
- package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
- package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
- package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
- package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
- package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
- package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
- package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
- package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
- package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
- package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
- package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
- package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
- package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
- package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
- package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
- package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
- package/src/adapters/mysql/tools/admin/backup.ts +193 -143
- package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
- package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
- package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
- package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
- package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
- package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
- package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
- package/src/adapters/mysql/tools/codemode/index.ts +5 -3
- package/src/adapters/mysql/tools/core.ts +152 -38
- package/src/adapters/mysql/tools/docstore.ts +422 -205
- package/src/adapters/mysql/tools/events.ts +334 -233
- package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
- package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
- package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
- package/src/adapters/mysql/tools/json/core.ts +21 -42
- package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
- package/src/adapters/mysql/tools/json/helpers.ts +21 -25
- package/src/adapters/mysql/tools/partitioning.ts +3 -0
- package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
- package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
- package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
- package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
- package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
- package/src/adapters/mysql/tools/proxysql.ts +314 -209
- package/src/adapters/mysql/tools/replication.ts +84 -57
- package/src/adapters/mysql/tools/roles.ts +274 -226
- package/src/adapters/mysql/tools/router.ts +181 -85
- package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
- package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
- package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
- package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
- package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
- package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
- package/src/adapters/mysql/tools/schema/management.ts +60 -15
- package/src/adapters/mysql/tools/schema/routines.ts +26 -4
- package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
- package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
- package/src/adapters/mysql/tools/schema/views.ts +46 -8
- package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
- package/src/adapters/mysql/tools/security/audit.ts +113 -39
- package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
- package/src/adapters/mysql/tools/security/encryption.ts +172 -139
- package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
- package/src/adapters/mysql/tools/shell/backup.ts +90 -73
- package/src/adapters/mysql/tools/shell/restore.ts +62 -48
- package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
- package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
- package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
- package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
- package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
- package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
- package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
- package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
- package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
- package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
- package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
- package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
- package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
- package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
- package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
- package/src/adapters/mysql/tools/transactions.ts +49 -24
- package/src/adapters/mysql/types/proxysql-types.ts +38 -1
- package/src/adapters/mysql/types/router-types.ts +1 -1
- package/src/adapters/mysql/types/shell-types.ts +2 -2
- package/src/adapters/mysql/types.ts +632 -19
- package/src/auth/__tests__/scopes.test.ts +2 -2
- package/src/auth/scopes.ts +1 -1
- package/src/codemode/__tests__/api.test.ts +417 -0
- package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
- package/src/codemode/__tests__/sandbox.test.ts +301 -0
- package/src/codemode/__tests__/security.test.ts +368 -0
- package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
- package/src/codemode/__tests__/worker-script.test.ts +226 -0
- package/src/codemode/api.ts +89 -5
- package/src/codemode/sandbox-factory.ts +1 -1
- package/src/codemode/types.ts +34 -0
- package/src/codemode/worker-sandbox.ts +74 -7
- package/src/codemode/worker-script.ts +157 -86
- package/src/constants/ServerInstructions.ts +37 -31
- package/src/filtering/ToolConstants.ts +1 -2
- package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
- package/src/pool/ConnectionPool.ts +4 -1
- package/src/transports/__tests__/http.test.ts +15 -3
- package/src/transports/http.ts +12 -0
- package/src/utils/validators.ts +2 -1
- package/vitest.config.ts +3 -1
- package/CODE_MODE.md +0 -245
|
@@ -300,7 +300,7 @@ export const DropTableSchemaBase = z.object({
|
|
|
300
300
|
ifExists: z
|
|
301
301
|
.boolean()
|
|
302
302
|
.optional()
|
|
303
|
-
.default(
|
|
303
|
+
.default(false)
|
|
304
304
|
.describe("Add IF EXISTS clause"),
|
|
305
305
|
});
|
|
306
306
|
// Transformed schema for handler parsing
|
|
@@ -364,6 +364,11 @@ export const GetIndexesSchema = z
|
|
|
364
364
|
// Transaction Schemas
|
|
365
365
|
// =============================================================================
|
|
366
366
|
// --- TransactionBegin ---
|
|
367
|
+
// Base schema for MCP visibility
|
|
368
|
+
export const TransactionBeginSchemaBase = z.object({
|
|
369
|
+
isolationLevel: z.string().optional().describe("Transaction isolation level"),
|
|
370
|
+
});
|
|
371
|
+
// Transformed schema for handler parsing
|
|
367
372
|
export const TransactionBeginSchema = z.preprocess(defaultToEmpty, z.object({
|
|
368
373
|
isolationLevel: z
|
|
369
374
|
.enum([
|
|
@@ -421,23 +426,27 @@ export const TransactionExecuteSchemaBase = z.object({
|
|
|
421
426
|
.optional()
|
|
422
427
|
.describe("SQL statements to execute atomically"),
|
|
423
428
|
queries: z.array(z.string()).optional().describe("Alias for statements"),
|
|
424
|
-
isolationLevel: z
|
|
425
|
-
.enum([
|
|
426
|
-
"READ UNCOMMITTED",
|
|
427
|
-
"READ COMMITTED",
|
|
428
|
-
"REPEATABLE READ",
|
|
429
|
-
"SERIALIZABLE",
|
|
430
|
-
])
|
|
431
|
-
.optional()
|
|
432
|
-
.describe("Transaction isolation level"),
|
|
429
|
+
isolationLevel: z.string().optional().describe("Transaction isolation level"),
|
|
433
430
|
});
|
|
434
|
-
// Transformed schema for handler parsing
|
|
435
431
|
export const TransactionExecuteSchema = z
|
|
436
432
|
.preprocess(preprocessTransactionExecuteParams, TransactionExecuteSchemaBase)
|
|
437
433
|
.transform((data) => ({
|
|
438
434
|
statements: data.statements ?? data.queries ?? [],
|
|
439
435
|
isolationLevel: data.isolationLevel,
|
|
440
|
-
}))
|
|
436
|
+
}))
|
|
437
|
+
.refine((data) => {
|
|
438
|
+
if (!data.isolationLevel)
|
|
439
|
+
return true;
|
|
440
|
+
const validLevels = [
|
|
441
|
+
"READ UNCOMMITTED",
|
|
442
|
+
"READ COMMITTED",
|
|
443
|
+
"REPEATABLE READ",
|
|
444
|
+
"SERIALIZABLE",
|
|
445
|
+
];
|
|
446
|
+
return validLevels.includes(data.isolationLevel);
|
|
447
|
+
}, {
|
|
448
|
+
message: "Invalid isolationLevel. Expected one of: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE",
|
|
449
|
+
});
|
|
441
450
|
// =============================================================================
|
|
442
451
|
// Preprocess: JSON/Text column params (table, column, where aliases)
|
|
443
452
|
// =============================================================================
|
|
@@ -635,6 +644,333 @@ export const JsonSearchSchema = z
|
|
|
635
644
|
.refine((data) => data.column !== "", {
|
|
636
645
|
message: "column (or col alias) is required",
|
|
637
646
|
});
|
|
647
|
+
// --- JsonInsert ---
|
|
648
|
+
export const JsonInsertSchemaBase = z.object({
|
|
649
|
+
table: z.string().optional().describe("Table name"),
|
|
650
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
651
|
+
name: z.string().optional().describe("Alias for table"),
|
|
652
|
+
column: z.string().optional().describe("JSON column name"),
|
|
653
|
+
col: z.string().optional().describe("Alias for column"),
|
|
654
|
+
path: z.string().describe("JSON path to insert at"),
|
|
655
|
+
value: z.unknown().describe("Value to insert"),
|
|
656
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
657
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
658
|
+
});
|
|
659
|
+
export const JsonInsertSchema = z
|
|
660
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
661
|
+
table: z.string().optional(),
|
|
662
|
+
tableName: z.string().optional(),
|
|
663
|
+
name: z.string().optional(),
|
|
664
|
+
column: z.string().optional(),
|
|
665
|
+
col: z.string().optional(),
|
|
666
|
+
path: z.string(),
|
|
667
|
+
value: z.unknown(),
|
|
668
|
+
where: z.string().optional(),
|
|
669
|
+
filter: z.string().optional(),
|
|
670
|
+
}))
|
|
671
|
+
.transform((data) => ({
|
|
672
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
673
|
+
column: data.column ?? data.col ?? "",
|
|
674
|
+
path: data.path,
|
|
675
|
+
value: data.value,
|
|
676
|
+
where: data.where ?? data.filter ?? "",
|
|
677
|
+
}))
|
|
678
|
+
.refine((data) => data.table !== "", {
|
|
679
|
+
message: "table (or tableName/name alias) is required",
|
|
680
|
+
})
|
|
681
|
+
.refine((data) => data.column !== "", {
|
|
682
|
+
message: "column (or col alias) is required",
|
|
683
|
+
})
|
|
684
|
+
.refine((data) => data.where !== "", {
|
|
685
|
+
message: "where (or filter alias) is required",
|
|
686
|
+
});
|
|
687
|
+
// --- JsonReplace ---
|
|
688
|
+
export const JsonReplaceSchemaBase = z.object({
|
|
689
|
+
table: z.string().optional().describe("Table name"),
|
|
690
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
691
|
+
name: z.string().optional().describe("Alias for table"),
|
|
692
|
+
column: z.string().optional().describe("JSON column name"),
|
|
693
|
+
col: z.string().optional().describe("Alias for column"),
|
|
694
|
+
path: z.string().describe("JSON path to replace"),
|
|
695
|
+
value: z.unknown().describe("Replacement value"),
|
|
696
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
697
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
698
|
+
});
|
|
699
|
+
export const JsonReplaceSchema = z
|
|
700
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
701
|
+
table: z.string().optional(),
|
|
702
|
+
tableName: z.string().optional(),
|
|
703
|
+
name: z.string().optional(),
|
|
704
|
+
column: z.string().optional(),
|
|
705
|
+
col: z.string().optional(),
|
|
706
|
+
path: z.string(),
|
|
707
|
+
value: z.unknown(),
|
|
708
|
+
where: z.string().optional(),
|
|
709
|
+
filter: z.string().optional(),
|
|
710
|
+
}))
|
|
711
|
+
.transform((data) => ({
|
|
712
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
713
|
+
column: data.column ?? data.col ?? "",
|
|
714
|
+
path: data.path,
|
|
715
|
+
value: data.value,
|
|
716
|
+
where: data.where ?? data.filter ?? "",
|
|
717
|
+
}))
|
|
718
|
+
.refine((data) => data.table !== "", {
|
|
719
|
+
message: "table (or tableName/name alias) is required",
|
|
720
|
+
})
|
|
721
|
+
.refine((data) => data.column !== "", {
|
|
722
|
+
message: "column (or col alias) is required",
|
|
723
|
+
})
|
|
724
|
+
.refine((data) => data.where !== "", {
|
|
725
|
+
message: "where (or filter alias) is required",
|
|
726
|
+
});
|
|
727
|
+
// --- JsonRemove ---
|
|
728
|
+
export const JsonRemoveSchemaBase = z.object({
|
|
729
|
+
table: z.string().optional().describe("Table name"),
|
|
730
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
731
|
+
name: z.string().optional().describe("Alias for table"),
|
|
732
|
+
column: z.string().optional().describe("JSON column name"),
|
|
733
|
+
col: z.string().optional().describe("Alias for column"),
|
|
734
|
+
paths: z.array(z.string()).describe("JSON paths to remove"),
|
|
735
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
736
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
737
|
+
});
|
|
738
|
+
export const JsonRemoveSchema = z
|
|
739
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
740
|
+
table: z.string().optional(),
|
|
741
|
+
tableName: z.string().optional(),
|
|
742
|
+
name: z.string().optional(),
|
|
743
|
+
column: z.string().optional(),
|
|
744
|
+
col: z.string().optional(),
|
|
745
|
+
paths: z.array(z.string()),
|
|
746
|
+
where: z.string().optional(),
|
|
747
|
+
filter: z.string().optional(),
|
|
748
|
+
}))
|
|
749
|
+
.transform((data) => ({
|
|
750
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
751
|
+
column: data.column ?? data.col ?? "",
|
|
752
|
+
paths: data.paths,
|
|
753
|
+
where: data.where ?? data.filter ?? "",
|
|
754
|
+
}))
|
|
755
|
+
.refine((data) => data.table !== "", {
|
|
756
|
+
message: "table (or tableName/name alias) is required",
|
|
757
|
+
})
|
|
758
|
+
.refine((data) => data.column !== "", {
|
|
759
|
+
message: "column (or col alias) is required",
|
|
760
|
+
})
|
|
761
|
+
.refine((data) => data.where !== "", {
|
|
762
|
+
message: "where (or filter alias) is required",
|
|
763
|
+
});
|
|
764
|
+
// --- JsonArrayAppend ---
|
|
765
|
+
export const JsonArrayAppendSchemaBase = z.object({
|
|
766
|
+
table: z.string().optional().describe("Table name"),
|
|
767
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
768
|
+
name: z.string().optional().describe("Alias for table"),
|
|
769
|
+
column: z.string().optional().describe("JSON column name"),
|
|
770
|
+
col: z.string().optional().describe("Alias for column"),
|
|
771
|
+
path: z.string().describe("JSON path to array"),
|
|
772
|
+
value: z.unknown().describe("Value to append"),
|
|
773
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
774
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
775
|
+
});
|
|
776
|
+
export const JsonArrayAppendSchema = z
|
|
777
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
778
|
+
table: z.string().optional(),
|
|
779
|
+
tableName: z.string().optional(),
|
|
780
|
+
name: z.string().optional(),
|
|
781
|
+
column: z.string().optional(),
|
|
782
|
+
col: z.string().optional(),
|
|
783
|
+
path: z.string(),
|
|
784
|
+
value: z.unknown(),
|
|
785
|
+
where: z.string().optional(),
|
|
786
|
+
filter: z.string().optional(),
|
|
787
|
+
}))
|
|
788
|
+
.transform((data) => ({
|
|
789
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
790
|
+
column: data.column ?? data.col ?? "",
|
|
791
|
+
path: data.path,
|
|
792
|
+
value: data.value,
|
|
793
|
+
where: data.where ?? data.filter ?? "",
|
|
794
|
+
}))
|
|
795
|
+
.refine((data) => data.table !== "", {
|
|
796
|
+
message: "table (or tableName/name alias) is required",
|
|
797
|
+
})
|
|
798
|
+
.refine((data) => data.column !== "", {
|
|
799
|
+
message: "column (or col alias) is required",
|
|
800
|
+
})
|
|
801
|
+
.refine((data) => data.where !== "", {
|
|
802
|
+
message: "where (or filter alias) is required",
|
|
803
|
+
});
|
|
804
|
+
// --- JsonGet ---
|
|
805
|
+
export const JsonGetSchemaBase = z.object({
|
|
806
|
+
table: z.string().optional().describe("Table name"),
|
|
807
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
808
|
+
name: z.string().optional().describe("Alias for table"),
|
|
809
|
+
column: z.string().optional().describe("JSON column name"),
|
|
810
|
+
col: z.string().optional().describe("Alias for column"),
|
|
811
|
+
path: z.string().describe("JSON path to extract"),
|
|
812
|
+
id: z.union([z.string(), z.number()]).describe("Row ID"),
|
|
813
|
+
idColumn: z.string().default("id").describe("ID column name"),
|
|
814
|
+
});
|
|
815
|
+
export const JsonGetSchema = z
|
|
816
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
817
|
+
table: z.string().optional(),
|
|
818
|
+
tableName: z.string().optional(),
|
|
819
|
+
name: z.string().optional(),
|
|
820
|
+
column: z.string().optional(),
|
|
821
|
+
col: z.string().optional(),
|
|
822
|
+
path: z.string(),
|
|
823
|
+
id: z.union([z.string(), z.number()]),
|
|
824
|
+
idColumn: z.string().default("id"),
|
|
825
|
+
}))
|
|
826
|
+
.transform((data) => ({
|
|
827
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
828
|
+
column: data.column ?? data.col ?? "",
|
|
829
|
+
path: data.path,
|
|
830
|
+
id: data.id,
|
|
831
|
+
idColumn: data.idColumn,
|
|
832
|
+
}))
|
|
833
|
+
.refine((data) => data.table !== "", {
|
|
834
|
+
message: "table (or tableName/name alias) is required",
|
|
835
|
+
})
|
|
836
|
+
.refine((data) => data.column !== "", {
|
|
837
|
+
message: "column (or col alias) is required",
|
|
838
|
+
});
|
|
839
|
+
// --- JsonUpdate ---
|
|
840
|
+
export const JsonUpdateSchemaBase = z.object({
|
|
841
|
+
table: z.string().optional().describe("Table name"),
|
|
842
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
843
|
+
name: z.string().optional().describe("Alias for table"),
|
|
844
|
+
column: z.string().optional().describe("JSON column name"),
|
|
845
|
+
col: z.string().optional().describe("Alias for column"),
|
|
846
|
+
path: z.string().describe("JSON path to update"),
|
|
847
|
+
value: z.unknown().describe("New value"),
|
|
848
|
+
id: z.union([z.string(), z.number()]).describe("Row ID"),
|
|
849
|
+
idColumn: z.string().default("id").describe("ID column name"),
|
|
850
|
+
});
|
|
851
|
+
export const JsonUpdateSchema = z
|
|
852
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
853
|
+
table: z.string().optional(),
|
|
854
|
+
tableName: z.string().optional(),
|
|
855
|
+
name: z.string().optional(),
|
|
856
|
+
column: z.string().optional(),
|
|
857
|
+
col: z.string().optional(),
|
|
858
|
+
path: z.string(),
|
|
859
|
+
value: z.unknown(),
|
|
860
|
+
id: z.union([z.string(), z.number()]),
|
|
861
|
+
idColumn: z.string().default("id"),
|
|
862
|
+
}))
|
|
863
|
+
.transform((data) => ({
|
|
864
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
865
|
+
column: data.column ?? data.col ?? "",
|
|
866
|
+
path: data.path,
|
|
867
|
+
value: data.value,
|
|
868
|
+
id: data.id,
|
|
869
|
+
idColumn: data.idColumn,
|
|
870
|
+
}))
|
|
871
|
+
.refine((data) => data.table !== "", {
|
|
872
|
+
message: "table (or tableName/name alias) is required",
|
|
873
|
+
})
|
|
874
|
+
.refine((data) => data.column !== "", {
|
|
875
|
+
message: "column (or col alias) is required",
|
|
876
|
+
});
|
|
877
|
+
// --- JsonNormalize ---
|
|
878
|
+
export const JsonNormalizeSchemaBase = z.object({
|
|
879
|
+
table: z.string().optional().describe("Table name"),
|
|
880
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
881
|
+
name: z.string().optional().describe("Alias for table"),
|
|
882
|
+
column: z.string().optional().describe("JSON column name"),
|
|
883
|
+
col: z.string().optional().describe("Alias for column"),
|
|
884
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
885
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
886
|
+
limit: z.number().default(100).describe("Maximum rows to process"),
|
|
887
|
+
});
|
|
888
|
+
export const JsonNormalizeSchema = z
|
|
889
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
890
|
+
table: z.string().optional(),
|
|
891
|
+
tableName: z.string().optional(),
|
|
892
|
+
name: z.string().optional(),
|
|
893
|
+
column: z.string().optional(),
|
|
894
|
+
col: z.string().optional(),
|
|
895
|
+
where: z.string().optional(),
|
|
896
|
+
filter: z.string().optional(),
|
|
897
|
+
limit: z.number().default(100),
|
|
898
|
+
}))
|
|
899
|
+
.transform((data) => ({
|
|
900
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
901
|
+
column: data.column ?? data.col ?? "",
|
|
902
|
+
where: data.where ?? data.filter,
|
|
903
|
+
limit: data.limit,
|
|
904
|
+
}))
|
|
905
|
+
.refine((data) => data.table !== "", {
|
|
906
|
+
message: "table (or tableName/name alias) is required",
|
|
907
|
+
})
|
|
908
|
+
.refine((data) => data.column !== "", {
|
|
909
|
+
message: "column (or col alias) is required",
|
|
910
|
+
});
|
|
911
|
+
// --- JsonStats ---
|
|
912
|
+
export const JsonStatsSchemaBase = z.object({
|
|
913
|
+
table: z.string().optional().describe("Table name"),
|
|
914
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
915
|
+
name: z.string().optional().describe("Alias for table"),
|
|
916
|
+
column: z.string().optional().describe("JSON column name"),
|
|
917
|
+
col: z.string().optional().describe("Alias for column"),
|
|
918
|
+
where: z.string().optional().describe("Optional WHERE clause"),
|
|
919
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
920
|
+
sampleSize: z.number().default(1000).describe("Sample size for statistics"),
|
|
921
|
+
});
|
|
922
|
+
export const JsonStatsSchema = z
|
|
923
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
924
|
+
table: z.string().optional(),
|
|
925
|
+
tableName: z.string().optional(),
|
|
926
|
+
name: z.string().optional(),
|
|
927
|
+
column: z.string().optional(),
|
|
928
|
+
col: z.string().optional(),
|
|
929
|
+
where: z.string().optional(),
|
|
930
|
+
filter: z.string().optional(),
|
|
931
|
+
sampleSize: z.number().default(1000),
|
|
932
|
+
}))
|
|
933
|
+
.transform((data) => ({
|
|
934
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
935
|
+
column: data.column ?? data.col ?? "",
|
|
936
|
+
where: data.where ?? data.filter,
|
|
937
|
+
sampleSize: data.sampleSize,
|
|
938
|
+
}))
|
|
939
|
+
.refine((data) => data.table !== "", {
|
|
940
|
+
message: "table (or tableName/name alias) is required",
|
|
941
|
+
})
|
|
942
|
+
.refine((data) => data.column !== "", {
|
|
943
|
+
message: "column (or col alias) is required",
|
|
944
|
+
});
|
|
945
|
+
// --- JsonIndexSuggest ---
|
|
946
|
+
export const JsonIndexSuggestSchemaBase = z.object({
|
|
947
|
+
table: z.string().optional().describe("Table name"),
|
|
948
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
949
|
+
name: z.string().optional().describe("Alias for table"),
|
|
950
|
+
column: z.string().optional().describe("JSON column name"),
|
|
951
|
+
col: z.string().optional().describe("Alias for column"),
|
|
952
|
+
sampleSize: z.number().default(100).describe("Sample size to analyze"),
|
|
953
|
+
});
|
|
954
|
+
export const JsonIndexSuggestSchema = z
|
|
955
|
+
.preprocess(preprocessJsonColumnParams, z.object({
|
|
956
|
+
table: z.string().optional(),
|
|
957
|
+
tableName: z.string().optional(),
|
|
958
|
+
name: z.string().optional(),
|
|
959
|
+
column: z.string().optional(),
|
|
960
|
+
col: z.string().optional(),
|
|
961
|
+
sampleSize: z.number().default(100),
|
|
962
|
+
}))
|
|
963
|
+
.transform((data) => ({
|
|
964
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
965
|
+
column: data.column ?? data.col ?? "",
|
|
966
|
+
sampleSize: data.sampleSize,
|
|
967
|
+
}))
|
|
968
|
+
.refine((data) => data.table !== "", {
|
|
969
|
+
message: "table (or tableName/name alias) is required",
|
|
970
|
+
})
|
|
971
|
+
.refine((data) => data.column !== "", {
|
|
972
|
+
message: "column (or col alias) is required",
|
|
973
|
+
});
|
|
638
974
|
// --- JsonValidate (no table/column — no aliases needed) ---
|
|
639
975
|
export const JsonValidateSchema = z.object({
|
|
640
976
|
value: z.string().describe("JSON string to validate"),
|
|
@@ -951,6 +1287,100 @@ export const FulltextSearchSchema = z
|
|
|
951
1287
|
.refine((data) => data.query !== "", {
|
|
952
1288
|
message: "query (or sql alias) is required",
|
|
953
1289
|
});
|
|
1290
|
+
// --- FulltextDrop ---
|
|
1291
|
+
export const FulltextDropSchemaBase = z.object({
|
|
1292
|
+
table: z.string().optional().describe("Table containing the index"),
|
|
1293
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1294
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1295
|
+
indexName: z
|
|
1296
|
+
.string()
|
|
1297
|
+
.optional()
|
|
1298
|
+
.describe("Name of the FULLTEXT index to drop"),
|
|
1299
|
+
});
|
|
1300
|
+
export const FulltextDropSchema = z
|
|
1301
|
+
.preprocess(preprocessTableParams, z.object({
|
|
1302
|
+
table: z.string().optional(),
|
|
1303
|
+
tableName: z.string().optional(),
|
|
1304
|
+
name: z.string().optional(),
|
|
1305
|
+
indexName: z.string().optional(),
|
|
1306
|
+
}))
|
|
1307
|
+
.transform((data) => ({
|
|
1308
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1309
|
+
indexName: data.indexName ?? "",
|
|
1310
|
+
}))
|
|
1311
|
+
.refine((data) => data.table !== "", {
|
|
1312
|
+
message: "table (or tableName/name alias) is required",
|
|
1313
|
+
})
|
|
1314
|
+
.refine((data) => data.indexName !== "", {
|
|
1315
|
+
message: "indexName is required",
|
|
1316
|
+
});
|
|
1317
|
+
// --- FulltextBoolean ---
|
|
1318
|
+
export const FulltextBooleanSchemaBase = z.object({
|
|
1319
|
+
table: z.string().optional().describe("Table name"),
|
|
1320
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1321
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1322
|
+
columns: z.array(z.string()).optional().describe("Columns to search"),
|
|
1323
|
+
query: z
|
|
1324
|
+
.string()
|
|
1325
|
+
.optional()
|
|
1326
|
+
.describe("Boolean search query with +, -, *, etc."),
|
|
1327
|
+
maxLength: z
|
|
1328
|
+
.number()
|
|
1329
|
+
.optional()
|
|
1330
|
+
.describe("Optional max characters per text column in results. Truncates with '...' if exceeded."),
|
|
1331
|
+
});
|
|
1332
|
+
export const FulltextBooleanSchema = z
|
|
1333
|
+
.preprocess(preprocessTableParams, z.object({
|
|
1334
|
+
table: z.string().optional(),
|
|
1335
|
+
tableName: z.string().optional(),
|
|
1336
|
+
name: z.string().optional(),
|
|
1337
|
+
columns: z.array(z.string()).optional(),
|
|
1338
|
+
query: z.string().optional(),
|
|
1339
|
+
maxLength: z.number().optional(),
|
|
1340
|
+
}))
|
|
1341
|
+
.transform((data) => ({
|
|
1342
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1343
|
+
columns: data.columns ?? [],
|
|
1344
|
+
query: data.query ?? "",
|
|
1345
|
+
maxLength: data.maxLength,
|
|
1346
|
+
}))
|
|
1347
|
+
.refine((data) => data.table !== "", {
|
|
1348
|
+
message: "table (or tableName/name alias) is required",
|
|
1349
|
+
})
|
|
1350
|
+
.refine((data) => data.columns.length > 0, { message: "columns is required" })
|
|
1351
|
+
.refine((data) => data.query !== "", { message: "query is required" });
|
|
1352
|
+
// --- FulltextExpand ---
|
|
1353
|
+
export const FulltextExpandSchemaBase = z.object({
|
|
1354
|
+
table: z.string().optional().describe("Table name"),
|
|
1355
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1356
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1357
|
+
columns: z.array(z.string()).optional().describe("Columns to search"),
|
|
1358
|
+
query: z.string().optional().describe("Search query to expand"),
|
|
1359
|
+
maxLength: z
|
|
1360
|
+
.number()
|
|
1361
|
+
.optional()
|
|
1362
|
+
.describe("Optional max characters per text column in results. Truncates with '...' if exceeded."),
|
|
1363
|
+
});
|
|
1364
|
+
export const FulltextExpandSchema = z
|
|
1365
|
+
.preprocess(preprocessTableParams, z.object({
|
|
1366
|
+
table: z.string().optional(),
|
|
1367
|
+
tableName: z.string().optional(),
|
|
1368
|
+
name: z.string().optional(),
|
|
1369
|
+
columns: z.array(z.string()).optional(),
|
|
1370
|
+
query: z.string().optional(),
|
|
1371
|
+
maxLength: z.number().optional(),
|
|
1372
|
+
}))
|
|
1373
|
+
.transform((data) => ({
|
|
1374
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1375
|
+
columns: data.columns ?? [],
|
|
1376
|
+
query: data.query ?? "",
|
|
1377
|
+
maxLength: data.maxLength,
|
|
1378
|
+
}))
|
|
1379
|
+
.refine((data) => data.table !== "", {
|
|
1380
|
+
message: "table (or tableName/name alias) is required",
|
|
1381
|
+
})
|
|
1382
|
+
.refine((data) => data.columns.length > 0, { message: "columns is required" })
|
|
1383
|
+
.refine((data) => data.query !== "", { message: "query is required" });
|
|
954
1384
|
// =============================================================================
|
|
955
1385
|
// Performance Schemas
|
|
956
1386
|
// =============================================================================
|
|
@@ -1012,6 +1442,19 @@ export const SlowQuerySchema = z.object({
|
|
|
1012
1442
|
.describe("Number of slow queries to return"),
|
|
1013
1443
|
minTime: z.number().optional().describe("Minimum query time in seconds"),
|
|
1014
1444
|
});
|
|
1445
|
+
// --- QueryStats (no table/query aliases — simple passthrough) ---
|
|
1446
|
+
export const QueryStatsSchema = z.object({
|
|
1447
|
+
orderBy: z
|
|
1448
|
+
.enum(["total_time", "avg_time", "executions"])
|
|
1449
|
+
.optional()
|
|
1450
|
+
.default("total_time")
|
|
1451
|
+
.describe("Order results by metric"),
|
|
1452
|
+
limit: z
|
|
1453
|
+
.number()
|
|
1454
|
+
.optional()
|
|
1455
|
+
.default(10)
|
|
1456
|
+
.describe("Maximum number of queries to return"),
|
|
1457
|
+
});
|
|
1015
1458
|
// --- IndexUsage ---
|
|
1016
1459
|
export const IndexUsageSchemaBase = z.object({
|
|
1017
1460
|
table: z.string().optional().describe("Filter by table name"),
|
|
@@ -1054,6 +1497,42 @@ export const TableStatsSchema = z
|
|
|
1054
1497
|
.refine((data) => data.table !== "", {
|
|
1055
1498
|
message: "table (or tableName/name alias) is required",
|
|
1056
1499
|
});
|
|
1500
|
+
// --- IndexRecommendation ---
|
|
1501
|
+
// Base schema for MCP visibility
|
|
1502
|
+
export const IndexRecommendationSchemaBase = z.object({
|
|
1503
|
+
table: z.string().optional().describe("Table to analyze for missing indexes"),
|
|
1504
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1505
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1506
|
+
});
|
|
1507
|
+
// Transformed schema for handler parsing
|
|
1508
|
+
export const IndexRecommendationSchema = z
|
|
1509
|
+
.preprocess(preprocessTableParams, IndexRecommendationSchemaBase)
|
|
1510
|
+
.transform((data) => ({
|
|
1511
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1512
|
+
}))
|
|
1513
|
+
.refine((data) => data.table !== "", {
|
|
1514
|
+
message: "table (or tableName/name alias) is required",
|
|
1515
|
+
});
|
|
1516
|
+
// --- ForceIndex ---
|
|
1517
|
+
// Base schema for MCP visibility
|
|
1518
|
+
export const ForceIndexSchemaBase = z.object({
|
|
1519
|
+
table: z.string().optional().describe("Table name"),
|
|
1520
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1521
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1522
|
+
query: z.string().describe("Original query"),
|
|
1523
|
+
indexName: z.string().describe("Index name to force"),
|
|
1524
|
+
});
|
|
1525
|
+
// Transformed schema for handler parsing
|
|
1526
|
+
export const ForceIndexSchema = z
|
|
1527
|
+
.preprocess(preprocessTableParams, ForceIndexSchemaBase)
|
|
1528
|
+
.transform((data) => ({
|
|
1529
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1530
|
+
query: data.query,
|
|
1531
|
+
indexName: data.indexName,
|
|
1532
|
+
}))
|
|
1533
|
+
.refine((data) => data.table !== "", {
|
|
1534
|
+
message: "table (or tableName/name alias) is required",
|
|
1535
|
+
});
|
|
1057
1536
|
// =============================================================================
|
|
1058
1537
|
// Preprocess: Admin table params (normalizes singular 'table' to 'tables' array)
|
|
1059
1538
|
// =============================================================================
|
|
@@ -1123,10 +1602,7 @@ export const CheckTableSchemaBase = z.object({
|
|
|
1123
1602
|
table: z.string().optional().describe("Single table name (alias for tables)"),
|
|
1124
1603
|
tableName: z.string().optional().describe("Alias for table"),
|
|
1125
1604
|
name: z.string().optional().describe("Alias for table"),
|
|
1126
|
-
option: z
|
|
1127
|
-
.enum(["QUICK", "FAST", "MEDIUM", "EXTENDED", "CHANGED"])
|
|
1128
|
-
.optional()
|
|
1129
|
-
.describe("Check option"),
|
|
1605
|
+
option: z.string().optional().describe("Check option"),
|
|
1130
1606
|
});
|
|
1131
1607
|
export const CheckTableSchema = z
|
|
1132
1608
|
.preprocess(preprocessAdminTableParams, z.object({
|
|
@@ -1145,6 +1621,33 @@ export const CheckTableSchema = z
|
|
|
1145
1621
|
.refine((data) => data.tables.length > 0, {
|
|
1146
1622
|
message: "tables (or table/tableName/name alias) is required",
|
|
1147
1623
|
});
|
|
1624
|
+
// --- RepairTable ---
|
|
1625
|
+
export const RepairTableSchemaBase = z.object({
|
|
1626
|
+
tables: z.array(z.string()).optional().describe("Table names to repair"),
|
|
1627
|
+
table: z.string().optional().describe("Single table name (alias for tables)"),
|
|
1628
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1629
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1630
|
+
quick: z
|
|
1631
|
+
.boolean()
|
|
1632
|
+
.optional()
|
|
1633
|
+
.default(false)
|
|
1634
|
+
.describe("Quick repair (MyISAM only)"),
|
|
1635
|
+
});
|
|
1636
|
+
export const RepairTableSchema = z
|
|
1637
|
+
.preprocess(preprocessAdminTableParams, z.object({
|
|
1638
|
+
tables: z.array(z.string()).optional(),
|
|
1639
|
+
table: z.string().optional(),
|
|
1640
|
+
tableName: z.string().optional(),
|
|
1641
|
+
name: z.string().optional(),
|
|
1642
|
+
quick: z.boolean().optional().default(false),
|
|
1643
|
+
}))
|
|
1644
|
+
.transform((data) => ({
|
|
1645
|
+
tables: data.tables ?? [],
|
|
1646
|
+
quick: data.quick,
|
|
1647
|
+
}))
|
|
1648
|
+
.refine((data) => data.tables.length > 0, {
|
|
1649
|
+
message: "tables (or table/tableName/name alias) is required",
|
|
1650
|
+
});
|
|
1148
1651
|
// --- FlushTables ---
|
|
1149
1652
|
export const FlushTablesSchemaBase = z.object({
|
|
1150
1653
|
tables: z
|
|
@@ -1165,6 +1668,14 @@ export const FlushTablesSchema = z
|
|
|
1165
1668
|
.transform((data) => ({
|
|
1166
1669
|
tables: data.tables,
|
|
1167
1670
|
}));
|
|
1671
|
+
export const KillQuerySchemaBase = z.object({
|
|
1672
|
+
processId: z.number().describe("Process ID to kill"),
|
|
1673
|
+
connection: z
|
|
1674
|
+
.boolean()
|
|
1675
|
+
.optional()
|
|
1676
|
+
.default(false)
|
|
1677
|
+
.describe("Kill connection instead of query"),
|
|
1678
|
+
});
|
|
1168
1679
|
export const KillQuerySchema = z.object({
|
|
1169
1680
|
processId: z.number().describe("Process ID to kill"),
|
|
1170
1681
|
connection: z
|
|
@@ -1182,7 +1693,6 @@ export const ShowStatusSchema = z.object({
|
|
|
1182
1693
|
limit: z
|
|
1183
1694
|
.number()
|
|
1184
1695
|
.int()
|
|
1185
|
-
.positive()
|
|
1186
1696
|
.optional()
|
|
1187
1697
|
.describe("Maximum number of variables to return (default: 100). Set higher to see all."),
|
|
1188
1698
|
});
|
|
@@ -1196,7 +1706,6 @@ export const ShowVariablesSchema = z.object({
|
|
|
1196
1706
|
limit: z
|
|
1197
1707
|
.number()
|
|
1198
1708
|
.int()
|
|
1199
|
-
.positive()
|
|
1200
1709
|
.optional()
|
|
1201
1710
|
.describe("Maximum number of variables to return (default: 100). Set higher to see all."),
|
|
1202
1711
|
});
|
|
@@ -1218,10 +1727,16 @@ export const ExportTableSchemaBase = z.object({
|
|
|
1218
1727
|
limit: z
|
|
1219
1728
|
.number()
|
|
1220
1729
|
.int()
|
|
1221
|
-
.positive()
|
|
1222
1730
|
.optional()
|
|
1223
1731
|
.default(100)
|
|
1224
1732
|
.describe("Maximum number of rows to export (default: 100). Set higher to export more rows."),
|
|
1733
|
+
batch: z
|
|
1734
|
+
.number()
|
|
1735
|
+
.int()
|
|
1736
|
+
.positive()
|
|
1737
|
+
.optional()
|
|
1738
|
+
.default(1)
|
|
1739
|
+
.describe("Rows per INSERT statement (default: 1). Higher values produce multi-row INSERT ... VALUES (...), (...) for smaller payloads."),
|
|
1225
1740
|
});
|
|
1226
1741
|
export const ExportTableSchema = z
|
|
1227
1742
|
.preprocess(preprocessTableParams, z.object({
|
|
@@ -1232,12 +1747,14 @@ export const ExportTableSchema = z
|
|
|
1232
1747
|
where: z.string().optional(),
|
|
1233
1748
|
filter: z.string().optional(),
|
|
1234
1749
|
limit: z.number().int().positive().optional().default(100),
|
|
1750
|
+
batch: z.number().int().positive().optional().default(1),
|
|
1235
1751
|
}))
|
|
1236
1752
|
.transform((data) => ({
|
|
1237
1753
|
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1238
1754
|
format: data.format,
|
|
1239
1755
|
where: data.where ?? data.filter,
|
|
1240
1756
|
limit: data.limit,
|
|
1757
|
+
batch: data.batch,
|
|
1241
1758
|
}))
|
|
1242
1759
|
.refine((data) => data.table !== "", {
|
|
1243
1760
|
message: "table (or tableName/name alias) is required",
|
|
@@ -1268,11 +1785,21 @@ export const ImportDataSchema = z
|
|
|
1268
1785
|
// =============================================================================
|
|
1269
1786
|
// Replication Schemas
|
|
1270
1787
|
// =============================================================================
|
|
1788
|
+
export const BinlogEventsSchemaBase = z.object({
|
|
1789
|
+
logFile: z.string().optional().describe("Binlog file name"),
|
|
1790
|
+
position: z.number().optional().describe("Starting position"),
|
|
1791
|
+
limit: z
|
|
1792
|
+
.number()
|
|
1793
|
+
.optional()
|
|
1794
|
+
.default(20)
|
|
1795
|
+
.describe("Maximum events to return (default: 20). Set higher for more events."),
|
|
1796
|
+
});
|
|
1271
1797
|
export const BinlogEventsSchema = z.object({
|
|
1272
1798
|
logFile: z.string().optional().describe("Binlog file name"),
|
|
1273
1799
|
position: z.number().optional().describe("Starting position"),
|
|
1274
1800
|
limit: z
|
|
1275
1801
|
.number()
|
|
1802
|
+
.nonnegative()
|
|
1276
1803
|
.optional()
|
|
1277
1804
|
.default(20)
|
|
1278
1805
|
.describe("Maximum events to return (default: 20). Set higher for more events."),
|