MySQL MCP服务器

MySQL MCP Server是基于Model Context Protocol的数据库读写服务器,支持多种传输协议,可管理多个数据库连接。

  • by nakoukal
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 nakoukal/mcp-server-mysql

使用说明

MySQL MCP Server

MySQL MCP Server poskytující čtecí i zápisové operace do databáze skrze Model Context Protocol.

O projektu

Server je postaven na FastMCP a aiomysql s connection poolingem. Podporuje více transportů (stdio, SSE, HTTP) a umožňuje pracovat s více databázemi v rámci jednoho připojení.

MCP nástroje

Nástroj Popis Typ operace
list_databases Seznam všech databází na serveru Metadata
change_database Přepnutí aktivní databáze Konfigurace
query_data Spuštění SELECT dotazů s automatickým limitem Čtení
execute_write Spuštění INSERT / UPDATE / DELETE v transakci Zápis
list_tables Seznam tabulek v databázi Metadata
get_schema Detailní schéma tabulky včetně komentářů Metadata

Parametry nástrojů

query_data(query, limit=100, database=None)
execute_write(query, params=None, database=None)
list_tables(database=None)
get_schema(table_name, database=None)

Parametr database je volitelný u všech nástrojů — umožňuje dotaz na jinou než aktivní databázi bez změny globálního kontextu.

MCP Resources

Resource Popis
mysql://status Health check databázového serveru
mysql://tables Rychlý výpis tabulek jako text

Rychlý start (lokálně)

1. Klonování

git clone <repo-url> mysql-mcp-server
cd mysql-mcp-server

2. Virtuální prostředí

python3 -m venv venv
source venv/bin/activate          # Linux/macOS
# venv\Scripts\Activate.ps1       # Windows (PowerShell)

3. Instalace závislostí

pip install -r requirements.txt

4. Konfigurace

Vytvoř .env soubor podle vzoru:

cp .env.example .env
DB_HOST=localhost
DB_PORT=3306
DB_USER=your_user
DB_PASSWORD=your_password
DB_NAME=your_database   # volitelné — lze změnit za běhu přes change_database
DEBUG_MODE=false

5. Spuštění

# STDIO (výchozí — pro Claude Desktop a Claude Code)
./start_server.sh

# SSE (pro Langflow a webové aplikace)
./start_server.sh --transport sse --port 8000

# HTTP
./start_server.sh --transport streamable-http --port 8000

Nebo přímo Pythonem:

python mysql_server.py --transport stdio
python mysql_server.py --transport sse --port 8000
python mysql_server.py --transport streamable-http --port 8000

Konfigurace pro Claude Desktop

Soubor claude_desktop_config.json přidej do:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "mysql": {
      "command": "/abs/cesta/k/venv/bin/python",
      "args": ["/abs/cesta/k/mysql_server.py"],
      "env": {
        "DB_HOST": "localhost",
        "DB_PORT": "3306",
        "DB_USER": "your_user",
        "DB_PASSWORD": "your_password",
        "DB_NAME": "your_database",
        "DEBUG_MODE": "false"
      }
    }
  }
}

Nebo s .env souborem (doporučeno pro bezpečnost):

{
  "mcpServers": {
    "mysql": {
      "command": "/abs/cesta/k/venv/bin/python",
      "args": ["/abs/cesta/k/mysql_server.py"],
      "cwd": "/abs/cesta/k/mysql-mcp-server"
    }
  }
}

Příklady použití

Čtení dat

# Seznam tabulek
await mcp_client.call_tool("list_tables")

# Schema tabulky
await mcp_client.call_tool("get_schema", {"table_name": "users"})

# SELECT dotaz
await mcp_client.call_tool("query_data", {
    "query": "SELECT * FROM users WHERE active = 1",
    "limit": 50
})

# Dotaz na jinou databázi bez změny globálního kontextu
await mcp_client.call_tool("query_data", {
    "query": "SELECT COUNT(*) FROM logs",
    "database": "analytics_db"
})

Zápis dat

# INSERT — přímý dotaz
await mcp_client.call_tool("execute_write", {
    "query": "INSERT INTO users (name, email) VALUES ('Jan', 'jan@example.com')"
})

# INSERT — parametrizovaný (doporučeno, ochrana před SQL injection)
await mcp_client.call_tool("execute_write", {
    "query": "INSERT INTO users (name, email) VALUES (%s, %s)",
    "params": ["Jan", "jan@example.com"]
})

# UPDATE
await mcp_client.call_tool("execute_write", {
    "query": "UPDATE users SET active = 0 WHERE last_login < %s",
    "params": ["2024-01-01"]
})

# DELETE
await mcp_client.call_tool("execute_write", {
    "query": "DELETE FROM sessions WHERE expires_at < NOW()"
})

Odpověď execute_write:

{
  "success": true,
  "message": "Query executed successfully",
  "query": "INSERT INTO users ...",
  "database": "my_db",
  "affected_rows": 1,
  "last_insert_id": 42
}

Práce s více databázemi

# Trvalá změna aktivní databáze
await mcp_client.call_tool("change_database", {"database_name": "production_db"})

# Jednorázový dotaz na jinou databázi
await mcp_client.call_tool("list_tables", {"database": "analytics_db"})

Bezpečnost

query_data (SELECT)

  • Povoleny pouze SELECT dotazy
  • Automatický LIMIT pokud chybí
  • SQL injection ochrana přes aiomysql

execute_write (INSERT / UPDATE / DELETE / REPLACE)

  • Povoleny pouze DML operace — DDL (CREATE, DROP, ALTER) jsou blokovány
  • Každý dotaz běží v explicitní transakci; při chybě se automaticky provede ROLLBACK
  • Podporuje parametrizované dotazy (params) pro bezpečné předávání hodnot

Obecně

  • Connection pooling s omezeným počtem spojení
  • Konfigurace přes .env (neverzovaný soubor)
  • Logy na stderr, žádná citlivá data v chybových zprávách

Testování

# Aktivuj venv
source venv/bin/activate

# Testy připojení a základních operací
python tests/test_live_mysql.py

# Test přepínání databází
python tests/test_database_switching.py

# Test bez výchozí databáze
python tests/test_no_default_database.py

# Test STDIO transportu
python tests/test_stdio_transport.py

Docker

Build a spuštění

docker build -t mysql-mcp-server .

docker run -d \
  --name mysql-mcp-server \
  --network mynet \
  -p 8000:8000 \
  --env-file .env \
  mysql-mcp-server

Docker Compose

services:
  mysql-mcp-server:
    build: .
    ports:
      - "8000:8000"
    env_file:
      - .env
    networks:
      - mynet
    restart: unless-stopped

networks:
  mynet:
    external: true

Správa kontejneru

docker logs -f mysql-mcp-server
docker restart mysql-mcp-server
docker exec -it mysql-mcp-server bash

Langflow integrace

  1. Spusť server v SSE módu:

    python mysql_server.py --transport sse --port 8000
    
  2. V Langflow MCP Connection komponentě:

    • SSE URL: http://<HOST_IP>:8000/sse
    • Transport: sse
  3. Zjištění IP adresy hosta:

    hostname -I | awk '{print $1}'
    

Struktura projektu

mysql-mcp-server/
├── mysql_server.py          # Hlavní MCP server
├── start_server.sh          # Startovací skript
├── requirements.txt         # Python závislosti
├── pyproject.toml
├── Dockerfile
├── .env.example             # Vzorová konfigurace
├── claude_desktop_config.json  # Vzorová konfigurace pro Claude Desktop
├── tests/
│   ├── test_live_mysql.py
│   ├── test_database_switching.py
│   ├── test_no_default_database.py
│   ├── test_stdio_transport.py
│   └── ...
└── CLAUDE_SETUP.md          # Průvodce nastavením pro Claude Desktop / Claude Code