execute_sql
Execute non-SELECT SQL statements like ALTER TABLE, INSERT, UPDATE, or DELETE directly on a MySQL database using the MySQL MCP Server for database management tasks.
Instructions
Executes any non-SELECT SQL statement (e.g., ALTER TABLE, DROP, etc.)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The SQL statement to execute. |
Input Schema (JSON Schema)
{
"properties": {
"query": {
"description": "The SQL statement to execute.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
}
Implementation Reference
- src/index.ts:476-526 (handler)The primary handler for the 'execute_sql' tool. Validates input arguments, ensures the query is not a SELECT statement, executes the SQL query on the MySQL connection pool, and returns a formatted success or error response.private async handleExecuteSql(request: any, transactionId: string) { if (!isValidSqlQueryArgs(request.params.arguments)) { throw new McpError( ErrorCode.InvalidParams, 'Invalid SQL query arguments.' ); } const query = request.params.arguments.query; if (isReadOnlyQuery(query)) { throw new McpError( ErrorCode.InvalidParams, 'SELECT queries are not allowed with execute_sql tool.' ); } console.error(`[${transactionId}] Executing general SQL: ${query}`); try { const [result] = await this.pool.query(query); console.error(`[${transactionId}] SQL executed successfully`); return { content: [ { type: 'text', text: JSON.stringify({ success: true, message: 'SQL executed successfully', result }, null, 2), }, ], }; } catch (error) { console.error(`[${transactionId}] SQL error:`, error); if (error instanceof Error) { return { content: [ { type: 'text', text: `MySQL error: ${error.message}`, }, ], isError: true, }; } throw error; } }
- src/index.ts:164-177 (schema)Tool schema definition for 'execute_sql', including name, description, and input schema (object with required 'query' string field), provided in the ListTools response.{ name: 'execute_sql', description: 'Executes any non-SELECT SQL statement (e.g., ALTER TABLE, DROP, etc.)', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL statement to execute.', }, }, required: ['query'], }, },
- src/index.ts:181-205 (registration)Registration of the CallTool request handler, including the switch case that dispatches 'execute_sql' calls to the handleExecuteSql method.this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const transactionId = generateTransactionId(); console.error(`[${transactionId}] Processing request: ${request.params.name}`); // Handle different tool types switch (request.params.name) { case 'run_sql_query': return this.handleReadQuery(request, transactionId); case 'create_table': return this.handleCreateTable(request, transactionId); case 'insert_data': return this.handleInsertData(request, transactionId); case 'update_data': return this.handleUpdateData(request, transactionId); case 'delete_data': return this.handleDeleteData(request, transactionId); case 'execute_sql': return this.handleExecuteSql(request, transactionId); default: throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); } });
- src/index.ts:92-179 (registration)Tool list registration in ListToolsRequestSchema handler, where 'execute_sql' is listed among available tools.this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: 'run_sql_query', description: 'Executes a read-only SQL query (SELECT statements only) against the MySQL database.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL SELECT query to execute.', }, }, required: ['query'], }, }, { name: 'create_table', description: 'Creates a new table in the MySQL database.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL CREATE TABLE query to execute.', }, }, required: ['query'], }, }, { name: 'insert_data', description: 'Inserts data into a table in the MySQL database.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL INSERT INTO query to execute.', }, }, required: ['query'], }, }, { name: 'update_data', description: 'Updates data in a table in the MySQL database.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL UPDATE query to execute.', }, }, required: ['query'], }, }, { name: 'delete_data', description: 'Deletes data from a table in the MySQL database.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL DELETE FROM query to execute.', }, }, required: ['query'], }, }, { name: 'execute_sql', description: 'Executes any non-SELECT SQL statement (e.g., ALTER TABLE, DROP, etc.)', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'The SQL statement to execute.', }, }, required: ['query'], }, }, ], }));
- src/index.ts:30-32 (helper)Helper function to detect if a query is a read-only SELECT statement, used to block SELECTs in execute_sql handler.const isReadOnlyQuery = (query: string): boolean => query.trim().toLowerCase().startsWith('select');