@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
|
@@ -2,25 +2,41 @@
|
|
|
2
2
|
* ProxySQL Management Tools
|
|
3
3
|
*
|
|
4
4
|
* Tools for monitoring and managing ProxySQL via its MySQL-protocol admin interface.
|
|
5
|
-
*
|
|
5
|
+
* 11 tools total.
|
|
6
6
|
*
|
|
7
7
|
* ProxySQL admin interface documentation:
|
|
8
8
|
* https://proxysql.com/documentation/ProxySQL-Admin-Interface/
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import mysql from "mysql2/promise";
|
|
12
|
+
import { ZodError } from "zod";
|
|
12
13
|
import type { ToolDefinition, RequestContext } from "../../../types/index.js";
|
|
13
14
|
import type { MySQLAdapter } from "../MySQLAdapter.js";
|
|
14
15
|
import {
|
|
15
16
|
ProxySQLBaseInputSchema,
|
|
16
17
|
ProxySQLStatusInputSchema,
|
|
17
18
|
ProxySQLLimitInputSchema,
|
|
19
|
+
ProxySQLLimitInputSchemaBase,
|
|
18
20
|
ProxySQLHostgroupInputSchema,
|
|
21
|
+
ProxySQLHostgroupInputSchemaBase,
|
|
19
22
|
ProxySQLVariableFilterSchema,
|
|
23
|
+
ProxySQLVariableFilterSchemaBase,
|
|
20
24
|
ProxySQLCommandInputSchema,
|
|
21
25
|
type ProxySQLConfig,
|
|
22
26
|
} from "../types/proxysql-types.js";
|
|
23
27
|
|
|
28
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
29
|
+
function formatZodError(error: ZodError): string {
|
|
30
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Safe character set for LIKE patterns.
|
|
35
|
+
* Allows alphanumeric, underscore, dash, dot, percent (%), and space.
|
|
36
|
+
* Rejects SQL injection characters like single quotes, semicolons, parentheses, etc.
|
|
37
|
+
*/
|
|
38
|
+
const LIKE_SAFE_RE = /^[a-zA-Z0-9_%\-. *]+$/;
|
|
39
|
+
|
|
24
40
|
// =============================================================================
|
|
25
41
|
// ProxySQL Connection Helper
|
|
26
42
|
// =============================================================================
|
|
@@ -98,7 +114,6 @@ export function getProxySQLTools(_adapter: MySQLAdapter): ToolDefinition[] {
|
|
|
98
114
|
return [
|
|
99
115
|
createProxySQLStatusTool(),
|
|
100
116
|
createProxySQLServersTool(),
|
|
101
|
-
createProxySQLHostgroupsTool(),
|
|
102
117
|
createProxySQLQueryRulesTool(),
|
|
103
118
|
createProxySQLQueryDigestTool(),
|
|
104
119
|
createProxySQLConnectionPoolTool(),
|
|
@@ -133,42 +148,52 @@ function createProxySQLStatusTool(): ToolDefinition {
|
|
|
133
148
|
openWorldHint: true,
|
|
134
149
|
},
|
|
135
150
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
151
|
+
try {
|
|
152
|
+
const { summary } = ProxySQLStatusInputSchema.parse(params);
|
|
153
|
+
const rows = await proxySQLQuery("SELECT * FROM stats_mysql_global");
|
|
154
|
+
|
|
155
|
+
if (summary) {
|
|
156
|
+
// Key metrics for summary mode
|
|
157
|
+
const keyMetrics = [
|
|
158
|
+
"ProxySQL_Uptime",
|
|
159
|
+
"Questions",
|
|
160
|
+
"Slow_queries",
|
|
161
|
+
"Active_Transactions",
|
|
162
|
+
"Client_Connections_connected",
|
|
163
|
+
"Client_Connections_created",
|
|
164
|
+
"Server_Connections_connected",
|
|
165
|
+
"Server_Connections_created",
|
|
166
|
+
"Query_Cache_Entries",
|
|
167
|
+
"Query_Cache_Memory_bytes",
|
|
168
|
+
"mysql_backend_buffers_bytes",
|
|
169
|
+
"mysql_frontend_buffers_bytes",
|
|
170
|
+
];
|
|
171
|
+
const filteredRows = rows.filter((row) =>
|
|
172
|
+
keyMetrics.includes(row["Variable_Name"] as string),
|
|
173
|
+
);
|
|
174
|
+
return {
|
|
175
|
+
success: true,
|
|
176
|
+
summary: true,
|
|
177
|
+
stats: filteredRows,
|
|
178
|
+
totalVarsAvailable: rows.length,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
158
182
|
return {
|
|
159
183
|
success: true,
|
|
160
|
-
summary:
|
|
161
|
-
stats:
|
|
184
|
+
summary: false,
|
|
185
|
+
stats: rows,
|
|
162
186
|
totalVarsAvailable: rows.length,
|
|
163
187
|
};
|
|
188
|
+
} catch (error: unknown) {
|
|
189
|
+
if (error instanceof ZodError) {
|
|
190
|
+
return { success: false, error: formatZodError(error) };
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
success: false,
|
|
194
|
+
error: error instanceof Error ? error.message : String(error),
|
|
195
|
+
};
|
|
164
196
|
}
|
|
165
|
-
|
|
166
|
-
return {
|
|
167
|
-
success: true,
|
|
168
|
-
summary: false,
|
|
169
|
-
stats: rows,
|
|
170
|
-
totalVarsAvailable: rows.length,
|
|
171
|
-
};
|
|
172
197
|
},
|
|
173
198
|
};
|
|
174
199
|
}
|
|
@@ -191,47 +216,57 @@ function createProxySQLRuntimeStatusTool(): ToolDefinition {
|
|
|
191
216
|
openWorldHint: true,
|
|
192
217
|
},
|
|
193
218
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
// Redact sensitive admin variables (passwords, credentials)
|
|
203
|
-
const redactedVars = redactSensitiveVariables(adminVars);
|
|
204
|
-
|
|
205
|
-
if (summary) {
|
|
206
|
-
// Key admin variables for summary mode
|
|
207
|
-
const keyAdminVars = [
|
|
208
|
-
"admin-version",
|
|
209
|
-
"admin-read_only",
|
|
210
|
-
"admin-cluster_username",
|
|
211
|
-
"admin-mysql_ifaces",
|
|
212
|
-
"admin-restapi_enabled",
|
|
213
|
-
"admin-web_enabled",
|
|
214
|
-
"admin-stats_mysql_connection_pool",
|
|
215
|
-
];
|
|
216
|
-
const filteredVars = redactedVars.filter((row) =>
|
|
217
|
-
keyAdminVars.includes(row["variable_name"] as string),
|
|
219
|
+
try {
|
|
220
|
+
const { summary } = ProxySQLStatusInputSchema.parse(params);
|
|
221
|
+
const [versionRow] = await proxySQLQuery(
|
|
222
|
+
"SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'",
|
|
223
|
+
);
|
|
224
|
+
const adminVars = await proxySQLQuery(
|
|
225
|
+
"SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'",
|
|
218
226
|
);
|
|
227
|
+
|
|
228
|
+
// Redact sensitive admin variables (passwords, credentials)
|
|
229
|
+
const redactedVars = redactSensitiveVariables(adminVars);
|
|
230
|
+
|
|
231
|
+
if (summary) {
|
|
232
|
+
// Key admin variables for summary mode
|
|
233
|
+
const keyAdminVars = [
|
|
234
|
+
"admin-version",
|
|
235
|
+
"admin-read_only",
|
|
236
|
+
"admin-cluster_username",
|
|
237
|
+
"admin-mysql_ifaces",
|
|
238
|
+
"admin-restapi_enabled",
|
|
239
|
+
"admin-web_enabled",
|
|
240
|
+
"admin-stats_mysql_connection_pool",
|
|
241
|
+
];
|
|
242
|
+
const filteredVars = redactedVars.filter((row) =>
|
|
243
|
+
keyAdminVars.includes(row["variable_name"] as string),
|
|
244
|
+
);
|
|
245
|
+
return {
|
|
246
|
+
success: true,
|
|
247
|
+
summary: true,
|
|
248
|
+
version: versionRow?.["variable_value"] ?? "unknown",
|
|
249
|
+
adminVariables: filteredVars,
|
|
250
|
+
totalAdminVarsAvailable: redactedVars.length,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
219
254
|
return {
|
|
220
255
|
success: true,
|
|
221
|
-
summary:
|
|
256
|
+
summary: false,
|
|
222
257
|
version: versionRow?.["variable_value"] ?? "unknown",
|
|
223
|
-
adminVariables:
|
|
258
|
+
adminVariables: redactedVars,
|
|
224
259
|
totalAdminVarsAvailable: redactedVars.length,
|
|
225
260
|
};
|
|
261
|
+
} catch (error: unknown) {
|
|
262
|
+
if (error instanceof ZodError) {
|
|
263
|
+
return { success: false, error: formatZodError(error) };
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
success: false,
|
|
267
|
+
error: error instanceof Error ? error.message : String(error),
|
|
268
|
+
};
|
|
226
269
|
}
|
|
227
|
-
|
|
228
|
-
return {
|
|
229
|
-
success: true,
|
|
230
|
-
summary: false,
|
|
231
|
-
version: versionRow?.["variable_value"] ?? "unknown",
|
|
232
|
-
adminVariables: redactedVars,
|
|
233
|
-
totalAdminVarsAvailable: redactedVars.length,
|
|
234
|
-
};
|
|
235
270
|
},
|
|
236
271
|
};
|
|
237
272
|
}
|
|
@@ -250,7 +285,7 @@ function createProxySQLServersTool(): ToolDefinition {
|
|
|
250
285
|
description:
|
|
251
286
|
"List configured backend MySQL servers from mysql_servers table. Shows hostgroup, hostname, port, status, and weights.",
|
|
252
287
|
group: "proxysql",
|
|
253
|
-
inputSchema:
|
|
288
|
+
inputSchema: ProxySQLHostgroupInputSchemaBase,
|
|
254
289
|
requiredScopes: ["read"],
|
|
255
290
|
annotations: {
|
|
256
291
|
readOnlyHint: true,
|
|
@@ -258,47 +293,28 @@ function createProxySQLServersTool(): ToolDefinition {
|
|
|
258
293
|
openWorldHint: true,
|
|
259
294
|
},
|
|
260
295
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
296
|
+
try {
|
|
297
|
+
const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
|
|
298
|
+
let sql = "SELECT * FROM mysql_servers";
|
|
299
|
+
if (hostgroup_id !== undefined) {
|
|
300
|
+
const safeId = Math.max(0, Math.floor(hostgroup_id));
|
|
301
|
+
sql += ` WHERE hostgroup_id = ${safeId}`;
|
|
302
|
+
}
|
|
303
|
+
const rows = await proxySQLQuery(sql);
|
|
304
|
+
return {
|
|
305
|
+
success: true,
|
|
306
|
+
servers: rows,
|
|
307
|
+
count: rows.length,
|
|
308
|
+
};
|
|
309
|
+
} catch (error: unknown) {
|
|
310
|
+
if (error instanceof ZodError) {
|
|
311
|
+
return { success: false, error: formatZodError(error) };
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
error: error instanceof Error ? error.message : String(error),
|
|
316
|
+
};
|
|
265
317
|
}
|
|
266
|
-
const rows = await proxySQLQuery(sql);
|
|
267
|
-
return {
|
|
268
|
-
success: true,
|
|
269
|
-
servers: rows,
|
|
270
|
-
count: rows.length,
|
|
271
|
-
};
|
|
272
|
-
},
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* List hostgroup configurations and connection pool stats
|
|
278
|
-
*/
|
|
279
|
-
function createProxySQLHostgroupsTool(): ToolDefinition {
|
|
280
|
-
return {
|
|
281
|
-
name: "proxysql_hostgroups",
|
|
282
|
-
title: "ProxySQL Hostgroups",
|
|
283
|
-
description:
|
|
284
|
-
"List hostgroup configurations with connection pool statistics. Shows connections used/free, query counts, and latency.",
|
|
285
|
-
group: "proxysql",
|
|
286
|
-
inputSchema: ProxySQLBaseInputSchema,
|
|
287
|
-
requiredScopes: ["read"],
|
|
288
|
-
annotations: {
|
|
289
|
-
readOnlyHint: true,
|
|
290
|
-
idempotentHint: true,
|
|
291
|
-
openWorldHint: true,
|
|
292
|
-
},
|
|
293
|
-
handler: async (_params: unknown, _context: RequestContext) => {
|
|
294
|
-
const rows = await proxySQLQuery(
|
|
295
|
-
"SELECT * FROM stats_mysql_connection_pool",
|
|
296
|
-
);
|
|
297
|
-
return {
|
|
298
|
-
success: true,
|
|
299
|
-
hostgroups: rows,
|
|
300
|
-
count: rows.length,
|
|
301
|
-
};
|
|
302
318
|
},
|
|
303
319
|
};
|
|
304
320
|
}
|
|
@@ -317,7 +333,7 @@ function createProxySQLQueryRulesTool(): ToolDefinition {
|
|
|
317
333
|
description:
|
|
318
334
|
"List query routing rules from mysql_query_rules table. Shows rule IDs, match patterns, destination hostgroups, and cache settings.",
|
|
319
335
|
group: "proxysql",
|
|
320
|
-
inputSchema:
|
|
336
|
+
inputSchema: ProxySQLLimitInputSchemaBase,
|
|
321
337
|
requiredScopes: ["read"],
|
|
322
338
|
annotations: {
|
|
323
339
|
readOnlyHint: true,
|
|
@@ -325,16 +341,26 @@ function createProxySQLQueryRulesTool(): ToolDefinition {
|
|
|
325
341
|
openWorldHint: true,
|
|
326
342
|
},
|
|
327
343
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
344
|
+
try {
|
|
345
|
+
const { limit } = ProxySQLLimitInputSchema.parse(params);
|
|
346
|
+
const maxRows = Math.max(0, Math.floor(limit ?? 100));
|
|
347
|
+
const rows = await proxySQLQuery(
|
|
348
|
+
`SELECT * FROM mysql_query_rules LIMIT ${maxRows}`,
|
|
349
|
+
);
|
|
350
|
+
return {
|
|
351
|
+
success: true,
|
|
352
|
+
queryRules: rows,
|
|
353
|
+
count: rows.length,
|
|
354
|
+
};
|
|
355
|
+
} catch (error: unknown) {
|
|
356
|
+
if (error instanceof ZodError) {
|
|
357
|
+
return { success: false, error: formatZodError(error) };
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
success: false,
|
|
361
|
+
error: error instanceof Error ? error.message : String(error),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
338
364
|
},
|
|
339
365
|
};
|
|
340
366
|
}
|
|
@@ -349,7 +375,7 @@ function createProxySQLQueryDigestTool(): ToolDefinition {
|
|
|
349
375
|
description:
|
|
350
376
|
"Get query digest statistics showing top queries by execution count. Useful for identifying queries for routing, rewriting, or caching.",
|
|
351
377
|
group: "proxysql",
|
|
352
|
-
inputSchema:
|
|
378
|
+
inputSchema: ProxySQLLimitInputSchemaBase,
|
|
353
379
|
requiredScopes: ["read"],
|
|
354
380
|
annotations: {
|
|
355
381
|
readOnlyHint: true,
|
|
@@ -357,16 +383,26 @@ function createProxySQLQueryDigestTool(): ToolDefinition {
|
|
|
357
383
|
openWorldHint: true,
|
|
358
384
|
},
|
|
359
385
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
386
|
+
try {
|
|
387
|
+
const { limit } = ProxySQLLimitInputSchema.parse(params);
|
|
388
|
+
const maxRows = Math.max(0, Math.floor(limit ?? 50));
|
|
389
|
+
const rows = await proxySQLQuery(
|
|
390
|
+
`SELECT hostgroup, schemaname, username, digest, digest_text, count_star, sum_time, min_time, max_time FROM stats_mysql_query_digest ORDER BY count_star DESC LIMIT ${maxRows}`,
|
|
391
|
+
);
|
|
392
|
+
return {
|
|
393
|
+
success: true,
|
|
394
|
+
queryDigests: rows,
|
|
395
|
+
count: rows.length,
|
|
396
|
+
};
|
|
397
|
+
} catch (error: unknown) {
|
|
398
|
+
if (error instanceof ZodError) {
|
|
399
|
+
return { success: false, error: formatZodError(error) };
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
success: false,
|
|
403
|
+
error: error instanceof Error ? error.message : String(error),
|
|
404
|
+
};
|
|
405
|
+
}
|
|
370
406
|
},
|
|
371
407
|
};
|
|
372
408
|
}
|
|
@@ -385,7 +421,7 @@ function createProxySQLConnectionPoolTool(): ToolDefinition {
|
|
|
385
421
|
description:
|
|
386
422
|
"Get connection pool statistics per backend server. Shows connections used/free, errors, queries, bytes transferred, and latency.",
|
|
387
423
|
group: "proxysql",
|
|
388
|
-
inputSchema:
|
|
424
|
+
inputSchema: ProxySQLHostgroupInputSchemaBase,
|
|
389
425
|
requiredScopes: ["read"],
|
|
390
426
|
annotations: {
|
|
391
427
|
readOnlyHint: true,
|
|
@@ -393,17 +429,28 @@ function createProxySQLConnectionPoolTool(): ToolDefinition {
|
|
|
393
429
|
openWorldHint: true,
|
|
394
430
|
},
|
|
395
431
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
432
|
+
try {
|
|
433
|
+
const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
|
|
434
|
+
let sql = "SELECT * FROM stats_mysql_connection_pool";
|
|
435
|
+
if (hostgroup_id !== undefined) {
|
|
436
|
+
const safeId = Math.max(0, Math.floor(hostgroup_id));
|
|
437
|
+
sql += ` WHERE hostgroup = ${safeId}`;
|
|
438
|
+
}
|
|
439
|
+
const rows = await proxySQLQuery(sql);
|
|
440
|
+
return {
|
|
441
|
+
success: true,
|
|
442
|
+
connectionPools: rows,
|
|
443
|
+
count: rows.length,
|
|
444
|
+
};
|
|
445
|
+
} catch (error: unknown) {
|
|
446
|
+
if (error instanceof ZodError) {
|
|
447
|
+
return { success: false, error: formatZodError(error) };
|
|
448
|
+
}
|
|
449
|
+
return {
|
|
450
|
+
success: false,
|
|
451
|
+
error: error instanceof Error ? error.message : String(error),
|
|
452
|
+
};
|
|
400
453
|
}
|
|
401
|
-
const rows = await proxySQLQuery(sql);
|
|
402
|
-
return {
|
|
403
|
-
success: true,
|
|
404
|
-
connectionPools: rows,
|
|
405
|
-
count: rows.length,
|
|
406
|
-
};
|
|
407
454
|
},
|
|
408
455
|
};
|
|
409
456
|
}
|
|
@@ -430,15 +477,25 @@ function createProxySQLUsersTool(): ToolDefinition {
|
|
|
430
477
|
openWorldHint: true,
|
|
431
478
|
},
|
|
432
479
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
480
|
+
try {
|
|
481
|
+
// Don't expose passwords, select specific columns
|
|
482
|
+
const rows = await proxySQLQuery(
|
|
483
|
+
"SELECT username, active, use_ssl, default_hostgroup, default_schema, transaction_persistent, max_connections, comment FROM mysql_users",
|
|
484
|
+
);
|
|
485
|
+
return {
|
|
486
|
+
success: true,
|
|
487
|
+
users: rows,
|
|
488
|
+
count: rows.length,
|
|
489
|
+
};
|
|
490
|
+
} catch (error: unknown) {
|
|
491
|
+
if (error instanceof ZodError) {
|
|
492
|
+
return { success: false, error: formatZodError(error) };
|
|
493
|
+
}
|
|
494
|
+
return {
|
|
495
|
+
success: false,
|
|
496
|
+
error: error instanceof Error ? error.message : String(error),
|
|
497
|
+
};
|
|
498
|
+
}
|
|
442
499
|
},
|
|
443
500
|
};
|
|
444
501
|
}
|
|
@@ -457,7 +514,7 @@ function createProxySQLGlobalVariablesTool(): ToolDefinition {
|
|
|
457
514
|
description:
|
|
458
515
|
"Get ProxySQL global variables. Filter by prefix: mysql (MySQL proxy settings), admin (admin interface settings), or all. Use like parameter for pattern matching.",
|
|
459
516
|
group: "proxysql",
|
|
460
|
-
inputSchema:
|
|
517
|
+
inputSchema: ProxySQLVariableFilterSchemaBase,
|
|
461
518
|
requiredScopes: ["read"],
|
|
462
519
|
annotations: {
|
|
463
520
|
readOnlyHint: true,
|
|
@@ -465,47 +522,63 @@ function createProxySQLGlobalVariablesTool(): ToolDefinition {
|
|
|
465
522
|
openWorldHint: true,
|
|
466
523
|
},
|
|
467
524
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
525
|
+
try {
|
|
526
|
+
const { prefix, like, limit } =
|
|
527
|
+
ProxySQLVariableFilterSchema.parse(params);
|
|
528
|
+
const conditions: string[] = [];
|
|
529
|
+
|
|
530
|
+
// Apply prefix filter
|
|
531
|
+
if (prefix === "mysql") {
|
|
532
|
+
conditions.push("variable_name LIKE 'mysql-%'");
|
|
533
|
+
} else if (prefix === "admin") {
|
|
534
|
+
conditions.push("variable_name LIKE 'admin-%'");
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Validate like pattern against safe character set
|
|
538
|
+
if (like) {
|
|
539
|
+
if (!LIKE_SAFE_RE.test(like)) {
|
|
540
|
+
return {
|
|
541
|
+
success: false,
|
|
542
|
+
error: `Invalid like pattern: '${like}' — only alphanumeric, underscore, dash, dot, percent (%), and space characters are allowed`,
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
const sanitizedLike = like.replace(/'/g, "''");
|
|
546
|
+
conditions.push(`variable_name LIKE '${sanitizedLike}'`);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
const whereClause =
|
|
550
|
+
conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
|
|
551
|
+
|
|
552
|
+
// Get total count (without LIMIT) for truncation awareness
|
|
553
|
+
const countRows = await proxySQLQuery(
|
|
554
|
+
`SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`,
|
|
555
|
+
);
|
|
556
|
+
const countRow = countRows[0] ?? { cnt: 0 };
|
|
557
|
+
const totalVarsAvailable = Number(countRow["cnt"]);
|
|
478
558
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
}
|
|
559
|
+
const maxRows = Math.max(0, Math.floor(limit ?? 50));
|
|
560
|
+
const rows = await proxySQLQuery(
|
|
561
|
+
`SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`,
|
|
562
|
+
);
|
|
484
563
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
return {
|
|
504
|
-
success: true,
|
|
505
|
-
variables: redactedRows,
|
|
506
|
-
count: redactedRows.length,
|
|
507
|
-
totalVarsAvailable,
|
|
508
|
-
};
|
|
564
|
+
// Redact sensitive credential values (passwords, credentials)
|
|
565
|
+
const redactedRows = redactSensitiveVariables(rows);
|
|
566
|
+
|
|
567
|
+
return {
|
|
568
|
+
success: true,
|
|
569
|
+
variables: redactedRows,
|
|
570
|
+
count: redactedRows.length,
|
|
571
|
+
totalVarsAvailable,
|
|
572
|
+
};
|
|
573
|
+
} catch (error: unknown) {
|
|
574
|
+
if (error instanceof ZodError) {
|
|
575
|
+
return { success: false, error: formatZodError(error) };
|
|
576
|
+
}
|
|
577
|
+
return {
|
|
578
|
+
success: false,
|
|
579
|
+
error: error instanceof Error ? error.message : String(error),
|
|
580
|
+
};
|
|
581
|
+
}
|
|
509
582
|
},
|
|
510
583
|
};
|
|
511
584
|
}
|
|
@@ -532,12 +605,22 @@ function createProxySQLMemoryStatsTool(): ToolDefinition {
|
|
|
532
605
|
openWorldHint: true,
|
|
533
606
|
},
|
|
534
607
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
608
|
+
try {
|
|
609
|
+
const rows = await proxySQLQuery("SELECT * FROM stats_memory_metrics");
|
|
610
|
+
return {
|
|
611
|
+
success: true,
|
|
612
|
+
memoryStats: rows,
|
|
613
|
+
count: rows.length,
|
|
614
|
+
};
|
|
615
|
+
} catch (error: unknown) {
|
|
616
|
+
if (error instanceof ZodError) {
|
|
617
|
+
return { success: false, error: formatZodError(error) };
|
|
618
|
+
}
|
|
619
|
+
return {
|
|
620
|
+
success: false,
|
|
621
|
+
error: error instanceof Error ? error.message : String(error),
|
|
622
|
+
};
|
|
623
|
+
}
|
|
541
624
|
},
|
|
542
625
|
};
|
|
543
626
|
}
|
|
@@ -563,13 +646,23 @@ function createProxySQLCommandsTool(): ToolDefinition {
|
|
|
563
646
|
openWorldHint: true,
|
|
564
647
|
},
|
|
565
648
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
649
|
+
try {
|
|
650
|
+
const { command } = ProxySQLCommandInputSchema.parse(params);
|
|
651
|
+
await proxySQLQuery(command);
|
|
652
|
+
return {
|
|
653
|
+
success: true,
|
|
654
|
+
command,
|
|
655
|
+
message: `Command executed: ${command}`,
|
|
656
|
+
};
|
|
657
|
+
} catch (error: unknown) {
|
|
658
|
+
if (error instanceof ZodError) {
|
|
659
|
+
return { success: false, error: formatZodError(error) };
|
|
660
|
+
}
|
|
661
|
+
return {
|
|
662
|
+
success: false,
|
|
663
|
+
error: error instanceof Error ? error.message : String(error),
|
|
664
|
+
};
|
|
665
|
+
}
|
|
573
666
|
},
|
|
574
667
|
};
|
|
575
668
|
}
|
|
@@ -596,12 +689,24 @@ function createProxySQLProcessListTool(): ToolDefinition {
|
|
|
596
689
|
openWorldHint: true,
|
|
597
690
|
},
|
|
598
691
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
692
|
+
try {
|
|
693
|
+
const rows = await proxySQLQuery(
|
|
694
|
+
"SELECT * FROM stats_mysql_processlist",
|
|
695
|
+
);
|
|
696
|
+
return {
|
|
697
|
+
success: true,
|
|
698
|
+
processes: rows,
|
|
699
|
+
count: rows.length,
|
|
700
|
+
};
|
|
701
|
+
} catch (error: unknown) {
|
|
702
|
+
if (error instanceof ZodError) {
|
|
703
|
+
return { success: false, error: formatZodError(error) };
|
|
704
|
+
}
|
|
705
|
+
return {
|
|
706
|
+
success: false,
|
|
707
|
+
error: error instanceof Error ? error.message : String(error),
|
|
708
|
+
};
|
|
709
|
+
}
|
|
605
710
|
},
|
|
606
711
|
};
|
|
607
712
|
}
|