Saltar al contenido principal

Exemplo 4: MySQL

Neste exemplo conectaremos Claude Desktop a unha base de datos MySQL mediante un servidor MCP. A base de datos executarase nun contedor Docker e o servidor MCP lanzarase tamén con Docker Compose cando Claude o necesite.

O resultado será que poderemos facer preguntas sobre os datos utilizando linguaxe natural, sen escribir directamente as consultas SQL.

Tipo de MCP

Este é un MCP local. O servidor execútase no noso equipo mediante Docker e require Claude Desktop.

Só para prácticas

O exemplo utiliza o contrasinal abc123 directamente no ficheiro Compose para simplificar a práctica. Non uses este contrasinal nin publiques a configuración deste exemplo nun entorno real.

Requisitos​

Necesitamos:

  • Claude Desktop instalado;
  • Docker instalado e en funcionamento;
  • o comando docker compose dispoñible;
  • unha máquina Linux ou un contorno compatible con Docker Desktop.

O procedemento para engadir servidores MCP á aplicación está explicado en Claude Desktop e MCP.

Crear o proxecto​

Creamos un cartafol para o exemplo e, dentro del, outro cartafol chamado init:

mkdir -p ~/mcp-mysql/init
cd ~/mcp-mysql

O cartafol init conterá un script SQL que MySQL executará a primeira vez que se cree a base de datos.

Datos iniciais​

Creamos init/01-aula.sql, que debe ser un script que cree as táboas, o usuario e engada rexistros.

O usuario profesor_mcp só terá permisos de lectura. Así evitamos que as consultas de proba poidan modificar os datos da práctica.

O script só se executa unha vez

Os scripts de init só se executan cando MySQL crea unha base de datos nova. Se xa existe o volume mysql_data, os cambios posteriores no script non se aplicarán automaticamente.

Ficheiro Compose​

Creamos compose.yaml no cartafol mcp-mysql:

services:
mysql:
image: mysql:8.4
container_name: mcp-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: abc123
MYSQL_DATABASE: aula_mcp
ports:
- '127.0.0.1:3307:3306'
volumes:
- mysql_data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d:ro
healthcheck:
test:
- CMD-SHELL
- 'mysqladmin ping -h 127.0.0.1 -uroot -pabc123 --silent'
interval: 10s
timeout: 5s
retries: 10
start_period: 30s

mcp:
image: souhardyak/mcp-db-server:1.3.1
profiles:
- claude
environment:
DATABASE_URL: 'mysql+aiomysql://profesor_mcp:abc123@mysql:3306/aula_mcp?charset=utf8mb4'
PYTHONUNBUFFERED: '1'
depends_on:
mysql:
condition: service_healthy
restart: 'no'

volumes:
mysql_data:

O servizo mysql publica o porto 3307 só no equipo local. Dentro da rede de Compose, o servidor MCP accede á base de datos usando o nome do servizo, mysql, e o porto interno 3306. O contrasinal aparece directamente no Compose porque este é un exemplo sinxelo para un contorno de prácticas.

O servizo mcp ten o perfil claude, polo que non se inicia cando levantamos só a base de datos. Claude lanzarao despois co comando definido na súa configuración.

Iniciar MySQL​

Desde ~/mcp-mysql, iniciamos a base de datos en segundo plano:

docker compose up -d

Comprobamos que o contedor está funcionando:

docker compose ps

O estado de mysql debe aparecer como healthy. A comprobación é importante porque o servidor MCP non debe tentar conectarse antes de que MySQL estea listo.

Configurar Claude Desktop​

Abrimos o ficheiro claude_desktop_config.json desde Axustes → Desarrollador → Editar configuración e engadimos o servidor dentro de mcpServers:

{
"mcpServers": {
"database-server": {
"command": "/usr/bin/docker",
"args": [
"compose",
"-f",
"/home/user/mcp-mysql/compose.yaml",
"--profile",
"claude",
"run",
"--rm",
"-T",
"mcp"
]
}
}
}

Debemos cambiar /home/user/mcp-mysql/compose.yaml pola ruta absoluta onde gardamos o noso ficheiro compose.yaml. A ruta do comando docker tamén pode ser diferente segundo o sistema; podemos consultala con:

which docker

O comando fai o seguinte:

  • compose -f ... selecciona o proxecto e o ficheiro Compose;
  • --profile claude activa o servizo mcp definido para Claude;
  • run --rm -T mcp crea un contedor temporal para o servidor MCP e eliminao ao rematar;
  • -T evita asignar un terminal, porque a comunicación MCP utiliza a entrada e saída estándar do proceso.

Gardamos o ficheiro e reiniciamos completamente Claude Desktop. Ao volver abrilo, o conector database-server debe aparecer entre os conectores MCP.

Consultas de proba​

Podemos comezar cunha pregunta sinxela:

Que táboas existen na base de datos?

Despois podemos probar consultas sobre os datos:

  • Cantos alumnos hai?
  • Mostra os alumnos ordenados polo seu nome.
  • Cantos alumnos hai en cada ciclo?
  • Que alumnos están no segundo curso?
  • Cal é o número medio de alumnos por curso?

Claude debería solicitar permiso antes de utilizar a ferramenta do servidor MCP. Revisamos a operación e aceptámola se a consulta é de lectura e corresponde ao que pedimos.

Claude solicita permiso para executar unha consulta na base de datos

Deter a práctica​

Para deter o contedor de MySQL sen eliminar os datos usamos:

docker compose stop mysql

Para eliminalo xunto coa rede do proxecto usamos:

docker compose down

O volume mysql_data consérvase por defecto. Para comezar de novo cos datos iniciais, eliminando tamén o volume, usamos down -v:

docker compose down -v
Perda de datos

docker compose down -v elimina o volume da base de datos. Utilízao só cando queiras borrar os datos da práctica e executar novamente os scripts de inicialización.

Resumo​

  • MySQL e o servidor MCP execútanse en contedores Docker separados.
  • Compose inicia o servidor MCP só cando Claude o solicita mediante o perfil claude.
  • Os contedores comunícanse usando o nome do servizo mysql e o porto interno 3306.
  • O volume mysql_data conserva a base de datos entre reinicios.
  • O usuario do exemplo ten permisos de lectura para reducir o risco de modificar os datos accidentalmente.