protogrid

Search / it.expatliving/data

Expat Living Italy

R0· no sign-in

Sourced data on Italy's ~7,900 comuni for people relocating or retiring there.

v1.2.0 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality77good
Trust83of 100
Uptime, 30 days100%
Latency p50450 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "data": {
      "type": "http",
      "url": "https://www.expatliving.it/api/v1/mcp"
    }
  }
}
claude mcp add --transport http data https://www.expatliving.it/api/v1/mcp
[mcp_servers.data]
url = "https://www.expatliving.it/api/v1/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "data": {
      "type": "remote",
      "url": "https://www.expatliving.it/api/v1/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "data": {
      "type": "http",
      "url": "https://www.expatliving.it/api/v1/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=data&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vd3d3LmV4cGF0bGl2aW5nLml0L2FwaS92MS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "data": {
      "type": "http",
      "url": "https://www.expatliving.it/api/v1/mcp"
    }
  }
}
{
  "mcpServers": {
    "data": {
      "httpUrl": "https://www.expatliving.it/api/v1/mcp"
    }
  }
}
extensions:
  "data":
    enabled: true
    name: "data"
    type: streamable_http
    uri: "https://www.expatliving.it/api/v1/mcp"
    timeout: 300

Quality 77 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene79 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length1 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations11 of 11 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: get_comune (destructiveHint); search_comuni (destructiveHint); get_nationality (destructiveHint); …
  • pass
    tools.token_costabout 3,079 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes23 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

11 tools, about 3,079 tokens to load them all · tool set d132ed8f46f0 · tools last changed 2026-10-15 · checked 2026-10-20 00:54 UTC

Tool changes

  • get_provincechangeddescription, output schema
    before

    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, 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.

    after · 86% of words in common

    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.

  • get_comunechangeddescription, output schema
    before

    One Italian comune's population, foreign residents by citizenship, property purchase/rent price, price-to-rent, verified tax-regime eligibility, its province's rollup, `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.

    after · 71% of words in common

    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.

  • get_nationalitychangedinput schema
  • get_provincechangedoutput schema
  • get_comunechangedoutput schema
  • get_provincechangedoutput schema
  • get_comunechangedoutput schema
  • get_articlechangedoutput schema, annotations
  • list_articleschangedoutput schema, annotations
  • check_tax_eligibilitychangedoutput schema, annotations

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 83 / 100

no-repository
provenance55
liveness100
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-100% +updated-6d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://www.expatliving.it/api/v1/mcp streamable-httpnoneyes100%450 ms2025-11-252026-10-19

Tools (11)

check_tax_eligibilityread-onlyFor one regime slug (from list_tax_regimes) and one 6-digit ISTAT code (from search_comuni): qualifies, does_not_qualify or not_assessable, with a one-sentence reason to quote. not_assessable is never a no. This is about the place only; say so, and never present it as whether a person qualifies or as tax advice.
find_comuniread-onlyWhich Italian comuni match: region, province, population range, purchase-price and rent ranges (OMI), population change 2019–2025, and/or the verified comuni of a tax regime. Paged (max 100) and sortable. A comune with no price, rent or population-change figure is left out of the filter on it and COUNTED in `missingData` — never treated as cheap, free or stable; say how many were left out. The taxRegime filter lists only comuni on the regime's verified routes: a comune missing from it is NOT a 'no' (the response says so in `taxRegime.note`). Rows carry plain numbers; their source and vintage are in `figures`. Use search_comuni to turn a town name into a code, get_comune for one town's full profile.
get_articleread-onlyOne article's full text as Markdown, with its places, datasets and a ready-made citation. Quote figures from the dataset pages it cites, which carry their vintage. Content is free to use provided you credit Expat Living Italy and link to the article.
get_comuneread-onlyOne 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.
get_coverageread-onlyFor every dataset: how many places it covers, out of how many at its grain, plus the source's own coverage caveat. Pass `dataset` (a slug from list_datasets) to list the places that dataset lacks, with the gaps by region. Use it before telling anyone data does not exist for a place, and to explain a null. Missing means no figure, never a zero. Keys a source publishes that match no current place (a superseded province code) are reported and never mapped onto a current place. Drafts are listed as not served, without counts.
get_nationalityread-onlyFor 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.
get_provinceread-onlyOne 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.
list_articlesread-onlyDated, sourced reporting on moving to and retiring in Italy, newest first. Filter by topic, by place (a comune's ISTAT code) or by dataset slug. Each entry has its URL, a Markdown URL for the full text, and the places and datasets it cites. Content is free to use provided you credit Expat Living Italy and link to the article.
list_datasetsread-onlyThe catalog: each dataset's source institution, vintage (the period it describes), geographic grain, license, the expatliving.it page that presents it, and whether it is servable (false = still an unverified draft; never quote its values). Use it to say what data exists and where a reader can see it.
list_tax_regimesread-onlyEach regime's status (verified or draft), whether it depends on place (geographic) or on the person, its legislation, population ceiling and how many comuni meet its verified criteria. Places, not people: not tax advice.
search_comuniread-onlyLook up Italian comuni by name (case- and accent-insensitive, partial names work) and get each one's 6-digit ISTAT code, province and region — the code get_comune needs. Returns identifiers only, no figures. Several comuni share a name; check the province before choosing.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "it.expatliving/data",
  "icons": [
    {
      "src": "https://www.expatliving.it/icon.png",
      "sizes": [
        "256x256"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "Expat Living Italy",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://www.expatliving.it/api/v1/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "1.2.0",
  "websiteUrl": "https://www.expatliving.it/data/ask-your-ai",
  "description": "Sourced data on Italy's ~7,900 comuni for people relocating or retiring there."
}