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
.env
automá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
id
del 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
.env
en 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_id
trasinitialize
.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
.env
cargado y variables correctas (OPENAI_API_KEY
uOPENROUTER_API_KEY
).“Timeout esperando respuesta”: Confirmar que no haya múltiples lectores y que el
id
del 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
hybrid server
The server is able to function both locally and remotely, depending on the configuration or use case.
Enables interaction with a PostgreSQL database through MCP tools for employee management. Supports listing and adding employees via natural language chat interface with LLM integration.