diff --git a/doc/MCP/VARIABLES.md b/doc/MCP/VARIABLES.md index 92edc552e..2f907743c 100644 --- a/doc/MCP/VARIABLES.md +++ b/doc/MCP/VARIABLES.md @@ -175,16 +175,11 @@ The MySQL Tool Handler provides LLM-based tools for MySQL database exploration, ### Catalog Configuration -#### `mcp-catalog_path` -- **Type:** String (file path) -- **Default:** `"mcp_catalog.db"` -- **Description:** Path to the SQLite catalog database (relative to ProxySQL datadir) -- **Runtime:** Yes -- **Example:** - ```sql - SET mcp-catalog_path='/path/to/mcp_catalog.db'; - LOAD MCP VARIABLES TO RUNTIME; - ``` +The catalog database path is **hardcoded** to `mcp_catalog.db` in the ProxySQL datadir and cannot be changed at runtime. The catalog stores: +- Database schemas discovered during two-phase discovery +- LLM memories (summaries, domains, metrics) +- Tool usage statistics +- Search history ## Management Commands diff --git a/include/MCP_Thread.h b/include/MCP_Thread.h index a5b103d22..56b64a187 100644 --- a/include/MCP_Thread.h +++ b/include/MCP_Thread.h @@ -55,7 +55,7 @@ public: char* mcp_mysql_user; ///< MySQL username for tool connections char* mcp_mysql_password; ///< MySQL password for tool connections char* mcp_mysql_schema; ///< Default schema/database - char* mcp_catalog_path; ///< Path to catalog SQLite database + // Catalog path is hardcoded to mcp_catalog.db in the datadir } variables; /** diff --git a/lib/Admin_FlushVariables.cpp b/lib/Admin_FlushVariables.cpp index c9bf71484..c292ee9a7 100644 --- a/lib/Admin_FlushVariables.cpp +++ b/lib/Admin_FlushVariables.cpp @@ -1538,13 +1538,17 @@ void ProxySQL_Admin::flush_mcp_variables___runtime_to_database(SQLite3DB* db, bo // Create new tool handler with current configuration proxy_info("MCP: Reinitializing MySQL Tool Handler with current configuration\n"); + + // Hardcode catalog path to datadir/mcp_catalog.db for stability + std::string catalog_path = std::string(GloVars.datadir) + "/mcp_catalog.db"; + GloMCPH->mysql_tool_handler = new MySQL_Tool_Handler( GloMCPH->variables.mcp_mysql_hosts ? GloMCPH->variables.mcp_mysql_hosts : "", GloMCPH->variables.mcp_mysql_ports ? GloMCPH->variables.mcp_mysql_ports : "", GloMCPH->variables.mcp_mysql_user ? GloMCPH->variables.mcp_mysql_user : "", GloMCPH->variables.mcp_mysql_password ? GloMCPH->variables.mcp_mysql_password : "", GloMCPH->variables.mcp_mysql_schema ? GloMCPH->variables.mcp_mysql_schema : "", - GloMCPH->variables.mcp_catalog_path ? GloMCPH->variables.mcp_catalog_path : "" + catalog_path.c_str() ); if (GloMCPH->mysql_tool_handler->init() != 0) { diff --git a/lib/MCP_Thread.cpp b/lib/MCP_Thread.cpp index 9d8a57860..bff64b624 100644 --- a/lib/MCP_Thread.cpp +++ b/lib/MCP_Thread.cpp @@ -29,7 +29,6 @@ static const char* mcp_thread_variables_names[] = { "mysql_user", "mysql_password", "mysql_schema", - "catalog_path", NULL }; @@ -54,7 +53,6 @@ MCP_Threads_Handler::MCP_Threads_Handler() { variables.mcp_mysql_user = strdup(""); variables.mcp_mysql_password = strdup(""); variables.mcp_mysql_schema = strdup(""); - variables.mcp_catalog_path = strdup("mcp_catalog.db"); status_variables.total_requests = 0; status_variables.failed_requests = 0; @@ -93,8 +91,6 @@ MCP_Threads_Handler::~MCP_Threads_Handler() { free(variables.mcp_mysql_password); if (variables.mcp_mysql_schema) free(variables.mcp_mysql_schema); - if (variables.mcp_catalog_path) - free(variables.mcp_catalog_path); if (mcp_server) { delete mcp_server; @@ -216,10 +212,6 @@ int MCP_Threads_Handler::get_variable(const char* name, char* val) { sprintf(val, "%s", variables.mcp_mysql_schema ? variables.mcp_mysql_schema : ""); return 0; } - if (!strcmp(name, "catalog_path")) { - sprintf(val, "%s", variables.mcp_catalog_path ? variables.mcp_catalog_path : ""); - return 0; - } return -1; } @@ -316,12 +308,6 @@ int MCP_Threads_Handler::set_variable(const char* name, const char* value) { variables.mcp_mysql_schema = strdup(value); return 0; } - if (!strcmp(name, "catalog_path")) { - if (variables.mcp_catalog_path) - free(variables.mcp_catalog_path); - variables.mcp_catalog_path = strdup(value); - return 0; - } return -1; } diff --git a/lib/ProxySQL_MCP_Server.cpp b/lib/ProxySQL_MCP_Server.cpp index f1027ff67..fd0fb84b9 100644 --- a/lib/ProxySQL_MCP_Server.cpp +++ b/lib/ProxySQL_MCP_Server.cpp @@ -76,13 +76,17 @@ ProxySQL_MCP_Server::ProxySQL_MCP_Server(int p, MCP_Threads_Handler* h) // 2. Query Tool Handler (uses Discovery_Schema directly for two-phase discovery) proxy_info("Initializing Query Tool Handler...\n"); + + // Hardcode catalog path to datadir/mcp_catalog.db for stability + std::string catalog_path = std::string(GloVars.datadir) + "/mcp_catalog.db"; + handler->query_tool_handler = new Query_Tool_Handler( handler->variables.mcp_mysql_hosts ? handler->variables.mcp_mysql_hosts : "", handler->variables.mcp_mysql_ports ? handler->variables.mcp_mysql_ports : "", handler->variables.mcp_mysql_user ? handler->variables.mcp_mysql_user : "", handler->variables.mcp_mysql_password ? handler->variables.mcp_mysql_password : "", handler->variables.mcp_mysql_schema ? handler->variables.mcp_mysql_schema : "", - handler->variables.mcp_catalog_path ? handler->variables.mcp_catalog_path : "mcp_catalog.db" + catalog_path.c_str() ); if (handler->query_tool_handler->init() == 0) { proxy_info("Query Tool Handler initialized successfully\n"); diff --git a/scripts/mcp/README.md b/scripts/mcp/README.md index 926a492a8..f053705ce 100644 --- a/scripts/mcp/README.md +++ b/scripts/mcp/README.md @@ -104,11 +104,6 @@ MCP (Model Context Protocol) is a JSON-RPC 2.0 protocol that allows AI/LLM appli | `mcp-mysql_hosts` | 127.0.0.1 | MySQL server(s) for tool execution | | `mcp-mysql_ports` | 3306 | MySQL port(s) | | `mcp-mysql_user` | (empty) | MySQL username for connections | -| `mcp-mysql_password` | (empty) | MySQL password | -| `mcp-mysql_schema` | (empty) | Default schema for queries | -| `mcp-catalog_path` | mcp_catalog.db | SQLite catalog database path (relative to datadir) | - -**Endpoints:** - `POST https://localhost:6071/config` - Initialize, ping, tools/list - `POST https://localhost:6071/query` - Execute tools (tools/call) @@ -545,7 +540,6 @@ MySQL Tool Handler initialized for schema 'testdb' | `mcp-mysql_user` | (empty) | MySQL username | | `mcp-mysql_password` | (empty) | MySQL password | | `mcp-mysql_schema` | (empty) | Default schema | -| `mcp-catalog_path` | mcp_catalog.db | Catalog database path (relative to datadir) | --- diff --git a/scripts/mcp/configure_mcp.sh b/scripts/mcp/configure_mcp.sh index 3cfcd6a54..7adcf6075 100755 --- a/scripts/mcp/configure_mcp.sh +++ b/scripts/mcp/configure_mcp.sh @@ -113,7 +113,6 @@ configure_mcp() { 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-catalog_path='mcp_catalog.db';" || { log_error "Failed to set mcp-catalog_path"; 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-enabled='${enable}';" || { log_error "Failed to set mcp-enabled"; errors=$((errors + 1)); } @@ -128,7 +127,6 @@ configure_mcp() { echo " mcp-mysql_user = ${MYSQL_USER}" echo " mcp-mysql_password = ${MYSQL_PASSWORD}" echo " mcp-mysql_schema = ${MYSQL_DATABASE}" - echo " mcp-catalog_path = mcp_catalog.db (relative to datadir)" echo " mcp-port = ${MCP_PORT}" echo " mcp-enabled = ${enable}" }