Generates text embeddings using Google Gemini's API for vector-based document similarity and search operations
Stores and retrieves vector embeddings in Supabase using pgvector extension, enabling semantic search and similarity matching across documents
📚 EstudIA MCP Server
Servidor MCP (Model Context Protocol) y API educativa para gestión inteligente de documentos por aula (classroom), búsqueda semántica, OCR, personalización automática del perfil del estudiante y asistente conversacional con RAG.
Estado: Activo · Versión: 2.0.0 · Stack principal: Python · FastMCP · Supabase · Google Gemini
🧠 Visión General
EstudIA MCP convierte un conjunto de documentos educativos (PDF, imágenes, texto plano) en una base de conocimiento consultable mediante:
Ingesta automática y chunking con embeddings.
OCR para imágenes (apuntes, pizarrón, capturas) usando Gemini Vision.
Búsqueda semántica enfocada por aula (classroom) vía funciones RPC en Supabase.
Chat contextual estilo NotebookLM que cita internamente los fragmentos relevantes sin exponer datos técnicos.
Personalización dinámica del estudiante mediante análisis de conversaciones (actualización incremental del
user_context).Herramientas MCP accesibles para agentes o integraciones externas + API HTTP opcional para pruebas rápidas.
✨ Características Clave
🔍 Búsqueda semántica de chunks por aula (
search_similar_chunks).🧩 Procesamiento y almacenamiento automatizado de documentos (
store_document_chunks).🖼️ OCR inteligente para imágenes con Gemini Vision (ver
OCR_FUNCTIONALITY.md).💬 Asistente contextual personalizado por aula (
chat_with_classroom_assistant).👤 Actualización automática del perfil del estudiante (
analyze_and_update_user_context).🧠 Generación de embeddings consistente vía Gemini (
generate_embedding).📦 Arquitectura MCP: cada herramienta lista para ser invocada por clientes compatibles.
🧪 Suite de tests (
test_*.py) para validar ingestión, contexto y herramientas.
🏗️ Arquitectura (Alto Nivel)
Componentes principales:
Gemini: Generación de texto, embeddings y OCR.Supabase: Persistencia (usuarios, documentos, chunks, mensajes) y RPCs de búsqueda vectorial.FastMCP: Registro y exposición de herramientas y prompts.FastAPI(opcional): Capa HTTP para pruebas manuales.
📁 Estructura del Repositorio
Ruta | Descripción |
| Registro de herramientas MCP y lógica principal. |
| Cliente Gemini (texto, embeddings, OCR, análisis). |
| Funciones de acceso y búsquedas contra Supabase. |
| API REST opcional (FastAPI). |
| Carga y validación de variables de entorno. |
| Scripts y dataset de ejemplo ML (legado). |
| Entry de deployment (exporta
). |
| Arranque rápido del servidor MCP. |
| Arranque rápido de la API HTTP. |
| Documentación de la herramienta de contexto. |
| Documentación de OCR. |
| Evolución del flujo de chunking. |
🔐 Variables de Entorno
Crear .env en la raíz (sin comillas):
Nunca publiques
SUPABASE_SERVICE_ROLE_KEYniGEMINI_API_KEY. Usa gestores de secretos en producción.
🧩 Instalación (Local)
Para la API HTTP (si no estuviera ya incluida en requirements.txt):
Crear archivo .env con las claves requeridas.
🚀 Ejecución
Modo MCP (herramientas para agentes)
El objeto mcp expuesto en server.py permite también ejecutar:
Modo HTTP (pruebas REST)
Endpoints clave:
Endpoint | Uso |
| Estado y conectividad. |
| Chat con asistente contextual. |
| Búsqueda semántica de documentos. |
| Recuperar contexto del estudiante. |
🛠️ Herramientas MCP Destacadas
Tool | Propósito |
| Obtiene embedding de un texto. |
| Ingesta completa automática. |
| Recupera fragmentos relevantes. |
| Chat RAG personalizado (usa documentos + perfil). |
| Actualiza perfil educativo. |
Revisa
src/main.pypara parámetros y respuesta detallada de cada herramienta.
🔎 Flujo de Ingesta y Búsqueda
Subes archivo a Supabase Storage y creas registro en
classroom_documents.Llamas
store_document_chunks(classroom_document_id).Se detecta tipo (imagen/PDF/texto) → OCR o extracción.
Limpieza, división en chunks y generación de embeddings.
Inserción en
classroom_document_chunks.Consulta con
search_similar_chunksdurante el chat.
🖼️ OCR (Gemini Vision)
Soporta: JPG, JPEG, PNG, GIF, WEBP, BMP, HEIC/HEIF.
Extrae texto estructurado (intenta mantener párrafos / tablas simples).
Si PDF no tiene texto embebido, intenta fallback OCR.
Ver detalles y buenas prácticas en OCR_FUNCTIONALITY.md.
🧠 Personalización de Estudiantes
La herramienta analyze_and_update_user_context analiza toda la conversación (tabla cubicle_messages) y decide si incorpora nueva información relevante (nivel educativo, estilo de aprendizaje, intereses, objetivos, fortalezas, etc.).
Formato de respuesta y criterios: ver CONTEXT_UPDATE_TOOL.md.
🗄️ Esquema de Datos (Resumen)
Tabla | Campos Clave | Función |
|
,
,
,
| Perfil + contexto enriquecido. |
|
,
,
,
,
| Metadatos de documentos. |
|
,
,
,
,
| Fragmentos indexables. |
|
,
,
,
,
| Conversación para análisis. |
🧪 Pruebas
Instalar pytest si no está:
Tests relevantes:
test_store_document_chunks.py— Ingesta y chunking.test_search_pdf.py/test_pdf_chunks_simple.py— Búsquedas y fragmentación.test_user_context_update.py— Actualización de contexto.test_ocr_functionality.py— Flujo OCR.
Puedes exportar
TESTING=1para omitir validaciones estrictas enconfig.pydurante pruebas controladas.
🧯 Troubleshooting Rápido
Problema | Causa Común | Solución |
Variables faltantes |
incompleto | Revisar sección Variables de Entorno. |
RPC no existe | Función en Supabase no creada | Crear
/
. |
OCR vacío | Imagen ilegible | Mejorar iluminación / resolución. |
Embedding error | Modelo/clave inválida | Verificar
y nombres de modelo. |
Búsqueda sin resultados | Umbral muy alto | Ajustar
(0.5–0.6). |
📈 Roadmap Sugerido
Normalizar nombres (remover referencias fiscales legadas).
.env.exampleen el repositorio.Dockerfile + docker-compose para desarrollo rápido.
CI (GitHub Actions) con lint + tests.
Cache de embeddings para evitar recomputaciones.
Batch ingest para múltiples documentos.
Mejor soporte PDF escaneado multipágina.
Métricas de uso (prometheus / logs estructurados).
🤝 Contribuir
Fork & branch descriptiva (
feat/ocr-batch).Añade tests para nueva lógica pública.
Ejecuta suite (
pytest -q).Haz PR incluyendo descripción clara y motivación.
Estilo: seguir convenciones existentes, mantener español técnico claro. Documenta cambios significativos en este README.
🛡️ Licencia
Si aún no hay licencia definida, se recomienda añadir una (MIT/Apache 2.0). Hasta entonces, el código se considera con derechos reservados del autor original.
📌 Resumen Rápido (TL;DR)
Sube documento → store_document_chunks → chunks + embeddings → search_similar_chunks → chat contextual y personalizable → contexto de estudiante se enriquece con analyze_and_update_user_context.
¿Necesitas añadir Docker / .env.example / scripts de utilidades? Pídelo y lo agrego enseguida.
README generado automáticamente analizando código y docs existentes (2025-11-09).
This server cannot be installed