Skip to main content
Glama

MCP Test DB Server

by ckamilokoo

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 con init.sql.

    • company_mcp_server: Servidor FastAPI con endpoint SSE en /sse.

  • El cliente mcp_chat.py (Python) se conecta al SSE, negocia session_id, y usa un lector en segundo plano para mantener el stream y emparejar respuestas por id.

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 (via python-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

  1. Levantar servidor y base de datos:

    • docker-compose up -d

  2. Ejecutar el cliente de chat:

    • python mcp_chat.py

  3. 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 tras initialize.

  • 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 u OPENROUTER_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(), usar model_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.

-
security - not tested
F
license - not found
-
quality - not tested

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ckamilokoo/mcp_template'

If you have feedback or need assistance with the MCP directory API, please join our Discord server