Skip to main content
Glama

Matricola

Progettazione e verifica di un server Model Context Protocol per il Servizio di Ingegneria Clinica

Luigi Loperfido · ottobre 2026

Nota. Questo repository contiene un caso di studio. La struttura sanitaria, le apparecchiature e i dati sono fittizi. Il software è stato sviluppato e verificato su dati di prova e non è in uso presso alcuna struttura sanitaria.

English summary. Matricola is a case study of a Model Context Protocol (MCP) server for a hospital's Clinical Engineering department. It gives an AI assistant controlled, read-only access to the medical equipment inventory, the maintenance and electrical safety inspection schedule, and manufacturers' field safety notices. The repository includes the server, automated tests, and an experiment on how MCP behaves over HTTP. Documentation is in Italian.

Indice

  1. Contesto

  2. Funzioni

  3. Architettura e principi di progetto

  4. Installazione

  5. Configurazione

  6. Uso con Claude Desktop

  7. Verifica

  8. Struttura del repository

  9. Limiti

  10. Riferimenti e licenza

Related MCP server: openemr-mcp

1. Contesto

Il Servizio di Ingegneria Clinica (SIC) di un ospedale gestisce la manutenzione e la sicurezza delle apparecchiature elettromedicali. Quando un fabbricante emette un avviso di sicurezza (Field Safety Notice, FSN) su un modello, il servizio deve individuare rapidamente gli apparecchi coinvolti confrontando il documento del fabbricante con l'inventario. Si tratta di un'attività manuale, lenta e soggetta a un errore particolarmente grave: un apparecchio coinvolto che non viene individuato.

Matricola è un server basato su Model Context Protocol (MCP), lo standard aperto che consente a un assistente di intelligenza artificiale di accedere in modo controllato a dati e strumenti esterni. Il server permette all'ingegnere clinico di interrogare in linguaggio naturale l'inventario, lo scadenziario delle manutenzioni e gli avvisi di sicurezza. L'accesso ai dati è in sola lettura e ogni decisione resta in capo al personale del servizio.

Il progetto applica i contenuti del corso Model Context Protocol: Advanced Topics (Claude Academy, Anthropic).

2. Funzioni

Funzione

Descrizione

Tipo

cerca_apparecchi

Ricerca nell'inventario per matricola, tipo, modello, fabbricante o reparto

Lettura

scadenze

Manutenzioni preventive (MP), verifiche di sicurezza elettrica (VSE, CEI EN 62353) e controlli funzionali (CF) scaduti o in scadenza

Lettura

apparecchi_coinvolti

Confronto tra i numeri di serie di un avviso e l'inventario, con normalizzazione della scrittura

Lettura

riassumi_avviso

Estrazione dei dati operativi da un avviso di sicurezza, con citazione delle frasi di origine; il risultato è sempre una bozza

Lettura, testo generato tramite sampling

report_conformita

Attività eseguite in tempo, in ritardo o non eseguite, per reparto; salva un file CSV

Lettura, con notifiche di avanzamento

apri_ordine_lavoro

Creazione di un ordine di lavoro in stato di bozza, previa conferma

Unica scrittura

list_roots

Elenco delle cartelle consultabili

Lettura

read_dir

Contenuto di una cartella consentita

Lettura

3. Architettura e principi di progetto

Il server è scritto in Python con la libreria ufficiale MCP (FastMCP). Lo stesso codice funziona in due modalità di collegamento (trasporti):

  • STDIO: il server viene avviato dall'applicazione sulla stessa postazione (prima fase);

  • StreamableHTTP: il server è raggiungibile sulla rete interna da più postazioni (seconda fase).

Principi adottati:

  1. L'AI propone, la persona decide. I testi generati sono marcati come bozza; l'unica scrittura è un ordine di lavoro in bozza, approvato da un tecnico nel CMMS.

  2. Sola lettura. Il server legge da una copia del database con un'utenza separata da quella di scrittura.

  3. Nessun dato di pazienti. Il sistema tratta solo dati tecnici e gestionali.

  4. Tracciabilità. Ogni richiesta viene registrata in un file a sola aggiunta; ogni risposta riporta fonte e istante di lettura.

  5. Nessun collegamento a Internet dal server. Quando serve il modello AI, il server lo richiede all'applicazione tramite sampling.

  6. Accesso ai file limitato. Il server apre soltanto file contenuti nelle cartelle autorizzate (roots); in loro assenza, nessun file è accessibile.

  7. Funzionamento garantito. Le richieste dal server all'applicazione hanno un tempo massimo; se non vanno a buon fine, il server adotta una soluzione di riserva.

Il documento di progetto completo, con architettura, scelte tecniche, rischi e un simulatore dei messaggi, è disponibile in docs/documento-di-progetto.html.

4. Installazione

Requisiti: Python 3.10 o successivo e, consigliato, uv.

git clone https://github.com/Luislop-eng/Matricola.mcp.git
cd Matricola.mcp
uv sync                      # oppure: pip install -r requirements.txt

La libreria MCP è fissata alla versione 1.x: nella versione 2 la classe FastMCP è stata rinominata MCPServer.

5. Configurazione

Il server si configura con variabili d'ambiente.

Variabile

Obbligatoria

Descrizione

CMMS_DB_URL

Sì

Indirizzo del database in lettura, in formato SQLAlchemy (es. sqlite:///cmms.db, postgresql+psycopg://...)

CMMS_WRITE_URL

No

Database per la scrittura degli ordini in bozza; se assente si usa CMMS_DB_URL

MATRICOLA_ROOTS

No

Cartelle consentite da usare se l'applicazione non le fornisce (separate da :)

MATRICOLA_REPORT_DIR

No

Cartella di destinazione dei report (predefinita: Report)

MATRICOLA_AUDIT_LOG

No

File del registro delle richieste (predefinito: audit.jsonl)

MATRICOLA_TRANSPORT

No

stdio (predefinito) oppure streamable-http

MATRICOLA_HOST, MATRICOLA_PORT

No

Indirizzo e porta in modalità HTTP (predefiniti: 127.0.0.1, 8000)

MATRICOLA_STATELESS

No

1 per la modalità HTTP senza sessione

MATRICOLA_JSON_RESPONSE

No

1 per risposte HTTP in formato JSON unico, senza streaming

MATRICOLA_TIMEOUT_CLIENT

No

Secondi di attesa per le richieste verso l'applicazione (predefinito: 60)

Lo schema minimo del database è descritto in docs/schema.sql.

6. Uso con Claude Desktop

Aggiungere il server al file di configurazione di Claude Desktop, adattando i percorsi. Un esempio è disponibile in docs/claude_desktop_config.example.json.

Esempi di richieste:

  • «Quali verifiche di sicurezza elettrica scadono in Terapia Intensiva nei prossimi 30 giorni?»

  • «Leggi l'avviso sui ventilatori VX-500 nella cartella degli avvisi e riassumi le azioni richieste.»

  • «Quali dei nostri ventilatori VX-500 sono coinvolti dall'avviso?»

7. Verifica

7.1 Test automatici

uv run test_e2e.py              # configurazione con sessione
uv run test_e2e.py stateless    # configurazione senza sessione
uv run test_http.py             # server avviato in HTTP (eseguire prima test_e2e.py)
uv run test_http.py stateless

test_e2e.py crea un database SQLite con dati fittizi e collega il server a un client MCP completo (con gestione di sampling, roots, log e avanzamento). Risultati ottenuti con Python 3.13 e mcp 1.30.0:

Configurazione

Test superati

Con sessione

21 / 21

Senza sessione (soluzioni di riserva)

19 / 19

I test coprono, tra l'altro: numeri di serie e nomi di modello scritti in modi diversi; un avviso contenente un'istruzione nascosta; il blocco di accessi a file esterni alle cartelle consentite; il calcolo del report; il comportamento con un client che non supporta sampling e roots; la registrazione di ogni richiesta.

7.2 Errore individuato durante lo sviluppo

Nella prima versione il nome del modello veniva confrontato carattere per carattere: un avviso che indicava «VX500» non individuava gli apparecchi registrati come «VX-500», senza alcuna segnalazione. L'errore è stato corretto uniformando la scrittura di fabbricante, modello e numero di serie e segnalando esplicitamente i casi in cui il modello non viene trovato.

7.3 Esperimento sui trasporti

esperimento_trasporti.py avvia un server minimo in tre configurazioni HTTP e registra quali messaggi raggiungono il client.

uv run esperimento_trasporti.py

Configurazione

Richieste dal server al client (sampling, roots)

Notifiche di log e avanzamento

Con sessione

Funzionano

Ricevute

stateless_http=True

Non funzionano: restano in attesa fino al timeout

Ricevute

stateless_http=True, json_response=True

Non funzionano: restano in attesa fino al timeout

Perse

Con la libreria utilizzata, la perdita delle notifiche dipende dall'opzione json_response più che dalla modalità senza sessione. Le richieste non disponibili non producono un errore immediato: per questo il server prevede un tempo massimo e una soluzione di riserva.

8. Struttura del repository

Matricola.mcp/
├── server.py                    server MCP
├── test_e2e.py                  test end-to-end in memoria
├── test_http.py                 test sul trasporto HTTP
├── esperimento_trasporti.py     esperimento sulle configurazioni HTTP
├── docs/
│   ├── documento-di-progetto.html
│   ├── schema.sql
│   └── claude_desktop_config.example.json
├── pyproject.toml
├── requirements.txt
└── LICENSE

9. Limiti

  • Il sistema è stato verificato solo con dati fittizi su SQLite; il collegamento a un database di produzione non è stato provato.

  • La qualità dell'estrazione dagli avvisi non è stata misurata su documenti reali.

  • L'inquadramento normativo (Regolamento (UE) 2017/745, AI Act, GDPR) descritto nel documento di progetto è un'ipotesi da validare con il referente regolatorio della struttura.

10. Riferimenti e licenza

Distribuito con licenza MIT (vedi LICENSE).

Available Tools

8 tools
apparecchi_coinvoltiB

Confronta i seriali di un avviso di sicurezza (FSN) con l'inventario. Non dichiara mai 'nessun apparecchio coinvolto' senza mostrare cosa è stato controllato.

NameRequiredDescriptionDefault
modelloYesModello indicato nell'avviso
serialiYesNumeri di serie o lotti elencati nell'avviso
produttoreYesFabbricante indicato nell'avviso di sicurezza

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the burden and does disclose a meaningful behavioral trait: it never reports 'no device involved' without showing what was checked. However, it does not explicitly state read-only status, permissions, error behavior, or return structure beyond that guarantee.

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 core comparison and followed by a useful behavioral guarantee. No filler, though the second sentence could be slightly more precise about what 'cosa è stato controllato' includes.

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?

The description states the purpose and one output guarantee, which is adequate for a simple comparison tool with fully documented parameters. However, with no annotations and no output schema, it leaves return format, read-only safety, and inventory source implicit.

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?

All three parameters are fully described in the schema (100% coverage), so the baseline is 3. The description does not add syntax, format, or matching semantics for produttore, modello, or seriali beyond what the schema already provides.

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 a specific verb ('Confronta') and resources ('seriali di un avviso di sicurezza (FSN)' and 'inventario'), making the tool's function clear. It does not explicitly contrast with siblings like cerca_apparecchi, so it falls short of a 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?

The purpose implies the tool is used when checking FSN serials against inventory, but there is no explicit when-to-use, when-not-to-use, or named alternative. The second sentence is a behavioral guarantee rather than usage guidance.

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

apri_ordine_lavoroA

Crea un ordine di lavoro in stato BOZZA nel CMMS. Operazione di scrittura: chiedi sempre conferma esplicita prima di usarla. Non approva, non chiude e non assegna interventi: lo fa il tecnico nel CMMS.

NameRequiredDescriptionDefault
tipoYesTipo di intervento
matricolaYesMatricola inventariale dell'apparecchio
descrizioneYesDescrizione del guasto o dell'azione

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations present, the description carries the full burden and does well: it declares this is a write operation, that the result is a DRAFT work order, and that approval/closure/assignment happen elsewhere. It omits permission requirements and what is returned (e.g. the new order ID), which keeps it from 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?

Three short sentences, no waste; the creation statement is front-loaded, followed by the confirmation requirement and then the exclusions. Every sentence 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?

For a simple three-required-parameter creation tool with no annotations and no output schema, the description covers state semantics, write safety, and scope boundaries. The only gap is the absence of any indication of what a successful call returns (e.g. an order identifier).

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% and the enum for 'tipo' is self-explanatory, so the schema already documents all three parameters. The description adds no parameter-level meaning beyond what the schema provides, making the baseline 3 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 verb and resource ('Crea un ordine di lavoro') plus the initial state ('in stato BOZZA') and the target system (CMMS). An agent can distinguish this from every listed sibling, none of which create work orders.

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 an explicit pre-condition ('chiedi sempre conferma esplicita prima di usarla') and delimits scope by naming what it does NOT do (approve, close, assign). It stops short of naming alternatives for those excluded actions, but no sibling overlaps so the guidance is effectively complete.

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

cerca_apparecchiB

Cerca apparecchiature in inventario. Restituisce al massimo 50 righe.

NameRequiredDescriptionDefault
testoYesMatricola, tipo, modello, produttore o reparto

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose one genuinely useful behavioral fact - a hard cap of 50 rows - but says nothing about matching semantics (fuzzy vs exact, case sensitivity), sort order, or whether the 50-row cap is a silent truncation with no way to page further (the schema has no paging parameter). That last omission is the most consequential gap.

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 short sentences, front-loaded with the action and followed by the result-size constraint; no filler and no restating of the tool name. It is arguably too terse rather than bloated, which is an under-specification problem captured elsewhere, not a conciseness problem.

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

Completeness3/5

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

For a simple one-parameter search tool with no output schema and no annotations, the description covers the basics but not enough to call it safely: truncation at 50 rows is mentioned without saying whether it is silent or whether results are ranked, and there is no mention of read-only nature or matching behavior. Adequate but with clear 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 100% and the schema field itself enumerates what is searched (serial number, type, model, manufacturer, department). The description adds nothing about the single parameter, so the baseline of 3 applies - the schema does all the work.

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: searching equipment in the inventory, plus the shape of the result (at most 50 rows). That is enough to know what the tool does, but it never distinguishes itself from plausible siblings such as apparecchi_coinvolti or report_conformita, so the agent has no explicit basis for choosing among them.

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

Usage Guidelines2/5

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

There is no statement of when to use this search versus apparecchi_coinvolti, scadenze, or report_conformita, and no prerequisites or exclusions. Usage can only be inferred from the word 'cerca' and the inventory scope, which is weak guidance given four or five sibling tools operating on the same domain.

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

list_rootsA

Elenca le cartelle consultabili: manuali di service, avvisi di sicurezza (FSN), report.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the concrete set of roots returned, which is genuinely useful, but it never states that this is a read-only, side-effect-free operation, nor that it takes no arguments and is the natural entry point.

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 compact sentence with the resource name front-loaded and the useful enumeration of roots immediately following. Nothing wasted, nothing padded.

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?

An output schema exists, so return values needn't be explained, and the zero-argument schema is trivial. The only shortfall is the lack of explicit routing context relative to read_dir and the other siblings, which matters for an entry-point tool.

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

Parameters4/5

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

The tool takes zero parameters, so the schema baseline of 4 applies; there is nothing for the description to clarify beyond confirming the absence of filtering options.

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 ('Elenca') and resource ('cartelle consultabili'), then enumerates the root categories returned (manuali di service, FSN, report). This lets an agent distinguish it from read_dir, which presumably drills into a folder, though the description never names that sibling 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?

The word 'consultabili' (browsable) and the enumeration of root folders imply this is the top-level entry point before read_dir, but there is no explicit 'use this first / then call read_dir' routing instruction or any excluded case.

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

read_dirB

Elenca il contenuto di una cartella. Funziona solo dentro i roots.

NameRequiredDescriptionDefault
pathYesCartella da elencare

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose one genuine behavioral trait — the operation is confined to configured roots. It says nothing about what happens on an out-of-scope path (error vs empty result), whether listing is recursive, or how hidden entries are treated.

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 short sentences with no filler, and the core action is stated first with the constraint second. It is efficiently sized, though it leans toward under-specification rather than maximum information density.

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 output schema exists, so return values need not be explained, and the tool is a simple one-parameter read. Still, for a filesystem-facing operation with no annotations, the description omits recursion behavior and out-of-root error handling that an agent would want before calling.

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 single parameter is already documented as "Cartella da elencare", matching the description's wording. The description adds no extra semantics (relative vs absolute path, root-relative form), 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?

"Elenca il contenuto di una cartella" names a specific verb (list) and resource (folder contents), so the agent knows exactly what the tool returns. The siblings operate on different domains (roots, devices, deadlines, work orders), so no explicit differentiation is needed, though none is offered.

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?

"Funziona solo dentro i roots" implies a prerequisite (discover roots first, e.g. via list_roots) and warns of a scope limit, which is real usage guidance. It does not, however, say when to pick this over siblings or what to do when the path falls outside the roots.

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

report_conformitaB

Calcola, per reparto e tipo di attività, quante attività programmate sono state eseguite in tempo, in ritardo o non eseguite, e salva un CSV nella cartella Report.

NameRequiredDescriptionDefault
annoYesAnno di riferimento

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden. It does credit a real side effect — writing a CSV into the Report folder — which is the key behavioral fact, but it omits everything else: whether an existing file is overwritten, how the file is named (year?), what permissions or auth are required, and what the tool returns once the file is written.

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 with no wasted words: the computation is front-loaded and the output side effect (CSV in Report) is stated at the end. Nothing is repeated from the schema or title.

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

Completeness3/5

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

For a simple one-parameter report generator this is adequate in purpose, but with no annotations and no output schema the description should say what comes back (file path? summary counts? success flag?) and whether re-running the same year overwrites the previous CSV. Those are the only real gaps for a tool this narrow.

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?

There is one parameter (anno) at 100% schema coverage with a title, range 2000-2100 and the gloss 'Anno di riferimento'. The description adds no further semantics such as whether the year bounds the scheduled-activities period or the execution dates, so the schema baseline of 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?

The description names a specific verb (calcola / salva un CSV) plus the resource (attività programmate) and the exact breakdown produced (in tempo, in ritardo, non eseguite), segmented per reparto and tipo di attività. It is fully distinguishable from the siblings (list_roots, read_dir, cerca_apparecchi, scadenze, etc.), though that separation comes from obvious domain difference rather than explicit routing.

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: an agent can infer it should call this when a compliance/execution report per department is requested. There is no statement of when NOT to use it, no prerequisites, and no pointer to alternatives such as scadenze or apparecchi_coinvolti, which might overlap for one-off lookups.

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

riassumi_avvisoA

Estrae i dati operativi da un avviso di sicurezza (FSN). Il risultato è una BOZZA da verificare sull'originale: non sostituisce la lettura dell'avviso da parte dell'ingegnere clinico.

NameRequiredDescriptionDefault
percorsoYesPercorso dell'avviso di sicurezza (PDF o testo) dentro i roots

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses that the result is a draft requiring human verification, which is meaningful context beyond the schema, but it says nothing about read-only nature, file-size or format limits, or failure behavior on unreadable PDFs.

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

Conciseness5/5

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

Two sentences, no filler, with the core purpose in the first sentence and the critical caveat immediately after. Nothing is buried or redundant.

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?

An output schema exists, so return values need not be described, and the single fully-documented parameter is covered. The remaining gap is behavioral detail (read-only guarantee, what happens on malformed input) that an annotation would normally supply but does not here.

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% for the single 'percorso' parameter, which already documents that it is a path to a PDF or text file inside the roots. The description adds no additional meaning about the path format or expected directory, 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?

The description names a specific verb (estrarre) and resource (avviso di sicurezza / FSN), which is unambiguous and distinct from the sibling tools (scadenze, cerca_apparecchi, report_conformita). It stops short of explicitly contrasting itself with any sibling, but the resource specificity is enough for an agent to pick it correctly.

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 rather than stated: it is the tool for pulling operational data out of a safety notice, and the second sentence tells the caller the output must be verified against the original. There is no explicit statement of when to prefer it over alternatives, nor any prerequisite such as the file being inside the roots.

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

scadenzeB

Attività programmate non ancora eseguite: già scadute oppure in scadenza entro N giorni.

NameRequiredDescriptionDefault
tipoNoMP manutenzione preventiva, VSE verifica sicurezza elettrica (CEI EN 62353), CF controllo funzionale
repartoNoReparto, es. 'Terapia Intensiva'
entro_giorniNoOrizzonte in giorni

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses inclusion/exclusion criteria ('non ancora eseguite', 'già scadute oppure in scadenza entro N giorni'), but omits read-only status, permissions, pagination, sorting, and default horizon behavior.

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?

It is a single front-loaded sentence with no wasted text. It is concise and well-structured for the purpose, though it could be slightly richer without becoming verbose.

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

Completeness2/5

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

For a query tool with three optional parameters, no annotations, and no output schema, the description should clarify the result shape and operational behavior. It only gives the filtering scope, leaving return values, sorting, and optional filter interactions unspecified.

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 the schema already documents tipo, reparto, and entro_giorni thoroughly. The description only echoes the N-day horizon and adds no meaning beyond the schema, making the baseline 3 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 names the resource ('attività programmate') and the exact subset it returns: not yet executed, already overdue, or due within N days. It is clear, but it does not explicitly distinguish itself from sibling tools such as report_conformita or cerca_apparecchi.

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

Usage Guidelines2/5

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

There is no explicit when-to-use statement, no alternatives, and no exclusions. The deadline scope implies a use case, but an agent is left to infer when to choose this over sibling tools.

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. 8 tool updatesv1.0.0
    • First observedapparecchi_coinvolti
    • First observedapri_ordine_lavoro
    • First observedcerca_apparecchi
    • First observedlist_roots
    • First observedread_dir
    • First observedreport_conformita
    • First observedriassumi_avviso
    • First observedscadenze

TDQS

A3.5/5.0

Scored across 8 tools

Disambiguation4/5

Each tool has a distinct purpose: filesystem discovery (list_roots/read_dir), inventory lookup (cerca_apparecchi), scheduling queries (scadenze), FSN cross-checking (apparecchi_coinvolti), reporting, summarization, and work-order creation. The only mild overlaps are list_roots vs read_dir (both filesystem listing at different levels) and cerca_apparecchi vs apparecchi_coinvolti (both hit the inventory, one by free search, one by FSN serial comparison), but the descriptions make the boundaries clear.

Naming Consistency3/5

Most tools follow a verb_noun pattern (list_roots, read_dir, cerca_apparecchi, riassumi_avviso, apri_ordine_lavoro), but the set mixes English and Italian naming and includes bare noun names (scadenze, report_conformita, apparecchi_coinvolti). It is readable and Italian naming is domain-idiomatic, but the convention is not predictable from name alone.

Tool Count5/5

Eight tools is a well-scoped surface for a clinical-engineering maintenance assistant, with coverage of inventory, FSN alerts, scheduling, compliance reporting, and work-order drafting. No tool appears redundant or gratuitous.

Completeness4/5

Core workflows are covered end-to-end for the stated domain, with sensible intentional boundaries (work orders are only drafted, approved in the CMMS). The main gap is that read_dir only lists folders and there is no tool to read the contents of a manual or FSN file, leaving a dead end for the 'manuali di service' roots.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    A production-grade MCP server that enables AI assistants to securely manage healthcare data through clinical tools for patient vitals, lab results, and medication ordering. It prioritizes security and compliance with features like HIPAA-ready audit logging, PII redaction, and role-based access control.
    -
  • A
    license
    B
    quality
    C
    maintenance
    An MCP server that connects AI assistants to OpenEMR instances to manage patient records, clinical trends, and medication safety. It provides 17 tools for tasks such as patient search, drug interaction checks, and generating comprehensive health trajectories and visit preparations.
    17
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables AI assistants to safely query live Odoo 19 data with a defense-in-depth security layer, providing read-only tools for partners, sales, inventory, and finance.
    MIT