npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@josetra/dutic-mcp

v0.1.4

Published

Servidor MCP + CLI para el aula virtual DUTIC (Moodle) de la UNSA: tareas ocultas, notas, materiales de estudio y personas.

Readme

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.


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-mcp

Esto 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 PATH

Primeros pasos

1. Configura tus agentes (una vez)

dutic setup

Registra 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\dutic

Reinicia cada agente para que cargue el servidor.

2. Inicia sesión (una vez)

dutic login

Se 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 ocultas

Si ves tus tareas, ya está todo listo. Pídeselo también a tu agente: «¿tengo alguna tarea pendiente en el aula virtual?»


Uso — CLI

| Comando | Qué hace | |---|---| | dutic tasks | Tareas próximas del timeline (rápido) | | dutic tasks --all | + barrido de cursos → incluye las ocultas | | dutic tasks --hidden | Sólo las ocultas | | dutic watch | Novedades desde la última revisión (tareas/notas nuevas, entregas, fechas) | | dutic whoami | Tu propio perfil (nombre, correo, id) | | dutic sisacad | Captura tus notas parciales de SISACAD — haces el login + CAPTCHA; sólo tus datos | | dutic sisacad show | Muestra las notas ya capturadas, agrupadas por curso con promedio ponderado | | dutic sisacad compare | Compara el promedio de SISACAD (oficial) con el total que calcula Moodle | | dutic task <cmid> | Detalle: consigna, fechas, adjuntos, conflicto de fechas | | dutic grades [id] | Notas: resumen de todos los cursos, o detalle de uno | | dutic courses | Cursos matriculados | | dutic materials <id> [--section "Tema 2"] | Archivos del curso, por unidad | | dutic study <id> [--section "Tema 2"] | Baja materiales y convierte PDFs a Markdown | | dutic read <url> | Lee un recurso (PDF→Markdown) para analizarlo | | dutic md <archivo.pdf> | Convierte un PDF local a Markdown | | dutic people <id> | Todos los compañeros del curso, con correo (--no-email para omitir) | | dutic person <texto> | Busca por nombre/correo: su correo y sus cursos reales (con grupo), marcando cuáles compartes | | dutic profile <userId> | Perfil por id (docentes incluidos): correo, rol, cursos — resuelve el curso en común solo, sin --course | | dutic teachers <id> | Docentes del curso | | dutic fetch <url> | Explora cualquier página del aula por URL (cambiar ids, ver lo que no tiene botón) | | dutic pull <id> | Descarga todos los materiales | | dutic cache info / clear | Gestiona la caché local (perfiles, cursos…) | | dutic setup / dutic login / dutic status | Configuración y sesión |

Opciones globales: --refresh (ignora la caché y trae datos frescos), --no-cache, --json.

Rendimiento

Las consultas de personas/cursos se cachean en disco (~/.dutic/cache/): repetir person, people, grades o tasks es casi instantáneo (people de 54 alumnos: ~10 s la 1.ª vez, <1 s después). Usa --refresh para forzar datos frescos. TTLs configurables con DUTIC_CACHE_TTL_MIN; desactivable con DUTIC_NO_CACHE=1.

Ejemplos

# ¿Qué me falta entregar?
dutic tasks --all

# Preparar sólo la unidad que voy a estudiar
dutic study 2279 --section "Tema 2" --dest ./materiales

# ¿Qué pide exactamente esta tarea?
dutic task 385686

# ¿Quién es y en qué cursos coincido con él? (correo + todos los cursos compartidos)
dutic person "Piero"

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.


Configuración

| Variable | Para qué | Por defecto | |---|---|---| | DUTIC_SEMESTER | Semestre en la URL del aula (2026A, 2026B…) | 2026A | | DUTIC_BROWSER_CHANNEL | Navegador para el login: chrome, msedge, chromium | chrome | | DUTIC_DATA_DIR | Dónde guardar sesión y perfil | ~/.dutic |

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 | core_courseformat_get_state | ✅ | | Cursos matriculados | core_course_get_enrolled_courses_by_timeline_classification | ✅ | | Timeline y fechas | core_calendar_get_action_events_by_timesort | ✅ (sólo accionables) | | Estado de entrega, consigna, adjuntos | scraping de mod/assign/view.php | ✅ | | Notas | scraping de grade/report/user/index.php | ✅ | | Personas y correos | scraping de user/index.php y user/view.php | ✅ | | core_course_get_contents, mod_assign_*, gradereport_* | — | ❌ 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, 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-tags

prepublishOnly compila antes de publicar y files limita el tarball a dist/ y skills/.

Si tu scope de npm no es @joswetra, cambia el campo name en package.json por @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.

Licencia

MIT © JOSETRA44