Skip to main content
Glama

uniboh — Unibo MCP Server

A Model Context Protocol server (stdio transport, TypeScript) that exposes University of Bologna services to MCP clients. Today it covers:

  • virtuale.unibo.it — the Unibo Moodle instance, via its service.php AJAX API (enrolled courses, course state, file/resource download, Panopto content).

  • corsi.unibo.it — public course timetables, normalized to events and exported as an ICS calendar.

  • almaesami.unibo.it — student exam plan, history, messages, and upcoming appelli, read-only.

  • rps.unibo.it — student attendance ("Presenze studenti"): records and register, read-only.

  • studenti.unibo.it — Studenti Online (SOL): career summary and service catalogue, read-only.

The longer-term goal is to wrap any Unibo service behind one MCP server — see CLAUDE.md.

Install

npm install
npm run build

Related MCP server: mcpUPB

Run

Stdio transport, for use by an MCP client.

No credentials (health check + calendar tools only):

npm run dev

With a preloaded session (enables the authenticated Virtuale tools):

VIRTUALE_BASE_URL="https://virtuale.unibo.it" \
VIRTUALE_SESSKEY="your_sesskey" \
VIRTUALE_COOKIES="MoodleSession=...; other_cookie=..." \
npm run dev

npm run start runs the compiled dist/server.js instead of tsx.

Environment variables

Variable

Required

Purpose

VIRTUALE_BASE_URL

no (defaults to https://virtuale.unibo.it)

Moodle base URL.

VIRTUALE_SESSKEY

no

Moodle sesskey; with VIRTUALE_COOKIES, enables authenticated tools without a login call.

VIRTUALE_COOKIES

no

Cookie header (e.g. MoodleSession=...).

ALMAESAMI_BASE_URL

no (defaults to https://almaesami.unibo.it)

AlmaEsami base URL.

ALMAESAMI_COOKIES

no

Cookie header with an authenticated JSESSIONID; fallback for the almaesami_* tools.

RPS_BASE_URL

no (defaults to https://rps.unibo.it)

RPS base URL.

RPS_COOKIES

no

Cookie header with an authenticated PHPSESSID; fallback for the rps_* tools.

SOL_BASE_URL

no (defaults to https://studenti.unibo.it)

Studenti Online base URL.

SOL_COOKIES

no

Cookie header with an authenticated JSESSIONID; fallback for the sol_* tools.

EMAIL

no

Unibo SSO email; with PASSWORD, enables unibo_browser_login (headless-Chromium ADFS login for Virtuale + AlmaEsami + RPS + Studenti Online) and transparent auto re-login on session expiry. Shared across services since they all federate to the same idp.unibo.it SSO.

PASSWORD

no

Unibo SSO password. Only works for accounts without interactive MFA.

Authentication

All three authenticated services (Virtuale, AlmaEsami, RPS) federate to the same idp.unibo.it ADFS SSO, so a single unified in-memory session store holds per-service credentials: one session_id can carry a Virtuale sesskey+cookies, an AlmaEsami JSESSIONID, and an RPS PHPSESSID at once. Authenticated Virtuale tools need both a sesskey and a cookie header; AlmaEsami/RPS need only their host cookie. Ways to provide them:

  1. Env varsVIRTUALE_SESSKEY + VIRTUALE_COOKIES, ALMAESAMI_COOKIES, RPS_COOKIES, set once at startup.

  2. EMAIL + PASSWORD, via unibo_browser_login — drives a real headless Chromium through Unibo's ADFS SSO flow (Home Realm Discovery → AD login), then reuses the same shared IdP session to complete the AlmaEsami and RPS SAML handshakes too, capturing every host's cookies automatically. Best-effort per service (the result reports per-service success). Only works for accounts without interactive MFA. See scripts/test-browser-login.mjs to verify your account works before wiring it into an MCP client. (virtuale_browser_login remains as a deprecated alias.)

  3. *_bootstrap_session — paste credentials grabbed from a logged-in browser; returns a session_id. The reliable path for accounts with MFA. virtuale_bootstrap_session takes a sesskey + cookies; almaesami_bootstrap_session / rps_bootstrap_session take a cookie header (the cookie is never echoed back).

  4. virtuale_login_with_password — best-effort direct form login (no browser). This will fail for accounts on federated SSO (most Unibo accounts); prefer options 2 or 3.

Auto re-login. When EMAIL + PASSWORD are set and a call fails because the session expired, the server transparently re-runs the headless browser login once, updates the stored credentials, and retries the call — but only for env-backed or unibo_browser_login sessions (credentials that are ours to refresh), never for pasted *_bootstrap_session credentials. Concurrent expiries share a single in-flight re-login so an expiry storm triggers at most one browser login.

Session data is kept in server memory only and is never written to disk. Treat sesskey + cookies as account-bound secrets.

Keeping secrets out of the model's context

If credentials are set via env vars (VIRTUALE_SESSKEY/VIRTUALE_COOKIES, ALMAESAMI_COOKIES, RPS_COOKIES), every tool already falls back to them silently when a call omits cookies/session_id — the model never has to see or pass the secret at all.

If you'd rather the model work with an explicit handle instead of an invisible fallback, call the corresponding env-session tool first — virtuale_get_env_session, almaesami_get_env_session, rps_get_env_session, or (if you'd rather store an SSO password than pre-captured cookies) unibo_browser_login — each takes no input (browser login takes only an optional force_relogin), reads its env var(s) server-side, and returns only an opaque session_id (idempotent: repeat calls return the same id). Pass that session_id to the other tools. unibo_browser_login's single session_id works across the virtuale_*, almaesami_*, and rps_* tools. The underlying secret is never included in any of these responses.

The *_bootstrap_session and virtuale_login_with_password tools still take credentials as tool input (by design, since you're supplying them inline), so those do pass through the model's context. The *_bootstrap_session tools never echo the pasted cookie back.

Tools

Session management

  • unibo_browser_login — mint/reuse one session_id (usable across virtuale_*, almaesami_*, rps_*) by driving a headless Chromium through ADFS SSO with EMAIL/PASSWORD and completing every service's SAML handshake off the shared IdP session; never returns the password/sesskey/cookies, and reports per-service success. No interactive-MFA support. Optional force_relogin.

  • virtuale_browser_logindeprecated alias for unibo_browser_login (same handler).

  • virtuale_bootstrap_session — build a session from an existing Virtuale sesskey + cookies.

  • almaesami_bootstrap_session / rps_bootstrap_session — build a session from a pasted AlmaEsami JSESSIONID / RPS PHPSESSID cookie header; the cookie is never echoed back.

  • virtuale_get_env_session / almaesami_get_env_session / rps_get_env_session — mint/reuse a session_id from that service's env cookie(s) without ever returning the secret. See Keeping secrets out of the model's context.

  • virtuale_login_with_password — best-effort form login → stores session, returns session_id (fails on federated SSO).

  • virtuale_get_session_info — stored session metadata (origin, which services it carries, optionally the cookie headers).

  • virtuale_logout_session — drop one session from memory.

  • virtuale_health_check — no-login core_get_string probe for connectivity.

Virtuale (authenticated)

  • virtuale_get_enrolled_courses — wraps local_uniboapi_get_enrolled_courses_unibo.

  • virtuale_get_course_state — wraps core_courseformat_get_state, parses the state JSON.

  • virtuale_list_course_files — slims core_courseformat_get_state down to the downloadable files/resources, grouped by section (cmid, name, modname, url) — a token-friendly view; feed a cmid to virtuale_get_resource.

  • virtuale_get_panopto_content — wraps block_panopto_get_content.

Each accepts an optional session_id; if omitted, the env-var session is used.

  • virtuale_get_resource — fetches a course file/resource by cmid (builds /mod/resource/view.php?id=<cmid>) or an explicit url, following the redirect to the protected pluginfile.php content. Always returns metadata (final URL, content-type, size, filename); with save_to (an absolute path) it streams the file to disk, otherwise it returns text inline for text-like files and extracts + returns the text of PDFs (long text is truncated — pass save_to for the full file). Accepts session_id, cookies (a header with an authenticated MoodleSession), or falls back to VIRTUALE_COOKIES. Read-only.

Virtuale quizzes (authenticated, read-only)

mod_quiz_* isn't on the AJAX service allowlist, so these scrape the same HTML a browser sees (course page → quiz page → attempt review page). Each accepts session_id, cookies (a cookie header with an authenticated MoodleSession), or falls back to VIRTUALE_COOKIES.

  • virtuale_quiz_list_course_quizzes — quiz activities on a course page, with the cmid needed by the other quiz tools.

  • virtuale_quiz_list_attempts — a quiz's attempt summaries (status, dates, marks, grade, review URL/attempt id) for finished attempts.

  • virtuale_quiz_get_attempt_review — one finished attempt's questions, answer options, the student's selection, correctness, and feedback.

  • virtuale_quiz_sync_bank — diffs a local quiz-bank JSON file (bank_path) against Moodle attempts by attempt_id, fetches only the new attempt reviews, and appends them to the file in the bank's schema (backing up to <bank_path>.bak first). cmids defaults to the bank's own quizzes list; dry_run reports what would be fetched without writing. Writes to disk; returns only a count summary, never question content.

Scoped to reviewing attempts already finished and reviewable under the quiz's own review settings — it does not start, resume, or answer a live/in-progress attempt.

Timetable / calendar (public, no auth)

  • unibo_calendar_resolve_timetable_url — find the corsi.unibo.it timetable URL from a course page.

  • unibo_calendar_list_curricula — list curricula from @@available_curricula.

  • unibo_calendar_list_teachings — extract teaching IDs from the timetable page.

  • unibo_calendar_get_events — fetch @@orario_reale_json events, optional teaching-code filter.

  • unibo_calendar_get_ics — same, returned as an ICS calendar string.

AlmaEsami (authenticated)

All read-only. Each accepts session_id (from almaesami_get_env_session, almaesami_bootstrap_session, or unibo_browser_login) or cookies (a cookie header with an authenticated JSESSIONID), or falls back to ALMAESAMI_COOKIES.

  • almaesami_bootstrap_session — mint a session_id from a pasted JSESSIONID cookie header (never echoed back).

  • almaesami_get_env_session — mint/reuse a session_id from ALMAESAMI_COOKIES without ever returning the cookie.

  • almaesami_get_exam_plan — the exam plan (activities, CFU, status, bookable flag).

  • almaesami_get_exam_history — the exam history / cronologia (appello date, examiner, type/mode, status).

  • almaesami_get_messages — student messages (subject, sender, date, related appello).

  • almaesami_list_appelli — upcoming exam sessions (appelli): date/time, activity, examiner, type/mode, enrollment window, and a bookable flag — to answer "when can I sit exam X". The endpoint/grid is UNVERIFIED (it lives behind SSO and could not be confirmed against a live session): the result carries unverified: true, the parser reads fields by content so it tolerates layout changes, and the endpoint path is overridable. If it returns nothing, fall back to the bookable flags on almaesami_get_exam_plan.

These never mutate state: booking an exam ("prenota") and deleting messages ("Cancella") are intentionally not automated.

AlmaEsami is behind ADFS SSO with no JSON API. If EMAIL/PASSWORD are set (non-MFA account), unibo_browser_login captures the JSESSIONID automatically. Otherwise authenticate the bootstrap way: log in via a browser, copy the JSESSIONID cookie for almaesami.unibo.it (it expires after a short idle period), and hand it to almaesami_bootstrap_session. See almaesami-rps-api-notes.md.

RPS — attendance (authenticated)

All read-only. Each accepts session_id (from rps_get_env_session, rps_bootstrap_session, or unibo_browser_login) or cookies (a cookie header with an authenticated PHPSESSID), or falls back to RPS_COOKIES.

  • rps_bootstrap_session — mint a session_id from a pasted PHPSESSID cookie header (never echoed back).

  • rps_get_env_session — mint/reuse a session_id from RPS_COOKIES without ever returning the cookie.

  • rps_get_attendance_records — recorded presences (date, subject, lecturer, duration).

  • rps_get_register — per-subject hours attended and attendance percentage.

Confirming attendance by entering a "codice rilevazione" is a write action and is intentionally not automated. If EMAIL/PASSWORD are set (non-MFA account), unibo_browser_login captures the PHPSESSID automatically. Otherwise authenticate the bootstrap way: log fully into rps.unibo.it, confirm you see the app (not the SSO Sign In page), copy the PHPSESSID cookie, and hand it to rps_bootstrap_session.

Studenti Online — SOL (authenticated)

All read-only. Each accepts session_id (from sol_get_env_session, sol_bootstrap_session, or unibo_browser_login) or cookies (a cookie header with an authenticated JSESSIONID), or falls back to SOL_COOKIES.

  • sol_bootstrap_session — mint a session_id from a pasted JSESSIONID cookie header (never echoed back).

  • sol_get_env_session — mint/reuse a session_id from SOL_COOKIES without ever returning the cookie.

  • sol_get_career — the student's home/career summary: greeting/identity, enrolled course of study, and in-progress requests.

  • sol_get_services — the catalogue of Studenti Online service tiles (name, link, description) — fees, certificates, enrolments, etc. — so a caller can discover what the portal exposes.

First integration, partly unverified: the sol_* readers were derived from a single logged-in home-page capture, so selectors are best-effort and individual fields degrade to empty rather than failing. Consequential pages behind the service tiles (paying fees, new enrolment/career requests, degree applications) mutate real state and are intentionally not automated. See sol-api-notes.md.

Calendar flow example

  1. unibo_calendar_resolve_timetable_url with the unibo.it course URL.

  2. unibo_calendar_list_curricula with the resolved timetable URL.

  3. (optional) unibo_calendar_list_teachings to get teaching IDs to filter on.

  4. unibo_calendar_get_events or unibo_calendar_get_ics with year, curriculum, and optional teaching codes.

Development

npm run typecheck   # tsc --noEmit
npm test            # node built-in test runner via tsx
npm run build       # emit dist/

Tests live next to sources as src/*.test.ts and are excluded from the build.

Reference notes

License

ISC — see LICENSE.

Available Tools

35 tools
almaesami_bootstrap_sessionBootstrap AlmaEsami SessionB

Creates a server-side session from an existing almaesami cookie header (JSESSIONID cookie header for almaesami.unibo.it). Returns an opaque session_id; the cookie is never echoed back.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoalmaesami-bootstrap
cookiesYesJSESSIONID cookie header for almaesami.unibo.it

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the cookie is not echoed back and returns an opaque session_id, but lacks details on error conditions, session lifetime, or idempotency. With no annotations, this is a moderate effort.

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 sentences, no fluff. Every word adds value.

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

Completeness3/5

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

Adequate for a simple bootstrap tool, but missing workflow context (e.g., that this precedes other almaesami tools) and error behavior. No output schema shifts burden to description, which is only partially met.

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

Parameters2/5

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

Schema coverage is 50%; description only repeats the cookie schema description and does not explain the 'label' parameter. Fails to compensate for undocumented parameters.

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?

Description clearly states the verb (creates) and resource (server-side session from existing cookie), and distinguishes from siblings like rps_bootstrap_session by specifying the almaesami domain.

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?

No guidance on when to use this tool versus alternatives (e.g., almaesami_get_env_session) or when not to use it. The context is implied but not explicit.

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

almaesami_get_env_sessionGet AlmaEsami Env-Backed SessionA

Mints (or reuses) a session_id backed by the server's ALMAESAMI_COOKIES env var. The cookie is never returned — only an opaque session_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries the burden. Reveals that the cookie is never returned and that it may reuse sessions (mint or reuse). However, lacks details on cache duration, error conditions, or auth requirements beyond the env var.

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 sentences, no wasted words. Front-loaded with the key verb and resource, then adds critical behavioral detail. Highly efficient.

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 zero-parameter, no-output-schema tool, the description is largely complete: explains what it does, the env var backing, and what it returns. Could specify conditions for mint vs reuse, but overall sufficient.

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?

No parameters exist, and schema coverage is 100%. The description adds value by explaining the behavior (env-backed, opaque session_id) beyond the empty schema. Baseline for 0 params is 4.

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?

Clearly describes the action ('mints or reuses a session_id') and the resource (env-backed session). Distinguishes from siblings by specifying the backing env var and that the cookie is never returned, only an opaque session_id.

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?

No explicit guidance on when to use this tool over siblings like almaesami_bootstrap_session, rps_get_env_session, etc. Only implied from the description, but lacks direct comparisons or conditions.

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

almaesami_get_exam_historyGet AlmaEsami Exam HistoryA
Read-only

Reads the authenticated student's AlmaEsami exam history (Cronologia): appello date, activity, examiner, type/mode, and status. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated JSESSIONID from a logged-in AlmaEsami browser session. Falls back to session_id, then ALMAESAMI_COOKIES.
base_urlNo
session_idNosession_id from almaesami_get_env_session, almaesami_bootstrap_session, or unibo_browser_login.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description reinforces 'Read-only' and adds that the data is for the 'authenticated student', which is a useful behavioral detail beyond the annotations. No contradictions are present.

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 a single, well-structured sentence that immediately states the purpose and lists the key data fields. Every part adds value without redundancy or unnecessary elaboration.

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 read-only tool with no output schema, the description adequately names the fields returned. However, it could be more complete by indicating whether the result is an array or single object, or if pagination applies. Given the simple nature and presence of annotations, the description is mostly sufficient.

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?

The input schema describes 3 parameters with 67% coverage (cookies and session_id have descriptions). The description does not add any extra meaning about the parameters beyond what the schema already provides. Given the coverage, the baseline of 3 is appropriate.

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 uses the specific verb 'reads' and names the resource 'AlmaEsami exam history' with a parenthetical Italian term and a list of fields ('appello date, activity, examiner, type/mode, and status'). This clearly distinguishes it from sibling tools like almaesami_list_appelli or almaesami_get_exam_plan, which serve different purposes.

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

Usage Guidelines3/5

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

The description implies usage context by stating 'authenticated student', but does not explicitly tell the agent when to use this tool versus alternatives. It lacks guidance on prerequisites (e.g., need for a valid session) or scenarios where other exam tools would be more appropriate. A clearer indication of when to choose this over almaesami_get_exam_plan or almaesami_list_appelli would raise the score.

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

almaesami_get_exam_planGet AlmaEsami Exam PlanA
Read-only

Reads the authenticated student's AlmaEsami exam plan (Riepilogo Esami): activities, CFU, status, and whether each is bookable. Read-only; does not book exams.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated JSESSIONID from a logged-in AlmaEsami browser session. Falls back to session_id, then ALMAESAMI_COOKIES.
base_urlNo
session_idNosession_id from almaesami_get_env_session, almaesami_bootstrap_session, or unibo_browser_login.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true (safe read) and openWorldHint=true (external changes possible). The description confirms read-only behavior and adds that it does not book exams, which is consistent. No additional behavioral details like error handling or rate limits are provided, but the annotations cover the core safety profile.

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 sentences long with no repetition or filler. Every sentence adds value: the first states purpose and content, the second clarifies read-only nature. It is front-loaded and efficient.

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?

No output schema is provided, but the description lists the return fields (activities, CFU, status, bookable). The tool is straightforward (no nested objects, no enums, 0 required params). However, the missing base_url parameter description and lack of mention of pagination or limits prevent a perfect score.

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 67% (cookies and session_id have descriptions, base_url does not). The description does not mention any parameters, so it adds no meaning beyond the schema. For the uncovered parameter (base_url), there is no compensation. Baseline for this coverage level is around 3.

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 uses the verb 'reads' and specifies the resource 'AlmaEsami exam plan (Riepilogo Esami)', listing what it contains (activities, CFU, status, bookable). This clearly distinguishes it from sibling tools like almaesami_get_exam_history (history) and almaesami_list_appelli (list sessions).

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

Usage Guidelines3/5

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

The description only states 'Read-only; does not book exams,' which implicitly indicates not to use for booking. However, it does not provide explicit comparisons to sibling tools or conditions for use. There is no guidance on when to use this tool versus almaesami_get_exam_history or almaesami_list_appelli.

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

almaesami_get_messagesGet AlmaEsami MessagesA
Read-only

Reads the authenticated student's AlmaEsami messages (subject, sender, received date, related appello). Read-only; does not delete messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated JSESSIONID from a logged-in AlmaEsami browser session. Falls back to session_id, then ALMAESAMI_COOKIES.
base_urlNo
session_idNosession_id from almaesami_get_env_session, almaesami_bootstrap_session, or unibo_browser_login.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, and the description confirms read-only behavior, adding that it does not delete messages. It also lists the specific fields returned (subject, sender, etc.), which adds value beyond the annotations. However, it does not elaborate on openWorldHint or other behavioral traits.

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 a single, clear sentence with no unnecessary words. It efficiently conveys the tool's purpose and constraints.

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 simple read-only tool with no output schema, the description provides a good summary of returned data. However, it does not mention potential limitations like pagination or prerequisites beyond the parameters, which could be helpful. Overall adequate but not exhaustive.

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?

The description does not add any parameter-specific details beyond what the schema provides. Schema coverage is 67% (two of three parameters have descriptions), but the description does not explain the missing base_url parameter or any parameter behavior, leaving it at baseline 3.

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 clearly states the verb ('reads'), the resource ('AlmaEsami messages'), and the scope ('authenticated student's'). It also explicitly mentions that it is read-only and does not delete messages, distinguishing it from potential mutation tools.

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?

The description indicates the tool is for reading messages and is read-only, implying its use case. However, it does not explicitly mention when to use this tool over alternatives or provide when-not-to-use guidance, though it is clear enough for a simple retrieval tool.

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

almaesami_list_appelliList AlmaEsami Appelli (Exam Sessions)A
Read-only

Lists the student's upcoming AlmaEsami appelli (bookable exam sessions): date/time, activity, examiner, type/mode, and enrollment window — to answer "when can I sit exam X". Read-only: it never books. NOTE: the underlying endpoint/grid is UNVERIFIED (it lives behind SSO and could not be confirmed live); the result carries unverified: true, and the parser reads fields by content so it tolerates layout changes. If it returns nothing, the exam-plan tool's bookable flags are the confirmed signal, or pass an explicit path.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoOverride for the appelli-list endpoint path (default /almaesami/studenti/appelloStudente-list.htm, which is UNVERIFIED). Provide the real route if known.
cookiesNoCookie header with an authenticated JSESSIONID from a logged-in AlmaEsami browser session. Falls back to session_id, then ALMAESAMI_COOKIES.
base_urlNo
session_idNosession_id from almaesami_get_env_session, almaesami_bootstrap_session, or unibo_browser_login.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable transparency: it states the endpoint is UNVERIFIED, the result carries unverified:true, and the parser tolerates layout changes. It also clarifies 'Read-only: it never books.' No contradiction with 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?

The description is three sentences, front-loaded with purpose, and every sentence adds unique value: purpose, limitations, and fallback guidance. No fluff.

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 there is no output schema, the description adequately lists what the tool returns (date/time, activity, examiner, type/mode, enrollment window, unverified flag). It also warns about the unverified status. Could mention pagination or error handling, but overall sufficient for a read-only listing tool.

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 75% (3 of 4 parameters described in schema). The description adds context for 'path' (default is UNVERIFIED, provide real route), 'cookies' (authenticated JSESSIONID, fallback chain), and 'session_id' (source from other tools). This enhances understanding 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?

The description specifies it lists upcoming AlmaEsami appelli (bookable exam sessions) with details like date/time, activity, examiner, type/mode, and enrollment window, and explicitly states it answers 'when can I sit exam X'. It distinguishes from siblings by noting it's read-only and about bookable sessions.

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?

The description provides clear context for when to use: to answer when an exam can be taken. It also offers fallback guidance: if it returns nothing, use the exam-plan tool's bookable flags or pass an explicit path. It does not explicitly state when not to use, but the read-only nature is clear.

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

rps_bootstrap_sessionBootstrap RPS SessionA

Creates a server-side session from an existing rps cookie header (PHPSESSID cookie header for rps.unibo.it). Returns an opaque session_id; the cookie is never echoed back.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNorps-bootstrap
cookiesYesPHPSESSID cookie header for rps.unibo.it

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It mentions that the cookie is never echoed back and returns an opaque session_id, but doesn't cover error handling, idempotency, or side effects.

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 efficient sentences that front-load the purpose and cover key behavioral details. No unnecessary words.

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?

No output schema, but the description mentions the return value (opaque session_id). For a simple session bootstrap tool, this is sufficient. However, it could note error conditions or prerequisites.

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

Parameters2/5

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

Schema description coverage is 50% (only 'cookies' has a description). The description adds minimal value: it mentions the cookie header but doesn't clarify the 'label' parameter's purpose. The parameter semantics rely heavily on 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?

The description clearly states it 'Creates a server-side session from an existing rps cookie header' and specifies the cookie domain 'rps.unibo.it'. This distinguishes it from sibling tools targeting other systems (e.g., Almaesami, SOL, Virtuale).

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?

The description implies usage when you have an RPS cookie header. It doesn't explicitly state when not to use it or name alternatives, but the context of sibling tools (e.g., almaesami_bootstrap_session) provides differentiation.

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

rps_get_attendance_recordsGet RPS Attendance RecordsB
Read-only

Reads the authenticated student's RPS attendance records (Rilevazioni): date, subject, lecturer, and lesson duration for each recorded presence. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated PHPSESSID from a logged-in RPS browser session. Falls back to session_id, then RPS_COOKIES.
base_urlNo
session_idNosession_id from rps_get_env_session, rps_bootstrap_session, or unibo_browser_login.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint. The description adds minimal behavioral context beyond stating 'Read-only' and listing output fields, failing to disclose auth requirements, error handling, or side effects.

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 a single sentence that is front-loaded with the purpose and contains no fluff. Every word contributes to understanding.

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

Completeness3/5

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

With no output schema, the description lists output fields but lacks detail on structure, ordering, or edge cases. Input parameters are not fully explained in context, but the tool is simple enough that the description is minimally adequate.

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

Parameters2/5

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

Schema description coverage is 67% (cookies and session_id described, base_url missing). The description adds no additional meaning to parameters beyond what is in the schema, missing an opportunity to explain base_url or relationship to session parameters.

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 clearly states the tool reads the authenticated student's RPS attendance records, listing specific fields (date, subject, lecturer, lesson duration). It uses the verb 'reads' and specifies the resource, distinguishing it from siblings like rps_get_register.

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?

No explicit guidance on when to use this tool versus siblings or prerequisites. The description implies an authenticated session but does not provide context on obtaining credentials or comparing to other RPS tools.

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

rps_get_env_sessionGet RPS Env-Backed SessionA

Mints (or reuses) a session_id backed by the server's RPS_COOKIES env var. The cookie is never returned — only an opaque session_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the cookie is never returned and that it returns an opaque session_id. With no annotations, this provides good behavioral context, though it could add details on prerequisites or side effects.

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 concise sentences, front-loaded with action, no redundant information. Every phrase contributes meaning.

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 simple zero-parameter tool with no annotations or output schema, the description covers the essential: what it does, how it works, and what it returns. Could mention that it establishes a session for subsequent RPS calls.

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?

Zero parameters, so baseline is 4. Description adds value by explaining the purpose and what it returns, clarifying the opaque nature of the session_id.

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?

Description clearly specifies the action ('mints or reuses'), resource ('session_id'), and backing ('RPS_COOKIES env var'). It distinguishes from sibling tools like almaesami_get_env_session by specifying the RPS context.

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

Usage Guidelines3/5

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

Implies usage through mention of 'RPS_COOKIES env var', but lacks explicit guidance on when to use this over other get_env_session siblings or when not to use it. No alternatives mentioned.

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

rps_get_registerGet RPS Attendance RegisterB
Read-only

Reads the authenticated student's RPS attendance register (Registro): per-subject hours attended and attendance percentage. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated PHPSESSID from a logged-in RPS browser session. Falls back to session_id, then RPS_COOKIES.
base_urlNo
session_idNosession_id from rps_get_env_session, rps_bootstrap_session, or unibo_browser_login.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds 'Read-only' (redundant) and specifies the return content (hours and percentage), providing some value beyond annotations. However, it does not disclose any behavioral traits like authentication failure handling or data freshness.

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 a single, front-loaded sentence that efficiently conveys the tool's purpose and output. Every word adds value, with no redundancy or unnecessary detail.

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

Completeness3/5

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

Given the tool has 3 parameters and no output schema, the description provides essential return content. However, it omits prerequisites (e.g., need for a valid session), authentication steps, and does not clarify how the tool relates to sibling tools, leaving gaps for a complete understanding.

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

Parameters2/5

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

With schema description coverage at 67%, the description adds no information about parameters beyond what the schema already provides. Parameters like 'cookies' and 'session_id' are not mentioned, missing an opportunity to explain authentication flow or fallback logic.

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 clearly states the tool reads the authenticated student's RPS attendance register, specifying the exact data returned (per-subject hours and percentage). It effectively distinguishes from sibling tools like 'rps_get_attendance_records' by focusing on aggregated register data.

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 lacks any guidance on when to use this tool versus alternatives. It does not mention prerequisites, when not to use, or explicitly compare with the sibling 'rps_get_attendance_records' tool, leaving the agent to infer usage context.

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

sol_bootstrap_sessionBootstrap Studenti Online SessionA

Creates a server-side session from an existing sol cookie header (JSESSIONID cookie header for studenti.unibo.it). Returns an opaque session_id; the cookie is never echoed back.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNosol-bootstrap
cookiesYesJSESSIONID cookie header for studenti.unibo.it

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose behavioral traits. It states the cookie is never echoed back, which is good, but lacks details on side effects, authorization, or error handling. The agent is left to infer that this is a non-destructive read operation, but the description does not confirm or deny.

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 extremely concise, using two sentences to convey purpose, input, and output. Information is front-loaded, with no unnecessary words.

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 lack of output schema and annotations, the description covers the essential aspects: input (cookie), action (create session), output (opaque ID), and a notable behavior (cookie not echoed). It lacks error conditions or usage context, but for a simple bootstrapping tool, it is reasonably complete.

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

Parameters2/5

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

Schema coverage is 50%. The description adds minimal value beyond the schema: it repeats the cookie description. The 'label' parameter is given a default but no context, and the description does not explain its purpose or how to use it appropriately.

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 clearly states the tool's function: creating a server-side session from a SOL cookie header. It specifies the source (studenti.unibo.it) and the output (opaque session_id). This distinguishes it from sibling session tools for other domains.

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

Usage Guidelines3/5

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

The description implies when to use (when having a JSESSIONID cookie from studenti.unibo.it) but does not provide explicit guidance on when to avoid or alternative tools. There is no mention of prerequisites or conditions.

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

sol_get_careerGet Studenti Online Career SummaryA
Read-only

Reads the authenticated student's Studenti Online (studenti.unibo.it) home page into a career summary: greeting/identity, enrolled course of study, and in-progress requests. Read-only; never submits requests or payments. NOTE: parsed from a single logged-in capture — selectors are best-effort and individual fields degrade to empty rather than failing.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated JSESSIONID from a logged-in Studenti Online browser session. Falls back to session_id, then SOL_COOKIES.
base_urlNo
session_idNosession_id from sol_get_env_session, sol_bootstrap_session, or unibo_browser_login.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, openWorldHint), the description adds critical behavioral context: it parses from a single logged-in capture, uses best-effort selectors, and degrades fields to empty rather than failing. This disclosure is essential for the agent to understand reliability and potential edge cases.

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 consists of two concise sentences plus a note, all front-loaded with key information. Every sentence serves a purpose: stating the action, specifying the output, and warning about reliability. There is no redundancy or verbosity.

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 tool's low complexity (3 parameters, no required, no output schema), the description adequately covers what the tool does and its limitations. It explains the return content and the best-effort nature. Missing details like how to obtain the cookies/session_id are inferable from sibling tools.

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 coverage is 67% (2 of 3 parameters have descriptions). The tool description does not add any parameter-level information beyond what the schema already provides. Since coverage is high, a baseline of 3 is appropriate; no additional value is needed.

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 uses a specific verb ('reads') and clearly identifies the resource (the student's Studenti Online home page into a career summary). It lists the components of the summary (greeting/identity, enrolled course of study, in-progress requests), which effectively distinguishes it from sibling tools like sol_get_services or sol_get_env_session.

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?

The description explicitly states 'Read-only; never submits requests or payments,' clarifying the non-destructive nature. It implies usage when a student's career summary is needed. However, it does not explicitly contrast with alternatives or specify when not to use, which would elevate it to a 5.

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

sol_get_env_sessionGet Studenti Online Env-Backed SessionA

Mints (or reuses) a session_id backed by the server's SOL_COOKIES env var. The cookie is never returned — only an opaque session_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fairly discloses that the cookie is never returned and only an opaque session_id is provided. However, it does not mention error handling if the env var is missing or session reuse timeout, which would be beneficial for full transparency.

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 extremely concise: two sentences, no unnecessary words, front-loaded with the action verb 'Mints'. Every sentence adds 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?

For a zero-parameter tool with no output schema and no annotations, the description covers the core purpose and key behavioral constraint (cookie not returned). It lacks error case specification but is fairly complete.

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?

There are no parameters, so the description adds value by explaining the env var backing and the opaque session_id behavior. Since schema coverage is 100% (none), the baseline is 4, and the description meets this expectation.

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 clearly states the verb 'Mints (or reuses)' and the resource 'session_id', distinguishing it from sibling session tools that likely require user credentials or different backing. It specifies the env var source and the opaque nature of the return value.

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

Usage Guidelines3/5

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

The description implies usage when the SOL_COOKIES env var is set but does not provide explicit guidance on when to use this vs. alternative session tools (e.g., sol_bootstrap_session). No when-not-to-use or prerequisite information is given.

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

sol_get_servicesList Studenti Online ServicesA
Read-only

Lists the Studenti Online service tiles available to the student (name, link, description) — e.g. fees/payments, enrolments, certificates — so a caller can discover what the portal exposes. Read-only; it lists links, it does not act on them.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoCookie header with an authenticated JSESSIONID from a logged-in Studenti Online browser session. Falls back to session_id, then SOL_COOKIES.
base_urlNo
session_idNosession_id from sol_get_env_session, sol_bootstrap_session, or unibo_browser_login.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true. The description reinforces read-only behavior and adds detail that it lists links without acting on them. It goes beyond annotations by specifying the output fields (name, link, description).

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 sentences with no filler. Front-loaded with purpose and payload, followed by a clarifying statement on read-only nature. Every sentence serves a purpose.

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 simple list tool, the description covers core intent and safety traits. It omits error conditions, pagination, and explicit authentication requirements, but the annotations (openWorldHint) reduce the completeness burden. Adequate for its complexity.

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?

The tool description does not reference any parameters. Schema coverage is 67% (cookies and session_id have descriptions; base_url lacks). The description adds no additional parameter meaning beyond the schema, so baseline score of 3 is appropriate.

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 clearly states the verb 'Lists', the resource 'Studenti Online service tiles', and specifies the included fields (name, link, description). Examples distinguish it from sibling tools like sol_get_career.

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?

The description implies usage for discovering portal services and explicitly states it's read-only. However, it does not compare to alternative tools or provide explicit when-not-to-use guidance.

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

unibo_browser_loginLog In Via Headless Browser (all services)A

Drives a real (headless) Chromium browser through the ADFS SSO login using EMAIL + PASSWORD from the server environment, then — reusing the same shared idp.unibo.it session — completes the AlmaEsami and RPS SAML handshakes too, storing one session and returning an opaque session_id that works with the virtuale_*, almaesami_*, and rps_* tools. The password/sesskey/cookies never pass through the model's context. Each service is best-effort: the result reports per-service success. Only works for accounts without interactive MFA (use the *_bootstrap_session tools for MFA accounts). Mints once and reuses the session on later calls unless force_relogin is set.

ParametersJSON Schema
NameRequiredDescriptionDefault
force_reloginNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses browser use, password security, best-effort per-service behavior, and session reuse. It does not mention rate limits, but overall provides substantial behavioral context.

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 front-loaded with the core action and each sentence adds value. It covers purpose, usage, behavior, and limitations without redundancy.

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?

Given the simple input schema (one optional boolean), no output schema, and complex task, the description thoroughly explains the tool's role, how it works, and its relationship to sibling tools, leaving no major gaps.

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

Parameters5/5

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

The single parameter 'force_relogin' is explained in the description: 'Mints once and reuses the session on later calls unless force_relogin is set.' This adds critical meaning beyond the schema, compensating for 0% schema coverage.

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 clearly states the tool drives a headless browser for ADFS SSO login using email+password, completes multiple SAML handshakes, and returns an opaque session_id for use with other tools. It distinguishes from sibling tools like *_bootstrap_session for MFA accounts.

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?

The description explicitly says 'Only works for accounts without interactive MFA (use the *_bootstrap_session tools for MFA accounts)' and notes the session is reused unless force_relogin is set, providing clear guidance on when and when not to use this tool.

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

unibo_calendar_get_eventsGet Timetable EventsA
Read-only

Fetches raw timetable events from @@orario_reale_json with optional teaching-code filtering.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
curriculumYes
timetable_urlYes
selected_teaching_codesNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. Description adds the data source (@@orario_reale_json) but little beyond that, so marginal value.

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?

Single sentence, no wasted words, effectively conveys core functionality.

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

Completeness3/5

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

Lacks information about return format, pagination, or data structure. Adequate for a simple tool but incomplete given 4 parameters and no output schema.

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

Parameters2/5

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

Schema coverage is 0%, so description must compensate. It only explains 'selected_teaching_codes' (optional filter) but omits meaning of year, curriculum, timetable_url.

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?

Description clearly states verb 'Fetches' and specific resource 'raw timetable events from @@orario_reale_json' with optional filtering. Distinguishes from sibling tools like unibo_calendar_get_ics.

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

Usage Guidelines3/5

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

No explicit guidance on when to use or not use this tool versus alternatives. Usage is implied but not directly stated.

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

unibo_calendar_get_icsGet Timetable ICSB
Read-only

Fetches timetable events and returns an ICS calendar string.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
curriculumYes
calendar_nameNoUnibo Timetable
timetable_urlYes
selected_teaching_codesNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and openWorldHint=true, so the description adds minimal behavioral context beyond stating it returns an ICS string. No details on error behavior, rate limits, or handling of large calendars are provided.

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?

The description is a single, efficient sentence that conveys the core functionality. However, it sacrifices necessary detail for brevity, making it less useful despite its conciseness.

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

Completeness2/5

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

With 5 parameters, no output schema, and only basic annotations, the description is insufficient. It fails to explain parameter roles, output format details, or dependencies (e.g., needing to use unibo_calendar_resolve_timetable_url first).

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

Parameters1/5

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

Schema description coverage is 0%, and the description offers no explanation of parameters. While parameter names are somewhat self-explanatory, terms like 'curriculum' and 'selected_teaching_codes' remain ambiguous, leaving the agent without guidance on valid values or required format.

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 clearly states the action ('Fetches'), the resource ('timetable events'), and the output ('returns an ICS calendar string'). It distinguishes the tool from siblings like unibo_calendar_get_events which likely returns events in a different format.

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?

No guidance on when to use this tool versus alternatives. The description does not mention prerequisites (e.g., resolve timetable URL first) or provide context for selection among related calendar tools.

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

unibo_calendar_list_curriculaList Available CurriculaB
Read-only

Lists available curricula for a timetable URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
timetable_urlYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true, indicating safe read behavior. Description adds no further behavioral traits beyond the implied read-only nature of 'lists'. Not contradictory, but no value added.

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?

Very concise: one sentence, front-loaded with action verb 'lists', no unnecessary words. Efficient for an agent to parse.

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

Completeness3/5

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

Adequate for a simple list tool with clear annotations. Lacks context on what 'curricula' are, any prerequisites (e.g., login?), or connection to other tools. Moderately complete.

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

Parameters2/5

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

Schema coverage is 0%, so description must compensate. Merely states 'for a timetable URL' without explaining the parameter's role, format, or how to obtain it. Inadequate for a single parameter.

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?

Description clearly states the action ('lists') and resource ('available curricula') with context ('for a timetable URL'). However, it does not differentiate from sibling tools like 'unibo_calendar_list_teachings', missing a chance to distinguish purpose.

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?

No guidance on when to use this tool versus alternatives like 'unibo_calendar_list_teachings' or 'unibo_calendar_resolve_timetable_url'. Missing exclusions or prerequisites.

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

unibo_calendar_list_teachingsList TeachingsB
Read-only

Parses timetable page HTML and returns lecture/teaching IDs for filtering.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
curriculumYes
timetable_urlYes

TDQS

B3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and open-world behavior. The description adds that it parses HTML, which is a key behavioral trait beyond annotations. No contradiction.

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

Conciseness3/5

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

The description is a single sentence, which is concise, but it omits critical information about parameters and usage context. Not all sentences earn their place.

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

Completeness1/5

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

With 3 undocumented parameters, no output schema, and no explanation of the parsing process or required session context, the description is severely incomplete for the tool's complexity.

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

Parameters1/5

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

Schema coverage is 0% and the description does not explain any of the three parameters (timetable_url, year, curriculum). The description fails to add meaning to 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?

The description clearly states the tool parses timetable page HTML and returns lecture/teaching IDs for filtering. It uses specific verbs and distinguishes from sibling tools like list_curricula and get_events.

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 only implies usage for filtering but provides no explicit guidance on when to use, when not to, or alternatives. It lacks prerequisites like requiring a browser login session.

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

unibo_calendar_resolve_timetable_urlResolve Timetable URLB
Read-only

Resolves the corsi.unibo.it timetable URL from a unibo.it course page URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
unibo_course_urlYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds no behavioral details beyond the annotations (readOnlyHint, openWorldHint). It does not disclose error handling, output format, or side effects, but the annotations already set expectations for readonly and open-world 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?

A single, focused sentence that efficiently conveys the tool's purpose without unnecessary words or repetition.

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 simplicity of a one-parameter, no-output-schema tool, the description covers the essential input-output relationship. It lacks details on edge cases but is sufficient for basic use.

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?

With 0% schema coverage, the description partially compensates by indicating the parameter type (course page URL) and expected output (timetable URL). However, it does not describe the exact URL format or validation rules.

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 the action ('resolves') and the specific resource (timetable URL from a course page URL). While it distinguishes the tool from siblings by its unique purpose, it could be more explicit about what 'resolve' entails.

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?

No guidance is provided on when to use this tool vs alternatives, nor are there any preconditions or contexts mentioned. The description lacks any usage recommendations.

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

virtuale_bootstrap_sessionBootstrap SessionC

Creates a server-side session from an existing sesskey and cookie header.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesYes
sesskeyYes
email_labelNoexternal-session
include_cookie_headerNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description implies mutation ('creates') but does not disclose side effects, permissions, idempotency, or what 'server-side session' entails. Agent is left guessing about safety and state changes.

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

Conciseness3/5

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

Single sentence, no wasted words. But it is too brief and lacks structure for a 4-param tool. Conciseness is okay, but at the expense of completeness.

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

Completeness1/5

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

Given 4 parameters, no output schema, and no annotations, the description is severely lacking. It does not explain return value, error behavior, or how the session is used afterwards. Completely insufficient for an agent to use correctly.

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

Parameters1/5

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

Schema description coverage is 0%. Description only mentions the two required params (sesskey, cookies) in purpose but does not explain email_label or include_cookie_header. No additional meaning beyond property names.

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?

Description clearly states verb 'creates' and resource 'server-side session' with inputs 'sesskey and cookie header'. However, among siblings like almaesami_bootstrap_session, rps_bootstrap_session, and sol_bootstrap_session, it does not differentiate what makes this one specific to virtuale.

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?

No guidance on when to use this vs alternatives. There are many sibling bootstrap_session tools but no context about prerequisites or use cases.

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

virtuale_browser_loginLog In Via Headless Browser (deprecated alias)A

Deprecated alias for unibo_browser_login. Drives a headless Chromium through ADFS SSO with EMAIL/PASSWORD and returns an opaque session_id (now covering AlmaEsami and RPS too). Prefer unibo_browser_login.

ParametersJSON Schema
NameRequiredDescriptionDefault
force_reloginNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that it uses headless Chromium, ADFS SSO, email/password, and returns session_id. However, it lacks details on error handling, security implications, and side effects of force_relogin.

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 sentences, front-loaded with the deprecation warning, no wasted words. Efficiently communicates the essential information.

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 its deprecated status and explicit redirection to unibo_browser_login, the description is sufficiently complete for an AI agent to decide not to use it. However, it lacks explanation of the parameter and output details.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not mention the only parameter 'force_relogin' at all, failing to add meaning beyond 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?

The description clearly states it is a deprecated login tool that uses headless browser and returns session_id. It distinguishes itself from the preferred unibo_browser_login but does not contrast with other login tools like virtuale_login_with_password.

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?

The description explicitly says 'Deprecated alias for unibo_browser_login' and 'Prefer unibo_browser_login', providing clear guidance on when not to use this tool and what alternative to use instead.

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

virtuale_get_course_stateGet Course StateC
Read-only

Calls core_courseformat_get_state and parses the returned JSON string state model.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseidYes
session_idNo

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds minimal behavioral context beyond the annotations. It mentions parsing a JSON string, but no details on side effects, permissions, or return format. Annotations already indicate readOnly and openWorld, so the description does little to enhance transparency.

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?

The description is a single, concise sentence with no wasted words. It efficiently conveys the core action, but the structure could be improved by integrating parameter explanations.

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

Completeness2/5

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

Given no output schema and zero parameter descriptions, the description is far from complete. It fails to inform the agent about the state model contents, any usage constraints, or how to interpret the result.

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

Parameters1/5

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

With 0% schema description coverage, the description should compensate by explaining parameter meanings. It does not mention courseid or session_id at all, leaving the agent with no additional insight beyond the schema's type constraints.

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 calls a specific core function and parses the returned JSON, indicating the verb and resource. However, it does not explicitly differentiate from sibling tools like virtuale_get_enrolled_courses which also operate on courses.

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 provides no guidance on when to use this tool versus alternatives, no context about prerequisites or exclusions, and no mention of how it relates to other virtuale tools.

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

virtuale_get_enrolled_coursesGet Enrolled CoursesD
Read-only

Calls local_uniboapi_get_enrolled_courses_unibo for the authenticated user.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNofullname
limitNo
offsetNo
session_idNo
classificationNoall
customfieldnameNoaa
customfieldvalueNo

TDQS

D1.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds no additional behavioral context, such as authentication requirements, rate limits, or what happens if the session is invalid.

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

Conciseness2/5

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

The description is a single vague sentence that provides no valuable information beyond the tool name. It is under-specified rather than concise.

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

Completeness1/5

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

Given the high parameter count (7, all optional with defaults) and no output schema, the description is completely inadequate. An agent cannot determine what the tool returns, how to filter or paginate, or how it relates to other tools.

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

Parameters1/5

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

With 0% schema description coverage, the description must explain the parameters' meaning. It does not mention any of the 7 parameters (sort, limit, offset, session_id, classification, customfieldname, customfieldvalue), leaving the agent to infer their semantics from names and enums only.

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

Purpose2/5

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

The description only states that it calls a local API for the authenticated user, but does not clarify what data is retrieved. The name 'get enrolled courses' suggests the purpose, but the description fails to confirm this or state the resource returned.

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?

No guidance is provided on when to use this tool versus its many siblings (e.g., virtuale_get_course_state, virtuale_get_resource). There is no mention of prerequisites, context, or alternatives.

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

virtuale_get_env_sessionGet Env-Backed SessionA

Mints (or reuses) a session_id backed by the server's VIRTUALE_SESSKEY + VIRTUALE_COOKIES env vars. The sesskey/cookies are never returned — only an opaque session_id, so credentials configured in the MCP host's environment never pass through the model's context.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that credentials are never returned and session_id is opaque, which is helpful for security awareness. However, it does not mention failure modes (e.g., missing env vars) or idempotency details beyond 'reuses'.

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 concise sentences that front-load the core action and add a critical security note. No extraneous information.

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?

Covers key aspects: creation/reuse, opaque session_id, and credential protection. Missing prerequisites (env vars must be set) and error handling, but given zero parameters and no output schema, it is largely complete.

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 input schema has zero parameters, so the description correctly provides no parameter-level details. With 100% schema coverage (void), the baseline of 4 is appropriate.

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 clearly states the tool 'Mints (or reuses) a session_id' using specific environment variables, distinguishing it from sibling bootstrap sessions by emphasizing the env-backed approach.

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?

No guidance on when to use this tool versus alternatives like virtuale_bootstrap_session or other get_env_session tools. The description lacks comparative context for tool selection.

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

virtuale_get_panopto_contentGet Panopto Block ContentC
Read-only

Calls block_panopto_get_content for a course.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseidYes
session_idNo

TDQS

C2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds no behavioral context beyond the annotations (readOnlyHint, openWorldHint). It does not describe side effects, authentication needs, or what happens when the course has no Panopto content.

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

Conciseness2/5

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

The description is extremely concise (one sentence) but at the cost of informativeness. Every word is used, but the lack of detail outweighs the conciseness benefit.

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

Completeness1/5

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

There is no output schema, so the description should explain the return value. It does not. With 0% schema coverage and no parameter guidance, the tool description is far from complete.

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

Parameters1/5

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

Schema coverage is 0%, and the description does not explain the courseid or session_id parameters. Without any parameter descriptions, the agent receives no assistance in understanding what values to provide.

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

Purpose3/5

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

The description states the tool calls block_panopto_get_content for a course, providing a specific verb and resource. However, 'Panopto block content' is not clearly defined, and it lacks differentiation from sibling tools beyond the name.

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?

No guidance is given on when to use this tool vs alternatives. The description simply says it calls a function, with no context on prerequisites or exclusions.

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

virtuale_get_resourceGet Course Resource / FileA
Read-only

Fetches a Virtuale file/resource by cmid (builds /mod/resource/view.php?id=) or an explicit url, following the redirect to the protected pluginfile.php content with the authenticated MoodleSession cookie. Always returns metadata (final URL, content-type, size, filename). If save_to (an absolute file path) is given, streams the file to disk and returns the path + byte size. Otherwise returns text inline for text-like files (text/JSON/XML/HTML) and extracts + returns the text of PDFs; very long text is truncated (pass save_to for the full file). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
cmidNo
cookiesNo
save_toNo
base_urlNo
session_idNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint and openWorldHint; the description confirms read-only and adds details: redirect handling, cookie authentication, return metadata, inline text for text/PDF with truncation, and file saving behavior. No contradictions.

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?

The description is a single paragraph with front-loaded purpose and key details. It is concise with no redundancy, though could be slightly more structured with bullets for clarity.

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

Completeness3/5

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

Return values are described (metadata, file path/size, text extraction) but unclear for binary non-text files without save_to. No mention of error handling or authentication requirements beyond cookies. Adequate but with gaps given complexity.

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?

With 0% schema description coverage, the description partially compensates by explaining cmid/url identification and save_to disk saving, but fails to detail parameters like base_url, session_id, and cookies beyond a mention. Some parameters remain unexplained.

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 the tool fetches a Virtuale file/resource by cmid or URL, with specific behavior like following redirects. While it doesn't explicitly distinguish from sibling 'virtuale_list_course_files', the action of fetching a single resource vs listing is evident from context.

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

Usage Guidelines3/5

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

The description provides guidance on when to use save_to (for full file) vs inline text, but does not explicitly compare with alternative tools or state when not to use this tool. No exclusions or prerequisites mentioned.

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

virtuale_get_session_infoGet Session InfoB
Read-only

Shows stored login metadata and optionally returns cookie header string.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes
include_cookie_headerNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, and the description's 'shows' is consistent. The optional cookie header return is a behavioral addition, but no further details on side effects or authentication needs are given. With annotations covering safety, the description adds moderate value.

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 a single, front-loaded sentence that states the core function and the optional parameter effect. No redundancy or wasted words.

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

Completeness2/5

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

The description omits critical details: return format (e.g., JSON structure), error cases (e.g., invalid session_id), and any further context about the metadata. Given the lack of output schema, agents are left guessing.

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

Parameters2/5

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

With 0% schema description coverage, the description must compensate but only restates property names: session_id (implied) and include_cookie_header (explicitly 'optionally returns cookie header'). No additional semantics like format or validation constraints are provided.

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 it shows stored login metadata and optionally returns a cookie header, which matches the tool name and purpose. However, it does not explicitly differentiate from sibling tools like virtuale_get_env_session, though the metadata focus provides some distinction.

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 provides no guidance on when to use this tool vs alternatives, such as bootstrap or env session tools. It lacks prerequisites (e.g., session must exist) and exclusion criteria.

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

virtuale_health_checkVirtuale Health CheckA
Read-only

Runs a safe no-login Moodle AJAX call to validate base connectivity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond annotations by specifying 'safe no-login Moodle AJAX call', confirming the read-only and open-world behavior indicated by annotations. No contradictions.

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?

A single sentence that conveys all necessary information without waste. Perfectly concise and front-loaded.

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, no-output-schema health check tool with adequate annotations, the description is fully sufficient and leaves no gaps.

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?

With no parameters and 100% schema description coverage, the description has no need to add parameter details. Baseline of 4 is appropriate.

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 uses a specific verb 'runs' and identifies the resource as a 'Moodle AJAX call' with a clear goal: 'validate base connectivity'. It effectively distinguishes from sibling tools like login or session tools by emphasizing 'no-login'.

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

Usage Guidelines3/5

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

The description implies usage for checking connectivity before other operations via 'safe no-login' and 'validate base connectivity', but does not provide explicit when-not scenarios or alternative tools for similar purposes.

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

virtuale_list_course_filesList Course FilesA
Read-only

Lists the downloadable files/resources of a Virtuale course, grouped by section (cmid, name, modname, url), derived from core_courseformat_get_state. A slim, token-friendly view of the course contents (not the full state blob); pass a cmid to virtuale_get_resource to fetch a file's content. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseidYes
session_idNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description confirms it is read-only. The description adds value by stating the derivation source ('derived from core_courseformat_get_state') and characterizing the output as a 'slim, token-friendly view', which provides performance context 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?

The description is three sentences, concise, and front-loaded with the core functionality. Every sentence adds distinct value: listing groups, derivation, and usage guidance. No redundancy or fluff.

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 tool's simplicity (2 parameters, no output schema), the description adequately covers what the tool returns (grouped by section, fields) and its read-only nature. It could be slightly more complete by describing the fields, but the context is sufficient for an agent to use the tool correctly.

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

Parameters2/5

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

Schema description coverage is 0% and there are 2 parameters (courseid, session_id). The description does not explain what these parameters mean or how they affect the output. It mentions 'cmid' in the context of the sibling tool but not the parameters of this tool. The description must compensate for low coverage but fails to do so.

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 clearly states it lists downloadable files/resources of a Virtuale course, grouped by section with specific fields (cmid, name, modname, url). It explicitly distinguishes itself from sibling tools like virtuale_get_resource (which fetches file content) and virtuale_get_course_state (full state blob).

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?

The description provides explicit guidance: use this tool to get a list of files and then pass a cmid to virtuale_get_resource to fetch content. It also contrasts with virtuale_get_course_state by calling this a 'slim, token-friendly view', indicating when to prefer this tool.

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

virtuale_login_with_passwordLogin With PasswordB

Attempts Moodle form login, then stores cookies and sesskey server-side and returns a session_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
passwordYes
login_pathNo/login/index.php
include_cookie_headerNo

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It mentions login attempt, server-side storage, and session ID return, but does not disclose failure behavior, side effects, or prerequisites. Lacks details on persistence or security implications.

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?

Single, front-loaded sentence with no wasted words. Could be slightly expanded but remains efficient.

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

Completeness2/5

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

Tool has 4 parameters and no output schema. Description lacks details on error handling, session management, password safety, or how the returned session_id should be used. Incomplete for a login tool.

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

Parameters1/5

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

Schema coverage is 0%, meaning no parameter descriptions in schema. Description does not explain any parameter beyond types. Critical parameters like 'login_path' and 'include_cookie_header' are left undefined, leaving the agent guessing.

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?

Description clearly states the action (login), the resource (Moodle form), and the outcome (stores cookies/sesskey, returns session_id). It distinguishes from sibling login tools by specifying Moodle form login.

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

Usage Guidelines3/5

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

Description implies usage for password-based login but lacks explicit when-not-to-use guidance or alternative tools. Among siblings, there are other login methods (e.g., browser_login, bootstrap_session) that could be mentioned.

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

virtuale_logout_sessionLogout SessionA

Removes one stored authenticated session from server memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must disclose behavioral traits. It states that the tool removes a session from server memory, indicating a destructive action. However, it does not explain error handling (e.g., if session doesn't exist), side effects (e.g., invalidating tokens), or authentication requirements for using this tool. Basic transparency but insufficient depth.

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 a single sentence that is both concise and front-loaded with the core action. Every word earns its place; there is no extraneous information. This is exemplary conciseness for a simple tool.

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

Completeness3/5

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

For a simple tool with one required parameter and no output schema, the description provides the essential action but omits critical context: success/error behavior, prerequisites (e.g., session must be active), and post-conditions. The gaps lower its completeness to an adequate but not thorough level.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate by explaining parameter meaning. It does not mention the 'session_id' parameter at all. While the parameter name is somewhat self-explanatory, the description adds no value beyond the schema definition, leaving agents without context on what value to provide.

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 clearly states the action ('removes'), the resource ('one stored authenticated session'), and the scope ('from server memory'). It distinguishes from sibling tools like bootstrap_session or login tools, which create or manage sessions, not destroy them.

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

Usage Guidelines3/5

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

The description implies usage (to end/remove a session), but provides no explicit guidance on when to use this tool versus alternatives, prerequisites (e.g., must have an active session), or contraindications. The context makes it moderately clear, but lacks direct instruction.

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

virtuale_quiz_get_attempt_reviewGet Quiz Attempt ReviewA
Read-only

Reads the review page of one of the student's own finished quiz attempts: each question's text, answer options, the student's selection, correctness, and feedback. Only works for attempts Moodle already allows the student to review (finished, review permitted by the quiz settings) — it does not start, resume, or answer a live attempt.

ParametersJSON Schema
NameRequiredDescriptionDefault
cmidYes
cookiesNo
base_urlNo
attempt_idYes
session_idNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint. The description adds that the tool reads review data without modifying state, and details what data is returned, enhancing transparency 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 concise sentences: first states purpose and contents, second states limitations. Front-loaded with key information, no wasted words.

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?

No output schema, but description sufficiently explains what is returned (each question's text, answer options, selection, correctness, feedback). Constraints are clear. Could be improved by briefly explaining the required parameters.

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

Parameters2/5

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

Schema has 5 parameters with 0% description coverage. The description only implicitly references attempt_id and does not explain cmid, cookies, base_url, or session_id. It provides no added meaning for individual parameters.

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 clearly states it 'Reads the review page of one of the student's own finished quiz attempts' and lists exact contents (questions, answers, correctness, feedback). It distinguishes from siblings by specifying it does not start, resume, or answer a live attempt.

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?

The description explicitly states when it works: 'Only works for attempts Moodle already allows the student to review (finished, review permitted by the quiz settings)'. It also clarifies it does not handle live attempts, but does not explicitly name alternative tools for live attempts.

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

virtuale_quiz_list_attemptsList Quiz AttemptsA
Read-only

Reads a quiz activity page and returns the student's attempt summaries (status, dates, marks, grade) plus a review URL/attempt id for each finished attempt. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cmidYes
cookiesNo
base_urlNo
session_idNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, so description's 'Read-only' reinforces that. It adds behavioral detail by specifying return content (status, dates, marks, grade, review URL/attempt id). This goes beyond annotations, though it could mention side effects (none) or what happens with no attempts.

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 sentences, front-loaded with the main action and output. No extraneous information. Efficient for an API tool description.

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

Completeness2/5

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

With 4 parameters, no output schema, and no parameter descriptions, the description is incomplete. It lacks parameter usage, return format, and edge case handling. Adequate only for very minimal tool understanding.

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

Parameters1/5

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

Schema description coverage is 0% and description does not explain any parameter. Required 'cmid' is not described; optional parameters (cookies, base_url, session_id) are omitted. Description adds no semantic value beyond parameter names.

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 clearly states the tool reads a quiz activity page and returns student attempt summaries with status, dates, marks, grade, and review URL/attempt id. The verb 'reads' and resource 'quiz activity page' are specific, and it distinguishes from sibling tools like 'virtuale_quiz_get_attempt_review' and 'virtuale_quiz_list_course_quizzes' by focusing on listing attempts.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives. The description implies usage for listing attempts for a specific quiz, but it does not mention exclusions or direct comparisons to siblings like 'virtuale_quiz_get_attempt_review' for individual review details.

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

virtuale_quiz_list_course_quizzesList Course QuizzesA
Read-only

Lists quiz activities on a course page, with the course-module id (cmid) needed by the other quiz tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNo
base_urlNo
course_idYes
session_idNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows it is read-only and results may vary. The description adds that it returns the cmid, but does not elaborate on other behavioral traits like pagination or authentication details. With annotations covering safety, the description provides adequate but not exceptional transparency.

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 a single, well-structured sentence that front-loads the core function ('Lists quiz activities') and immediately states the key output detail (cmid). No extraneous information, earning high marks for conciseness.

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 there is no output schema, the description clarifies that the output includes quiz activities with cmid, which is essential for subsequent tool usage. However, it does not mention any limitations (e.g., pagination) or the structure of the returned data. Overall, it is mostly complete for a list tool but leaves minor gaps.

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

Parameters2/5

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

The schema has 4 parameters (cookies, base_url, course_id, session_id) with 0% schema description coverage. The description only implicitly references course_id via 'course page'. It fails to explain the roles of cookies, base_url, and session_id, or provide any additional meaning beyond the schema. This is a significant gap for a tool requiring authentication context.

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 clearly states the tool lists quiz activities on a course page and specifies that it returns the course-module id (cmid) needed by other quiz tools. This differentiates it from siblings like virtuale_quiz_list_attempts or virtuale_quiz_get_attempt_review, which focus on attempts and reviews.

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?

The description implies the primary use case: to obtain the cmid for subsequent quiz-related tool calls. While it does not explicitly state when not to use it or list alternatives, the context of sibling tools and the mention of 'needed by the other quiz tools' provides clear guidance on when to invoke this tool.

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. 35 tool updatesv1.0.0
    • First observedalmaesami_bootstrap_session
    • First observedalmaesami_get_env_session
    • First observedalmaesami_get_exam_history
    • First observedalmaesami_get_exam_plan
    • First observedalmaesami_get_messages
    • First observedalmaesami_list_appelli
    • First observedrps_bootstrap_session
    • First observedrps_get_attendance_records
    • First observedrps_get_env_session
    • First observedrps_get_register
    • First observedsol_bootstrap_session
    • First observedsol_get_career
    • First observedsol_get_env_session
    • First observedsol_get_services
    • First observedunibo_browser_login
    • First observedunibo_calendar_get_events
    • First observedunibo_calendar_get_ics
    • First observedunibo_calendar_list_curricula
    • First observedunibo_calendar_list_teachings
    • First observedunibo_calendar_resolve_timetable_url
    • First observedvirtuale_bootstrap_session
    • First observedvirtuale_browser_login
    • First observedvirtuale_get_course_state
    • First observedvirtuale_get_enrolled_courses
    • First observedvirtuale_get_env_session
    • First observedvirtuale_get_panopto_content
    • First observedvirtuale_get_resource
    • First observedvirtuale_get_session_info
    • First observedvirtuale_health_check
    • First observedvirtuale_list_course_files
    • First observedvirtuale_login_with_password
    • First observedvirtuale_logout_session
    • First observedvirtuale_quiz_get_attempt_review
    • First observedvirtuale_quiz_list_attempts
    • First observedvirtuale_quiz_list_course_quizzes

TDQS

B3.3/5.0

Scored across 35 tools

Disambiguation5/5

Tools are clearly separated by subsystem prefixes (almaesami_, rps_, sol_, unibo_, virtuale_), and within each, purposes are distinct. The deprecated alias virtuale_browser_login is explicitly noted, preventing confusion.

Naming Consistency4/5

Overall pattern is subsystem prefix + verb_noun (e.g., almaesami_get_exam_history). Minor inconsistencies: some use 'list' vs 'get' (e.g., almaesami_list_appelli vs almaesami_get_exam_history), and one alias (virtuale_browser_login) differs.

Tool Count4/5

35 tools is high but justified by integrating multiple university subsystems (AlmaEsami, RPS, SOL, Virtuale, calendar). The count is appropriate for the broad scope, though could be streamlined.

Completeness4/5

Covers a wide range of read-only operations (exams, attendance, career, courses, quizzes, files, calendar). Minor gaps: no exam booking, no write actions beyond session management, and no detailed grades beyond career summary.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers