refactor: Remove mcp-catalog_path variable and hardcode catalog path

Remove the mcp-catalog_path configuration variable and hardcode the catalog
database path to datadir/mcp_catalog.db for stability.

Rationale: The catalog database is session state, not user configuration.
Runtime swapping of the catalog could cause tables to be missed and the
catalog to fail even if it was succeeding a second earlier.

Changes:
- Removed catalog_path from mcp_thread_variables_names array
- Removed mcp_catalog_path from MCP_Thread variables struct
- Removed getter/setter logic for catalog_path
- Hardcoded catalog path to GloVars.datadir/mcp_catalog.db in:
  - ProxySQL_MCP_Server.cpp (Query_Tool_Handler initialization)
  - Admin_FlushVariables.cpp (MySQL_Tool_Handler reinitialization)
- Updated VARIABLES.md to document the hardcoded path
- Updated configure_mcp.sh to remove catalog_path configuration
- Updated MCP README to remove catalog_path references
pull/5318/head
Rene Cannao 1 month ago
parent a816a756d4
commit 35b0b224ff

@ -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

@ -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;
/**

@ -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) {

@ -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;
}

@ -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");

@ -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) |
---

@ -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}"
}

Loading…
Cancel
Save