MySQL Server MCP Server

  • src
  • mysql-server
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js'; import mysql from 'mysql2/promise'; const DB_CONFIG = { host: process.env.MYSQL_HOST, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DATABASE, }; class MySQLServer { private server: Server; private pool: mysql.Pool; constructor() { this.server = new Server( { name: 'mysql-server', version: '0.1.0', }, { capabilities: { tools: {}, }, } ); this.pool = mysql.createPool(DB_CONFIG); this.setupToolHandlers(); this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } private setupToolHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: 'query', description: 'Execute SQL query', inputSchema: { type: 'object', properties: { sql: { type: 'string', description: 'SQL query to execute', }, }, required: ['sql'], }, }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name !== 'query') { throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); } const args = request.params.arguments as { sql: string }; const { sql } = args; if (typeof sql !== 'string') { throw new McpError( ErrorCode.InvalidParams, 'SQL query must be a string' ); } try { const connection = await this.pool.getConnection(); const [rows] = await connection.query(sql); connection.release(); return { content: [ { type: 'text', text: JSON.stringify(rows, null, 2), }, ], }; } catch (error) { if (error instanceof Error) { return { content: [ { type: 'text', text: `MySQL error: ${error.message}`, }, ], isError: true, }; } throw error; } }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error('MySQL MCP server running on stdio'); } } const server = new MySQLServer(); server.run().catch(console.error);