cup24-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cup24-mcp-serverTrova l'ecografia addome completo più economica a Firenze questa settimana"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Cerca per nome prestazioni (esami, visite, analisi, pacchetti check-up), strutture e medici, e ne restituisce gli id |
| Cerca una città o una zona (es. |
| 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, |
| 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 |
| 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 buildClaude Code
claude mcp add cup24 -- node /percorso/assoluto/cup24-mcp-server/dist/index.jsClaude 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 |
| Autocompletamento della ricerca: prestazioni ( |
| Autocompletamento di città e zone, con lo slug usato negli URL |
| Risultati di una prestazione in una città, generati dal server in HTML |
| Risultati di più analisi di laboratorio prenotate insieme («Componi il tuo esame») |
| Disponibilità di una struttura o di un medico, con le stesse card |
| Pulsante «Altre date», filtri per data e ordinamento |
| Riquadro «Scegli data e ora»: risposta JSON con l'HTML degli orari del giorno |
| Pulsante «Successivo»: il giorno disponibile seguente della stessa agenda; |
| Scheda della prestazione: FAQ in JSON-LD e tabella dei prezzi minimi e massimi per città |
| 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:
«Scegli orario e Prenota» apre il riquadro degli orari (
/messages/options); scegliere un orario non manda richieste.«Conferma» manda
POST /cart/updateconslotidefreeslotid(l'orario scelto) e porta a/cart/checkout. Per le analisi passa anchewhatids.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.Dopo l'ordine il sito controlla lo stato (
/order/recent_status); spostamenti e rimborsi passano da/lib/reschedule.phpe/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 realePer 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-Agentche rimanda a questo repository.Non è un dispositivo medico e non dà consigli medici.
Licenza
Available Tools
5 toolscup24_get_availabilityGet availability and pricesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City or zone slug from cup24_search_cities, e.g. 'firenze' | |
| page | No | Page of results, 1 = first | |
| sort | No | 'date' = earliest first (default), 'price' = cheapest first, 'distance' = nearest first | date |
| when | No | Only slots: oggi (today), domani (tomorrow), settimana (this week), prossima-settimana (next week), prossimo-mese (next month) | |
| clinic_id | No | Clinic id from cup24_search (clinics) or from a slot's clinic_id | |
| doctor_id | No | Doctor id from cup24_search (doctors) | |
| service_ids | No | Service ids from cup24_search, e.g. ['57d1785cdb86a']; several only for combinable lab tests |
TDQS
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.
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.
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.
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.
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.
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 informationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | Yes | Service id from cup24_search, e.g. '57d1785cdb86a' or 'P4f0558e47c4f' |
TDQS
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.
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.
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.
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.
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.
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 timesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many available days to return, from the slot's day | |
| slot_id | Yes | slot_id from cup24_get_availability |
TDQS
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.
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.
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.
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.
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.
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_searchSearch services, clinics and doctorsARead-onlyIdempotent
Search cup24.it by name: healthcare services (exams, visits, lab tests, check-up packages), clinics and doctors.
Search in Italian. Returns ids for the other tools:
services[].id -> service_ids in cup24_get_availability, service_id in cup24_get_service_info. package=true marks check-up packages; combinable=true marks lab tests that can be booked together in one visit.
clinics[].id -> clinic_id, doctors[].id -> doctor_id in cup24_get_availability. Examples: "ecografia addome", "visita cardiologica", "emocromo", "check-up", "synlab", "rossi".
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Service, clinic or doctor name, e.g. 'ecografia addome' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely non-derivable behavior: the Italian-language input requirement and the meaning of the returned flags (package=true for check-up packages, combinable=true for lab tests bookable together). It stops short of describing match fuzziness or any result-count limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the Italian-language constraint lead, followed by a short scannable id-to-sibling mapping and a compact example list. Every bullet carries routing or semantic information; nothing is restated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by sketching the response shape (services[].id, clinics[].id, doctors[].id) plus the package/combinable flags. Combined with the single well-documented parameter and the sibling id mapping, an agent has everything needed to call this correctly and chain the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the query parameter is already documented with an example, establishing a baseline of 3. The description adds value above that by specifying the language the query must be in and supplying five realistic query examples spanning service, package, clinic and doctor names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search cup24.it by name') and enumerates the three entity types covered: healthcare services, clinics and doctors, with concrete sub-categories (exams, visits, lab tests, check-up packages). An agent can immediately distinguish this from a lookup-by-city or an availability call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage constraint ('Search in Italian') and routes the agent forward by mapping each returned id to the specific field of the specific sibling tool where it is consumed. It does not explicitly state when to prefer cup24_search_cities over this tool, though the field-based routing makes that largely self-evident.
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 zonesARead-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".
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | City or zone name, e.g. 'firenze' |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.2.0- First observed
cup24_get_availability - First observed
cup24_get_service_info - First observed
cup24_get_slot_times - First observed
cup24_search - First observed
cup24_search_cities
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Search a healthcare provider directory and get full provider details by id.
Find local services, read availability, and create short-lived booking holds.
Book medical appointments with French doctors by specialty and city via AI agents.
Verified local businesses, bookable by AI agents: services, prices, availability and appointments.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables 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.1010 npmMIT
- AlicenseAqualityBmaintenanceEnables 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.3MIT
- AlicenseBqualityCmaintenanceEnables 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.21MIT
- AlicenseAqualityAmaintenanceEnables 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.12595 PyPI3MIT