Skip to main content
Glama

UNAHUR-MCP — El puente entre tu agente y el campus virtual de la UNAHUR.

NOTE

Basado en utn-mcp, de Joaquín Peñalva. Todo el trabajo y el mérito de este proyecto son suyos; este fork es solamente una adaptación al campus de la UNAHUR. Si estudiás en la UTN, usá el original. Si te gustó, dale una estrellita al original ❤️

Este es el Model Context Protocol server NO OFICIAL de la Universidad Nacional de Hurlingham. Con él podés pedirle a tu agente de preferencia (Claude, ChatGPT, etc.) que busque información y lea los apuntes del aula virtual y, con tu confirmación, que publique en los foros o entregue tareas. Corre en tu computadora o como servidor HTTP con OAuth, para usarlo desde cualquier lado.

Qué podés pedirle

  • "¿Cuándo es el recuperatorio del primer parcial de Álgebra?"

  • "¿Qué avisó la profesora de Física esta semana?"

  • "Resumime la guía de la unidad 3 de Sistemas Operativos."

  • "Pasame el link para bajar el apunte de calorimetría."

  • "¿Qué nota me pusieron en el TP1 y qué me corrigieron?"

  • "Preguntá en el foro de consultas si el parcial incluye la unidad 4."

  • "Anotame en el grupo 6."

  • "Agendame el recuperatorio del 14 a las 18."

El agente recorre el aula como lo harías vos: entra al curso, mira los foros y abre los archivos que hagan falta.

Related MCP server: Moodle Study MCP

Tools

Tool

Qué hace

aula_list_courses

Lista tus cursos. Es el punto de partida.

aula_open

Entra a un curso, un módulo, un foro o una discusión. Cada respuesta trae las direcciones de lo que hay adentro y de un nivel más arriba, así el agente navega sin perderse.

aula_read_file

Lee un archivo del aula, por partes cuando es largo.

aula_get_site_info

Datos de tu usuario y de tu campus en el aula virtual.

aula_forum_post

Abre un hilo en un foro o responde en una discusión.

aula_forum_edit_post

Edita una publicación tuya.

aula_forum_delete_post

Borra una publicación tuya.

aula_assign_submit

Entrega una tarea: sube archivos de tu compu, escribe el texto en línea y confirma el envío.

aula_assign_upload_link

Solo en modo HTTP: un link para subir los archivos de una entrega, que usa el agente con curl o vos desde el navegador.

aula_choice_answer

Responde una elección o te anota en un grupo.

aula_send_message

Manda un mensaje privado a un docente o compañero.

aula_calendar_add_event

Agrega un recordatorio a tu calendario del aula.

Al abrir una tarea, aula_open muestra si la entregaste, cuándo vence y la devolución con la nota. Las tools que escriben le piden al agente que te muestre lo que va a hacer y espere tu confirmación.

Archivos que puede leer

  • PDF: el texto, página por página. Los escaneados se mandan como imagen de cada página, y el agente los lee igual.

  • Word (.docx), PowerPoint (.pptx) y Excel (.xlsx): el texto, con las tablas fila por fila.

  • Imágenes (PNG, JPG, GIF) y texto plano.

Los formatos viejos de Office (.doc, .ppt, .pps), los comprimidos (.zip, .rar) y los videos no se leen. En ese caso el agente te pasa el link para que lo bajes.

Cada archivo viene con un link del aula virtual que podés abrir en tu navegador. Funciona con tu sesión del aula (si no estás logueado te manda al login) y nunca incluye tu token: ese queda siempre en tu computadora.

Cómo instalar

Necesitás Node.js 20 o superior. No hace falta clonar el repo ni instalar nada a mano: npx descarga el paquete solo.

1. Iniciar sesión

npx -y unahur-mcp login

Te pide tu campus, tu usuario y tu contraseña: los mismos con los que entrás al aula virtual. Se hace una sola vez: después el servidor renueva la sesión solo.

2. Agregarlo a tu cliente

Claude Code

claude mcp add unahur -- npx -y unahur-mcp

Claude Desktop: en Settings → Developer → Edit Config, agregá dentro de mcpServers:

"unahur": {
  "command": "npx",
  "args": ["-y", "unahur-mcp"]
}

En Windows, si no arranca, usá "command": "cmd" y "args": ["/c", "npx", "-y", "unahur-mcp"]. Después reiniciá Claude Desktop por completo.

Codex

codex mcp add unahur -- npx -y unahur-mcp

Gemini CLI

gemini mcp add unahur npx -y unahur-mcp

OpenClaw

openclaw mcp add unahur --command npx --arg -y --arg unahur-mcp

Hermes: en ~/.hermes/config.yaml:

mcp_servers:
  unahur:
    command: "npx"
    args: ["-y", "unahur-mcp"]

Cursor: en ~/.cursor/mcp.json:

{
  "mcpServers": {
    "unahur": { "command": "npx", "args": ["-y", "unahur-mcp"] }
  }
}

VS Code: en .vscode/mcp.json (o con MCP: Add Server desde la paleta de comandos):

{
  "servers": {
    "unahur": { "type": "stdio", "command": "npx", "args": ["-y", "unahur-mcp"] }
  }
}

ChatGPT: solo se conecta a servidores MCP remotos por HTTPS, así que necesita un servidor en modo HTTP publicado en internet (ver Hostearlo para otros). Se agrega como conector desde Configuración → Apps y conectores, con el modo desarrollador activado. Los conectores propios están desde el plan Pro, y ahí solo con las herramientas de lectura; para usar también las de escritura (foros, mensajes, entregas) hace falta Business o superior.

Otros clientes (Windsurf, opencode, etc.): cualquier cliente MCP que lance servidores por STDIO sirve con el comando npx -y unahur-mcp.

Instalación global (opcional)

Si preferís tener el comando unahur-mcp siempre disponible:

npm i -g unahur-mcp
unahur-mcp login

y en la config del cliente usás "command": "unahur-mcp" sin argumentos.

Campus

La UNAHUR tiene un campus virtual (Moodle) por año lectivo, campusAAAA.unahur.edu.ar. La lista se arma sola: va del año actual hasta 2023, el primero que existe, así que cada año aparece el campus nuevo sin actualizar nada. El campus se elige al iniciar sesión; viene marcado el del año. Campus 2026 ya está probado; los demás tienen habilitado el servicio que usa UNAHUR-MCP, así que casi seguro andan. Para cambiar de campus, volvé a correr login.

Al principio del año el campus nuevo puede no existir todavía: si el login falla con el que viene marcado, elegí el del año anterior.

Si querés usar un aula que no sigue ese formato, definila en un .env en la carpeta desde donde corrés unahur-mcp (o en el entorno) y aparece como una opción más al iniciar sesión:

UTN_AULA_BASE_URL=https://otra-aula.unahur.edu.ar

UTN_REGIONAL (por ejemplo, UTN_REGIONAL=2025) elige el que viene marcado por defecto, y es la que se usa si en lugar de login definís UTN_USER y UTN_PASS.

Modo HTTP (opcional)

Necesita Node 22.13 o más nuevo. Primero, una vez:

npx -y unahur-mcp login --http

Te muestra un token: configurá tu cliente MCP para que mande el header Authorization: Bearer <token>. Después:

npx -y unahur-mcp --http --port 3000

Levanta el servidor en http://127.0.0.1:3000/mcp, solo accesible desde tu propia máquina. Tenés que dejar la terminal abierta mientras lo uses.

En este modo el servidor no lee archivos de tu disco: para entregar, el agente pide un link con aula_assign_upload_link y sube ahí los archivos con curl si tiene terminal, o te pasa el link para que los elijas desde el navegador.

Hostearlo para otros

En modo HTTP el servidor también es servidor de autorización OAuth: un cliente MCP (Claude, ChatGPT) que se conecta a https://tu-dominio/mcp recibe un 401, descubre el OAuth y abre una página donde el alumno elige su campus y entra con su usuario de la UNAHUR. Cada alumno usa el campus que elige. Ese login vincula su aula: la contraseña se usa una sola vez para sacar el token de Moodle y no se guarda. Cuando la sesión del aula vence, el agente le pasa el link de /login para renovarla, sin reconectar el cliente.

Quién puede entrar lo decidís vos: con UTN_MCP_ALLOWED_EMAILS (una lista), o con UTN_MCP_ACCESS_URL, que apunta a un servicio tuyo. El servidor le hace POST con { "email", "usuario", "regional" } y el header Authorization: Bearer <UTN_MCP_ACCESS_SECRET>, y espera { "permitido": true } o { "permitido": false, "motivo": "...", "url": "..." }. Se consulta al conectar y en cada renovación del token (cada hora), así que una baja se aplica sola.

La configuración va en variables de entorno o en un .env en la carpeta desde donde lo corrés (copiá .env.example):

Variable

Para qué

Por defecto

HOST, PORT

Dónde escucha.

127.0.0.1, 3000

UTN_MCP_PUBLIC_URL

Dirección pública (https://mcp.tu-dominio.com). Es el issuer del OAuth, la base de los links de subida y el único host, además de localhost, que se acepta en Host y Origin.

http://127.0.0.1:<PORT>

UTN_MCP_ACCESS_URL, UTN_MCP_ACCESS_SECRET

Servicio que decide quién puede entrar.

—

UTN_MCP_ALLOWED_EMAILS

Emails o dominios (@unahur.edu.ar) habilitados, separados por coma, si no hay UTN_MCP_ACCESS_URL.

Entra cualquiera con usuario de la UNAHUR

UTN_MCP_REDIRECT_ALLOW

Hosts (app.ejemplo.com) o esquemas (miapp:) extra, separados por coma, a los que puede volver el login de OAuth. Loopback, Claude, ChatGPT, VS Code y Cursor pasan siempre. Cualquier otro host HTTPS (un agente propio, por ejemplo) se acepta, pero el login avisa a dónde vuelve y el alumno tiene que marcar que lo conecta bajo su responsabilidad: es la defensa contra alguien que use tu página de login para quedarse con su sesión. Los hosts de esta lista pasan sin aviso.

—

UTN_MCP_ADMIN_SECRET

Habilita la API de /admin para un panel de cuentas tuyo: POST /admin/usuarios (todos los usuarios con sus apps), /admin/clientes y /admin/clientes/revocar (las apps de un usuario, por email), /admin/regionales (los campus con su soporte) y /admin/verificar (entra al aula con usuario y contraseña, como el login de OAuth, y le guarda la sesión).

—

UTN_MCP_LOGIN_URL

Página donde el usuario renueva su sesión del aula; el agente se la pasa.

<UTN_MCP_PUBLIC_URL>/login

UTN_MCP_DB, UTN_MCP_KEY

Base de sesiones y su clave de cifrado (32 bytes en base64).

En la carpeta de config

Con Docker, detrás de un reverse proxy con HTTPS en la misma máquina (red host, para que el rate limit del login vea la IP real):

docker build -t unahur-mcp .
docker run -d --name unahur-mcp --network host --restart unless-stopped \
  -e HOST=127.0.0.1 -e PORT=8100 -e UTN_MCP_PUBLIC_URL=https://mcp.tu-dominio.com \
  -e UTN_MCP_KEY=$(openssl rand -base64 32) -v unahur-mcp-data:/data unahur-mcp

Guardá esa UTN_MCP_KEY: sin ella no se pueden descifrar las sesiones guardadas.

Dónde se guardan tus datos

Instalado en tu computadora, todo queda ahí:

  • Usuario y contraseña: en el gestor de credenciales del sistema (Windows Credential Manager, Keychain en macOS, Secret Service en Linux).

  • Token del aula virtual: en %APPDATA%\unahur-mcp\session.json (Windows) o ~/.config/unahur-mcp/session.json (Linux y macOS).

  • En modo HTTP: la contraseña no se guarda; la sesión va cifrada en unahur-mcp.db, en la misma carpeta, con la clave de store.key (o la de UTN_MCP_KEY). Del token del cliente solo se guarda el hash.

En Linux sin gestor de credenciales (servidores, Docker, WSL) podés definir las variables de entorno UTN_USER y UTN_PASS en lugar de usar login.

Si usás un servidor hosteado por otra persona, tu sesión del aula la guarda ese servidor (cifrada, y sin tu contraseña): revisá su política de privacidad.

Desarrollo

git clone https://github.com/franiiel/unahur-mcp.git
cd unahur-mcp
npm install
npm run login   # una vez
npm run dev     # servidor por STDIO desde src/, con tsx
npm run build   # compila a build/

pdf.js no es una dependencia del paquete publicado. Está como devDependency, y npm install corre el script prepare, que copia a vendor/pdfjs/ solo los archivos que usa el servidor (~4 MB). Así, quien instala unahur-mcp no baja pdf.js entero ni su canvas nativo opcional (~37 MB). Si instalaste con --ignore-scripts, generalo a mano con npm run prepare.

Aviso

Este proyecto no está afiliado ni avalado por la UNAHUR ni por la UTN. Está basado en utn-mcp, de Joaquín Peñalva (licencia ISC). Usalo bajo tu responsabilidad.

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.

NameRequiredDescriptionDefault
textoNoTexto 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"
enviarNoSolo en tareas con borradores: confirmar el envío para que cuente como entregada. Por defecto, true. Ej: false para dejarla como borrador.
archivosNoLista 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"].
direccionYesDirección de la tarea, de aula_open. Ej: "/curso/29487/mod/1729138".
aceptoDeclaracionNotrue si el usuario aceptó la `declaracion` de la tarea. Solo hace falta si la tarea la pide. Ej: true.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
inicioYesFecha y hora en ISO 8601 con zona horaria. Ej: "2026-10-14T18:00:00-03:00".
nombreYesTítulo del evento. Ej: "Parcial de Física II".
descripcionNoDetalle, en texto plano. Ej: "Aula 312, unidades 1 a 4".
duracionMinutosNoDuración en minutos. Por defecto, sin duración. Ej: 120.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault
opcionesYes`id` de las opciones a elegir. Ej: [31076]. Varias solo si la actividad lo permite.
direccionYesDirección del módulo. Ej: "/curso/29487/mod/1729113".

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault
idYes`id` de la publicación, de aula_open. Ej: 768118.
direccionYesDirección de la discusión donde está la publicación. Ej: "/curso/691/mod/34831/disc/416676".

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault
idYes`id` de la publicación, de aula_open. Ej: 768118.
asuntoNoAsunto nuevo. Si no se pasa, queda el que tenía. Ej: "Consulta sobre el parcial (resuelta)".
mensajeYesEl mensaje nuevo completo, en texto plano; reemplaza al anterior. Ej: "Ya lo resolví, gracias."
direccionYesDirección de la discusión donde está la publicación. Ej: "/curso/691/mod/34831/disc/416676".

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
asuntoNoObligatorio para abrir un hilo. En una respuesta, por defecto "Re: <asunto>". Ej: "Consulta sobre el parcial".
mensajeYesTexto del mensaje, en texto plano. Una línea en blanco separa párrafos. Ej: "Hola, ¿el parcial incluye la unidad 4?"
direccionYesDirección de un foro o de una discusión. Ej: "/curso/691/mod/34831" o "/curso/691/mod/34831/disc/416676".
respuestaANoSolo al responder: `id` de la publicación a la que se responde, de aula_open. Ej: 768118.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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_infoA
Read-only

Datos del usuario logueado y del sitio Moodle de su aula virtual. regional es el campus de la UNAHUR de esa aula (por ejemplo, "Campus 2026"): cada año lectivo tiene su propio campus.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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 useful domain context by explaining that `regional` refers to the UNAHUR campus for that classroom and that each academic year has its own campus, but it does not describe the full return shape or authentication behavior beyond the logged-in-user implication.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with no wasted text. The primary purpose is front-loaded, and the second sentence provides targeted context for interpreting the `regional` value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity, zero parameters, and absence of an output schema, the description is largely complete: it identifies the returned entities and explains the `regional` campus concept. A little more detail about the exact fields returned would improve completeness, but nothing critical for invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline score is 4. The description does not need to explain parameter syntax, and the mention of `regional` is helpful for interpreting returned data rather than compensating for missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns data for the logged-in user and the Moodle site of their virtual classroom, using the concrete example of `regional` as the UNAHUR campus. It does not explicitly compare itself with sibling tools, but the resource and scope are clear enough to distinguish it from action-oriented siblings like `aula_list_courses` or `aula_send_message`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what data is returned but gives no explicit guidance on when to use this tool versus alternatives, nor does it state prerequisites or exclusions. Usage is only implied by the fact that the tool returns current user and site information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault
paginaNoSolo para foros: página del índice de discusiones, de 50 en 50. La respuesta avisa con `hayMasDiscusiones` cuando hay otra.
direccionYesDirección a abrir, sacada de una respuesta anterior. Ej: "/", "/curso/691", "/curso/691/mod/34806", "/curso/691/mod/34806/disc/421348".

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
urlYesLa `url` del archivo tal como la devuelve aula_open.
desdeNoNúmero de página, diapositiva o fragmento desde el cual leer. Por defecto, 1.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
mensajeYesTexto del mensaje, en texto plano. Ej: "Profe, ¿puedo rendir el recuperatorio el viernes?"
usuarioIdYesId del destinatario, del `autorId` de aula_open. Ej: 1066.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 11 tool updatesv0.8.3
    • First observedaula_assign_submit
    • First observedaula_calendar_add_event
    • First observedaula_choice_answer
    • First observedaula_forum_delete_post
    • First observedaula_forum_edit_post
    • First observedaula_forum_post
    • First observedaula_get_site_info
    • First observedaula_list_courses
    • First observedaula_open
    • First observedaula_read_file
    • First observedaula_send_message

TDQS

A4.1/5.0

Scored across 11 tools

Disambiguation4/5

Each tool targets a distinct action: navigation (aula_open, aula_list_courses), reading (aula_read_file, aula_get_site_info), forum CRUD, submission, choice answers, messaging, and calendar. The only mild overlap is that aula_open can open a course while aula_list_courses lists enrolled courses and '/'-navigation is shared, but descriptions make the roles clear. No two tools appear to do the same thing.

Naming Consistency4/5

All tools share the 'aula_' prefix and snake_case, and resource-scoped write tools (aula_forum_post, aula_forum_edit_post, aula_assign_submit, aula_choice_answer) form coherent families. However ordering is mixed: read tools use verb_noun (get_site_info, list_courses, read_file) while writes use noun_verb, and aula_open is a bare verb — a minor structural deviation but still predictable.

Tool Count5/5

11 tools is well within the ideal 3-15 range and every tool earns its place: navigation, reading, forum lifecycle, submission, choice, messaging, and calendar. No redundant or filler tools.

Completeness4/5

Covers the core student workflow end-to-end: discovery, navigation, file reading, forum CRUD, assignment submission, choice/group answers, private messaging, and calendar reminders. Minor gaps remain — messaging is send-only (no inbox read) and calendar is add-only (no edit/delete) — but these are workable around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to access Moodle virtual classrooms and SIU Guaraní for Argentine universities, including reading course materials, searching discussions, checking grades and academic status, and, with confirmation, posting to forums or submitting assignments.
    MIT