Skip to main content
Glama
mansigambhir-1313

Jaipuria Moodle Reports MCP

Jaipuria Moodle Reports MCP

Un servidor de Model Context Protocol (MCP) de solo lectura orientado al profesorado que hace que los datos de student-report-system de Jaipuria sean consultables en lenguaje natural. Conéctalo a cualquier host MCP (un panel, Claude.ai, ChatGPT, Claude CLI) y pregunta sobre calificaciones de estudiantes, asistencia, asignaturas, analíticas de cohorte, tendencias longitudinales, estudiantes en riesgo y precisión de informes: cada estudiante ingerido, limitado a los campus del llamante.

En vivo: https://moodle-mcp-f6do.onrender.com/mcp · Salud: /health · Herramientas: 27 Repositorio: github.com/mansigambhir-1313/Moodle-MCP · Propietario: Jaipuria AI Labs


Resumen

El pipeline en moodle-agent ingiere datos de Moodle, calcula analíticas y genera informes de estudiantes validados en un proyecto de Supabase. Este MCP es el lado de lectura de ese proyecto para el profesorado y la oficina de programas: expone los datos brutos y las salidas del pipeline como ~27 herramientas estructuradas y autoaprobables que un LLM host enruta.

Es primero los datos: la superficie principal es el libro de calificaciones y la asistencia brutos (consultables para cada estudiante, tenga informe o no); los informes generados y sus puntuaciones de precisión de dos esquemas son una capa secundaria. Es de solo lectura para siempre: ninguna herramienta escribe, ingiere o envía correos.

Linaje de diseño: los patrones del Rehearsal MCP (cachés acotadas, docstrings de contrato de enrutamiento, presupuestos de respuesta, eliminación de secretos, degradación elegante), adaptados del modelo RLS por estudiante de ese servidor a un modelo de profesorado basado en roles y limitado por campus.

Dónde encaja

  • Aguas arriba: el proyecto compartido de Supabase student-report-system (tablas students, courses, enrolments, marks, attendance_sessions, student_reports, report_accuracy), escrito por moodle-agent.

  • Aguas abajo: cualquier host MCP: un panel para profesorado, conectores de Claude.ai / ChatGPT, Claude CLI.


Related MCP server: VortexIQ MCP Connector

Qué lo hace exclusivo

  • Longitudinal, no solo instantánea — una ejecución contiene cada trimestre (T1–T6). Herramientas como student_trajectory y declining_students detectan a un estudiante que baja trimestre a trimestre, algo que una consulta puntual nunca muestra.

  • Vistas de panel únicostudent_360 y cohort_pulse devuelven un estudiante completo / una cohorte completa en una sola llamada, listas para un cajón de panel o una pantalla de inicio.

  • Precisión como dato de primera clase — cada informe generado lleva una puntuación de validación de dos esquemas (panel de fidelidad + juez LLM de dos turnos). Pregunta "¿qué informes están marcados y por qué?"

  • Señales de enseñanza y currículosection_compare (equidad A-vs-B), assessment_breakdown (cuestionario vs tarea vs proyecto), subject_difficulty (puntos de presión del currículo).


Herramientas (27)

Cada herramienta es solo SELECT, limitada al campus del token del llamante, acotada y lleva un docstring de enrutamiento QUÉ / CUÁNDO USAR / NO USAR / DEVUELVE.

Estudiantes — datos brutos (primario)

Herramienta

Qué devuelve

list_students

Lista de un campus/lote (± sección), cada estudiante ingerido

get_student

Registro completo de un estudiante — calificaciones por componente por asignatura + asistencia

student_marks

Filas planas del libro de calificaciones a nivel de componente para un estudiante

student_attendance

Asistencia por asignatura (presente / sesiones / %) para un estudiante

Asignaturas — datos brutos (primario)

Herramienta

Qué devuelve

list_subjects

Asignaturas/cursos para un ámbito, con trimestre, secciones, matriculación

subject_performance

Calificaciones de la cohorte de una asignatura, tasa de aprobados, asistencia, medias por componente

section_compare

Medias sección-vs-sección + dispersión (señal de enseñanza/calificación)

assessment_breakdown

Rendimiento de la cohorte por tipo de evaluación (cuestionario/tarea/proyecto…)

subject_difficulty

Asignaturas ordenadas de más difícil a menos (tasa de aprobados + ceros)

Información — longitudinal y de panel único (héroe)

Herramienta

Qué devuelve

student_trajectory

Trayectoria de calificaciones/asistencia de un estudiante entre trimestres + etiqueta

student_360

Vista de estudiante en una llamada: percentil, tendencia, banderas de riesgo, precisión

cohort_pulse

KPIs de cohorte en una llamada: calificaciones, asistencia, tasa de aprobados, en riesgo, distribución

watchlist

Lista automática de intervención — razones + acción sugerida, ordenada

declining_students

Mayores caídas de calificaciones trimestre a trimestre en toda la cohorte (alerta temprana)

Analíticas y en riesgo (primario)

Herramienta

Qué devuelve

marks_overview

Instantánea de calificaciones de la cohorte — media, tasa de aprobados, distribución, ceros

attendance_overview

Asistencia de la cohorte — media, recuentos por debajo del 75% / 65%

top_performers

Mayores calificaciones generales en un ámbito

cohort_compare

Medias campus-vs-campus para un lote

at_risk_students

Ranking de riesgo compuesto (ceros + asistencia + calificaciones suspensas)

attendance_watch

Estudiantes por debajo de un umbral de asistencia

zero_alerts

Estudiantes con un cero registrado (más urgente)

Informes y precisión (secundario)

Herramienta

Qué devuelve

get_report_accuracy

Puntuación de precisión de dos esquemas de un informe + interpretación

accuracy_overview

Precisión de la cohorte — % medio, verificado / deriva / marcado

flagged_reports

La cola de revisión humana (informes marcados por validación)

get_student_report

El informe narrativo generado para un estudiante

report_pipeline_status

Recuentos de listo / en espera / fallido para un ámbito

whoami

El principal del llamante y los campus permitidos

Consulta docs/INNOVATION_ROADMAP.md para ideas de la Fase 3 (attendance_eligibility, attendance_marks_link, anomalies, roster_health).


Inicio rápido

Conectar un host (servidor desplegado)

claude mcp add moodle --transport http https://moodle-mcp-f6do.onrender.com/mcp \
  --header "Authorization: Bearer <your MCP_TOKENS value>"

Luego pregunta, en lenguaje natural:

"pulso de cohorte para jaipur 2024-26" · "quién está bajando" · "construye mi watchlist" · "muestra el registro completo de JJ24PG001" · "asignaturas más difíciles" · "compara secciones de Wealth Management"

Ejecutar localmente

cd moodle-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env            # fill in the vars below
uvicorn server:app --port 8899
curl localhost:8899/health      # {"status":"ok",...}

Prueba de humo (handshake MCP real + consultas en vivo)

MCP_URL="http://localhost:8899/mcp" MCP_TOKEN="<a token>" python test_client.py

Configuración

config.py (pydantic-settings, lee .env + variables de entorno). validate_config() es una comprobación de arranque de cierre ante fallos en las variables de Supabase.

Variable

Descripción

Dónde obtenerla

SUPABASE_URL

URL del proyecto de informes (https://sadbfvfcmmxgtatfjfmc.supabase.co)

Supabase → Configuración → API

SUPABASE_SERVICE_ROLE_KEY

Clave de servicio de lectura (solo en el servidor, nunca expuesta)

Supabase → Configuración → API · también en moodle-agent/.env

MCP_TOKENS

Mapa JSON de tokens de profesorado → {name, campuses} (ver abajo)

Tú la generas

MCP_ADMIN_TOKEN

Token de ruptura de cristal para todos los campus (alternativa a MCP_TOKENS)

Tú lo generas

REPORT_PUBLIC_BASE_URL

Base para enlaces de informes (por defecto https://reports.tryrehearsal.ai)

MCP_SERVER_BASE_URL

URL pública de este servicio (opcional)

Panel de Render

Todo el registro va a stderr; las líneas de registro nunca contienen contenidos de tokens ni PII.


Modelo de acceso (basado en roles, limitado por campus)

A diferencia del MCP de estudiantes (RLS por usuario), este sirve al profesorado que ve datos institucionales de sus campus. Un token de portador se asigna a un principal con un conjunto de campus permitidos; cada herramienta interseca el campus solicitado con ese conjunto. Un campus fuera de la concesión devuelve {"found": false} — no hay fugas de datos.

Genera un bloque de token por campus:

python3 -c "import secrets; print('mcp_'+secrets.token_urlsafe(24))"   # one per faculty
// MCP_TOKENS (single-line JSON in the env var)
{
  "mcp_...indore": {"name": "Indore TNP",       "campuses": ["indore"]},
  "mcp_...office": {"name": "Programme Office",  "campuses": null}      // null = all campuses
}

La clave de rol de servicio de Supabase permanece en el servidor y nunca se entrega al host. No hay ruta de escritura en el código.


Arquitectura

MCP host (dashboard / Claude / ChatGPT)
        │  MCP over HTTP + Bearer <faculty token>
        ▼
server.py (FastMCP /mcp, /health)
  get_authenticated_service()  → verify token → MoodleService(allowed_campuses)
        │
  tools/* (6 modules, 27 tools) — each: Params model + _impl(svc,…) + register()
        │  every query .in_("campus", allowed) ; strip_secrets ; response budgets
        ▼
Supabase (read service role) — students · courses · enrolments · marks ·
                               attendance_sessions · student_reports · report_accuracy

Diseño completo: docs/ARCHITECTURE.md.

Archivos clave

Ruta

Propósito

server.py

Aplicación FastMCP, whoami, /health, dependencia de autenticación, cableado de herramientas

config.py

Configuración + validate_config()

supabase_client.py

MoodleService de solo lectura, limitación por campus, resolución de ejecución

tools/common.py

Ayudantes compartidos: courses_for, marks_for, cohort_rollup, cachés

tools/students.py · subjects.py · insights.py

Herramientas de datos primarios

tools/analytics.py · at_risk.py

Resúmenes de cohorte

tools/accuracy.py · reports.py

Capa de informes secundaria

cache.py · guardrails.py · annotations.py

Caché TTL, presupuestos/limitación, sugerencias de herramientas

test_client.py

Prueba de humo de cliente MCP de extremo a extremo

Cachés (seguras contra OOM — solo TTLCache acotada)

_run_cache (última ejecución final por ámbito), _rollup_cache / _marks_cache (resúmenes de datos brutos de cohorte). Las herramientas de cohorte paginan más allá del límite de 1000 filas de PostgREST y almacenan en caché el resultado durante 5 minutos.


Despliegue

  • Render (blueprint render.yaml o Docker): Python 3.12 / Docker, uvicorn server:app, comprobación de salud /health. Configura SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, MCP_TOKENS en el panel.

  • Docker: docker build -t moodle-mcp . && docker run -p 8000:8000 --env-file .env moodle-mcp

  • La producción actual está en la instancia Free (se apaga después de ~15 min de inactividad → ~50s de arranque en frío). Actualiza a Starter para que esté siempre activa.

Entorno

URL

Notas

Producción

https://moodle-mcp-f6do.onrender.com

Instancia Free, main se despliega automáticamente

Local

http://localhost:8899

uvicorn server:app --port 8899

Pasos completos de prueba/despliegue: DEPLOY.md.


Runbooks

Rotar tokens de acceso — regenera MCP_TOKENS (mismo generador), actualiza la variable de entorno de Render; el servicio se reinicia y los tokens antiguos dejan de funcionar. Reemite los nuevos tokens al profesorado.

Añadir un profesor por campus — añade una entrada "mcp_...": {"name": "...", "campuses": ["<campus>"]} a MCP_TOKENS, vuelve a desplegar, entrégales su token.

Añadir una nueva herramienta — sigue docs/ARCHITECTURE.md §11: añade un modelo Params + _impl(svc,…) + register(), limita cada consulta al campus, strip_secrets, escribe el docstring de enrutamiento, registra en server.py. Reutiliza los ayudantes de datos brutos en tools/common.py.

Arranque en frío / primera solicitud lenta — la instancia gratuita se despertó de inactividad (~50s). Caliéntala con curl <url>/health, o mejora la instancia.

Verificar un desplieguecurl <url>/health, luego MCP_URL="<url>/mcp" MCP_TOKEN="<token>" python test_client.py.


Invariantes de seguridad

Solo lectura para siempre · limita cada consulta al campus · fallos uniformes {"found": false} (sin oráculo de existencia) · eliminación de secretos (los ids de ejecución / claves de almacenamiento / hashes / correos nunca salen del servidor) · clave de rol de servicio solo en el servidor · presupuestos de respuesta + paginación · degradación elegante (nunca 500 en el turno) · solo cachés acotadas (seguro contra OOM). Detalle en docs/ARCHITECTURE.md §3, §11.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Read-only access to your VortexIQ store data: audits, KPIs, alerts, Brand DNA, reports, Ask VIQ.

  • Official Microsoft MCP Server to query Microsoft Entra data using natural language

  • Ask your app anything — revenue, errors, read-cost, growth — and get rendered charts back.

View all MCP Connectors

Latest Blog Posts

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/mansigambhir-1313/Moodle-MCP'

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