Skip to main content
Glama

cup24-mcp-server

Server MCP non ufficiale per cup24.it (ex Cup Solidale): chiedi al tuo assistente AI dove fare un esame o una visita privata in Italia, quando e a che prezzo.

«Trovami l'ecografia addome completo più economica a Firenze questa settimana» «Chi ha posto domani mattina per una visita cardiologica a Milano?» «Emocromo e glicemia insieme, dove costa meno a Roma?» «Come mi preparo a una risonanza e quanto costa di solito a Bologna?» «Ecco la foto dell'impegnativa: dove faccio tutto a Firenze con meno uscite possibili, entro il 15?» «Avvisami se si libera una visita cardiologica a Firenze prima del 10, sotto i 90 €»

Il server è solo in lettura verso cup24.it: cerca, confronta e sorveglia disponibilità, orari e prezzi in tempo reale. La prenotazione resta sul sito, perché chiede dati personali e pagamento: ogni risultato ha un booking_url alla pagina della struttura.

English: unofficial, read-only MCP server for cup24.it, the Italian private-healthcare booking site. It searches services, clinics and doctors and returns real-time availability, bookable times, prices and service information; booking stays on the website.

Strumenti

Strumento

Cosa fa

cup24_search

Cerca per nome prestazioni (esami, visite, analisi, pacchetti check-up), strutture e medici, e ne restituisce gli id

cup24_search_cities

Cerca una città o una zona (es. firenze, firenze-zona-campo-di-marte) e ne restituisce lo slug

cup24_get_availability

Disponibilità e prezzi: di una prestazione in una città, di più analisi di laboratorio prenotate insieme, di una struttura o di un medico. Per ogni struttura e giorno: orari liberi, prezzo (anche scontato), voto e recensioni, indirizzo, coordinate, distanza, medico, slot_id e link per prenotare. Ordina per date, price o distance, filtra per oggi, domani, settimana, prossima-settimana, prossimo-mese, e pagina in ordine cronologico

cup24_get_slot_times

Gli orari prenotabili di uno slot giorno per giorno, come nel riquadro «Scegli data e ora» del sito; per le analisi, la fascia oraria dei prelievi

cup24_get_service_info

La scheda di una prestazione: a cosa serve, preparazione, digiuno, durata e altre FAQ, prezzo minimo e massimo nelle principali città, e per i pacchetti l'elenco delle analisi incluse

cup24_plan_visits

Pianifica più prestazioni insieme, per esempio tutte le voci di un'impegnativa. Restituisce fino a tre piani: meno uscite (stessa struttura e stesso giorno per più voci possibili, con orari suggeriti a 15 minuti l'uno dall'altro), più economico e prima possibile, ciascuno con totale, uscite e link per prenotare. Le analisi si fanno con un unico prelievo a prezzo combinato. Filtra per data massima e distanza

cup24_watch_add

Crea un avviso: una prestazione in una città, con almeno un limite tra data massima, prezzo massimo e distanza. Lo controlla subito e dice cosa corrisponde già (available_now)

cup24_watch_check

Controlla gli avvisi adesso e restituisce solo gli orari che al controllo precedente non c'erano, anche quelli prenotati e poi disdetti

cup24_watch_list, cup24_watch_remove

Elenca e cancella gli avvisi

Dalla ricetta alla prenotazione

Dai all'assistente la foto o il testo dell'impegnativa. Per ogni voce cerca la prestazione con cup24_search e ti mostra l'abbinamento da confermare. Poi chiama cup24_plan_visits, che:

  1. cerca ogni voce in città, ordinata per data, prezzo e distanza, per sapere quali strutture la offrono;

  2. legge giorno per giorno i calendari delle strutture che offrono più voci, per trovare uscite che ne coprono diverse nello stesso giorno;

  3. costruisce i piani scegliendo ogni volta la struttura e il giorno che coprono più voci rimaste.

Le analisi stanno quasi sempre in sedi di laboratorio separate, quindi con le analisi «tutto in un'uscita» è raro. L'abbinamento ricetta → prestazione resta il punto delicato: l'assistente deve sempre fartelo confermare. Gli orari suggeriti presumono 15 minuti per appuntamento.

Avvisi sugli slot

Gli avvisi sono salvati solo sul tuo computer, in ~/.cup24-mcp/watches.json (si cambia con la variabile CUP24_WATCH_FILE). Il comando check li controlla tutti: stampa gli orari nuovi e, su macOS, mostra una notifica.

node /percorso/assoluto/cup24-mcp-server/dist/index.js check

Per farlo girare da solo ogni 30 minuti su macOS, salva questo file come ~/Library/LaunchAgents/it.cup24.watch.plist, sostituendo i due percorsi (which node ti dice dov'è Node):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>it.cup24.watch</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/node</string>
    <string>/percorso/assoluto/cup24-mcp-server/dist/index.js</string>
    <string>check</string>
  </array>
  <key>StartInterval</key><integer>1800</integer>
  <key>StandardOutPath</key><string>/tmp/cup24-watch.log</string>
  <key>StandardErrorPath</key><string>/tmp/cup24-watch.log</string>
</dict>
</plist>

Poi attivalo con launchctl load ~/Library/LaunchAgents/it.cup24.watch.plist; lo togli con launchctl unload sullo stesso file. Su Linux basta una riga di cron: */30 * * * * node /percorso/assoluto/cup24-mcp-server/dist/index.js check.

Ogni controllo fa da 1 a 4 richieste a cup24.it per avviso: non scendere sotto i 15 minuti. Il controllo guarda le prime tre pagine di risultati in ordine di data (più la prima per prezzo, se c'è un prezzo massimo), quindi per le prestazioni molto richieste copre qualche giorno, per quelle rare settimane. Il computer deve essere acceso.

Related MCP server: nfz-mcp

Installazione

Serve Node.js 20 o superiore.

git clone https://github.com/NiccoloSalvini/cup24-mcp-server.git
cd cup24-mcp-server
npm install
npm run build

Claude Code

claude mcp add cup24 -- node /percorso/assoluto/cup24-mcp-server/dist/index.js

Claude Desktop e altri client MCP

Aggiungi al file di configurazione dei server MCP (per Claude Desktop claude_desktop_config.json):

{
  "mcpServers": {
    "cup24": {
      "command": "node",
      "args": ["/percorso/assoluto/cup24-mcp-server/dist/index.js"]
    }
  }
}

Senza clonare, direttamente da GitHub (npm compila il pacchetto al primo avvio):

{
  "mcpServers": {
    "cup24": { "command": "npx", "args": ["-y", "github:NiccoloSalvini/cup24-mcp-server"] }
  }
}

Come funziona cup24.it

cup24.it non ha un'API pubblica documentata. Il server usa gli stessi endpoint che usa il sito, ricostruiti con REA (analisi del bundle JavaScript e cattura di uno scenario nel browser) e con l'osservazione del traffico in Chrome:

Endpoint

Uso sul sito

GET https://api2.cup24.it/v2/search/suggest?term=…

Autocompletamento della ricerca: prestazioni (type: "service"), strutture (sede) e medici (doctor). I pacchetti check-up hanno id che iniziano con P

GET https://api2.cup24.it/v2/search/suggestcity?term=…

Autocompletamento di città e zone, con lo slug usato negli URL

GET https://cup24.it/c/{città}/{id prestazione}/

Risultati di una prestazione in una città, generati dal server in HTML

GET https://cup24.it/search/{id},{id}/ con cookie lat, lng

Risultati di più analisi di laboratorio prenotate insieme («Componi il tuo esame»)

GET https://cup24.it/sede/{id}[/{id prestazione}], GET https://cup24.it/medico/{id}

Disponibilità di una struttura o di un medico, con le stesse card

POST su ognuna di queste URL, form page, when, sort (sort:price, sort:where)

Pulsante «Altre date», filtri per data e ordinamento

POST https://cup24.it/messages/options con id dello slot

Riquadro «Scegli data e ora»: risposta JSON con l'HTML degli orari del giorno

POST sulla stessa URL con who, what, where, when, mode=next

Pulsante «Successivo»: il giorno disponibile seguente della stessa agenda; no_slot: true quando non ce ne sono più

GET https://cup24.it/prestazione/{id}/

Scheda della prestazione: FAQ in JSON-LD e tabella dei prezzi minimi e massimi per città

GET https://cup24.it/what/{id pacchetto}/package_list

Analisi incluse in un pacchetto check-up, in JSON

Nella pagina dei risultati ogni card è una struttura in un giorno: gli orari liberi sono nell'attributo title="Orari: …", indirizzo, coordinate e data sono in un oggetto JSON passato a window.slotAddressPoints.push(…), e l'id dello slot è nel data-id del pulsante «Scegli orario e Prenota». Il server legge questi dati; se il sito cambia struttura, il parser va aggiornato (npm test lo verifica su copie ridotte di risposte reali, npm run smoke sul sito vero).

La prenotazione e l'annullamento (non implementati)

Ricostruiti dal codice del sito con REA e provati una volta su un account reale (un emocromo con pagamento in sede, prenotato e annullato subito il 26/10/2026):

  1. «Prenota» o «Scegli orario e Prenota» apre il riquadro degli orari (/messages/options); per le analisi apre invece un riepilogo (/messages/lab-options). Scegliere un orario non manda richieste.

  2. «Conferma» svuota il carrello e manda POST /cart/update con slotid e freeslotid (per le analisi anche whatid), poi porta a /cart/checkout.

  3. Il checkout tiene l'orario per 10 minuti. Prende nome, cognome, codice fiscale ed email dall'account e chiede il cellulare, l'accettazione delle condizioni e il consenso al trattamento dei dati sanitari. Pagamento: carta, Google Pay e Apple Pay (Stripe) o in sede. Il prezzo delle analisi include il costo del prelievo (es. 5 € + 4 €).

  4. «Conferma prenotazione» valida i dati (codice fiscale, maggiore età, email) e manda in POST all'action del modulo tutto #formCheckout (client_data[bill_to][…], client_data[patient][…]). Se la risposta tarda, il sito interroga /order/recent_status ogni 5 secondi per 90 secondi, mentre la struttura conferma. La risposta può chiedere un OTP sul cellulare o rimandare a Stripe; altrimenti porta a /order/review/{id}. Il codice manda anche una copia del modulo a un endpoint di log (kibanaeu.cup24.it:8080).

  5. L'annullamento parte da «Le tue prenotazioni» (/orders): la X apre /order/{id}/remove?u_info=…&jwt=…, si sceglie un motivo (company_decision, reservation_update, book_elsewhere, other con testo) e si conferma due volte (/messages/rimborso). L'ultima conferma manda POST /lib/refund.php con orderid, reason, reason_other; la prenotazione passa a «Rimborsato» e arriva una mail. Gli spostamenti usano /lib/reschedule.php.

Il server resta in sola lettura: prenotare richiede l'account dell'utente, il suo cellulare con OTP, consensi espliciti e il pagamento, e ogni prova occupa un orario reale e manda mail alla struttura.

Analizzare il sito con REA

Sul bundle intero (index.js, 1,2 MB minificati) l'analisi semantica di REA esaurisce la memoria anche con 8 GB. Il motivo è che tiene in uso più di 8 GB per un unico file da circa 312.000 nodi di sintassi. scripts/rea-split.mjs divide il bundle nei moduli webpack e il blocco d'ingresso in pezzi da circa 25 KB, separando il codice di cup24 (app/) dalle librerie (vendor/):

REA però non collega un listener alla funzione che lo gestisce, né le chiamate Pi.metodo() alla loro definizione, e i suoi semi di tipo stringa non trovano gli endpoint. scripts/rea-map.mjs colma queste lacune usando solo l'evidenza di REA. Lancia REA un file alla volta (un'unica esecuzione su tutti i file supera il budget di risultati di REA), poi unisce i suoi nodi:

  • listener → funzione gestore: il nodo function che segue il selettore;

  • gestore → chiamate: i nodi call-site nel suo intervallo;

  • chiamate → definizioni: Pi.* e le funzioni minificate con nome unico, anche tra file diversi;

  • chiamate → endpoint: $.ajax, fetch, XHR e i riquadri caricati da /messages/….

node scripts/rea-split.mjs "$(curl -s https://cup24.it/ | grep -o 'https://cdn01[^"]*/js/index.js' | head -1)" /tmp/cup24-rea
node scripts/rea-map.mjs /tmp/cup24-rea/app                       # tutti gli eventi che arrivano a un endpoint
node scripts/rea-map.mjs /tmp/cup24-rea/app --find /lib/refund.php # da un endpoint ai click che lo usano

Ci vogliono circa 30 secondi. Tutti i file del codice di cup24 risultano «complete», senza troncamenti né limiti di memoria. La mappa completa finisce in app/rea-map.json e l'evidenza di REA resta in cache accanto a ogni file (*.rea.json). Esempio: --find /lib/refund.php restituisce click ".removeOrder" e il pulsante «Cancella prenotazione», entrambi tramite Pi.makeRefund.

Sviluppo

npm run build   # compila in dist/
npm test        # test dei parser, offline
npm run smoke   # avvia il server e chiama ogni strumento sul sito reale

Per esplorarlo a mano: npx @modelcontextprotocol/inspector node dist/index.js.

Avvertenze

  • Progetto indipendente, non affiliato a CupSolidale srl né a cup24.it. Marchi e dati appartengono ai rispettivi titolari.

  • I dati vengono dal sito in tempo reale e possono cambiare in ogni momento: prezzo e orario valgono solo dopo la conferma sul sito.

  • Usalo con moderazione: ogni chiamata è una richiesta a cup24.it. Il server si identifica con uno User-Agent che rimanda a questo repository.

  • Non è un dispositivo medico e non dà consigli medici.

Licenza

MIT

Available Tools

5 tools
cup24_get_availabilityGet availability and pricesA
Read-onlyIdempotent

Real-time availability and prices on cup24.it, from private clinics. Pass one of:

  • service_ids + city: one service in a city; several combinable lab tests are booked together and priced as one visit

  • clinic_id (optionally with one service id): what that clinic can do soonest

  • doctor_id: that doctor's availability

Returns slots: one per clinic and day, with that day's free times, service, price in EUR (full_price_eur and price_note on promotions), clinic, rating, address, coordinates, distance in km from the city centre, doctor, slot_id for cup24_get_slot_times, and booking_url to book on the website. Results come in chronological pages: when slots is not empty, call again with page=next_page for later dates.

NameRequiredDescriptionDefault
cityNoCity or zone slug from cup24_search_cities, e.g. 'firenze'
pageNoPage of results, 1 = first
sortNo'date' = earliest first (default), 'price' = cheapest first, 'distance' = nearest firstdate
whenNoOnly slots: oggi (today), domani (tomorrow), settimana (this week), prossima-settimana (next week), prossimo-mese (next month)
clinic_idNoClinic id from cup24_search (clinics) or from a slot's clinic_id
doctor_idNoDoctor id from cup24_search (doctors)
service_idsNoService ids from cup24_search, e.g. ['57d1785cdb86a']; several only for combinable lab tests

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare this as a read-only, idempotent, non-destructive, open-world operation. The description adds meaningful behavior beyond that: results are real-time, come in chronological pages, and should be continued with page=next_page when slots is not empty. It does not discuss auth, rate limits, or errors, but the annotations lower the need for that.

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 what the tool does, then bullet-lists the valid parameter combinations, then explains returns and pagination. It is fairly long but well structured and every section adds needed information, especially because there is no output schema.

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 7-parameter, no-required-parameter read tool with no output schema, the description covers the important invocation modes, return fields, slot_id handoff to cup24_get_slot_times, booking_url, and pagination. An agent has enough context to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3. The description adds useful semantics not in the schema: service_ids can be combined only for combinable lab tests and are priced as one visit, and clinic_id may be used with one service id to find that clinic's soonest availability.

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 states a specific verb and resource: it gets real-time availability and prices from private clinics on cup24.it. It also distinguishes itself from cup24_get_slot_times by indicating that returned slot_id values are for that sibling, and it makes the three main lookup modes explicit.

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?

It gives explicit selection guidance with 'Pass one of' followed by three concrete parameter combinations: service_ids + city, clinic_id, or doctor_id. This tells an agent how to invoke the tool for different intents and names the downstream tool for a slot's detailed times.

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

cup24_get_service_infoGet service informationA
Read-onlyIdempotent

What a service is and what it costs across Italy, from its cup24.it page: FAQ (what it is for, how to prepare, fasting, duration, contraindications), min and max price per major city, and for check-up packages the lab tests included. Use cup24_get_availability for real-time prices and dates.

NameRequiredDescriptionDefault
service_idYesService id from cup24_search, e.g. '57d1785cdb86a' or 'P4f0558e47c4f'

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds meaningful context beyond them: the data comes from the cup24.it service page (i.e. a static snapshot, not live availability), which explains the freshness caveat and reinforces the split with cup24_get_availability.

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: the return payload first, the alternative-tool routing second. The parenthetical enumerations are dense but each item (fasting, duration, contraindications, lab tests) earns its place by telling the agent what questions this tool can answer.

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?

There is no output schema, so the description carries the burden of describing the return value — and it does so concretely (FAQ topics, per-city price range, package test lists). Combined with the routing hint to the availability sibling, nothing needed to call this correctly is missing.

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

Parameters3/5

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

Single parameter with 100% schema description coverage; the schema even tells the agent where to obtain the id (from cup24_search) and gives format examples. The description adds nothing about service_id, but with full schema coverage the baseline 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?

States a specific resource (a service's cup24.it page) and enumerates exactly what is returned: FAQ fields, min/max price per major city, and lab tests for check-up packages. It also names the sibling tool it is not (cup24_get_availability), so an agent can distinguish it without inspecting either schema.

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

Usage Guidelines4/5

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

The final sentence explicitly routes the agent: use cup24_get_availability for real-time prices and dates, implying this tool is for static descriptive/price-range data. That is a clear alternative-and-condition, though the 'use this when' side is only implied rather than stated outright.

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

cup24_get_slot_timesGet bookable timesA
Read-onlyIdempotent

Exact bookable times for a slot from cup24_get_availability, day by day: the slot's day, then the next available days of the same clinic and doctor, as in the website's "Scegli data e ora" picker. For lab tests the only entry describes the walk-in window (e.g. "Esecuzione prelievi: il Martedì dalle 07:00 alle 09:00"). To book, open the slot's booking_url.

NameRequiredDescriptionDefault
daysNoHow many available days to return, from the slot's day
slot_idYesslot_id from cup24_get_availability

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the read-only, idempotent, non-destructive profile, so the description's added value is in what is returned: the slot's day plus the next available days for the same clinic and doctor. The special lab-test case (a single walk-in window with an example string) is genuinely useful disclosure that annotations cannot convey.

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 tight sentences, front-loaded with the core purpose and followed by the lab-test edge case and the booking next step. The Italian example string is a little heavy but earns its place by showing the exact format an agent will encounter.

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 the return shape, and it does so adequately: a per-day list of bookable times, with the lab-test variant spelled out. It omits error/empty behavior, but nothing essential for a correct call 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 baseline is 3, but the description adds meaning beyond the schema: results are 'day by day', starting with the slot's day then the next available days. That clarifies what the `days` parameter actually counts against (available days, not calendar days), which the schema alone leaves ambiguous.

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: exact bookable times for a slot, day by day, and names the sibling (cup24_get_availability) that supplies the slot_id. It also anchors the behavior to the website's 'Scegli data e ora' picker, so an agent can distinguish it from the availability search 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?

Makes the follow-up relationship explicit ('slot from cup24_get_availability') and gives the next step for booking ('open the slot's booking_url'), which is a clear usage path. It does not state exclusions, such as what to do when no slot times are returned or when to prefer get_availability instead, but the implicit sequencing is strong.

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

cup24_search_citiesSearch cities and zonesA
Read-onlyIdempotent

Find Italian cities, and zones inside big cities, covered by cup24.it and return their slugs.

Use the returned slug as city in cup24_get_availability. Zones narrow the search, e.g. "firenze-zona-campo-di-marte". Examples: "firenze", "milano", "sesto fiorentino".

NameRequiredDescriptionDefault
queryYesCity or zone name, e.g. 'firenze'

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and openWorld, so safety is covered. The description adds genuine behavior: results are slugs, and zones are encoded in a specific hyphenated format (e.g. 'firenze-zona-campo-di-marte'), which the agent needs in order to interpret and reuse results. Return format nuance (partial matches, empty results) is not covered.

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

Conciseness5/5

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

Three short blocks: purpose, workflow handoff, examples. Nothing is wasted and the most important information (what it returns and how to use it) is 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 single-parameter lookup tool with no output schema, the description supplies purpose, return type, and the exact downstream usage. The only minor omission is behavior on zero or multiple matches, which is not critical for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description earns extra credit by showing that the query accepts both plain city names and zone-style strings, with multiple examples ('firenze', 'milano', 'sesto fiorentino') that clarify the free-text format beyond the single schema example.

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?

Specific verb (Find) plus resource (Italian cities and zones covered by cup24.it) and the return value (slugs). This is distinct from cup24_search and cup24_get_availability, so an agent can tell it apart from siblings without reading schemas.

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

Usage Guidelines4/5

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

Explicitly states the downstream step: use the returned slug as the 'city' argument in cup24_get_availability, and explains how zones narrow the search. It doesn't state when to prefer this over the sibling cup24_search, which keeps it below a 5.

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. 5 tool updatesv0.2.0
    • First observedcup24_get_availability
    • First observedcup24_get_service_info
    • First observedcup24_get_slot_times
    • First observedcup24_search
    • First observedcup24_search_cities

TDQS

A4.5/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct step of a clear pipeline: text search, city/zone lookup, day-level availability, exact slot times, and static service encyclopedia info. The descriptions explicitly cross-reference which tool's output feeds the next, and the availability vs. slot_times split (day overview vs. exact times) is clearly delineated.

Naming Consistency5/5

All five tools use the same cup24_ prefix followed by a consistent snake_case verb_noun pattern (search, search_cities, get_availability, get_slot_times, get_service_info). No mixing of conventions or casing styles.

Tool Count5/5

Five tools map exactly onto the domain's workflow stages with no redundant or filler entries. This is a well-scoped set well within the 3-15 range, and each tool earns its place.

Completeness4/5

The surface covers discovery, location resolution, availability, exact times, and service education, which is a coherent end-to-end decision flow. The only gap is that booking is delegated to an external booking_url rather than an in-server booking/cancellation tool, which is a reasonable but real omission.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to search the doktor.mx directory for over 56,000 verified doctors and medical specialists across Mexico. It provides tools for verifying professional licenses, finding specialists by symptoms or conditions, and checking medical insurance compatibility.
    10
    50 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables querying the Polish National Health Fund (NFZ) public API for medical waiting lists and service dictionary, allowing AI to compare wait times and find providers.
    3
    3
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables querying Doctolib's public data to find practitioners, retrieve all available appointment slots in a geographic area, access practice details, and receive alerts when new slots open.
    21
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search Iranian doctors, hospitals and clinics by specialty, city, name, gender and online visit, then read profiles, ratings, insurances, patient reviews, visit prices in Toman and free appointment times. Read-only, with no login, booking or payment, so users compare options and get a profile link to book themselves.
    12
    101 PyPI
    4
    MIT