Skip to main content
Glama

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, 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).

Related MCP server: Canvas MCP

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).

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

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):

# 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:

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:

{
  "mcpServers": {
    "utn-vj": {
      "command": "node",
      "args": ["C:/ruta/a/utn-mcp/build/index.js"],
      "env": { "UTN_REGIONAL": "vj" }
    }
  }
}

Claude Code:

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:

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.

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

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.

Available Tools

11 tools
aula_assign_submitA
Destructive

Entrega una tarea (assign) del aula virtual: sube archivos, escribe el texto en línea o las dos cosas, según lo que acepte la tarea. Antes, abrila con aula_open: entrega dice qué acepta (acepta, con tipos, cantidad y tamaño), si puedeEditar y lo que ya está subido.

Los archivos nuevos se pasan en archivos con su ruta absoluta en la compu del usuario. archivos es la lista final y reemplaza lo anterior: para sumar uno sin perder los otros, incluí la url de cada archivo que ya está en la entrega. Si no pasás archivos, quedan los que estaban; lo mismo con texto.

Si la tarea no usa borradores, guardar ya es entregar. Si los usa (requiereConfirmarEnvio), la tool además confirma el envío, salvo con enviar: false; una vez enviada, en general no se puede cambiar. Con declaracion, el usuario tiene que aceptarla (aceptoDeclaracion). Devuelve cómo quedó la entrega.

Antes de llamarla, mostrale al usuario exactamente lo que se va a hacer y esperá que confirme. Incluí la tarea, los nombres de los archivos y si se confirma el envío.

Inputs: direccion (required), texto, enviar, archivos, +1 more.

aula_calendar_add_eventA

Agrega un evento personal al calendario del aula virtual, que solo ve el usuario: por ejemplo un recordatorio de un parcial o una entrega. El aula avisa según la configuración de notificaciones del usuario. La fecha va con zona horaria; en Argentina es -03:00.

Inputs: inicio (required), nombre (required), descripcion, duracionMinutos.

aula_choice_answerA
DestructiveIdempotent

Responde una elección (choice: encuestas rápidas como "¿venís al parcial?") o una selección de grupos (choicegroup: anotarse en un grupo o comisión). Deja elegidas exactamente las opciones pasadas y reemplaza la respuesta anterior; con una lista vacía la borra.

Las opciones salen de eleccion al abrir el módulo con aula_open. Muchas no dejan cambiar la respuesta una vez dada (puedeCambiar: false), y las opciones deshabilitada están completas. Devuelve cómo quedó la elección.

Antes de llamarla, mostrale al usuario exactamente lo que se va a hacer y esperá que confirme.

Inputs: opciones (required), direccion (required).

aula_forum_delete_postA
DestructiveIdempotent

Borra una publicación propia de un foro. No se puede deshacer. Solo se puede si tiene "borrar" en acciones. Si es la primera publicación de la discusión, se borra la discusión entera.

Antes de llamarla, mostrale al usuario exactamente lo que se va a hacer y esperá que confirme.

Inputs: id (required), direccion (required).

aula_forum_edit_postA
DestructiveIdempotent

Edita una publicación propia de un foro y reemplaza el mensaje completo. Solo se puede si la publicación tiene "editar" en acciones: Moodle deja editar por un rato después de publicar.

Antes de llamarla, mostrale al usuario exactamente lo que se va a hacer y esperá que confirme.

Inputs: id (required), mensaje (required), direccion (required), asunto.

aula_forum_postA

Publica en un foro del aula virtual. Con la direccion de un foro abre un hilo nuevo (hace falta asunto); con la de una discusión responde en ella, a la publicación respuestaA o, si no se indica, a la primera.

Lo que se publica lo ven docentes y compañeros, y a muchos les llega por mail. Antes de abrir un hilo, mirá puedeAbrirHilo del foro; antes de responder, que la publicación tenga "responder" en acciones.

Antes de llamarla, mostrale al usuario exactamente lo que se va a hacer y esperá que confirme.

Inputs: mensaje (required), direccion (required), asunto, respuestaA.

aula_get_site_infoB
Read-only

Datos del usuario logueado en el aula virtual de la UTN FRBA y del sitio Moodle.

Inputs: no named parameters.

aula_list_coursesA
Read-only

Lista los cursos (materias) en los que está inscripto el usuario. Es el punto de entrada: cada curso viene con su direccion, que se le pasa a aula_open para entrar.

Inputs: no named parameters.

aula_openA
Read-only

Entra a una dirección del aula virtual y devuelve lo que hay ahí: un curso con sus secciones y módulos, un módulo con sus archivos y fechas, un foro con el índice de sus discusiones, o una discusión con sus mensajes completos.

Según el tipo de módulo trae además: en una tarea (assign), entrega con el estado, el vencimiento, lo que se subió y la devolución con la nota; en una elección (choice) o selección de grupos (choicegroup), eleccion con las opciones y sus ids; en un foro, puedeAbrirHilo; en una discusión, el id, el autorId y las acciones permitidas de cada publicación. Es lo que piden las tools que escriben en el aula.

No hace falta armar la dirección: cada respuesta trae las direcciones de lo que hay adentro (direccion) y la de un nivel más arriba (padre), así que se navega pasando de vuelta una de esas. Para empezar, usar aula_list_courses o la dirección "/".

Buscar algo que puede estar en cualquier parte (una fecha de parcial, un aviso) se hace entrando al curso y abriendo lo que corresponda: el índice de un foro muestra los asuntos sin volcar los mensajes enteros, y archivos como un cronograma se leen con aula_read_file.

Los archivos vienen con una url, que sirve para leerlos con aula_read_file y también para dársela al usuario si quiere bajarlo: se abre con su sesión del aula.

Inputs: direccion (required), pagina.

aula_read_fileA
Read-only

Lee un archivo del aula virtual: PDF, Word (docx), PowerPoint (pptx), Excel (xlsx), imágenes y texto. Los PDF escaneados se devuelven como imagen de cada página.

Devuelve el archivo por partes (páginas, diapositivas o fragmentos), tantas como entren en una respuesta. Si quedan más, siguiente dice desde cuál pedir; también se puede saltar directo a una parte con desde.

Formatos que no sabe leer (.doc, .ppt viejos, .zip, .rar, videos): devuelve un error con la URL para que el usuario lo baje.

Inputs: url (required), desde.

aula_send_messageA

Manda un mensaje privado por la mensajería del aula virtual a otro usuario, docente o compañero. El usuarioId sale del autorId de un foro o una discusión abiertos con aula_open: no lo inventes ni lo deduzcas del nombre. La respuesta trae el nombre del destinatario.

Antes de llamarla, mostrale al usuario exactamente lo que se va a hacer y esperá que confirme. Incluí a quién va dirigido.

Inputs: mensaje (required), usuarioId (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    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 recent community issues

    Related MCP Connectors

    Related MCP Servers