Skip to main content
Glama

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

NameRequiredDescriptionDefault
queryYesThe SQL statement to execute.

Input Schema (JSON Schema)

{ "properties": { "query": { "description": "The SQL statement to execute.", "type": "string" } }, "required": [ "query" ], "type": "object" }

Implementation Reference

  • 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; } }
  • 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'], }, }, ], }));
  • 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');

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/michael7736/mysql-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server