@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,13 +2,24 @@
|
|
|
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
|
import mysql from "mysql2/promise";
|
|
11
|
-
import {
|
|
11
|
+
import { ZodError } from "zod";
|
|
12
|
+
import { ProxySQLBaseInputSchema, ProxySQLStatusInputSchema, ProxySQLLimitInputSchema, ProxySQLLimitInputSchemaBase, ProxySQLHostgroupInputSchema, ProxySQLHostgroupInputSchemaBase, ProxySQLVariableFilterSchema, ProxySQLVariableFilterSchemaBase, ProxySQLCommandInputSchema, } from "../types/proxysql-types.js";
|
|
13
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
14
|
+
function formatZodError(error) {
|
|
15
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Safe character set for LIKE patterns.
|
|
19
|
+
* Allows alphanumeric, underscore, dash, dot, percent (%), and space.
|
|
20
|
+
* Rejects SQL injection characters like single quotes, semicolons, parentheses, etc.
|
|
21
|
+
*/
|
|
22
|
+
const LIKE_SAFE_RE = /^[a-zA-Z0-9_%\-. *]+$/;
|
|
12
23
|
// =============================================================================
|
|
13
24
|
// ProxySQL Connection Helper
|
|
14
25
|
// =============================================================================
|
|
@@ -71,7 +82,6 @@ export function getProxySQLTools(_adapter) {
|
|
|
71
82
|
return [
|
|
72
83
|
createProxySQLStatusTool(),
|
|
73
84
|
createProxySQLServersTool(),
|
|
74
|
-
createProxySQLHostgroupsTool(),
|
|
75
85
|
createProxySQLQueryRulesTool(),
|
|
76
86
|
createProxySQLQueryDigestTool(),
|
|
77
87
|
createProxySQLConnectionPoolTool(),
|
|
@@ -103,38 +113,49 @@ function createProxySQLStatusTool() {
|
|
|
103
113
|
openWorldHint: true,
|
|
104
114
|
},
|
|
105
115
|
handler: async (params, _context) => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
116
|
+
try {
|
|
117
|
+
const { summary } = ProxySQLStatusInputSchema.parse(params);
|
|
118
|
+
const rows = await proxySQLQuery("SELECT * FROM stats_mysql_global");
|
|
119
|
+
if (summary) {
|
|
120
|
+
// Key metrics for summary mode
|
|
121
|
+
const keyMetrics = [
|
|
122
|
+
"ProxySQL_Uptime",
|
|
123
|
+
"Questions",
|
|
124
|
+
"Slow_queries",
|
|
125
|
+
"Active_Transactions",
|
|
126
|
+
"Client_Connections_connected",
|
|
127
|
+
"Client_Connections_created",
|
|
128
|
+
"Server_Connections_connected",
|
|
129
|
+
"Server_Connections_created",
|
|
130
|
+
"Query_Cache_Entries",
|
|
131
|
+
"Query_Cache_Memory_bytes",
|
|
132
|
+
"mysql_backend_buffers_bytes",
|
|
133
|
+
"mysql_frontend_buffers_bytes",
|
|
134
|
+
];
|
|
135
|
+
const filteredRows = rows.filter((row) => keyMetrics.includes(row["Variable_Name"]));
|
|
136
|
+
return {
|
|
137
|
+
success: true,
|
|
138
|
+
summary: true,
|
|
139
|
+
stats: filteredRows,
|
|
140
|
+
totalVarsAvailable: rows.length,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
125
143
|
return {
|
|
126
144
|
success: true,
|
|
127
|
-
summary:
|
|
128
|
-
stats:
|
|
145
|
+
summary: false,
|
|
146
|
+
stats: rows,
|
|
129
147
|
totalVarsAvailable: rows.length,
|
|
130
148
|
};
|
|
131
149
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error instanceof ZodError) {
|
|
152
|
+
return { success: false, error: formatZodError(error) };
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
error: error instanceof Error ? error.message : String(error),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
138
159
|
},
|
|
139
160
|
};
|
|
140
161
|
}
|
|
@@ -155,38 +176,49 @@ function createProxySQLRuntimeStatusTool() {
|
|
|
155
176
|
openWorldHint: true,
|
|
156
177
|
},
|
|
157
178
|
handler: async (params, _context) => {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
179
|
+
try {
|
|
180
|
+
const { summary } = ProxySQLStatusInputSchema.parse(params);
|
|
181
|
+
const [versionRow] = await proxySQLQuery("SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'");
|
|
182
|
+
const adminVars = await proxySQLQuery("SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'");
|
|
183
|
+
// Redact sensitive admin variables (passwords, credentials)
|
|
184
|
+
const redactedVars = redactSensitiveVariables(adminVars);
|
|
185
|
+
if (summary) {
|
|
186
|
+
// Key admin variables for summary mode
|
|
187
|
+
const keyAdminVars = [
|
|
188
|
+
"admin-version",
|
|
189
|
+
"admin-read_only",
|
|
190
|
+
"admin-cluster_username",
|
|
191
|
+
"admin-mysql_ifaces",
|
|
192
|
+
"admin-restapi_enabled",
|
|
193
|
+
"admin-web_enabled",
|
|
194
|
+
"admin-stats_mysql_connection_pool",
|
|
195
|
+
];
|
|
196
|
+
const filteredVars = redactedVars.filter((row) => keyAdminVars.includes(row["variable_name"]));
|
|
197
|
+
return {
|
|
198
|
+
success: true,
|
|
199
|
+
summary: true,
|
|
200
|
+
version: versionRow?.["variable_value"] ?? "unknown",
|
|
201
|
+
adminVariables: filteredVars,
|
|
202
|
+
totalAdminVarsAvailable: redactedVars.length,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
175
205
|
return {
|
|
176
206
|
success: true,
|
|
177
|
-
summary:
|
|
207
|
+
summary: false,
|
|
178
208
|
version: versionRow?.["variable_value"] ?? "unknown",
|
|
179
|
-
adminVariables:
|
|
209
|
+
adminVariables: redactedVars,
|
|
180
210
|
totalAdminVarsAvailable: redactedVars.length,
|
|
181
211
|
};
|
|
182
212
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (error instanceof ZodError) {
|
|
215
|
+
return { success: false, error: formatZodError(error) };
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
success: false,
|
|
219
|
+
error: error instanceof Error ? error.message : String(error),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
190
222
|
},
|
|
191
223
|
};
|
|
192
224
|
}
|
|
@@ -202,7 +234,7 @@ function createProxySQLServersTool() {
|
|
|
202
234
|
title: "ProxySQL Servers",
|
|
203
235
|
description: "List configured backend MySQL servers from mysql_servers table. Shows hostgroup, hostname, port, status, and weights.",
|
|
204
236
|
group: "proxysql",
|
|
205
|
-
inputSchema:
|
|
237
|
+
inputSchema: ProxySQLHostgroupInputSchemaBase,
|
|
206
238
|
requiredScopes: ["read"],
|
|
207
239
|
annotations: {
|
|
208
240
|
readOnlyHint: true,
|
|
@@ -210,43 +242,29 @@ function createProxySQLServersTool() {
|
|
|
210
242
|
openWorldHint: true,
|
|
211
243
|
},
|
|
212
244
|
handler: async (params, _context) => {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
245
|
+
try {
|
|
246
|
+
const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
|
|
247
|
+
let sql = "SELECT * FROM mysql_servers";
|
|
248
|
+
if (hostgroup_id !== undefined) {
|
|
249
|
+
const safeId = Math.max(0, Math.floor(hostgroup_id));
|
|
250
|
+
sql += ` WHERE hostgroup_id = ${safeId}`;
|
|
251
|
+
}
|
|
252
|
+
const rows = await proxySQLQuery(sql);
|
|
253
|
+
return {
|
|
254
|
+
success: true,
|
|
255
|
+
servers: rows,
|
|
256
|
+
count: rows.length,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (error instanceof ZodError) {
|
|
261
|
+
return { success: false, error: formatZodError(error) };
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
success: false,
|
|
265
|
+
error: error instanceof Error ? error.message : String(error),
|
|
266
|
+
};
|
|
217
267
|
}
|
|
218
|
-
const rows = await proxySQLQuery(sql);
|
|
219
|
-
return {
|
|
220
|
-
success: true,
|
|
221
|
-
servers: rows,
|
|
222
|
-
count: rows.length,
|
|
223
|
-
};
|
|
224
|
-
},
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* List hostgroup configurations and connection pool stats
|
|
229
|
-
*/
|
|
230
|
-
function createProxySQLHostgroupsTool() {
|
|
231
|
-
return {
|
|
232
|
-
name: "proxysql_hostgroups",
|
|
233
|
-
title: "ProxySQL Hostgroups",
|
|
234
|
-
description: "List hostgroup configurations with connection pool statistics. Shows connections used/free, query counts, and latency.",
|
|
235
|
-
group: "proxysql",
|
|
236
|
-
inputSchema: ProxySQLBaseInputSchema,
|
|
237
|
-
requiredScopes: ["read"],
|
|
238
|
-
annotations: {
|
|
239
|
-
readOnlyHint: true,
|
|
240
|
-
idempotentHint: true,
|
|
241
|
-
openWorldHint: true,
|
|
242
|
-
},
|
|
243
|
-
handler: async (_params, _context) => {
|
|
244
|
-
const rows = await proxySQLQuery("SELECT * FROM stats_mysql_connection_pool");
|
|
245
|
-
return {
|
|
246
|
-
success: true,
|
|
247
|
-
hostgroups: rows,
|
|
248
|
-
count: rows.length,
|
|
249
|
-
};
|
|
250
268
|
},
|
|
251
269
|
};
|
|
252
270
|
}
|
|
@@ -262,7 +280,7 @@ function createProxySQLQueryRulesTool() {
|
|
|
262
280
|
title: "ProxySQL Query Rules",
|
|
263
281
|
description: "List query routing rules from mysql_query_rules table. Shows rule IDs, match patterns, destination hostgroups, and cache settings.",
|
|
264
282
|
group: "proxysql",
|
|
265
|
-
inputSchema:
|
|
283
|
+
inputSchema: ProxySQLLimitInputSchemaBase,
|
|
266
284
|
requiredScopes: ["read"],
|
|
267
285
|
annotations: {
|
|
268
286
|
readOnlyHint: true,
|
|
@@ -270,14 +288,25 @@ function createProxySQLQueryRulesTool() {
|
|
|
270
288
|
openWorldHint: true,
|
|
271
289
|
},
|
|
272
290
|
handler: async (params, _context) => {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
291
|
+
try {
|
|
292
|
+
const { limit } = ProxySQLLimitInputSchema.parse(params);
|
|
293
|
+
const maxRows = Math.max(0, Math.floor(limit ?? 100));
|
|
294
|
+
const rows = await proxySQLQuery(`SELECT * FROM mysql_query_rules LIMIT ${maxRows}`);
|
|
295
|
+
return {
|
|
296
|
+
success: true,
|
|
297
|
+
queryRules: rows,
|
|
298
|
+
count: rows.length,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
if (error instanceof ZodError) {
|
|
303
|
+
return { success: false, error: formatZodError(error) };
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
success: false,
|
|
307
|
+
error: error instanceof Error ? error.message : String(error),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
281
310
|
},
|
|
282
311
|
};
|
|
283
312
|
}
|
|
@@ -290,7 +319,7 @@ function createProxySQLQueryDigestTool() {
|
|
|
290
319
|
title: "ProxySQL Query Digest",
|
|
291
320
|
description: "Get query digest statistics showing top queries by execution count. Useful for identifying queries for routing, rewriting, or caching.",
|
|
292
321
|
group: "proxysql",
|
|
293
|
-
inputSchema:
|
|
322
|
+
inputSchema: ProxySQLLimitInputSchemaBase,
|
|
294
323
|
requiredScopes: ["read"],
|
|
295
324
|
annotations: {
|
|
296
325
|
readOnlyHint: true,
|
|
@@ -298,14 +327,25 @@ function createProxySQLQueryDigestTool() {
|
|
|
298
327
|
openWorldHint: true,
|
|
299
328
|
},
|
|
300
329
|
handler: async (params, _context) => {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
330
|
+
try {
|
|
331
|
+
const { limit } = ProxySQLLimitInputSchema.parse(params);
|
|
332
|
+
const maxRows = Math.max(0, Math.floor(limit ?? 50));
|
|
333
|
+
const rows = await proxySQLQuery(`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}`);
|
|
334
|
+
return {
|
|
335
|
+
success: true,
|
|
336
|
+
queryDigests: rows,
|
|
337
|
+
count: rows.length,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
if (error instanceof ZodError) {
|
|
342
|
+
return { success: false, error: formatZodError(error) };
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
success: false,
|
|
346
|
+
error: error instanceof Error ? error.message : String(error),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
309
349
|
},
|
|
310
350
|
};
|
|
311
351
|
}
|
|
@@ -321,7 +361,7 @@ function createProxySQLConnectionPoolTool() {
|
|
|
321
361
|
title: "ProxySQL Connection Pool",
|
|
322
362
|
description: "Get connection pool statistics per backend server. Shows connections used/free, errors, queries, bytes transferred, and latency.",
|
|
323
363
|
group: "proxysql",
|
|
324
|
-
inputSchema:
|
|
364
|
+
inputSchema: ProxySQLHostgroupInputSchemaBase,
|
|
325
365
|
requiredScopes: ["read"],
|
|
326
366
|
annotations: {
|
|
327
367
|
readOnlyHint: true,
|
|
@@ -329,17 +369,29 @@ function createProxySQLConnectionPoolTool() {
|
|
|
329
369
|
openWorldHint: true,
|
|
330
370
|
},
|
|
331
371
|
handler: async (params, _context) => {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
372
|
+
try {
|
|
373
|
+
const { hostgroup_id } = ProxySQLHostgroupInputSchema.parse(params);
|
|
374
|
+
let sql = "SELECT * FROM stats_mysql_connection_pool";
|
|
375
|
+
if (hostgroup_id !== undefined) {
|
|
376
|
+
const safeId = Math.max(0, Math.floor(hostgroup_id));
|
|
377
|
+
sql += ` WHERE hostgroup = ${safeId}`;
|
|
378
|
+
}
|
|
379
|
+
const rows = await proxySQLQuery(sql);
|
|
380
|
+
return {
|
|
381
|
+
success: true,
|
|
382
|
+
connectionPools: rows,
|
|
383
|
+
count: rows.length,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
if (error instanceof ZodError) {
|
|
388
|
+
return { success: false, error: formatZodError(error) };
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
success: false,
|
|
392
|
+
error: error instanceof Error ? error.message : String(error),
|
|
393
|
+
};
|
|
336
394
|
}
|
|
337
|
-
const rows = await proxySQLQuery(sql);
|
|
338
|
-
return {
|
|
339
|
-
success: true,
|
|
340
|
-
connectionPools: rows,
|
|
341
|
-
count: rows.length,
|
|
342
|
-
};
|
|
343
395
|
},
|
|
344
396
|
};
|
|
345
397
|
}
|
|
@@ -363,13 +415,24 @@ function createProxySQLUsersTool() {
|
|
|
363
415
|
openWorldHint: true,
|
|
364
416
|
},
|
|
365
417
|
handler: async (_params, _context) => {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
418
|
+
try {
|
|
419
|
+
// Don't expose passwords, select specific columns
|
|
420
|
+
const rows = await proxySQLQuery("SELECT username, active, use_ssl, default_hostgroup, default_schema, transaction_persistent, max_connections, comment FROM mysql_users");
|
|
421
|
+
return {
|
|
422
|
+
success: true,
|
|
423
|
+
users: rows,
|
|
424
|
+
count: rows.length,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
if (error instanceof ZodError) {
|
|
429
|
+
return { success: false, error: formatZodError(error) };
|
|
430
|
+
}
|
|
431
|
+
return {
|
|
432
|
+
success: false,
|
|
433
|
+
error: error instanceof Error ? error.message : String(error),
|
|
434
|
+
};
|
|
435
|
+
}
|
|
373
436
|
},
|
|
374
437
|
};
|
|
375
438
|
}
|
|
@@ -385,7 +448,7 @@ function createProxySQLGlobalVariablesTool() {
|
|
|
385
448
|
title: "ProxySQL Global Variables",
|
|
386
449
|
description: "Get ProxySQL global variables. Filter by prefix: mysql (MySQL proxy settings), admin (admin interface settings), or all. Use like parameter for pattern matching.",
|
|
387
450
|
group: "proxysql",
|
|
388
|
-
inputSchema:
|
|
451
|
+
inputSchema: ProxySQLVariableFilterSchemaBase,
|
|
389
452
|
requiredScopes: ["read"],
|
|
390
453
|
annotations: {
|
|
391
454
|
readOnlyHint: true,
|
|
@@ -393,35 +456,52 @@ function createProxySQLGlobalVariablesTool() {
|
|
|
393
456
|
openWorldHint: true,
|
|
394
457
|
},
|
|
395
458
|
handler: async (params, _context) => {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
459
|
+
try {
|
|
460
|
+
const { prefix, like, limit } = ProxySQLVariableFilterSchema.parse(params);
|
|
461
|
+
const conditions = [];
|
|
462
|
+
// Apply prefix filter
|
|
463
|
+
if (prefix === "mysql") {
|
|
464
|
+
conditions.push("variable_name LIKE 'mysql-%'");
|
|
465
|
+
}
|
|
466
|
+
else if (prefix === "admin") {
|
|
467
|
+
conditions.push("variable_name LIKE 'admin-%'");
|
|
468
|
+
}
|
|
469
|
+
// Validate like pattern against safe character set
|
|
470
|
+
if (like) {
|
|
471
|
+
if (!LIKE_SAFE_RE.test(like)) {
|
|
472
|
+
return {
|
|
473
|
+
success: false,
|
|
474
|
+
error: `Invalid like pattern: '${like}' — only alphanumeric, underscore, dash, dot, percent (%), and space characters are allowed`,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
const sanitizedLike = like.replace(/'/g, "''");
|
|
478
|
+
conditions.push(`variable_name LIKE '${sanitizedLike}'`);
|
|
479
|
+
}
|
|
480
|
+
const whereClause = conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
|
|
481
|
+
// Get total count (without LIMIT) for truncation awareness
|
|
482
|
+
const countRows = await proxySQLQuery(`SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`);
|
|
483
|
+
const countRow = countRows[0] ?? { cnt: 0 };
|
|
484
|
+
const totalVarsAvailable = Number(countRow["cnt"]);
|
|
485
|
+
const maxRows = Math.max(0, Math.floor(limit ?? 50));
|
|
486
|
+
const rows = await proxySQLQuery(`SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`);
|
|
487
|
+
// Redact sensitive credential values (passwords, credentials)
|
|
488
|
+
const redactedRows = redactSensitiveVariables(rows);
|
|
489
|
+
return {
|
|
490
|
+
success: true,
|
|
491
|
+
variables: redactedRows,
|
|
492
|
+
count: redactedRows.length,
|
|
493
|
+
totalVarsAvailable,
|
|
494
|
+
};
|
|
404
495
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
496
|
+
catch (error) {
|
|
497
|
+
if (error instanceof ZodError) {
|
|
498
|
+
return { success: false, error: formatZodError(error) };
|
|
499
|
+
}
|
|
500
|
+
return {
|
|
501
|
+
success: false,
|
|
502
|
+
error: error instanceof Error ? error.message : String(error),
|
|
503
|
+
};
|
|
409
504
|
}
|
|
410
|
-
const whereClause = conditions.length > 0 ? " WHERE " + conditions.join(" AND ") : "";
|
|
411
|
-
// Get total count (without LIMIT) for truncation awareness
|
|
412
|
-
const countRows = await proxySQLQuery(`SELECT COUNT(*) AS cnt FROM global_variables${whereClause}`);
|
|
413
|
-
const countRow = countRows[0] ?? { cnt: 0 };
|
|
414
|
-
const totalVarsAvailable = Number(countRow["cnt"]);
|
|
415
|
-
const maxRows = limit ?? 50;
|
|
416
|
-
const rows = await proxySQLQuery(`SELECT * FROM global_variables${whereClause} LIMIT ${maxRows}`);
|
|
417
|
-
// Redact sensitive credential values (passwords, credentials)
|
|
418
|
-
const redactedRows = redactSensitiveVariables(rows);
|
|
419
|
-
return {
|
|
420
|
-
success: true,
|
|
421
|
-
variables: redactedRows,
|
|
422
|
-
count: redactedRows.length,
|
|
423
|
-
totalVarsAvailable,
|
|
424
|
-
};
|
|
425
505
|
},
|
|
426
506
|
};
|
|
427
507
|
}
|
|
@@ -445,12 +525,23 @@ function createProxySQLMemoryStatsTool() {
|
|
|
445
525
|
openWorldHint: true,
|
|
446
526
|
},
|
|
447
527
|
handler: async (_params, _context) => {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
528
|
+
try {
|
|
529
|
+
const rows = await proxySQLQuery("SELECT * FROM stats_memory_metrics");
|
|
530
|
+
return {
|
|
531
|
+
success: true,
|
|
532
|
+
memoryStats: rows,
|
|
533
|
+
count: rows.length,
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
if (error instanceof ZodError) {
|
|
538
|
+
return { success: false, error: formatZodError(error) };
|
|
539
|
+
}
|
|
540
|
+
return {
|
|
541
|
+
success: false,
|
|
542
|
+
error: error instanceof Error ? error.message : String(error),
|
|
543
|
+
};
|
|
544
|
+
}
|
|
454
545
|
},
|
|
455
546
|
};
|
|
456
547
|
}
|
|
@@ -473,13 +564,24 @@ function createProxySQLCommandsTool() {
|
|
|
473
564
|
openWorldHint: true,
|
|
474
565
|
},
|
|
475
566
|
handler: async (params, _context) => {
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
567
|
+
try {
|
|
568
|
+
const { command } = ProxySQLCommandInputSchema.parse(params);
|
|
569
|
+
await proxySQLQuery(command);
|
|
570
|
+
return {
|
|
571
|
+
success: true,
|
|
572
|
+
command,
|
|
573
|
+
message: `Command executed: ${command}`,
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
catch (error) {
|
|
577
|
+
if (error instanceof ZodError) {
|
|
578
|
+
return { success: false, error: formatZodError(error) };
|
|
579
|
+
}
|
|
580
|
+
return {
|
|
581
|
+
success: false,
|
|
582
|
+
error: error instanceof Error ? error.message : String(error),
|
|
583
|
+
};
|
|
584
|
+
}
|
|
483
585
|
},
|
|
484
586
|
};
|
|
485
587
|
}
|
|
@@ -503,12 +605,23 @@ function createProxySQLProcessListTool() {
|
|
|
503
605
|
openWorldHint: true,
|
|
504
606
|
},
|
|
505
607
|
handler: async (_params, _context) => {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
608
|
+
try {
|
|
609
|
+
const rows = await proxySQLQuery("SELECT * FROM stats_mysql_processlist");
|
|
610
|
+
return {
|
|
611
|
+
success: true,
|
|
612
|
+
processes: rows,
|
|
613
|
+
count: rows.length,
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
catch (error) {
|
|
617
|
+
if (error instanceof ZodError) {
|
|
618
|
+
return { success: false, error: formatZodError(error) };
|
|
619
|
+
}
|
|
620
|
+
return {
|
|
621
|
+
success: false,
|
|
622
|
+
error: error instanceof Error ? error.message : String(error),
|
|
623
|
+
};
|
|
624
|
+
}
|
|
512
625
|
},
|
|
513
626
|
};
|
|
514
627
|
}
|