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?»

Il server è solo in lettura: cerca e confronta 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

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 (non implementata)

Ricostruita dal codice del sito e osservata fino alla scelta dell'orario, senza confermare:

  1. «Scegli orario e Prenota» apre il riquadro degli orari (/messages/options); scegliere un orario non manda richieste.

  2. «Conferma» manda POST /cart/update con slotid e freeslotid (l'orario scelto) e porta a /cart/checkout. Per le analisi passa anche whatids.

  3. Il checkout chiede nome, email, telefono e codice fiscale, controlla l'utente (api2…/v2/check/user_behavior) e la disponibilità presso la struttura (/cart/check_availability), poi il pagamento: carta, PayPal, Stripe (Google Pay, Apple Pay), Scalapay, pagamento in sede, coupon o credito welfare.

  4. Dopo l'ordine il sito controlla lo stato (/order/recent_status); spostamenti e rimborsi passano da /lib/reschedule.php e /lib/refund.php.

Il server si ferma prima del passo 2: aggiungere al carrello occupa l'orario per altri pazienti, e i passi successivi richiedono dati personali e pagamento.

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
ResponsivenessNo issues

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
    10 npm
    MIT
  • A
    license
    A
    quality
    B
    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
    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
    595 PyPI
    3
    MIT