Skip to main content
Glama

Expat Living Italy

Get one comune's profile

get_comune
Read-onlyIdempotent

One Italian comune's population, foreign residents by citizenship, property purchase/rent price, price-to-rent, verified tax-regime eligibility, its province's rollup, seismicZone (the official zona sismica 1-4: a legal classification, not a forecast and not a verdict on any building; quote it with its label and say so — a comune that straddles zones has no single zone, never round it; the zone has nothing to do with tax eligibility, and is not the 7% regime’s “seismic” routes, which depend on the 2009 and 2016-17 earthquake areas), layers (climate, air quality, crime, healthcare quality, age, population change and every other Italy-map layer) and provinceWellbeing (ISTAT BES indicators, polarity-aware percentiles) — looked up by 6-digit ISTAT code. Each layer's grain and measuredFor say whose number it is: a province or region value is not a measurement of this comune — say so when you quote it. Every field is wrapped in a provenance envelope (source, vintage, extractedOn, license); repeat the vintage when you state the number, and if a value is null, say why rather than treating it as zero.

Input Schema

NameRequiredDescriptionDefault
istatCodeYes6-digit ISTAT comune code, e.g. 075029.

Output Schema

NameRequiredDescriptionDefault
placeYes
layersYesEvery other map layer's value for this place, at the grain its source publishes. A null value means the source has no figure for this place (see `reason`).
articlesNoPublished articles about this comune — the reporting behind the numbers. Credit required to reuse.
populationYes
attributionYes
seismicZoneYesThe comune's official seismic zone (zona sismica). A legal classification, not a forecast and not a verdict on any building. value is null, never a default zone, when the Department's table has no row for this comune.
provinceRollupYes
priceToRentYearsYesYears of rent that equal the purchase price. Not a yield, an ROI, or a payback period.
provinceWellbeingYesISTAT BES well-being indicators for this comune's province — province-level, not a comune measurement.
purchasePriceEurM2YesOMI is Agenzia delle Entrate's official range of market values per m2, built from recorded sales and appraisals. Asking prices on listing sites are what sellers hope for, and usually run higher.
rentPriceEurM2MonthYes
taxRegimeEligibilityYesVerified regimes only — "placesNotPeople": geographic eligibility, not personal advice.
totalForeignResidentsYesSum of foreignResidentsByCitizenship: only the citizenships this site tracks, so a floor, not every foreign resident — Moroccan, Chinese and Indian residents, among others, are not counted. For every foreign resident, see foreignResidentsAllCitizenships. null when the citizenship dataset has no row for this comune.
foreignResidentsByCitizenshipYesCounts by ISO-2 citizenship code. Citizenship, not birthplace — excludes foreign-born Italian citizens. value is null, never a zero-filled object, when ISTAT's citizenship dataset has no row at all for this comune.
foreignResidentsAllCitizenshipsYesResidents holding any foreign citizenship: ISTAT's own total, not limited to the citizenships tracked in foreignResidentsByCitizenship. Citizenship, not birthplace. value is null, never 0, when ISTAT sends no total for this comune.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / attribution / properties / license
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "License of Expat Living Italy's own work only; upstream data keeps its own license, per dataset.",
      +  "properties": {
      +    "name": {
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "url"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / attribution / required
      Previous value: -[
      -  "publisher",
      -  "url",
      -  "citeAs",
      -  "request"
      -]New value: +[
      +  "publisher",
      +  "url",
      +  "citeAs",
      +  "request",
      +  "license"
      +]
  2. Changed2 schema fields changed
    • changedOutput schema / properties / layers / items / properties / grain / description
      Previous value: -"The level this value is measured at. Only \"comune\" is a measurement of this comune itself."New value: +"The level this value is measured at. Only \"comune\" is a measurement of this comune itself. \"autonomous_province\" is Bolzano or Trento, which the source scores on their own rather than as one Trentino-Alto Adige region: the figure belongs to that autonomous province, not to the region."
    • changedOutput schema / properties / layers / items / properties / grain / enum
      Previous value: -[
      -  "comune",
      -  "province",
      -  "region"
      -]New value: +[
      +  "comune",
      +  "province",
      +  "autonomous_province",
      +  "region"
      +]
  3. Changed4 schema fields changed
    • addedOutput schema / properties / layers / items / properties / officialZone
      Added value: +{
      +  "description": "Only on the seismic hazard layer: the comune's official zona sismica (1 = highest hazard, 4 = lowest). NOTE this runs the opposite way to `value`, which is a hazard class (5 minus the zone). Omitted for comuni that straddle zones.",
      +  "maximum": 4,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / layers / items / properties / scaleNote
      Added value: +{
      +  "description": "Only on layers whose scale direction is easy to misread (the seismic hazard class): says which end is which.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / provinceRollup / properties / purchasePriceEurM2 / description
      Added value: +"OMI is Agenzia delle Entrate's official range of market values per m2, built from recorded sales and appraisals. Asking prices on listing sites are what sellers hope for, and usually run higher."
    • addedOutput schema / properties / purchasePriceEurM2 / description
      Added value: +"OMI is Agenzia delle Entrate's official range of market values per m2, built from recorded sales and appraisals. Asking prices on listing sites are what sellers hope for, and usually run higher."
  4. Changed2 schema fields changed
    • addedOutput schema / properties / seismicZone
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The comune's official seismic zone (zona sismica). A legal classification, not a forecast and not a verdict on any building. value is null, never a default zone, when the Department's table has no row for this comune.",
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "reason": {
      +      "description": "Present only when value is null: why this place has no figure.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "value": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "hazardClass": {
      +              "anyOf": [
      +                {
      +                  "maximum": 4,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "The map layer's value: 5 minus the zone, so 4 is the highest hazard (official zone 1). null when split."
      +            },
      +            "label": {
      +              "description": "The Department of Civil Protection's label as published: \"3\", a regional sub-zone such as \"2B\" or \"3S\", or a combined label such as \"2A-3A-3B\".",
      +              "type": "string"
      +            },
      +            "officialZone": {
      +              "anyOf": [
      +                {
      +                  "maximum": 4,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "The national zone, 1 (highest hazard) to 4 (lowest). null when the comune straddles zones."
      +            },
      +            "reading": {
      +              "description": "What the classification is and is not. A legal classification used for planning and building control — not a forecast, and not an assessment of any building.",
      +              "type": "string"
      +            },
      +            "zonesInvolved": {
      +              "description": "Every national zone the label names; more than one means the comune straddles zones.",
      +              "items": {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "officialZone",
      +            "label",
      +            "hazardClass",
      +            "zonesInvolved",
      +            "reading"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "place",
      -  "population",
      -  "foreignResidentsByCitizenship",
      -  "totalForeignResidents",
      -  "foreignResidentsAllCitizenships",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "priceToRentYears",
      -  "taxRegimeEligibility",
      -  "provinceRollup",
      -  "layers",
      -  "provinceWellbeing",
      -  "attribution"
      -]New value: +[
      +  "place",
      +  "population",
      +  "foreignResidentsByCitizenship",
      +  "totalForeignResidents",
      +  "foreignResidentsAllCitizenships",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "priceToRentYears",
      +  "taxRegimeEligibility",
      +  "provinceRollup",
      +  "seismicZone",
      +  "layers",
      +  "provinceWellbeing",
      +  "attribution"
      +]
  5. Changed2 schema fields changed
    • changedOutput schema / properties / foreignResidentsAllCitizenships / description
      Previous value: -"Residents holding any foreign citizenship: ISTAT's own total, not limited to the 25 citizenships tracked in foreignResidentsByCitizenship. Citizenship, not birthplace. value is null, never 0, when ISTAT sends no total for this comune."New value: +"Residents holding any foreign citizenship: ISTAT's own total, not limited to the citizenships tracked in foreignResidentsByCitizenship. Citizenship, not birthplace. value is null, never 0, when ISTAT sends no total for this comune."
    • changedOutput schema / properties / totalForeignResidents / description
      Previous value: -"Sum of foreignResidentsByCitizenship: only the citizenships this site tracks (25), so a floor, not every foreign resident — Romanian, Albanian and Moroccan residents, among others, are not counted. For every foreign resident, see foreignResidentsAllCitizenships. null when the citizenship dataset has no row for this comune."New value: +"Sum of foreignResidentsByCitizenship: only the citizenships this site tracks, so a floor, not every foreign resident — Moroccan, Chinese and Indian residents, among others, are not counted. For every foreign resident, see foreignResidentsAllCitizenships. null when the citizenship dataset has no row for this comune."
  6. Changed3 schema fields changed
    • addedOutput schema / properties / foreignResidentsAllCitizenships
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Residents holding any foreign citizenship: ISTAT's own total, not limited to the 25 citizenships tracked in foreignResidentsByCitizenship. Citizenship, not birthplace. value is null, never 0, when ISTAT sends no total for this comune.",
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "reason": {
      +      "description": "Present only when value is null: why this place has no figure.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "value": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / totalForeignResidents / description
      Previous value: -"Sum of foreignResidentsByCitizenship: only the citizenships this site tracks (25), so a floor, not every foreign resident — Romanian, Albanian and Moroccan residents, among others, are not counted. null when the citizenship dataset has no row for this comune."New value: +"Sum of foreignResidentsByCitizenship: only the citizenships this site tracks (25), so a floor, not every foreign resident — Romanian, Albanian and Moroccan residents, among others, are not counted. For every foreign resident, see foreignResidentsAllCitizenships. null when the citizenship dataset has no row for this comune."
    • changedOutput schema / required
      Previous value: -[
      -  "place",
      -  "population",
      -  "foreignResidentsByCitizenship",
      -  "totalForeignResidents",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "priceToRentYears",
      -  "taxRegimeEligibility",
      -  "provinceRollup",
      -  "layers",
      -  "provinceWellbeing",
      -  "attribution"
      -]New value: +[
      +  "place",
      +  "population",
      +  "foreignResidentsByCitizenship",
      +  "totalForeignResidents",
      +  "foreignResidentsAllCitizenships",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "priceToRentYears",
      +  "taxRegimeEligibility",
      +  "provinceRollup",
      +  "layers",
      +  "provinceWellbeing",
      +  "attribution"
      +]
  7. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "articles": {
      +      "description": "Published articles about this comune — the reporting behind the numbers. Credit required to reuse.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "markdownUrl": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "url",
      +          "markdownUrl"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "attribution": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "citeAs": {
      +          "description": "A ready-made citation line.",
      +          "type": "string"
      +        },
      +        "page": {
      +          "description": "The expatliving.it page these figures come from — link it when you quote them.",
      +          "type": "string"
      +        },
      +        "publisher": {
      +          "type": "string"
      +        },
      +        "request": {
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "publisher",
      +        "url",
      +        "citeAs",
      +        "request"
      +      ],
      +      "type": "object"
      +    },
      +    "foreignResidentsByCitizenship": {
      +      "additionalProperties": false,
      +      "description": "Counts by ISO-2 citizenship code. Citizenship, not birthplace — excludes foreign-born Italian citizens. value is null, never a zero-filled object, when ISTAT's citizenship dataset has no row at all for this comune.",
      +      "properties": {
      +        "coverage": {
      +          "additionalProperties": false,
      +          "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +          "properties": {
      +            "in": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "of": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "in",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        "extractedOn": {
      +          "description": "ISO date this value was extracted from the source.",
      +          "type": "string"
      +        },
      +        "license": {
      +          "type": "string"
      +        },
      +        "method": {
      +          "description": "URL to the methodology page for this dataset.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Present only when value is null: why this place has no figure.",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "value": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": {
      +                "type": "number"
      +              },
      +              "propertyNames": {
      +                "type": "string"
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "vintage": {
      +          "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "unit",
      +        "source",
      +        "vintage",
      +        "extractedOn",
      +        "method",
      +        "license"
      +      ],
      +      "type": "object"
      +    },
      +    "layers": {
      +      "description": "Every other map layer's value for this place, at the grain its source publishes. A null value means the source has no figure for this place (see `reason`).",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "coverage": {
      +            "additionalProperties": false,
      +            "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +            "properties": {
      +              "in": {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "of": {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "in",
      +              "of"
      +            ],
      +            "type": "object"
      +          },
      +          "download": {
      +            "description": "The whole dataset, as published JSON (every place, with its meta block).",
      +            "type": "string"
      +          },
      +          "extractedOn": {
      +            "description": "ISO date this value was extracted from the source.",
      +            "type": "string"
      +          },
      +          "grain": {
      +            "description": "The level this value is measured at. Only \"comune\" is a measurement of this comune itself.",
      +            "enum": [
      +              "comune",
      +              "province",
      +              "region"
      +            ],
      +            "type": "string"
      +          },
      +          "label": {
      +            "type": "string"
      +          },
      +          "license": {
      +            "type": "string"
      +          },
      +          "measuredFor": {
      +            "description": "The place the value describes, e.g. \"L'Aquila (province)\".",
      +            "type": "string"
      +          },
      +          "method": {
      +            "description": "URL to the methodology page for this dataset.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "description": "The source's own coverage caveat, where it has one.",
      +            "type": "string"
      +          },
      +          "page": {
      +            "description": "The map page for this layer on expatliving.it — link readers here.",
      +            "type": "string"
      +          },
      +          "reason": {
      +            "description": "Present only when value is null: why this place has no figure.",
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "The dataset slug, as in GET /datasets.",
      +            "type": "string"
      +          },
      +          "source": {
      +            "type": "string"
      +          },
      +          "unit": {
      +            "type": "string"
      +          },
      +          "value": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "vintage": {
      +            "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "value",
      +          "unit",
      +          "source",
      +          "vintage",
      +          "extractedOn",
      +          "method",
      +          "license",
      +          "slug",
      +          "label",
      +          "grain",
      +          "measuredFor",
      +          "page",
      +          "download"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 100,
      +      "type": "array"
      +    },
      +    "place": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "istatCode": {
      +          "description": "6-digit ISTAT comune code, e.g. 075029.",
      +          "type": "string"
      +        },
      +        "lat": {
      +          "type": "number"
      +        },
      +        "lng": {
      +          "type": "number"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "page": {
      +          "description": "This comune's profile page on expatliving.it — link it when you quote any figure below.",
      +          "type": "string"
      +        },
      +        "province": {
      +          "type": "string"
      +        },
      +        "provinceCode": {
      +          "type": "string"
      +        },
      +        "provinceSlug": {
      +          "type": "string"
      +        },
      +        "region": {
      +          "type": "string"
      +        },
      +        "regionSlug": {
      +          "type": "string"
      +        },
      +        "slug": {
      +          "description": "Stable URL slug for /data/comune/{slug} — never changes, even if a comune merges.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "istatCode",
      +        "slug",
      +        "name",
      +        "province",
      +        "provinceCode",
      +        "provinceSlug",
      +        "region",
      +        "regionSlug",
      +        "lat",
      +        "lng",
      +        "page"
      +      ],
      +      "type": "object"
      +    },
      +    "population": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coverage": {
      +          "additionalProperties": false,
      +          "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +          "properties": {
      +            "in": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "of": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "in",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        "extractedOn": {
      +          "description": "ISO date this value was extracted from the source.",
      +          "type": "string"
      +        },
      +        "license": {
      +          "type": "string"
      +        },
      +        "method": {
      +          "description": "URL to the methodology page for this dataset.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Present only when value is null: why this place has no figure.",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "value": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "vintage": {
      +          "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "unit",
      +        "source",
      +        "vintage",
      +        "extractedOn",
      +        "method",
      +        "license"
      +      ],
      +      "type": "object"
      +    },
      +    "priceToRentYears": {
      +      "additionalProperties": false,
      +      "description": "Years of rent that equal the purchase price. Not a yield, an ROI, or a payback period.",
      +      "properties": {
      +        "coverage": {
      +          "additionalProperties": false,
      +          "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +          "properties": {
      +            "in": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "of": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "in",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        "extractedOn": {
      +          "description": "ISO date this value was extracted from the source.",
      +          "type": "string"
      +        },
      +        "license": {
      +          "type": "string"
      +        },
      +        "method": {
      +          "description": "URL to the methodology page for this dataset.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Present only when value is null: why this place has no figure.",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "value": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "vintage": {
      +          "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "unit",
      +        "source",
      +        "vintage",
      +        "extractedOn",
      +        "method",
      +        "license"
      +      ],
      +      "type": "object"
      +    },
      +    "provinceRollup": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "code": {
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "purchasePriceEurM2": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "coverage": {
      +              "additionalProperties": false,
      +              "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +              "properties": {
      +                "in": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "of": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "in",
      +                "of"
      +              ],
      +              "type": "object"
      +            },
      +            "extractedOn": {
      +              "description": "ISO date this value was extracted from the source.",
      +              "type": "string"
      +            },
      +            "license": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "description": "URL to the methodology page for this dataset.",
      +              "type": "string"
      +            },
      +            "reason": {
      +              "description": "Present only when value is null: why this place has no figure.",
      +              "type": "string"
      +            },
      +            "source": {
      +              "type": "string"
      +            },
      +            "unit": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "vintage": {
      +              "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "unit",
      +            "source",
      +            "vintage",
      +            "extractedOn",
      +            "method",
      +            "license"
      +          ],
      +          "type": "object"
      +        },
      +        "rentPriceEurM2Month": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "coverage": {
      +              "additionalProperties": false,
      +              "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +              "properties": {
      +                "in": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "of": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "in",
      +                "of"
      +              ],
      +              "type": "object"
      +            },
      +            "extractedOn": {
      +              "description": "ISO date this value was extracted from the source.",
      +              "type": "string"
      +            },
      +            "license": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "description": "URL to the methodology page for this dataset.",
      +              "type": "string"
      +            },
      +            "reason": {
      +              "description": "Present only when value is null: why this place has no figure.",
      +              "type": "string"
      +            },
      +            "source": {
      +              "type": "string"
      +            },
      +            "unit": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "vintage": {
      +              "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "unit",
      +            "source",
      +            "vintage",
      +            "extractedOn",
      +            "method",
      +            "license"
      +          ],
      +          "type": "object"
      +        },
      +        "slug": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "code",
      +        "slug",
      +        "purchasePriceEurM2",
      +        "rentPriceEurM2Month"
      +      ],
      +      "type": "object"
      +    },
      +    "provinceWellbeing": {
      +      "additionalProperties": false,
      +      "description": "ISTAT BES well-being indicators for this comune's province — province-level, not a comune measurement.",
      +      "properties": {
      +        "coverage": {
      +          "additionalProperties": false,
      +          "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +          "properties": {
      +            "in": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "of": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "in",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        "extractedOn": {
      +          "description": "ISO date this value was extracted from the source.",
      +          "type": "string"
      +        },
      +        "grain": {
      +          "const": "province",
      +          "type": "string"
      +        },
      +        "license": {
      +          "type": "string"
      +        },
      +        "measuredFor": {
      +          "type": "string"
      +        },
      +        "method": {
      +          "description": "URL to the methodology page for this dataset.",
      +          "type": "string"
      +        },
      +        "page": {
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Present only when value is null: why this place has no figure.",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "value": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "code": {
      +                    "type": "string"
      +                  },
      +                  "domain": {
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "type": "string"
      +                  },
      +                  "percentile": {
      +                    "description": "0–100 rank among Italy's provinces, polarity-aware: higher is always better, whichever way the raw value runs.",
      +                    "type": "number"
      +                  },
      +                  "polarity": {
      +                    "description": "\"high\": a higher raw value is better; \"low\": a lower one is.",
      +                    "enum": [
      +                      "high",
      +                      "low"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "unit": {
      +                    "type": "string"
      +                  },
      +                  "value": {
      +                    "description": "The raw indicator value.",
      +                    "type": "number"
      +                  },
      +                  "year": {
      +                    "description": "The year this observation describes — indicators update on different cycles.",
      +                    "maximum": 9007199254740991,
      +                    "minimum": -9007199254740991,
      +                    "type": "integer"
      +                  }
      +                },
      +                "required": [
      +                  "code",
      +                  "domain",
      +                  "label",
      +                  "unit",
      +                  "polarity",
      +                  "value",
      +                  "year",
      +                  "percentile"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 80,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "vintage": {
      +          "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "unit",
      +        "source",
      +        "vintage",
      +        "extractedOn",
      +        "method",
      +        "license",
      +        "grain",
      +        "measuredFor",
      +        "page"
      +      ],
      +      "type": "object"
      +    },
      +    "purchasePriceEurM2": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coverage": {
      +          "additionalProperties": false,
      +          "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +          "properties": {
      +            "in": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "of": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "in",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        "extractedOn": {
      +          "description": "ISO date this value was extracted from the source.",
      +          "type": "string"
      +        },
      +        "license": {
      +          "type": "string"
      +        },
      +        "method": {
      +          "description": "URL to the methodology page for this dataset.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Present only when value is null: why this place has no figure.",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "value": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "vintage": {
      +          "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "unit",
      +        "source",
      +        "vintage",
      +        "extractedOn",
      +        "method",
      +        "license"
      +      ],
      +      "type": "object"
      +    },
      +    "rentPriceEurM2Month": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coverage": {
      +          "additionalProperties": false,
      +          "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +          "properties": {
      +            "in": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "of": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "in",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        "extractedOn": {
      +          "description": "ISO date this value was extracted from the source.",
      +          "type": "string"
      +        },
      +        "license": {
      +          "type": "string"
      +        },
      +        "method": {
      +          "description": "URL to the methodology page for this dataset.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Present only when value is null: why this place has no figure.",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "unit": {
      +          "type": "string"
      +        },
      +        "value": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "vintage": {
      +          "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "unit",
      +        "source",
      +        "vintage",
      +        "extractedOn",
      +        "method",
      +        "license"
      +      ],
      +      "type": "object"
      +    },
      +    "taxRegimeEligibility": {
      +      "description": "Verified regimes only — \"placesNotPeople\": geographic eligibility, not personal advice.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "headroom": {
      +            "description": "Residents between this comune and the ceiling.",
      +            "type": "number"
      +          },
      +          "href": {
      +            "description": "Path to this regime's own page on expatliving.it.",
      +            "type": "string"
      +          },
      +          "label": {
      +            "type": "string"
      +          },
      +          "maxPopulation": {
      +            "description": "The regime's population ceiling, when it has one.",
      +            "type": "number"
      +          },
      +          "ruleIsIncomplete": {
      +            "description": "True when the rule admits comuni by routes not yet verified — silence about OTHER regimes proves nothing.",
      +            "type": "boolean"
      +          },
      +          "slug": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "label",
      +          "href",
      +          "ruleIsIncomplete"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "totalForeignResidents": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Sum of foreignResidentsByCitizenship: only the citizenships this site tracks (25), so a floor, not every foreign resident — Romanian, Albanian and Moroccan residents, among others, are not counted. null when the citizenship dataset has no row for this comune."
      +    }
      +  },
      +  "required": [
      +    "place",
      +    "population",
      +    "foreignResidentsByCitizenship",
      +    "totalForeignResidents",
      +    "purchasePriceEurM2",
      +    "rentPriceEurM2Month",
      +    "priceToRentYears",
      +    "taxRegimeEligibility",
      +    "provinceRollup",
      +    "layers",
      +    "provinceWellbeing",
      +    "attribution"
      +  ],
      +  "type": "object"
      +}
  8. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/closed-world, yet the description goes well beyond them: provenance envelopes (source, vintage, extractedOn, license), null-vs-zero semantics, and grain/measuredFor telling the agent a province or region value is not a measurement of this comune. It also pre-empts misuse of seismicZone with label, straddling-zone, and tax-eligibility caveats — exactly the 'quote it correctly' context annotations cannot carry.

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

Conciseness3/5

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

Nearly all content earns its place, but it is delivered as one enormous run-on sentence with deeply nested parentheticals (the seismicZone parenthesis alone spans multiple clauses), which buries the seismic, layers, and provinceWellbeing fields mid-sentence. Front-loading of the core purpose is good; parseability is poor.

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

Completeness5/5

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

For a single-parameter read with an output schema and full annotation coverage, nothing an agent needs to call or correctly report the result is missing — it even covers citation discipline for vintage and null handling.

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 fully documented (pattern, example 075029). The description restates '6-digit ISTAT code' but adds no format, validation, or failure-mode detail beyond the schema, which is the baseline 3 case.

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?

Names a specific resource (one Italian comune's profile) and a specific lookup key (6-digit ISTAT code), then enumerates the data domains returned: population, foreign residents, prices, price-to-rent, tax-regime eligibility, province rollup, seismicZone, layers, provinceWellbeing. The singular 'one' implicitly separates it from the batch/search siblings (find_comuni, search_comuni).

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 lookup condition is clear ('looked up by 6-digit ISTAT code'), so the agent knows it needs an exact code in hand, which implies find_comuni/search_comuni precede it. What is missing is an explicit statement of that alternative relationship and any exclusion — the agent must infer it from the singular framing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources