Expat Living Italy
by expatliving.it · remote · no sign-in to list tools · v1.2.0 · published by it.expatliving
Sourced data on Italy's ~7,900 comuni for people relocating or retiring there.
11 tools: 2 change things and 9 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things2Claude Code: ask: see these tools
- Only reads9Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http data https://www.expatliving.it/api/v1/mcpFindings
Matches of fixed checks, with the text they matched.
- Warnget_province
The server marks "get_province" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "get_province" says "get": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
11 tools
Changes things 2Claude Code: ask
check_tax_eligibilityFor 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.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it For 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_provinceOne 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), …1 finding
Why it is in this group
- The name "get_province" says "get": a word for reading.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "get_province" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "get_province" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
Only reads 9Claude Code: allow
find_comuniWhich Italian comuni match: region, province, population range, purchase-price and rent ranges (OMI), population change 2019–2025, the six shortlist filters (January low, days abov…No findings
Why it is in this group
- The name "find_comuni" says "find": a word for reading.
Description, as the server wrote it Which Italian comuni match: region, province, population range, purchase-price and rent ranges (OMI), population change 2019–2025, the six shortlist filters (January low, days above 30 C, regional hospital-care score, all three care scores at 60, tourist beds per resident, outside seismic zone 1) and/or the verified comuni of a tax regime. Paged (max 100) and sortable. Healthcare scores are region grain (autonomous-province grain for Bolzano and Trento): every town in the region shares the score. A comune with no price, rent, population-change, climate, healthcare, tourism or seismic 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_articleOne article's full text as Markdown, with its places, datasets and a ready-made citation.No findings
Why it is in this group
- The name "get_article" says "get": a word for reading.
Description, as the server wrote it One 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_comuneOne Italian comune's population, foreign residents by citizenship, property purchase/rent price, price-to-rent, verified tax-regime eligibility, its province's rollup, `seismicZone…No findings
Why it is in this group
- The name "get_comune" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_coverageFor every dataset: how many places it covers, out of how many at its grain, plus the source's own coverage caveat.No findings
Why it is in this group
- The name "get_coverage" says "get": a word for reading.
Description, as the server wrote it For 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_nationalityFor one tracked citizenship (ISO-2 code such as US, GB, DE): the comuni, provinces and regions where its holders concentrate, with counts and shares.No findings
Why it is in this group
- The name "get_nationality" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
list_articlesDated, sourced reporting on moving to and retiring in Italy, newest first.No findings
Why it is in this group
- The name "list_articles" says "list": a word for reading.
Description, as the server wrote it Dated, 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
list_datasetsThe 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 (…No findings
Why it is in this group
- The name "list_datasets" says "list": a word for reading.
Description, as the server wrote it The 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
list_tax_regimesEach 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 crite…No findings
Why it is in this group
- The name "list_tax_regimes" says "list": a word for reading.
Description, as the server wrote it Each 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
search_comuniLook 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.No findings
Why it is in this group
- The name "search_comuni" says "search": a word for reading.
Description, as the server wrote it Look 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.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.2.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http data https://www.expatliving.it/api/v1/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__data__get_comune",
"mcp__data__search_comuni",
"mcp__data__find_comuni",
"mcp__data__get_nationality",
"mcp__data__get_coverage",
"mcp__data__list_datasets",
"mcp__data__list_tax_regimes",
"mcp__data__list_articles",
"mcp__data__get_article"
],
"ask": [
"mcp__data__get_province",
"mcp__data__check_tax_eligibility"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as data. Review it before you use it.