Skip to main content
Glama
README.md
# 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

A3.8/5.0

Scored across 11 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness3/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues