mirror of https://github.com/sysown/proxysql
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
378 lines
12 KiB
378 lines
12 KiB
#!/bin/bash
|
|
#
|
|
# configure_mcp.sh - Configure ProxySQL MCP module
|
|
#
|
|
# Usage:
|
|
# ./configure_mcp.sh [options]
|
|
#
|
|
# Options:
|
|
# -h, --host HOST MySQL host (default: 127.0.0.1)
|
|
# -P, --port PORT MySQL port (default: 3307)
|
|
# -u, --user USER MySQL user (default: root)
|
|
# -p, --password PASS MySQL password (default: test123)
|
|
# -d, --database DB MySQL database (default: testdb)
|
|
# --mcp-port PORT MCP server port (default: 6071)
|
|
# --enable Enable MCP server
|
|
# --disable Disable MCP server
|
|
# --status Show current MCP configuration
|
|
#
|
|
|
|
set -e
|
|
|
|
# Default configuration (can be overridden by environment variables)
|
|
MYSQL_HOST="${MYSQL_HOST:-127.0.0.1}"
|
|
MYSQL_PORT="${MYSQL_PORT:-3307}"
|
|
MYSQL_USER="${MYSQL_USER:-root}"
|
|
MYSQL_PASSWORD="${MYSQL_PASSWORD=test123}" # Use = instead of :- to allow empty passwords
|
|
MYSQL_DATABASE="${TEST_DB_NAME:-testdb}"
|
|
MCP_PORT="${MCP_PORT:-6071}"
|
|
MCP_ENABLED="false"
|
|
MCP_USE_SSL="true" # Default to true for security
|
|
|
|
# ProxySQL admin configuration
|
|
PROXYSQL_ADMIN_HOST="${PROXYSQL_ADMIN_HOST:-127.0.0.1}"
|
|
PROXYSQL_ADMIN_PORT="${PROXYSQL_ADMIN_PORT:-6032}"
|
|
PROXYSQL_ADMIN_USER="${PROXYSQL_ADMIN_USER:-admin}"
|
|
PROXYSQL_ADMIN_PASSWORD="${PROXYSQL_ADMIN_PASSWORD:-admin}"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
log_step() {
|
|
echo -e "${BLUE}[STEP]${NC} $1"
|
|
}
|
|
|
|
# Execute MySQL command via ProxySQL admin
|
|
exec_admin() {
|
|
mysql -h "${PROXYSQL_ADMIN_HOST}" -P "${PROXYSQL_ADMIN_PORT}" \
|
|
-u "${PROXYSQL_ADMIN_USER}" -p"${PROXYSQL_ADMIN_PASSWORD}" \
|
|
-e "$1" 2>&1
|
|
}
|
|
|
|
# Execute MySQL command via ProxySQL admin (silent mode)
|
|
exec_admin_silent() {
|
|
mysql -h "${PROXYSQL_ADMIN_HOST}" -P "${PROXYSQL_ADMIN_PORT}" \
|
|
-u "${PROXYSQL_ADMIN_USER}" -p"${PROXYSQL_ADMIN_PASSWORD}" \
|
|
-e "$1" 2>/dev/null
|
|
}
|
|
|
|
# Check if ProxySQL admin is accessible
|
|
check_proxysql_admin() {
|
|
log_step "Checking ProxySQL admin connection..."
|
|
if exec_admin_silent "SELECT 1" >/dev/null 2>&1; then
|
|
log_info "Connected to ProxySQL admin at ${PROXYSQL_ADMIN_HOST}:${PROXYSQL_ADMIN_PORT}"
|
|
return 0
|
|
else
|
|
log_error "Cannot connect to ProxySQL admin at ${PROXYSQL_ADMIN_HOST}:${PROXYSQL_ADMIN_PORT}"
|
|
log_error "Please ensure ProxySQL is running"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Check if MySQL is accessible
|
|
check_mysql_connection() {
|
|
log_step "Checking MySQL connection..."
|
|
if mysql -h "${MYSQL_HOST}" -P "${MYSQL_PORT}" \
|
|
-u "${MYSQL_USER}" -p"${MYSQL_PASSWORD}" \
|
|
-e "SELECT 1" >/dev/null 2>&1; then
|
|
log_info "Connected to MySQL at ${MYSQL_HOST}:${MYSQL_PORT}"
|
|
return 0
|
|
else
|
|
log_error "Cannot connect to MySQL at ${MYSQL_HOST}:${MYSQL_PORT}"
|
|
log_error "Please ensure MySQL is running and credentials are correct"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Configure MCP variables
|
|
configure_mcp() {
|
|
local enable="$1"
|
|
|
|
log_step "Configuring MCP variables..."
|
|
|
|
local errors=0
|
|
|
|
# Set each variable individually to catch errors
|
|
exec_admin_silent "SET mcp-mysql_hosts='${MYSQL_HOST}';" || { log_error "Failed to set mcp-mysql_hosts"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-mysql_ports='${MYSQL_PORT}';" || { log_error "Failed to set mcp-mysql_ports"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-mysql_user='${MYSQL_USER}';" || { log_error "Failed to set mcp-mysql_user"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-mysql_password='${MYSQL_PASSWORD}';" || { log_error "Failed to set mcp-mysql_password"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-mysql_schema='${MYSQL_DATABASE}';" || { log_error "Failed to set mcp-mysql_schema"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-port='${MCP_PORT}';" || { log_error "Failed to set mcp-port"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-use_ssl='${MCP_USE_SSL}';" || { log_error "Failed to set mcp-use_ssl"; errors=$((errors + 1)); }
|
|
exec_admin_silent "SET mcp-enabled='${enable}';" || { log_error "Failed to set mcp-enabled"; errors=$((errors + 1)); }
|
|
|
|
if [ $errors -gt 0 ]; then
|
|
log_error "Failed to configure $errors MCP variable(s)"
|
|
return 1
|
|
fi
|
|
|
|
log_info "MCP variables configured:"
|
|
echo " mcp-mysql_hosts = ${MYSQL_HOST}"
|
|
echo " mcp-mysql_ports = ${MYSQL_PORT}"
|
|
echo " mcp-mysql_user = ${MYSQL_USER}"
|
|
echo " mcp-mysql_password = ${MYSQL_PASSWORD}"
|
|
echo " mcp-mysql_schema = ${MYSQL_DATABASE}"
|
|
echo " mcp-port = ${MCP_PORT}"
|
|
echo " mcp-use_ssl = ${MCP_USE_SSL}"
|
|
echo " mcp-enabled = ${enable}"
|
|
}
|
|
|
|
# Load MCP variables to runtime
|
|
load_to_runtime() {
|
|
log_step "Loading MCP variables to RUNTIME..."
|
|
if exec_admin_silent "LOAD MCP VARIABLES TO RUNTIME;" >/dev/null 2>&1; then
|
|
log_info "MCP variables loaded to RUNTIME"
|
|
else
|
|
log_error "Failed to load MCP variables to RUNTIME"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Show current MCP configuration
|
|
show_status() {
|
|
log_step "Current MCP configuration:"
|
|
echo ""
|
|
exec_admin_silent "SHOW VARIABLES LIKE 'mcp-%';" | column -t
|
|
echo ""
|
|
}
|
|
|
|
# Test MCP server connectivity
|
|
test_mcp_server() {
|
|
log_step "Testing MCP server connectivity..."
|
|
|
|
# Wait a moment for server to start
|
|
sleep 2
|
|
|
|
# Determine protocol based on SSL setting
|
|
local proto="https"
|
|
if [ "${MCP_USE_SSL}" = "false" ]; then
|
|
proto="http"
|
|
fi
|
|
|
|
# Test ping endpoint
|
|
local response
|
|
response=$(curl -s -X POST "${proto}://${PROXYSQL_ADMIN_HOST}:${MCP_PORT}/mcp/config" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"jsonrpc":"2.0","method":"ping","id":1}' 2>/dev/null || echo "")
|
|
|
|
if [ -n "$response" ]; then
|
|
log_info "MCP server is responding"
|
|
echo " Response: $response"
|
|
else
|
|
log_warn "MCP server not responding (may still be starting)"
|
|
fi
|
|
}
|
|
|
|
# Parse command line arguments
|
|
parse_args() {
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-h|--host)
|
|
MYSQL_HOST="$2"
|
|
shift 2
|
|
;;
|
|
-P|--port)
|
|
MYSQL_PORT="$2"
|
|
shift 2
|
|
;;
|
|
-u|--user)
|
|
MYSQL_USER="$2"
|
|
shift 2
|
|
;;
|
|
-p|--password)
|
|
MYSQL_PASSWORD="$2"
|
|
shift 2
|
|
;;
|
|
-d|--database)
|
|
MYSQL_DATABASE="$2"
|
|
shift 2
|
|
;;
|
|
--mcp-port)
|
|
MCP_PORT="$2"
|
|
shift 2
|
|
;;
|
|
--use-ssl)
|
|
MCP_USE_SSL="true"
|
|
shift
|
|
;;
|
|
--no-ssl)
|
|
MCP_USE_SSL="false"
|
|
shift
|
|
;;
|
|
--enable)
|
|
MCP_ENABLED="true"
|
|
shift
|
|
;;
|
|
--disable)
|
|
MCP_ENABLED="false"
|
|
shift
|
|
;;
|
|
--status)
|
|
show_status
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Use --help for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Show usage
|
|
show_usage() {
|
|
cat <<EOF
|
|
Usage: $0 [options]
|
|
|
|
Options:
|
|
-h, --host HOST MySQL host (default: 127.0.0.1)
|
|
-P, --port PORT MySQL port (default: 3307)
|
|
-u, --user USER MySQL user (default: root)
|
|
-p, --password PASS MySQL password (default: test123)
|
|
-d, --database DB MySQL database (default: testdb)
|
|
--mcp-port PORT MCP server port (default: 6071)
|
|
--use-ssl Enable SSL/TLS for MCP server (HTTPS mode)
|
|
--no-ssl Disable SSL/TLS for MCP server (HTTP mode)
|
|
--enable Enable MCP server
|
|
--disable Disable MCP server
|
|
--status Show current MCP configuration
|
|
|
|
Environment Variables:
|
|
MYSQL_HOST MySQL host (default: 127.0.0.1)
|
|
MYSQL_PORT MySQL port (default: 3307)
|
|
MYSQL_USER MySQL user (default: root)
|
|
MYSQL_PASSWORD MySQL password (default: test123)
|
|
TEST_DB_NAME MySQL database (default: testdb)
|
|
MCP_PORT MCP server port (default: 6071)
|
|
MCP_USE_SSL MCP SSL mode (default: true)
|
|
PROXYSQL_ADMIN_HOST ProxySQL admin host (default: 127.0.0.1)
|
|
PROXYSQL_ADMIN_PORT ProxySQL admin port (default: 6032)
|
|
PROXYSQL_ADMIN_USER ProxySQL admin user (default: admin)
|
|
PROXYSQL_ADMIN_PASSWORD ProxySQL admin password (default: admin)
|
|
|
|
Examples:
|
|
# Configure with test MySQL on port 3307 and enable MCP (HTTPS mode)
|
|
$0 --host 127.0.0.1 --port 3307 --enable
|
|
|
|
# Configure with HTTP mode (no SSL) for development
|
|
$0 --no-ssl --enable
|
|
|
|
# Disable MCP server
|
|
$0 --disable
|
|
|
|
# Show current configuration
|
|
$0 --status
|
|
|
|
# Use environment variables instead of command line options
|
|
export MYSQL_HOST=192.168.1.10
|
|
export MYSQL_PORT=3306
|
|
export MYSQL_USER=myuser
|
|
export MYSQL_PASSWORD=mypass
|
|
export TEST_DB_NAME=production
|
|
export MCP_USE_SSL=false
|
|
$0 --enable
|
|
EOF
|
|
}
|
|
|
|
# Main
|
|
main() {
|
|
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
|
show_usage
|
|
exit 0
|
|
fi
|
|
|
|
parse_args "$@"
|
|
|
|
echo "======================================"
|
|
echo "ProxySQL MCP Configuration"
|
|
echo "======================================"
|
|
echo ""
|
|
|
|
# Print environment variables if set
|
|
if [ -n "${MYSQL_HOST}" ] || [ -n "${MYSQL_PORT}" ] || [ -n "${MYSQL_USER}" ] || [ -n "${MYSQL_PASSWORD}" ] || [ -n "${TEST_DB_NAME}" ] || [ -n "${MCP_PORT}" ] || [ -n "${MCP_USE_SSL}" ]; then
|
|
log_info "Environment Variables:"
|
|
[ -n "${MYSQL_HOST}" ] && echo " MYSQL_HOST=${MYSQL_HOST}"
|
|
[ -n "${MYSQL_PORT}" ] && echo " MYSQL_PORT=${MYSQL_PORT}"
|
|
[ -n "${MYSQL_USER}" ] && echo " MYSQL_USER=${MYSQL_USER}"
|
|
[ -n "${MYSQL_PASSWORD}" ] && echo " MYSQL_PASSWORD=${MYSQL_PASSWORD}"
|
|
[ -n "${TEST_DB_NAME}" ] && echo " TEST_DB_NAME=${TEST_DB_NAME}"
|
|
[ -n "${MCP_PORT}" ] && echo " MCP_PORT=${MCP_PORT}"
|
|
[ -n "${MCP_USE_SSL}" ] && echo " MCP_USE_SSL=${MCP_USE_SSL}"
|
|
echo ""
|
|
fi
|
|
|
|
# Check ProxySQL admin connection
|
|
if ! check_proxysql_admin; then
|
|
exit 1
|
|
fi
|
|
|
|
# Check MySQL connection (only when enabling)
|
|
if [ "${MCP_ENABLED}" = "true" ]; then
|
|
if ! check_mysql_connection; then
|
|
log_warn "MySQL connection check failed, but continuing with configuration..."
|
|
fi
|
|
fi
|
|
|
|
# Configure MCP
|
|
if ! configure_mcp "${MCP_ENABLED}"; then
|
|
log_error "Failed to configure MCP variables"
|
|
exit 1
|
|
fi
|
|
|
|
# Load to runtime
|
|
if ! load_to_runtime; then
|
|
log_error "Failed to load MCP variables to runtime"
|
|
exit 1
|
|
fi
|
|
|
|
# Show status
|
|
echo ""
|
|
show_status
|
|
|
|
# Test server if enabling
|
|
if [ "${MCP_ENABLED}" = "true" ]; then
|
|
echo ""
|
|
test_mcp_server
|
|
fi
|
|
|
|
echo ""
|
|
log_info "Configuration complete!"
|
|
if [ "${MCP_ENABLED}" = "true" ]; then
|
|
echo ""
|
|
if [ "${MCP_USE_SSL}" = "true" ]; then
|
|
local proto="https"
|
|
echo "MCP server is now enabled (HTTPS mode) and accessible at:"
|
|
else
|
|
local proto="http"
|
|
echo "MCP server is now enabled (HTTP mode - unencrypted) and accessible at:"
|
|
fi
|
|
echo " ${proto}://${PROXYSQL_ADMIN_HOST}:${MCP_PORT}/mcp/config (config endpoint)"
|
|
echo " ${proto}://${PROXYSQL_ADMIN_HOST}:${MCP_PORT}/mcp/observe (observe endpoint)"
|
|
echo " ${proto}://${PROXYSQL_ADMIN_HOST}:${MCP_PORT}/mcp/query (query endpoint)"
|
|
echo " ${proto}://${PROXYSQL_ADMIN_HOST}:${MCP_PORT}/mcp/admin (admin endpoint)"
|
|
echo " ${proto}://${PROXYSQL_ADMIN_HOST}:${MCP_PORT}/mcp/cache (cache endpoint)"
|
|
echo ""
|
|
echo "Run './test_mcp_tools.sh' to test MCP tools"
|
|
fi
|
|
}
|
|
|
|
main "$@"
|