Provides tools for managing employee data in a PostgreSQL database, including listing employees with optional limits and adding new employees with details like name, position, department, and salary
MCP Test DB — Servidor MCP (FastAPI + SSE) y Cliente Chat LLM
Este proyecto demuestra un flujo completo donde:
Un servidor MCP (basado en FastAPI) expone herramientas para acceder a una base de datos PostgreSQL.
La comunicación cliente-servidor se realiza vía SSE (Server‑Sent Events) usando JSON‑RPC.
Un cliente de chat LLM (
mcp_chat.py) interactúa con el servidor, descubre herramientas y las invoca (p. ej., listar y agregar empleados) para responder en conversación.
Arquitectura
Docker Compose levanta:
company_postgres: Base de datos PostgreSQL inicializada coninit.sql.company_mcp_server: Servidor FastAPI con endpoint SSE en/sse.
El cliente
mcp_chat.py(Python) se conecta al SSE, negociasession_id, y usa un lector en segundo plano para mantener el stream y emparejar respuestas porid.
Herramientas disponibles (MCP)
list_employees(GET): Lista empleados. Parámetros típicos:limit(opcional, int): número máximo de empleados a devolver.
add_employee(POST): Agrega un empleado. Parámetros típicos:name(str),position(str),department(str),salary(number).
La base de datos se inicializa con datos de ejemplo (ver init.sql).
Cliente de Chat LLM (mcp_chat.py)
Carga
.envautomáticamente (viapython-dotenv).Soporta múltiples proveedores de modelos:
OpenAI:
MODEL_PROVIDER=openai,MODEL_NAME=gpt-4o-mini(ejemplo).OpenRouter:
MODEL_PROVIDER=openrouter,MODEL_NAME=meta-llama/llama-3.1-8b-instruct(ejemplo).
Convierte los esquemas de herramientas MCP a formato de “function calling” del proveedor y realiza la llamada real al servidor vía SSE.
Patrón SSE robusto:
Un solo lector en segundo plano mantiene el stream.
Extrae y guarda
session_id.Respuestas se almacenan por
iddel mensaje JSON‑RPC.
Requisitos
Docker y Docker Compose.
Python 3.11+ en tu sistema para ejecutar
mcp_chat.py.Variables de entorno (en
.env):OpenAI:
OPENAI_API_KEY.OpenRouter:
OPENROUTER_API_KEY.Selección de modelo:
MODEL_PROVIDER,MODEL_NAME.
Importante: No publiques tu
.enven repositorios públicos.
Cómo ejecutar
Levantar servidor y base de datos:
docker-compose up -d
Ejecutar el cliente de chat:
python mcp_chat.py
Escribe consultas naturales. Ejemplos:
"Lista los primeros 5 empleados"
"Agrega un empleado llamado Pedro con salario 62000 en Analytics"
El agente decidirá si debe invocar una herramienta (p. ej., list_employees o add_employee). Los resultados reales del servidor se integran a la conversación para producir una respuesta final.
Contenido del repositorio
main.py — Servidor MCP (FastAPI) con endpoint SSE (/sse) y herramientas de base de datos (listar y agregar empleados).
mcp_chat.py — Cliente de chat (LLM + SSE) que descubre y llama herramientas del servidor.
docker-compose.yml — Orquestación de Postgres y servidor MCP.
init.sql — Inicialización de la base de datos.
.env / .env.example — Variables de entorno.
Dockerfile — Imagen del servidor MCP.
pyproject.toml — Dependencias y configuración de Python.
uv.lock — Archivo de lock para uv.
Guía incremental (docs/)
Para compartir con el equipo, consulta los módulos paso a paso:
docs/01-introduccion-mcp.md — Qué es MCP y arquitectura del repo
docs/02-entorno-y-dotenv.md — Preparación de entorno y configuración segura con .env
docs/03-docker-compose-db-server.md — Cómo levantar Postgres y el servidor MCP con Docker Compose
Buenas prácticas SSE
Mantener un único lector SSE para toda la sesión.
Guardar
session_idtrasinitialize.Emparejar cada respuesta JSON‑RPC por
id.No cerrar el stream hasta terminar la sesión.
Solución a problemas comunes
“Falla la conexión SSE”: Verificar que el servidor esté corriendo (
docker-compose ps), firewall y puerto.“Falta la API key”: Asegurar
.envcargado y variables correctas (OPENAI_API_KEYuOPENROUTER_API_KEY).“Timeout esperando respuesta”: Confirmar que no haya múltiples lectores y que el
iddel mensaje se use para emparejar la respuesta.Pydantic v2: Evitar el uso de
model.dict(), usarmodel_dump().
Estado del repositorio
Se eliminaron scripts de prueba antiguos para simplificar el proyecto. La interacción recomendada es a través de mcp_chat.py usando las herramientas del servidor. Documentos de referencia sobre SSE se conservan para apoyo.
This server cannot be installed