MCP server for Italian Workplace Safety (D.Lgs 81/08) — query ATECO codes, training schedules, glossary, sanctions, regulations from any MCP-compatible AI assistant (Claude Desktop, Cursor, Cline, Windsurf).
8 tools with well-structured schemas and clear, domain-specific descriptions. All tools have proper JSON Schema with type definitions and required fields. Descriptions average ~180 chars, within the 10-1024 baseline. All parameters have type annotations and descriptions. No critical naming issues, verb_noun pattern consistently applied (get_, search_, suggest). Output schemas not explicitly documented in source, limiting visibility into response structure. No error handling guidance visible. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all being read-only operations. Security posture is strong (no secrets in params, all read-only). Composition is clean, each tool has one responsibility, and tool outputs chain naturally (e.g., search_ateco → get_ateco → get_corsi_obbligatori).
Get a single ATECO 2007 economic sector entry by code (e.g. '41') or slug (e.g. '41-costruzioni-edifici'). Returns sector name, risk classification (basso/medio/alto), required courses per D.Lgs 81/08 and Accordo Stato-Regioni 21/12/2011. Use this when the user mentions an Italian business sector or activity.
Get the list of mandatory workplace-safety training courses for a given ATECO sector. Includes course name, duration, normative reference, and refresh periodicity.
Get an Italian workplace-safety regulation by slug, or the full index of regulations if no slug provided. Includes D.Lgs 81/08, Accordi Stato-Regioni, DM applicativi, EU regulations.
Get the renewal schedule for a specific Italian workplace-safety training course, or all schedules if no course is specified. Includes initial duration (hours), refresh interval (months), required modalities, and normative reference (D.Lgs 81/08, Accordi Stato-Regioni).
Fuzzy search ATECO 2007 sectors by name fragment (e.g. "costruzioni", "ristorazione"). Returns up to 20 matches.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns sector name, risk classification, required courses') but no formal JSON Schema for response structure is visible in source. LLMs cannot plan downstream tool calls or extract fields reliably without documented output types.
No tool annotations despite all 8 tools being read-only. MCP spec (2026-07-28) supports readOnlyHint, destructiveHint, and idempotentHint. Adding readOnlyHint=true to all tools signals to clients that these are safe to call without confirmation, improving agent planning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Search the Italian D.Lgs 81/08 glossary (200+ legal/technical terms) by term or definition fragment. Returns matched terms with definitions and normative references.
Fuzzy search Italian workplace-safety regulations by name, scope, or article reference.
OpenSearch-style autocomplete combining courses + glossary terms. Useful for autocomplete UI in client integrations.
No error handling guidance in tool descriptions. If an ATECO code is invalid or a glossary term not found, the description does not explain what the LLM should do next (e.g., 'Try search_ateco() with a partial name'). Recovery guidance is missing.
Result limits not stated in descriptions. search_ateco says 'Returns up to 20 matches' (good), but search_glossario, search_normativa, and suggest do not specify max result counts. Without limits, LLMs may receive unbounded lists that exhaust context.
Tool 'suggest' has a generic name that does not clearly convey its dual-index nature (courses + glossary). A more specific name like 'autocomplete_safety_terms' or 'suggest_courses_and_glossary' would improve LLM tool selection clarity.