UTN-MCP
# UTN-MCP · Tecnicatura en Desarrollo y Producción de Videojuegos
Servidor MCP (Model Context Protocol) que deja a un agente de IA —Claude, ChatGPT, Cursor, o el bot de Discord de este repo— consultar el aula virtual de la Tecnicatura en Desarrollo y Producción de Videojuegos de la UTN (`vj.sied.utn.edu.ar`): materias, foros, tareas con su nota y archivos. Las tools que escriben (publicar en foros, entregar tareas, mandar mensajes) también están disponibles en el MCP.
Es un proyecto personal, **no oficial** y no afiliado a la UTN. Úsalo bajo tu responsabilidad y con tu propia cuenta.
> **Origen:** este repo parte de [`utn-mcp`](https://github.com/nialvape/utn-mcp), de Joaquín Peñalva (licencia ISC), que da soporte al aula de FRBA, FRT y FRRE. Acá se agregó el campus de videojuegos, su login por navegador, el bot de Discord y esta documentación.
## Qué hace
- Lista tus materias del cuatrimestre actual y anteriores (`ultimoAcceso` te ayuda a priorizar).
- Entra a un curso, un módulo, un foro o una discusión, y muestra lo que hay adentro.
- Muestra cada tarea con su estado de entrega, su vencimiento y la devolución del docente con la nota.
- Lee archivos del aula: PDF (también escaneados), Word, PowerPoint, Excel, imágenes y texto.
- Puede escribir en el aula: publicar y editar en foros, entregar tareas, responder elecciones, mandar mensajes y agendar en el calendario.
### Qué no hace
- No lee videos, archivos `.doc`, `.ppt` ni comprimidos. En esos casos devuelve el link para que lo bajes.
- No tiene memoria propia: la conversación la guarda el cliente (o el bot, en su memoria de RAM).
- No funciona desde un servidor remoto para otros alumnos todavía (ver [Limitaciones](#limitaciones)).
## Tools
| Tool | Tipo | Qué hace |
|---|---|---|
| `aula_get_site_info` | lectura | Datos de tu usuario en el aula virtual. |
| `aula_list_courses` | lectura | Lista tus cursos. Es el punto de partida. |
| `aula_open` | lectura | Entra a un curso, módulo, foro, discusión o tarea. Cada respuesta trae las direcciones de lo que hay adentro y del nivel de arriba. |
| `aula_read_file` | lectura | Lee un archivo del aula, por partes cuando es largo. |
| `aula_forum_post` | escritura | Abre un hilo en un foro o responde en una discusión. |
| `aula_forum_edit_post` | escritura | Edita una publicación tuya. |
| `aula_forum_delete_post` | escritura | Borra una publicación tuya. |
| `aula_assign_submit` | escritura | Entrega una tarea: archivos de tu computadora, texto en línea o ambos. |
| `aula_assign_upload_link` | escritura | Solo en modo HTTP: un link para subir los archivos de una entrega desde el navegador. |
| `aula_choice_answer` | escritura | Responde una elección o te anota en un grupo. |
| `aula_send_message` | escritura | Manda un mensaje privado a un docente o compañero. |
| `aula_calendar_add_event` | escritura | Agrega un evento a tu calendario del aula. |
Las tools de escritura tienen en su descripción que el agente tiene que mostrarte qué va a hacer y esperar tu confirmación. Esa confirmación la pide el modelo; el MCP no la impone por sí solo. El bot de Discord, en cambio, hoy expone solo las tools de lectura (ver [Bot de Discord](#bot-de-discord-utnbot)).
## Requisitos
- **Node.js 22.13 o superior.**
- **Chrome o Edge** instalado en la computadora. El login del campus de videojuegos se hace en una ventana de navegador.
- Probado en Windows. En macOS y Linux debería funcionar, pero no lo probamos.
## Instalación
```bash
git clone <url-de-este-repo>
cd utn-mcp
npm install
npm run build
```
### Iniciar sesión
Definí la regional y corré el login (una vez por sesión del campus):
```bash
# Windows PowerShell
$env:UTN_REGIONAL = "vj"; npm run login
# Git Bash, macOS, Linux
UTN_REGIONAL=vj npm run login
```
Se abre una ventana de Chrome o Edge con la página del campus. Entrá con tu email, Google o LinkedIn como lo harías normalmente. Cuando el MCP detecta la sesión, cierra la ventana y guarda lo necesario. La contraseña nunca pasa por el MCP.
Si preferís no escribir la variable cada vez, creá un archivo `.env` en la raíz del repo con esta línea:
```bash
UTN_REGIONAL=vj
```
## Conectarlo a un cliente MCP
Usá la ruta absoluta a `build/index.js` de tu copia del repo.
**Claude Desktop, Cursor o cualquier cliente con `mcpServers`:**
```json
{
"mcpServers": {
"utn-vj": {
"command": "node",
"args": ["C:/ruta/a/utn-mcp/build/index.js"],
"env": { "UTN_REGIONAL": "vj" }
}
}
}
```
**Claude Code:**
```bash
claude mcp add utn-vj --env UTN_REGIONAL=vj -- node "C:/ruta/a/utn-mcp/build/index.js"
```
Después de agregarlo, reiniciá el cliente y preguntá, por ejemplo: *"¿Qué materias tengo este cuatrimestre?"*
### Probarlo sin cliente
El MCP Inspector te deja llamar cada tool a mano:
```bash
UTN_REGIONAL=vj npx @modelcontextprotocol/inspector node build/index.js
```
## Bot de Discord (UTNBot)
En `bot/` hay un bot de Discord que usa este MCP y un modelo de lenguaje (endpoint compatible con OpenAI). Responde mensajes directos y menciones con los datos del aula. Corre en tu computadora, con tu sesión. Configuración paso a paso en [`bot/README.md`](bot/README.md).
Dos cosas que conviene saber antes de usarlo:
- **Lo que pregunta el bot viaja al proveedor del modelo.** Gemini y Groq reciben tu pregunta y lo que devuelven las tools (materias, notas, texto de las tareas). Revisá sus políticas antes de usarlo con datos que no quieras compartir.
- **Todo el que le escriba al bot ve datos de tu cuenta.** Usalo solo en un servidor de Discord propio.
## Limitaciones
- **Login del campus de videojuegos**: necesita Chrome o Edge y una ventana visible. Cuando la sesión del campus vence, hay que volver a correr `npm run login`.
- **Login con email y contraseña directamente (sin navegador)**: el código existe, pero no lo verificamos de punta a punta en este campus. El login por navegador es el que funciona.
- **Modo HTTP** (para que otros usen el servidor a distancia): el código viene del repo original y no funciona para este campus en remoto, porque el login necesita un navegador en la computadora del alumno.
- **Modelo gratuito**: tiene cuota diaria. Cuando se agota, el bot contesta con error hasta el día siguiente, o usa el respaldo si lo configuraste.
## Dónde se guardan tus datos
Todo queda en tu computadora:
- **Sesión del aula**: `%APPDATA%\utn-mcp\session.json` (Windows) o `~/.config/utn-mcp/session.json` (Linux y macOS). Tiene el token de Moodle y las cookies de sesión.
- **Perfil del navegador (login de videojuegos)**: `%APPDATA%\utn-mcp\browser-profile` o `~/.config/utn-mcp/browser-profile`. Tiene la sesión del campus. Borrar esa carpeta cierra la sesión.
- **Claves del bot**: en `bot/.env`, que está en `.gitignore`.
No se guarda tu contraseña del campus de videojuegos. En otros campus, `npm run login` pide la contraseña y la guarda en el gestor de credenciales del sistema.
## Desarrollo
```bash
npm install
npm run build # compila a build/
npx tsc --noEmit # chequeo de tipos (no hay tests automatizados)
npm run dev # servidor por STDIO desde src/, con tsx
```
Para trabajar con el bot: `cd bot`, `npm install`, `npm run dev` (ver `bot/README.md`).
Para otra regional, la tabla de campus está en `src/aula-virtual/client/constants.ts`. Cada regional declara su tipo de SSO (`keycloak-form`, `moodle-form` u `oidc-api`).
## Aviso
Este proyecto no está afiliado ni avalado por la UTN. Es un proyecto personal de un alumno de la Tecnicatura, con código abierto bajo la licencia ISC.
TDQS
Scored across 11 tools
Each tool targets a fairly distinct action (info, list, navigate, read file, forum post/edit/delete, answer choice, message, submit, calendar), and the descriptions explicitly explain boundaries (e.g. aula_open returns URLs that aula_read_file consumes). The main soft spot is aula_open, a broad multi-resource navigation tool that slightly overlaps with aula_list_courses and partially with aula_read_file, though the docs clarify the intended flow.
All names share the aula_ prefix and snake_case, which is readable. However the convention splits into two patterns: verb_noun (aula_get_site_info, aula_list_courses, aula_read_file, aula_send_message) and resource_action (aula_forum_post, aula_choice_answer, aula_assign_submit, aula_calendar_add_event), so there is no single predictable scheme.
11 tools is well within the healthy range and each one maps to a concrete student workflow (browse, read, forum write, assignment submit, choices, messaging, calendar). No filler or redundant tools are present.
Core read/write workflows are covered, including full forum CRUD, file reading, and assignment submission. But several operations are create-only: messaging has send but no inbox/read, and the calendar only supports adding events with no list/edit/delete, which will create dead ends for common requests.