Skip to main content
Glama
alanmagno1

tuaulavirtual-unam-mcp

by alanmagno1
README.md
# tuaulavirtual-unam-mcp

Servidor [MCP](https://modelcontextprotocol.io) para el aula virtual Moodle de la UNAM
(`tuaulavirtual.educatic.unam.mx`). Permite que Claude Code, Claude Desktop, Cursor
o cualquier cliente MCP consulte tus cursos, tareas, fechas de entrega, descargue
materiales y, si se lo pides, entregue tareas por ti.

Usa la API REST oficial de Moodle (servicio `moodle_mobile_app`) y, como respaldo,
una sesión web para leer páginas que la API no cubre.

## Requisitos

- [uv](https://docs.astral.sh/uv/) instalado. En macOS: `brew install uv`.
  En cualquier sistema: `curl -LsSf https://astral.sh/uv/install.sh | sh`.
- Tu usuario y contraseña del aula virtual.

## Instalación en 2 pasos

**1. Guarda tus credenciales** (se piden de forma interactiva y quedan en
`~/.config/tuaulavirtual-unam-mcp/.env` con permisos solo para tu usuario):

```bash
uvx --from git+https://github.com/AlanMagno1/tuaulavirtual-unam-mcp tuaulavirtual-unam-mcp setup
```

**2. Registra el servidor en Claude Code:**

```bash
claude mcp add tuaulavirtual-unam -s user -- uvx --from git+https://github.com/AlanMagno1/tuaulavirtual-unam-mcp tuaulavirtual-unam-mcp
```

Listo. Abre Claude Code y pídele, por ejemplo:

> ¿Qué tareas tengo pendientes?

> Revisa https://tuaulavirtual.educatic.unam.mx/mod/assign/view.php?id=469144 y dime qué piden.

### Otros clientes (Claude Desktop, Cursor, etc.)

Agrega esto a la configuración JSON de servidores MCP del cliente:

```json
{
  "mcpServers": {
    "tuaulavirtual-unam": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/AlanMagno1/tuaulavirtual-unam-mcp", "tuaulavirtual-unam-mcp"]
    }
  }
}
```

### Variables de entorno (alternativa al archivo de configuración)

| Variable | Descripción |
|---|---|
| `MOODLE_URL` | URL del Moodle. Default: `https://tuaulavirtual.educatic.unam.mx` |
| `MOODLE_USERNAME` | Usuario del aula virtual |
| `MOODLE_PASSWORD` | Contraseña |
| `MOODLE_DOWNLOAD_DIR` | Carpeta de descargas. Default: `~/Downloads/tuaulavirtual-unam-mcp` |
| `TUAULAVIRTUAL_MCP_CONFIG_DIR` | Carpeta de configuración. Default: `~/.config/tuaulavirtual-unam-mcp` |

Las variables de entorno tienen prioridad sobre el archivo `.env`. Funciona con
cualquier Moodle que tenga habilitado el servicio móvil, cambiando `MOODLE_URL`.

### Otros Moodle de la UNAM (CUAED, idiomas, etc.)

El mismo servidor sirve para cualquier Moodle con el servicio móvil habilitado. Al
correr `setup`, escribe la URL del Moodle en la primera pregunta en vez de aceptar
la default. URLs verificadas:

| Aula | URL para `setup` |
|---|---|
| Tu Aula Virtual (default) | `https://tuaulavirtual.educatic.unam.mx` |
| Aulas Virtuales CUAED | `https://aulasvirtuales.cuaed.unam.mx/moodle` |
| Ambiente Virtual de Idiomas | `https://avicursos.cuaed.unam.mx/moodle` |

Ojo: `aulas-virtuales.cuaed.unam.mx` (con guion) es solo el portal informativo; el
Moodle de CUAED está en la URL de la tabla. En CUAED el login web está desactivado,
así que la herramienta `fetch_page` no funciona ahí; las demás sí.

### Dos o más aulas a la vez

Cada aula necesita su propia carpeta de configuración y su propio nombre de servidor.
`setup` avisa si vas a sobrescribir una configuración existente. Ejemplo para agregar
CUAED junto a Tu Aula Virtual:

```bash
# 1. Credenciales de CUAED en una carpeta aparte
TUAULAVIRTUAL_MCP_CONFIG_DIR=~/.config/cuaed-mcp \
  uvx --from git+https://github.com/AlanMagno1/tuaulavirtual-unam-mcp tuaulavirtual-unam-mcp setup

# 2. Segundo servidor en Claude Code
claude mcp add cuaed-unam -s user -e TUAULAVIRTUAL_MCP_CONFIG_DIR=$HOME/.config/cuaed-mcp -- \
  uvx --from git+https://github.com/AlanMagno1/tuaulavirtual-unam-mcp tuaulavirtual-unam-mcp
```

Claude verá las herramientas de ambos servidores con prefijos distintos y elegirá el
correcto según el aula o la URL que menciones.

## Herramientas

| Herramienta | Qué hace |
|---|---|
| `get_site_info` | Verifica la conexión y devuelve el usuario autenticado. |
| `list_courses` | Cursos en los que estás inscrito. |
| `get_course_contents(course_id)` | Secciones y módulos de un curso, con fechas y archivos. |
| `get_assignment(cmid_or_url)` | Detalle de una tarea: instrucciones, fechas, adjuntos y estado de tu entrega. Acepta la URL completa `.../mod/assign/view.php?id=NNN`. |
| `download_file(fileurl, filename?)` | Descarga un archivo a `~/Downloads/tuaulavirtual-unam-mcp/` y devuelve la ruta local. |
| `fetch_page(url)` | Inicia sesión por web y devuelve el texto de cualquier página del aula. |
| `upload_file(path)` | Sube un archivo local al área de borradores; devuelve `itemid`. |
| `submit_assignment(cmid_or_url, online_text?, files_itemid?, submit_for_grading?)` | Guarda una entrega (texto en línea y/o archivos) y opcionalmente la envía para calificación. |

## Comandos

```bash
tuaulavirtual-unam-mcp setup   # captura credenciales y prueba la conexión
tuaulavirtual-unam-mcp check   # imprime el usuario autenticado
tuaulavirtual-unam-mcp         # arranca el servidor MCP por stdio (lo usa el cliente)
```

## Seguridad

- Tus credenciales nunca salen de tu máquina: solo se envían a la URL del Moodle
  configurada, para obtener un token del servicio móvil.
- El token se guarda en `~/.config/tuaulavirtual-unam-mcp/token.json` (permisos 600) y se renueva
  automáticamente si Moodle lo invalida.
- `submit_assignment` entrega tareas en tu nombre. Claude solo debe usarla cuando se
  lo pidas explícitamente.

## Desarrollo

```bash
git clone https://github.com/AlanMagno1/tuaulavirtual-unam-mcp
cd tuaulavirtual-unam-mcp
uv sync
uv run tuaulavirtual-unam-mcp check
```

Para probar cambios locales en Claude Code sin publicar:

```bash
claude mcp add tuaulavirtual-unam -s user -- uv --directory /ruta/a/tuaulavirtual-unam-mcp run tuaulavirtual-unam-mcp
```

## Licencia

MIT

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation5/5

Cada herramienta tiene un propósito claramente delimitado: listar cursos, obtener contenidos, ver detalle de una tarea, transferir archivos y enviar entregas. Aunque fetch_page podría usarse para ver una tarea, su descripción la limita explícitamente a lo que la API no cubre, evitando solapamientos reales.

Naming Consistency5/5

Todos los nombres siguen un patrón verb_noun en snake_case (list_courses, get_assignment, upload_file, submit_assignment). Los verbos reflejan claramente la acción y no hay mezcla de estilos ni nombres vagos.

Tool Count5/5

Ocho herramientas es un tamaño adecuado para un cliente de aula virtual centrado en consultar cursos, tareas y gestionar entregas. El conjunto no se siente ni inflado ni demasiado escaso para su propósito.

Completeness4/5

El flujo principal está bien cubierto: ver cursos y contenidos, consultar tareas, descargar archivos, subir borradores y enviar entregas. La falta de herramientas estructuradas para foros, calificaciones o avisos se mitiga con fetch_page, pero sigue siendo un vacío menor respecto a un acceso totalmente especializado.

Maintenance

ActivityMaintained
ResponsivenessNo issues