dutic-mcp
Task Management: List upcoming or all tasks, including hidden ones not shown on the standard calendar. Get full assignment details with instructions, attachments, due dates, and automatic date conflict detection. View course-specific tasks.
Grades & Academic Records: View grade summaries or detailed per-course item-by-item grades. Fetch official partial grades from SISACAD and compare them with Moodle grades to identify discrepancies.
Course Content & Materials: List enrolled courses with their teachers. Browse course sections and modules. Download all course materials, auto-convert PDFs to Markdown for offline study, and read resource contents as Markdown. Bulk download course files to a local directory.
People & Profiles: List participants of a course with roles, groups, and last access. Search for a person by name or email across courses. View detailed profiles with shared courses, and identify course teachers. Check your own profile.
Monitoring & Changes: Detect new or changed tasks, grades, submission statuses, and deadline changes since your last review.
Exploration: Fetch any Moodle page via URL to access information beyond the standard tools, returning content as text, HTML, or links.
Session Management: Check session status, refresh your session (including via Google SSO), and perform initial browser login.
Allows interaction with the DUTIC (Moodle) virtual classroom of UNSA, providing tools to list tasks (including hidden ones), courses, and resources, and to download files from courses.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dutic-mcpshow me my upcoming tasks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dutic-mcp
Servidor MCP + CLI para el aula virtual DUTIC (Moodle) de la UNSA. Tus tareas —incluidas las ocultas—, notas, materiales de estudio y compañeros, en la terminal y disponibles para agentes de IA (Claude Code, Antigravity, OpenCode, mimocode…).
┌─────────────────────────────────────────────┐
│ 24 tareas · 10 SIN ENTREGAR │
│ 18 ocultas que el calendario no te muestra │
└─────────────────────────────────────────────┘Por qué existe
El timeline de Moodle sólo muestra tareas accionables (futuras y sin entregar). Las tareas sin
fecha de calendario, ya vencidas o ya entregadas desaparecen de la vista — y así se pierden
entregas. dutic barre todos los cursos, encuentra esas tareas, las marca como OCULTA y ordena
lo pendiente por urgencia.
Related MCP server: mcpUPB
Instalación
Requisitos: Node.js ≥ 20 y Google Chrome (o Edge) instalado. No hace falta descargar Chromium: se usa el navegador que ya tienes.
Un solo comando
npm install -g @josetra/dutic-mcpEsto deja dutic y dutic-mcp en tu PATH.
git clone https://github.com/JOSETRA44/dutic-mcp.git
cd dutic-mcp
npm install # compila automáticamente (script prepare)
npm install -g . # deja los comandos en el PATHPrimeros pasos
1. Configura tus agentes (una vez)
dutic setupRegistra el servidor MCP en los agentes que tengas instalados y copia la skill dutic a sus
directorios. Hace copia de seguridad (*.dutic-bak) y no toca el resto de tu configuración.
[OK] Claude Code (MCP) C:\Users\tu-usuario\.claude.json
[OK] Antigravity (MCP) ...\.antigravity\config\mcp_config.json
[OK] OpenCode (MCP) ...\.config\opencode\opencode.jsonc
[OK] mimocode (MCP) ...\.config\mimocode\mimocode.jsonc
[OK] Claude Code (skill) ...\.claude\skills\duticReinicia cada agente para que cargue el servidor.
2. Inicia sesión (una vez)
dutic loginSe abre tu Chrome en el aula virtual. Pulsa «Ingresar con Correo UNSA», elige tu cuenta de Google y espera: la ventana se cierra sola al capturar la sesión. El perfil del navegador queda guardado, así que las renovaciones posteriores suelen ser automáticas.
3. Compruébalo
dutic status # ¿sesión válida?
dutic tasks --all # tus tareas, incluidas las ocultasSi ves tus tareas, ya está todo listo. Pídeselo también a tu agente: «¿tengo alguna tarea pendiente en el aula virtual?»
3. Comandos Rapidos (Cheat Sheet)
Una vez iniciada la sesion, usa estos comandos frecuentemente para interactuar con tu entorno:
# Ver estado de sesion
dutic status
# Revisar que tareas faltan (incluyendo ocultas)
dutic tasks --all
# Descargar materiales del curso a tu computadora
dutic study <courseId> --dest ./materiales
# Forzar busqueda de nuevos cursos matriculados
dutic courses --refresh
# Buscar un curso o docente en la base de datos local
dutic search "estadistica"Uso — CLI
Comando | Qué hace |
| Tareas próximas del timeline (rápido) |
| + barrido de cursos → incluye las ocultas |
| Sólo las ocultas |
| Novedades desde la última revisión (tareas/notas nuevas, entregas, fechas) |
| Tu propio perfil (nombre, correo, id) |
| Captura tus notas parciales de SISACAD — tú haces el login + CAPTCHA; sólo tus datos |
| Muestra las notas ya capturadas, agrupadas por curso con promedio ponderado |
| Compara el promedio de SISACAD (oficial) con el total que calcula Moodle |
| Detalle: consigna, fechas, adjuntos, conflicto de fechas |
| Notas: resumen de todos los cursos, o detalle de uno |
| Cursos matriculados |
| Archivos del curso, por unidad |
| Baja materiales y convierte PDFs a Markdown |
| Lee un recurso (PDF→Markdown) para analizarlo |
| Convierte un PDF local a Markdown |
| Todos los compañeros del curso, con correo ( |
| Busca por nombre/correo: su correo y sus cursos reales (con grupo), marcando cuáles compartes |
| Perfil por id (docentes incluidos): correo, rol, cursos — resuelve el curso en común solo, sin |
| Docentes del curso |
| Busca cursos o docentes en la base de datos local |
| Escanea cursos por rango de IDs para armar tu base de datos y respaldar en la nube |
| Explora cualquier página del aula por URL (cambiar ids, ver lo que no tiene botón) |
| Descarga todos los materiales |
| Revisión automática en segundo plano (tarea programada, sin daemon) |
| Gestiona la caché local (perfiles, cursos…) |
| Configuración y sesión |
Opciones globales: --refresh (ignora la caché y trae datos frescos), --no-cache, --json.
Rendimiento y Refresco
Las consultas de personas/cursos se cachean en disco (~/.dutic/cache/): repetir person,
people, grades o tasks es casi instantaneo. Usa --refresh para ignorar el cache temporalmente y forzar datos frescos. Esto es muy util para reescanear tras algun cambio (matriculas nuevas, fechas extendidas, etc.).
Ejemplos Utiles
# Que me falta entregar exactamente?
dutic tasks --all
# Forzar que busque nuevas tareas saltandose el cache
dutic tasks --all --refresh
# Preparar solo la unidad que voy a estudiar
dutic study 2279 --section "Tema 2" --dest ./materiales
# Que pide exactamente esta tarea?
dutic task 385686
# Forzar el rescanneo de materiales de un curso
dutic materials 2279 --refresh
# Quien es y en que cursos coincido con el? (correo + todos los cursos compartidos)
dutic person "Piero"
# Escanear perfiles de cursos (1 al 5000) para crear tu propia base de datos offline
dutic scan-courses --from 1 --to 5000
# Quien ensena Estadistica? (requiere haber ejecutado scan-courses primero)
dutic search "Estadistica"Uso — con agentes (MCP)
Tras dutic setup no hay nada más que hacer: pregúntale a tu agente por tus tareas, notas o
materiales y usará las herramientas del servidor.
{
"mcpServers": {
"dutic": {
"command": "dutic-mcp",
"env": { "DUTIC_SEMESTER": "2026A" }
}
}
}Si tu cliente no resuelve comandos del PATH, usa la ruta absoluta que imprime dutic setup:
{ "command": "node", "args": ["<ruta>/dist/mcp/server.js"] }
24 herramientas: novedades (dutic_check_changes), notas SISACAD (dutic_get_sisacad_grades,
dutic_compare_grades), perfil propio (dutic_whoami), tareas
(dutic_list_tasks, dutic_get_assignment_detail, …), notas
(dutic_get_grades), materiales (dutic_list_course_materials, dutic_study_course,
dutic_read_resource, dutic_pdf_to_markdown), personas (dutic_list_participants,
dutic_find_person, dutic_get_person_profile, dutic_get_course_teachers), exploración por URL
(dutic_fetch_page) y sesión.
Piloto de notificaciones por WhatsApp (opt-in)
Experimento separado del uso personal de arriba: un bot que avisa por WhatsApp cuando aparece una tarea o nota nueva. Sólo para quien decida enrolarse explícitamente — nadie queda inscrito sin haberlo pedido.
dutic saas enroll # te registra (una vez) y te da un código corto de 6 caracteres
# le escribes ese código, tal cual, al número de WhatsApp del bot (te lo da el operador del piloto)Y ya está — no hay nada más que recordar. dutic saas enroll deja activada la revisión
automática: tu PC revisa el aula virtual sola cada 3 horas y te avisa por WhatsApp si aparece una
tarea o una nota. Puedes verlo con dutic auto status y desactivarlo con dutic auto uninstall.
Cómo está construido, y por qué:
El scraping nunca sale de tu PC.
dutic saas pushreutiliza el mismodutic watchde siempre; sólo empuja el resultado (tarea nueva, nota nueva) a Supabase — jamás tuMoodleSessionni tusesskey. Centralizar el login de Google OAuth de otros estudiantes en la nube no es viable (los sistemas anti-bot de Google bloquean ese patrón) ni seguro (expondría la sesión de todos en un solo lugar), así que el login sigue pasando, como siempre, en la máquina de cada quien.La mensajería usa Baileys (librería no oficial de WhatsApp) con 1-3 números dedicados/externos del piloto — nunca el número personal de un estudiante. Sólo esos números del bot están expuestos a un eventual baneo de Meta; son reemplazables sin afectar a nadie más. El envío tiene demoras aleatorias entre mensajes y variación de texto para reducir el riesgo de detección como spam.
"Despertador" del bot: el dispatcher normalmente sólo corre por cron (2x/día), así que un código de vinculación enviado justo después de
dutic saas enrollpodía quedar con el check gris horas. La Edge Functionenrolldispara unworkflow_dispatchde GitHub Actions apenas se crea un estudiante nuevo, con una ventana de escucha más larga (150s) que la de las corridas por cron (20s). Comoenrolles un endpoint público, el disparo está limitado a uno cada 2 minutos (tabladispatch_wakeups, claim atómico) sin importar cuántas veces se llame — así no se puede agotar el presupuesto gratis de Actions ni el rate-limit del token de GitHub llamandoenrollen bucle.Sin daemon residente. La revisión automática no deja ningún proceso vivo consumiendo RAM: se registra una tarea en el Programador de tareas de Windows que ejecuta
dutic auto runcada 3 h; cada pasada dura segundos y termina. En reposo el consumo es cero. Se usa el Programador de tareas y no una claveRundel registro precisamente porque esa clave es el patrón de persistencia que marcan los antivirus.Respetuoso con tu laptop y con la UNSA. Corre en prioridad baja, sólo si hay red, nunca despierta un equipo dormido, y se salta la pasada si no hay conexión o si estás usando
dutica mano. El disparo lleva retraso aleatorio (hasta 45 min) para que, si muchos estudiantes lo tienen instalado, no barran el aula virtual todos en el mismo instante.Nunca aparece una ventana de la nada. La renovación de sesión en segundo plano es estrictamente headless. Si el SSO de Google caduca de verdad y no se puede renovar en silencio, en vez de abrirte un navegador sin avisar, el bot te escribe por WhatsApp pidiéndote que corras
dutic login.Piloto con consentimiento explícito de cada participante — no un lanzamiento masivo a la facultad.
Configuración
Variable | Para qué | Por defecto |
| Semestre en la URL del aula ( |
|
| Navegador para el login: |
|
| Dónde guardar sesión y perfil |
|
El semestre sólo se usa para la URL de login: tras iniciar sesión se auto-detecta del propio aula, así que al cambiar de período normalmente no hay que tocar nada.
Cómo funciona
No usa la API pública de web services (la UNSA la tiene bloqueada). Captura la cookie
MoodleSession y el token sesskey tras el login de Google (Playwright manejando tu Chrome) y con
ellos llama al endpoint AJAX interno de Moodle, complementado con scraping donde hace falta.
Necesidad | Fuente | Estado |
Descubrir todas las tareas |
| SI |
Cursos matriculados |
| SI |
Timeline y fechas |
| SI (sólo accionables) |
Estado de entrega, consigna, adjuntos | scraping de | SI |
Notas | scraping de | SI |
Personas y correos | scraping de | SI |
| — | NO bloqueadas por la UNSA |
Fechas contradictorias: algunas consignas mencionan una fecha distinta a la configurada en
Moodle. dutic task <cmid> compara ambas y avisa (dateConflict) — es la causa típica de entregas
perdidas.
SISACAD es distinto a propósito. Es un sistema aparte (extranet.unsa.edu.pe) protegido con
CAPTCHA, y esa protección se respeta: dutic sisacad no automatiza el login ni resuelve el CAPTCHA
por ti — abre el navegador, tú entras con tu usuario/clave y lo resuelves, y sólo cuando aparecen
tus notas la herramienta las lee y las estructura (por curso, con el promedio ponderado). Nunca
accede a datos de otros estudiantes.
Publicar en npm
npm login # cuenta de npm
npm version patch # o minor / major
npm publish # el paquete es scoped y público (publishConfig.access)
git push --follow-tagsprepublishOnly compila antes de publicar y files limita el tarball a dist/ y skills/.
Si tu scope de npm no es
@joswetra, cambia el camponameenpackage.jsonpor@tu-scope/dutic-mcp(o un nombre sin scope que esté libre).
Privacidad y seguridad
La sesión (
~/.dutic/session.json) y el perfil del navegador contienen credenciales de tu cuenta: no se versionan y el archivo se crea con permisos restrictivos.El certificado de
aulavirtual.unsa.edu.pe(CA privada de la UNSA) se acepta sólo para ese host.La herramienta accede únicamente a lo que tú ya ves en el aula. Donde Moodle oculta información (docentes en el listado, compañeros de otros grupos) se respeta esa restricción.
dutic profile <userId>resuelve un id a la vez, dado por una vía legítima tuya (una tarea calificada, un correo, un enlace que ya tenías). No está pensado ni se debe usar para recorrer rangos de ids y construir un directorio de docentes/estudiantes de la facultad — eso sería scraping masivo de datos personales de terceros sin su consentimiento.El piloto de notificaciones (
dutic saas enroll/push) es opt-in: sólo guarda datos de quien ejecutaenrollexplícitamente.pending_notificationsystudentsen Supabase existen sólo para avisar al propio dueño de esa fila — nunca para leer, listar o reenviar datos de otro estudiante.
Licencia
MIT © JOSETRA44
Maintenance
Related MCP Servers
- Alicense-qualityCmaintenanceA Moodle MCP server so students can collaborate with their courses through the LLM tools.Last updatedMIT
- Alicense-qualityCmaintenanceMCP server that turns UPB Virtual (Moodle) into a structured knowledge source, enabling AI assistants to query courses, assignments, deadlines, announcements, and sync materials via REST API.Last updatedMIT
- Alicense-qualityAmaintenanceUnofficial CLI to access UPC Aula Virtual (Blackboard) from the terminal, with an MCP server for Claude to manage courses, assignments, and downloads.Last updated2175ISC
- Alicense-qualityDmaintenanceA powerful Model Context Protocol (MCP) server that seamlessly integrates AI assistants with Moodle Learning Management System. Enable your AI assistant to access courses, retrieve educational content, download resources, and search through your learning materials.Last updated21MIT
Related MCP Connectors
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP server for AgentDocs (agentdocs.eu): read, search, write, comment on & share Markdown docs.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/JOSETRA44/DUTIC-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server