Skip to main content
Glama

Expat Living Italy

Where one nationality lives in Italy

get_nationality
Read-onlyIdempotent

For one tracked citizenship (ISO-2 code such as US, GB, DE): the comuni, provinces and regions where its holders concentrate, with counts and shares. It is CITIZENSHIP, not birthplace — foreign-born Italian citizens are not counted — and it carries small-number caveats: the comune ranking skips places under 1,000 residents by default and flags rows under 30 residents (smallNumber). A comune with no ISTAT row is left out, not counted as zero, so totals are floors. State those caveats when you quote a ranking; they are in the result's caveats. Province and comune lists are different levels of detail — say which.

Input Schema

NameRequiredDescriptionDefault
ccYesISO-2 citizenship code of one of the citizenships this site tracks, e.g. "US".
limitNoHow many comuni and provinces to list, 1–50. Default 10.
rankByNoshare: residents with this citizenship as a fraction of the comune's population. count: absolute numbers.share
minPopulationNoSmallest comune, in residents, that may appear in the comune ranking. Default 1,000: in a village of sixty, four foreign residents is not a finding. Lowering it lets tiny places top the ranking.

Output Schema

NameRequiredDescriptionDefault
caveatsYesRead these before quoting a number; they travel with the data.
byRegionYes
topComuniYes
attributionYes
nationalityYes
topProvincesYesProvince grain: a different level of detail from the comuni above. Sums only the comuni ISTAT has a row for.
nationalTotalYesResidents with this citizenship in the comuni ISTAT reports on; `coverage` is how many comuni that is.
citizenshipNotBirthplaceYesEvery count here is by CITIZENSHIP, not country of birth: it leaves out foreign-born people who hold Italian citizenship.

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. Changed1 schema field changed
    • changedInput schema / properties / cc / description
      Previous value: -"ISO-2 citizenship code of one of the 25 citizenships this site tracks, e.g. \"US\"."New value: +"ISO-2 citizenship code of one of the citizenships this site tracks, e.g. \"US\"."
  3. Changed1 schema field changed
    • changedOutput schema / properties / topComuni / properties / value / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "count": {
      -          "maximum": 9007199254740991,
      -          "minimum": -9007199254740991,
      -          "type": "integer"
      -        },
      -        "istatCode": {
      -          "type": "string"
      -        },
      -        "name": {
      -          "type": "string"
      -        },
      -        "page": {
      -          "type": "string"
      -        },
      -        "population": {
      -          "maximum": 9007199254740991,
      -          "minimum": -9007199254740991,
      -          "type": "integer"
      -        },
      -        "province": {
      -          "type": "string"
      -        },
      -        "provinceCode": {
      -          "type": "string"
      -        },
      -        "rank": {
      -          "maximum": 9007199254740991,
      -          "minimum": -9007199254740991,
      -          "type": "integer"
      -        },
      -        "region": {
      -          "type": "string"
      -        },
      -        "shareOfPopulation": {
      -          "description": "A fraction, 0–1.",
      -          "type": "number"
      -        },
      -        "smallNumber": {
      -          "description": "True when fewer than 50 residents hold this citizenship here: the share rests on a handful of households.",
      -          "type": "boolean"
      -        }
      -      },
      -      "required": [
      -        "rank",
      -        "istatCode",
      -        "name",
      -        "province",
      -        "provinceCode",
      -        "region",
      -        "population",
      -        "count",
      -        "shareOfPopulation",
      -        "smallNumber",
      -        "page"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 50,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "count": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "istatCode": {
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "page": {
      +          "type": "string"
      +        },
      +        "population": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "province": {
      +          "type": "string"
      +        },
      +        "provinceCode": {
      +          "type": "string"
      +        },
      +        "rank": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "region": {
      +          "type": "string"
      +        },
      +        "shareOfPopulation": {
      +          "description": "A fraction, 0–1.",
      +          "type": "number"
      +        },
      +        "smallNumber": {
      +          "description": "True when fewer than 30 residents hold this citizenship here: the share rests on a handful of households.",
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "rank",
      +        "istatCode",
      +        "name",
      +        "province",
      +        "provinceCode",
      +        "region",
      +        "population",
      +        "count",
      +        "shareOfPopulation",
      +        "smallNumber",
      +        "page"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 50,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Added

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: distinguishes citizenship from birthplace, explains that foreign-born Italian citizens are excluded, discloses small-number suppression (default 1,000-resident floor, `smallNumber` flag under 30), and warns that missing ISTAT rows make totals floors. These are exactly the data-semantics details 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.

Conciseness4/5

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

Front-loaded with the purpose and efficient across three sentences, with no filler. It is dense but appropriately so for the caveats it must convey; the only redundancy is repeating that caveats live in the result's `caveats` field.

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 that an output schema exists, the description need not explain return values. It supplies the critical data semantics (citizenship scope, suppression rules, floor totals) and the reporting instruction, so an agent can call and interpret the tool 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%, and the schema already documents all four parameters, including the minPopulation default and rationale. The description mostly restates that meaning and adds little per-parameter detail beyond the output-level `smallNumber` flag and the province/comune level distinction.

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+resource: for one ISO-2 citizenship code, returns the comuni, provinces and regions where holders concentrate, with counts and shares. This is clearly distinguishable from sibling tools like get_comune, get_province and find_comuni, which operate on places rather than nationality concentration.

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 usage context: it is citizenship not birthplace, and it instructs the agent to state caveats when quoting a ranking. However, it does not explicitly name alternatives or say when to prefer another sibling tool (e.g., get_province for place-level data) over this one.

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