Skip to main content
Glama
Tomaslopera

Laboratorio MCP Gateway

by Tomaslopera
README.md
# Laboratorio MCP — Integración con Claude Desktop

## Descripción

Este laboratorio implementa una integración completa del **Model Context Protocol (MCP)**, conectando múltiples microservicios (ventas y pedidos) a través de un **gateway** central.  
El sistema permite que **Claude Desktop** invoque herramientas MCP locales mediante comunicación STDIO.

## Estructura del proyecto

```bash
packages/
├─ mcp-ventas-node/     → Servidor Node.js que maneja operaciones de ventas
├─ mcp-pedidos-py/      → Servidor Python que gestiona pedidos
└─ mcp-gateway/         → Gateway que expone ambos servicios como un único MCP
```

---

## Pasos de ejecución

### Iniciar la base de datos

Ejecuta el contenedor PostgreSQL:

```bash
docker compose up -d
```
> Esto levanta una instancia con las credenciales
```bash
Host: localhost
Puerto: 5433
Usuario: postgres
Contraseña: postgres
Base de datos: mcp_lab
```

### Ejecutar los servidores de negocio

> Servidor de pedidos (Python)
```bash
cd packages/mcp-pedidos-py
source .venv/bin/activate
python3 server.py
```

> Servidor ventas (Node.js)
```bash
cd packages/mcp-ventas-node
npm run build
node dist/server.js
```

### Gateway MCP

> Este gateway conecta ambos microservicios el ecosistema MCP
```bash
cd packages/mcp-gateway
chmod +x run-gateway.sh
./run-gateway.sh
```

> Debería salir un mensaje como este
```bash
[ventas] DB mode=postgres
[pedidos] INFO DB mode=postgres
```

### Integración con Claude Desktoop

> Crea o edita el archivo
```bash
nano ~/Library/Application\ Support/Claude/claude_desktop_config.json
```

> Debería salir un mensaje como este
```bash
{
  "mcpServers": {
    "mcp-gateway": {
      "command": "/TuDireccion/Laboratorio MCP/packages/mcp-gateway/run-gateway.sh",
      "args": []
    }
  }
}
```

> Nota: para la implementación en MAC se le debe dar permisos a Claude Desktop para acceder al disco

## Claude Desktop

![Claude conectado](./docs/Claude1.png)

![Claude herramientas](./docs/Claude2.png)

![Claude consultas](./docs/Claude3.png)