UTN-MCP
Allows interacting with a Moodle-based UTN virtual classroom (videojuegos campus), providing tools to list courses, browse modules, forums, discussions, and assignments, read course files, check submission status and grades, and perform write actions such as posting/editing/deleting forum posts, submitting assignments, answering choices, sending private messages, and adding calendar events.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@UTN-MCP¿Qué tareas tengo pendientes y qué notas me pusieron?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 (
ultimoAccesote 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,.pptni 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 Server
Tools
Tool | Tipo | Qué hace |
| lectura | Datos de tu usuario en el aula virtual. |
| lectura | Lista tus cursos. Es el punto de partida. |
| 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. |
| lectura | Lee un archivo del aula, por partes cuando es largo. |
| escritura | Abre un hilo en un foro o responde en una discusión. |
| escritura | Edita una publicación tuya. |
| escritura | Borra una publicación tuya. |
| escritura | Entrega una tarea: archivos de tu computadora, texto en línea o ambos. |
| escritura | Solo en modo HTTP: un link para subir los archivos de una entrega desde el navegador. |
| escritura | Responde una elección o te anota en un grupo. |
| escritura | Manda un mensaje privado a un docente o compañero. |
| 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 buildIniciar 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 loginSe 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=vjConectarlo 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.jsBot 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-profileo~/.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 tsxPara 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 toolsaula_assign_submitADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| texto | No | Texto en línea completo, en texto plano; reemplaza al anterior. Una línea en blanco separa párrafos. Ej: "Link al repositorio: https://github.com/ana/tp3" | |
| enviar | No | Solo en tareas con borradores: confirmar el envío para que cuente como entregada. Por defecto, true. Ej: false para dejarla como borrador. | |
| archivos | No | Lista final de archivos. Cada uno es la ruta absoluta de un archivo en la compu del usuario o la `url` de uno que ya está en la entrega. Lista vacía: quita todos. Ej: ["C:\Users\ana\Documents\TP3.pdf"]. | |
| direccion | Yes | Dirección de la tarea, de aula_open. Ej: "/curso/29487/mod/1729138". | |
| aceptoDeclaracion | No | true si el usuario aceptó la `declaracion` de la tarea. Solo hace falta si la tarea la pide. Ej: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=false) by disclosing that `archivos` is a final replacing list, that omission preserves existing values, that submission is generally irreversible once sent, that a declaration may need acceptance, and that the user must confirm beforehand. This matches and enriches the destructive/irreversible semantics declared in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action followed by prerequisites, replacement semantics, and the confirmation requirement — every paragraph carries distinct information. It is somewhat long and drifts into fluent narrative, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive write tool with no output schema it covers prerequisites, irreversibility, replacement semantics, and the confirmation protocol. Return value is only gestured at ('Devuelve cómo quedó la entrega'), which is the one remaining gap, though acceptable given the complexity covered elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter meanings are already documented, but the description adds cross-parameter semantics the schema cannot express: empty `archivos` removes all files, existing files must be re-listed by `url` to be preserved, and omitting `texto`/`archivos` leaves prior values. That is meaningful value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — submitting an assignment in the virtual classroom — and explains that it can upload files, write inline text, or both depending on what the task accepts. It is clearly distinguishable from siblings like aula_open (inspection) and aula_read_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly requires calling aula_open first to read `entrega` (accepted types, size, puedeEditar, existing uploads) before submitting. It also spells out the draft vs. non-draft branch, the `enviar: false` alternative, and the human-confirmation step, so the agent knows exactly when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| inicio | Yes | Fecha y hora en ISO 8601 con zona horaria. Ej: "2026-10-14T18:00:00-03:00". | |
| nombre | Yes | Título del evento. Ej: "Parcial de Física II". | |
| descripcion | No | Detalle, en texto plano. Ej: "Aula 312, unidades 1 a 4". | |
| duracionMinutos | No | Duración en minutos. Por defecto, sin duración. Ej: 120. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare the write/non-destructive/non-idempotent profile), the description discloses two real behavioral traits: the event's visibility is private to the user, and creating it triggers notifications according to the user's notification settings. It does not cover failure modes or whether duplicates are permitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and visibility scope, followed by side-effect and format notes. Every sentence carries information; nothing is repeated verbatim across sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, non-destructive create tool with annotations and no output schema, the description covers purpose, visibility, notification side effect and date format. Minor gaps remain around return value and duplicate handling, but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries titles, formats and examples for all four parameters. The description reinforces the timezone requirement and localizes the offset for Argentina (-03:00), which adds modest value but largely restates the 'inicio' schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Agrega un evento personal al calendario del aula virtual') and adds a scope qualifier ('que solo ve el usuario') that separates it from shared/public posting tools like the forum siblings. It never names a sibling, so differentiation is by resource type rather than explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Concrete use cases are given ('un recordatorio de un parcial o una entrega'), which tells the agent the intended context. There is no when-not guidance or named alternative, so it stops short of full routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_choice_answerADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| opciones | Yes | `id` de las opciones a elegir. Ej: [31076]. Varias solo si la actividad lo permite. | |
| direccion | Yes | Dirección del módulo. Ej: "/curso/29487/mod/1729113". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the key mutation semantics: the call replaces the previous answer rather than appending, an empty list deletes the answer, `deshabilitada` options are already full, and some choices are locked after the first submission. This aligns with and enriches destructiveHint=true and idempotentHint=true rather than merely restating them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs that are front-loaded with the core action, then preconditions, then the confirmation rule. Every sentence carries distinct information with no repetition of the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the return ("Devuelve cómo quedó la elección"), the source of the option ids, the irreversibility risk, and the required user-confirmation step. Nothing an agent needs in order to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters and the baseline is 3. The description still adds real meaning: `opciones` is a full-replacement set (not incremental), an empty array erases the answer, multiple ids are only valid when the activity permits, and `direccion` comes from the module opened via aula_open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ("Responde una elección") and distinguishes its two modes: choice (quick polls) and choicegroup (signing up for a group/commission), each with a concrete example. No sibling tool overlaps this resource, but the description never names a sibling to contrast with, so it stops short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Las opciones salen de `eleccion` al abrir el módulo con aula_open" supplies the prerequisite and the sibling that must run first, and the confirmation instruction gives a hard procedural rule before calling. It falls short of a 5 because it warns that many choices cannot be changed (`puedeCambiar: false`) without stating whether the call should then be skipped or simply flagged to the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_forum_delete_postADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | `id` de la publicación, de aula_open. Ej: 768118. | |
| direccion | Yes | Dirección de la discusión donde está la publicación. Ej: "/curso/691/mod/34831/disc/416676". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare `destructiveHint=true`, but the description adds essential context beyond them: deletion cannot be undone, it is gated on `borrar` in `acciones`, and deleting the first post removes the entire discussion. It also requires showing the user exactly what will happen and waiting for confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly written: destructive action and irreversibility are front-loaded, followed by the permission gate, cascade risk, and confirmation instruction. No sentence is filler or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the key operational facts: irreversibility, permission gating, cascading deletion of the whole discussion, and required user confirmation. Nothing critical to safe invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both `id` and `direccion` are fully documented with examples in the schema. The description adds only indirect scoping through 'publicación propia' and does not define parameter formats beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Borra') and resource ('una publicación propia de un foro'), with the ownership scope making the operation distinct from creating or editing posts. The cascade note further clarifies exactly what kind of deletion this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear precondition ('Solo se puede si tiene "borrar" en `acciones`') and mandates a confirmation workflow before calling, which tells the agent when the tool is allowed to be used. It does not explicitly compare with alternatives such as `aula_forum_edit_post`, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_forum_edit_postADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | `id` de la publicación, de aula_open. Ej: 768118. | |
| asunto | No | Asunto nuevo. Si no se pasa, queda el que tenía. Ej: "Consulta sobre el parcial (resuelta)". | |
| mensaje | Yes | El mensaje nuevo completo, en texto plano; reemplaza al anterior. Ej: "Ya lo resolví, gracias." | |
| direccion | Yes | Dirección de la discusión donde está la publicación. Ej: "/curso/691/mod/34831/disc/416676". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely new behavioral context: the prior message is fully replaced (not merged), the editability window is time-limited and discoverable via `acciones`, and a user confirmation is required first. It does not describe what an error looks like when the window has expired, but the mutation semantics are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler: capability and replacement scope first, then the precondition and the confirmation requirement. Every clause is actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with full schema coverage and clear annotations, the description covers what changes, when it is permitted, and that confirmation is required — enough to call it correctly. Only the failure mode after the edit window lapses and any alternative path are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (id, asunto, mensaje, direccion) are already documented with examples. The description only echoes the schema's replacement semantics for `mensaje` and adds no syntax, format, or validation detail beyond it. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Edita una publicación propia de un foro') plus the key scope detail that it replaces the whole message, which implicitly separates it from aula_forum_post and aula_forum_delete_post. It never names those siblings explicitly, so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition ('Solo se puede si la publicación tiene "editar" en `acciones`') and explains why it may fail (Moodle only allows edits for a limited time). It also mandates a confirm-with-user step before calling. It stops short of naming an alternative action (e.g. delete-and-repost) when the edit window has closed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asunto | No | Obligatorio para abrir un hilo. En una respuesta, por defecto "Re: <asunto>". Ej: "Consulta sobre el parcial". | |
| mensaje | Yes | Texto del mensaje, en texto plano. Una línea en blanco separa párrafos. Ej: "Hola, ¿el parcial incluye la unidad 4?" | |
| direccion | Yes | Dirección de un foro o de una discusión. Ej: "/curso/691/mod/34831" o "/curso/691/mod/34831/disc/416676". | |
| respuestaA | No | Solo al responder: `id` de la publicación a la que se responde, de aula_open. Ej: 768118. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a non-idempotent, non-destructive, open-world write; the description adds the crucial consequence that the post is visible to teachers and classmates and that many receive it by email — an irreversible public side effect not conveyed by any annotation. It also surfaces the API-level preconditions and a mandatory human confirmation step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with the core action and mode split, then preconditions, then the confirmation requirement. Every sentence carries operational information; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers the mode selection, required fields per mode, API-level gating fields, audience/notification consequences, and the confirmation protocol. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: `direccion` is a mode switch (forum address vs discussion address) and, when `respuestaA` is omitted, the reply targets the first post — a default the schema does not document. The rest (asunto required for new threads, respuestaA only when replying) duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Publica en un foro del aula virtual") and then splits it into two clearly-defined modes: opening a new thread from a forum address vs replying within a discussion. The behavior is unambiguous, though it never names the sibling tools (aula_forum_edit_post, aula_forum_delete_post) to explicitly rule them out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says which mode applies to which `direccion` type, what is required in each case (`asunto` for new threads), and gives preconditions to verify first: `puedeAbrirHilo` before opening a thread and the presence of "responder" in `acciones` before replying. It also mandates showing the user the intended action and waiting for confirmation, which is a concrete when-to-call rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_get_site_infoBRead-only
Datos del usuario logueado en el aula virtual de la UTN FRBA y del sitio Moodle.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description only adds that the data belongs to the currently authenticated user and the Moodle site, implying a session/auth dependency without stating failure modes or what happens when unauthenticated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler. It is front-loaded, though it lacks a leading action verb that would make the intent land faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description is the only source of information about the return value, yet it never says which fields (name, email, legajo, site name, etc.) come back. Adequate to identify the tool, insufficient to predict its response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters and 100% schema coverage, so the baseline is 4; there is nothing parameter-wise the description needs to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (the logged-in user's data plus Moodle site data from the UTN FRBA virtual classroom) but supplies no verb such as 'retrieve'/'get', and 'Datos' is generic about what is actually returned. It is distinguishable from the action-oriented siblings (forum_post, assign_submit) as a read of identity/site context, but only loosely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus the other aula_* tools, and no prerequisites or follow-up guidance. An agent must infer that it is an identity/bootstrap call to be used before acting on courses or forums.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_list_coursesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable output context absent from any output schema: each course includes a `direccion` field intended for aula_open. It doesn't mention auth/session requirements or ordering, but adds real behavioral value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste: the first states what is listed, the second delivers the workflow-critical detail (the `direccion` handoff) immediately. Front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter entry-point tool with no output schema, the description covers purpose, user scoping, the returned field that matters, and the next call. Safety is already covered by annotations, so nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies no input filtering is needed and instead explains the shape of each returned item, which is the relevant semantic detail here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista los cursos... en los que está inscripto el usuario') and immediately positions itself in the workflow as 'el punto de entrada', distinguishing it from aula_open by naming the handoff via `direccion`. An agent can identify its role without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as the entry point and names the follow-up action (pass `direccion` to aula_open), which tells the agent when to call it first. It does not state exclusions or what to do if the list is empty, but the sequencing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_openARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pagina | No | Solo para foros: página del índice de discusiones, de 50 en 50. La respuesta avisa con `hayMasDiscusiones` cuando hay otra. | |
| direccion | Yes | Dirección a abrir, sacada de una respuesta anterior. Ej: "/", "/curso/691", "/curso/691/mod/34806", "/curso/691/mod/34806/disc/421348". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false, but with no output schema the description must carry the return shape, and it does: per-module extras (entrega, eleccion, puedeAbrirHilo, acciones), `padre`/`direccion` links, and file `url` semantics including that it requires the user's own session. It does not discuss failure modes for an invalid or stale address, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior, then progressively adds module-specific detail and navigation guidance — each paragraph earns its place. Slightly long, with a little redundancy around the `direccion`/`padre` navigation idea repeated across paragraphs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a navigation/read tool: entry point, traversal mechanics, per-type return contents, the ids required by write tools, and delegation to aula_read_file and aula_list_courses. Nothing an agent needs to call it correctly is missing, and the only omission (error behavior on bad addresses) is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds genuine meaning by saying the address must come from a previous response and that it should not be assembled by hand, plus how `pagina` interacts with `hayMasDiscusiones`. It adds navigation semantics beyond the schema's format examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Entra a una dirección del aula virtual') and immediately enumerates what each address type returns (curso, módulo, foro, discusión), which separates it from siblings like aula_read_file and aula_list_courses. An agent can pick this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit entry point ('usar aula_list_courses o la dirección "/"'), explicit navigation rule (pass back `direccion` or `padre`), and explicit handoffs to alternatives: forum index instead of full messages, aula_read_file for archivos/cronograma. Covers when to use this vs. siblings rather than leaving it implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aula_read_fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | La `url` del archivo tal como la devuelve aula_open. | |
| desde | No | Número de página, diapositiva o fragmento desde el cual leer. Por defecto, 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and closed-world, and the description adds real context beyond that: pagination limits (only what fits in one response), scanned PDFs returned as page images, and error behavior for unsupported formats. No permissions or rate-limit details, but the behavior profile is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, each with a distinct job (what it reads, how pagination works, what fails). Front-loaded with capabilities and zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description covers supported formats, partial-return behavior, continuation mechanism, and failure mode. An agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning: it explains why `desde` exists (skipping to a part) and that `siguiente` points to the next chunk, which clarifies the pagination semantics the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read a file from the virtual classroom) and enumerates the supported formats (PDF, docx, pptx, xlsx, images, text). It also implicitly differentiates from the sibling aula_open by noting the `url` comes from that tool's output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: files come back in parts, `siguiente` tells where to continue, and `desde` lets you jump. Unsupported formats are covered with the fallback behavior (error with download URL). It lacks an explicit statement of when to prefer a sibling, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mensaje | Yes | Texto del mensaje, en texto plano. Ej: "Profe, ¿puedo rendir el recuperatorio el viernes?" | |
| usuarioId | Yes | Id del destinatario, del `autorId` de aula_open. Ej: 1066. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent, open-world write, and the description adds real context: the send must be previewed to the user and confirmed first, and the response returns the recipient's name. The anti-hallucination warning about usuarioId is genuinely behavioral rather than restating schema. It stops short of describing error or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, both front-loaded: the action and audience first, then the id-provenance rule, then the confirmation requirement. Every sentence carries operational weight with no repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema write tool, the description covers what it does, how to obtain the non-obvious id, what the response returns, and the required human-in-the-loop step. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns above that by explaining where usuarioId comes from (autorId via aula_open) and explicitly forbidding guessing it from a name — provenance that the schema does not state. mensaje's plain-text nature is already covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ("Manda un mensaje privado por la mensajería del aula virtual") and scopes the audience ("a otro usuario, docente o compañero"). That clearly separates it from sibling write tools like aula_forum_post, which publishes to a thread rather than a private inbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition for obtaining the required id ("sale del `autorId` de un foro o una discusión abiertos con aula_open") and routes the agent to aula_open first. It also mandates a confirmation step before sending. It does not explicitly say when to prefer aula_forum_post over a private message, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.8.0- First observed
aula_assign_submit - First observed
aula_calendar_add_event - First observed
aula_choice_answer - First observed
aula_forum_delete_post - First observed
aula_forum_edit_post - First observed
aula_forum_post - First observed
aula_get_site_info - First observed
aula_list_courses - First observed
aula_open - First observed
aula_read_file - First observed
aula_send_message
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.
Maintenance
Related MCP Connectors
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
Turn prompts into production-ready game assets: animated characters, textures, terrain, VFX, HUD.
Read and write KukGit repositories, files, issues and pull requests from an AI assistant.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Moodle learning management systems through the REST API. Supports course management, user enrollment, assignment handling, and forum operations through natural language.10 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Canvas LMS through 25 comprehensive tools. Supports course management, assignments, grades, messaging, calendar events, and file access through natural language.279 npm14MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Canvas LMS and Gradescope, allowing users to query courses, assignments, modules, calendar events, and find relevant resources using natural language.4 npmISC
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with a student's Canvas LMS account, supporting course viewing, grade checks, assignment submissions, announcements, discussions, calendar events, inbox messages, and more via specialized tools.1-