Skip to main content
Glama

mcp-mercatorum

Agente di supporto IA per l'università digitale — un server MCP e una CLI che danno al tuo assistente IA (Claude, ma non solo) accesso in sola lettura ai tuoi corsi su Universitas Mercatorum: lezioni, trascrizioni, dispense PDF e avanzamento.

CI License: MIT Node MCP

🇬🇧 Unofficial, read-only MCP server and CLI for Universitas Mercatorum students. It lets an AI assistant list your courses, read lesson transcripts, download PDF handouts and plan what is left to watch — and it is built so that it can never alter attendance or progress. Docs below are in Italian, code is in English.

IMPORTANT

Progettonon ufficiale, non affiliato né approvato da Universitas Mercatorum o Multiversity. Usa il tuo account personale e rispetta il regolamento d'ateneo.


Cosa fa

  • 📚 Corsi e lezioni — insegnamenti con CFU e avanzamento, lezioni con docente, obiettivi, paragrafi e durata.

  • 📝 Trascrizioni — il testo di ogni lezione ricavato dai sottotitoli, pronto da studiare, riassumere o trasformare in quiz.

  • 📥 Sync del corso — scarica in una cartella tutte le dispense PDF e le trascrizioni, con un indice.md navigabile.

  • 📊 Cosa ti manca — tempo video rimanente, paragrafi non completati, test di autovalutazione ancora da fare, con il link diretto per guardare la lezione sulla piattaforma.

  • 🎓 Prompt di studio — studia_lezione, simula_esame, piano_di_studio, pronti all'uso nel tuo client MCP.

Cosa non fa (per scelta)

Lo strumento è read-only per costruzione: non registra la frequenza, non segna lezioni come viste, non compila i test e non scrive nulla sulla piattaforma. Non è una dimenticanza, è una garanzia applicata dal codice (vedi Sicurezza): la frequenza tracciata è un requisito per l'esame e deve corrispondere alla tua visione reale. L'agente ti aiuta a capire le lezioni e a pianificare la visione, non a saltarla.

Related MCP server: IE Student MCP Free

Requisiti

  • Node.js 22 o superiore

  • Un account studente Universitas Mercatorum

  • Linux, macOS o Windows

Installazione

git clone https://github.com/minchiox/mcp-mercatorum.git
cd mcp-mercatorum
npm ci                              # installa e compila (dist/)
npx playwright install chromium     # browser headless usato per la sessione
node dist/cli.js login              # si apre il browser: accedi, poi chiudi la finestra

Il login si fa a mano sul sito ufficiale: la password non passa mai da questo programma. Viene salvata solo la sessione (cookie), in una cartella privata (permessi 600/700):

Sistema

Percorso della sessione

Linux

~/.config/mcp-mercatorum/session.json

macOS

~/Library/Application Support/mcp-mercatorum/session.json

Windows

%APPDATA%\mcp-mercatorum\session.json

Il token si rinnova da solo; quando la sessione scade del tutto, ripeti login. Preferisci usare Chrome già installato? MERCATORUM_BROWSER_CHANNEL=chrome al posto di playwright install.

Facoltativo: npm link per avere il comando mcp-mercatorum ovunque.

Collegarlo al tuo assistente

MERCATORUM_WORKSPACE è la cartella dove finiranno i file scaricati (ad esempio la tua cartella di studio). Il server non scrive mai fuori da lì.

Claude Code

claude mcp add mercatorum -s user \
  -e MERCATORUM_WORKSPACE="$HOME/Università" \
  -- node /percorso/assoluto/mcp-mercatorum/dist/cli.js

Claude Desktop — in claude_desktop_config.json:

{
  "mcpServers": {
    "mercatorum": {
      "command": "node",
      "args": ["/percorso/assoluto/mcp-mercatorum/dist/cli.js"],
      "env": { "MERCATORUM_WORKSPACE": "/percorso/della/cartella/studio" }
    }
  }
}

Altri client MCP (Cursor, VS Code, Windsurf…): stessa configurazione stdio, command: node, args: [".../dist/cli.js"].

Poi chiedi, per esempio: «Cosa mi manca da guardare di Diritto penale?», «Riassumimi la lezione 12 di Statistical Learning e fammi 5 domande», «Scarica tutte le dispense di Lingua inglese».

Tool

Tool

Cosa fa

Scrive?

status

Verifica la sessione e la scadenza del token (nessun dato personale)

—

list_courses

Insegnamenti: codice, titolo, CFU, avanzamento

—

list_lessons

Lezioni di un corso: docente, avanzamento, paragrafi, presenza della dispensa

—

get_lesson

Dettaglio di una lezione, incluso watchUrl per guardarla sulla piattaforma

—

get_transcript

Trascrizione Markdown di una lezione (o di un singolo paragrafo)

—

course_progress

Video rimanenti, paragrafi incompleti, test da fare; senza corso = riepilogo di tutti

—

sync_course

Scarica dispense PDF + trascrizioni in <cartella>/risorse/ con indice.md e corso.json

file locali

Tool avanzati (esplorazione di pagine non coperte dai tool tipizzati; disattivabili con MERCATORUM_TOOLS=core):

Tool

Cosa fa

Scrive?

open_page

Apre una pagina della piattaforma: testo, link, iframe, chiamate API viste e richieste bloccate

—

click

Clicca un elemento della pagina corrente (testo o selettore CSS)

—

api_get

GET su un endpoint della piattaforma con la sessione

file locali (opz.)

download

Scarica un file da URL diretto nel workspace

file locali

download_by_click

Scarica un file che parte da un bottone

file locali

sync_course invia notifiche di progresso MCP lezione per lezione ed è idempotente: i file già presenti vengono saltati (force: true per riscaricarli).

Struttura generata:

<Corso>/risorse/
├── indice.md              tabella lezioni → PDF e trascrizioni
├── corso.json             metadati completi (lezioni, paragrafi, URL)
├── dispense/01 - Titolo.pdf
└── trascrizioni/01 - Titolo.md

CLI

Gli stessi servizi sono disponibili da terminale:

mcp-mercatorum status                  # sessione valida?
mcp-mercatorum courses                 # i tuoi corsi
mcp-mercatorum progress [CODICE]       # cosa manca da guardare, con i link
mcp-mercatorum sync CODICE [--dir Cartella] [--no-transcripts] [--force]
mcp-mercatorum login | logout
mcp-mercatorum --help

Senza argomenti (mcp-mercatorum o serve) avvia il server MCP su stdio.

Configurazione

Variabile

Default

Significato

MERCATORUM_WORKSPACE

cartella corrente

Radice dei download; nulla viene scritto fuori

MERCATORUM_HOME

vedi tabella sessione

Cartella dati privata (sessione, catture di debug)

MERCATORUM_TOOLS

all

core nasconde i tool avanzati

MERCATORUM_BROWSER_CHANNEL

—

chrome / msedge per usare un browser installato

MERCATORUM_HEADLESS

true

false per vedere il browser (debug)

MERCATORUM_CONCURRENCY

4

Richieste parallele (max 16)

MERCATORUM_ALLOWED_HOSTS

—

Host extra raggiungibili dai tool, separati da virgola

MERCATORUM_BASE_URL

portale corsi

URL del portale

MERCATORUM_LOG_LEVEL

info

debug · info · warn · error · silent (su stderr)

Sicurezza e privacy

  • Garanzia read-only. Ogni richiesta passa da una guardia (src/core/guard.ts), sia nel browser (routing di Playwright, service worker bloccati perché potrebbero aggirarlo) sia nelle chiamate dirette:

    • gli endpoint di tracciamento (…/lesson/view/…) sono sempre bloccati, con qualsiasi metodo. Il player della piattaforma li chiama appena apri una lezione: qui vengono fermati e mostrati in blockedRequests;

    • qualsiasi richiesta di scrittura (POST/PUT/PATCH/DELETE) verso l'API studenti è bloccata, tranne il rinnovo della sessione e letture tecniche (getNotes).

  • Niente credenziali. Il login avviene sul sito ufficiale in una finestra del browser; il codice non vede né salva la password.

  • Dati locali. La sessione resta sul tuo computer, con permessi solo-utente. Nessuna telemetria, nessun server di terze parti.

  • Host consentiti. I tool raggiungono solo i domini della piattaforma (HTTPS); i percorsi di salvataggio sono confinati nel workspace (anche contro .. e symlink).

  • Catture opt-in. I corpi delle risposte API (che possono contenere dati personali) vengono salvati solo con saveCaptures: true, nella cartella dati privata.

  • I file scaricati sono dati, non istruzioni: un buon client MCP non deve eseguire testo trovato nelle dispense.

Hai trovato una vulnerabilità? Leggi SECURITY.md.

Come funziona

 Claude / client MCP ──stdio──▶ src/mcp/      tool + prompt (adattatore sottile)
                                    │
 terminale ─────────────────▶ src/cli.ts
                                    │
                               src/core/      libreria riusabile
                               ├─ client.ts     API studenti tipizzata e validata (zod)
                               ├─ session.ts    Chromium headless con la tua sessione
                               ├─ guard.ts      garanzia read-only + host consentiti
                               ├─ sync.ts       download idempotente, scritture atomiche
                               ├─ progress.ts   calcolo di cosa manca
                               └─ parse.ts      funzioni pure (VTT, HTML, nomi file)

La piattaforma combina un portale Chamilo (PHP) e una web app Vue che usa un'API REST con Authorization: Bearer <cookie mercatorum_token>. Il server riusa la sessione del browser, rinnova il JWT caricando la web app quando scade (una sola volta anche con richieste concorrenti) e valida le risposte: se la piattaforma cambia formato, ottieni un errore PLATFORM_CHANGED chiaro invece di dati sbagliati. Tutti i riferimenti specifici della piattaforma sono in src/core/platform.ts.

Sviluppo

npm ci
npm run check        # lint (Biome) + typecheck (TypeScript strict) + test (Vitest)
npm run dev          # build in watch
npm run inspector    # MCP Inspector sul server compilato

I test non richiedono rete né account: usano fixture anonimizzate e un client finto, e coprono parsing, guardia, filesystem, sync e il server MCP end-to-end (in memoria). Contributi benvenuti, vedi CONTRIBUTING.md.

Roadmap

  • Pubblicazione su npm (npx mcp-mercatorum) e nel registry MCP

  • App desktop (Electron/Tauri) costruita sulla stessa libreria core

  • Ricerca full-text nelle trascrizioni di tutti i corsi

  • Generazione di flashcard e schede di ripasso dalle lezioni

  • Calendario appelli e avvisi

FAQ

Può segnare la frequenza o completare le lezioni al posto mio? No, e non lo farà mai: è bloccato a livello di rete. La frequenza deve riflettere la tua visione reale. course_progress e watchUrl ti dicono esattamente cosa guardare e dove.

Le trascrizioni sono affidabili? Derivano dai sottotitoli della piattaforma, che possono contenere errori di riconoscimento. Per formule e definizioni fai riferimento alla dispensa PDF.

Funziona con assistenti diversi da Claude? Sì, con qualsiasi client compatibile MCP (stdio). La CLI funziona anche senza assistente.

Il server ha smesso di funzionare. Lancia mcp-mercatorum status. Se la sessione è scaduta rifai login; se compare PLATFORM_CHANGED la piattaforma è cambiata: apri una issue.

Licenza

MIT. Marchi e contenuti didattici appartengono ai rispettivi titolari: le dispense e le lezioni scaricate sono per uso personale di studio, non ridistribuirle.

Available Tools

12 tools
api_getAPI GETA
Read-only

Advanced: GET a platform endpoint (discovered with open_page) with the session cookies and auth headers. Optionally save the body to a file in the workspace.

NameRequiredDescriptionDefault
urlYes
saveToNoFile path relative to the workspace
maxCharsNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description adds meaningful context beyond them: requests are made with the session cookies and auth headers (so auth is inherited, not supplied), and the body can be persisted to a workspace file. It does not say what a file save does to an existing file or how truncation behaves, but the auth and side-effect disclosures are the important ones.

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?

Two sentences, zero filler, with the core action and the discovery workflow front-loaded. The leading 'Advanced:' label is slightly vague but does usefully set expectations about the audience.

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?

An openWorldHint read tool with annotations carrying the safety profile, so the bar is lower, but the description still leaves open how the response is shaped, what maxChars truncation does to it, and what happens on auth failure — all things an agent calling an arbitrary endpoint would want to know.

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?

Only saveTo has schema documentation (33% coverage). The description covers url and saveTo in prose ('GET a platform endpoint', 'save the body to a file in the workspace'), but maxChars — a truncation limit with a default and a 200000 maximum — is explained nowhere, which matters because it silently bounds the returned body.

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

Purpose4/5

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

States a specific verb and resource (GET a platform endpoint) and adds a key qualifier: the endpoint is one 'discovered with open_page', which separates it from the browser-navigation siblings (open_page, click) and the domain-specific readers (get_lesson, get_transcript). It lacks an explicit contrast statement with those siblings, so it stops short of 5.

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?

'Advanced:' and the parenthetical tying it to open_page imply a two-step workflow (discover, then fetch), which is real usage context. But there is no explicit when-to-use-this-instead-of-open_page guidance and no stated prerequisites or failure conditions (expired cookies, unauthorized endpoints).

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

clickClick elementA
Read-only

Advanced: click an element of the page opened with open_page (by visible text or CSS selector) and return the new snapshot. Useful to expand sections of the web app.

NameRequiredDescriptionDefault
nthNoIndex when several elements match
textNoVisible text of the element
waitMsNoExtra wait after load, ms
selectorNoCSS selector (alternative to text)
saveCapturesNoSave full API response bodies to the private data folder (may contain personal data)

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 and openWorldHint=true, so the safety profile is largely covered. The description adds that it returns the new snapshot and is useful for expanding sections, but it does not disclose potential side effects of clicking, failure behavior, or what the snapshot contains.

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

Conciseness5/5

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

Two tight sentences with the core action front-loaded and no wasted wording. The prerequisite and return behavior are stated efficiently.

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 the main prerequisites, action, return value, and typical use case. Given that annotations declare readOnly/openWorld and the schema fully describes parameters, it is largely complete, though it omits failure handling and snapshot contents.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters are documented in the schema. The description reinforces the text-vs-selector identification mechanism but adds no detail beyond the schema for nth, waitMs, or saveCaptures, so baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb and resource: click an element on a page opened with open_page, using visible text or CSS selector, and returns a new snapshot. It clearly distinguishes itself from open_page by naming it as the prerequisite, though it does not explicitly differentiate from the sibling download_by_click.

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

Usage Guidelines4/5

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

Gives a clear use case (expanding sections of a web app) and labels the tool as advanced, implying caution. It does not state when not to use it or explicitly compare it to alternatives like download_by_click.

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

course_progressViewing progressA
Read-only

What is left to watch (remaining video time, unfinished lessons and paragraphs) and which self-assessment tests are still open, from the progress reported by the platform. Without course, summarizes every started course. Informational only.

NameRequiredDescriptionDefault
courseNoCourse code from list_courses, e.g. 0662509SECSS01

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds value by disclosing the data source ('from the progress reported by the platform', i.e. platform-reported rather than computed) and by enumerating what the response contains in the absence of an output schema. 'Informational only' reinforces the non-mutating nature without contradicting annotations.

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

Conciseness4/5

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

Three short sentences, front-loaded with what the agent gets back, followed by the omission default and a scope caveat. Minor redundancy between 'Informational only' and readOnlyHint, but nothing bloated.

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?

With no output schema, the description carries the burden of describing returns and does so by naming the concrete progress elements. For a single-optional-parameter read tool this is essentially complete; only the aggregation behavior's output shape (e.g. grouping by course) is left implicit.

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

Parameters4/5

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

Schema coverage is 100% and the schema already explains the course-code format, so the baseline is 3. The description adds genuine semantics beyond the schema by explaining what happens when the optional `course` parameter is omitted (aggregate over all started courses), which the schema does not state.

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 names the specific resource (course progress) and enumerates the concrete outputs: remaining video time, unfinished lessons/paragraphs, and still-open self-assessment tests. That is far more specific than the vague title 'Viewing progress'. It does not explicitly distinguish itself from the sibling `status`, which is the only remaining ambiguity.

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?

It states the default behavior when `course` is omitted ('summarizes every started course'), which is useful implied usage guidance. However, it never says when to prefer this over siblings like `status` or `list_lessons`, and gives no exclusions or prerequisites.

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

downloadDownload fileB
Idempotent

Download a file (PDF, slides…) from a direct platform URL with the student session into the workspace.

NameRequiredDescriptionDefault
urlYes
destYesFile path relative to the workspace, e.g. "Course/risorse/notes.pdf"

TDQS

B3.4/5.0
Behavior3/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=true), and the description usefully adds that requests carry the student session and land in the workspace. It does not disclose what happens if the destination path already exists (overwrite vs. fail), nor what occurs with a non-platform URL — meaningful gaps for a write tool.

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?

One front-loaded sentence with the key constraint (direct platform URL, student session, workspace) stated up front and no waste. Slightly dense with parenthetical examples but efficient.

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 2-parameter tool with annotations present this is roughly adequate, but with no output schema the description should say what comes back (e.g., the saved workspace path or confirmation) and how failures on bad URLs are surfaced. Those omissions keep it at minimum viable.

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 50%: `dest` is documented in-schema with an example, while `url` has only a `format: uri` constraint. The description partially compensates by constraining the URL to 'a direct platform URL' rather than arbitrary web addresses, but adds nothing about the return or destination-path semantics.

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

Purpose4/5

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

States a specific verb (download) and resource (file: PDF, slides) plus the destination scope (workspace), so the agent knows exactly what the tool produces. The phrase 'direct platform URL' implicitly distinguishes it from the click-based sibling download_by_click, but the sibling is never named.

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?

Usage is only implied: 'direct platform URL' hints that this is the path when you already have a URL, versus download_by_click or open_page. No explicit when-to-use, when-not-to-use, or named alternative is given, leaving the agent to infer the routing against 11 siblings.

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

download_by_clickDownload by clickA
Idempotent

Download a file started by clicking an element of the current page (download buttons without a direct link).

NameRequiredDescriptionDefault
nthNoIndex when several elements match
textNoVisible text of the element
destDirYesFolder relative to the workspace
selectorNoCSS selector (alternative to text)

TDQS

A3.7/5.0
Behavior3/5

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

The description adds real context beyond the annotations by explaining that a click on the live page triggers the download and that this targets linkless buttons. It does not say whether the call waits for the download to finish, how failures or timeouts surface, or whether an existing file in destDir is overwritten — notable given idempotentHint=true on a write-to-disk operation.

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?

One sentence, front-loaded with the action, with the qualifying condition placed in parentheses where it belongs. No filler.

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 4-parameter, open-world interaction tool with no output schema, the description covers what it does and when, but leaves the agent guessing about completion semantics, return value (e.g., saved file path), and error/overwrite behavior.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (nth, text, selector, destDir) are already documented in the schema. The description adds no meaning about how text vs. selector interact or how destDir is resolved, so baseline 3 applies.

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?

Specific verb+resource: it downloads a file, and the mechanism (clicking an element on the current page) is stated. The parenthetical 'download buttons without a direct link' implicitly separates it from the sibling `download`, though it never names that sibling.

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 parenthetical gives a clear triggering condition: use this for download buttons that lack a direct link. It does not explicitly name `download` or `click` as the alternatives to avoid, so the routing is inferred rather than stated.

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

get_lessonLesson detailsA
Read-only

Full details of one lesson: objectives, teacher, paragraphs with duration and progress, handout URL, self-test, and watchUrl, the link to watch it on the platform.

NameRequiredDescriptionDefault
courseYesCourse code from list_courses, e.g. 0662509SECSS01
lessonYesLesson number (as in list_lessons)

TDQS

A3.5/5.0
Behavior3/5

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

readOnlyHint=true and openWorldHint=true already establish the safe-read, external-network profile, so the description adds only the return-content inventory. It says nothing about auth requirements, failure modes for an invalid lesson number, or whether fields like self-test are always present. No contradiction with the annotations.

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

Conciseness4/5

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

One front-loaded sentence, with the core purpose first and field details after. The trailing clause 'watchUrl, the link to watch it on the platform' is slightly wordier than necessary but still earns its place.

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?

There is no output schema, so enumerating the returned fields (objectives, teacher, paragraphs with duration/progress, handout URL, self-test, watchUrl) does real work. With only two schema-documented parameters, the definition covers what an agent needs in order to call and interpret the result.

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 100% and both parameters are documented, including that the course code comes from list_courses and the lesson number matches list_lessons. The description adds no further parameter meaning, so the baseline 3 applies.

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?

A specific verb-plus-resource ('Full details of one lesson') that is clearly the detail counterpart to list_lessons, and it enumerates what the payload contains. It never explicitly names the sibling, so the distinction is inferred rather than stated.

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?

Usage is only implied: fetch a single lesson's details rather than a listing. There is no explicit when-to-use, no named alternative, and no preconditions such as needing a course from list_courses first.

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

get_transcriptLesson transcriptA
Read-only

Text of a lesson (from the video subtitles) as Markdown, with objectives and one section per paragraph. Use it to study, summarize or quiz on a lesson without downloading anything.

NameRequiredDescriptionDefault
courseYesCourse code from list_courses, e.g. 0662509SECSS01
lessonYesLesson number (as in list_lessons)
maxCharsNo
paragraphNoOnly this paragraph

TDQS

A3.7/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 safety profile is covered. The description adds useful format details (subtitles to Markdown, objectives, paragraph sections), but omits operational behavior such as truncation via maxChars, paragraph selection semantics, and error 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?

Two concise sentences with the core content front-loaded and no wasted wording. The structure moves from what the tool returns to why an agent would use it.

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 does a fair job describing the Markdown structure, but it does not explain maxChars truncation, paragraph-only extraction behavior, or what happens when a lesson has no subtitles. For a four-parameter tool with no output schema, those are meaningful gaps.

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 75%, with course, lesson, and paragraph documented in the schema. The description adds no parameter-level meaning, and maxChars remains undocumented in both schema and description, so the baseline of 3 is appropriate.

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 resource and output: lesson text from video subtitles, rendered as Markdown with objectives and one section per paragraph. It distinguishes itself from downloading, but does not explicitly differentiate from the sibling get_lesson tool.

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

Usage Guidelines4/5

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

It gives clear usage contexts — study, summarize, or quiz — and notes that no download is needed. It still lacks explicit when-not guidance or a direct comparison to get_lesson, so it is clear but not fully routing-aware.

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

list_coursesList coursesA
Read-only

List the student's enrolled courses: code, title, CFU and progress (null if not started).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/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, so the safety profile is covered. The description still adds real behavioral value by disclosing the return shape (code, title, CFU, progress) and the null-progress semantics, which matter for a tool with no output schema. It omits ordering and pagination, keeping it short of a 5.

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 front-loads the action and resource, then packs the returned fields plus the null edge case. Every clause carries information and there is no filler.

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

Completeness4/5

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

For a zero-parameter read tool with annotations covering safety and no output schema, the description supplies the field-level return contract an agent needs to interpret results. Missing only secondary details such as result ordering or empty-enrollment behavior.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a 0-param tool is 4. The description correctly implies a no-argument call scoped implicitly to 'the student'.

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

Purpose4/5

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

States a specific verb ('List') and resource ('the student's enrolled courses'), and enumerates the returned fields (code, title, CFU, progress). This clearly separates it from list_lessons and get_lesson, though it never names those siblings explicitly.

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?

Usage is implied: call it to enumerate the student's enrolled courses, and the 'null if not started' note hints at the no-activity case. There is no explicit when-to-use vs. when-not, and no routing away from the overlapping sibling course_progress.

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

list_lessonsList lessonsA
Read-only

List the lessons of a course with teacher, progress, video paragraphs and whether a PDF handout exists. Set compact=false for objectives and media URLs.

NameRequiredDescriptionDefault
courseYesCourse code from list_courses, e.g. 0662509SECSS01
compactNoOmit objectives and URLs

TDQS

A3.9/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, so safety is covered. The description adds real value beyond that by disclosing what the response contains (teacher, progress, video paragraphs, PDF handout presence) and how the compact flag changes the payload — important since there is no output schema.

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, zero filler, with the response-content summary front-loaded and the compact behavior stated second. Every clause earns its place.

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?

With no output schema, the description usefully sketches the return shape and ties the course parameter back to list_courses. Minor gaps like pagination or ordering across lessons are not addressed, but nothing essential to invoking it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented. The description still adds actionable meaning by framing compact as an opt-in switch ("Set compact=false for objectives and media URLs"), telling the agent when flipping it is worthwhile rather than just what it does.

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

Purpose4/5

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

States a specific verb and resource ("List the lessons of a course") and enumerates the returned fields. It does not explicitly distinguish itself from the sibling get_lesson, though the singular/plural split is reasonably obvious.

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 usage guidance is only implied: listing lessons for a course is clearly the batch counterpart to get_lesson, and the course code reference to list_courses hints at a prerequisite. There is no explicit when-to-use or when-not-to-use statement.

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

open_pageOpen pageA
Read-only

Advanced: open a platform URL with the student session and return its text, links, iframes and the JSON API calls it made. Tracking requests are blocked and listed in blockedRequests.

NameRequiredDescriptionDefault
urlNoDefault: the portal home
waitMsNoExtra wait after load, ms
saveCapturesNoSave full API response bodies to the private data folder (may contain personal data)

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover readOnly and openWorld, but the description adds real substance: it runs under the student session, returns a composite payload including captured JSON API calls, and actively blocks tracking requests with a blockedRequests list. Those are behavioral traits the annotations cannot express.

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?

Two sentences, front-loaded with the action and immediately followed by the return shape and the tracking-block caveat. No filler, though the 'Advanced:' qualifier could have been expanded into an actual usage condition rather than a bare label.

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?

With no output schema, the description carries the return-value burden and does so by enumerating text, links, iframes, API calls and blockedRequests. Parameters are fully covered in schema, so the only gap is guidance on when this beats 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 100% and the url parameter's default (portal home) and saveCaptures' privacy warning are documented there. The description only implies that 'url' is a platform URL, adding little beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('open a platform URL') and specifies what comes back (text, links, iframes, JSON API calls). The 'Advanced:' prefix signals it is a lower-level fallback relative to siblings like click or api_get, though it never names those alternatives.

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?

'Advanced:' implies it is a reserve tool for cases where simpler tools fail, but no explicit when-to-use or when-not-to-use condition is stated and no sibling is named. An agent must infer the routing from the prefix alone.

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

statusSession statusA
Read-only

Check whether the saved platform session is valid and when the access token expires. Returns no personal data.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

The readOnlyHint=true annotation already establishes this as a non-mutating read, and the description adds a genuine privacy disclosure ('Returns no personal data') that annotations do not cover. It omits what the response actually looks like (a validity flag plus expiry timestamp) and what happens when no session is saved.

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

Conciseness5/5

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

Two short sentences with zero waste; the core check (validity) is front-loaded ahead of the secondary detail (token expiry) and the privacy note.

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 carries the burden of describing return values, and it does so only partially — an agent knows it gets validity and expiry, but not the shape of the response or how the 'not logged in' case is reported. Adequate for a simple zero-param status probe, but not 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 tool takes zero parameters, which is the baseline-4 case. There is no parameter syntax to explain, and the description correctly does not invent any.

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

Purpose5/5

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

States a specific verb and resource: check the saved platform session's validity and access-token expiry. Neither the name nor the title alone would convey the token-expiry aspect, so the description adds real information, and no sibling tool overlaps with this diagnostic role.

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 usage is implied — an agent would naturally call this to verify session state before other browser-backed calls — but the description never says when to use it, when not to, or what to do on an invalid result. There are no sibling alternatives to route to, which limits how much guidance is even possible.

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

sync_courseDownload courseA
Idempotent

Download every PDF handout and lesson transcript of a course into /risorse/ inside the workspace, plus indice.md and corso.json. Existing files are kept unless force=true.

NameRequiredDescriptionDefault
forceNoDownload again files that already exist
courseYesCourse code from list_courses, e.g. 0662509SECSS01
folderNoFolder relative to the workspace; default: the course title
transcriptsNoAlso build transcripts from subtitles

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true; the description adds real value beyond them by explaining that existing files are preserved unless force=true and by enumerating the files written to disk. It does not mention rate limits, auth, or failure behavior for an invalid course code.

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, both front-loaded with the destination layout first and the overwrite rule second. No filler text.

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 four-parameter download tool with no output schema and solid annotations, the description covers destination, artifacts and overwrite policy. Minor gap: no mention of what happens when the course code is invalid or when transcripts=false.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented in the schema; the description only reinforces the force/default-keep semantics. Baseline 3 applies since the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (download), a specific resource (every PDF handout and lesson transcript of a course), the exact destination path (<folder>/risorse/) and the side artifacts (indice.md, corso.json). This is clearly distinguishable from single-item siblings like download, get_lesson and get_transcript.

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 bulk nature of the operation implies when to use it versus the single-file download tools, and the force=true clause tells the agent how re-runs behave. However, it never explicitly names the alternative tools or states when not to use this one.

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. 12 tool updatesv1.0.0
    • First observedapi_get
    • First observedclick
    • First observedcourse_progress
    • First observeddownload
    • First observeddownload_by_click
    • First observedget_lesson
    • First observedget_transcript
    • First observedlist_courses
    • First observedlist_lessons
    • First observedopen_page
    • First observedstatus
    • First observedsync_course

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have clearly distinct roles: listing (list_courses/list_lessons), detail retrieval (get_lesson/get_transcript), progress (course_progress), and bulk sync (sync_course) are easy to tell apart. The only genuine overlaps are download vs download_by_click (direct URL vs click-triggered) and api_get vs open_page (endpoint fetch vs full page snapshot), which descriptions clarify but still require reading carefully.

Naming Consistency3/5

All names use snake_case, which is good, but the verb_noun convention is only partly followed: list_courses, get_lesson, sync_course, open_page, download_by_click fit it, while status, course_progress, download, click and api_get do not. The set is readable but the pattern is mixed rather than predictable.

Tool Count4/5

Twelve tools is a reasonable size for a university platform client: core study tools plus a small set of advanced escape hatches. There is mild redundancy (two download variants, two low-level fetch tools) that could be trimmed, but nothing feels padded.

Completeness4/5

Coverage of the study domain is strong: courses, lessons, transcripts, handouts, downloads, progress tracking, offline sync, plus browser/API fallbacks for undiscovered features. Minor gaps remain, e.g. no tool to take or submit the self-assessment tests that course_progress references, and no search across courses/lessons.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers