Restaurante MCP
Proyecto de gestión de un restaurante implementado con arquitectura de microservicios básica, utilizando Java con Spring Boot para el backend y MySQL como base de datos, todo orquestado con Docker Compose.
Tecnologías del Stack
| Componente | Tecnología | Descripción |
|---|---|---|
| Backend | Java 17, Spring Boot 3.x | Implementación de la API REST. |
| Base de Datos | MySQL 9 | Almacenamiento persistente del esquema relacional. |
| Orquestación | Docker Compose | Entorno de desarrollo aislado y reproducible. |
| Lenguaje de Estructura | SQL | Script de inicialización del esquema de la base de datos. |
Dependencias del Backend
El backend utiliza las siguientes dependencias principales organizadas por categoría:
Framework Principal
| Dependencia | Versión | Descripción |
|---|---|---|
| Spring Boot Starter Web | 3.5.6 | Framework web que incluye Tomcat, Spring MVC y validación |
| Spring Boot Starter Data JPA | 3.5.6 | Acceso a datos con JPA/Hibernate y Spring Data |
Base de Datos
| Dependencia | Versión | Descripción |
|---|---|---|
| MySQL Connector Java | 8.0.33 | Driver JDBC para conectividad con MySQL |
MCP (Model Context Protocol)
| Dependencia | Versión | Descripción |
|---|---|---|
| Spring AI MCP Server Starter | 1.0.3 | Implementación del servidor MCP para Spring Boot |
Testing
| Dependencia | Versión | Descripción |
|---|---|---|
| Spring Boot Starter Test | 3.5.6 | Suite de testing que incluye JUnit, Mockito, AssertJ |
| JUnit BOM | 5.10.0 | Bill of Materials para gestión de versiones JUnit |
| JUnit Jupiter | 5.10.0 | Motor de testing moderno para JUnit 5 |
| JUnit Platform Launcher | - | Launcher para ejecutar tests en runtime |
Herramientas de Build
| Herramienta | Versión | Descripción |
|---|---|---|
| Gradle | Wrapper | Sistema de build y gestión de dependencias |
| Java Toolchain | 17 | Versión de Java utilizada para compilación y ejecución |
Estructura del Proyecto
El proyecto está organizado en módulos que separan las responsabilidades:
backend/: Contiene el código fuente de la aplicación Spring Boot.db/: Contiene los scripts SQL para la inicialización de la base de datos (e.g.,init.sql).infra/: Contiene los archivos de configuración de infraestructura (.env.dev.example,compose.dev.yml).
Arquitectura del sistema
El siguiente diagrama ilustra la arquitectura de la solución, mostrando cómo Docker Compose orquesta los servicios clave y el flujo de datos.
El Usuario/Host accede a la API REST del Backend a través del puerto expuesto (BACKEND_PORT). Una vez dentro de la orquestación, el Backend se conecta al Servicio DB mediante el protocolo JDBC, completando el ciclo de petición y respuesta.
graph TD
A[Usuario/Host]
subgraph DOCKER_COMPOSE[Orquestación Docker Compose]
style DOCKER_COMPOSE stroke:#00BCD4,stroke-width:2px
C("**servicio backend**
Spring Boot
puerto 8080")
D("**servicio db**
MySQL 9
puerto 3306")
C -->|"[JDBC]"| D
end
A -->|"[JSON/HTTP]
puerto BACKEND_PORT "| CVariables de entorno
El archivo infra/.env.dev.example define las siguientes variables utilizadas por Docker Compose y la aplicación backend. Deben ser copiadas y configuradas en infra/.env.dev antes de la ejecución.
| Variable | Servicio | Descripción | Valor Ejemplo |
|---|---|---|---|
| MYSQL_ROOT_PASSWORD | DB | Contraseña del usuario root de MySQL. | root |
| MYSQL_DATABASE | DB | Nombre de la base de datos de la aplicación. | restaurante |
| MYSQL_USER | DB / Backend | Usuario para la conexión del backend a la DB. | restaurante_user |
| MYSQL_PASSWORD | DB / Backend | Contraseña del usuario de conexión. | restaurante_pass |
| MYSQL_PORT | DB | Puerto que se expone para acceder a MySQL desde el host. | 21911 |
| BACKEND_PORT | Backend | Puerto que se expone para acceder al servicio Spring Boot. | 21921 |
| SPRING_JPA_HIBERNATE_DDL_AUTO | Backend | Estrategia de gestión del esquema de la DB por Hibernate. | update |
| SPRING_JPA_SHOW_SQL | Backend | Muestra las sentencias SQL generadas en la consola. | true |
Ejecutar el entorno de desarrollo
- Copiar y Configurar Variables de Entorno:
Copiar el archivo de ejemplo para crear la configuración local de desarrollo.
cp infra/.env.dev.example infra/.env.devEditar el archivo infra/.env.dev para ajustar las variables de entorno, como puertos y credenciales de la base de datos, si es necesario.
- Levantar Servicios:
Para construir y levantar ambos servicios (db y backend) en modo *detached* (segundo plano), utilizar el siguiente comando:
docker compose -f infra/compose.dev.yml --env-file infra/.env.dev up --build -d- Verificar Servicios:
Para verificar que los servicios están corriendo correctamente, utilizar:
docker compose -f infra/compose.dev.yml --env-file infra/.env.dev ps- Acceder a la API REST:
La API REST del backend estará disponible en *http://localhost:*, donde ` es el puerto configurado en el archivo .env.dev`.
- Detener Servicios:
Para detener y eliminar los contenedores (manteniendo los volúmenes), utilizar:
docker compose -f infra/compose.dev.yml --env-file infra/.env.dev downPara detener y eliminar los contenedores, redes y volúmenes creados por Docker Compose, utilizar:
docker compose -f infra/compose.dev.yml --env-file infra/.env.dev down -vBase de datos
El servicio de base de datos se inicializa automáticamente en el primer arranque a partir del script db/init.sql.
Diagrama Entidad-Relación (ERD)
erDiagram
PLATOS {
BIGINT plato_id PK
VARCHAR tipo
VARCHAR nombre
TEXT descripcion
}
MENUS {
BIGINT menu_id PK
TEXT descripcion
DATE fecha
}
PLATOS_MENU {
BIGINT menu_id PK, FK
BIGINT plato_id PK, FK
DECIMAL precio "DECIMAL(10,2)"
}
VENTAS {
BIGINT venta_id PK
DATE fecha
}
VENTAS_MENU {
BIGINT menu_id PK, FK
BIGINT venta_id PK, FK
INT cantidad
}
%% Relaciones
PLATOS ||--o{ PLATOS_MENU : "contiene"
MENUS ||--o{ PLATOS_MENU : "incluye"
MENUS ||--o{ VENTAS_MENU : "se vende en"
VENTAS ||--o{ VENTAS_MENU : "registra"Modo MCP con Claude Desktop
Este proyecto implementa un servidor MCP (Model Context Protocol) que permite a Claude Desktop interactuar directamente con la base de datos del restaurante a través de herramientas especializadas.
Herramientas MCP disponibles
| Herramienta | Descripción | Parámetros |
|---|---|---|
list_dishes | Lista todos los platos disponibles | - |
get_dish_by_id | Obtiene un plato específico por ID | id: Long |
create_dish | Crea un nuevo plato | name: String, description: String, type: String |
update_dish | Actualiza un plato existente | id: Long, name: String, description: String, type: String |
delete_dish | Elimina un plato por ID | id: Long |
Instalación de Claude Desktop en Arch Linux
Opción 1: Usando AUR
# Instalar claude-desktop-native (más estable)
yay -S claude-desktop-native
# O alternativamente
yay -S claude-desktop-binCompilación standalone
Para usar el servidor MCP, necesitas compilar un JAR standalone:
# Navegar al directorio del backend
cd backend
# Compilar el JAR standalone
./gradlew bootJar
# Verificar que se generó el archivo
ls -la build/libs/backend-1.0-SNAPSHOT.jarConfiguración claude_desktop_config.json
- Crear el directorio de configuración de Claude Desktop:
mkdir -p ~/.config/Claude- Crear el archivo de configuración:
nano ~/.config/Claude/claude_desktop_config.json- Contenido del archivo de configuración:
Remplaza /ruta/absoluta/a/tu/proyecto con la ruta real del proyecto en tu sistema y ajusta las variables de entorno según tu configuración.
{
"mcpServers": {
"restaurant-mcp": {
"command": "java",
"args": [
"-Dspring.profiles.active=mcp",
"-jar",
"/ruta/absoluta/a/tu/proyecto/backend/build/libs/backend-1.0-SNAPSHOT.jar"
],
"env": {
"SPRING_DATASOURCE_URL": "jdbc:mysql://localhost:21911/restaurante",
"SPRING_DATASOURCE_USERNAME": "restaurante_user",
"SPRING_DATASOURCE_PASSWORD": "restaurante_pass",
"SPRING_JPA_HIBERNATE_DDL_AUTO": "update",
"SPRING_JPA_SHOW_SQL": "false"
}
}
}
}- Ajustar la ruta del JAR en la configuración JSON para que coincida con la ubicación real de tu proyecto.
- Reiniciar Claude Desktop para cargar la nueva configuración.
Uso con Claude Desktop
Una vez configurado, puedes usar comandos naturales en Claude Desktop como:
- *"Lista todos los platos del restaurante"*
- *"Crea un nuevo plato llamado 'Paella Valenciana' de tipo 'Plato Principal' con descripción 'Arroz con mariscos y pollo'"*
- *"Busca el plato con ID 2"*
- *"Actualiza el plato con ID 3 cambiando su nombre a 'Tiramisú Clásico'"*
- *"Elimina el plato con ID 1"*
Profiles de Spring Boot
El proyecto utiliza profiles para separar las configuraciones:
- Profile por defecto (
application.properties): Modo servlet web con logs normales - Profile
mcp(application-mcp.properties): Modo STDIO sin servidor web, logs silenciados para comunicación JSON limpia con Claude Desktop
Solución de problemas
- Verificar que MySQL esté corriendo:
docker ps | grep restaurante_db_dev- Verificar logs de Claude Desktop:
claude-desktop-native