Skip to main content
Glama

it-eli-mcp

An MCP server for Italian law, in two layers:

  • Legislation via Normattiva, the official portal of the Ministero della Giustizia. It fetches acts as Akoma Ntoso with verifiable URN:NIR and ELI identifiers, and returns the text as it stood on any past date (multivigenza). Live and keyless.

  • Constitutional case law (Corte Costituzionale): a local, keyless full-text index of every decision since 1956, each with its native ECLI, built from the Court's official open data.

  • Supreme Court case law (Corte di Cassazione): live, keyless full-text search over SentenzeWeb, the Court's own free public search engine - civil and criminal decisions, full OCR text, no local index to build.

  • Administrative case law (Consiglio di Stato, C.G.A.R.S., TAR): live, keyless search over the Giustizia Amministrativa portal's own public decision search - one backend for the whole administrative jurisdiction, 3.4M+ provvedimenti with native ECLI and structured full text.

Italy has the EU's largest legal profession by headcount - roughly 240,000 lawyers per CCBE figures, ahead of Germany and Spain. No live, keyless MCP connector covered its statute book. This one does, and it also covers the constitutional case law.

Part of the MateMatic eu-legal-mcp production line: the Italian sibling of de-eli-mcp (Germany) and sejm-eli-mcp (Poland), built on the same architecture and citation contract against the Italian source.

No JSON API. Normattiva does not publish a REST API. This connector drives the same session-based flow a browser uses - resolve a URN, read the act page, fetch its Akoma Ntoso export - so every act comes back as structured XML with its ELI intact. See DISCOVERY.md.

Licence. Italian official legal texts are outside copyright (art. 5, l. 633/1941), and Normattiva declares CC-BY-4.0 for its data from 2026-01-01. This connector relays individual acts on request, with attribution and a source_url; it does not bulk-harvest the database (Normattiva's terms restrict that). Every response carries a dataset_note. (A practitioner's read, not formal legal advice.)

Cassazione is NOT Italgiure/ItalgiureWeb. The Court's full-database search (ItalgiureWeb, 35M+ documents) is free only for the judiciary; practitioners pay a subscription. This connector does not use that service. It queries SentenzeWeb (italgiure.giustizia.it/sncass), a separate, free, public search engine the Court itself publishes, under the Italian Open Data License (IODL 2.0), with no authentication

  • verified live during development (see DISCOVERY.md). Coverage is narrower than the full Italgiure database but real: 420K+ civil and criminal decisions with full OCR text.

Legislation tools (Normattiva, live)

Tool

What it does

it_list_codes

The major Italian codes and consolidated acts (Codice civile, penale, di procedura, privacy/GDPR, CAD, D.Lgs. 231/2001, Costituzione, L. 241/1990) with their canonical URN.

it_resolve

Turns act coordinates (act_type, year, number) into a canonical, resolvable URN:NIR. Offline.

it_get_act

Fetches act metadata (title, date, ELI, article count) for a code name, URN, ELI path, or normattiva.it URL.

it_get_text

Fetches the text of a whole act or a single article - with at_date for the point-in-time version.

Related MCP server: mcp-courtwatch

Constitutional case-law tools (Corte Costituzionale, local index)

Tool

What it does

it_case_search

Full-text search over the decisions (heading, reasoning, operative part). Filters by year and type (sentenza/ordinanza). Accent-insensitive.

it_case_get_decision

The full text of one decision, by ECLI (ECLI:IT:COST:2024:1) or by year + number.

it_case_recent

The most recent decisions (newest first).

it_case_stats

Index coverage: total decisions, year range, counts by type, last build time.

The case-law tools read a local SQLite index that is provisioned automatically on the first call - no setup step. On first use the server downloads a small, sha256-verified pre-built cost.sqlite.gz from the GitHub release (built and attached by CI on each release) and decompresses it, or, if none is published, builds the index from the Court's open data (all decisions since 1956); the index is then cached under ~/.matematic and every later call queries it offline. it_case_stats reports provenance and ingested_at so you can see how fresh it is.

To refresh, or to pre-build it ahead of time (e.g. in an offline deployment), run:

italy-eli-mcp-caselaw-ingest

Tuning env vars: IT_ELI_CASELAW_INDEX_URL (override/disable the pre-built download), IT_ELI_CASELAW_INDEX_SHA256 (pin the checksum), IT_ELI_CASELAW_AUTOBUILD=0 (skip the automatic local build). The legislation tools need no index; they fetch live.

Supreme Court case-law tools (Corte di Cassazione, SentenzeWeb, live)

Tool

What it does

it_cassazione_search

Full-text search over decision bodies. Filters: chamber ('civile'/'penale'), sub_chamber ('lavoro'/'tributaria'), anno (year). Returns ranked hits with a highlighted snippet.

it_cassazione_get

The full text of one decision by its SentenzeWeb sic_id (from a search hit).

No ingest step - every call queries SentenzeWeb live. Coverage: civil (snciv, ~190K) and criminal (snpen, ~238K) decisions, including the Labour (szdec:L, ~30K) and Tax (szdec:5, ~59K) sub-chambers, full OCR text.

Administrative case-law tools (Consiglio di Stato, C.G.A.R.S., TAR, live)

Tool

What it does

it_ga_search

Full-text search and/or decision-number lookup over the Giustizia Amministrativa portal - one backend for the whole administrative jurisdiction (3.4M+ provvedimenti). Filters: sede, tipo, numero, anno. Hits carry the court's native ECLI.

it_ga_get_decision

The full text of one decision by its document_url (taken verbatim from a search hit).

No ingest step - every call queries the portal's own public decision search live.

Citation verification (anti-hallucination)

Tool

What it does

it_verify_citations

Extracts Italian legal citations from any text (a drafted answer, a memo, a contract clause) and verifies each one against its source. Statute citations (art. 2043 c.c., art. 5 della legge 241/1990, artt. 1341 e 1342 c.c., commi) are checked against the live Normattiva act, article by article; ECLI:IT:COST:* citations are checked against the local Constitutional Court index.

it_coverage

Declare what this connector covers, when each family was captured, and - explicitly - what it does NOT cover. Every gap carries a fallback.

What it reports, per citation and overall:

  • Existence with a range hint. A cited article that does not exist comes back as not_found with a hint of what does exist: art. 9999 does not exist in this act; the act has 372 articles, numbered art. 1-372.

  • Optional content check. A parenthetical description right after a citation (art. 2043 c.c. (risarcimento per fatto illecito)) is compared with the real provision using a character-trigram match. A mismatch is a review signal (content_mismatch), never a hard block - paraphrase is legitimate.

  • Hard semantics. When any cited article does not exist, the result status is HALLUCINATION_DETECTED and the tool response carries isError=true, so a calling model cannot mistake it for a passed check. When the text contains no citations at all, the status is NO_CITATIONS_FOUND - explicitly NOT a verification success.

  • Structured gaps. Everything the tool could not verify is listed as a typed gap (out_of_corpus, unparseable_citation, act_unresolvable, upstream_unavailable, comma_not_checkable) instead of being hidden in prose. An act Normattiva cannot resolve is a gap, not a hallucination: existence is unknown, not disproven. Cassazione and administrative-court ECLIs are out of the local corpus; verify those with it_cassazione_search / it_ga_search.

it_verify_citations(text="L'art. 2043 c.c. e l'art. 9999 della legge 241/1990 si applicano.")
→ status: "HALLUCINATION_DETECTED" (isError=true)
  citations: [
    {raw: "art. 2043 c.c.", status: "verified", ...},
    {raw: "art. 9999 della legge 241/1990", status: "not_found",
     range_hint: "art. 9999 does not exist in this act; the act has <N> articles, ..."}
  ]
  gaps: []

The parse-verify-report loop is adapted from chrisryugj/korean-law-mcp (MIT) - see THIRD_PARTY.md. The content matcher uses character trigrams (the Korean original uses bigrams, which fit an agglutinative script; trigrams discriminate better for Italian).

Every legislation response carries the citation contract: eli_uri (e.g. eli/id/1990/08/18/090G0294/CONSOLIDATED), urn (e.g. urn:nir:stato:legge:1990-08-07;241), human_readable_citation (e.g. Legge 7 agosto 1990, n. 241), and source_url.

How it identifies an act

  • URN:NIR - urn:nir:{authority}:{type}:{date};{number}. A partial URN with the year alone (urn:nir:stato:legge:1990;241) also resolves, so you can cite an act you only know as "L. 241/1990".

  • ELI - eli/id/{year}/{month}/{day}/{code}/CONSOLIDATED, read from the act itself. Never invented.

Examples

it_list_codes()
→ [{key: "codice civile", urn: "urn:nir:stato:regio.decreto:1942-03-16;262", ...}, ...]

it_resolve(act_type="d.lgs", year=2001, number=231)
→ {urn: "urn:nir:stato:decreto.legislativo:2001;231",
   human_readable_citation: "Decreto legislativo n. 231/2001", source_url: "..."}

it_get_text(reference="codice civile", article="2043")
→ art. 2043 c.c. (Risarcimento per fatto illecito), with eli_uri + source_url

it_get_text(reference="codice privacy", article="1", at_date="2010-01-01")
→ the privacy code's art. 1 as it stood on 1 January 2010

it_cassazione_search(query="responsabilita medica", chamber="civile", limit=5)
→ {total_found: 81177, hits: [{sic_id: "snciv2025224393O",
   citation: "Cass. civ., ord. n. 24393/2025", snippet: "...", source_url: "..."}, ...]}

it_cassazione_get(sic_id="snciv2025224393O")
→ {citation: "Cass. civ., ord. n. 24393/2025", testo: "...", massima: "...", source_url: "..."}

Install

cd it-eli-mcp
pip install -e .

Configure (Claude Code / any MCP client)

Copy .mcp.json.example:

{
  "mcpServers": {
    "it-eli-mcp": { "command": "italy-eli-mcp" }
  }
}

Windows 11 with Smart App Control

Smart App Control blocks unsigned executables, which covers uvx.exe, pip.exe and the italy-eli-mcp.exe launcher that pip writes at install time. The python.exe and py.exe from the python.org installer are signed by the Python Software Foundation, so running the module through the interpreter works:

python -m pip install italy-eli-mcp
python -m it_eli_mcp

pip.exe is blocked for the same reason, so install with python -m pip, not pip install. If python is not on PATH, use the Windows launcher: py -3 -m it_eli_mcp.

{ "mcpServers": { "italy-eli-mcp": { "command": "python", "args": ["-m", "it_eli_mcp"] } } }

Do not turn Smart App Control off to work around this - it cannot be re-enabled without reinstalling Windows.

Environment:

  • IT_ELI_BASE_URL - default https://www.normattiva.it

  • IT_ELI_CACHE_DIR - default ~/.matematic/cache/it-eli

  • IT_ELI_AUDIT_DIR - default ~/.matematic/audit

  • IT_ELI_CASELAW_DB - constitutional case-law index path (default ~/.matematic/data/it-eli-caselaw/cost.sqlite)

  • IT_ELI_CASELAW_INDEX_URL - pre-built index download URL (default: the GitHub release asset; '' disables)

  • IT_ELI_CASELAW_INDEX_SHA256 - pin the expected index checksum instead of fetching the .sha256 sidecar

  • IT_ELI_CASELAW_AUTOBUILD - 0 to skip the automatic local build (prefer the index_missing error)

Tests

pip install -e ".[dev]"
pytest -m "not smoke"   # offline (URN, Akoma Ntoso parser, case-law index, drift)
pytest -m smoke         # live: Normattiva + Corte Costituzionale open data + SentenzeWeb

Audit trail

Every tool call appends one JSON line to ~/.matematic/audit/it-eli-mcp.jsonl (timestamp, tool, input hash, output size, duration, status) for AI Act art. 12 record-keeping. No raw query text is stored.

Licence

Apache-2.0. See LICENSE.

Available Tools

14 tools
it_case_get_decisionA
Read-onlyIdempotent

Fetch the full text of one Constitutional Court decision, by ECLI or year + number.

ParametersJSON Schema
NameRequiredDescriptionDefault
annoNoyear (used with ``numero`` when ``ecli`` is not given).
ecliNoan ECLI, e.g. "ECLI:IT:COST:2024:1".
numeroNodecision number (used with ``anno``).

Output Schema

ParametersJSON Schema
NameRequiredDescription
annoNo
ecliYes
testoNo
numeroNo
citationNo
collegioNo
epigrafeNo
relatoreNo
presidenteNo
source_urlNo
dispositivoNo
dataset_noteNo
data_depositoNo
data_decisioneNo
tipologia_labelNo

TDQS

A4.1/5.0
Behavior3/5

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

The annotations already indicate read-only, idempotent, non-destructive operations, so the safety profile is covered. The description adds that it returns the full text, but provides no additional context about edge cases like missing identifiers, result size, or precedence between ecli and anno+numero, offering minimal value beyond annotations.

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 a single, front-loaded sentence that directly states the action and object, with zero redundant content. It earns a top score for efficiency.

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 read-only retrieval tool with a well-described schema, an output schema, and comprehensive annotations, this description is complete. It specifies the decision type, the court, and the allowed identifiers, which is all that is needed for a competent agent to invoke it correctly.

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?

The input schema describes all parameters with 100% coverage, including the relationship between anno, numero, and ecli. The description only restates 'by ECLI or year + number' without adding any new parameter-level details, so it meets the baseline but does not exceed it.

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 uses the specific verb 'Fetch' and identifies the resource as 'the full text of one Constitutional Court decision', which clearly distinguishes it from search and listing tools. It also specifies the two identification methods (ECLI or year+number), making its purpose unambiguous.

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 phrase 'by ECLI or year + number' establishes a clear condition for use—when a specific decision identifier is available—but it does not explicitly contrast with sibling tools like it_case_search for finding decisions by query, nor does it mention when not to use this tool. No exclusions are stated, only the positive context.

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

it_case_recentB
Read-onlyIdempotent

The most recent Constitutional Court decisions in the index (newest first).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax items (1..100).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds ordering behavior ('newest first') and scope ('in the index'), but does not discuss pagination or limit handling, though the limit parameter is straightforward.

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 a single, clear sentence that front-loads the core purpose and ordering. Every word is meaningful and there is no redundancy or filler.

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 a single optional parameter, strong annotations, and an output schema present, the description is sufficiently complete for an agent to select and invoke the tool. It could mention a use case or alternative but is not lacking any essential context.

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?

The input schema covers 100% of parameters, and the limit parameter already has a clear description ('max items (1..100)'). The tool description does not add parameter-level meaning beyond what the schema provides, so the baseline of 3 is 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 clearly states the tool returns the most recent Constitutional Court decisions in the index, ordered newest first. Though it lacks an explicit verb like 'list' or 'get', the resource and scope are specific enough to distinguish it from search and retrieval siblings.

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?

The description gives no guidance on when to use this tool versus alternatives such as it_case_search or it_case_get_decision. With many sibling tools present, explicit usage direction is missing.

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

it_case_statsA
Read-onlyIdempotent

Constitutional case-law index coverage and freshness (totals, years, last build).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
year_maxNo
year_minNo
provenanceNo
ingested_atNo
by_tipologiaNo
dataset_noteNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering safety. The description adds the specific items covered (totals, years, last build), which is useful but does not explain how the stats are compiled or any limitations—still, it adds some value beyond annotations.

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?

One short, information-dense phrase; no filler or redundant text. It conveys the essential scope efficiently.

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?

The tool is simple with no parameters, and an output schema exists to describe return values. The description sufficiently orients the agent for a stats/overview call, though it could be slightly more explicit about the output format.

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?

There are zero parameters, so the input schema is complete and the description needs no parameter details. Baseline of 4 applies because no parameter information is missing.

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 clearly identifies the tool as providing coverage and freshness metrics for constitutional case-law, including totals, years, and last build. While it lacks an explicit verb like 'get' or 'report', the noun phrase conveys the tool's purpose and distinguishes it from sibling search/retrieval tools.

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?

No guidance is given about when to choose this tool over the many sibling tools. The description only lists content areas but does not mention alternatives or exclusions, so it fails to provide usage context.

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

it_cassazione_getA
Read-onlyIdempotent

Fetch the full text of one Corte di Cassazione decision, live, by its SentenzeWeb id.

ParametersJSON Schema
NameRequiredDescriptionDefault
sic_idYesthe SentenzeWeb ``id`` (e.g. "snciv2024D01234O"), as returned by ``it_cassazione_search`` hits.

Output Schema

ParametersJSON Schema
NameRequiredDescription
annoNo
kindNo
testoNo
numdecNo
sic_idNo
massimaNo
materiaNo
citationNo
relatoreNo
tipoprovNo
presidenteNo
source_urlNo
dataset_noteNo
data_depositoNo
data_decisioneNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds useful context: it retrieves 'full text' and does so 'live', which is not captured by annotations. This is meaningful beyond the structured data, though it doesn't detail failure modes or rate limits.

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 that is front-loaded with the action, resource, and key identifier. No wasted words; every element 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?

The tool is simple (1 param, rich annotations, output schema present). The description covers the purpose and the 'live' behavior. It does not mention alternatives among the many siblings, but the schema already states the ID comes from search. Slight gap in distinguishing from similar get-decision tools, but overall adequate.

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% (sic_id is described with an example and its origin). The tool description merely repeats the identifier concept ('by its SentenzeWeb id') without adding new parameter semantics beyond the schema. Baseline of 3 applies.

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 uses a specific verb ('Fetch') and resource ('full text of one Corte di Cassazione decision') with a precise identifier ('SentenzeWeb id'). It clearly distinguishes from sibling search tools like it_cassazione_search by stating it retrieves a single decision, not a list.

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 description implies usage: you need a SentenzeWeb id, likely from a prior search. However, it does not explicitly state when to use this tool over alternatives like it_get_text or it_case_get_decision, nor does it mention any exclusions. Only implied through the identifier requirement.

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

it_coverageA
Read-onlyIdempotent

Declare what this connector covers, how it is sourced, and what it does NOT cover.

Call this before telling a user that the law "does not contain" something, and whenever a search comes back empty: the absence may be a gap in this connector rather than in the law. Every gap carries a fallback saying where to look instead.

Returns: Coverage with families, an as-of note, and a non-empty list of known gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
familiesNo
as_of_noteYesStates what the dates mean, and what they do not promise.
known_gapsNoNever empty. An empty list would mean 'not checked', not 'no gaps'.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool as readOnly, openWorld, idempotent, and non-destructive. The description goes beyond this by explaining that empty results may indicate coverage gaps rather than absence in the law, and that each gap includes a fallback. It also discloses the output shape (Families, as-of note, known gaps), which adds practical behavior context not present in the annotations.

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 four sentences, each adding distinct value: purpose, usage trigger, interpretation guidance, and output summary. It is front-loaded with the core purpose and contains no redundant or filler text. This is appropriately sized for a zero-parameter tool.

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?

Given the tool's simplicity (zero parameters) and that the output schema exists, the description is remarkably complete. It covers what the tool does, when to use it, how to interpret results, and what it returns. Nothing essential is missing for an agent to call it correctly and understand its output.

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 has zero parameters, and the schema covers all (100% coverage vacuously). The description correctly avoids inventing parameter details. Baseline 4 is appropriate since no parameter explanation is needed, and the description performs well otherwise by explaining the tool's role and output.

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 clear verb-resource pair ('Declare what this connector covers') and explicitly differentiates from sibling tools by framing itself as the coverage oracle for the connector. It also gives concrete use cases (before claiming a law lacks content, on empty search results), making its purpose unambiguous.

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?

The description explicitly says when to call the tool ('Call this before telling a user that the law does not contain something, and whenever a search comes back empty') and explains why (absence may be a gap in the connector). It also notes the fallback mechanism, providing clear situational guidance without naming alternatives, which is sufficient given the tool's unique role.

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

it_ga_get_decisionA
Read-onlyIdempotent

Fetch the full text of one administrative decision, live, by its document URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_urlYesthe ``document_url`` of an ``it_ga_search`` hit, verbatim (an ``https://mdp.giustizia-amministrativa.it/visualizza/?...`` URL).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urnNo
annoNo
ecliNo
testoNo
numeroNo
citationNo
nrg_annoNo
tipologiaNo
nrg_numeroNo
source_urlNo
dataset_noteNo
document_urlNo
data_pubblicazioneNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds the meaningful trait 'live' (no caching) and 'full text' (complete document content), which goes beyond the structured annotations without contradicting them.

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, front-loaded sentence that communicates the essential purpose without any filler. Every word adds meaning.

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?

With one parameter, a detailed schema description, an output schema present, and comprehensive annotations, the description sufficiently covers what is needed to select and invoke the tool. The 'live' and 'one decision' details round out the behavioral context.

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% and the parameter description already provides excellent detail, including the exact format and provenance from it_ga_search. The description reinforces this by specifying 'by its document URL', adding a small but useful link to the workflow.

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 clearly identifies the action (fetch), the resource (full text of one administrative decision), and the key qualifier (live, by document URL). It distinguishes this from sibling search and get tools by referencing the URL from it_ga_search.

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 parameter description explains that the input is a verbatim document_url from an it_ga_search hit, making the intended workflow clear. It doesn't explicitly name alternatives or exclusions, but the context of a search-then-fetch flow is well implied.

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

it_get_actA
Read-onlyIdempotent

Fetch act metadata from Normattiva.

ParametersJSON Schema
NameRequiredDescriptionDefault
referenceYesa code name ("codice civile"), a URN ("urn:nir:stato:legge:1990-08-07;241"), an ELI path ("eli/id/1990/08/18/090G0294"), or a normattiva.it URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urnNo
titleNo
eli_uriNo
doc_dateNo
source_urlYes
dataset_noteNo
article_countNo
human_readable_citationNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds no additional behavioral context (e.g., rate limits, authentication, or specifics about what 'metadata' includes). It doesn't contradict annotations, but it also doesn't enrich them.

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 one short, front-loaded sentence that states exactly what the tool does. Every word is necessary and there is no fluff.

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 one well-documented parameter, strong annotations, and an output schema present, the description is sufficient for a simple metadata-fetching tool. It might benefit from mentioning that 'act metadata' excludes full legal text, but the tool name and sibling context help fill that gap.

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?

The single parameter 'reference' has a schema description that covers 100% of the parameter, listing four accepted formats. The tool description adds nothing beyond that, so the schema carries the weight. Baseline of 3 is appropriate given full coverage.

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 clearly states a specific verb and resource: 'Fetch act metadata from Normattiva.' This distinguishes it from sibling tools like it_get_text (which likely fetches full text) and it_list_codes (which lists codes). The scope is precisely defined.

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 description implies usage context: use this tool when you need act metadata from Normattiva, as opposed to full text or other related services. It doesn't explicitly state when not to use it or name alternatives, but the clear 'act metadata' framing gives sufficient guidance.

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

it_get_textA
Read-onlyIdempotent

Fetch the text of a whole act or a single article.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo``"text"`` (extracted, whitespace-normalized) or ``"akn_xml"`` (raw Akoma Ntoso; only valid for the whole act).text
articleNoan article number ("2043", "art. 2043", "2043-bis"). Omit for the whole act.
at_dateNoISO date ("2020-01-01") for the point-in-time (multivigenza) version; omit for the version in force today (consolidated).
referenceYesa code name, URN, ELI path, or normattiva.it URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urnNo
formatNo
articleNo
at_dateNo
contentNo
eli_uriNo
byte_sizeNo
source_urlYes
article_numNo
dataset_noteNo
article_countNo
article_headingNo
human_readable_citationNo

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. However, the description adds no behavioral context beyond what the schema already provides (e.g., format options, article scoping, at_date behavior). It does not mention return format specifics, limitations, or any runtime considerations. No contradiction with annotations, but no extra disclosure either.

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 a single, concise sentence that front-loads the action and object ('Fetch the text'). It has no filler, redundant wording, or repetition of schema details. Every word serves to communicate the primary purpose.

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?

Given the presence of an output schema and detailed input schema descriptions, the minimal description is sufficient. It covers the core purpose without needing to explain return values or parameter details, as those are already in structured fields. The only minor gap is that it doesn't contextualize when to prefer this over it_get_act, but that's more a usage guideline issue.

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%, with each parameter (reference, format, article, at_date) having its own description. The tool description itself adds no parameter information, so the baseline of 3 applies. It neither enhances nor detracts from the schema, so the meaning is fully available from structured data.

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 clearly states the action ('Fetch') and the resource ('text of a whole act or a single article'). It distinguishes the tool from siblings like it_get_act (which likely retrieves act metadata) by explicitly scoping to text content. The verb is specific and unambiguous.

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 description gives a clear idea of when to use the tool (when you need act/article text), but it does not mention alternatives, exclusions, or when not to use it. Usage is implied from the purpose rather than explicitly contrasted with sibling tools. Lacks guidance like 'use this instead of it_get_act for full text'.

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

it_list_codesA
Read-onlyIdempotent

List the major Italian codes and consolidated acts with their canonical URN.

A curated, verified dictionary (Codice civile/penale/procedura, Codice privacy, CAD, D.Lgs. 231/2001, Costituzione, L. 241/1990). Feed any urn to it_get_act / it_get_text.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the description adds meaningful context: the tool is a 'curated, verified dictionary' with specific legal codes and provides canonical URNs for further use. It omits details like sorting or full output structure, but the output schema covers those.

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 exactly two sentences with no fluff. The first states the core function, the second enriches with examples and usage direction. Every sentence earns its place, and it is easily parsable.

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 zero-parameter list tool with a provided output schema and read-only annotations, this description is complete. It covers what is listed, the curated nature, and how the output should be used. Nothing critical 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?

The tool has zero parameters, so the description cannot add parameter semantics beyond the schema. The mention of feeding URNs is about output behavior, not inputs. Per the rubric, zero-parameter tools receive a baseline of 4, and the description appropriately frames the tool's role in the workflow.

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 uses the specific verb 'List' with the resource 'major Italian codes and consolidated acts' and the distinguishing output 'canonical URN'. Concrete examples (Codice civile/penale, Costituzione, etc.) further clarify the scope and differentiate it from sibling tools like it_case_search or it_cassazione_search.

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 description explicitly directs the agent to feed the output URNs to it_get_act/it_get_text, providing an actionable downstream workflow. It does not explicitly contrast with alternatives like it_resolve, but the intended usage is clear for a zero-parameter list tool.

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

it_resolveA
Read-onlyIdempotent

Build a canonical, resolvable URN:NIR from act coordinates.

Offline (no network). act_type accepts friendly forms ('legge', 'd.lgs', 'dpr', 'regio.decreto'). With only year + number the partial URN still resolves on Normattiva; add month/day for the exact promulgation date.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes``ResolveQuery`` (act_type, year, number, month?, day?, authority).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urnYes
noteNo
source_urlYes
human_readable_citationNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable behavioral info: it works offline, accepts friendly act_type forms, and produces partial URNs that still resolve on Normattiva. This goes beyond the annotations without contradicting them.

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, each earning its place: purpose, offline capability, and parameter semantics. Front-loaded with the main verb and object. No redundancy or filler.

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?

Given the presence of an output schema and rich annotations (read-only, idempotent), the description is sufficiently complete. It covers offline behavior, friendly input forms, and partial resolution semantics. The tool is simple, and no critical missing context is apparent.

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 schema already has 100% coverage (object description lists all fields). The description enriches parameter meaning by explaining that 'act_type' accepts friendly aliases like 'd.lgs' and 'dpr', and clarifies the significance of year+number vs. month/day for resolution. This adds semantic value beyond the raw schema.

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 clearly states the tool's function: 'Build a canonical, resolvable URN:NIR from act coordinates.' This uses a specific verb ('build') and resource ('URN:NIR'), and it is distinct from sibling tools like it_get_act (fetch act) or it_list_codes (list codes).

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 description provides clear usage context, noting it is 'Offline (no network)' and explaining when to add month/day for exact dates vs. using only year+number for partial resolution. However, it doesn't explicitly contrast with alternatives (e.g., when to use it_get_act instead), so it doesn't reach a 5.

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

it_verify_citationsA
Read-onlyIdempotent

Verify Italian legal citations found in a text against their real sources.

Extracts statute citations ("art. 2043 c.c.", "art. 5 della legge 241/1990", "artt. 1341 e 1342 c.c.", commi) and ECLIs, then checks each: statutes against the live Normattiva act (does the act resolve? does the article exist?), ECLI:IT:COST against the local Constitutional Court index. A parenthetical description right after a citation is content-checked with a trigram match (mismatch = review signal). Non-existent articles come back with a range hint of what DOES exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe text to verify (an LLM answer, a memo, a contract clause).
max_citationsNocap on citations to verify (1..30, default 15).

Output Schema

ParametersJSON Schema
NameRequiredDescription
gapsNo
totalYes
statusYes
summaryYes
citationsNo
dataset_noteNo
failed_countYes
warning_countYes
verified_countYes

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, and non-destructive hints, and the description adds substantial detail about actual behavior: extraction of specific citation types, checking against Normattiva and Constitutional Court indexes, trigram matching for parenthetical descriptions, and returning range hints for non-existent articles. No contradiction with annotations.

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?

The description is dense with useful information in three sentences, covering extraction, verification sources, content-checking, and edge-case behavior. While not wasteful, it exceeds a bare minimum and is organized effectively, though a slightly more compact style could earn a 5.

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?

Despite the tool's complexity (checking multiple citation types, multiple sources, and content matching), the description covers the key behaviors and edge cases. An output schema exists, so return values need not be described, and the description is sufficiently complete for an agent to invoke correctly.

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%, with both 'text' and 'max_citations' clearly described in the schema. The tool description itself adds no additional parameter meaning beyond what the schema already provides. 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?

The description clearly states the tool verifies Italian legal citations found in a text against their real sources, specifying the exact types of citations (statutes, ECLIs) and the verification process. This specific verb+resource combination distinguishes it from sibling tools like it_resolve or it_case_search, which serve different purposes.

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 description implies when to use the tool (whenever you need to verify citations in a text) but offers no explicit comparison to alternatives or exclusions. There is no 'use instead of X' or 'not for Y' guidance, so it falls short of a 4 or 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. Dates show when Glama detected each change.

  1. 1 tool updatev0.7.3
    • Addedit_coverage
  2. 13 tool updatesv0.6.1
    • First observedit_case_get_decision
    • First observedit_case_recent
    • First observedit_case_search
    • First observedit_case_stats
    • First observedit_cassazione_get
    • First observedit_cassazione_search
    • First observedit_ga_get_decision
    • First observedit_ga_search
    • First observedit_get_act
    • First observedit_get_text
    • First observedit_list_codes
    • First observedit_resolve
    • First observedit_verify_citations

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: codes list, URN resolution, act metadata/text, Constitutional Court search/get/recent/stats, Cassazione search/get, administrative search/get, and citation verification. No two tools overlap in purpose.

Naming Consistency3/5

All tools share the 'it_' prefix and snake_case, but the pattern varies: some are verb-first (it_list_codes, it_get_act, it_verify_citations) while others are domain-first (it_case_search, it_cassazione_get, it_ga_search). This inconsistency is a minor deviation from a uniform convention.

Tool Count5/5

13 tools is within the ideal range and each tool covers a distinct aspect of Italian legal research. The count reflects the broad scope (statutes, three court systems, citation verification) without unnecessary proliferation.

Completeness5/5

The toolset covers the core research lifecycle: discovering codes, resolving any act identifier, retrieving act content, searching and fetching decisions from the three major Italian jurisdictions, monitoring index freshness, and verifying citations. No critical gaps are apparent for its stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server for free U.S. case-law and court-docket search via CourtListener, providing tools for opinion search, docket lookup, citation verification, and more.
    10
    101
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for Italian law – indexes statutes from Normattiva such as Codice Civile, Codice Penale, and more, with EU implementation mapping.
    95
    1
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for U.S. federal law that enables searching the U.S. Code, CFR, Federal Register, case law, and bills, with citation verification against primary sources to prevent hallucinations.
    11
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/matematicsolutions/it-eli-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server