MySQL-MCP

MySQL-MCP

Un potente conector de base de datos MySQL para Claude creado con el Protocolo de Contexto de Modelo (MCP)

MySQL-MCP le brinda a Claude acceso directo a sus bases de datos MySQL mediante el Protocolo de Contexto de Modelo. Proporciona un conjunto completo de herramientas para consultar, modificar y explorar sus bases de datos con instrucciones sencillas en lenguaje natural.

Características

  • Ejecución de consultas : ejecute cualquier consulta SQL en su base de datos
  • Explicación de la consulta : Obtenga planes detallados de ejecución de consultas
  • Exploración de esquemas : ver bases de datos, tablas y definiciones de columnas
  • Inspección de datos : vista previa del contenido de la tabla con filas de muestra
  • La seguridad es lo primero : controles para evitar la pérdida accidental de datos
  • Mejores prácticas : indicaciones integradas para ayudar a Claude a escribir SQL óptimo
  • Registro completo : registro exhaustivo de todas las operaciones

Instalación

Hay varias formas de instalar MySQL-MCP:

Opción 1: Instalar desde la fuente con pip

# Clone the repository git clone https://github.com/yourusername/mysql-mcp.git cd mysql-mcp # Create a virtual environment (recommended) python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate # Install requirements pip install -r requirements.txt

Opción 2: Instalar como paquete de desarrollo

git clone https://github.com/yourusername/mysql-mcp.git cd mysql-mcp pip install -e .

Opción 3: Instalar con FastMCP (para la integración de Claude)

Primero, instale FastMCP:

pip install fastmcp

Luego instale el paquete MySQL-MCP:

# From a local copy fastmcp install mysql_mcp.py # Or directly from GitHub fastmcp install https://github.com/yourusername/mysql-mcp/mysql_mcp.py

Inicio rápido

# mysql_mcp.py from fastmcp import FastMCP import mysql.connector from mysql.connector import Error import os from dotenv import load_dotenv from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any # Load environment variables load_dotenv() # Initialize FastMCP app mcp = FastMCP( "MySQL MCP", description="MySQL database connector for Claude", dependencies=["mysql-connector-python", "python-dotenv"] ) # Database connection configuration class DBConfig(BaseModel): host: str = Field(default=os.getenv("MYSQL_HOST", "localhost")) port: int = Field(default=int(os.getenv("MYSQL_PORT", "3306"))) user: str = Field(default=os.getenv("MYSQL_USER", "root")) password: str = Field(default=os.getenv("MYSQL_PASSWORD", "")) database: Optional[str] = Field(default=os.getenv("MYSQL_DATABASE")) # Global connection state current_db = os.getenv("MYSQL_DATABASE", "") config = DBConfig() def get_connection(): """Create a MySQL connection using the current configuration""" try: conn = mysql.connector.connect( host=config.host, port=config.port, user=config.user, password=config.password, database=config.database if config.database else None ) return conn except Error as e: raise Exception(f"Database connection error: {e}") @mcp.tool() def query_sql(query: str) -> Dict[str, Any]: """Execute a SELECT query and return the results""" conn = get_connection() cursor = conn.cursor(dictionary=True) try: cursor.execute(query) results = cursor.fetchall() return { "rows": results[:100], # Limit to 100 rows for safety "row_count": cursor.rowcount, "column_names": [desc[0] for desc in cursor.description] if cursor.description else [] } except Error as e: raise Exception(f"Query error: {e}") finally: cursor.close() conn.close() @mcp.tool() def execute_sql(query: str) -> Dict[str, Any]: """Execute a non-SELECT query (INSERT, UPDATE, DELETE, etc.)""" conn = get_connection() cursor = conn.cursor() try: cursor.execute(query) conn.commit() return { "affected_rows": cursor.rowcount, "last_insert_id": cursor.lastrowid if cursor.lastrowid else None } except Error as e: conn.rollback() raise Exception(f"Query error: {e}") finally: cursor.close() conn.close() @mcp.tool() def explain_sql(query: str) -> Dict[str, Any]: """Get the execution plan for a query""" conn = get_connection() cursor = conn.cursor(dictionary=True) try: cursor.execute(f"EXPLAIN {query}") results = cursor.fetchall() return { "plan": results } except Error as e: raise Exception(f"EXPLAIN error: {e}") finally: cursor.close() conn.close() @mcp.tool() def show_databases() -> Dict[str, Any]: """List all available databases""" conn = get_connection() cursor = conn.cursor() try: cursor.execute("SHOW DATABASES") results = cursor.fetchall() return { "databases": [db[0] for db in results] } except Error as e: raise Exception(f"Error listing databases: {e}") finally: cursor.close() conn.close() @mcp.tool() def use_database(database: str) -> Dict[str, Any]: """Switch to a different database""" global config, current_db # Verify database exists conn = get_connection() cursor = conn.cursor() try: cursor.execute("SHOW DATABASES") dbs = [db[0] for db in cursor.fetchall()] if database not in dbs: raise ValueError(f"Database '{database}' does not exist") # Update configuration config.database = database current_db = database return { "current_database": database, "status": "success" } except Error as e: raise Exception(f"Error changing database: {e}") finally: cursor.close() conn.close() @mcp.tool() def show_tables() -> Dict[str, Any]: """List all tables in the current database""" if not config.database: raise ValueError("No database selected. Use 'use_database' first.") conn = get_connection() cursor = conn.cursor() try: cursor.execute("SHOW TABLES") results = cursor.fetchall() return { "database": config.database, "tables": [table[0] for table in results] } except Error as e: raise Exception(f"Error listing tables: {e}") finally: cursor.close() conn.close() @mcp.tool() def describe_table(table: str) -> Dict[str, Any]: """Get column definitions for a table""" if not config.database: raise ValueError("No database selected. Use 'use_database' first.") conn = get_connection() cursor = conn.cursor(dictionary=True) try: cursor.execute(f"DESCRIBE {table}") columns = cursor.fetchall() # Get index information cursor.execute(f"SHOW INDEX FROM {table}") indexes = cursor.fetchall() return { "table": table, "columns": columns, "indexes": indexes } except Error as e: raise Exception(f"Error describing table: {e}") finally: cursor.close() conn.close() @mcp.resource(f"schema://{'{database}'}") def get_database_schema(database: Optional[str] = None) -> str: """Get the full schema of a database as a resource""" db_to_use = database or config.database if not db_to_use: raise ValueError("No database specified or selected") conn = get_connection() cursor = conn.cursor() schema = [] try: # Switch to the specified database cursor.execute(f"USE {db_to_use}") # Get all tables cursor.execute("SHOW TABLES") tables = [table[0] for table in cursor.fetchall()] # Get CREATE TABLE statements for each table for table in tables: cursor.execute(f"SHOW CREATE TABLE {table}") create_stmt = cursor.fetchone()[1] schema.append(create_stmt) return "\n\n".join(schema) except Error as e: raise Exception(f"Error getting schema: {e}") finally: cursor.close() conn.close() @mcp.prompt() def write_query_for_task(task: str) -> str: """Help Claude write an optimal SQL query for a given task""" return f"""Task: {task} Please write an SQL query that accomplishes this task efficiently. Some guidelines: 1. Use appropriate JOINs (INNER, LEFT, RIGHT) based on the data relationships 2. Filter data in the WHERE clause to minimize data processing 3. Consider using indexes for better performance 4. Use appropriate aggregation functions when needed 5. Format the query with clear indentation for readability If you need to see the database schema first, you can access it using the schema:// resource. """ @mcp.prompt() def analyze_query_performance(query: str) -> str: """Help Claude analyze the performance of a query""" return f"""Query: {query} Please analyze this query for performance issues: 1. First, use the explain_sql tool to get the execution plan 2. Look for table scans instead of index usage 3. Check if the joins are efficient 4. Identify if the query can be optimized with better indexes 5. Suggest concrete improvements to make the query more efficient """ if __name__ == "__main__": # Run the server directly mcp.run()

Configuración del entorno

Cree un archivo .env con los detalles de su conexión MySQL:

MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=your_password MYSQL_DATABASE=initial_database

Corriendo con Claude

  1. Si aún no lo ha hecho, instale su aplicación MySQL MCP en Claude:
fastmcp install mysql_mcp.py
  1. En Claude, seleccione la herramienta MySQL MCP del selector de herramientas
  2. Ahora puedes pedirle a Claude que:
    • "Muéstrame todas las bases de datos disponibles"
    • "¿Qué tablas hay en la base de datos de clientes?"
    • Consultar todos los pedidos realizados la última semana
    • "Muéstrame el esquema de la tabla de usuarios"
    • "Ayúdame a optimizar esta consulta lenta: SELECT * FROM orders JOIN users ON user_id WHERE status = 'pending'"

Ejecutando localmente

También puede ejecutar el servidor MCP localmente para el desarrollo:

# Run directly python mysql_mcp.py # Or use FastMCP development mode fastmcp dev mysql_mcp.py

Uso avanzado

Conexión a múltiples bases de datos

Puede crear configuraciones para múltiples bases de datos y alternar entre ellas:

@mcp.tool() def save_connection(name: str, host: str, port: int, user: str, password: str, database: Optional[str] = None) -> Dict[str, Any]: """Save a named database connection configuration""" # Implementation details...

Soporte de transacciones

Para operaciones que necesitan ser atómicas:

@mcp.tool() def run_transaction(queries: List[str]) -> Dict[str, Any]: """Run multiple queries in a single transaction""" # Implementation details...

Análisis de esquemas

Proporcionar información más profunda sobre la estructura de la base de datos:

@mcp.tool() def analyze_table_relationships() -> Dict[str, Any]: """Analyze foreign key relationships between tables""" # Implementation details...

Consideraciones de seguridad

  • MySQL-MCP ejecuta SQL directamente en su base de datos
  • Proporcionar acceso únicamente a las bases de datos a las que Claude debería tener acceso
  • Considere usar un usuario de solo lectura por seguridad
  • Revise todas las consultas antes de la ejecución cuando trabaje con datos de producción
  • Limite los permisos de conexión según el principio del mínimo privilegio

Solución de problemas

Si encuentra problemas:

  1. Verifique su archivo .env para verificar las credenciales de base de datos correctas
  2. Verifique que el servidor MySQL esté ejecutándose y sea accesible
  3. Consulte el archivo de registro ( mysql_mcp.log ) para obtener información detallada del error
  4. Asegúrese de que todas las dependencias estén instaladas: pip install -r requirements.txt

Contribuyendo

¡Agradecemos sus contribuciones! No dude en enviar una solicitud de incorporación de cambios.

Licencia

Instituto Tecnológico de Massachusetts (MIT)


Creado con FastMCP , la forma rápida y Pythonic de crear servidores de Protocolo de Contexto de Modelo.

-
security - not tested
-
license - not tested
-
quality - not tested

Un conector que le brinda a Claude acceso directo a las bases de datos MySQL a través del Protocolo de Contexto de Modelo, lo que permite consultas en lenguaje natural, exploración de esquemas y administración de bases de datos.

  1. Features
    1. Installation
      1. Option 1: Install from Source with pip
      2. Option 2: Install as a Development Package
      3. Option 3: Install with FastMCP (for Claude integration)
    2. Quick Start
      1. Environment Setup
        1. Running with Claude
          1. Running Locally
            1. Advanced Usage
              1. Connecting to Multiple Databases
              2. Transaction Support
              3. Schema Analysis
            2. Security Considerations
              1. Troubleshooting
                1. Contributing
                  1. License
                    ID: zj4o6qzs3g