Skip to main content
Glama

Expat Living Italy

Get one province's profile

get_province
Read-onlyIdempotent

One Italian province (two-letter code such as AQ, or its slug — a comune's provinceCode): population, OMI prices, foreign residents by citizenship (citizenship, not birthplace), ALL ISTAT BES well-being indicators with polarity-aware percentiles among provinces (no composite score), every province- and region-grain map layer, seismicZones (how many of its comuni sit in each official seismic zone — a count of comuni, never an average, since a province has no zone of its own), and how much of the province meets each verified tax regime (places, not people). Sources use different province lists — Sardinia was reorganized in 2026 — so a section a source lacks is null with a reason and listed in missingSections: report it as missing, never substitute another province's figure.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
codeYesA province's two-letter code, e.g. "AQ", or its slug, e.g. "l-aquila". Find it in a comune's `provinceCode`.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
layersYesEvery province- and region-grain map layer for this province, each saying whose number it is.
pricesYes
provinceYes
wellbeingYes
populationYesSum of the province's comuni.
taxRegimesYesVerified regimes with at least one qualifying comune here: how much of the province meets the geographic criteria. Places, not people; a regime absent here is not a no.
attributionYes
seismicZonesYesHow this province's comuni are spread across the official seismic zones: a count per zone, never an average. A province has no zone of its own.
missingSectionsYesEvery part of this profile a source has no figure for, with why. Sources use different province lists (Sardinia was reorganized in 2026): a section a source lacks is listed here as missing, never filled in from another province.
placesNotPeopleYes
foreignResidentsByCitizenshipYesCitizenship, not birthplace — excludes foreign-born Italian citizens — and only the citizenships this site tracks, so a floor on foreign residents. Summed over the comuni ISTAT has a row for: `coverage` says how many that is, and a comune with no row adds nothing rather than a zero.
foreignResidentsAllCitizenshipsYesResidents holding any foreign citizenship: ISTAT's own total, not limited to the citizenships tracked in foreignResidentsByCitizenship. Citizenship, not birthplace. Summed over the comuni ISTAT has a total for: `coverage` says how many that is, and a comune with no total adds nothing rather than a zero.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / seismicZones
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "How this province's comuni are spread across the official seismic zones: a count per zone, never an average. A province has no zone of its own.",
      +  "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": {
      +            "comuniByOfficialZone": {
      +              "additionalProperties": false,
      +              "description": "Comuni in each official zone (zone1 is the highest hazard). Split comuni are not counted here.",
      +              "properties": {
      +                "zone1": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "zone2": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "zone3": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "zone4": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "zone1",
      +                "zone2",
      +                "zone3",
      +                "zone4"
      +              ],
      +              "type": "object"
      +            },
      +            "comuniWithoutClassification": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "reading": {
      +              "type": "string"
      +            },
      +            "straddlingZones": {
      +              "description": "Comuni that straddle zones and so have no single zone; named, not rounded to one.",
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "label": {
      +                    "type": "string"
      +                  },
      +                  "name": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "name",
      +                  "label"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            "totalComuni": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "comuniByOfficialZone",
      +            "straddlingZones",
      +            "comuniWithoutClassification",
      +            "totalComuni",
      +            "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: -[
      -  "province",
      -  "population",
      -  "prices",
      -  "foreignResidentsByCitizenship",
      -  "foreignResidentsAllCitizenships",
      -  "wellbeing",
      -  "layers",
      -  "taxRegimes",
      -  "missingSections",
      -  "placesNotPeople",
      -  "attribution"
      -]New value: +[
      +  "province",
      +  "population",
      +  "prices",
      +  "foreignResidentsByCitizenship",
      +  "foreignResidentsAllCitizenships",
      +  "wellbeing",
      +  "seismicZones",
      +  "layers",
      +  "taxRegimes",
      +  "missingSections",
      +  "placesNotPeople",
      +  "attribution"
      +]
  2. 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. Summed over the comuni ISTAT has a total for: `coverage` says how many that is, and a comune with no total adds nothing rather than a zero."New value: +"Residents holding any foreign citizenship: ISTAT's own total, not limited to the citizenships tracked in foreignResidentsByCitizenship. Citizenship, not birthplace. Summed over the comuni ISTAT has a total for: `coverage` says how many that is, and a comune with no total adds nothing rather than a zero."
    • changedOutput schema / properties / foreignResidentsByCitizenship / properties / value / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "code": {
      -          "description": "ISO-2 citizenship code.",
      -          "type": "string"
      -        },
      -        "count": {
      -          "maximum": 9007199254740991,
      -          "minimum": -9007199254740991,
      -          "type": "integer"
      -        },
      -        "shareOfPopulation": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "code",
      -        "count",
      -        "shareOfPopulation"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 40,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "code": {
      +          "description": "ISO-2 citizenship code.",
      +          "type": "string"
      +        },
      +        "count": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "shareOfPopulation": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "count",
      +        "shareOfPopulation"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 100,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed2 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. Summed over the comuni ISTAT has a total for: `coverage` says how many that is, and a comune with no total adds nothing rather than a zero.",
      +  "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 / required
      Previous value: -[
      -  "province",
      -  "population",
      -  "prices",
      -  "foreignResidentsByCitizenship",
      -  "wellbeing",
      -  "layers",
      -  "taxRegimes",
      -  "missingSections",
      -  "placesNotPeople",
      -  "attribution"
      -]New value: +[
      +  "province",
      +  "population",
      +  "prices",
      +  "foreignResidentsByCitizenship",
      +  "foreignResidentsAllCitizenships",
      +  "wellbeing",
      +  "layers",
      +  "taxRegimes",
      +  "missingSections",
      +  "placesNotPeople",
      +  "attribution"
      +]
  4. Added

TDQS

A4.3/5.0
Behavior5/5

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

Annotations cover safety (readOnly, idempotent, non-open-world), and the description adds substantial domain behavior the annotations cannot: polarity-aware percentiles with no composite score, seismicZones as a count of comuni rather than an average, tax regimes as places not people, foreign residents by citizenship not birthplace, and null-with-reason missingSections due to differing source province lists.

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?

Content is largely justified, but it is delivered as one very long, densely parenthetical run-on sentence, which hampers parseability. It is front-loaded with the resource, yet the mid-sentence clarifications could be broken out for readability.

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 tool with an output schema, the description fully covers data caveats an agent needs: source-list divergence (Sardinia's 2026 reorganization), null-with-reason missing sections, and the correct handling of missing data. Nothing material for correct invocation is absent.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented in the schema (two-letter code or slug, e.g. "AQ"/"l-aquila", from a comune's provinceCode). The description largely restates this, so it adds little meaning beyond the schema — the baseline 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?

States a specific verb (get) and resource (one Italian province's profile) and then enumerates its exact contents — population, OMI prices, foreign residents, ISTAT BES indicators, map layers, seismicZones, tax-regime coverage. The province-grain scope and its emphasis on province-level aggregation (as opposed to comune-level tools like get_comune) make it distinguishable from siblings.

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

Usage Guidelines4/5

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

Gives clear context for use: it explains how to find the `code` (a comune's `provinceCode`) and gives an explicit behavioral directive — report a missing section as missing, never substitute another province's figure. It stops short of naming alternative tools or stating explicit when-not-to-use conditions, so it is not a full 5.

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