npm package: @saturninoadrales/mysql-mcp
Description: MySQL MCP Server - Model Context Protocol server for readonly MySQL database operations in Claude Desktop
Author: Saturnino Adrales
Latest version: 1.0.0

# MySQL MCP Server

A Model Context Protocol (MCP) server that provides readonly MySQL database operations for AI agents with support for multiple database servers.

## Features

- **list_servers**: Show all configured MySQL servers
- **list_tables**: List all tables in the database
- **describe_table**: Show table structure and column information
- **query**: Execute SELECT queries (readonly only)
- **show_databases**: List available databases
- **use_database**: Switch to a different database on a server

## Installation

For detailed installation instructions, see [INSTALLATION.md](INSTALLATION.md)

### From npm (once published)
```bash
npm install -g @saturninoadrales/mysql-mcp
```

### From source
```bash
git clone <repository-url>
cd mysql-mcp
npm install
```

## Configuration

### Option 1: Multiple Servers (Recommended)

Configure multiple MySQL servers using a JSON environment variable `MYSQL_SERVERS`:

```json
{
  "production": {
    "host": "prod.example.com",
    "port": 3306,
    "user": "prod_user",
    "password": "prod_password",
    "database": "prod_db"
  },
  "staging": {
    "host": "staging.example.com",
    "port": 3306,
    "user": "staging_user",
    "password": "staging_password",
    "database": "staging_db"
  },
  "local": {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "local_password",
    "database": "test_db"
  }
}
```

### Option 2: Single Server (Backward Compatible)

Copy `.env.example` to `.env` and configure your MySQL connection:

```bash
cp .env.example .env
```

Set the following environment variables:
- `MYSQL_HOST`: MySQL server host (default: localhost)
- `MYSQL_PORT`: MySQL server port (default: 3306)
- `MYSQL_USER`: MySQL username (default: root)
- `MYSQL_PASSWORD`: MySQL password
- `MYSQL_DATABASE`: Database name to connect to

## Usage with Claude Desktop

### Multiple Servers Configuration

**If installed from npm:**
```json
{
  "mcpServers": {
    "mysql": {
      "command": "mysql-mcp",
      "env": {
        "MYSQL_SERVERS": "{\"production\":{\"host\":\"prod.example.com\",\"port\":3306,\"user\":\"prod_user\",\"password\":\"prod_password\",\"database\":\"prod_db\"},\"staging\":{\"host\":\"staging.example.com\",\"port\":3306,\"user\":\"staging_user\",\"password\":\"staging_password\",\"database\":\"staging_db\"}}"
      }
    }
  }
}
```

**If running from source:**
```json
{
  "mcpServers": {
    "mysql": {
      "command": "node",
      "args": ["path/to/mysql-mcp/server.js"],
      "env": {
        "MYSQL_SERVERS": "{\"production\":{\"host\":\"prod.example.com\",\"port\":3306,\"user\":\"prod_user\",\"password\":\"prod_password\",\"database\":\"prod_db\"},\"staging\":{\"host\":\"staging.example.com\",\"port\":3306,\"user\":\"staging_user\",\"password\":\"staging_password\",\"database\":\"staging_db\"}}"
      }
    }
  }
}
```

### Single Server Configuration

```json
{
  "mcpServers": {
    "mysql": {
      "command": "node",
      "args": ["path/to/mysql-mcp/server.js"],
      "env": {
        "MYSQL_HOST": "localhost",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "your_username",
        "MYSQL_PASSWORD": "your_password",
        "MYSQL_DATABASE": "your_database"
      }
    }
  }
}
```

## Using Multiple Servers

When multiple servers are configured, all tools accept an optional `server` parameter:

```javascript
// List tables from production server
await list_tables({ server: "production" })

// Query staging server
await query({ 
  sql: "SELECT * FROM users LIMIT 10",
  server: "staging"
})

// Describe table on local server
await describe_table({ 
  table_name: "products",
  server: "local"
})

// If no server is specified, "default" is used
await list_tables() // Uses "default" server
```

## Security

This server only allows readonly operations (SELECT, SHOW, DESCRIBE) for safety. All other SQL operations are blocked.